On 21.09.2014 22:49, Stefan Beller wrote: > I'd be happy to have a test for this bug(?) attached to > t6031-merge-recursive.sh, but I did not manage to > come up with a test in a reasonable amount of time. So I am just sending out my progress on the testing for this as I may be short on time within the next days/weeks. If anyone is interested to write a test for this one, you may pickup (parts of) the following. At first a rough script, which makes sure the code in question is executed. --8<-- #!/bin/sh # for repetitive testing, delete everything: rm -rf .git file .gitattributes file_with_more_descriptive_name git init # run the actual test git commit --allow-empty -m 'initial' echo -n "content of file:" '\r\n' > file echo -n "line 1" '\r\n' >> file echo -n "line 2" '\r\n' >> file git add file git commit -m 'commit file with \r\n line endings' git checkout -b secondbranch git rm file git commit -m "eventually rm file" git checkout master echo "content of file:" > file echo "line 1" >> file echo "line 2" >> file echo "file text=auto" > .gitattributes git add file .gitattributes git commit -m "Add text=auto to .gitattributes; Normalize file ending" git add file git commit -m 'save file with \r\f line ending' echo echo echo echo git merge secondbranch -m "merging branches with (modify/delete); modify caused only by normalisation" -X renormalize --8<-- Here comes a patch, to be applied to git.git, which puts printfs all over the place, visualizing the code flow >From 1985955b3ab2bad5ac73cbee92d19f63cdbaa3c9 Mon Sep 17 00:00:00 2001 From: Stefan Beller <stefanbeller@xxxxxxxxx> Date: Wed, 24 Sep 2014 14:51:55 +0200 Subject: [PATCH] lots of printfs for debugging [PATCH] merge-recursive: Fix copy-paste mistake --- merge-recursive.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/merge-recursive.c b/merge-recursive.c index 8ad4be8..9b09a67 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -1541,10 +1541,22 @@ static int blob_unchanged(const unsigned char *o_sha, struct strbuf a = STRBUF_INIT; int ret = 0; /* assume changed for safety */ + printf("in blob_unchanged path=%s\n", path); + + if (sha_eq(o_sha, a_sha)) return 1; + else + printf("continue as o_sha and a_sha are different\n"); + if (!renormalize) return 0; + else + printf("continue as not to renormalize\n"); + + printf("testing the patch\n"); + + assert(o_sha && a_sha); if (read_sha1_strbuf(o_sha, &o) || read_sha1_strbuf(a_sha, &a)) @@ -1554,6 +1566,27 @@ static int blob_unchanged(const unsigned char *o_sha, * performed. Comparison can be skipped if both files are * unchanged since their sha1s have already been compared. */ + + printf("o.len %d a.len %d\n", o.len, a.len); + printf("o.buf=|%s|\n a.buf=|%s|\n", o.buf, a.buf); + struct strbuf dsta = STRBUF_INIT; + struct strbuf dsto = STRBUF_INIT; + + renormalize_buffer(path, a.buf, a.len, &dsta); + printf("dsta=|%s|\n",dsta.buf); + renormalize_buffer(path, a.buf, a.len, &dsta); + printf("dsta=|%s|\n",dsta.buf); + + + renormalize_buffer(path, o.buf, o.len, &dsto); + printf("dsto=|%s|\n",dsto.buf); + renormalize_buffer(path, o.buf, o.len, &dsto); + printf("dsto=|%s|\n",dsto.buf); + + + printf("dsto.len=%d, dsta.len=%d\n", dsto.len, dsta.len); + + if (renormalize_buffer(path, o.buf, o.len, &o) | renormalize_buffer(path, a.buf, a.len, &a)) ret = (o.len == a.len && !memcmp(o.buf, a.buf, o.len)); @@ -1682,10 +1715,24 @@ static int merge_content(struct merge_options *o, } + +//~ struct stage_data { + //~ struct { + //~ unsigned mode; + //~ unsigned char sha[20]; + //~ } stages[4]; + //~ struct rename_conflict_info *rename_conflict_info; + //~ unsigned processed:1; +//~ }; + /* Per entry merge function */ static int process_entry(struct merge_options *o, const char *path, struct stage_data *entry) { + + printf("processing entry %s has rename_conflict_info %p\n", path, entry->rename_conflict_info); + //~ print_index_entry("\tpath: ", entry); + int clean_merge = 1; int normalize = o->renormalize; unsigned o_mode = entry->stages[1].mode; @@ -1694,9 +1741,10 @@ static int process_entry(struct merge_options *o, unsigned char *o_sha = stage_sha(entry->stages[1].sha, o_mode); unsigned char *a_sha = stage_sha(entry->stages[2].sha, a_mode); unsigned char *b_sha = stage_sha(entry->stages[3].sha, b_mode); - + printf("%s %s %s\n", o_sha, a_sha, b_sha); entry->processed = 1; if (entry->rename_conflict_info) { + printf("in entry->rename_conflict_info condition\n"); struct rename_conflict_info *conflict_info = entry->rename_conflict_info; switch (conflict_info->rename_type) { case RENAME_NORMAL: @@ -1724,6 +1772,8 @@ static int process_entry(struct merge_options *o, break; } } else if (o_sha && (!a_sha || !b_sha)) { + printf("deleted in one, normalize=%d \n", normalize); + /* Case A: Deleted in one */ if ((!a_sha && !b_sha) || (!b_sha && blob_unchanged(o_sha, a_sha, normalize, path)) || -- 2.1.0.238.gce1d3a9 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html