diff options
author | Patrick Steinhardt <ps@pks.im> | 2018-12-19 10:34:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-19 10:34:00 +0100 |
commit | 8b2670b1ce9cee2d8434265ac1af4023ad435645 (patch) | |
tree | ad9c00f6bfe8ad5dca5d2049953fad433cd2953f | |
parent | da8138b01217824cf211fa491608a7b067cf8e43 (diff) | |
parent | 6ea9381b01ad18616e009ed72bd9266d4a37865b (diff) | |
download | libgit2-8b2670b1ce9cee2d8434265ac1af4023ad435645.tar.gz |
Merge pull request #4910 from libgit2/cmn/annotated-from-tag
Support creating annotated commits from annotated tags
-rw-r--r-- | include/git2/refs.h | 2 | ||||
-rw-r--r-- | src/annotated_commit.c | 8 | ||||
-rw-r--r-- | src/refs.c | 15 | ||||
-rw-r--r-- | tests/merge/annotated_commit.c | 26 |
4 files changed, 39 insertions, 12 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/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; } 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; } 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); +} |