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@xxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html