Previously, mismatching file modes would be auto-merged by picking the mode in the remote tree. This also fixes a bug which caused merge-recursive to fail if the merged files were empty. Signed-off-by: Clemens Buchacher <drizzd@xxxxxx> --- Hi Dscho, Your patch certainly fixes a bug in git-merge-file. It does not fix the bug in git-merge-recursive, however. The test script also fails with your patch. On Thu, Mar 13, 2008 at 04:19:35PM +0100, Johannes Schindelin wrote: > On Sat, Mar 08, 2008 at 06:17:26PM +0100, Clemens Buchacher wrote: > > One could argue that it would be better to mark the mismatching > > permissions as a conflict. > > Right you are. Your whole "it still is xdl_merge()s fault" point was just > contradicted by your own analysis. Calling xdl_merge() when the sha1 does > _not_ differ is _a mistake_. _That_ is the bug. Alright, fixed in the appended patch. Regards, Clemens merge-recursive.c | 9 +++++++-- t/t6031-merge-recursive.sh | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100755 t/t6031-merge-recursive.sh diff --git a/merge-recursive.c b/merge-recursive.c index 34e3167..01918a7 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -1028,9 +1028,14 @@ static struct merge_file_info merge_file(struct diff_filespec *o, if (!sha_eq(a->sha1, o->sha1) && !sha_eq(b->sha1, o->sha1)) result.merge = 1; - result.mode = a->mode == o->mode ? b->mode: a->mode; + if (!o->mode) { + if (a->mode != b->mode) + result.clean = 0; + result.mode = b->mode; + } else + result.mode = a->mode == o->mode ? b->mode: a->mode; - if (sha_eq(a->sha1, o->sha1)) + if (sha_eq(a->sha1, b->sha1) || sha_eq(a->sha1, o->sha1)) hashcpy(result.sha, b->sha1); else if (sha_eq(b->sha1, o->sha1)) hashcpy(result.sha, a->sha1); diff --git a/t/t6031-merge-recursive.sh b/t/t6031-merge-recursive.sh new file mode 100755 index 0000000..7ea371e --- /dev/null +++ b/t/t6031-merge-recursive.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +test_description='merge-recursive corner cases' +. ./test-lib.sh + +test_expect_success 'merge empty files with different permission flags' ' + : >dummy && + git add dummy && + git commit -m "initial commit" && + git checkout -b a master && + : >a && + git add a && + git commit -m "branch a" && + git checkout -b b master && + : >a && + chmod +x a && + git add a && + git commit -m "branch b" && + git checkout master && + ! (git merge-recursive master -- a b || test $? -ne 1) +' + +test_done -- 1.5.4.4.2.gd2fe -- 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