patch.diff: avoid calling workingctx().manifest()
authorAlexis S. L. Carvalho <alexis@cecm.usp.br>
Sun, 03 Jun 2007 14:38:52 -0300
changeset 4496 b79cdb7f0597
parent 4495 fc20fa9f2dfd
child 4497 22ebd6ee5672
patch.diff: avoid calling workingctx().manifest() Right now, to generate the manifest of the working dir, we have to perform a full walk of the working dir, which will be very slow, especially if we're interested in only a small part of it. Since we use the manifest only to find out the mode of files for git patches, manually build an execf function to do it. This should fix issue567.
mercurial/patch.py
--- a/mercurial/patch.py	Sun Jun 03 17:18:48 2007 +0200
+++ b/mercurial/patch.py	Sun Jun 03 14:38:52 2007 -0300
@@ -495,9 +495,12 @@
 
     if node2:
         ctx2 = context.changectx(repo, node2)
+        execf2 = ctx2.manifest().execf
     else:
         ctx2 = context.workingctx(repo)
-    man2 = ctx2.manifest()
+        execf2 = util.execfunc(repo.root, None)
+        if execf2 is None:
+            execf2 = ctx2.parents()[0].manifest().copy().execf
 
     # returns False if there was no rename between ctx1 and ctx2
     # returns None if the file was created between ctx1 and ctx2
@@ -563,7 +566,7 @@
 
             a, b = f, f
             if f in added:
-                mode = gitmode(man2.execf(f))
+                mode = gitmode(execf2(f))
                 if f in copied:
                     a = copied[f]
                     omode = gitmode(man1.execf(a))
@@ -588,7 +591,7 @@
                     header.append('deleted file mode %s\n' % mode)
             else:
                 omode = gitmode(man1.execf(f))
-                nmode = gitmode(man2.execf(f))
+                nmode = gitmode(execf2(f))
                 addmodehdr(header, omode, nmode)
                 if util.binary(to) or util.binary(tn):
                     dodiff = 'binary'