changeset 14386:c2ef8cc50748

patch: unify iterhunks() afile/bfile handling git afile/bfile are extracted twice, once when reading a 'diff --git', and again when reading a unified hunk. The problem is not all git blocks have unified hunks (renames just have metadata) and they were not extracted the same way. This is what this patch unifies.
author Patrick Mezard <pmezard@gmail.com>
date Thu, 19 May 2011 22:44:01 +0200
parents 7709cc983025
children e1b4a7a7263a
files mercurial/patch.py
diffstat 1 files changed, 4 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/patch.py	Thu May 19 22:44:01 2011 +0200
+++ b/mercurial/patch.py	Thu May 19 22:44:01 2011 +0200
@@ -1137,8 +1137,6 @@
             gp = changed.get(bfile)
             if x.startswith('GIT binary patch'):
                 h = binhunk(gp, lr)
-                afile = 'a/' + afile
-                bfile = 'b/' + bfile
             else:
                 if context is None and x.startswith('***************'):
                     context = True
@@ -1154,15 +1152,16 @@
             # check for git diff, scanning the whole patch file if needed
             m = gitre.match(x)
             if m:
-                afile, bfile = m.group(1, 2)
                 if not git:
                     git = True
                     gitpatches = scangitpatch(lr, x)
                     for gp in gitpatches:
-                        changed[gp.path] = gp
+                        changed['b/' + gp.path] = gp
                     yield 'git', gitpatches
+                afile = 'a/' + m.group(1)
+                bfile = 'b/' + m.group(2)
+                gp = changed[bfile]
                 # copy/rename + modify should modify target, not source
-                gp = changed[bfile]
                 if gp.op in ('COPY', 'DELETE', 'RENAME', 'ADD') or gp.mode:
                     afile = bfile
                 newfile = True