[PATCH 6 of 6] resolve: print message when no unresolved files remain (issue4214)

Gregory Szorc gregory.szorc at gmail.com
Thu May 8 20:46:24 CDT 2014


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1397884765 25200
#      Fri Apr 18 22:19:25 2014 -0700
# Node ID f5ae4abe75a986e3d55bffd60673a3edc9d0e71d
# Parent  e2544ef43ea835a292df8544f5411fec8fff5a28
resolve: print message when no unresolved files remain (issue4214)

When using resolve, users often have to consult with the output of |hg
resolve -l| to see if any unresolved files remain. This step is tedious
and adds overhead to resolving.

This patch will notify a user if there are no unresolved files remaining
after executing |hg resolve|.

The patch stops short of telling the user exactly what command should be
executed to continue the unfinished operation. That is because this
information is not currently captured anywhere. This would make a
compelling follow-up feature.

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -4976,8 +4976,15 @@ def resolve(ui, repo, *pats, **opts):
 
     if not didwork and pats:
         ui.warn(_("arguments do not match paths that need resolved\n"))
 
+    # Nudge users into finishing an unfinished operation. We don't print
+    # this with the list/show operation because we want list/show to remain
+    # machine readable.
+    if not list(ms.unresolved()) and not show:
+        ui.write(_('no unresolved files; '))
+        ui.write(_('you may continue your unfinished operation\n'))
+
     return ret
 
 @command('revert',
     [('a', 'all', None, _('revert all changes when no arguments given')),
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -260,8 +260,15 @@ class mergestate(object):
     def mark(self, dfile, state):
         self._state[dfile][0] = state
         self._dirty = True
 
+    def unresolved(self):
+        """Obtain the paths of unresolved files."""
+
+        for f, entry in self._state.items():
+            if entry[0] == 'u':
+                yield f
+
     def resolve(self, dfile, wctx):
         """rerun merge process for file path `dfile`"""
         if self[dfile] == 'r':
             return 0
diff --git a/tests/test-add.t b/tests/test-add.t
--- a/tests/test-add.t
+++ b/tests/test-add.t
@@ -106,8 +106,9 @@ should fail
   $ hg st
   M a
   ? a.orig
   $ hg resolve -m a
+  no unresolved files; you may continue your unfinished operation
   $ hg ci -m merge
 
 Issue683: peculiarity with hg revert of an removed then added file
 
diff --git a/tests/test-backout.t b/tests/test-backout.t
--- a/tests/test-backout.t
+++ b/tests/test-backout.t
@@ -489,8 +489,9 @@ Test usage of `hg resolve` in case of co
   picked tool 'internal:merge' for foo (binary False symlink False)
   merging foo
   my foo at b71750c4b0fd+ other foo at a30dd8addae3 ancestor foo at 913609522437
    premerge successful
+  no unresolved files; you may continue your unfinished operation
   $ hg status
   M foo
   ? foo.orig
   $ hg resolve -l
diff --git a/tests/test-commit-amend.t b/tests/test-commit-amend.t
--- a/tests/test-commit-amend.t
+++ b/tests/test-commit-amend.t
@@ -585,8 +585,9 @@ Amend a merge changeset (with renames an
   warning: conflicts during merge.
   merging cc incomplete! (edit conflicts, then use 'hg resolve --mark')
   [1]
   $ hg resolve -m cc
+  no unresolved files; you may continue your unfinished operation
   $ hg ci -m 'merge bar'
   $ hg log --config diff.git=1 -pr .
   changeset:   23:d51446492733
   tag:         tip
diff --git a/tests/test-commit-unresolved.t b/tests/test-commit-unresolved.t
--- a/tests/test-commit-unresolved.t
+++ b/tests/test-commit-unresolved.t
@@ -40,7 +40,8 @@ Correct the conflict without marking the
 
 Mark the conflict as resolved and commit
 
   $ hg resolve -m A
+  no unresolved files; you may continue your unfinished operation
   $ hg commit -m "Merged"
 
   $ cd ..
diff --git a/tests/test-convert-svn-sink.t b/tests/test-convert-svn-sink.t
--- a/tests/test-convert-svn-sink.t
+++ b/tests/test-convert-svn-sink.t
@@ -351,8 +351,9 @@ Branchy history
   use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
   [1]
   $ hg --cwd b revert -r 2 b
   $ hg --cwd b resolve -m b
+  no unresolved files; you may continue your unfinished operation
   $ hg --cwd b ci -d '5 0' -m 'merge'
 
 Expect 4 changes
 
diff --git a/tests/test-fileset.t b/tests/test-fileset.t
--- a/tests/test-fileset.t
+++ b/tests/test-fileset.t
@@ -153,8 +153,9 @@ Test merge states
   $ fileset 'unresolved()'
   b2
   $ echo e > b2
   $ hg resolve -m b2
+  no unresolved files; you may continue your unfinished operation
   $ fileset 'resolved()'
   b2
   $ fileset 'unresolved()'
   $ hg ci -m merge
diff --git a/tests/test-graft.t b/tests/test-graft.t
--- a/tests/test-graft.t
+++ b/tests/test-graft.t
@@ -219,8 +219,9 @@ Continue without resolve should fail:
 Fix up:
 
   $ echo b > e
   $ hg resolve -m e
+  no unresolved files; you may continue your unfinished operation
 
 Continue with a revision should fail:
 
   $ hg graft -c 6
@@ -353,8 +354,9 @@ Resolve conflicted graft
   (use hg resolve and hg graft --continue)
   [255]
   $ hg resolve --all
   merging a
+  no unresolved files; you may continue your unfinished operation
   $ hg graft -c
   grafting revision 1
   $ hg export tip --git
   # HG changeset patch
@@ -381,8 +383,9 @@ Resolve conflicted graft with rename
   (use hg resolve and hg graft --continue)
   [255]
   $ hg resolve --all
   merging a and b to b
+  no unresolved files; you may continue your unfinished operation
   $ hg graft -c
   grafting revision 2
   $ hg export tip --git
   # HG changeset patch
diff --git a/tests/test-histedit-fold-non-commute.t b/tests/test-histedit-fold-non-commute.t
--- a/tests/test-histedit-fold-non-commute.t
+++ b/tests/test-histedit-fold-non-commute.t
@@ -94,8 +94,9 @@ edit the history
 
 fix up
   $ echo 'I can haz no commute' > e
   $ hg resolve --mark e
+  no unresolved files; you may continue your unfinished operation
   $ cat > cat.py <<EOF
   > import sys
   > print open(sys.argv[1]).read()
   > print
@@ -128,8 +129,9 @@ fix up
 
 just continue this time
   $ hg revert -r 'p1()' e
   $ hg resolve --mark e
+  no unresolved files; you may continue your unfinished operation
   $ hg histedit --continue 2>&1 | fixbundle
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
diff --git a/tests/test-histedit-fold.t b/tests/test-histedit-fold.t
--- a/tests/test-histedit-fold.t
+++ b/tests/test-histedit-fold.t
@@ -216,8 +216,9 @@ should effectively drop the changes from
   $ hg resolve -l
   U file
   $ hg revert -r 'p1()' file
   $ hg resolve --mark file
+  no unresolved files; you may continue your unfinished operation
   $ hg histedit --continue
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/*-backup.hg (glob)
   $ hg logt --graph
@@ -275,8 +276,9 @@ dropped revision.
   > 4
   > 5
   > EOF
   $ hg resolve --mark file
+  no unresolved files; you may continue your unfinished operation
   $ hg commit -m '+5.2'
   created new head
   $ echo 6 >> file
   $ HGEDITOR=cat hg histedit --continue
diff --git a/tests/test-histedit-non-commute.t b/tests/test-histedit-non-commute.t
--- a/tests/test-histedit-non-commute.t
+++ b/tests/test-histedit-non-commute.t
@@ -153,8 +153,9 @@ edit the history
 
 fix up
   $ echo 'I can haz no commute' > e
   $ hg resolve --mark e
+  no unresolved files; you may continue your unfinished operation
   $ hg histedit --continue 2>&1 | fixbundle
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merging e
   warning: conflicts during merge.
@@ -166,8 +167,9 @@ former children.
 
 just continue this time
   $ hg revert -r 'p1()' e
   $ hg resolve --mark e
+  no unresolved files; you may continue your unfinished operation
   $ hg histedit --continue 2>&1 | fixbundle
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -238,8 +240,9 @@ edit the history, this time with a fold 
   Fix up the change and run hg histedit --continue
 
   $ echo 'I can haz no commute' > e
   $ hg resolve --mark e
+  no unresolved files; you may continue your unfinished operation
   $ hg histedit --continue 2>&1 | fixbundle
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   merging e
   warning: conflicts during merge.
@@ -247,8 +250,9 @@ edit the history, this time with a fold 
   Fix up the change and run hg histedit --continue
 second edit also fails, but just continue
   $ hg revert -r 'p1()' e
   $ hg resolve --mark e
+  no unresolved files; you may continue your unfinished operation
   $ hg histedit --continue 2>&1 | fixbundle
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
diff --git a/tests/test-keyword.t b/tests/test-keyword.t
--- a/tests/test-keyword.t
+++ b/tests/test-keyword.t
@@ -1057,8 +1057,9 @@ conflict: keyword should stay outside co
 
 resolve to local
 
   $ HGMERGE=internal:local hg resolve -a
+  no unresolved files; you may continue your unfinished operation
   $ hg commit -m localresolve
   $ cat m
   $Id: m 800511b3a22d Thu, 01 Jan 1970 00:00:00 +0000 test $
   bar
diff --git a/tests/test-lfconvert.t b/tests/test-lfconvert.t
--- a/tests/test-lfconvert.t
+++ b/tests/test-lfconvert.t
@@ -131,8 +131,9 @@ add some changesets to rename/remove/mer
   use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
   [1]
   $ hg cat -r . sub/maybelarge.dat > stuff/maybelarge.dat
   $ hg resolve -m stuff/maybelarge.dat
+  no unresolved files; you may continue your unfinished operation
   $ hg commit -m"merge"
   $ hg log -G --template "{rev}:{node|short}  {desc|firstline}\n"
   @    5:4884f215abda  merge
   |\
diff --git a/tests/test-log.t b/tests/test-log.t
--- a/tests/test-log.t
+++ b/tests/test-log.t
@@ -989,8 +989,9 @@ log -p -R repo
   use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
   [1]
   $ echo 'merge 1' > foo
   $ hg resolve -m foo
+  no unresolved files; you may continue your unfinished operation
   $ hg ci -m "First merge, related"
 
   $ hg merge 4
   merging foo
@@ -1000,8 +1001,9 @@ log -p -R repo
   use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
   [1]
   $ echo 'merge 2' > foo
   $ hg resolve -m foo
+  no unresolved files; you may continue your unfinished operation
   $ hg ci -m "Last merge, related"
 
   $ hg log --graph
   @    changeset:   10:4dae8563d2c5
diff --git a/tests/test-merge-types.t b/tests/test-merge-types.t
--- a/tests/test-merge-types.t
+++ b/tests/test-merge-types.t
@@ -49,8 +49,9 @@ Symlink is local parent, executable is o
   $ tellmeabout a
   a is a symlink:
   a -> symlink
   $ hg resolve a --tool internal:other
+  no unresolved files; you may continue your unfinished operation
   $ tellmeabout a
   a is an executable file with content:
   a
   $ hg st
diff --git a/tests/test-merge7.t b/tests/test-merge7.t
--- a/tests/test-merge7.t
+++ b/tests/test-merge7.t
@@ -56,8 +56,9 @@ resolve conflict
   > three
   > EOF
   $ rm -f *.orig
   $ hg resolve -m test.txt
+  no unresolved files; you may continue your unfinished operation
   $ hg commit -m "Merge 1"
 
 change test-a again
   $ cd ../test-a
diff --git a/tests/test-mq-qnew.t b/tests/test-mq-qnew.t
--- a/tests/test-mq-qnew.t
+++ b/tests/test-mq-qnew.t
@@ -157,8 +157,9 @@ plain headers
   warning: conflicts during merge.
   merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
   use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+  no unresolved files; you may continue your unfinished operation
   abort: cannot manage merge changesets
   $ rm -r sandbox
 
 hg headers
@@ -230,8 +231,9 @@ hg headers
   warning: conflicts during merge.
   merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
   use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+  no unresolved files; you may continue your unfinished operation
   abort: cannot manage merge changesets
   $ rm -r sandbox
 
 Test saving last-message.txt
diff --git a/tests/test-rebase-bookmarks.t b/tests/test-rebase-bookmarks.t
--- a/tests/test-rebase-bookmarks.t
+++ b/tests/test-rebase-bookmarks.t
@@ -167,8 +167,9 @@ rebase --continue with bookmarks present
   unresolved conflicts (see hg resolve, then hg rebase --continue)
   [1]
   $ echo 'c' > c
   $ hg resolve --mark c
+  no unresolved files; you may continue your unfinished operation
   $ hg rebase --continue
   saved backup bundle to $TESTTMP/a3/.hg/strip-backup/3d5fa227f4b5-backup.hg (glob)
   $ hg tglog
   @  4: 'C' bookmarks: Y Z
diff --git a/tests/test-rebase-check-restore.t b/tests/test-rebase-check-restore.t
--- a/tests/test-rebase-check-restore.t
+++ b/tests/test-rebase-check-restore.t
@@ -75,8 +75,9 @@ Solve the conflict and go on:
 
   $ echo 'conflict solved' > A
   $ rm A.orig
   $ hg resolve -m A
+  no unresolved files; you may continue your unfinished operation
   $ hg rebase --continue
 
   $ hg tglog
   o  7:secret 'C'
@@ -128,8 +129,9 @@ Solve the conflict and go on:
 
   $ echo 'conflict solved' > A
   $ rm A.orig
   $ hg resolve -m A
+  no unresolved files; you may continue your unfinished operation
   $ hg rebase --continue
   saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
diff --git a/tests/test-rebase-conflicts.t b/tests/test-rebase-conflicts.t
--- a/tests/test-rebase-conflicts.t
+++ b/tests/test-rebase-conflicts.t
@@ -76,8 +76,9 @@ Try to continue without solving the conf
 Conclude rebase:
 
   $ echo 'resolved merge' >common
   $ hg resolve -m common
+  no unresolved files; you may continue your unfinished operation
   $ hg rebase --continue
   saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
diff --git a/tests/test-rebase-detach.t b/tests/test-rebase-detach.t
--- a/tests/test-rebase-detach.t
+++ b/tests/test-rebase-detach.t
@@ -373,8 +373,9 @@ Ensure --continue restores a correct sta
   merging H incomplete! (edit conflicts, then use 'hg resolve --mark')
   unresolved conflicts (see hg resolve, then hg rebase --continue)
   [1]
   $ hg resolve --all -t internal:local
+  no unresolved files; you may continue your unfinished operation
   $ hg rebase -c
   saved backup bundle to $TESTTMP/a7/.hg/strip-backup/6215fafa5447-backup.hg (glob)
   $ hg  log -G --template "{rev}:{phase} '{desc}' {branches}\n"
   @  7:draft 'H'
diff --git a/tests/test-rebase-interruptions.t b/tests/test-rebase-interruptions.t
--- a/tests/test-rebase-interruptions.t
+++ b/tests/test-rebase-interruptions.t
@@ -103,8 +103,9 @@ Solve the conflict and go on:
 
   $ echo 'conflict solved' > A
   $ rm A.orig
   $ hg resolve -m A
+  no unresolved files; you may continue your unfinished operation
 
   $ hg rebase --continue
   warning: new changesets detected on source branch, not stripping
 
diff --git a/tests/test-rebase-mq-skip.t b/tests/test-rebase-mq-skip.t
--- a/tests/test-rebase-mq-skip.t
+++ b/tests/test-rebase-mq-skip.t
@@ -110,8 +110,9 @@ already has one local mq patch
   unresolved conflicts (see hg resolve, then hg rebase --continue)
   [1]
 
   $ HGMERGE=internal:local hg resolve --all
+  no unresolved files; you may continue your unfinished operation
 
   $ hg rebase --continue
   saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
 
diff --git a/tests/test-rebase-mq.t b/tests/test-rebase-mq.t
--- a/tests/test-rebase-mq.t
+++ b/tests/test-rebase-mq.t
@@ -68,8 +68,9 @@ Rebase - generate a conflict:
 Fix the 1st conflict:
 
   $ echo mq1r1 > f
   $ hg resolve -m f
+  no unresolved files; you may continue your unfinished operation
   $ hg rebase -c
   merging f
   warning: conflicts during merge.
   merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
@@ -79,8 +80,9 @@ Fix the 1st conflict:
 Fix the 2nd conflict:
 
   $ echo mq1r1mq2 > f
   $ hg resolve -m f
+  no unresolved files; you may continue your unfinished operation
   $ hg rebase -c
   saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
diff --git a/tests/test-rebase-parameters.t b/tests/test-rebase-parameters.t
--- a/tests/test-rebase-parameters.t
+++ b/tests/test-rebase-parameters.t
@@ -453,8 +453,9 @@ Test --tool parameter:
   $ hg resolve -l
   U c2
 
   $ hg resolve -m c2
+  no unresolved files; you may continue your unfinished operation
   $ hg rebase -c --tool internal:fail
   tool option will be ignored
   saved backup bundle to $TESTTMP/b3/.hg/strip-backup/*-backup.hg (glob)
 
diff --git a/tests/test-resolve.t b/tests/test-resolve.t
--- a/tests/test-resolve.t
+++ b/tests/test-resolve.t
@@ -38,8 +38,9 @@ resolving an unknown path emits a warnin
 resolve the failure
 
   $ echo resolved > file
   $ hg resolve -m file
+  no unresolved files; you may continue your unfinished operation
   $ hg commit -m 'resolved'
 
 resolve -l should error since no merge in progress
 
diff --git a/tests/test-shelve.t b/tests/test-shelve.t
--- a/tests/test-shelve.t
+++ b/tests/test-shelve.t
@@ -293,8 +293,9 @@ attempt to continue
   [255]
 
   $ hg revert -r . a/a
   $ hg resolve -m a/a
+  no unresolved files; you may continue your unfinished operation
 
   $ hg commit -m 'commit while unshelve in progress'
   abort: unshelve already in progress
   (use 'hg unshelve --continue' or 'hg unshelve --abort')


More information about the Mercurial-devel mailing list