diff -r f2f42262adbd -r 8a8c341bd292 mercurial/patch.py --- a/mercurial/patch.py Tue Nov 27 23:55:03 2007 +0100 +++ b/mercurial/patch.py Sun Dec 02 13:53:29 2007 +0100 @@ -885,6 +885,19 @@ dopatch = True gitworkdone = False + def getpatchfile(afile, bfile, hunk): + try: + if sourcefile: + targetfile = patchfile(ui, sourcefile) + else: + targetfile = selectfile(afile, bfile, hunk, + strip, reverse) + targetfile = patchfile(ui, targetfile) + return targetfile + except PatchError, err: + ui.warn(str(err) + '\n') + return None + while True: newfile = False x = lr.readline() @@ -912,22 +925,20 @@ continue hunknum += 1 if not current_file: - if sourcefile: - current_file = patchfile(ui, sourcefile) - else: - current_file = selectfile(afile, bfile, current_hunk, - strip, reverse) - current_file = patchfile(ui, current_file) + current_file = getpatchfile(afile, bfile, current_hunk) + if not current_file: + current_file, current_hunk = None, None + rejects += 1 + continue elif state == BFILE and x.startswith('GIT binary patch'): current_hunk = binhunk(changed[bfile[2:]][1]) + hunknum += 1 if not current_file: - if sourcefile: - current_file = patchfile(ui, sourcefile) - else: - current_file = selectfile(afile, bfile, current_hunk, - strip, reverse) - current_file = patchfile(ui, current_file) - hunknum += 1 + current_file = getpatchfile(afile, bfile, current_hunk) + if not current_file: + current_file, current_hunk = None, None + rejects += 1 + continue current_hunk.extract(fp) elif x.startswith('diff --git'): # check for git diff, scanning the whole patch file if needed