[PATCH 2 of 2] resolve: new command

Matt Mackall mpm at selenic.com
Sun Apr 6 16:46:35 CDT 2008


# HG changeset patch
# User Matt Mackall <mpm at selenic.com>
# Date 1207518367 18000
# Node ID e14ba50418254bd555f879637a59ff5674ffcc52
# Parent  32649adf4620c895af549abaa4122a0f16488d0a
resolve: new command

- add basic resolve command functionality
- point failed update and merge at resolve

diff -r 32649adf4620 -r e14ba5041825 mercurial/commands.py
--- a/mercurial/commands.py	Sun Apr 06 16:46:05 2008 -0500
+++ b/mercurial/commands.py	Sun Apr 06 16:46:07 2008 -0500
@@ -13,6 +13,7 @@
 import difflib, patch, time, help, mdiff, tempfile
 import version, socket
 import archival, changegroup, cmdutil, hgweb.server, sshserver, hbisect
+import merge as merge_
 
 # Commands start here, listed alphabetically
 
@@ -2231,6 +2232,42 @@
     finally:
         del wlock
 
+def resolve(ui, repo, *pats, **opts):
+    """resolve file merges from a branch merge or update
+
+    This command will attempt to resolve unresolved merges from the
+    last update or merge command. This will use the local file
+    revision preserved at the last update or merge to cleanly retry
+    the file merge attempt. With no file or options specified, this
+    command will attempt to resolve all unresolved files.
+    """
+
+    if len([x for x in opts if opts[x]]) > 1:
+        raise util.Abort(_("too many options specified"))
+
+    ms = merge_.mergestate(repo)
+    ms.read()
+
+    mf = util.matcher(repo.root, "", pats, [], [])[1]
+
+    for f in ms:
+        print f
+        if mf(f):
+            print "matched"
+            if opts.get("list"):
+                ui.write("%s %s\n" % (ms[f].upper(), f))
+            elif opts.get("mark"):
+                ms.mark(f, "r")
+                ms.write()
+            elif opts.get("unmark"):
+                ms.mark(f, "u")
+                ms.write()
+            else:
+                wctx = repo.workingctx()
+                mctx = wctx.parents()[-1]
+                ms.resolve(f, wctx, mctx)
+                ms.write()
+
 def revert(ui, repo, *pats, **opts):
     """restore individual files or dirs to an earlier state
 
@@ -3191,6 +3228,12 @@
            _('forcibly copy over an existing managed file')),
          ] + walkopts + dryrunopts,
          _('hg rename [OPTION]... SOURCE... DEST')),
+    "resolve":
+        (resolve,
+         [('l', 'list', None, _('list state of files needing merge')),
+          ('m', 'mark', None, _('mark files as resolved')),
+          ('u', 'unmark', None, _('unmark files as resolved'))],
+          ('hg resolve [OPTION] [FILES...]')),
     "revert":
         (revert,
          [('a', 'all', None, _('revert all changes when no arguments given')),
diff -r 32649adf4620 -r e14ba5041825 mercurial/hg.py
--- a/mercurial/hg.py	Sun Apr 06 16:46:05 2008 -0500
+++ b/mercurial/hg.py	Sun Apr 06 16:46:07 2008 -0500
@@ -271,15 +271,7 @@
     stats = _merge.update(repo, node, False, False, None)
     _showstats(repo, stats)
     if stats[3]:
-        repo.ui.status(_("There are unresolved merges with"
-                         " locally modified files.\n"))
-        if stats[1]:
-            repo.ui.status(_("You can finish the partial merge using:\n"))
-        else:
-            repo.ui.status(_("You can redo the full merge using:\n"))
-        # len(pl)==1, otherwise _merge.update() would have raised util.Abort:
-        repo.ui.status(_("  hg update %s\n  hg update %s\n")
-                       % (pl[0].rev(), repo.changectx(node).rev()))
+        repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n"))
     return stats[3] > 0
 
 def clean(repo, node, show_stats=True):
@@ -294,11 +286,7 @@
     _showstats(repo, stats)
     if stats[3]:
         pl = repo.parents()
-        repo.ui.status(_("There are unresolved merges,"
-                         " you can redo the full merge using:\n"
-                         "  hg update -C %s\n"
-                         "  hg merge %s\n")
-                       % (pl[0].rev(), pl[1].rev()))
+        repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n"))
     elif remind:
         repo.ui.status(_("(branch merge, don't forget to commit)\n"))
     return stats[3] > 0
diff -r 32649adf4620 -r e14ba5041825 tests/test-add.out
--- a/tests/test-add.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-add.out	Sun Apr 06 16:46:07 2008 -0500
@@ -18,9 +18,7 @@
 warning: conflicts during merge.
 merging a failed!
 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-There are unresolved merges, you can redo the full merge using:
-  hg update -C 2
-  hg merge 1
+use 'hg resolve' to retry unresolved file merges
 M a
 ? a.orig
 % should fail
diff -r 32649adf4620 -r e14ba5041825 tests/test-conflict.out
--- a/tests/test-conflict.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-conflict.out	Sun Apr 06 16:46:07 2008 -0500
@@ -4,9 +4,7 @@
 warning: conflicts during merge.
 merging a failed!
 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-There are unresolved merges, you can redo the full merge using:
-  hg update -C 2
-  hg merge 1
+use 'hg resolve' to retry unresolved file merges
 e7fe8eb3e180+0d24b7662d3e+ tip
 <<<<<<< local
 something else
diff -r 32649adf4620 -r e14ba5041825 tests/test-convert-svn-sink.out
--- a/tests/test-convert-svn-sink.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-convert-svn-sink.out	Sun Apr 06 16:46:07 2008 -0500
@@ -265,9 +265,7 @@
 warning: conflicts during merge.
 merging b failed!
 2 files updated, 0 files merged, 0 files removed, 1 files unresolved
-There are unresolved merges, you can redo the full merge using:
-  hg update -C 2
-  hg merge 4
+use 'hg resolve' to retry unresolved file merges
 assuming destination b-hg
 initializing svn repo 'b-hg'
 initializing svn wc 'b-hg-wc'
diff -r 32649adf4620 -r e14ba5041825 tests/test-debugcomplete.out
--- a/tests/test-debugcomplete.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-debugcomplete.out	Sun Apr 06 16:46:07 2008 -0500
@@ -33,6 +33,7 @@
 recover
 remove
 rename
+resolve
 revert
 rollback
 root
@@ -79,6 +80,7 @@
 recover
 remove
 rename
+resolve
 revert
 rollback
 root
diff -r 32649adf4620 -r e14ba5041825 tests/test-globalopts.out
--- a/tests/test-globalopts.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-globalopts.out	Sun Apr 06 16:46:07 2008 -0500
@@ -183,6 +183,7 @@
  recover      roll back an interrupted transaction
  remove       remove the specified files on the next commit
  rename       rename files; equivalent of copy + remove
+ resolve      resolve file merges from a branch merge or update
  revert       restore individual files or dirs to an earlier state
  rollback     roll back the last transaction
  root         print the root (top) of the current working dir
@@ -236,6 +237,7 @@
  recover      roll back an interrupted transaction
  remove       remove the specified files on the next commit
  rename       rename files; equivalent of copy + remove
+ resolve      resolve file merges from a branch merge or update
  revert       restore individual files or dirs to an earlier state
  rollback     roll back the last transaction
  root         print the root (top) of the current working dir
diff -r 32649adf4620 -r e14ba5041825 tests/test-help.out
--- a/tests/test-help.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-help.out	Sun Apr 06 16:46:07 2008 -0500
@@ -74,6 +74,7 @@
  recover      roll back an interrupted transaction
  remove       remove the specified files on the next commit
  rename       rename files; equivalent of copy + remove
+ resolve      resolve file merges from a branch merge or update
  revert       restore individual files or dirs to an earlier state
  rollback     roll back the last transaction
  root         print the root (top) of the current working dir
@@ -123,6 +124,7 @@
  recover      roll back an interrupted transaction
  remove       remove the specified files on the next commit
  rename       rename files; equivalent of copy + remove
+ resolve      resolve file merges from a branch merge or update
  revert       restore individual files or dirs to an earlier state
  rollback     roll back the last transaction
  root         print the root (top) of the current working dir
diff -r 32649adf4620 -r e14ba5041825 tests/test-merge-local.out
--- a/tests/test-merge-local.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-merge-local.out	Sun Apr 06 16:46:07 2008 -0500
@@ -21,10 +21,7 @@
 merging zzz2_merge_bad
 merging zzz2_merge_bad failed!
 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
-There are unresolved merges with locally modified files.
-You can finish the partial merge using:
-  hg update 0
-  hg update 1
+use 'hg resolve' to retry unresolved file merges
 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
 --- a/zzz1_merge_ok
 +++ b/zzz1_merge_ok
@@ -42,10 +39,7 @@
 warning: conflicts during merge.
 merging zzz2_merge_bad failed!
 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
-There are unresolved merges with locally modified files.
-You can finish the partial merge using:
-  hg update 0
-  hg update 1
+use 'hg resolve' to retry unresolved file merges
 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
 --- a/zzz1_merge_ok
 +++ b/zzz1_merge_ok
diff -r 32649adf4620 -r e14ba5041825 tests/test-merge-revert2.out
--- a/tests/test-merge-revert2.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-merge-revert2.out	Sun Apr 06 16:46:07 2008 -0500
@@ -13,10 +13,7 @@
 warning: conflicts during merge.
 merging file1 failed!
 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-There are unresolved merges with locally modified files.
-You can redo the full merge using:
-  hg update 0
-  hg update 1
+use 'hg resolve' to retry unresolved file merges
 diff -r f248da0d4c3e file1
 --- a/file1
 +++ b/file1
diff -r 32649adf4620 -r e14ba5041825 tests/test-merge7.out
--- a/tests/test-merge7.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-merge7.out	Sun Apr 06 16:46:07 2008 -0500
@@ -11,9 +11,7 @@
 warning: conflicts during merge.
 merging test.txt failed!
 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-There are unresolved merges, you can redo the full merge using:
-  hg update -C 1
-  hg merge 2
+use 'hg resolve' to retry unresolved file merges
 pulling from ../test-a
 searching for changes
 adding changesets
@@ -33,9 +31,7 @@
 warning: conflicts during merge.
 merging test.txt failed!
 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-There are unresolved merges, you can redo the full merge using:
-  hg update -C 3
-  hg merge 4
+use 'hg resolve' to retry unresolved file merges
 one
 <<<<<<< local
 two-point-five
diff -r 32649adf4620 -r e14ba5041825 tests/test-merge9.out
--- a/tests/test-merge9.out	Sun Apr 06 16:46:05 2008 -0500
+++ b/tests/test-merge9.out	Sun Apr 06 16:46:07 2008 -0500
@@ -7,14 +7,10 @@
 merging bar failed!
 merging baz
 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
-There are unresolved merges, you can redo the full merge using:
-  hg update -C 2
-  hg merge 1
+use 'hg resolve' to retry unresolved file merges
 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
 merging bar
 merging bar failed!
 merging baz
 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
-There are unresolved merges, you can redo the full merge using:
-  hg update -C 1
-  hg merge 2
+use 'hg resolve' to retry unresolved file merges


More information about the Mercurial-devel mailing list