@@ -41,7 +41,8 @@ struct py_odb_backend
41
41
git_odb_backend backend;
42
42
PyObject * self ;
43
43
PyObject * read_callable ,
44
- * read_prefix_callable ;
44
+ * read_prefix_callable ,
45
+ * read_header_callable ;
45
46
};
46
47
47
48
static int
@@ -65,7 +66,7 @@ py_odb_backend_read(void **ptr, size_t *sz,
65
66
return GIT_EUSER ;
66
67
67
68
const char * bytes ;
68
- if (!PyArg_ParseTuple (result , "iy #" , type , & bytes , sz ) || !bytes )
69
+ if (!PyArg_ParseTuple (result , "ny #" , type , & bytes , sz ) || !bytes )
69
70
return GIT_EUSER ;
70
71
71
72
/* XXX: This assumes the default libgit2 allocator is in use and will
@@ -100,7 +101,7 @@ py_odb_backend_read_prefix(git_oid *oid_out, void **ptr, size_t *sz,
100
101
return GIT_EUSER ;
101
102
102
103
const char * bytes ;
103
- if (!PyArg_ParseTuple (result , "Oiy #" ,
104
+ if (!PyArg_ParseTuple (result , "Ony #" ,
104
105
& py_oid_out , type , & bytes , sz ) || !bytes )
105
106
return GIT_EUSER ;
106
107
@@ -115,6 +116,32 @@ py_odb_backend_read_prefix(git_oid *oid_out, void **ptr, size_t *sz,
115
116
return 0 ;
116
117
}
117
118
119
+ static int
120
+ py_odb_backend_read_header (size_t * len , git_object_t * type ,
121
+ git_odb_backend * _be , const git_oid * oid )
122
+ {
123
+ int err ;
124
+ PyObject * args , * py_oid , * result ;
125
+ struct py_odb_backend * be = (struct py_odb_backend * )_be ;
126
+
127
+ py_oid = git_oid_to_python (oid );
128
+ args = Py_BuildValue ("(O)" , py_oid );
129
+ result = PyObject_CallObject (be -> read_header_callable , args );
130
+ Py_DECREF (py_oid );
131
+
132
+ if ((err = git_error_for_exc ()) != 0 ) {
133
+ return err ;
134
+ }
135
+
136
+ if (result == NULL )
137
+ return GIT_EUSER ;
138
+
139
+ if (!PyArg_ParseTuple (result , "nn" , type , len ))
140
+ return GIT_EUSER ;
141
+
142
+ return 0 ;
143
+ }
144
+
118
145
int
119
146
OdbBackend_init (OdbBackend * self , PyObject * args , PyObject * kwds )
120
147
{
@@ -143,6 +170,11 @@ OdbBackend_init(OdbBackend *self, PyObject *args, PyObject *kwds)
143
170
if (be -> read_prefix_callable )
144
171
be -> backend .read_prefix = py_odb_backend_read_prefix ;
145
172
173
+ be -> read_header_callable = PyObject_GetAttrString (
174
+ (PyObject * )self , "read_header" );
175
+ if (be -> read_header_callable )
176
+ be -> backend .read_header = py_odb_backend_read_header ;
177
+
146
178
self -> odb_backend = & be -> backend ;
147
179
return 0 ;
148
180
}
@@ -267,9 +299,41 @@ OdbBackend_read_prefix(OdbBackend *self, PyObject *py_hex)
267
299
return tuple ;
268
300
}
269
301
302
+ PyDoc_STRVAR (OdbBackend_read_header__doc__ ,
303
+ "read_header(oid) -> (type, len)\n"
304
+ "\n"
305
+ "Read raw object header from this odb backend.\n" );
306
+
307
+ PyObject *
308
+ OdbBackend_read_header (OdbBackend * self , PyObject * py_hex )
309
+ {
310
+ int err ;
311
+ size_t len ;
312
+ git_object_t type ;
313
+ git_oid oid ;
314
+
315
+ if (self <
BF72
span class=pl-c1>->odb_backend -> read_header == NULL ) {
316
+ Py_INCREF (Py_NotImplemented );
317
+ return Py_NotImplemented ;
318
+ }
319
+
320
+ len = py_oid_to_git_oid (py_hex , & oid );
321
+ if (len == 0 )
322
+ return NULL ;
323
+
324
+ err = self -> odb_backend -> read_header (& len , & type , self -> odb_backend , & oid );
325
+ if (err != 0 ) {
326
+ Error_set_oid (err , & oid , len );
327
+ return NULL ;
328
+ }
329
+
330
+ return Py_BuildValue ("(ni)" , type , len );
331
+ }
332
+
270
333
PyMethodDef OdbBackend_methods [] = {
271
334
METHOD (OdbBackend , read , METH_O ),
272
335
METHOD (OdbBackend , read_prefix , METH_O ),
336
+ METHOD (OdbBackend , read_header , METH_O ),
273
337
{NULL }
274
338
};
275
339
0 commit comments