patch: display a nice error for invalid base85 data
Before, import was terminating with a traceback. Now it says:
$ hg import --no-commit ../bad.patch
applying ../bad.patch
abort: could not decode binary patch: bad base85 character at position 66
--- a/mercurial/base85.c Thu Apr 26 14:24:46 2012 +0200
+++ b/mercurial/base85.c Sat Apr 21 19:58:18 2012 +0200
@@ -109,7 +109,7 @@
if (c < 0)
return PyErr_Format(
PyExc_ValueError,
- "Bad base85 character at position %d", i);
+ "bad base85 character at position %d", i);
acc = acc * 85 + c;
}
if (i++ < len)
@@ -118,13 +118,13 @@
if (c < 0)
return PyErr_Format(
PyExc_ValueError,
- "Bad base85 character at position %d", i);
+ "bad base85 character at position %d", i);
/* overflow detection: 0xffffffff == "|NsC0",
* "|NsC" == 0x03030303 */
if (acc > 0x03030303 || (acc *= 85) > 0xffffffff - c)
return PyErr_Format(
PyExc_ValueError,
- "Bad base85 sequence at position %d", i);
+ "bad base85 sequence at position %d", i);
acc += c;
}
--- a/mercurial/patch.py Thu Apr 26 14:24:46 2012 +0200
+++ b/mercurial/patch.py Sat Apr 21 19:58:18 2012 +0200
@@ -1051,7 +1051,11 @@
l = ord(l) - ord('A') + 1
else:
l = ord(l) - ord('a') + 27
- dec.append(base85.b85decode(line[1:-1])[:l])
+ try:
+ dec.append(base85.b85decode(line[1:-1])[:l])
+ except ValueError, e:
+ raise PatchError(_('could not decode binary patch: %s')
+ % str(e))
line = lr.readline()
self.hunk.append(line)
text = zlib.decompress(''.join(dec))
--- a/tests/test-import-git.t Thu Apr 26 14:24:46 2012 +0200
+++ b/tests/test-import-git.t Sat Apr 21 19:58:18 2012 +0200
@@ -362,6 +362,25 @@
A binary2
text2
R text2
+
+Invalid base85 content
+ $ hg rollback
+ repository tip rolled back to revision 15 (undo import)
+ working directory now based on revision 15
+ $ hg revert -aq
+ $ hg import -d "1000000 0" -m invalid-binary - <<"EOF"
+ > diff --git a/text2 b/binary2
+ > rename from text2
+ > rename to binary2
+ > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+ > GIT binary patch
+ > literal 5
+ > Mc$`b*O.$Pw00T?_*Z=?k
+ >
+ > EOF
+ applying patch from stdin
+ abort: could not decode binary patch: bad base85 character at position 6
+ [255]
$ cd ..
Consecutive import with renames (issue2459)