Jelajahi Sumber

Raise ApplyDeltaError from dulwich._pack.

Jelmer Vernooij 10 tahun lalu
induk
melakukan
79d91cf7c8
3 mengubah file dengan 24 tambahan dan 6 penghapusan
  1. 6 0
      NEWS
  2. 15 4
      dulwich/_pack.c
  3. 3 2
      dulwich/tests/test_pack.py

+ 6 - 0
NEWS

@@ -1,5 +1,11 @@
 0.10.1  UNRELEASED
 
+ BUG FIXES
+
+  * Return `ApplyDeltaError` when encountering delta errors
+    in both C extensions and native delta application code.
+    (Jelmer Vernooij, #259)
+
 0.10.0	2015-03-22
 
  BUG FIXES

+ 15 - 4
dulwich/_pack.c

@@ -20,6 +20,8 @@
 #include <Python.h>
 #include <stdint.h>
 
+static PyObject *PyExc_ApplyDeltaError = NULL;
+
 static int py_is_sha(PyObject *sha)
 {
 	if (!PyString_CheckExact(sha))
@@ -103,7 +105,7 @@ static PyObject *py_apply_delta(PyObject *self, PyObject *args)
 	index = 0;
 	src_size = get_delta_header_size(delta, &index, delta_len);
 	if (src_size != src_buf_len) {
-		PyErr_Format(PyExc_ValueError, 
+		PyErr_Format(PyExc_ApplyDeltaError,
 					 "Unexpected source buffer size: %lu vs %d", src_size, src_buf_len);
 		Py_DECREF(py_src_buf);
 		Py_DECREF(py_delta);
@@ -155,7 +157,7 @@ static PyObject *py_apply_delta(PyObject *self, PyObject *args)
 			index += cmd;
 			dest_size -= cmd;
 		} else {
-			PyErr_SetString(PyExc_ValueError, "Invalid opcode 0");
+			PyErr_SetString(PyExc_ApplyDeltaError, "Invalid opcode 0");
 			Py_DECREF(ret);
 			Py_DECREF(py_delta);
 			Py_DECREF(py_src_buf);
@@ -166,13 +168,13 @@ static PyObject *py_apply_delta(PyObject *self, PyObject *args)
 	Py_DECREF(py_delta);
 
 	if (index != delta_len) {
-		PyErr_SetString(PyExc_ValueError, "delta not empty");
+		PyErr_SetString(PyExc_ApplyDeltaError, "delta not empty");
 		Py_DECREF(ret);
 		return NULL;
 	}
 
 	if (dest_size != 0) {
-		PyErr_SetString(PyExc_ValueError, "dest size incorrect");
+		PyErr_SetString(PyExc_ApplyDeltaError, "dest size incorrect");
 		Py_DECREF(ret);
 		return NULL;
 	}
@@ -240,6 +242,15 @@ static PyMethodDef py_pack_methods[] = {
 void init_pack(void)
 {
 	PyObject *m;
+	PyObject *errors_module;
+
+	errors_module = PyImport_ImportModule("dulwich.errors");
+	if (errors_module == NULL)
+		return;
+
+	PyExc_ApplyDeltaError = PyObject_GetAttrString(errors_module, "ApplyDeltaError");
+	if (PyExc_ApplyDeltaError == NULL)
+		return;
 
 	m = Py_InitModule3("_pack", py_pack_methods, NULL);
 	if (m == NULL)

+ 3 - 2
dulwich/tests/test_pack.py

@@ -28,6 +28,7 @@ import tempfile
 import zlib
 
 from dulwich.errors import (
+    ApplyDeltaError,
     ChecksumMismatch,
     )
 from dulwich.file import (
@@ -193,10 +194,10 @@ class TestPackDeltas(TestCase):
 
     def test_dest_overflow(self):
         self.assertRaises(
-            ValueError,
+            ApplyDeltaError,
             apply_delta, 'a'*0x10000, '\x80\x80\x04\x80\x80\x04\x80' + 'a'*0x10000)
         self.assertRaises(
-            ValueError,
+            ApplyDeltaError,
             apply_delta, '', '\x00\x80\x02\xb0\x11\x11')