diff options
author | Russell Belfer <rb@github.com> | 2014-04-24 16:20:08 -0700 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2014-04-24 16:20:08 -0700 |
commit | af9eeac93929bdf10c30e60f34717959d83b6bd3 (patch) | |
tree | 6e4d258f6529d6cb6f9d739eee8305c8912c933b | |
parent | 87c9b741dfc5be7edc43625c84720841b65cd14e (diff) | |
parent | a4e2c36a66eca49ae4d7bdf0fdba8d4b3c900ab9 (diff) | |
download | libgit2-af9eeac93929bdf10c30e60f34717959d83b6bd3.tar.gz |
Merge pull request #2294 from ethomson/merge_checkout_strategy
Merge checkout strategy
-rw-r--r-- | src/merge.c | 8 | ||||
-rw-r--r-- | tests/merge/workdir/dirty.c | 30 | ||||
-rw-r--r-- | tests/merge/workdir/simple.c | 6 |
3 files changed, 30 insertions, 14 deletions
diff --git a/src/merge.c b/src/merge.c index 2e40b6db8..69c42bc0c 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 1d596c51a..776e4ea69 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 cf5b16e7a..327408dc9 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]); |