[PATCH 1 of 3] copies: extract an explicit `computechangesetcopie` method from context

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Aug 6 05:50:38 EDT 2019


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at octobus.net>
# Date 1565054260 -7200
#      Tue Aug 06 03:17:40 2019 +0200
# Node ID fc8e461200c7262246ebd610100bcf9a75ded461
# Parent  f95b59ffc307c4549d9640a81d750a99bd75f423
# EXP-Topic extrameta
# Available At https://bitbucket.org/octobus/mercurial-devel/
#              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r fc8e461200c7
copies: extract an explicit `computechangesetcopie` method from context

Right now, the logic around changeset centric copies data are buried into the
"changectx" code. We extract this code in a dedicated method (in the copies
module) for clarity. This clarity will help to explicitly compute and caches
these data in the future.

diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -24,6 +24,7 @@ from .node import (
     wdirhex,
 )
 from . import (
+    copies,
     dagop,
     encoding,
     error,
@@ -274,23 +275,7 @@ class basectx(object):
 
     @propertycache
     def _copies(self):
-        p1copies = {}
-        p2copies = {}
-        p1 = self.p1()
-        p2 = self.p2()
-        narrowmatch = self._repo.narrowmatch()
-        for dst in self.files():
-            if not narrowmatch(dst) or dst not in self:
-                continue
-            copied = self[dst].renamed()
-            if not copied:
-                continue
-            src, srcnode = copied
-            if src in p1 and p1[src].filenode() == srcnode:
-                p1copies[dst] = src
-            elif src in p2 and p2[src].filenode() == srcnode:
-                p2copies[dst] = src
-        return p1copies, p2copies
+        return copies.computechangesetcopies(self)
     def p1copies(self):
         return self._copies[0]
     def p2copies(self):
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -809,3 +809,28 @@ def duplicatecopies(repo, wctx, rev, fro
             continue
         if dst in wctx:
             wctx[dst].markcopied(src)
+
+def computechangesetcopies(ctx):
+    """return the copies data for a changeset
+
+    The copies data are returned as a pair of dictionnary (p1copies, p2copies).
+
+    Each dictionnary are in the form: `{newname: oldname}`
+    """
+    p1copies = {}
+    p2copies = {}
+    p1 = ctx.p1()
+    p2 = ctx.p2()
+    narrowmatch = ctx._repo.narrowmatch()
+    for dst in ctx.files():
+        if not narrowmatch(dst) or dst not in ctx:
+            continue
+        copied = ctx[dst].renamed()
+        if not copied:
+            continue
+        src, srcnode = copied
+        if src in p1 and p1[src].filenode() == srcnode:
+            p1copies[dst] = src
+        elif src in p2 and p2[src].filenode() == srcnode:
+            p2copies[dst] = src
+    return p1copies, p2copies


More information about the Mercurial-devel mailing list