hgext/fix.py
changeset 45073 54009f8c3e25
parent 44856 b7808443ed6a
child 45074 797ef6f8295e
--- a/hgext/fix.py	Thu Jul 09 18:48:55 2020 -0700
+++ b/hgext/fix.py	Thu Jul 09 20:45:35 2020 -0700
@@ -268,6 +268,7 @@
         workqueue, numitems = getworkqueue(
             ui, repo, pats, opts, revstofix, basectxs
         )
+        basepaths = getbasepaths(repo, opts, workqueue, basectxs)
         fixers = getfixers(ui)
 
         # There are no data dependencies between the workers fixing each file
@@ -277,7 +278,7 @@
                 ctx = repo[rev]
                 olddata = ctx[path].data()
                 metadata, newdata = fixfile(
-                    ui, repo, opts, fixers, ctx, path, basectxs[rev]
+                    ui, repo, opts, fixers, ctx, path, basepaths, basectxs[rev]
                 )
                 # Don't waste memory/time passing unchanged content back, but
                 # produce one result per item either way.
@@ -473,7 +474,7 @@
     return files
 
 
-def lineranges(opts, path, basectxs, fixctx, content2):
+def lineranges(opts, path, basepaths, basectxs, fixctx, content2):
     """Returns the set of line ranges that should be fixed in a file
 
     Of the form [(10, 20), (30, 40)].
@@ -492,7 +493,8 @@
 
     rangeslist = []
     for basectx in basectxs:
-        basepath = copies.pathcopies(basectx, fixctx).get(path, path)
+        basepath = basepaths.get((basectx.rev(), fixctx.rev(), path), path)
+
         if basepath in basectx:
             content1 = basectx[basepath].data()
         else:
@@ -501,6 +503,21 @@
     return unionranges(rangeslist)
 
 
+def getbasepaths(repo, opts, workqueue, basectxs):
+    if opts.get(b'whole'):
+        # Base paths will never be fetched for line range determination.
+        return {}
+
+    basepaths = {}
+    for rev, path in workqueue:
+        fixctx = repo[rev]
+        for basectx in basectxs[rev]:
+            basepath = copies.pathcopies(basectx, fixctx).get(path, path)
+            if basepath in basectx:
+                basepaths[(basectx.rev(), fixctx.rev(), path)] = basepath
+    return basepaths
+
+
 def unionranges(rangeslist):
     """Return the union of some closed intervals
 
@@ -613,7 +630,7 @@
     return basectxs
 
 
-def fixfile(ui, repo, opts, fixers, fixctx, path, basectxs):
+def fixfile(ui, repo, opts, fixers, fixctx, path, basepaths, basectxs):
     """Run any configured fixers that should affect the file in this context
 
     Returns the file content that results from applying the fixers in some order
@@ -629,7 +646,9 @@
     newdata = fixctx[path].data()
     for fixername, fixer in pycompat.iteritems(fixers):
         if fixer.affects(opts, fixctx, path):
-            ranges = lineranges(opts, path, basectxs, fixctx, newdata)
+            ranges = lineranges(
+                opts, path, basepaths, basectxs, fixctx, newdata
+            )
             command = fixer.command(ui, path, ranges)
             if command is None:
                 continue