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

[PATCH] send-pack: move REF_STATUS_REJECT_NODELETE logic a bit higher

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 12, 2014, 22:13 UTC
Message-ID
<xmqqr40l4arc.fsf@gitster.dls.corp.google.com>

This is more of an RFH than a PATCH. I think we would want to encapsulate the logic to set STATUS_REJECT_NODELETE in set_ref_status_for_push() function, but I do not see a good code structure to do so, given the constraints of the dataflow (i.e. the protocol capability is only inspected here with server_supports()).

The motivation behind this patch is that I want to move the "Among refs on remote_refs list, these are not going to be updated on the remote end" logic into a separate helper function in the next step and call that before we enter in this per-ref main loop.

-- >8 -- 20e8b465 (refactor ref status logic for pushing, 2010-01-08) restructured the code to set status for each ref to be pushed, but did not quite go far enough. We inspect the status set earlier by set_refs_status_for_push() and then perform yet another update to the status of a ref with an otherwise OK status to be deleted to mark it with REF_STATUS_REJECT_NODELETE when the protocol tells us never to delete.

Split the latter into a separate loop that comes before we enter the per-ref loop. This way we would have one less condition to check in the main loop.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 send-pack.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/send-pack.c b/send-pack.c
index 6129b0f..51497c3 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -231,6 +231,14 @@ int send_pack(struct send_pack_args *args,
 		return 0;
 	}
 
+	/*
+	 * Why is delete-refs so specific to send-pack machinery
+	 * that set_ref_status_for_push() cannot set this bit for us???
+	 */
+	for (ref = remote_refs; ref; ref = ref->next)
+		if (ref->deletion && !allow_deleting_refs)
+			ref->status = REF_STATUS_REJECT_NODELETE;
+
 	if (!args->dry_run)
 		advertise_shallow_grafts_buf(&req_buf);
 
@@ -249,17 +257,13 @@ int send_pack(struct send_pack_args *args,
 		case REF_STATUS_REJECT_FETCH_FIRST:
 		case REF_STATUS_REJECT_NEEDS_FORCE:
 		case REF_STATUS_REJECT_STALE:
+		case REF_STATUS_REJECT_NODELETE:
 		case REF_STATUS_UPTODATE:
 			continue;
 		default:
 			; /* do nothing */
 		}
 
-		if (ref->deletion && !allow_deleting_refs) {
-			ref->status = REF_STATUS_REJECT_NODELETE;
-			continue;
-		}
-
 		if (!ref->deletion)
 			new_refs++;
 
-- 
2.1.0-rc2-243-g9c8a734
Message 1 of 1 in “send-pack: move REF_STATUS_REJECT_NODELETE logic a bit higher”
  1. send-pack: move REF_STATUS_REJECT_NODELETE logic a bit higherJunio C Hamano, Aug 12, 2014

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.