[PATCH 09 of 10] mq: mq.secret prevent mq changeset outside secret phase

pierre-yves.david at logilab.fr pierre-yves.david at logilab.fr
Mon Jan 30 10:49:43 CST 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1327941820 -3600
# Branch stable
# Node ID 440ddb63f450c1fc662517205bf4148529118f9e
# Parent  44bfd92fa0f75504c460ef4c9f9fc28aca147a84
mq: mq.secret prevent mq changeset outside secret phase

Any operation trying to put an mq changeset in a phase lower than draft will
abort. As a side effect, this gracefully handle the situation where pull adds
children to mq changeset (issue1099).

Corner cases are not handled yet. The main one is: "Turning mq.secret=true while
some mq changeset are not secret."

diff --git a/hgext/mq.py b/hgext/mq.py
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -3170,10 +3170,20 @@ def mqphasedefaults(repo, roots):
             mqphase = phases.draft
         qbase = repo[repo.mq.applied[0].node]
         roots[mqphase].add(qbase.node())
     return roots
 
+def mqadvanceboundary(orig, repo, targetphase, nodes):
+    mqsecret = repo.ui.configbool('mq', 'secret', False)
+    if mqsecret and targetphase < phases.secret:
+        conflicting = list(repo.revs('%ln and mq()', nodes))
+        if conflicting:
+            msg = _("cannot set mq changeset to %s with mq in secret mode")
+            hint = _("qfinish them or disable mq.secret")
+            raise util.Abort(msg % phases.phasenames[targetphase], hint=hint)
+    orig(repo, targetphase, nodes)
+
 def reposetup(ui, repo):
     class mqrepo(repo.__class__):
         @util.propertycache
         def mq(self):
             return queue(self.ui, self.path)
@@ -3353,10 +3363,11 @@ i18nfunctions = [revsetmq]
 def uisetup(ui):
     mqopt = [('', 'mq', None, _("operate on patch repository"))]
 
     extensions.wrapcommand(commands.table, 'import', mqimport)
     extensions.wrapcommand(commands.table, 'summary', summary)
+    extensions.wrapfunction(phases, 'advanceboundary', mqadvanceboundary)
 
     entry = extensions.wrapcommand(commands.table, 'init', mqinit)
     entry[1].extend(mqopt)
 
     nowrap = set(commands.norepo.split(" "))
diff --git a/tests/test-mq.t b/tests/test-mq.t
--- a/tests/test-mq.t
+++ b/tests/test-mq.t
@@ -1463,10 +1463,28 @@ 1. mq.secret=false
   $ hg phase 'qparent::'
   0: secret
   1: secret
   2: secret
 
+Test that mq.secret=true prevent to move mq changeset outside secret phase
+
+  $ hg phase --draft qbase
+  abort: cannot set mq changeset to draft with mq in secret mode
+  (qfinish them or disable mq.secret)
+  [255]
+
+  $ cp -r . ../remote
+  $ hg -R ../remote qfinish qbase
+  patch add-file1 finalized without changeset message
+  $ hg pull ../remote # phase sync
+  pulling from ../remote
+  searching for changes
+  no changes found
+  abort: cannot set mq changeset to public with mq in secret mode
+  (qfinish them or disable mq.secret)
+  [255]
+
 Test that qfinish change phase when mq.secret=true
 
   $ hg qfinish qbase
   patch add-file1 finalized without changeset message
   $ hg phase 'all()'


More information about the Mercurial-devel mailing list