Skip to content

Commit b4ed388

Browse files
committed
Odb.read returns ObjectType enum instead of int
1 parent 070e6b2 commit b4ed388

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

pygit2/_pygit2.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ class Odb:
518518
def add_backend(self, backend: OdbBackend, priority: int) -> None: ...
519519
def add_disk_alternate(self, path: str | Path) -> None: ...
520520
def exists(self, oid: _OidArg) -> bool: ...
521-
def read(self, oid: _OidArg) -> tuple[int, bytes]: ...
521+
def read(self, oid: _OidArg) -> tuple[ObjectType, bytes]: ...
522522
def write(self, type: int, data: bytes | str) -> Oid: ...
523523
def __contains__(self, other: _OidArg) -> bool: ...
524524
def __iter__(self) -> Iterator[Oid]: ... # Odb_as_iter

src/odb.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737

3838
extern PyTypeObject OdbBackendType;
3939

40+
extern PyObject *ObjectTypeEnum;
41+
4042
static git_otype
4143
int_to_loose_object_type(int type_id)
4244
{
@@ -170,7 +172,7 @@ Odb_read_raw(git_odb *odb, const git_oid *oid, size_t len)
170172
}
171173

172174
PyDoc_STRVAR(Odb_read__doc__,
173-
"read(oid) -> type, data\n"
175+
"read(oid: Oid) -> tuple[enums.ObjectType, bytes]\n"
174176
"\n"
175177
"Read raw object data from the object db.");
176178

@@ -180,6 +182,8 @@ Odb_read(Odb *self, PyObject *py_hex)
180182
git_oid oid;
181183
git_odb_object *obj;
182184
size_t len;
185+
git_object_t type;
186+
PyObject* type_enum;
183187
PyObject* tuple;
184188

185189
len = py_oid_to_git_oid(py_hex, &oid);
@@ -190,9 +194,13 @@ Odb_read(Odb *self, PyObject *py_hex)
190194
if (obj == NULL)
191195
return NULL;
192196

197+
// Convert type to ObjectType enum
198+
type = git_odb_object_type(obj);
199+
type_enum = pygit2_enum(ObjectTypeEnum, type);
200+
193201
tuple = Py_BuildValue(
194-
"(ny#)",
195-
git_odb_object_type(obj),
202+
"(Oy#)",
203+
type_enum,
196204
git_odb_object_data(obj),
197205
git_odb_object_size(obj));
198206

src/pygit2.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ PyObject *FileModeEnum;
4747
PyObject *FileStatusEnum;
4848
PyObject *MergeAnalysisEnum;
4949
PyObject *MergePreferenceEnum;
50+
PyObject *ObjectTypeEnum;
5051
PyObject *ReferenceTypeEnum;
5152

5253
extern PyTypeObject RepositoryType;
@@ -354,6 +355,7 @@ forget_enums(void)
354355
Py_CLEAR(FileStatusEnum);
355356
Py_CLEAR(MergeAnalysisEnum);
356357
Py_CLEAR(MergePreferenceEnum);
358+
Py_CLEAR(ObjectTypeEnum);
357359
Py_CLEAR(ReferenceTypeEnum);
358360
}
359361

@@ -389,6 +391,7 @@ _cache_enums(PyObject *self, PyObject *args)
389391
CACHE_PYGIT2_ENUM(FileStatus);
390392
CACHE_PYGIT2_ENUM(MergeAnalysis);
391393
CACHE_PYGIT2_ENUM(MergePreference);
394+
CACHE_PYGIT2_ENUM(ObjectType);
392395
CACHE_PYGIT2_ENUM(ReferenceType);
393396

394397
#undef CACHE_PYGIT2_ENUM

test/test_odb.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,16 @@ def test_read(odb: Odb) -> None:
7676
a = odb.read(BLOB_HEX)
7777
assert ab == a
7878
assert (ObjectType.BLOB, b'a contents\n') == a
79+
assert isinstance(a[0], ObjectType)
7980

8081
a2 = odb.read('7f129fd57e31e935c6d60a0c794efe4e6927664b')
8182
assert (ObjectType.BLOB, b'a contents 2\n') == a2
83+
assert isinstance(a2[0], ObjectType)
8284

8385
a_hex_prefix = BLOB_HEX[:4]
8486
a3 = odb.read(a_hex_prefix)
8587
assert (ObjectType.BLOB, b'a contents\n') == a3
88+
assert isinstance(a3[0], ObjectType)
8689

8790

8891
def test_write(odb: Odb) -> None:

0 commit comments

Comments
 (0)