# HG changeset patch # User Patrick Mezard # Date 1335031098 -7200 # Node ID a8065323c003694874c718d2c1c35af2a3d8ecdb # Parent 592701c8eac6bab07ceefb22122562c8bb8d900f 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 diff -r 592701c8eac6 -r a8065323c003 mercurial/base85.c --- 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; } diff -r 592701c8eac6 -r a8065323c003 mercurial/patch.py --- 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)) diff -r 592701c8eac6 -r a8065323c003 tests/test-import-git.t --- 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)