diff options
author | Carlos Martín Nieto <carlosmn@github.com> | 2016-04-26 21:21:27 +0200 |
---|---|---|
committer | Carlos Martín Nieto <carlosmn@github.com> | 2016-04-26 21:21:27 +0200 |
commit | 88284dfb7905c5990babb4238b7cd30bdf823500 (patch) | |
tree | 05e15007fa8284488c5f15aa12fd2730c364414f /src/annotated_commit.c | |
parent | cb2dfa46c8e12f60b20cdc80e1616c35d74c1b7e (diff) | |
parent | d55923788c6b43351db2bc7555aef3bea391a1f4 (diff) | |
download | libgit2-88284dfb7905c5990babb4238b7cd30bdf823500.tar.gz |
Merge pull request #3758 from libgit2/ethomson/annotated_commit_refs
Annotated commits: differentiate between the ref names and the description
Diffstat (limited to 'src/annotated_commit.c')
-rw-r--r-- | src/annotated_commit.c | 179 |
1 files changed, 99 insertions, 80 deletions
diff --git a/src/annotated_commit.c b/src/annotated_commit.c index e53b95dee..c2c770cba 100644 --- a/src/annotated_commit.c +++ b/src/annotated_commit.c @@ -20,38 +20,101 @@ static int annotated_commit_init( git_annotated_commit **out, + git_commit *commit, + const char *description) +{ + git_annotated_commit *annotated_commit; + int error = 0; + + assert(out && commit); + + *out = NULL; + + annotated_commit = git__calloc(1, sizeof(git_annotated_commit)); + GITERR_CHECK_ALLOC(annotated_commit); + + annotated_commit->type = GIT_ANNOTATED_COMMIT_REAL; + + if ((error = git_commit_dup(&annotated_commit->commit, commit)) < 0) + goto done; + + git_oid_fmt(annotated_commit->id_str, git_commit_id(commit)); + annotated_commit->id_str[GIT_OID_HEXSZ] = '\0'; + + if (!description) + description = annotated_commit->id_str; + + annotated_commit->description = git__strdup(description); + GITERR_CHECK_ALLOC(annotated_commit->description); + +done: + if (!error) + *out = annotated_commit; + + return error; +} + +static int annotated_commit_init_from_id( + git_annotated_commit **out, git_repository *repo, const git_oid *id, - const char *ref_name, - const char *remote_url) + const char *description) { - git_annotated_commit *annotated_commit; git_commit *commit = NULL; int error = 0; - assert(out && id); + assert(out && repo && id); *out = NULL; - if ((error = git_commit_lookup(&commit, repo, id)) < 0 || - (error = git_annotated_commit_from_commit(&annotated_commit, - commit)) < 0) + if ((error = git_commit_lookup(&commit, repo, id)) < 0) goto done; - if (ref_name) { - annotated_commit->ref_name = git__strdup(ref_name); - GITERR_CHECK_ALLOC(annotated_commit->ref_name); - } + error = annotated_commit_init(out, commit, description); + +done: + git_commit_free(commit); + return error; +} + +int git_annotated_commit_lookup( + git_annotated_commit **out, + git_repository *repo, + const git_oid *id) +{ + return annotated_commit_init_from_id(out, repo, id, NULL); +} + +int git_annotated_commit_from_commit( + git_annotated_commit **out, + git_commit *commit) +{ + return annotated_commit_init(out, commit, NULL); +} - if (remote_url) { - annotated_commit->remote_url = git__strdup(remote_url); - GITERR_CHECK_ALLOC(annotated_commit->remote_url); +int git_annotated_commit_from_revspec( + git_annotated_commit **out, + git_repository *repo, + const char *revspec) +{ + git_object *obj, *commit; + int error; + + assert(out && repo && revspec); + + if ((error = git_revparse_single(&obj, repo, revspec)) < 0) + return error; + + if ((error = git_object_peel(&commit, obj, GIT_OBJ_COMMIT))) { + git_object_free(obj); + return error; } - *out = annotated_commit; + error = annotated_commit_init(out, (git_commit *)commit, revspec); + + git_object_free(obj); + git_object_free(commit); -done: - git_commit_free(commit); return error; } @@ -70,8 +133,15 @@ int git_annotated_commit_from_ref( if ((error = git_reference_resolve(&resolved, ref)) < 0) return error; - error = annotated_commit_init(out, repo, git_reference_target(resolved), - git_reference_name(ref), NULL); + error = annotated_commit_init_from_id(out, + repo, + git_reference_target(resolved), + git_reference_name(ref)); + + if (!error) { + (*out)->ref_name = git__strdup(git_reference_name(ref)); + GITERR_CHECK_ALLOC((*out)->ref_name); + } git_reference_free(resolved); return error; @@ -97,41 +167,6 @@ int git_annotated_commit_from_head( return error; } -int git_annotated_commit_from_commit( - git_annotated_commit **out, - git_commit *commit) -{ - git_annotated_commit *annotated_commit; - - assert(out && commit); - - *out = NULL; - - annotated_commit = git__calloc(1, sizeof(git_annotated_commit)); - GITERR_CHECK_ALLOC(annotated_commit); - - annotated_commit->type = GIT_ANNOTATED_COMMIT_REAL; - - git_cached_obj_incref(commit); - annotated_commit->commit = commit; - - git_oid_fmt(annotated_commit->id_str, git_commit_id(commit)); - annotated_commit->id_str[GIT_OID_HEXSZ] = '\0'; - - *out = annotated_commit; - return 0; -} - -int git_annotated_commit_lookup( - git_annotated_commit **out, - git_repository *repo, - const git_oid *id) -{ - assert(out && repo && id); - - return annotated_commit_init(out, repo, id, NULL, NULL); -} - int git_annotated_commit_from_fetchhead( git_annotated_commit **out, git_repository *repo, @@ -141,33 +176,16 @@ int git_annotated_commit_from_fetchhead( { assert(repo && id && branch_name && remote_url); - return annotated_commit_init(out, repo, id, branch_name, remote_url); -} - -int git_annotated_commit_from_revspec( - git_annotated_commit **out, - git_repository *repo, - const char *revspec) -{ - git_object *obj, *commit; - int error; - - assert(out && repo && revspec); - - if ((error = git_revparse_single(&obj, repo, revspec)) < 0) - return error; - - if ((error = git_object_peel(&commit, obj, GIT_OBJ_COMMIT))) { - git_object_free(obj); - return error; - } + if (annotated_commit_init_from_id(out, repo, id, branch_name) < 0) + return -1; - error = annotated_commit_init(out, repo, git_object_id(commit), revspec, NULL); + (*out)->ref_name = git__strdup(branch_name); + GITERR_CHECK_ALLOC((*out)->ref_name); - git_object_free(obj); - git_object_free(commit); + (*out)->remote_url = git__strdup(remote_url); + GITERR_CHECK_ALLOC((*out)->remote_url); - return error; + return 0; } @@ -187,8 +205,9 @@ void git_annotated_commit_free(git_annotated_commit *annotated_commit) case GIT_ANNOTATED_COMMIT_REAL: git_commit_free(annotated_commit->commit); git_tree_free(annotated_commit->tree); - git__free(annotated_commit->ref_name); - git__free(annotated_commit->remote_url); + git__free((char *)annotated_commit->description); + git__free((char *)annotated_commit->ref_name); + git__free((char *)annotated_commit->remote_url); break; case GIT_ANNOTATED_COMMIT_VIRTUAL: git_index_free(annotated_commit->index); |