[PATCH 3 of 9 phases] mq: turn changeset draft on qfinish (except if qparent is secret)

pierre-yves.david at logilab.fr pierre-yves.david at logilab.fr
Wed Jan 18 10:33:09 CST 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1326902819 -3600
# Node ID c30779cbb2829b55880aa33e1494c0ec48de6f16
# Parent  dc8d8aa6e8ac490fcafd074d570df0787ee0ee69
mq: turn changeset draft on qfinish (except if qparent is secret)

As mq automatically sets changesets as secret, it should make them draft when he
is done with it. We do not move them automatically to draft when we detect that
something else have also set them as secret through their parents.

diff --git a/hgext/mq.py b/hgext/mq.py
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -761,10 +761,11 @@ class queue(object):
             if r:
                 r[None].forget(patches)
             for p in patches:
                 os.unlink(self.join(p))
 
+        qfinished = []
         if numrevs:
             qfinished = self.applied[:numrevs]
             del self.applied[:numrevs]
             self.applieddirty = True
 
@@ -787,10 +788,11 @@ class queue(object):
                 msg = _('unknown patches: %s\n')
                 raise util.Abort(''.join(msg % p for p in unknown))
 
         self.parseseries()
         self.seriesdirty = True
+        return [entry.node for entry in qfinished]
 
     def _revpatches(self, repo, revs):
         firstrev = repo[self.applied[0].node].rev()
         patches = []
         for i, rev in enumerate(revs):
@@ -814,11 +816,15 @@ class queue(object):
             patches.append(patch)
         return patches
 
     def finish(self, repo, revs):
         patches = self._revpatches(repo, sorted(revs))
-        self._cleanup(patches, len(patches))
+        qfinished = self._cleanup(patches, len(patches))
+        if qfinished:
+            oldqbase = repo[qfinished[0]]
+            if oldqbase.p1().phase() < phases.secret:
+                phases.advanceboundary(repo, phases.draft, [oldqbase.node()])
 
     def delete(self, repo, patches, opts):
         if not patches and not opts.get('rev'):
             raise util.Abort(_('qdelete requires at least one revision or '
                                'patch name'))
@@ -2930,13 +2936,19 @@ def finish(ui, repo, *revrange, **opts):
         return 0
 
     revs = scmutil.revrange(repo, revrange)
     if repo['.'].rev() in revs and repo[None].files():
         ui.warn(_('warning: uncommitted changes in the working directory\n'))
-
-    q.finish(repo, revs)
-    q.savedirty()
+    # queue.finish may changes phases but leave the responsability to lock the
+    # repo to the caller to avoid deadlock with wlock. This command code is
+    # responsability for this locking.
+    lock = repo.lock()
+    try:
+        q.finish(repo, revs)
+        q.savedirty()
+    finally:
+        lock.release()
     return 0
 
 @command("qqueue",
          [('l', 'list', False, _('list all available queues')),
           ('', 'active', False, _('print name of active queue')),


More information about the Mercurial-devel mailing list