Code

merge-tree: fix where two branches share no changes
authorWill Palmer <wmpalmer@gmail.com>
Wed, 14 Jul 2010 17:04:07 +0000 (18:04 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 Jul 2010 19:56:49 +0000 (12:56 -0700)
15b4f7a (merge-tree: use ll_merge() not xdl_merge(), 2010-01-16)
introduced a regression to merge-tree to cause it to segfault when merging
files which existed in one branch, but not in the other or in the
merge-base. This was caused by referencing entry->path at a time when
entry was known to be possibly-NULL.

To correct the problem, we save the path of the entry we came in with,
as the path should be the same among all the stages no matter which
sides are involved in the merge.

Signed-off-by: Will Palmer <wmpalmer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/merge-tree.c
t/t4300-merge-tree.sh

index fc00d794d641c146023a78d7d8e4143f0fdac302..9b25ddc9794efe489ee9ec9fd3203ffa997f03f7 100644 (file)
@@ -60,6 +60,7 @@ static void *result(struct merge_list *entry, unsigned long *size)
 {
        enum object_type type;
        struct blob *base, *our, *their;
+       const char *path = entry->path;
 
        if (!entry->stage)
                return read_sha1_file(entry->blob->object.sha1, &type, size);
@@ -76,7 +77,7 @@ static void *result(struct merge_list *entry, unsigned long *size)
        their = NULL;
        if (entry)
                their = entry->blob;
-       return merge_file(entry->path, base, our, their, size);
+       return merge_file(path, base, our, their, size);
 }
 
 static void *origin(struct merge_list *entry, unsigned long *size)
index 1eba8623695561372aab192a8608130f1a0fda18..46c3fe76d3867be394c6b9089a4aa9a1f3f6bba0 100755 (executable)
@@ -24,7 +24,7 @@ EXPECTED
        test_cmp expected actual
 '
 
-test_expect_failure 'file add !A, B' '
+test_expect_success 'file add !A, B' '
        cat >expected <<\EXPECTED &&
 added in local
   our    100644 43d5a8ed6ef6c00ff775008633f95787d088285d ONE
@@ -195,7 +195,7 @@ EXPECTED
        test_cmp expected actual
 '
 
-test_expect_failure 'file remove !A, B' '
+test_expect_success 'file remove !A, B' '
        cat >expected <<\EXPECTED &&
 removed in remote
   base   100644 43d5a8ed6ef6c00ff775008633f95787d088285d ONE
@@ -213,7 +213,7 @@ EXPECTED
        test_cmp expected actual
 '
 
-test_expect_failure 'file change A, remove B' '
+test_expect_success 'file change A, remove B' '
        cat >expected <<\EXPECTED &&
 removed in remote
   base   100644 43d5a8ed6ef6c00ff775008633f95787d088285d ONE