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>
diff --git a/builtin-commit.c b/builtin-commit.c
index b294c1f..90200ed 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -883,10 +883,19 @@
 {
 	struct object *obj = parse_object(sha1);
 	const char *parent = sha1_to_hex(sha1);
+	const char *cp;
+
 	if (!obj)
 		die("Unable to find commit parent %s", parent);
 	if (obj->type != OBJ_COMMIT)
 		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);
 }
 
diff --git a/t/t7502-commit.sh b/t/t7502-commit.sh
index 46ec1ce..22a13f7 100755
--- a/t/t7502-commit.sh
+++ b/t/t7502-commit.sh
@@ -226,4 +226,18 @@
 	! 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