From 45a86bbfd028a545a71d3e1ea5518d467be8b5aa Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Mon, 9 Mar 2015 17:02:52 +0200 Subject: [PATCH 1/6] Allow for merges with whitespace discrepancies --- include/git2/merge.h | 23 +++++++++++++++++++++++ src/merge.c | 12 ++++++++---- src/merge_file.c | 7 +++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/include/git2/merge.h b/include/git2/merge.h index 40330d0d8..73375b319 100644 --- a/include/git2/merge.h +++ b/include/git2/merge.h @@ -110,6 +110,23 @@ typedef enum { GIT_MERGE_FILE_FAVOR_UNION = 3, } git_merge_file_favor_t; +/** + * Whitespace merging flags + */ +typedef enum { + /** Defaults */ + GIT_MERGE_FILE_IGNORE_DEFAULT = 0, + + /** Ignore all whitespace */ + GIT_MERGE_FILE_IGNORE_WHITESPACE = (1 << 0), + + /** Ignore changes in amount of whitespace */ + GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE = (1 << 1), + + /** Ignore whitespace at end of line */ + GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL = (1 << 2), +} git_merge_file_whitespace_t; + /** * File merging flags */ @@ -156,6 +173,9 @@ typedef struct { /** Merge file flags. */ git_merge_file_flags_t flags; + + /** Whitespace merge flags */ + unsigned int whitespace_flags; } git_merge_file_options; #define GIT_MERGE_FILE_OPTIONS_VERSION 1 @@ -230,6 +250,9 @@ typedef struct { /** Flags for handling conflicting content. */ git_merge_file_favor_t file_favor; + + /** Flags for handling whitespace */ + unsigned int whitespace_flags; } git_merge_options; #define GIT_MERGE_OPTIONS_VERSION 1 diff --git a/src/merge.c b/src/merge.c index 75ad0915e..2972d9ff3 100644 --- a/src/merge.c +++ b/src/merge.c @@ -653,7 +653,8 @@ static int merge_conflict_resolve_automerge( int *resolved, git_merge_diff_list *diff_list, const git_merge_diff *conflict, - unsigned int merge_file_favor) + unsigned int merge_file_favor, + unsigned int whitespace_flags) { const git_index_entry *ancestor = NULL, *ours = NULL, *theirs = NULL; git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; @@ -708,6 +709,7 @@ static int merge_conflict_resolve_automerge( &conflict->their_entry : NULL; opts.favor = merge_file_favor; + opts.whitespace_flags = whitespace_flags; if ((error = git_repository_odb(&odb, diff_list->repo)) < 0 || (error = git_merge_file_from_index(&result, diff_list->repo, ancestor, ours, theirs, &opts)) < 0 || @@ -741,7 +743,8 @@ static int merge_conflict_resolve( int *out, git_merge_diff_list *diff_list, const git_merge_diff *conflict, - unsigned int merge_file_favor) + unsigned int merge_file_favor, + unsigned int whitespace_flags) { int resolved = 0; int error = 0; @@ -757,7 +760,8 @@ static int merge_conflict_resolve( if (!resolved && (error = merge_conflict_resolve_one_renamed(&resolved, diff_list, conflict)) < 0) goto done; - if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict, merge_file_favor)) < 0) + if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict, + merge_file_favor, whitespace_flags)) < 0) goto done; *out = resolved; @@ -1779,7 +1783,7 @@ int git_merge_trees( git_vector_foreach(&changes, i, conflict) { int resolved = 0; - if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor)) < 0) + if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor, opts.whitespace_flags)) < 0) goto done; if (!resolved) diff --git a/src/merge_file.c b/src/merge_file.c index ff0364432..b827ca977 100644 --- a/src/merge_file.c +++ b/src/merge_file.c @@ -151,6 +151,13 @@ static int git_merge_file__from_inputs( if (options.flags & GIT_MERGE_FILE_STYLE_DIFF3) xmparam.style = XDL_MERGE_DIFF3; + if (options.whitespace_flags & GIT_MERGE_FILE_IGNORE_WHITESPACE) + xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE; + if (options.whitespace_flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE) + xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_CHANGE; + if (options.whitespace_flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL) + xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_AT_EOL; + if ((xdl_result = xdl_merge(&ancestor_mmfile, &our_mmfile, &their_mmfile, &xmparam, &mmbuffer)) < 0) { giterr_set(GITERR_MERGE, "Failed to merge files."); From 0f24cac2b926e4842f6890ee1712ac2d85cc020c Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Mon, 9 Mar 2015 17:03:03 +0200 Subject: [PATCH 2/6] Added tests to merge files and branches with whitespace problems and fixes --- tests/merge/files.c | 76 ++++++++++++++++ tests/merge/trees/whitespace.c | 82 ++++++++++++++++++ tests/resources/merge-whitespace/.gitted/HEAD | Bin 0 -> 23 bytes .../resources/merge-whitespace/.gitted/config | Bin 0 -> 137 bytes .../resources/merge-whitespace/.gitted/index | Bin 0 -> 137 bytes .../01/bd650462136a4f0a266dfc91ab93b3fef0f7cb | Bin 0 -> 49 bytes .../08/3f868fb4324e32a4999173b2437b31d7a1ef25 | Bin 0 -> 53 bytes .../0a/a2acaa63cacc7a99fab0c2ce3d56572911df19 | Bin 0 -> 138 bytes .../11/89e10a62aadf2fea8cd018afb52c1980f40b4f | Bin 0 -> 183 bytes .../24/2c8f6cf388e96e2c12b6e49cb7ae60167cba1e | Bin 0 -> 50 bytes .../25/246acb001858ffeffb03ea399fd2c0a163b832 | Bin 0 -> 53 bytes .../26/2f67de0de2e535a59ae1bc3c739601e98c354d | Bin 0 -> 38 bytes .../2f/6727d2e570bf962d9dd926423cf6fe5072071a | Bin 0 -> 169 bytes .../3c/43e7fc2a56fc825c31dfee65abd6dda8d16dca | Bin 0 -> 52 bytes .../40/26a6c83f39c56881c9ac62e7582db9e3d33a4f | Bin 0 -> 40 bytes .../42/dabb8d5dba2de103815a77e4369bb3966e64ef | Bin 0 -> 138 bytes .../43/9230587f2eb38e9540a5c99e9831f65641eab9 | Bin 0 -> 214 bytes .../43/ad73e75e15f03bb0b4398a48a57ecfc20788e2 | Bin 0 -> 53 bytes .../4b/825dc642cb6eb9a060e54bf8d69288fbee4904 | Bin 0 -> 15 bytes .../54/74989173042512ab630191ad71cdcedb646b9a | Bin 0 -> 53 bytes .../5e/fb9bc29c482e023e40e0a2b3b7e49cec842034 | Bin 0 -> 53 bytes .../70/d3d2e7d51a18fcc6f035a67e5c3f33069be04d | Bin 0 -> 53 bytes .../74/e83b6c5df14f1fba7c4ea1f99c6d007b591002 | Bin 0 -> 43 bytes .../77/f40c621ceae77ad8d756ef507bdbafe2713aa7 | Bin 0 -> 53 bytes .../9c/5362069759fb37ae036cef6e4b2f95c6c5eaab | Bin 0 -> 184 bytes .../a2/9e7dabd68dfb38a717e6b1648713cd5c7adee2 | Bin 0 -> 53 bytes .../a4/e6a86e07ef5afe036e26602fbbaa27496d00a9 | Bin 0 -> 212 bytes .../a8/27eab4fd66ab37a6ebcfaa7b7e341abfd55947 | Bin 0 -> 51 bytes .../a9/66acc271e50b5d4595911752a77def0a5e5d40 | Bin 0 -> 132 bytes .../b2/a69114f4897109fedf1aafea363cb2d2557029 | Bin 0 -> 178 bytes .../bc/83ac0422ba1082c80e406234910377984cfbb6 | Bin 0 -> 137 bytes .../bf/e4ea5805af22a5b194259bda6f5f634486f891 | Bin 0 -> 185 bytes .../c3/b1fb31424c98072542cc8e42b48c92e52f494a | Bin 0 -> 39 bytes .../c7/e2f386736445936f5ba181269a0e0967e280e8 | Bin 0 -> 212 bytes .../d9/5182053c31f8aa09df4fa225f4e668c5320b59 | Bin 0 -> 176 bytes .../e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 | Bin 0 -> 15 bytes .../ec/5a35c75b8d3ee29bed37996b14e909d04fdcee | Bin 0 -> 52 bytes .../ee/3c2aac8e03224c323b58ecb1f9eef616745467 | Bin 0 -> 38 bytes .../ef/e94a4bf4e697f7f0270f0d1b8a93af784a19d0 | Bin 0 -> 72 bytes .../f0/0c965d8307308469e537302baa73048488f162 | Bin 0 -> 37 bytes .../f1/90a0d111ca1688778657798743ddfb4ed4bd64 | Bin 0 -> 164 bytes .../f4/9b2c244e9d3b0647fdfb95954c38fbfeecf3ad | Bin 0 -> 128 bytes .../f8/7905f99f0e66d179a8379d8ca4d8cbbd32c231 | Bin 0 -> 220 bytes .../.gitted/refs/heads/branch_a_change | Bin 0 -> 41 bytes .../.gitted/refs/heads/branch_a_eol | Bin 0 -> 41 bytes .../.gitted/refs/heads/branch_b_change | Bin 0 -> 41 bytes .../.gitted/refs/heads/branch_b_eol | Bin 0 -> 41 bytes .../.gitted/refs/heads/master | Bin 0 -> 41 bytes tests/resources/merge-whitespace/test.txt | Bin 0 -> 27 bytes 49 files changed, 158 insertions(+) create mode 100644 tests/merge/trees/whitespace.c create mode 100644 tests/resources/merge-whitespace/.gitted/HEAD create mode 100644 tests/resources/merge-whitespace/.gitted/config create mode 100644 tests/resources/merge-whitespace/.gitted/index create mode 100644 tests/resources/merge-whitespace/.gitted/objects/01/bd650462136a4f0a266dfc91ab93b3fef0f7cb create mode 100644 tests/resources/merge-whitespace/.gitted/objects/08/3f868fb4324e32a4999173b2437b31d7a1ef25 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/0a/a2acaa63cacc7a99fab0c2ce3d56572911df19 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/11/89e10a62aadf2fea8cd018afb52c1980f40b4f create mode 100644 tests/resources/merge-whitespace/.gitted/objects/24/2c8f6cf388e96e2c12b6e49cb7ae60167cba1e create mode 100644 tests/resources/merge-whitespace/.gitted/objects/25/246acb001858ffeffb03ea399fd2c0a163b832 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/26/2f67de0de2e535a59ae1bc3c739601e98c354d create mode 100644 tests/resources/merge-whitespace/.gitted/objects/2f/6727d2e570bf962d9dd926423cf6fe5072071a create mode 100644 tests/resources/merge-whitespace/.gitted/objects/3c/43e7fc2a56fc825c31dfee65abd6dda8d16dca create mode 100644 tests/resources/merge-whitespace/.gitted/objects/40/26a6c83f39c56881c9ac62e7582db9e3d33a4f create mode 100644 tests/resources/merge-whitespace/.gitted/objects/42/dabb8d5dba2de103815a77e4369bb3966e64ef create mode 100644 tests/resources/merge-whitespace/.gitted/objects/43/9230587f2eb38e9540a5c99e9831f65641eab9 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/43/ad73e75e15f03bb0b4398a48a57ecfc20788e2 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/54/74989173042512ab630191ad71cdcedb646b9a create mode 100644 tests/resources/merge-whitespace/.gitted/objects/5e/fb9bc29c482e023e40e0a2b3b7e49cec842034 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/70/d3d2e7d51a18fcc6f035a67e5c3f33069be04d create mode 100644 tests/resources/merge-whitespace/.gitted/objects/74/e83b6c5df14f1fba7c4ea1f99c6d007b591002 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/77/f40c621ceae77ad8d756ef507bdbafe2713aa7 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/9c/5362069759fb37ae036cef6e4b2f95c6c5eaab create mode 100644 tests/resources/merge-whitespace/.gitted/objects/a2/9e7dabd68dfb38a717e6b1648713cd5c7adee2 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/a4/e6a86e07ef5afe036e26602fbbaa27496d00a9 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/a8/27eab4fd66ab37a6ebcfaa7b7e341abfd55947 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/a9/66acc271e50b5d4595911752a77def0a5e5d40 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/b2/a69114f4897109fedf1aafea363cb2d2557029 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/bc/83ac0422ba1082c80e406234910377984cfbb6 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/bf/e4ea5805af22a5b194259bda6f5f634486f891 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/c3/b1fb31424c98072542cc8e42b48c92e52f494a create mode 100644 tests/resources/merge-whitespace/.gitted/objects/c7/e2f386736445936f5ba181269a0e0967e280e8 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/d9/5182053c31f8aa09df4fa225f4e668c5320b59 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/ec/5a35c75b8d3ee29bed37996b14e909d04fdcee create mode 100644 tests/resources/merge-whitespace/.gitted/objects/ee/3c2aac8e03224c323b58ecb1f9eef616745467 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/ef/e94a4bf4e697f7f0270f0d1b8a93af784a19d0 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/f0/0c965d8307308469e537302baa73048488f162 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/f1/90a0d111ca1688778657798743ddfb4ed4bd64 create mode 100644 tests/resources/merge-whitespace/.gitted/objects/f4/9b2c244e9d3b0647fdfb95954c38fbfeecf3ad create mode 100644 tests/resources/merge-whitespace/.gitted/objects/f8/7905f99f0e66d179a8379d8ca4d8cbbd32c231 create mode 100644 tests/resources/merge-whitespace/.gitted/refs/heads/branch_a_change create mode 100644 tests/resources/merge-whitespace/.gitted/refs/heads/branch_a_eol create mode 100644 tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_change create mode 100644 tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_eol create mode 100644 tests/resources/merge-whitespace/.gitted/refs/heads/master create mode 100644 tests/resources/merge-whitespace/test.txt diff --git a/tests/merge/files.c b/tests/merge/files.c index c377471e2..cb9e8d195 100644 --- a/tests/merge/files.c +++ b/tests/merge/files.c @@ -173,3 +173,79 @@ void test_merge_files__automerge_from_index(void) git_merge_file_result_free(&result); } + +void test_merge_files__automerge_whitespace_eol(void) +{ + git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT, + ours = GIT_MERGE_FILE_INPUT_INIT, + theirs = GIT_MERGE_FILE_INPUT_INIT; + git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; + git_merge_file_result result = {0}; + const char *expected = "Zero\n1\n2\n3\n4\n5\n6\n7\n8\n9\nTen\n"; + + ancestor.ptr = "0 \n1\n2\n3\n4\n5\n6\n7\n8\n9\n10 \n"; + ancestor.size = strlen(ancestor.ptr); + ancestor.path = "testfile.txt"; + ancestor.mode = 0100755; + + ours.ptr = "Zero\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n"; + ours.size = strlen(ours.ptr); + ours.path = "testfile.txt"; + ours.mode = 0100755; + + theirs.ptr = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\nTen\n"; + theirs.size = strlen(theirs.ptr); + theirs.path = "testfile.txt"; + theirs.mode = 0100755; + + opts.whitespace_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL; + cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts)); + + cl_assert_equal_i(1, result.automergeable); + + cl_assert_equal_s("testfile.txt", result.path); + cl_assert_equal_i(0100755, result.mode); + + cl_assert_equal_i(strlen(expected), result.len); + cl_assert_equal_strn(expected, result.ptr, result.len); + + git_merge_file_result_free(&result); +} + +void test_merge_files__automerge_whitespace_change(void) +{ + git_merge_file_input ancestor = GIT_MERGE_FILE_INPUT_INIT, + ours = GIT_MERGE_FILE_INPUT_INIT, + theirs = GIT_MERGE_FILE_INPUT_INIT; + git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; + git_merge_file_result result = {0}; + const char *expected = "Zero\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\nTen\n"; + + ancestor.ptr = "0\n1\n2\n3\n4\n5 XXX\n6YYY\n7\n8\n9\n10\n"; + ancestor.size = strlen(ancestor.ptr); + ancestor.path = "testfile.txt"; + ancestor.mode = 0100755; + + ours.ptr = "Zero\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\n10\n"; + ours.size = strlen(ours.ptr); + ours.path = "testfile.txt"; + ours.mode = 0100755; + + theirs.ptr = "0\n1\n2\n3\n4\n5 XXX\n6 YYY\n7\n8\n9\nTen\n"; + theirs.size = strlen(theirs.ptr); + theirs.path = "testfile.txt"; + theirs.mode = 0100755; + + opts.whitespace_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE; + cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts)); + + cl_assert_equal_i(1, result.automergeable); + + cl_assert_equal_s("testfile.txt", result.path); + cl_assert_equal_i(0100755, result.mode); + + cl_assert_equal_i(strlen(expected), result.len); + cl_assert_equal_strn(expected, result.ptr, result.len); + + git_merge_file_result_free(&result); +} diff --git a/tests/merge/trees/whitespace.c b/tests/merge/trees/whitespace.c new file mode 100644 index 000000000..77e362c9c --- /dev/null +++ b/tests/merge/trees/whitespace.c @@ -0,0 +1,82 @@ +#include "clar_libgit2.h" +#include "git2/repository.h" +#include "git2/merge.h" +#include "buffer.h" +#include "merge.h" +#include "../merge_helpers.h" +#include "fileops.h" + +static git_repository *repo; + +#define TEST_REPO_PATH "merge-whitespace" + +#define BRANCH_A_EOL "branch_a_eol" +#define BRANCH_B_EOL "branch_b_eol" + +#define BRANCH_A_CHANGE "branch_a_change" +#define BRANCH_B_CHANGE "branch_b_change" + +// Fixture setup and teardown +void test_merge_trees_whitespace__initialize(void) +{ + repo = cl_git_sandbox_init(TEST_REPO_PATH); +} + +void test_merge_trees_whitespace__cleanup(void) +{ + cl_git_sandbox_cleanup(); +} + +void test_merge_trees_whitespace__conflict(void) +{ + git_index *index; + git_merge_options opts = GIT_MERGE_OPTIONS_INIT; + + struct merge_index_entry merge_index_entries[] = { + { 0100644, "4026a6c83f39c56881c9ac62e7582db9e3d33a4f", 1, "test.txt" }, + { 0100644, "c3b1fb31424c98072542cc8e42b48c92e52f494a", 2, "test.txt" }, + { 0100644, "262f67de0de2e535a59ae1bc3c739601e98c354d", 3, "test.txt" }, + }; + + cl_git_pass(merge_trees_from_branches(&index, repo, BRANCH_A_EOL, BRANCH_B_EOL, &opts)); + + cl_assert(merge_test_index(index, merge_index_entries, 3)); + + git_index_free(index); +} + +void test_merge_trees_whitespace__eol(void) +{ + git_index *index; + git_merge_options opts = GIT_MERGE_OPTIONS_INIT; + + struct merge_index_entry merge_index_entries[] = { + { 0100644, "ee3c2aac8e03224c323b58ecb1f9eef616745467", 0, "test.txt" }, + }; + + opts.whitespace_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL; + + cl_git_pass(merge_trees_from_branches(&index, repo, BRANCH_A_EOL, BRANCH_B_EOL, &opts)); + + cl_assert(merge_test_index(index, merge_index_entries, 1)); + + git_index_free(index); +} + +void test_merge_trees_whitespace__change(void) +{ + git_index *index; + git_merge_options opts = GIT_MERGE_OPTIONS_INIT; + + struct merge_index_entry merge_index_entries[] = { + { 0100644, "a827eab4fd66ab37a6ebcfaa7b7e341abfd55947", 0, "test.txt" }, + }; + + opts.whitespace_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE; + + cl_git_pass(merge_trees_from_branches(&index, repo, BRANCH_A_CHANGE, BRANCH_B_CHANGE, &opts)); + + cl_assert(merge_test_index(index, merge_index_entries, 1)); + + git_index_free(index); +} diff --git a/tests/resources/merge-whitespace/.gitted/HEAD b/tests/resources/merge-whitespace/.gitted/HEAD new file mode 100644 index 0000000000000000000000000000000000000000..cb089cd89a7d7686d284d8761201649346b5aa1c GIT binary patch literal 23 ecmXR)O|w!cN=+-)&qz&7Db~+TEG|hc;sO9;xClW2 literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/config b/tests/resources/merge-whitespace/.gitted/config new file mode 100644 index 0000000000000000000000000000000000000000..6c9406b7d9320db083eca69b3f8bee9a6c7b50d4 GIT binary patch literal 137 zcmYk#%?-jZ3KJaaM(b)IThRcka) zn6vinzTI-FENHqTG;JZL7ug4u#6zM7i5Th{J5BgE#z&9!LjG%xu(tTZ>RkRd-|~Df A#{d8T literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/index b/tests/resources/merge-whitespace/.gitted/index new file mode 100644 index 0000000000000000000000000000000000000000..534804af20f1d8b6a732c8831e29472f169b6330 GIT binary patch literal 137 zcmZ?q402{*U|<4b#*lvxz5!_l7|qDQz{1;8W-#C~VQnGUu}3vg8U$&Eo<9 HuxJQ7I$swf literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/08/3f868fb4324e32a4999173b2437b31d7a1ef25 b/tests/resources/merge-whitespace/.gitted/objects/08/3f868fb4324e32a4999173b2437b31d7a1ef25 new file mode 100644 index 0000000000000000000000000000000000000000..ec6ed4d4cb0af4342c6c18613f306e6da14e0145 GIT binary patch literal 53 zcmb_nI+StJ~aP7tD2lYDYF=xkFU~Xu-53+!V02~A&6H;1mwcGb&V$KId&Xd4C|q?RXg7a!A{cw)M@-dc0g l^XkxlNzBXkO}!SSuXP*RZxAKynUFI{-NzYaegP*oS(hg!TFn3e literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/24/2c8f6cf388e96e2c12b6e49cb7ae60167cba1e b/tests/resources/merge-whitespace/.gitted/objects/24/2c8f6cf388e96e2c12b6e49cb7ae60167cba1e new file mode 100644 index 0000000000000000000000000000000000000000..7cfc318ed3cd24349162b68e9083f69c7e0389e6 GIT binary patch literal 50 zcmV-20L}k+0ZYosPf{>8VTejC%I7lVGU77kGT|~+h=_>bGE<0*jN~%svf#4hGBn@< I0M(ZW##lZWkN^Mx literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/25/246acb001858ffeffb03ea399fd2c0a163b832 b/tests/resources/merge-whitespace/.gitted/objects/25/246acb001858ffeffb03ea399fd2c0a163b832 new file mode 100644 index 0000000000000000000000000000000000000000..f7160ce446fdb4d6b704c9b427e770157c9c9549 GIT binary patch literal 53 zcmb0NMX|0ZYosPf{>4Vldz`lS111~BHqrQ9~bcedQwZpW205M literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/3c/43e7fc2a56fc825c31dfee65abd6dda8d16dca b/tests/resources/merge-whitespace/.gitted/objects/3c/43e7fc2a56fc825c31dfee65abd6dda8d16dca new file mode 100644 index 0000000000000000000000000000000000000000..0ec95b5c2101f48e72113ebcb7e068fc198ab58f GIT binary patch literal 52 zcmb65wT!^myfi!uYK5dh+?-lXyjavKw z;jRwn-W&2flR#Y^u4F+34A$2+w6^bJjc8ntv2L9^^i_jSyQrHX21Mmo8S?_qKD@8U z@QBMyJg%P%r`KP0zGqp;i{FPl-$B(F>$?wJnoFETizCpR*{f~t((89988-^K~{TWO5sMJ#;AwQ{2H7Rc5pY}o11U&-3(dB}% QbavMdISD3FUzeR}tftaxA^-pY literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/43/ad73e75e15f03bb0b4398a48a57ecfc20788e2 b/tests/resources/merge-whitespace/.gitted/objects/43/ad73e75e15f03bb0b4398a48a57ecfc20788e2 new file mode 100644 index 0000000000000000000000000000000000000000..1936bc34a04b70f79f40466b714b8386309d0a04 GIT binary patch literal 53 zcmV-50LuS(0V^p=O;s>9V=y!@Ff%bxC`m0Y(JQGaVR&bwwWg0*$;Ze#;?2gN@4ktZ LgroxiI_yF?F6m$Rp literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/5e/fb9bc29c482e023e40e0a2b3b7e49cec842034 b/tests/resources/merge-whitespace/.gitted/objects/5e/fb9bc29c482e023e40e0a2b3b7e49cec842034 new file mode 100644 index 0000000000000000000000000000000000000000..d615c02a6b36669ca11cf0c4d92dde442130dcbc GIT binary patch literal 53 zcmb8#W%j<>n*Fxv)5_&?<#!Z>Hoon JAu&woJ^;~d6Yu~4 literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/70/d3d2e7d51a18fcc6f035a67e5c3f33069be04d b/tests/resources/merge-whitespace/.gitted/objects/70/d3d2e7d51a18fcc6f035a67e5c3f33069be04d new file mode 100644 index 0000000000000000000000000000000000000000..1718878a71ba17a791ba635061892e47fc24263a GIT binary patch literal 53 zcmV-50LuS(0V^p=O;s>9V=y!@Ff%bxC`m0Y(JQGaVNlWO&-vW(GEYZn+mkul*CmM6 L?2-cjLRk=(_fi#O literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/74/e83b6c5df14f1fba7c4ea1f99c6d007b591002 b/tests/resources/merge-whitespace/.gitted/objects/74/e83b6c5df14f1fba7c4ea1f99c6d007b591002 new file mode 100644 index 0000000000000000000000000000000000000000..779e1bcb3e2bc9b0412890a98778ff1187685afd GIT binary patch literal 43 zcmV+`0M!3@0ZYosPf{>4XE5M0B6 literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/77/f40c621ceae77ad8d756ef507bdbafe2713aa7 b/tests/resources/merge-whitespace/.gitted/objects/77/f40c621ceae77ad8d756ef507bdbafe2713aa7 new file mode 100644 index 0000000000000000000000000000000000000000..f2efa93be2ae789348688a49a1c2d6e6c2a8dc39 GIT binary patch literal 53 zcmV-50LuS(0V^p=O;s>9V=y!@Ff%bxC`m0Y(JQGaVPM>w%913U<aq?g$&m;qSdq+Hi+gcP= zT(_+ZK<^$#69FAUel>-G%B;gn+Z7~!H( mYjx5yb;!RY>U}Lk`kh!Hm#?#g_64}^9V=y!@Ff%bxC`m0Y(JQGaVNlagzsLLNsp-;L5BJy{Nwm{hczYwGCvf%P zH;)1^ZZ^wHT^5|+w7 zky;-`Yt+E57L+KcMEuw1szC{}MXJsb@=$`q!WW7aYxE)HSaTT+?R{JuypnwGy1|RK zdD_PPYlFx48@oPly-n2VLDu;Rh9A$dOa<<(v(_B+xYqSw67#0*s=$pF8R2xxGoN5u O`udB{WWE8DL1oXbmTbWQ literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/a8/27eab4fd66ab37a6ebcfaa7b7e341abfd55947 b/tests/resources/merge-whitespace/.gitted/objects/a8/27eab4fd66ab37a6ebcfaa7b7e341abfd55947 new file mode 100644 index 0000000000000000000000000000000000000000..fe2bdf4929e9d9aa307a0d8ef1ead80426c4f5fd GIT binary patch literal 51 zcmV-30L=e*0ZYosPf{>8Wr#{G%I7lVGU77kGT|~+h=_>bGE<0*jN~%svf#4h3Q5i5 J0s!ED35|2H84Lgb literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/a9/66acc271e50b5d4595911752a77def0a5e5d40 b/tests/resources/merge-whitespace/.gitted/objects/a9/66acc271e50b5d4595911752a77def0a5e5d40 new file mode 100644 index 0000000000000000000000000000000000000000..cd6f64d6faaf2705a52d33dbb15aa85628084cec GIT binary patch literal 132 zcmV-~0DJ#<0j14B3IZ_IIrNK4vdq{_~v|9Q+J{=B^pWRPg mTS=OBywoF1j(iNk`T$!bM6>F;R{1MpF0Y~`J+KX literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/b2/a69114f4897109fedf1aafea363cb2d2557029 b/tests/resources/merge-whitespace/.gitted/objects/b2/a69114f4897109fedf1aafea363cb2d2557029 new file mode 100644 index 0000000000000000000000000000000000000000..b95a7be74f974c4b7714dfcfbeb1bde4e01a684d GIT binary patch literal 178 zcmV;j08RgR0j16{YQ!)QM&Z;t#q@z7$(Bck5JH;3USR9rqtV&{+Z#zPa{Cze2;08m zi{-)6x|v*7e{p#g9lRfSrH{! z7m=sn#f{OP-qdG4b4}@ literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/c3/b1fb31424c98072542cc8e42b48c92e52f494a b/tests/resources/merge-whitespace/.gitted/objects/c3/b1fb31424c98072542cc8e42b48c92e52f494a new file mode 100644 index 0000000000000000000000000000000000000000..4006460e8f08f94159e499536e0496b309491697 GIT binary patch literal 39 xcmV+?0NDR{0ZYosPf{>4W^m*(Czz=^wHUv6Xq&D zv05LC)~G>T%~)bVWtP9cR1L~V7P&gdC_@eovz$3rtkH)+u~Hrk?|obwym7hiy1}cq zdD_PPYlG*HJG&gW-X`w+RMzlN?}L O`udAcY`y`IBxS`Q$Y#L+ literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/d9/5182053c31f8aa09df4fa225f4e668c5320b59 b/tests/resources/merge-whitespace/.gitted/objects/d9/5182053c31f8aa09df4fa225f4e668c5320b59 new file mode 100644 index 0000000000000000000000000000000000000000..6b9483a5cdd67ebdbaa3c837bc07f6d69227b685 GIT binary patch literal 176 zcmV;h08jsT0j17O3c@fDKw;N8#q0%{Bu$%uh^_=L;Cecl*b4nINf+K;!6Uf+7LUiv zG>sLEv%8u_pu=dRkuEw-+9&2Vp>@=D;@Bo@u?@Xo6V*yt<_cQ-AR4JPL@}8pXTqRFq8Mb$U9V=y!@Ff%bxC`m0Y(JQGaVfer^Ew-86pe6IExq0NMX|0ZYosPf{>4VsPX#6FlMlU00j?MM;9(fE?WrTGT^d<0EMKY#JuE;_#`evE+Z~u eE)y0n25`+zn3@51G#Lk~_ZZFq literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/f0/0c965d8307308469e537302baa73048488f162 b/tests/resources/merge-whitespace/.gitted/objects/f0/0c965d8307308469e537302baa73048488f162 new file mode 100644 index 0000000000000000000000000000000000000000..343037e77ed919a238aba0200439e1dbf264c849 GIT binary patch literal 37 vcmV+=0NVd}0ZYosPf{>4WH971;xgtk;WFhi<1**6;Iia0G~faNRow)|Mlcb= literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/f1/90a0d111ca1688778657798743ddfb4ed4bd64 b/tests/resources/merge-whitespace/.gitted/objects/f1/90a0d111ca1688778657798743ddfb4ed4bd64 new file mode 100644 index 0000000000000000000000000000000000000000..4e2291208b61421d25ca35bf2d6c2724c0debb72 GIT binary patch literal 164 zcmV;V09*ff0j17O3c@fDKw;N8MfQT^Z<-8<2rdL~F-fLcA&sW#!rNQ$2yVZ{ zKJ%yucvB^4?T^~zjnaGNMP9j;X?d)lMIN6&yPucdChBxZwVb4O1~3F?tlTT3l-P7z S?fh3nTxJ literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/f4/9b2c244e9d3b0647fdfb95954c38fbfeecf3ad b/tests/resources/merge-whitespace/.gitted/objects/f4/9b2c244e9d3b0647fdfb95954c38fbfeecf3ad new file mode 100644 index 0000000000000000000000000000000000000000..437f667f56800a617d1c9b4a78e65a61d7260968 GIT binary patch literal 128 zcmV-`0Du2@0j1473IZ_@Kw;~gVtPSlhe@1(h@IdqlI*M-AuQ&n@b)fv1lzB8FKwmd z4wKNKS5@FBWas3VQgj-9K!<8ME;2h$B1=?dk8Hx|>sH|r(tBuwyVjE1IzA09ub(|{ it=AlSIHj#zVPdjg#GVn3NQh?Fecko1i1`9i5j^bgEIlCr literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/objects/f8/7905f99f0e66d179a8379d8ca4d8cbbd32c231 b/tests/resources/merge-whitespace/.gitted/objects/f8/7905f99f0e66d179a8379d8ca4d8cbbd32c231 new file mode 100644 index 0000000000000000000000000000000000000000..d568dc1e940c4891c84b8345296e4e262bed7b68 GIT binary patch literal 220 zcmV<203-i+0i};iYQ!)QM6>oOw3|gBbn9m|gfP26AZIWwsbxE0J0r`B+&+exoFJ=$ zS4B~kwq=={G6tSn6;aOimI7gKz-ot@qc?zroO?_;Nsiw7NZfsMm9?o%4ub|~lED&~ zfpW2hwRXjd_aQl>Av*fYN6nrPZLxuR1S*mXG8bXvO^P~e=X%i8@zJKOst-=LLw5Bp zb(#0+_}SI#*PV^mz15i;zocz>Q+Vz@mj~n3GiZSBr02CJ|0?M|rH-Ov6z2o%stWo5 literal 0 HcmV?d00001 diff --git a/tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_eol b/tests/resources/merge-whitespace/.gitted/refs/heads/branch_b_eol new file mode 100644 index 0000000000000000000000000000000000000000..9e25c6e29c53d88f1af5ef175311416469aab5d5 GIT binary patch literal 41 ucmV~$!4Uu;2m`Rc(+E-y#wn-We*}}!i$~N3 Date: Thu, 12 Mar 2015 12:29:47 +0200 Subject: [PATCH 3/6] Renamed git_merge_options 'flags' to 'tree_flags' --- include/git2/merge.h | 4 ++-- src/merge.c | 4 ++-- tests/cherrypick/workdir.c | 4 ++-- tests/merge/trees/treediff.c | 2 +- tests/merge/workdir/renames.c | 6 +++--- tests/revert/workdir.c | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/git2/merge.h b/include/git2/merge.h index 73375b319..387197a40 100644 --- a/include/git2/merge.h +++ b/include/git2/merge.h @@ -63,7 +63,7 @@ GIT_EXTERN(int) git_merge_file_init_input( /** * Flags for `git_merge_tree` options. A combination of these flags can be - * passed in via the `flags` value in the `git_merge_options`. + * passed in via the `tree_flags` value in the `git_merge_options`. */ typedef enum { /** @@ -225,7 +225,7 @@ typedef struct { */ typedef struct { unsigned int version; - git_merge_tree_flag_t flags; + git_merge_tree_flag_t tree_flags; /** * Similarity to consider a file renamed (default 50). If diff --git a/src/merge.c b/src/merge.c index 2972d9ff3..12e85ffa8 100644 --- a/src/merge.c +++ b/src/merge.c @@ -1154,7 +1154,7 @@ int git_merge_diff_list__find_renames( assert(diff_list && opts); - if ((opts->flags & GIT_MERGE_TREE_FIND_RENAMES) == 0) + if ((opts->tree_flags & GIT_MERGE_TREE_FIND_RENAMES) == 0) return 0; similarity_ours = git__calloc(diff_list->conflicts.length, @@ -1593,7 +1593,7 @@ static int merge_normalize_opts( git_merge_options init = GIT_MERGE_OPTIONS_INIT; memcpy(opts, &init, sizeof(init)); - opts->flags = GIT_MERGE_TREE_FIND_RENAMES; + opts->tree_flags = GIT_MERGE_TREE_FIND_RENAMES; opts->rename_threshold = GIT_MERGE_TREE_RENAME_THRESHOLD; } diff --git a/tests/cherrypick/workdir.c b/tests/cherrypick/workdir.c index f8b4ca2e9..787f1f4d4 100644 --- a/tests/cherrypick/workdir.c +++ b/tests/cherrypick/workdir.c @@ -300,7 +300,7 @@ void test_cherrypick_workdir__rename(void) { 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 0, "file3.txt.renamed" }, }; - opts.merge_opts.flags |= GIT_MERGE_TREE_FIND_RENAMES; + opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; opts.merge_opts.rename_threshold = 50; git_oid_fromstr(&head_oid, "cfc4f0999a8367568e049af4f72e452d40828a15"); @@ -335,7 +335,7 @@ void test_cherrypick_workdir__both_renamed(void) { 0100644, "28d9eb4208074ad1cc84e71ccc908b34573f05d2", 2, "file3.txt.renamed_on_branch" }, }; - opts.merge_opts.flags |= GIT_MERGE_TREE_FIND_RENAMES; + opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; opts.merge_opts.rename_threshold = 50; git_oid_fromstr(&head_oid, "44cd2ed2052c9c68f9a439d208e9614dc2a55c70"); diff --git a/tests/merge/trees/treediff.c b/tests/merge/trees/treediff.c index 8b47f7dee..eea651de0 100644 --- a/tests/merge/trees/treediff.c +++ b/tests/merge/trees/treediff.c @@ -45,7 +45,7 @@ static void test_find_differences( git_tree *ancestor_tree, *ours_tree, *theirs_tree; git_merge_options opts = GIT_MERGE_OPTIONS_INIT; - opts.flags |= GIT_MERGE_TREE_FIND_RENAMES; + opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; opts.target_limit = 1000; opts.rename_threshold = 50; diff --git a/tests/merge/workdir/renames.c b/tests/merge/workdir/renames.c index 807a88f4c..83006a703 100644 --- a/tests/merge/workdir/renames.c +++ b/tests/merge/workdir/renames.c @@ -63,7 +63,7 @@ void test_merge_workdir_renames__renames(void) { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "7-both-renamed.txt~rename_conflict_theirs" }, }; - merge_opts.flags |= GIT_MERGE_TREE_FIND_RENAMES; + merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; merge_opts.rename_threshold = 50; cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR BRANCH_RENAME_OURS, GIT_REFS_HEADS_DIR BRANCH_RENAME_THEIRS, &merge_opts, NULL)); @@ -99,7 +99,7 @@ void test_merge_workdir_renames__ours(void) { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "7-both-renamed.txt" }, }; - merge_opts.flags |= GIT_MERGE_TREE_FIND_RENAMES; + merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; merge_opts.rename_threshold = 50; checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_USE_OURS; @@ -147,7 +147,7 @@ void test_merge_workdir_renames__similar(void) { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "7-both-renamed.txt~rename_conflict_theirs" }, }; - merge_opts.flags |= GIT_MERGE_TREE_FIND_RENAMES; + merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; merge_opts.rename_threshold = 50; cl_git_pass(merge_branches(repo, GIT_REFS_HEADS_DIR BRANCH_RENAME_OURS, GIT_REFS_HEADS_DIR BRANCH_RENAME_THEIRS, &merge_opts, NULL)); diff --git a/tests/revert/workdir.c b/tests/revert/workdir.c index 171cacb25..7ccf0f937 100644 --- a/tests/revert/workdir.c +++ b/tests/revert/workdir.c @@ -408,7 +408,7 @@ void test_revert_workdir__rename_1_of_2(void) { 0100644, "0f5bfcf58c558d865da6be0281d7795993646cee", 2, "file6.txt" }, }; - opts.merge_opts.flags |= GIT_MERGE_TREE_FIND_RENAMES; + opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; opts.merge_opts.rename_threshold = 50; git_oid_fromstr(&head_oid, "cef56612d71a6af8d8015691e4865f7fece905b5"); @@ -442,7 +442,7 @@ void test_revert_workdir__rename(void) { "file4.txt", "file5.txt", "" }, }; - opts.merge_opts.flags |= GIT_MERGE_TREE_FIND_RENAMES; + opts.merge_opts.tree_flags |= GIT_MERGE_TREE_FIND_RENAMES; opts.merge_opts.rename_threshold = 50; git_oid_fromstr(&head_oid, "55568c8de5322ff9a95d72747a239cdb64a19965"); From 13de93631664cd6eec3afedabb7145d5562a3e01 Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Thu, 12 Mar 2015 12:36:09 +0200 Subject: [PATCH 4/6] Collapse whitespace flags into git_merge_file_flags_t --- include/git2/merge.h | 34 +++++++++++----------------------- src/merge.c | 10 +++++----- src/merge_file.c | 6 +++--- tests/merge/files.c | 4 ++-- tests/merge/trees/whitespace.c | 4 ++-- 5 files changed, 23 insertions(+), 35 deletions(-) diff --git a/include/git2/merge.h b/include/git2/merge.h index 387197a40..e971f2d40 100644 --- a/include/git2/merge.h +++ b/include/git2/merge.h @@ -110,23 +110,6 @@ typedef enum { GIT_MERGE_FILE_FAVOR_UNION = 3, } git_merge_file_favor_t; -/** - * Whitespace merging flags - */ -typedef enum { - /** Defaults */ - GIT_MERGE_FILE_IGNORE_DEFAULT = 0, - - /** Ignore all whitespace */ - GIT_MERGE_FILE_IGNORE_WHITESPACE = (1 << 0), - - /** Ignore changes in amount of whitespace */ - GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE = (1 << 1), - - /** Ignore whitespace at end of line */ - GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL = (1 << 2), -} git_merge_file_whitespace_t; - /** * File merging flags */ @@ -142,6 +125,15 @@ typedef enum { /** Condense non-alphanumeric regions for simplified diff file */ GIT_MERGE_FILE_SIMPLIFY_ALNUM = (1 << 2), + + /** Ignore all whitespace */ + GIT_MERGE_FILE_IGNORE_WHITESPACE = (1 << 3), + + /** Ignore changes in amount of whitespace */ + GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE = (1 << 4), + + /** Ignore whitespace at end of line */ + GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL = (1 << 5), } git_merge_file_flags_t; /** @@ -172,10 +164,7 @@ typedef struct { git_merge_file_favor_t favor; /** Merge file flags. */ - git_merge_file_flags_t flags; - - /** Whitespace merge flags */ - unsigned int whitespace_flags; + unsigned int flags; } git_merge_file_options; #define GIT_MERGE_FILE_OPTIONS_VERSION 1 @@ -251,8 +240,7 @@ typedef struct { /** Flags for handling conflicting content. */ git_merge_file_favor_t file_favor; - /** Flags for handling whitespace */ - unsigned int whitespace_flags; + unsigned int file_flags; } git_merge_options; #define GIT_MERGE_OPTIONS_VERSION 1 diff --git a/src/merge.c b/src/merge.c index 12e85ffa8..c0dd2b694 100644 --- a/src/merge.c +++ b/src/merge.c @@ -654,7 +654,7 @@ static int merge_conflict_resolve_automerge( git_merge_diff_list *diff_list, const git_merge_diff *conflict, unsigned int merge_file_favor, - unsigned int whitespace_flags) + unsigned int file_flags) { const git_index_entry *ancestor = NULL, *ours = NULL, *theirs = NULL; git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; @@ -709,7 +709,7 @@ static int merge_conflict_resolve_automerge( &conflict->their_entry : NULL; opts.favor = merge_file_favor; - opts.whitespace_flags = whitespace_flags; + opts.flags = file_flags; if ((error = git_repository_odb(&odb, diff_list->repo)) < 0 || (error = git_merge_file_from_index(&result, diff_list->repo, ancestor, ours, theirs, &opts)) < 0 || @@ -744,7 +744,7 @@ static int merge_conflict_resolve( git_merge_diff_list *diff_list, const git_merge_diff *conflict, unsigned int merge_file_favor, - unsigned int whitespace_flags) + unsigned int file_flags) { int resolved = 0; int error = 0; @@ -761,7 +761,7 @@ static int merge_conflict_resolve( goto done; if (!resolved && (error = merge_conflict_resolve_automerge(&resolved, diff_list, conflict, - merge_file_favor, whitespace_flags)) < 0) + merge_file_favor, file_flags)) < 0) goto done; *out = resolved; @@ -1783,7 +1783,7 @@ int git_merge_trees( git_vector_foreach(&changes, i, conflict) { int resolved = 0; - if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor, opts.whitespace_flags)) < 0) + if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.file_favor, opts.file_flags)) < 0) goto done; if (!resolved) diff --git a/src/merge_file.c b/src/merge_file.c index b827ca977..8bb003fe3 100644 --- a/src/merge_file.c +++ b/src/merge_file.c @@ -151,11 +151,11 @@ static int git_merge_file__from_inputs( if (options.flags & GIT_MERGE_FILE_STYLE_DIFF3) xmparam.style = XDL_MERGE_DIFF3; - if (options.whitespace_flags & GIT_MERGE_FILE_IGNORE_WHITESPACE) + if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE) xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE; - if (options.whitespace_flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE) + if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE) xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_CHANGE; - if (options.whitespace_flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL) + if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL) xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_AT_EOL; if ((xdl_result = xdl_merge(&ancestor_mmfile, &our_mmfile, diff --git a/tests/merge/files.c b/tests/merge/files.c index cb9e8d195..7f461abff 100644 --- a/tests/merge/files.c +++ b/tests/merge/files.c @@ -198,7 +198,7 @@ void test_merge_files__automerge_whitespace_eol(void) theirs.path = "testfile.txt"; theirs.mode = 0100755; - opts.whitespace_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL; + opts.flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL; cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts)); cl_assert_equal_i(1, result.automergeable); @@ -236,7 +236,7 @@ void test_merge_files__automerge_whitespace_change(void) theirs.path = "testfile.txt"; theirs.mode = 0100755; - opts.whitespace_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE; + opts.flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE; cl_git_pass(git_merge_file(&result, &ancestor, &ours, &theirs, &opts)); cl_assert_equal_i(1, result.automergeable); diff --git a/tests/merge/trees/whitespace.c b/tests/merge/trees/whitespace.c index 77e362c9c..b99583cb3 100644 --- a/tests/merge/trees/whitespace.c +++ b/tests/merge/trees/whitespace.c @@ -54,7 +54,7 @@ void test_merge_trees_whitespace__eol(void) { 0100644, "ee3c2aac8e03224c323b58ecb1f9eef616745467", 0, "test.txt" }, }; - opts.whitespace_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL; + opts.file_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL; cl_git_pass(merge_trees_from_branches(&index, repo, BRANCH_A_EOL, BRANCH_B_EOL, &opts)); @@ -72,7 +72,7 @@ void test_merge_trees_whitespace__change(void) { 0100644, "a827eab4fd66ab37a6ebcfaa7b7e341abfd55947", 0, "test.txt" }, }; - opts.whitespace_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE; + opts.file_flags |= GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE; cl_git_pass(merge_trees_from_branches(&index, repo, BRANCH_A_CHANGE, BRANCH_B_CHANGE, &opts)); From 74c37c2a48756299306bb10e9e546c1627ca289f Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Thu, 12 Mar 2015 13:16:09 +0200 Subject: [PATCH 5/6] Added options to enable patience and minimal diff drivers --- include/git2/merge.h | 6 ++++++ src/merge_file.c | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/include/git2/merge.h b/include/git2/merge.h index e971f2d40..d3360a7e0 100644 --- a/include/git2/merge.h +++ b/include/git2/merge.h @@ -134,6 +134,12 @@ typedef enum { /** Ignore whitespace at end of line */ GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL = (1 << 5), + + /** Use the "patience diff" algorithm */ + GIT_MERGE_FILE_DIFF_PATIENCE = (1 << 6), + + /** Take extra time to find minimal diff */ + GIT_MERGE_FILE_DIFF_MINIMAL = (1 << 7), } git_merge_file_flags_t; /** diff --git a/src/merge_file.c b/src/merge_file.c index 8bb003fe3..6d89b089d 100644 --- a/src/merge_file.c +++ b/src/merge_file.c @@ -158,6 +158,12 @@ static int git_merge_file__from_inputs( if (options.flags & GIT_MERGE_FILE_IGNORE_WHITESPACE_EOL) xmparam.xpp.flags |= XDF_IGNORE_WHITESPACE_AT_EOL; + if (options.flags & GIT_MERGE_FILE_DIFF_PATIENCE) + xmparam.xpp.flags |= XDF_PATIENCE_DIFF; + + if (options.flags & GIT_MERGE_FILE_DIFF_MINIMAL) + xmparam.xpp.flags |= XDF_NEED_MINIMAL; + if ((xdl_result = xdl_merge(&ancestor_mmfile, &our_mmfile, &their_mmfile, &xmparam, &mmbuffer)) < 0) { giterr_set(GITERR_MERGE, "Failed to merge files."); From 70b0f128c8f8a9f6bd2ec4ec0b326f8c03f9efb4 Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Tue, 17 Mar 2015 16:34:36 +0200 Subject: [PATCH 6/6] Added changelog entries for whitespace and patience merges. --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5236a6d6f..39be8384f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ v0.22 + 1 ### Changes or improvements +* Patience and minimal diff drivers can now be used for merges. + +* Merges can now ignore whitespace changes. + * Updated binary identification in CRLF filtering to avoid false positives in UTF-8 files. @@ -20,6 +24,8 @@ v0.22 + 1 ### API additions +* The `git_merge_options` gained a `file_flags` member. + * Parsing and retrieving a configuration value as a path is exposed via `git_config_parse_path()` and `git_config_get_path()` respectively. @@ -42,6 +48,12 @@ v0.22 + 1 ### Breaking API changes +* The `git_merge_options` structure member `flags` has been renamed + to `tree_flags`. + +* The `git_merge_file_options` structure member `tree_flags` is now + an unsigned int. It was previously a `git_merge_file_flags_t`. + * `GIT_CHECKOUT_SAFE_CREATE` has been removed. Most users will generally be able to switch to `GIT_CHECKOUT_SAFE`, but if you require missing file handling during checkout, you may now use `GIT_CHECKOUT_SAFE |