--- a/mercurial/patch.py Fri Mar 06 21:48:40 2015 -0800
+++ b/mercurial/patch.py Fri Mar 06 22:17:24 2015 -0800
@@ -1087,20 +1087,22 @@
return s
return s[:i]
-def pathtransform(path, strip):
+def pathtransform(path, strip, prefix):
'''turn a path from a patch into a path suitable for the repository
+ prefix, if not empty, is expected to be normalized with a / at the end.
+
Returns (stripped components, path in repository).
- >>> pathtransform('a/b/c', 0)
+ >>> pathtransform('a/b/c', 0, '')
('', 'a/b/c')
- >>> pathtransform(' a/b/c ', 0)
+ >>> pathtransform(' a/b/c ', 0, '')
('', ' a/b/c')
- >>> pathtransform(' a/b/c ', 2)
+ >>> pathtransform(' a/b/c ', 2, '')
('a/b/', 'c')
- >>> pathtransform(' a//b/c ', 2)
- ('a//b/', 'c')
- >>> pathtransform('a/b/c', 3)
+ >>> pathtransform(' a//b/c ', 2, 'd/e/')
+ ('a//b/', 'd/e/c')
+ >>> pathtransform('a/b/c', 3, '')
Traceback (most recent call last):
PatchError: unable to strip away 1 of 3 dirs from a/b/c
'''
@@ -1119,16 +1121,16 @@
while i < pathlen - 1 and path[i] == '/':
i += 1
count -= 1
- return path[:i].lstrip(), path[i:].rstrip()
+ return path[:i].lstrip(), prefix + path[i:].rstrip()
def makepatchmeta(backend, afile_orig, bfile_orig, hunk, strip):
nulla = afile_orig == "/dev/null"
nullb = bfile_orig == "/dev/null"
create = nulla and hunk.starta == 0 and hunk.lena == 0
remove = nullb and hunk.startb == 0 and hunk.lenb == 0
- abase, afile = pathtransform(afile_orig, strip)
+ abase, afile = pathtransform(afile_orig, strip, '')
gooda = not nulla and backend.exists(afile)
- bbase, bfile = pathtransform(bfile_orig, strip)
+ bbase, bfile = pathtransform(bfile_orig, strip, '')
if afile == bfile:
goodb = gooda
else:
@@ -1368,7 +1370,7 @@
eolmode='strict'):
def pstrip(p):
- return pathtransform(p, strip - 1)[1]
+ return pathtransform(p, strip - 1, '')[1]
rejects = 0
err = 0
@@ -1557,9 +1559,9 @@
if state == 'file':
afile, bfile, first_hunk, gp = values
if gp:
- gp.path = pathtransform(gp.path, strip - 1)[1]
+ gp.path = pathtransform(gp.path, strip - 1, '')[1]
if gp.oldpath:
- gp.oldpath = pathtransform(gp.oldpath, strip - 1)[1]
+ gp.oldpath = pathtransform(gp.oldpath, strip - 1, '')[1]
else:
gp = makepatchmeta(backend, afile, bfile, first_hunk, strip)
changed.add(gp.path)