summaryrefslogtreecommitdiff
path: root/merge-recursive.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2018-09-04 21:31:38 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-09-04 21:31:38 (GMT)
commitca676b9bd354e846ac207e7879760719826517ce (patch)
treede33f48393a62396f73111655a41ae77f6be63c9 /merge-recursive.c
parent064e0b2d4ca76b0c438545a4d2170e589327e31f (diff)
parent6aba117d5cf7128e7bc942888263552fe927e13f (diff)
downloadgit-ca676b9bd354e846ac207e7879760719826517ce.zip
git-ca676b9bd354e846ac207e7879760719826517ce.tar.gz
git-ca676b9bd354e846ac207e7879760719826517ce.tar.bz2
Merge branch 'en/directory-renames-nothanks'
Recent addition of "directory rename" heuristics to the merge-recursive backend makes the command susceptible to false positives and false negatives. In the context of "git am -3", which does not know about surrounding unmodified paths and thus cannot inform the merge machinery about the full trees involved, this risk is particularly severe. As such, the heuristic is disabled for "git am -3" to keep the machinery "more stupid but predictable". * en/directory-renames-nothanks: am: avoid directory rename detection when calling recursive merge machinery merge-recursive: add ability to turn off directory rename detection t3401: add another directory rename testcase for rebase and am
Diffstat (limited to 'merge-recursive.c')
-rw-r--r--merge-recursive.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/merge-recursive.c b/merge-recursive.c
index dcdc930..e5243db 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -2869,12 +2869,19 @@ static int detect_and_process_renames(struct merge_options *o,
head_pairs = get_diffpairs(o, common, head);
merge_pairs = get_diffpairs(o, common, merge);
- dir_re_head = get_directory_renames(head_pairs, head);
- dir_re_merge = get_directory_renames(merge_pairs, merge);
+ if (o->detect_directory_renames) {
+ dir_re_head = get_directory_renames(head_pairs, head);
+ dir_re_merge = get_directory_renames(merge_pairs, merge);
- handle_directory_level_conflicts(o,
- dir_re_head, head,
- dir_re_merge, merge);
+ handle_directory_level_conflicts(o,
+ dir_re_head, head,
+ dir_re_merge, merge);
+ } else {
+ dir_re_head = xmalloc(sizeof(*dir_re_head));
+ dir_re_merge = xmalloc(sizeof(*dir_re_merge));
+ dir_rename_init(dir_re_head);
+ dir_rename_init(dir_re_merge);
+ }
ri->head_renames = get_renames(o, head_pairs,
dir_re_merge, dir_re_head, head,
@@ -3586,6 +3593,7 @@ void init_merge_options(struct merge_options *o)
o->renormalize = 0;
o->diff_detect_rename = -1;
o->merge_detect_rename = -1;
+ o->detect_directory_renames = 1;
merge_recursive_config(o);
merge_verbosity = getenv("GIT_MERGE_VERBOSITY");
if (merge_verbosity)