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

[PATCH 2/3] send-pack: check ref->status before updating tracking refs

From
Jeff King <peff@peff.net>
Date
Nov 17, 2007, 12:55 UTC
Message-ID
<20071117125515.GB23186@sigill.intra.peff.net>
In-Reply-To
<20071117125323.GA23125@sigill.intra.peff.net>

Previously, we manually checked the 'NONE' and 'UPTODATE' conditions. Now that we have ref->status, we can easily say "only update if we pushed successfully".

This adds a test for and fixes a regression introduced in ed31df31 where deleted refs did not have their tracking branches removed. This was due to a bogus per-ref error test that is superseded by the more accurate ref->status flag.

Signed-off-by: Jeff King <peff@peff.net>
---
 builtin-send-pack.c          |   18 +++++-------------
 t/t5404-tracking-branches.sh |    5 +++++
 2 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/builtin-send-pack.c b/builtin-send-pack.c
index 90ca2d3..c7d07aa 100644
--- a/builtin-send-pack.c
+++ b/builtin-send-pack.c
@@ -180,24 +180,17 @@ static int receive_status(int in)
 static void update_tracking_ref(struct remote *remote, struct ref *ref)
 {
 	struct refspec rs;
-	int will_delete_ref;
 
-	rs.src = ref->name;
-	rs.dst = NULL;
-
-	if (!ref->peer_ref)
+	if (ref->status != REF_STATUS_OK)
 		return;
 
-	will_delete_ref = is_null_sha1(ref->peer_ref->new_sha1);
-
-	if (!will_delete_ref &&
-			!hashcmp(ref->old_sha1, ref->peer_ref->new_sha1))
-		return;
+	rs.src = ref->name;
+	rs.dst = NULL;
 
 	if (!remote_find_tracking(remote, &rs)) {
 		if (args.verbose)
 			fprintf(stderr, "updating local tracking ref '%s'\n", rs.dst);
-		if (is_null_sha1(ref->peer_ref->new_sha1)) {
+		if (ref->deletion) {
 			if (delete_ref(rs.dst, NULL))
 				error("Failed to delete");
 		} else
@@ -445,8 +438,7 @@ static int do_send_pack(int in, int out, struct remote *remote, const char *dest
 
 	if (!args.dry_run && remote) {
 		for (ref = remote_refs; ref; ref = ref->next)
-			if (!is_null_sha1(ref->new_sha1))
-				update_tracking_ref(remote, ref);
+			update_tracking_ref(remote, ref);
 	}
 
 	if (!new_refs)
diff --git a/t/t5404-tracking-branches.sh b/t/t5404-tracking-branches.sh
index 799e47e..1493a92 100755
--- a/t/t5404-tracking-branches.sh
+++ b/t/t5404-tracking-branches.sh
@@ -45,4 +45,9 @@ test_expect_success 'check tracking branches not updated for failed refs' '
 	test "$(git rev-parse origin/b2)" = "$b2"
 '
 
+test_expect_success 'deleted branches have their tracking branches removed' '
+	git push origin :b1 &&
+	test "$(git rev-parse origin/b1)" = "origin/b1"
+'
+
 test_done
-- 
1.5.3.5.1795.gf2a4e-dirty
Previous: Jeff KingNext: Alex Riesen
Message 10 of 20 in “tracking per-ref errors on push”
  1. 0/3 tracking per-ref errors on pushJeff King, Nov 17, 2007
  2. 1/3 send-pack: track errors for each refJeff King, Nov 17, 2007
  3. Alex RiesenNov 17, 2007
  4. Daniel BarkalowNov 17, 2007
  5. Jeff KingNov 18, 2007
  6. Junio C HamanoNov 18, 2007
  7. Jeff KingNov 18, 2007
  8. Junio C HamanoNov 17, 2007
  9. Jeff KingNov 18, 2007
  10. 2/3 send-pack: check ref->status before updating tracking refsJeff King, Nov 17, 2007
  11. Alex RiesenNov 17, 2007
  12. Jeff KingNov 17, 2007
  13. Daniel BarkalowNov 17, 2007
  14. 3/3 send-pack: assign remote errors to each refJeff King, Nov 17, 2007
  15. Daniel BarkalowNov 17, 2007
  16. Jeff KingNov 18, 2007
  17. Junio C HamanoNov 18, 2007
  18. Jeff KingNov 18, 2007
  19. Junio C HamanoNov 18, 2007
  20. Jeff KingNov 18, 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.