From 0f299365ef4f574e77bdabd2952e2452331cb675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Fri, 14 Dec 2018 14:29:36 +0100 Subject: annotated_commit: add failing test for looking up from annotated tag --- tests/merge/annotated_commit.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tests/merge/annotated_commit.c diff --git a/tests/merge/annotated_commit.c b/tests/merge/annotated_commit.c new file mode 100644 index 000000000..cfdf849e5 --- /dev/null +++ b/tests/merge/annotated_commit.c @@ -0,0 +1,26 @@ +#include "clar_libgit2.h" + + +static git_repository *g_repo; + +void test_merge_annotated_commit__initialize(void) +{ + g_repo = cl_git_sandbox_init("testrepo"); +} + +void test_merge_annotated_commit__cleanup(void) +{ + cl_git_sandbox_cleanup(); +} + +void test_merge_annotated_commit__lookup_annotated_tag(void) +{ + git_annotated_commit *commit; + git_reference *ref; + + cl_git_pass(git_reference_lookup(&ref, g_repo, "refs/tags/test")); + cl_git_pass(git_annotated_commit_from_ref(&commit, g_repo, ref)); + + git_annotated_commit_free(commit); + git_reference_free(ref); +} -- cgit v1.2.1 From 5bd78c48e10a8a025b17a53ed700a42d1b594c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Fri, 14 Dec 2018 14:41:17 +0100 Subject: refs: constify git_reference_peel We have no need to take a non-const reference. This does involve some other work to make sure we don't mix const and non-const variables, but by splitting what we want each variable to do we can also simplify the logic for when we do want to free a new reference we might have allocated. --- include/git2/refs.h | 2 +- src/refs.c | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/git2/refs.h b/include/git2/refs.h index ec67a8f95..5504c30c9 100644 --- a/include/git2/refs.h +++ b/include/git2/refs.h @@ -710,7 +710,7 @@ GIT_EXTERN(int) git_reference_normalize_name( */ GIT_EXTERN(int) git_reference_peel( git_object **out, - git_reference *ref, + const git_reference *ref, git_object_t type); /** diff --git a/src/refs.c b/src/refs.c index ee2718d1b..50afb2609 100644 --- a/src/refs.c +++ b/src/refs.c @@ -1337,7 +1337,7 @@ int git_reference_is_note(const git_reference *ref) return git_reference__is_note(ref->name); } -static int peel_error(int error, git_reference *ref, const char* msg) +static int peel_error(int error, const git_reference *ref, const char* msg) { giterr_set( GITERR_INVALID, @@ -1347,10 +1347,11 @@ static int peel_error(int error, git_reference *ref, const char* msg) int git_reference_peel( git_object **peeled, - git_reference *ref, + const git_reference *ref, git_object_t target_type) { - git_reference *resolved = NULL; + const git_reference *resolved = NULL; + git_reference *allocated = NULL; git_object *target = NULL; int error; @@ -1359,8 +1360,10 @@ int git_reference_peel( if (ref->type == GIT_REF_OID) { resolved = ref; } else { - if ((error = git_reference_resolve(&resolved, ref)) < 0) + if ((error = git_reference_resolve(&allocated, ref)) < 0) return peel_error(error, ref, "Cannot resolve reference"); + + resolved = allocated; } /* @@ -1389,9 +1392,7 @@ int git_reference_peel( cleanup: git_object_free(target); - - if (resolved != ref) - git_reference_free(resolved); + git_reference_free(allocated); return error; } -- cgit v1.2.1 From 6ea9381b01ad18616e009ed72bd9266d4a37865b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Fri, 14 Dec 2018 14:43:09 +0100 Subject: annotated_commit: peel to commit instead of assuming we have one We want to allow the creation of annotated commits out of annotated tags and for that we have to peel the reference all the way to the commit instead of stopping at the first id it provides. --- src/annotated_commit.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/annotated_commit.c b/src/annotated_commit.c index 3d982cbb4..d95d44093 100644 --- a/src/annotated_commit.c +++ b/src/annotated_commit.c @@ -123,19 +123,19 @@ int git_annotated_commit_from_ref( git_repository *repo, const git_reference *ref) { - git_reference *resolved; + git_object *peeled; int error = 0; assert(out && repo && ref); *out = NULL; - if ((error = git_reference_resolve(&resolved, ref)) < 0) + if ((error = git_reference_peel(&peeled, ref, GIT_OBJ_COMMIT)) < 0) return error; error = annotated_commit_init_from_id(out, repo, - git_reference_target(resolved), + git_object_id(peeled), git_reference_name(ref)); if (!error) { @@ -143,7 +143,7 @@ int git_annotated_commit_from_ref( GITERR_CHECK_ALLOC((*out)->ref_name); } - git_reference_free(resolved); + git_object_free(peeled); return error; } -- cgit v1.2.1