patch: fails immediately upon malformed hunk
authorPatrick Mezard <pmezard@gmail.com>
Sat, 09 Oct 2010 15:13:08 -0500
changeset 12675 c6cdc123f6e4
parent 12674 aa2fe1f52ff4
child 12676 ef500b2f100b
patch: fails immediately upon malformed hunk patch(1) does silently ignore malformed hunks but this is not something we want to copy.
mercurial/patch.py
tests/test-import.t
--- a/mercurial/patch.py	Sat Oct 09 15:13:08 2010 -0500
+++ b/mercurial/patch.py	Sat Oct 09 15:13:08 2010 -0500
@@ -1007,17 +1007,12 @@
             current_hunk = None
         if ((sourcefile or state == BFILE) and ((not context and x[0] == '@') or
             ((context is not False) and x.startswith('***************')))):
-            try:
-                if context is None and x.startswith('***************'):
-                    context = True
-                gpatch = changed.get(bfile)
-                create = afile == '/dev/null' or gpatch and gpatch.op == 'ADD'
-                remove = bfile == '/dev/null' or gpatch and gpatch.op == 'DELETE'
-                current_hunk = hunk(x, hunknum + 1, lr, context, create, remove)
-            except PatchError, err:
-                ui.debug(err)
-                current_hunk = None
-                continue
+            if context is None and x.startswith('***************'):
+                context = True
+            gpatch = changed.get(bfile)
+            create = afile == '/dev/null' or gpatch and gpatch.op == 'ADD'
+            remove = bfile == '/dev/null' or gpatch and gpatch.op == 'DELETE'
+            current_hunk = hunk(x, hunknum + 1, lr, context, create, remove)
             hunknum += 1
             if emitfile:
                 emitfile = False
--- a/tests/test-import.t	Sat Oct 09 15:13:08 2010 -0500
+++ b/tests/test-import.t	Sat Oct 09 15:13:08 2010 -0500
@@ -150,6 +150,25 @@
   $ rm -r b
 
 
+import of malformed plain diff should fail
+
+  $ hg clone -r0 a b
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 2 changes to 2 files
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg --cwd a diff -r0:1 > tip.patch
+  $ sed 's/1,1/foo/' < tip.patch > broken.patch
+  $ hg --cwd b import -mpatch ../broken.patch
+  applying ../broken.patch
+  abort: bad hunk #1
+  [255]
+  $ rm -r b
+
+
 hg -R repo import
 put the clone in a subdir - having a directory named "a"
 used to hide a bug.