diff --git a/include/git2/object.h b/include/git2/object.h index e029f0125..b91b04dba 100644 --- a/include/git2/object.h +++ b/include/git2/object.h @@ -188,6 +188,15 @@ GIT_EXTERN(int) git_object_peel( const git_object *object, git_otype target_type); +/** + * Create an in-memory copy of a Git object. The copy must be + * explicitly free'd or it will leak. + * + * @param dest Pointer to store the copy of the object + * @param source Original object to copy + */ +GIT_EXTERN(int) git_object_dup(git_object **dest, git_object *source); + /** @} */ GIT_END_DECL diff --git a/src/iterator.c b/src/iterator.c index 805a3c987..5b5ed9525 100644 --- a/src/iterator.c +++ b/src/iterator.c @@ -578,7 +578,7 @@ int git_iterator_for_tree( if (tree == NULL) return git_iterator_for_nothing(iter, flags, start, end); - if ((error = git_tree__dup(&tree, tree)) < 0) + if ((error = git_object_dup((git_object **)&tree, (git_object *)tree)) < 0) return error; ITERATOR_BASE_INIT(ti, tree, TREE, git_tree_owner(tree)); diff --git a/src/object.c b/src/object.c index f59e4c7da..80fe51152 100644 --- a/src/object.c +++ b/src/object.c @@ -360,7 +360,7 @@ int git_object_peel( assert(object && peeled); if (git_object_type(object) == target_type) - return git_object__dup(peeled, (git_object *)object); + return git_object_dup(peeled, (git_object *)object); source = (git_object *)object; @@ -396,3 +396,9 @@ int git_object_peel( return error; } +int git_object_dup(git_object **dest, git_object *source) +{ + git_cached_obj_incref(source); + *dest = source; + return 0; +} diff --git a/src/object.h b/src/object.h index 8788caba6..c1e50593c 100644 --- a/src/object.h +++ b/src/object.h @@ -17,13 +17,6 @@ struct git_object { /* fully free the object; internal method, DO NOT EXPORT */ void git_object__free(void *object); -GIT_INLINE(int) git_object__dup(git_object **dest, git_object *source) -{ - git_cached_obj_incref(source); - *dest = source; - return 0; -} - int git_object__from_odb_object( git_object **object_out, git_repository *repo, diff --git a/src/refs.c b/src/refs.c index dde2f51a9..b1f679632 100644 --- a/src/refs.c +++ b/src/refs.c @@ -934,7 +934,7 @@ int git_reference_peel( } if (target_type == GIT_OBJ_ANY && git_object_type(target) != GIT_OBJ_TAG) - error = git_object__dup(peeled, target); + error = git_object_dup(peeled, target); else error = git_object_peel(peeled, target, target_type); diff --git a/src/revparse.c b/src/revparse.c index 2ba29383e..b1eb51b41 100644 --- a/src/revparse.c +++ b/src/revparse.c @@ -432,7 +432,7 @@ static int dereference_to_non_tag(git_object **out, git_object *obj) if (git_object_type(obj) == GIT_OBJ_TAG) return git_tag_peel(out, (git_tag *)obj); - return git_object__dup(out, obj); + return git_object_dup(out, obj); } static int handle_caret_parent_syntax(git_object **out, git_object *obj, int n) diff --git a/src/tree.h b/src/tree.h index 567b5842d..b77bfd961 100644 --- a/src/tree.h +++ b/src/tree.h @@ -30,11 +30,6 @@ struct git_treebuilder { size_t entrycount; /* vector may contain "removed" entries */ }; -GIT_INLINE(int) git_tree__dup(git_tree **dest, git_tree *source) -{ - return git_object__dup((git_object **)dest, (git_object *)source); -} - GIT_INLINE(bool) git_tree_entry__is_tree(const struct git_tree_entry *e) { return (S_ISDIR(e->attr) && !S_ISGITLINK(e->attr));