[PATCH 4 of 7] patch: drop internalpatch checks for NoHunks
Mads Kiilerich
mads at kiilerich.com
Mon Apr 26 07:37:55 CDT 2010
# HG changeset patch
# User Mads Kiilerich <mads at kiilerich.com>
# Date 1272280862 -7200
# Node ID 50c548cc4249b964cb5012307389f57377ea8149
# Parent 7e65479fe7b82026f9016fb0bfa4a2a2c4917e57
patch: drop internalpatch checks for NoHunks
This will change the behavior for some (slightly bogus) patches, but the new
behavior is IMHO both better and good.
diff --git a/mercurial/patch.py b/mercurial/patch.py
--- a/mercurial/patch.py
+++ b/mercurial/patch.py
@@ -18,9 +18,6 @@
class PatchError(Exception):
pass
-class NoHunks(PatchError):
- pass
-
# helper functions
def copyfile(src, dst, basedir):
@@ -1018,11 +1015,6 @@
BFILE = 1
context = None
lr = linereader(fp)
- # 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 = newgitfile = False
@@ -1034,7 +1026,6 @@
current_hunk.fix_newline()
yield 'hunk', current_hunk
current_hunk = None
- empty = False
if ((sourcefile or state == BFILE) and ((not context and x[0] == '@') or
((context is not False) and x.startswith('***************')))):
try:
@@ -1052,19 +1043,16 @@
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:
@@ -1079,7 +1067,6 @@
if gp and (gp.op in ('COPY', 'DELETE', 'RENAME', 'ADD')
or gp.mode):
afile = bfile
- gitworkdone = True
newgitfile = True
elif x.startswith('---'):
# check for a unified diff
@@ -1107,12 +1094,6 @@
afile = parsefilename(x)
bfile = parsefilename(l2)
- if newfile:
- if empty:
- raise NoHunks
- empty = not gitworkdone
- gitworkdone = False
-
if newgitfile or newfile:
emitfile = True
state = BFILE
@@ -1120,14 +1101,10 @@
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 (empty is None and not gitworkdone) or empty:
- raise NoHunks
-
def applydiff(ui, fp, changed, strip=1, sourcefile=None, eolmode='strict'):
"""Reads a patch from fp and tries to apply it.
@@ -1332,21 +1309,7 @@
return externalpatch(patcher, args, patchname, ui, strip, cwd,
files)
else:
- try:
- return internalpatch(patchname, ui, strip, cwd, files, eolmode)
- except NoHunks:
- ui.warn(_('internal patcher failed\n'
- 'please report details to '
- 'http://mercurial.selenic.com/bts/\n'
- 'or mercurial at selenic.com\n'))
- patcher = (util.find_exe('gpatch') or util.find_exe('patch')
- or 'patch')
- ui.debug('no valid hunks found; trying with %r instead\n' %
- patcher)
- if util.needbinarypatch():
- args.append('--binary')
- return externalpatch(patcher, args, patchname, ui, strip, cwd,
- files)
+ return internalpatch(patchname, ui, strip, cwd, files, eolmode)
except PatchError, err:
s = str(err)
if s:
More information about the Mercurial-devel
mailing list