Merge pull request #2294 from ethomson/merge_checkout_strategy Merge checkout strategy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
diff --git a/src/merge.c b/src/merge.c
index 2e40b6d..69c42bc 100644
--- a/src/merge.c
+++ b/src/merge.c
@@ -2186,8 +2186,6 @@ static int merge_normalize_checkout_opts(
const git_merge_head **their_heads)
{
int error = 0;
- unsigned int default_checkout_strategy = GIT_CHECKOUT_SAFE_CREATE |
- GIT_CHECKOUT_ALLOW_CONFLICTS;
GIT_UNUSED(repo);
@@ -2195,12 +2193,12 @@ static int merge_normalize_checkout_opts(
memcpy(checkout_opts, given_checkout_opts, sizeof(git_checkout_options));
else {
git_checkout_options default_checkout_opts = GIT_CHECKOUT_OPTIONS_INIT;
+ default_checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE |
+ GIT_CHECKOUT_ALLOW_CONFLICTS;
+
memcpy(checkout_opts, &default_checkout_opts, sizeof(git_checkout_options));
}
- if (!checkout_opts->checkout_strategy)
- checkout_opts->checkout_strategy = default_checkout_strategy;
-
/* TODO: for multiple ancestors in merge-recursive, this is "merged common ancestors" */
if (!checkout_opts->ancestor_label) {
if (ancestor_head && ancestor_head->commit)
diff --git a/tests/merge/workdir/dirty.c b/tests/merge/workdir/dirty.c
index 1d596c5..776e4ea 100644
--- a/tests/merge/workdir/dirty.c
+++ b/tests/merge/workdir/dirty.c
@@ -86,7 +86,7 @@ static void set_core_autocrlf_to(git_repository *repo, bool value)
git_config_free(cfg);
}
-static int merge_branch(int merge_file_favor, int checkout_strategy)
+static int merge_branch(void)
{
git_oid their_oids[1];
git_merge_head *their_heads[1];
@@ -97,8 +97,7 @@ static int merge_branch(int merge_file_favor, int checkout_strategy)
cl_git_pass(git_oid_fromstr(&their_oids[0], MERGE_BRANCH_OID));
cl_git_pass(git_merge_head_from_id(&their_heads[0], repo, &their_oids[0]));
- merge_opts.file_favor = merge_file_favor;
- checkout_opts.checkout_strategy = checkout_strategy;
+ checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_ALLOW_CONFLICTS;
error = git_merge(repo, (const git_merge_head **)their_heads, 1, &merge_opts, &checkout_opts);
git_merge_head_free(their_heads[0]);
@@ -214,7 +213,7 @@ static int merge_dirty_files(char *dirty_files[])
write_files(dirty_files);
- error = merge_branch(0, 0);
+ error = merge_branch();
git_object_free(head_object);
git_reference_free(head);
@@ -237,7 +236,7 @@ static int merge_differently_filtered_files(char *files[])
cl_git_pass(git_index_write(repo_index));
- error = merge_branch(0, 0);
+ error = merge_branch();
git_object_free(head_object);
git_reference_free(head);
@@ -248,7 +247,7 @@ static int merge_differently_filtered_files(char *files[])
static int merge_staged_files(char *staged_files[])
{
stage_random_files(staged_files);
- return merge_branch(0, 0);
+ return merge_branch();
}
void test_merge_workdir_dirty__unaffected_dirty_files_allowed(void)
@@ -260,6 +259,23 @@ void test_merge_workdir_dirty__unaffected_dirty_files_allowed(void)
cl_git_pass(merge_dirty_files(files));
}
+void test_merge_workdir_dirty__unstaged_deletes_maintained(void)
+{
+ git_reference *head;
+ git_object *head_object;
+
+ cl_git_pass(git_repository_head(&head, repo));
+ cl_git_pass(git_reference_peel(&head_object, head, GIT_OBJ_COMMIT));
+ cl_git_pass(git_reset(repo, head_object, GIT_RESET_HARD, NULL, NULL));
+
+ cl_git_pass(p_unlink("merge-resolve/unchanged.txt"));
+
+ cl_git_pass(merge_branch());
+
+ git_object_free(head_object);
+ git_reference_free(head);
+}
+
void test_merge_workdir_dirty__affected_dirty_files_disallowed(void)
{
char **files;
@@ -292,7 +308,7 @@ void test_merge_workdir_dirty__identical_staged_files_allowed(void)
stage_content(content);
git_index_write(repo_index);
- cl_git_pass(merge_branch(0, 0));
+ cl_git_pass(merge_branch());
}
}
diff --git a/tests/merge/workdir/simple.c b/tests/merge/workdir/simple.c
index cf5b16e..327408d 100644
--- a/tests/merge/workdir/simple.c
+++ b/tests/merge/workdir/simple.c
@@ -92,7 +92,7 @@ void test_merge_workdir_simple__cleanup(void)
cl_git_sandbox_cleanup();
}
-static void merge_simple_branch(int merge_file_favor, int checkout_strategy)
+static void merge_simple_branch(int merge_file_favor, int addl_checkout_strategy)
{
git_oid their_oids[1];
git_merge_head *their_heads[1];
@@ -103,7 +103,9 @@ static void merge_simple_branch(int merge_file_favor, int checkout_strategy)
cl_git_pass(git_merge_head_from_id(&their_heads[0], repo, &their_oids[0]));
merge_opts.file_favor = merge_file_favor;
- checkout_opts.checkout_strategy = checkout_strategy;
+ checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_ALLOW_CONFLICTS |
+ addl_checkout_strategy;
+
cl_git_pass(git_merge(repo, (const git_merge_head **)their_heads, 1, &merge_opts, &checkout_opts));
git_merge_head_free(their_heads[0]);