[PATCH 4 of 5 topic-experiment] topics: use a dict for successors of changesets produced by topic change

Pulkit Goyal 7895pulkit at gmail.com
Tue Jun 20 22:09:25 EDT 2017


# HG changeset patch
# User Pulkit Goyal <7895pulkit at gmail.com>
# Date 1498009910 -19800
#      Wed Jun 21 07:21:50 2017 +0530
# Node ID fd9e563f9e2b12615231839c847f42a98b5581fd
# Parent  06359d495ef9cc44163a35e16ca763148053e69c
topics: use a dict for successors of changesets produced by topic change

This patch adds a dictionary to store the successors of changesets which got
obsoleted when we change it's topic. This is an improvement in the fix for
issue5441.

diff --git a/hgext3rd/topic/__init__.py b/hgext3rd/topic/__init__.py
--- a/hgext3rd/topic/__init__.py
+++ b/hgext3rd/topic/__init__.py
@@ -310,10 +310,9 @@
     l = repo.lock()
     txn = repo.transaction('rewrite-topics')
     try:
-        newp = None
-        oldp = None
         p1 = None
         p2 = None
+        successors = {}
         for c in repo.set('%r', revset):
             def filectxfn(repo, ctx, path):
                 try:
@@ -343,22 +342,18 @@
             # While changing topic of set of linear commits, make sure that
             # we base our commits on new parent rather than old parent which
             # was obsoleted while changing the topic
-            if newp and c.p1().node() == oldp:
-                p1 = newp
-                p2 = c.p2().node()
-            elif newp and c.p2().node() == oldp:
-                p1 = c.p1().node()
-                p2 = newp
-            else:
-                p1 = c.p1().node()
-                p2 = c.p2().node()
+            p1 = c.p1().node()
+            p2 = c.p2().node()
+            if p1 in successors:
+                p1 = successors[p1]
+            if p2 in successors:
+                p2 = successors[p2]
             mc = context.memctx(
                 repo, (p1, p2), c.description(),
                 c.files(), filectxfn,
                 user=c.user(), date=c.date(), extra=fixedextra)
             newnode = repo.commitctx(mc)
-            oldp = c.node()
-            newp = newnode
+            successors[c.node()] = newnode
             ui.debug('new node id is %s\n' % node.hex(newnode))
             needevolve = needevolve or (len(c.children()) > 0)
             obsolete.createmarkers(repo, [(c, (repo[newnode],))])


More information about the Mercurial-devel mailing list