commit: drop duplicated parents
The scripted version of git-commit internally used git-commit-tree which omitted duplicated parents given from the command line. This prevented a nonsensical octopus merge from getting created even when you said "git merge A B" while you are already on branch A. However, when git-commit was rewritten in C, this sanity check was lost. This resurrects it. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
69e66f5500
commit
67bfc030d7
@ -883,10 +883,19 @@ static void add_parent(struct strbuf *sb, const unsigned char *sha1)
|
|||||||
{
|
{
|
||||||
struct object *obj = parse_object(sha1);
|
struct object *obj = parse_object(sha1);
|
||||||
const char *parent = sha1_to_hex(sha1);
|
const char *parent = sha1_to_hex(sha1);
|
||||||
|
const char *cp;
|
||||||
|
|
||||||
if (!obj)
|
if (!obj)
|
||||||
die("Unable to find commit parent %s", parent);
|
die("Unable to find commit parent %s", parent);
|
||||||
if (obj->type != OBJ_COMMIT)
|
if (obj->type != OBJ_COMMIT)
|
||||||
die("Parent %s isn't a proper commit", parent);
|
die("Parent %s isn't a proper commit", parent);
|
||||||
|
|
||||||
|
for (cp = sb->buf; cp && (cp = strstr(cp, "\nparent ")); cp += 8) {
|
||||||
|
if (!memcmp(cp + 8, parent, 40) && cp[48] == '\n') {
|
||||||
|
error("duplicate parent %s ignored", parent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
strbuf_addf(sb, "parent %s\n", parent);
|
strbuf_addf(sb, "parent %s\n", parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,4 +226,18 @@ test_expect_success 'a SIGTERM should break locks' '
|
|||||||
! test -f .git/index.lock
|
! test -f .git/index.lock
|
||||||
'
|
'
|
||||||
|
|
||||||
|
rm -f .git/MERGE_MSG .git/COMMIT_EDITMSG
|
||||||
|
git reset -q --hard
|
||||||
|
|
||||||
|
test_expect_success 'Hand committing of a redundant merge removes dups' '
|
||||||
|
|
||||||
|
git rev-parse second master >expect &&
|
||||||
|
test_must_fail git merge second master &&
|
||||||
|
git checkout master g &&
|
||||||
|
EDITOR=: git commit -a &&
|
||||||
|
git cat-file commit HEAD | sed -n -e "s/^parent //p" -e "/^$/q" >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user