8000 OdbBackend: implement subclassed read_header · libgit2/pygit2@52d7669 · GitHub
[go: up one dir, main page]

Skip to content

Commit 52d7669

Browse files
committed
OdbBackend: implement subclassed read_header
1 parent f4f4cd7 commit 52d7669

File tree

1 file changed

+67
-3
lines changed

1 file changed

+67
-3
lines changed

src/odb_backend.c

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ struct py_odb_backend
4141
git_odb_backend backend;
4242
PyObject *self;
4343
PyObject *read_callable,
44-
*read_prefix_callable;
44+
*read_prefix_callable,
45+
*read_header_callable;
4546
};
4647

4748
static int
@@ -65,7 +66,7 @@ py_odb_backend_read(void **ptr, size_t *sz,
6566
return GIT_EUSER;
6667

6768
const char *bytes;
68-
if (!PyArg_ParseTuple(result, "iy#", type, &bytes, sz) || !bytes)
69+
if (!PyArg_ParseTuple(result, "ny#", type, &bytes, sz) || !bytes)
6970
return GIT_EUSER;
7071

7172
/* 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,
100101
return GIT_EUSER;
101102

102103
const char *bytes;
103-
if (!PyArg_ParseTuple(result, "Oiy#",
104+
if (!PyArg_ParseTuple(result, "Ony#",
104105
&py_oid_out, type, &bytes, sz) || !bytes)
105106
return GIT_EUSER;
106107

@@ -115,6 +116,32 @@ py_odb_backend_read_prefix(git_oid *oid_out, void **ptr, size_t *sz,
115116
return 0;
116117
}
117118

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+
118145
int
119146
OdbBackend_init(OdbBackend *self, PyObject *args, PyObject *kwds)
120147
{
@@ -143,6 +170,11 @@ OdbBackend_init(OdbBackend *self, PyObject *args, PyObject *kwds)
143170
if (be->read_prefix_callable)
144171
be->backend.read_prefix = py_odb_backend_read_prefix;
145172

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+
146178
self->odb_backend = &be->backend;
147179
return 0;
148180
}
@@ -267,9 +299,41 @@ OdbBackend_read_prefix(OdbBackend *self, PyObject *py_hex)
267299
return tuple;
268300
}
269301

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+
270333
PyMethodDef OdbBackend_methods[] = {
271334
METHOD(OdbBackend, read, METH_O),
272335
METHOD(OdbBackend, read_prefix, METH_O),
336+
METHOD(OdbBackend, read_header, METH_O),
273337
{NULL}
274338
};
275339

0 commit comments

Comments
 (0)
0