[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