summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2008-07-14 00:09:41 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2008-07-14 00:09:41 -0700
commit711f6b295cf463aae07eb76e009faed3d3699623 (patch)
tree7acf1583cb4daad2293415d996517e1164852c7d
parentreduce_heads(): thinkofix (diff)
downloadtgif-711f6b295cf463aae07eb76e009faed3d3699623.tar.xz
reduce_heads(): protect from duplicate input
Because we do not try computing merge base with itself for obvious reasons, the code was not prepared for an arguably insane case of the caller feeding the same commit twice to it. Noticed and test written by Sverre Hvammen Johansen Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--commit.c11
-rwxr-xr-xt/t7600-merge.sh22
2 files changed, 31 insertions, 2 deletions
diff --git a/commit.c b/commit.c
index 03e73f323a..5148ec5527 100644
--- a/commit.c
+++ b/commit.c
@@ -745,15 +745,22 @@ struct commit_list *reduce_heads(struct commit_list *heads)
for (p = heads; p; p = p->next) {
struct commit_list *q, *base;
+ /* Do we already have this in the result? */
+ for (q = result; q; q = q->next)
+ if (p->item == q->item)
+ break;
+ if (q)
+ continue;
+
num_other = 0;
for (q = heads; q; q = q->next) {
if (p->item == q->item)
continue;
other[num_other++] = q->item;
}
- if (num_other) {
+ if (num_other)
base = get_merge_bases_many(p->item, num_other, other, 1);
- } else
+ else
base = NULL;
/*
* If p->item does not have anything common with other
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index f035ea376e..d4cf6289a4 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -490,4 +490,26 @@ test_expect_success 'merge c1 with c0, c2, c0, and c1' '
test_debug 'gitk --all'
+test_expect_success 'merge c1 with c0, c2, c0, and c1' '
+ git reset --hard c1 &&
+ git config branch.master.mergeoptions "" &&
+ test_tick &&
+ git merge c0 c2 c0 c1 &&
+ verify_merge file result.1-5 &&
+ verify_parents $c1 $c2
+'
+
+test_debug 'gitk --all'
+
+test_expect_success 'merge c1 with c1 and c2' '
+ git reset --hard c1 &&
+ git config branch.master.mergeoptions "" &&
+ test_tick &&
+ git merge c1 c2 &&
+ verify_merge file result.1-5 &&
+ verify_parents $c1 $c2
+'
+
+test_debug 'gitk --all'
+
test_done