# HG changeset patch # User timeless # Date 1459389928 0 # Node ID f736f98e16ca8e304bb85c9b742e967b72d892a3 # Parent c042b98a6ff8ee65a681f4a14c71c37c20193c16 mpatch: unify mpatchError (issue5182) The pure version was mpatch was throwing struct.error or ValueError for errors, whereas the C version was throwing an "mpatch.mpatchError". Introducing an mpatch.mpatchError into pure and using it consistently is fairly easy, but the actual form for it is mercurial.mpatch.mpatchError, so with this commit, we change the C implementation to match the naming convention too. diff -r c042b98a6ff8 -r f736f98e16ca mercurial/mpatch.c --- a/mercurial/mpatch.c Wed Mar 30 22:01:47 2016 +0000 +++ b/mercurial/mpatch.c Thu Mar 31 02:05:28 2016 +0000 @@ -404,7 +404,8 @@ if (m == NULL) return NULL; - mpatch_Error = PyErr_NewException("mpatch.mpatchError", NULL, NULL); + mpatch_Error = PyErr_NewException("mercurial.mpatch.mpatchError", + NULL, NULL); Py_INCREF(mpatch_Error); PyModule_AddObject(m, "mpatchError", mpatch_Error); @@ -415,6 +416,7 @@ initmpatch(void) { Py_InitModule3("mpatch", methods, mpatch_doc); - mpatch_Error = PyErr_NewException("mpatch.mpatchError", NULL, NULL); + mpatch_Error = PyErr_NewException("mercurial.mpatch.mpatchError", + NULL, NULL); } #endif diff -r c042b98a6ff8 -r f736f98e16ca mercurial/pure/mpatch.py --- a/mercurial/pure/mpatch.py Wed Mar 30 22:01:47 2016 +0000 +++ b/mercurial/pure/mpatch.py Thu Mar 31 02:05:28 2016 +0000 @@ -12,6 +12,10 @@ StringIO = cStringIO.StringIO +class mpatchError(Exception): + """error raised when a delta cannot be decoded + """ + # This attempts to apply a series of patches in time proportional to # the total size of the patches, rather than patches * len(text). This # means rather than shuffling strings around, we shuffle around @@ -84,7 +88,10 @@ last = 0 while pos < end: m.seek(pos) - p1, p2, l = struct.unpack(">lll", m.read(12)) + try: + p1, p2, l = struct.unpack(">lll", m.read(12)) + except struct.error: + raise mpatchError("patch cannot be decoded") _pull(new, frags, p1 - last) # what didn't change _pull([], frags, p2 - p1) # what got deleted new.append((l, pos + 12)) # what got added @@ -114,7 +121,7 @@ outlen += length if bin != binend: - raise ValueError("patch cannot be decoded") + raise mpatchError("patch cannot be decoded") outlen += orig - last return outlen diff -r c042b98a6ff8 -r f736f98e16ca tests/test-revlog.t --- a/tests/test-revlog.t Wed Mar 30 22:01:47 2016 +0000 +++ b/tests/test-revlog.t Thu Mar 31 02:05:28 2016 +0000 @@ -11,5 +11,5 @@ rev offset length delta linkrev nodeid p1 p2 0 0 19 -1 2 99e0332bd498 000000000000 000000000000 1 19 12 0 3 6674f57a23d8 99e0332bd498 000000000000 - $ hg debugdata a.i 1 2>&1 | grep decoded - mpatch.mpatchError: patch cannot be decoded + $ hg debugdata a.i 1 2>&1 | egrep 'Error:.*decoded' + mercurial.mpatch.mpatchError: patch cannot be decoded