[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