[PATCH] [mq] addchangegroupe finalize mq patches if changeset children are added

Pierre-Yves David pierre-yves.david at ens-lyon.org
Sat Mar 12 11:57:08 CST 2011


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1299952567 -3600
# Branch stable
# Node ID bbfa6f943b255fec0d6a4183597939f022bfbf00
# Parent  38c9837b1f75f53cd3e5414e4283d21da1eb125f
[mq] addchangegroupe finalize mq patches if changeset children are added.

Before this change pulling descendant to applied mq patches result in standard
changesets descendants to mq managed patches. This state is invalid mq wise.
With this change, any mq patches getting standard changeset descendant get
finalize uncondfitionnaly. Status messages are displayed for the user.

Commiting a new changeset over a mq patches is still forbiden.

diff -r 38c9837b1f75 -r bbfa6f943b25 hgext/mq.py
--- a/hgext/mq.py	Sat Mar 12 11:20:03 2011 +0100
+++ b/hgext/mq.py	Sat Mar 12 18:56:07 2011 +0100
@@ -2913,6 +2913,29 @@
             raise util.Abort(_('use --create to create a new queue'))
         _setactive(name)
 
+def mqhooksafepull(ui, repo, node, **kwargs):
+    applied = set(entry.node for entry in repo.mq.applied)
+    start, end = repo[node].rev(), len(repo)
+    mqparent = set()
+    for rev in xrange(start, end):
+        ctx = repo[rev]
+        if ctx.node() not in applied:
+            for p in ctx.parents():
+                if p.node() in applied:
+                    mqparent.add(p.node())
+    iterapplied = iter(repo.mq.applied)
+    revs = []
+    while mqparent:
+        entry = iterapplied.next()
+        if entry.node in mqparent:
+            mqparent.remove(entry.node)
+        ui.status(_('pulled changesets finalize patch: %s\n') % entry.name)
+        revs.append(repo[entry.node].rev())
+    if revs:
+        repo.mq.finish(repo, revs)
+        repo.mq.save_dirty()
+
+
 def reposetup(ui, repo):
     class mqrepo(repo.__class__):
         @util.propertycache
@@ -3011,6 +3034,7 @@
 
     if repo.local():
         repo.__class__ = mqrepo
+        ui.setconfig("hooks", "changegroup.mq.safepull", mqhooksafepull)
 
 def mqimport(orig, ui, repo, *args, **kwargs):
     if (hasattr(repo, 'abort_if_wdir_patched')


More information about the Mercurial-devel mailing list