[PATCH 4 of 6] resolve: abort when not applicable

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


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1397873312 25200
#      Fri Apr 18 19:08:32 2014 -0700
# Node ID a5e623de6557ea8854cefc108d5b069adb0f737a
# Parent  6d5b402aae2d697b93b19ccf8f4d0245c4fc29d3
resolve: abort when not applicable

The resolve command is only relevant when mergestate is present.
This patch will make resolve abort when no mergestate is present.

This change will let people know when they are using resolve when they
shouldn't be. This change will let people know when their use of resolve
doesn't do anything.

Previously, |hg resolve -m| would allow mergestate to be created. This
patch now forbids that. Strictly speaking, this is backwards
incompatible. The author of this patch believes creating mergestate via
resolve doesn't make much sense and this side-effect was unintended.

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -4926,8 +4926,12 @@ def resolve(ui, repo, *pats, **opts):
         raise util.Abort(_('no files or directories specified; '
                            'use --all to remerge all files'))
 
     ms = mergemod.mergestate(repo)
+
+    if not ms.active():
+        raise util.Abort(_('resolve command not applicable when not merging'))
+
     m = scmutil.match(repo[None], pats, opts)
     ret = 0
 
     for f in ms:
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -175,8 +175,20 @@ class mergestate(object):
             if err.errno != errno.ENOENT:
                 raise
         return records
 
+    def active(self):
+        """Whether mergestate is active.
+
+        Returns True if there appears to be mergestate. This is a rough proxy
+        for "is a merge in progress."
+        """
+        # Check local variables before looking at filesystem for performance
+        # reasons.
+        return bool(self._local) or bool(self._state) or \
+               self._repo.opener.exists(self.statepathv1) or \
+               self._repo.opener.exists(self.statepathv2)
+
     def commit(self):
         """Write current state on disk (if necessary)"""
         if self._dirty:
             records = []
diff --git a/tests/test-histedit-non-commute-abort.t b/tests/test-histedit-non-commute-abort.t
--- a/tests/test-histedit-non-commute-abort.t
+++ b/tests/test-histedit-non-commute-abort.t
@@ -84,8 +84,10 @@ abort the edit
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
 log after abort
   $ hg resolve -l
+  abort: resolve command not applicable when not merging
+  [255]
   $ hg log --graph
   @  changeset:   6:bfa474341cc9
   |  tag:         tip
   |  user:        test
diff --git a/tests/test-resolve.t b/tests/test-resolve.t
--- a/tests/test-resolve.t
+++ b/tests/test-resolve.t
@@ -36,11 +36,13 @@ resolve the failure
   $ echo resolved > file
   $ hg resolve -m file
   $ hg commit -m 'resolved'
 
-resolve -l, should be empty
+resolve -l should error since no merge in progress
 
   $ hg resolve -l
+  abort: resolve command not applicable when not merging
+  [255]
 
 test crashed merge with empty mergestate
 
   $ mkdir .hg/merge
diff --git a/tests/test-shelve.t b/tests/test-shelve.t
--- a/tests/test-shelve.t
+++ b/tests/test-shelve.t
@@ -261,8 +261,10 @@ abort the unshelve and be happy
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     second
   
   $ hg resolve -l
+  abort: resolve command not applicable when not merging
+  [255]
   $ hg status
   A foo/foo
   ? a/a.orig
 


More information about the Mercurial-devel mailing list