# HG changeset patch # User Benoit Boissinot # Date 1157411746 -7200 # Node ID 11e3396e3a2be0ce114e1ed94ae4a8c848f5655a # Parent d16b93f4a6ca732bfbde7d810166d0d590050ef0# Parent 60094899dfc9dc0b0c64221e3bbd584619a8d684 merge with brendan diff --git a/hgext/patchbomb.py b/hgext/patchbomb.py --- a/hgext/patchbomb.py +++ b/hgext/patchbomb.py @@ -140,7 +140,9 @@ def patchbomb(ui, repo, *revs, **opts): if line.startswith('#'): if line.startswith('# Node ID'): node = line.split()[-1] continue - if line.startswith('diff -r'): break + if (line.startswith('diff -r') + or line.startswith('diff --git')): + break desc.append(line) if not node: raise ValueError diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -182,7 +182,7 @@ def readgitpatch(patchname): return (dopatch, gitpatches) -def dogitpatch(patchname, gitpatches): +def dogitpatch(patchname, gitpatches, cwd=None): """Preprocess git patch so that vanilla patch can handle it""" pf = file(patchname) pfline = 1 @@ -196,7 +196,7 @@ def dogitpatch(patchname, gitpatches): if not p.copymod: continue - copyfile(p.oldpath, p.path) + copyfile(p.oldpath, p.path, basedir=cwd) # rewrite patch hunk while pfline < p.lineno: @@ -227,23 +227,20 @@ def patch(patchname, ui, strip=1, cwd=No """apply the patch to the working directory. a list of patched files is returned""" - (dopatch, gitpatches) = readgitpatch(patchname) + # helper function + def __patch(patchname): + """patch and updates the files and fuzz variables""" + files = {} + fuzz = False - files = {} - fuzz = False - if dopatch: - if dopatch == 'filter': - patchname = dogitpatch(patchname, gitpatches) - patcher = util.find_in_path('gpatch', os.environ.get('PATH', ''), 'patch') + patcher = util.find_in_path('gpatch', os.environ.get('PATH', ''), + 'patch') args = [] if cwd: args.append('-d %s' % util.shellquote(cwd)) fp = os.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip, util.shellquote(patchname))) - if dopatch == 'filter': - False and os.unlink(patchname) - for line in fp: line = line.rstrip() ui.note(line + '\n') @@ -264,11 +261,24 @@ def patch(patchname, ui, strip=1, cwd=No ui.warn(pf + '\n') printed_file = True ui.warn(line + '\n') - code = fp.close() if code: raise util.Abort(_("patch command failed: %s") % util.explain_exit(code)[0]) + return files, fuzz + + (dopatch, gitpatches) = readgitpatch(patchname) + + if dopatch: + if dopatch == 'filter': + patchname = dogitpatch(patchname, gitpatches, cwd=cwd) + try: + files, fuzz = __patch(patchname) + finally: + if dopatch == 'filter': + os.unlink(patchname) + else: + files, fuzz = {}, False for gp in gitpatches: files[gp.path] = (gp.op, gp)