Mercurial > public > mercurial-scm > hg-stable
diff mercurial/patch.py @ 10749:03225f14c495
Merge with stable
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sat, 20 Mar 2010 16:57:24 -0500 |
parents | 16b9aa398c28 fb06e357e698 |
children | 440786f7f18b |
line wrap: on
line diff
--- a/mercurial/patch.py Sat Mar 20 10:01:56 2010 -0500 +++ b/mercurial/patch.py Sat Mar 20 16:57:24 2010 -0500 @@ -1012,14 +1012,14 @@ BFILE = 1 context = None lr = linereader(fp) - dopatch = True # gitworkdone is True if a git operation (copy, rename, ...) was # performed already for the current file. Useful when the file # section may have no hunk. gitworkdone = False + empty = None while True: - newfile = False + newfile = newgitfile = False x = lr.readline() if not x: break @@ -1028,7 +1028,7 @@ current_hunk.fix_newline() yield 'hunk', current_hunk current_hunk = None - gitworkdone = False + empty = False if ((sourcefile or state == BFILE) and ((not context and x[0] == '@') or ((context is not False) and x.startswith('***************')))): try: @@ -1046,31 +1046,35 @@ if emitfile: emitfile = False yield 'file', (afile, bfile, current_hunk) + empty = False elif state == BFILE and x.startswith('GIT binary patch'): current_hunk = binhunk(changed[bfile]) hunknum += 1 if emitfile: emitfile = False yield 'file', ('a/' + afile, 'b/' + bfile, current_hunk) + empty = False current_hunk.extract(lr) elif x.startswith('diff --git'): # check for git diff, scanning the whole patch file if needed m = gitre.match(x) + gitworkdone = False if m: afile, bfile = m.group(1, 2) if not git: git = True - dopatch, gitpatches = scangitpatch(lr, x) + gitpatches = scangitpatch(lr, x)[1] yield 'git', gitpatches for gp in gitpatches: changed[gp.path] = gp # else error? # copy/rename + modify should modify target, not source gp = changed.get(bfile) - if gp and gp.op in ('COPY', 'DELETE', 'RENAME', 'ADD'): + if gp and (gp.op in ('COPY', 'DELETE', 'RENAME', 'ADD') + or gp.mode): afile = bfile gitworkdone = True - newfile = True + newgitfile = True elif x.startswith('---'): # check for a unified diff l2 = lr.readline() @@ -1098,17 +1102,24 @@ bfile = parsefilename(l2) if newfile: + if empty: + raise NoHunks + empty = not gitworkdone + gitworkdone = False + + if newgitfile or newfile: emitfile = True state = BFILE hunknum = 0 if current_hunk: if current_hunk.complete(): yield 'hunk', current_hunk + empty = False else: raise PatchError(_("malformed patch %s %s") % (afile, current_hunk.desc)) - if hunknum == 0 and dopatch and not gitworkdone: + if (empty is None and not gitworkdone) or empty: raise NoHunks def applydiff(ui, fp, changed, strip=1, sourcefile=None, eolmode='strict'):