Skip to content

Commit 8b2670b

Browse files
authored
Merge pull request libgit2#4910 from libgit2/cmn/annotated-from-tag
Support creating annotated commits from annotated tags
2 parents da8138b + 6ea9381 commit 8b2670b

File tree

4 files changed

+39
-12
lines changed

4 files changed

+39
-12
lines changed

include/git2/refs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,7 @@ GIT_EXTERN(int) git_reference_normalize_name(
710710
*/
711711
GIT_EXTERN(int) git_reference_peel(
712712
git_object **out,
713-
git_reference *ref,
713+
const git_reference *ref,
714714
git_object_t type);
715715

716716
/**

src/annotated_commit.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,27 +123,27 @@ int git_annotated_commit_from_ref(
123123
git_repository *repo,
124124
const git_reference *ref)
125125
{
126-
git_reference *resolved;
126+
git_object *peeled;
127127
int error = 0;
128128

129129
assert(out && repo && ref);
130130

131131
*out = NULL;
132132

133-
if ((error = git_reference_resolve(&resolved, ref)) < 0)
133+
if ((error = git_reference_peel(&peeled, ref, GIT_OBJ_COMMIT)) < 0)
134134
return error;
135135

136136
error = annotated_commit_init_from_id(out,
137137
repo,
138-
git_reference_target(resolved),
138+
git_object_id(peeled),
139139
git_reference_name(ref));
140140

141141
if (!error) {
142142
(*out)->ref_name = git__strdup(git_reference_name(ref));
143143
GITERR_CHECK_ALLOC((*out)->ref_name);
144144
}
145145

146-
git_reference_free(resolved);
146+
git_object_free(peeled);
147147
return error;
148148
}
149149

src/refs.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,7 +1337,7 @@ int git_reference_is_note(const git_reference *ref)
13371337
return git_reference__is_note(ref->name);
13381338
}
13391339

1340-
static int peel_error(int error, git_reference *ref, const char* msg)
1340+
static int peel_error(int error, const git_reference *ref, const char* msg)
13411341
{
13421342
giterr_set(
13431343
GITERR_INVALID,
@@ -1347,10 +1347,11 @@ static int peel_error(int error, git_reference *ref, const char* msg)
13471347

13481348
int git_reference_peel(
13491349
git_object **peeled,
1350-
git_reference *ref,
1350+
const git_reference *ref,
13511351
git_object_t target_type)
13521352
{
1353-
git_reference *resolved = NULL;
1353+
const git_reference *resolved = NULL;
1354+
git_reference *allocated = NULL;
13541355
git_object *target = NULL;
13551356
int error;
13561357

@@ -1359,8 +1360,10 @@ int git_reference_peel(
13591360
if (ref->type == GIT_REF_OID) {
13601361
resolved = ref;
13611362
} else {
1362-
if ((error = git_reference_resolve(&resolved, ref)) < 0)
1363+
if ((error = git_reference_resolve(&allocated, ref)) < 0)
13631364
return peel_error(error, ref, "Cannot resolve reference");
1365+
1366+
resolved = allocated;
13641367
}
13651368

13661369
/*
@@ -1389,9 +1392,7 @@ int git_reference_peel(
13891392

13901393
cleanup:
13911394
git_object_free(target);
1392-
1393-
if (resolved != ref)
1394-
git_reference_free(resolved);
1395+
git_reference_free(allocated);
13951396

13961397
return error;
13971398
}

tests/merge/annotated_commit.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "clar_libgit2.h"
2+
3+
4+
static git_repository *g_repo;
5+
6+
void test_merge_annotated_commit__initialize(void)
7+
{
8+
g_repo = cl_git_sandbox_init("testrepo");
9+
}
10+
11+
void test_merge_annotated_commit__cleanup(void)
12+
{
13+
cl_git_sandbox_cleanup();
14+
}
15+
16+
void test_merge_annotated_commit__lookup_annotated_tag(void)
17+
{
18+
git_annotated_commit *commit;
19+
git_reference *ref;
20+
21+
cl_git_pass(git_reference_lookup(&ref, g_repo, "refs/tags/test"));
22+
cl_git_pass(git_annotated_commit_from_ref(&commit, g_repo, ref));
23+
24+
git_annotated_commit_free(commit);
25+
git_reference_free(ref);
26+
}

0 commit comments

Comments
 (0)