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

[PATCH v2 4/4] replace: fix --graft when passing a tag first

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

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

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.

Especially we would pass the hash of the tag object to replace_object_oid() where we would likely fail with an error like:

"error: Objects must be of the same type. 'annotated_replaced_object' points to a replaced object of type 'tag' while 'replacement' points to a replacement object of type 'commit'."

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

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 builtin/replace.c  | 11 +++++++----
 t/t6050-replace.sh | 11 +++++++++++
 2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/builtin/replace.c b/builtin/replace.c
index b0a9227f9a..644b21ca8d 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -481,15 +481,18 @@ static int create_graft(int argc, const char **argv, int force, int gentle)
 
 	strbuf_release(&buf);
 
-	if (oideq(&old_oid, &new_oid)) {
+	if (oideq(&commit->object.oid, &new_oid)) {
 		if (gentle) {
-			warning(_("graft for '%s' unnecessary"), oid_to_hex(&old_oid));
+			warning(_("graft for '%s' unnecessary"),
+				oid_to_hex(&commit->object.oid));
 			return 0;
 		}
-		return error(_("new commit is the same as the old one: '%s'"), oid_to_hex(&old_oid));
+		return error(_("new commit is the same as the old one: '%s'"),
+			     oid_to_hex(&commit->object.oid));
 	}
 
-	return replace_object_oid(old_ref, &old_oid, "replacement", &new_oid, force);
+	return replace_object_oid(old_ref, &commit->object.oid,
+				  "replacement", &new_oid, force);
 }
 
 static int convert_graft_file(int force)
diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh
index 2385a60f68..e7e64e085d 100755
--- a/t/t6050-replace.sh
+++ b/t/t6050-replace.sh
@@ -417,6 +417,17 @@ test_expect_success '--graft using a tag as the new parent' '
 	git replace -d $HASH7
 '
 
+test_expect_success '--graft using a tag as the replaced object' '
+	git tag replaced_object $HASH7 &&
+	git replace --graft replaced_object $HASH5 &&
+	commit_has_parents $HASH7 $HASH5 &&
+	git replace -d $HASH7 &&
+	git tag -a -m "annotated replaced object tag" annotated_replaced_object $HASH7 &&
+	git replace --graft annotated_replaced_object $HASH5 &&
+	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: Junio C Hamano
Message 5 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.