git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 3/4] replace: fix --graft when passing a tag as parent

From
Christian Couder <christian.couder@gmail.com>
Date
Mar 31, 2019, 13:46 UTC
Message-ID
<20190331134659.28808-4-chriscool@tuxfamily.org>
In-Reply-To
<20190331134659.28808-1-chriscool@tuxfamily.org>

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>
---
 builtin/replace.c  |  9 ++++++---
 t/t6050-replace.sh | 11 +++++++++++
 2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/builtin/replace.c b/builtin/replace.c
index f5701629a8..b0a9227f9a 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -370,16 +370,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 */
diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh
index 948d278482..2385a60f68 100755
--- a/t/t6050-replace.sh
+++ b/t/t6050-replace.sh
@@ -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 &&
-- 
2.21.0.69.g2d86a08d09
Previous: Christian CouderNext: Christian Couder
Message 3 of 6 in “fix `git replace --graft` tag related issues”
  1. 0/4 fix `git replace --graft` tag related issuesChristian Couder, Mar 31, 2019
  2. 1/4 t6050: use test_line_count instead of wc -lChristian Couder, Mar 31, 2019
  3. 3/4 replace: fix --graft when passing a tag as parentChristian Couder, Mar 31, 2019
  4. 2/4 t6050: redirect expected error output to a fileChristian Couder, Mar 31, 2019
  5. 4/4 replace: fix --graft when passing a tag firstChristian Couder, Mar 31, 2019
  6. Junio C HamanoApr 1, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.