summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/reset.c69
1 files changed, 30 insertions, 39 deletions
diff --git a/src/reset.c b/src/reset.c
index 04b0863b9..f5daa8f55 100644
--- a/src/reset.c
+++ b/src/reset.c
@@ -62,13 +62,10 @@ int git_reset(
git_object *commit = NULL;
git_index *index = NULL;
git_tree *tree = NULL;
- int error;
+ int error = 0;
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
assert(repo && target);
- assert(reset_type == GIT_RESET_SOFT
- || reset_type == GIT_RESET_MIXED
- || reset_type == GIT_RESET_HARD);
if (git_object_owner(target) != repo) {
giterr_set(GITERR_OBJECT,
@@ -76,56 +73,50 @@ int git_reset(
return -1;
}
- if (reset_type != GIT_RESET_SOFT
- && (error = git_repository__ensure_not_bare(
- repo,
+ if (reset_type != GIT_RESET_SOFT &&
+ (error = git_repository__ensure_not_bare(repo,
reset_type == GIT_RESET_MIXED ? "reset mixed" : "reset hard")) < 0)
- return error;
-
- if ((error = git_object_peel(&commit, target, GIT_OBJ_COMMIT)) < 0)
- goto cleanup;
+ return error;
- if ((error = git_repository_index(&index, repo)) < 0)
+ if ((error = git_object_peel(&commit, target, GIT_OBJ_COMMIT)) < 0 ||
+ (error = git_repository_index(&index, repo)) < 0 ||
+ (error = git_commit_tree(&tree, (git_commit *)commit)) < 0)
goto cleanup;
- if (reset_type == GIT_RESET_SOFT &&
+ if (reset_type == GIT_RESET_SOFT &&
(git_repository_state(repo) == GIT_REPOSITORY_STATE_MERGE ||
- git_index_has_conflicts(index))) {
- giterr_set(GITERR_OBJECT, "%s (soft) while in the middle of a merge.", ERROR_MSG);
- error = GIT_EUNMERGED;
- goto cleanup;
- }
-
- if ((error = update_head(repo, commit)) < 0)
- goto cleanup;
-
- if (reset_type == GIT_RESET_SOFT) {
- error = 0;
+ git_index_has_conflicts(index)))
+ {
+ giterr_set(GITERR_OBJECT, "%s (soft) in the middle of a merge.", ERROR_MSG);
+ error = GIT_EUNMERGED;
goto cleanup;
}
- if ((error = git_commit_tree(&tree, (git_commit *)commit)) < 0)
- goto cleanup;
-
- if ((error = git_index_read_tree(index, tree)) < 0)
+ /* move HEAD to the new target */
+ if ((error = update_head(repo, commit)) < 0)
goto cleanup;
- if ((error = git_index_write(index)) < 0)
- goto cleanup;
+ if (reset_type == GIT_RESET_HARD) {
+ /* overwrite working directory with HEAD */
+ opts.checkout_strategy = GIT_CHECKOUT_FORCE;
- if ((error = git_repository_merge_cleanup(repo)) < 0) {
- giterr_set(GITERR_REPOSITORY, "%s - Failed to clean up merge data.", ERROR_MSG);
- goto cleanup;
+ if ((error = git_checkout_tree(repo, (git_object *)tree, &opts)) < 0)
+ goto cleanup;
}
- if (reset_type == GIT_RESET_MIXED) {
- error = 0;
- goto cleanup;
- }
+ if (reset_type > GIT_RESET_SOFT) {
+ /* reset index to the target content */
- opts.checkout_strategy = GIT_CHECKOUT_FORCE;
+ if ((error = git_repository_index(&index, repo)) < 0 ||
+ (error = git_index_read_tree(index, tree)) < 0 ||
+ (error = git_index_write(index)) < 0)
+ goto cleanup;
- error = git_checkout_index(repo, NULL, &opts);
+ if ((error = git_repository_merge_cleanup(repo)) < 0) {
+ giterr_set(GITERR_INDEX, "%s - failed to clean up merge data", ERROR_MSG);
+ goto cleanup;
+ }
+ }
cleanup:
git_object_free(commit);