# HG changeset patch # User Patrick Mezard # Date 1305838513 -7200 # Node ID bb5cbc16349e47adc8f8300fed3c397e0f54f4ec # Parent 1e64e1e12195b99288a6466ae3d90144e6bf2cf1 patch: fast-path git case in selectfile() We avoid a lot of complicated heuristics in git cases, where these heurestics may even be broken when copies are involved. diff -r 1e64e1e12195 -r bb5cbc16349e mercurial/patch.py --- a/mercurial/patch.py Thu May 19 22:49:43 2011 +0200 +++ b/mercurial/patch.py Thu May 19 22:55:13 2011 +0200 @@ -1025,7 +1025,13 @@ count -= 1 return path[:i].lstrip(), path[i:].rstrip() -def selectfile(backend, afile_orig, bfile_orig, hunk, strip): +def selectfile(backend, afile_orig, bfile_orig, hunk, strip, gp): + if gp: + # Git patches do not play games. Excluding copies from the + # following heuristic avoids a lot of confusion + fname = pathstrip(gp.path, strip - 1)[1] + missing = not hunk.createfile() and not backend.exists(fname) + return fname, missing nulla = afile_orig == "/dev/null" nullb = bfile_orig == "/dev/null" abase, afile = pathstrip(afile_orig, strip) @@ -1255,7 +1261,7 @@ try: mode = gp and gp.mode or None current_file, missing = selectfile(backend, afile, bfile, - first_hunk, strip) + first_hunk, strip, gp) current_file = patcher(ui, current_file, backend, mode, missing=missing, eolmode=eolmode) except PatchError, inst: @@ -1391,7 +1397,7 @@ if not first_hunk: continue current_file, missing = selectfile(backend, afile, bfile, - first_hunk, strip) + first_hunk, strip, gp) changed.add(current_file) elif state not in ('hunk', 'git'): raise util.Abort(_('unsupported parser state: %s') % state)