diff options
| author | Edward Thomson <ethomson@edwardthomson.com> | 2015-03-17 10:21:28 -0400 |
|---|---|---|
| committer | Edward Thomson <ethomson@edwardthomson.com> | 2015-03-17 10:21:28 -0400 |
| commit | 9bbc8f350b80a5a6e94651ec667cf9e5d545b317 (patch) | |
| tree | a472cf837ffc1dbe7ddb81be0a773ca74f27b7f0 /src | |
| parent | 7800048afbb002d0003b54fcc09c98d0d3249949 (diff) | |
| parent | 8acf058ff708582e9bbfe04e297d3b17a4d5c2e8 (diff) | |
| download | libgit2-9bbc8f350b80a5a6e94651ec667cf9e5d545b317.tar.gz | |
Merge pull request #2962 from libgit2/cmn/reflog-annotated
Add annotated versions of ref-modying functions
Diffstat (limited to 'src')
| -rw-r--r-- | src/annotated_commit.c | 28 | ||||
| -rw-r--r-- | src/branch.c | 26 | ||||
| -rw-r--r-- | src/repository.c | 30 | ||||
| -rw-r--r-- | src/reset.c | 24 |
4 files changed, 98 insertions, 10 deletions
diff --git a/src/annotated_commit.c b/src/annotated_commit.c index 0a917802a..3f2d2ed17 100644 --- a/src/annotated_commit.c +++ b/src/annotated_commit.c @@ -12,6 +12,7 @@ #include "git2/refs.h" #include "git2/repository.h" #include "git2/annotated_commit.h" +#include "git2/revparse.h" static int annotated_commit_init( git_annotated_commit **out, @@ -96,6 +97,33 @@ int git_annotated_commit_from_fetchhead( 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; + } + + error = annotated_commit_init(out, repo, git_object_id(commit), revspec, NULL); + + git_object_free(obj); + git_object_free(commit); + + return error; +} + + const git_oid *git_annotated_commit_id( const git_annotated_commit *annotated_commit) { diff --git a/src/branch.c b/src/branch.c index a16d3a3f9..10be6f70c 100644 --- a/src/branch.c +++ b/src/branch.c @@ -12,6 +12,7 @@ #include "refspec.h" #include "refs.h" #include "remote.h" +#include "annotated_commit.h" #include "git2/branch.h" @@ -49,11 +50,12 @@ static int not_a_local_branch(const char *reference_name) return -1; } -int git_branch_create( +static int create_branch( git_reference **ref_out, git_repository *repository, const char *branch_name, const git_commit *commit, + const char *from, int force) { int is_head = 0; @@ -86,7 +88,7 @@ int git_branch_create( if (git_buf_joinpath(&canonical_branch_name, GIT_REFS_HEADS_DIR, branch_name) < 0) goto cleanup; - if (git_buf_printf(&log_message, "branch: Created from %s", git_oid_tostr_s(git_commit_id(commit))) < 0) + if (git_buf_printf(&log_message, "branch: Created from %s", from) < 0) goto cleanup; error = git_reference_create(&branch, repository, @@ -102,6 +104,26 @@ cleanup: return error; } +int git_branch_create( + git_reference **ref_out, + git_repository *repository, + const char *branch_name, + const git_commit *commit, + int force) +{ + return create_branch(ref_out, repository, branch_name, commit, git_oid_tostr_s(git_commit_id(commit)), force); +} + +int git_branch_create_from_annotated( + git_reference **ref_out, + git_repository *repository, + const char *branch_name, + const git_annotated_commit *commit, + int force) +{ + return create_branch(ref_out, repository, branch_name, commit->commit, commit->ref_name, force); +} + int git_branch_delete(git_reference *branch) { int is_head; diff --git a/src/repository.c b/src/repository.c index 0cbdf086a..b1f94f0e2 100644 --- a/src/repository.c +++ b/src/repository.c @@ -26,6 +26,7 @@ #include "remote.h" #include "merge.h" #include "diff_driver.h" +#include "annotated_commit.h" #ifdef GIT_WIN32 # include "win32/w32_util.h" @@ -1961,27 +1962,28 @@ cleanup: return error; } -int git_repository_set_head_detached( - git_repository* repo, - const git_oid* commitish) +static int detach(git_repository *repo, const git_oid *id, const char *from) { int error; git_buf log_message = GIT_BUF_INIT; git_object *object = NULL, *peeled = NULL; git_reference *new_head = NULL, *current = NULL; - assert(repo && commitish); + assert(repo && id); if ((error = git_reference_lookup(¤t, repo, GIT_HEAD_FILE)) < 0) return error; - if ((error = git_object_lookup(&object, repo, commitish, GIT_OBJ_ANY)) < 0) + if ((error = git_object_lookup(&object, repo, id, GIT_OBJ_ANY)) < 0) goto cleanup; if ((error = git_object_peel(&peeled, object, GIT_OBJ_COMMIT)) < 0) goto cleanup; - if ((error = checkout_message(&log_message, current, git_oid_tostr_s(git_object_id(peeled)))) < 0) + if (from == NULL) + from = git_oid_tostr_s(git_object_id(peeled)); + + if ((error = checkout_message(&log_message, current, from)) < 0) goto cleanup; error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_object_id(peeled), true, git_buf_cstr(&log_message)); @@ -1995,6 +1997,22 @@ cleanup: return error; } +int git_repository_set_head_detached( + git_repository* repo, + const git_oid* commitish) +{ + return detach(repo, commitish, NULL); +} + +int git_repository_set_head_detached_from_annotated( + git_repository *repo, + const git_annotated_commit *commitish) +{ + assert(repo && commitish); + + return detach(repo, git_annotated_commit_id(commitish), commitish->ref_name); +} + int git_repository_detach_head(git_repository* repo) { git_reference *old_head = NULL, *new_head = NULL, *current = NULL; diff --git a/src/reset.c b/src/reset.c index 351ecaa2a..aaebf4198 100644 --- a/src/reset.c +++ b/src/reset.c @@ -10,6 +10,7 @@ #include "tag.h" #include "merge.h" #include "diff.h" +#include "annotated_commit.h" #include "git2/reset.h" #include "git2/checkout.h" #include "git2/merge.h" @@ -96,9 +97,10 @@ cleanup: return error; } -int git_reset( +static int reset( git_repository *repo, git_object *target, + const char *to, git_reset_t reset_type, git_checkout_options *checkout_opts) { @@ -139,7 +141,7 @@ int git_reset( goto cleanup; } - if ((error = git_buf_printf(&log_message, "reset: moving to %s", git_oid_tostr_s(git_object_id(commit)))) < 0) + if ((error = git_buf_printf(&log_message, "reset: moving to %s", to)) < 0) return error; /* move HEAD to the new target */ @@ -176,3 +178,21 @@ cleanup: return error; } + +int git_reset( + git_repository *repo, + git_object *target, + git_reset_t reset_type, + git_checkout_options *checkout_opts) +{ + return reset(repo, target, git_oid_tostr_s(git_object_id(target)), reset_type, checkout_opts); +} + +int git_reset_from_annotated( + git_repository *repo, + git_annotated_commit *commit, + git_reset_t reset_type, + git_checkout_options *checkout_opts) +{ + return reset(repo, (git_object *) commit->commit, commit->ref_name, reset_type, checkout_opts); +} |
