mercurial/copies.py
changeset 43255 b8d60845fa5d
parent 43254 181d28ba05da
child 43256 00de32aa834e
--- a/mercurial/copies.py	Wed Oct 16 17:49:30 2019 +0200
+++ b/mercurial/copies.py	Wed Oct 02 17:42:01 2019 -0400
@@ -178,12 +178,36 @@
     return cm
 
 
+def _revinfogetter(repo):
+    """return a function that return multiple data given a <rev>"i
+
+    * p1: revision number of first parent
+    * p2: revision number of first parent
+    * p1copies: mapping of copies from p1
+    * p2copies: mapping of copies from p2
+    * removed: a list of removed files
+    """
+    cl = repo.changelog
+    parents = cl.parentrevs
+
+    def revinfo(rev):
+        p1, p2 = parents(rev)
+        ctx = repo[rev]
+        p1copies, p2copies = ctx._copies
+        removed = ctx.filesremoved()
+        return p1, p2, p1copies, p2copies, removed
+
+    return revinfo
+
+
 def _changesetforwardcopies(a, b, match):
     if a.rev() in (node.nullrev, b.rev()):
         return {}
 
     repo = a.repo()
     children = {}
+    revinfo = _revinfogetter(repo)
+
     cl = repo.changelog
     missingrevs = cl.findmissingrevs(common=[a.rev()], heads=[b.rev()])
     for r in missingrevs:
@@ -206,9 +230,7 @@
         if r == b.rev():
             return copies
         for i, c in enumerate(children[r]):
-            childctx = repo[c]
-            p1, p2 = cl.parentrevs(c)
-            p1copies, p2copies = childctx._copies
+            p1, p2, p1copies, p2copies, removed = revinfo(c)
             if r == p1:
                 parent = 1
                 childcopies = p1copies
@@ -227,7 +249,7 @@
                 newcopies = copies
             if childcopies:
                 newcopies = _chain(newcopies, childcopies)
-            for f in childctx.filesremoved():
+            for f in removed:
                 if f in newcopies:
                     del newcopies[f]
             othercopies = all_copies.get(c)