@@ -208,6 +208,44 @@ Odb_read(Odb *self, PyObject *py_hex)
208208 return tuple ;
209209}
210210
211+ PyDoc_STRVAR (Odb_read_header__doc__ ,
212+ "read_header(oid: Oid) -> tuple[enums.ObjectType, size\n"
213+ "\n"
214+ "Read the header of an object from the database, without reading its full\n"
215+ "contents.\n"
216+ "\n"
217+ "The header includes the type and the length of an object.\n"
218+ "\n"
219+ "Note that most backends do not support reading only the header of an object,\n"
220+ "so the whole object may be read and then the header will be returned." );
221+
222+ PyObject *
223+ Odb_read_header (Odb * self , PyObject * py_hex )
224+ {
225+ git_oid oid ;
226+ int err ;
227+ size_t len ;
228+ git_object_t type ;
229+ PyObject * type_enum ;
230+ PyObject * tuple ;
231+
232+ len = py_oid_to_git_oid (py_hex , & oid );
233+ if (len == 0 )
234+ return NULL ;
235+
236+ err = git_odb_read_header (& len , & type , self -> odb , & oid );
237+ if (err != 0 ) {
238+ Error_set_oid (err , & oid , len );
239+ return NULL ;
240+ }
241+
242+ // Convert type to ObjectType enum
243+ type_enum = pygit2_enum (ObjectTypeEnum , type );
244+
245+ tuple = Py_BuildValue ("(On)" , type_enum , len );
246+ return tuple ;
247+ }
248+
211249PyDoc_STRVAR (Odb_write__doc__ ,
212250 "write(type: int, data: bytes) -> Oid\n"
213251 "\n"
@@ -309,6 +347,7 @@ Odb_add_backend(Odb *self, PyObject *args)
309347PyMethodDef Odb_methods [] = {
310348 METHOD (Odb , add_disk_alternate , METH_O ),
311349 METHOD (Odb , read , METH_O ),
350+ METHOD (Odb , read_header , METH_O ),
312351 METHOD (Odb , write , METH_VARARGS ),
313352 METHOD (Odb , exists , METH_O ),
314353 METHOD (Odb , add_backend , METH_VARARGS ),
0 commit comments