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

[PATCH 1/8] push: change push to fail if short ref name does not exist

From
Steffen Prohaska <prohaska@zib.de>
Date
Oct 27, 2007, 16:50 UTC
Message-ID
<11935038081211-git-send-email-prohaska@zib.de>
In-Reply-To
<119350380778-git-send-email-prohaska@zib.de>

You can use a branch's shortname to push it. Push used to create the branch on the remote side if it did not yet exist. If you specified the wrong branch accidentally it was created. A safety valve that pushes only existing branches may help to avoid errors.

This commit changes push to fail if the remote ref does not yet exist and the refspec does not start with refs/. Remote refs must explicitly be created with their full name.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 remote.c              |    5 +++--
 t/t5516-fetch-push.sh |   34 ++++++++++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/remote.c b/remote.c
index 170015a..ec992c9 100644
--- a/remote.c
+++ b/remote.c
@@ -611,6 +611,7 @@ static int match_explicit(struct ref *src, struct ref *dst,
 	struct ref *matched_src, *matched_dst;
 
 	const char *dst_value = rs->dst;
+	const char * const orig_dst_value = rs->dst ? rs->dst : rs->src;
 
 	if (rs->pattern)
 		return errs;
@@ -647,12 +648,12 @@ static int match_explicit(struct ref *src, struct ref *dst,
 	case 1:
 		break;
 	case 0:
-		if (!memcmp(dst_value, "refs/", 5))
+		if (!memcmp(orig_dst_value , "refs/", 5))
 			matched_dst = make_linked_ref(dst_value, dst_tail);
 		else
 			error("dst refspec %s does not match any "
 			      "existing ref on the remote and does "
-			      "not start with refs/.", dst_value);
+			      "not start with refs/.", orig_dst_value);
 		break;
 	default:
 		matched_dst = NULL;
diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
index 4fbd5b1..5ba09e2 100755
--- a/t/t5516-fetch-push.sh
+++ b/t/t5516-fetch-push.sh
@@ -126,6 +126,36 @@ test_expect_success 'push with wildcard' '
 	)
 '
 
+test_expect_success 'push nonexisting (1)' '
+
+	mk_test &&
+	if git push testrepo master
+	then
+		echo "Oops, should have failed"
+		false
+	fi
+
+'
+
+test_expect_success 'push nonexisting (2)' '
+
+	mk_test &&
+	if git push testrepo heads/master
+	then
+		echo "Oops, should have failed"
+		false
+	fi
+
+'
+
+test_expect_success 'push nonexisting (3)' '
+
+	mk_test &&
+	git push testrepo refs/heads/master &&
+	check_push_result $the_commit heads/master
+
+'
+
 test_expect_success 'push with matching heads' '
 
 	mk_test heads/master &&
@@ -225,7 +255,7 @@ test_expect_success 'push with colon-less refspec (3)' '
 		git tag -d frotz
 	fi &&
 	git branch -f frotz master &&
-	git push testrepo frotz &&
+	git push testrepo refs/heads/frotz &&
 	check_push_result $the_commit heads/frotz &&
 	test 1 = $( cd testrepo && git show-ref | wc -l )
 '
@@ -238,7 +268,7 @@ test_expect_success 'push with colon-less refspec (4)' '
 		git branch -D frotz
 	fi &&
 	git tag -f frotz &&
-	git push testrepo frotz &&
+	git push testrepo refs/tags/frotz &&
 	check_push_result $the_commit tags/frotz &&
 	test 1 = $( cd testrepo && git show-ref | wc -l )
 
-- 
1.5.3.4.1261.g626eb
Previous: Steffen ProhaskaNext: Steffen Prohaska
Message 2 of 36 in “improve push's refspec handling”
  1. 0/8 improve push's refspec handlingSteffen Prohaska, Oct 27, 2007
  2. 1/8 push: change push to fail if short ref name does not existSteffen Prohaska, Oct 27, 2007
  3. 2/8 push: teach push new flag --createSteffen Prohaska, Oct 27, 2007
  4. 3/8 add get_sha1_with_real_ref() returning full name of ref on demandSteffen Prohaska, Oct 27, 2007
  5. 4/8 rev-parse: teach "git rev-parse --symbolic" to print the full ref nameSteffen Prohaska, Oct 27, 2007
  6. 5/8 push, send-pack: support pushing HEAD to real ref nameSteffen Prohaska, Oct 27, 2007
  7. 6/8 add ref_cmp_full_short() comparing full ref name with a short nameSteffen Prohaska, Oct 27, 2007
  8. 7/8 push: use same rules as git-rev-parse to resolve refspecsSteffen Prohaska, Oct 27, 2007
  9. 8/8 push: teach push to be quiet if local ref is strict subset of remote refSteffen Prohaska, Oct 27, 2007
  10. Junio C HamanoOct 28, 2007
  11. Steffen ProhaskaOct 28, 2007
  12. Junio C HamanoOct 28, 2007
  13. Daniel BarkalowOct 27, 2007
  14. Junio C HamanoOct 28, 2007
  15. Daniel BarkalowOct 27, 2007
  16. Junio C HamanoOct 28, 2007
  17. Steffen ProhaskaOct 28, 2007
  18. Steffen ProhaskaOct 28, 2007
  19. Junio C HamanoOct 28, 2007
  20. Steffen ProhaskaOct 28, 2007
  21. Junio C HamanoOct 28, 2007
  22. Steffen ProhaskaOct 28, 2007
  23. Junio C HamanoOct 28, 2007
  24. Steffen ProhaskaOct 31, 2007
  25. Daniel BarkalowOct 27, 2007
  26. Steffen ProhaskaOct 28, 2007
  27. Junio C HamanoOct 28, 2007
  28. Steffen ProhaskaOct 28, 2007
  29. Shawn O. PearceOct 28, 2007
  30. Steffen ProhaskaOct 28, 2007
  31. Brian GernhardtOct 28, 2007
  32. Junio C HamanoOct 28, 2007
  33. Junio C HamanoOct 28, 2007
  34. Daniel BarkalowOct 27, 2007
  35. Junio C HamanoOct 28, 2007
  36. Steffen ProhaskaOct 28, 2007

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.