send-pack: move REF_STATUS_REJECT_NODELETE logic a bit higher
authorJunio C Hamano <gitster@pobox.com>
Tue, 12 Aug 2014 22:04:17 +0000 (15:04 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 15 Sep 2014 20:23:19 +0000 (13:23 -0700)
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
index 6129b0fd8e8e1961ab4c74de4f421c41c7786b42..22a1709f62f114eccf42643a1aa61796d19ca7c0 100644 (file)
@@ -231,6 +231,15 @@ int send_pack(struct send_pack_args *args,
                return 0;
        }
 
+       /*
+        * NEEDSWORK: why does delete-refs have to be 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 +258,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++;