diff --git a/include/git2/odb.h b/include/git2/odb.h index 3bd18e782..ad56384f0 100644 --- a/include/git2/odb.h +++ b/include/git2/odb.h @@ -357,6 +357,20 @@ GIT_EXTERN(int) git_odb_hash(git_oid *out, const void *data, size_t len, git_oty */ GIT_EXTERN(int) git_odb_hashfile(git_oid *out, const char *path, git_otype type); +/** + * Create a copy of an odb_object + * + * The returned copy must be manually freed with `git_odb_object_free`. + * Note that because of an implementation detail, the returned copy will be + * the same pointer as `source`: the object is internally refcounted, so the + * copy still needs to be freed twice. + * + * @param dest pointer where to store the copy + * @param source object to copy + * @return 0 or an error code + */ +GIT_EXTERN(int) git_odb_object_dup(git_odb_object **dest, git_odb_object *source); + /** * Close an ODB object * diff --git a/src/odb.c b/src/odb.c index b2c138aae..2da9937ff 100644 --- a/src/odb.c +++ b/src/odb.c @@ -124,6 +124,13 @@ git_otype git_odb_object_type(git_odb_object *object) return object->cached.type; } +int git_odb_object_dup(git_odb_object **dest, git_odb_object *source) +{ + git_cached_obj_incref(source); + *dest = source; + return 0; +} + void git_odb_object_free(git_odb_object *object) { if (object == NULL)