Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2014-07-14 23:19:19 +0400
committerEdward Thomson <ethomson@microsoft.com>2014-10-27 05:59:12 +0300
commit4fe84d624b42a1ef1b9b392483ddc43064b1180e (patch)
tree8fb3c5cbe317df03e17f45e46bfcc58810bcfc81 /tests/rebase
parentdaf395b795a6a56ff745b3cfe70a82a5290dabea (diff)
Introduce git_rebase_abort
Abort an in-progress rebase and move the working directory and repository back to the ORIG_HEAD state.
Diffstat (limited to 'tests/rebase')
-rw-r--r--tests/rebase/abort.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/tests/rebase/abort.c b/tests/rebase/abort.c
new file mode 100644
index 000000000..896eb4805
--- /dev/null
+++ b/tests/rebase/abort.c
@@ -0,0 +1,148 @@
+#include "clar_libgit2.h"
+#include "git2/rebase.h"
+#include "merge.h"
+#include "posix.h"
+
+#include <fcntl.h>
+
+static git_repository *repo;
+
+// Fixture setup and teardown
+void test_rebase_abort__initialize(void)
+{
+ repo = cl_git_sandbox_init("rebase");
+}
+
+void test_rebase_abort__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+}
+
+static void test_abort(git_merge_head *branch, git_merge_head *onto)
+{
+ git_reference *head_ref, *branch_ref = NULL;
+ git_signature *signature;
+ git_status_list *statuslist;
+ git_reflog *reflog;
+ const git_reflog_entry *reflog_entry;
+
+ cl_git_pass(git_signature_new(&signature, "Rebaser", "rebaser@example.com", 1404157834, -400));
+ cl_git_pass(git_rebase_abort(repo, signature));
+
+ cl_assert_equal_i(GIT_REPOSITORY_STATE_NONE, git_repository_state(repo));
+
+ /* Make sure the refs are updated appropriately */
+ cl_git_pass(git_reference_lookup(&head_ref, repo, "HEAD"));
+
+ if (branch->ref_name == NULL)
+ cl_assert_equal_oid(git_merge_head_id(branch), git_reference_target(head_ref));
+ else {
+ cl_assert_equal_s("refs/heads/beef", git_reference_symbolic_target(head_ref));
+ cl_git_pass(git_reference_lookup(&branch_ref, repo, git_reference_symbolic_target(head_ref)));
+ cl_assert_equal_oid(git_merge_head_id(branch), git_reference_target(branch_ref));
+ }
+
+ git_status_list_new(&statuslist, repo, NULL);
+ cl_assert_equal_i(0, git_status_list_entrycount(statuslist));
+ git_status_list_free(statuslist);
+
+ /* Make sure the reflogs are updated appropriately */
+ cl_git_pass(git_reflog_read(&reflog, repo, "HEAD"));
+
+ cl_assert(reflog_entry = git_reflog_entry_byindex(reflog, 0));
+ cl_assert_equal_oid(git_merge_head_id(onto), git_reflog_entry_id_old(reflog_entry));
+ cl_assert_equal_oid(git_merge_head_id(branch), git_reflog_entry_id_new(reflog_entry));
+ cl_assert_equal_s("rebase: aborting", git_reflog_entry_message(reflog_entry));
+
+ git_reflog_free(reflog);
+ git_reference_free(head_ref);
+ git_reference_free(branch_ref);
+ git_signature_free(signature);
+}
+
+void test_rebase_abort__merge(void)
+{
+ git_reference *branch_ref, *onto_ref;
+ git_signature *signature;
+ git_merge_head *branch_head, *onto_head;
+
+ cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
+ cl_git_pass(git_reference_lookup(&onto_ref, repo, "refs/heads/master"));
+
+ cl_git_pass(git_merge_head_from_ref(&branch_head, repo, branch_ref));
+ cl_git_pass(git_merge_head_from_ref(&onto_head, repo, onto_ref));
+
+ cl_git_pass(git_signature_new(&signature, "Rebaser", "rebaser@example.com", 1404157834, -400));
+
+ cl_git_pass(git_rebase(repo, branch_head, NULL, onto_head, signature, NULL));
+ cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo));
+
+ test_abort(branch_head, onto_head);
+
+ git_signature_free(signature);
+
+ git_merge_head_free(branch_head);
+ git_merge_head_free(onto_head);
+
+ git_reference_free(branch_ref);
+ git_reference_free(onto_ref);
+}
+
+void test_rebase_abort__detached_head(void)
+{
+ git_oid branch_id;
+ git_reference *onto_ref;
+ git_signature *signature;
+ git_merge_head *branch_head, *onto_head;
+
+ git_oid_fromstr(&branch_id, "b146bd7608eac53d9bf9e1a6963543588b555c64");
+ cl_git_pass(git_reference_lookup(&onto_ref, repo, "refs/heads/master"));
+
+ cl_git_pass(git_merge_head_from_id(&branch_head, repo, &branch_id));
+ cl_git_pass(git_merge_head_from_ref(&onto_head, repo, onto_ref));
+
+ cl_git_pass(git_signature_new(&signature, "Rebaser", "rebaser@example.com", 1404157834, -400));
+
+ cl_git_pass(git_rebase(repo, branch_head, NULL, onto_head, signature, NULL));
+ cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo));
+
+ test_abort(branch_head, onto_head);
+
+ git_signature_free(signature);
+
+ git_merge_head_free(branch_head);
+ git_merge_head_free(onto_head);
+
+ git_reference_free(onto_ref);
+}
+
+void test_rebase_abort__old_style_head_file(void)
+{
+ git_reference *branch_ref, *onto_ref;
+ git_signature *signature;
+ git_merge_head *branch_head, *onto_head;
+
+ cl_git_pass(git_reference_lookup(&branch_ref, repo, "refs/heads/beef"));
+ cl_git_pass(git_reference_lookup(&onto_ref, repo, "refs/heads/master"));
+
+ cl_git_pass(git_merge_head_from_ref(&branch_head, repo, branch_ref));
+ cl_git_pass(git_merge_head_from_ref(&onto_head, repo, onto_ref));
+
+ cl_git_pass(git_signature_new(&signature, "Rebaser", "rebaser@example.com", 1404157834, -400));
+
+ cl_git_pass(git_rebase(repo, branch_head, NULL, onto_head, signature, NULL));
+ cl_assert_equal_i(GIT_REPOSITORY_STATE_REBASE_MERGE, git_repository_state(repo));
+
+ p_rename("rebase-merge/.git/rebase-merge/orig-head",
+ "rebase-merge/.git/rebase-merge/head");
+
+ test_abort(branch_head, onto_head);
+
+ git_signature_free(signature);
+
+ git_merge_head_free(branch_head);
+ git_merge_head_free(onto_head);
+
+ git_reference_free(branch_ref);
+ git_reference_free(onto_ref);
+}