replace: peel tag when passing a tag as parent to --graft

When passing a tag as a parent argument to `git replace --graft`,
it can be useful to accept it and use the underlying commit as a
parent.

This already works for lightweight tags, but unfortunately
for annotated tags we have been using the hash of the tag object
instead of the hash of the underlying commit as a parent in the
replacement object we create.

This created invalid objects, but the replace succeeded even if
it showed an error like:

error: object A is a tag, not a commit

This patch fixes that by using the hash of the underlying commit
when an annotated tag is passed.

While at it, let's also update an error message to make it
clearer.

Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Christian Couder 2019-03-31 15:46:58 +02:00 committed by Junio C Hamano
parent 5876170167
commit f8e44a81bf
2 changed files with 17 additions and 3 deletions

View File

@ -366,16 +366,19 @@ static int replace_parents(struct strbuf *buf, int argc, const char **argv)
/* prepare new parents */
for (i = 0; i < argc; i++) {
struct object_id oid;
struct commit *commit;
if (get_oid(argv[i], &oid) < 0) {
strbuf_release(&new_parents);
return error(_("not a valid object name: '%s'"),
argv[i]);
}
if (!lookup_commit_reference(the_repository, &oid)) {
commit = lookup_commit_reference(the_repository, &oid);
if (!commit) {
strbuf_release(&new_parents);
return error(_("could not parse %s"), argv[i]);
return error(_("could not parse %s as a commit"), argv[i]);
}
strbuf_addf(&new_parents, "parent %s\n", oid_to_hex(&oid));
strbuf_addf(&new_parents, "parent %s\n", oid_to_hex(&commit->object.oid));
}
/* replace existing parents with new ones */

View File

@ -406,6 +406,17 @@ test_expect_success '--graft with and without already replaced object' '
git replace -d $HASH5
'
test_expect_success '--graft using a tag as the new parent' '
git tag new_parent $HASH5 &&
git replace --graft $HASH7 new_parent &&
commit_has_parents $HASH7 $HASH5 &&
git replace -d $HASH7 &&
git tag -a -m "annotated new parent tag" annotated_new_parent $HASH5 &&
git replace --graft $HASH7 annotated_new_parent &&
commit_has_parents $HASH7 $HASH5 &&
git replace -d $HASH7
'
test_expect_success GPG 'set up a signed commit' '
echo "line 17" >>hello &&
echo "line 18" >>hello &&