]> git.ipfire.org Git - thirdparty/git.git/blobdiff - transport-helper.c
fetch-pack: support more than one pack lockfile
[thirdparty/git.git] / transport-helper.c
index 20a7185ec40e1cf4612c259019f325208632373b..93a6f507936348e3b2eb43f06663725540646441 100644 (file)
@@ -410,10 +410,11 @@ static int fetch_with_fetch(struct transport *transport,
                        exit(128);
 
                if (skip_prefix(buf.buf, "lock ", &name)) {
-                       if (transport->pack_lockfile)
+                       if (transport->pack_lockfiles.nr)
                                warning(_("%s also locked %s"), data->name, name);
                        else
-                               transport->pack_lockfile = xstrdup(name);
+                               string_list_append(&transport->pack_lockfiles,
+                                                  name);
                }
                else if (data->check_connectivity &&
                         data->transport_options.check_self_contained_and_connected &&
@@ -894,6 +895,7 @@ static int push_refs_with_push(struct transport *transport,
                case REF_STATUS_REJECT_STALE:
                case REF_STATUS_REJECT_ALREADY_EXISTS:
                        if (atomic) {
+                               reject_atomic_push(remote_refs, mirror);
                                string_list_clear(&cas_options, 0);
                                return 0;
                        } else
@@ -1488,3 +1490,25 @@ int bidirectional_transfer_loop(int input, int output)
 
        return tloop_spawnwait_tasks(&state);
 }
+
+void reject_atomic_push(struct ref *remote_refs, int mirror_mode)
+{
+       struct ref *ref;
+
+       /* Mark other refs as failed */
+       for (ref = remote_refs; ref; ref = ref->next) {
+               if (!ref->peer_ref && !mirror_mode)
+                       continue;
+
+               switch (ref->status) {
+               case REF_STATUS_NONE:
+               case REF_STATUS_OK:
+               case REF_STATUS_EXPECTING_REPORT:
+                       ref->status = REF_STATUS_ATOMIC_PUSH_FAILED;
+                       continue;
+               default:
+                       break; /* do nothing */
+               }
+       }
+       return;
+}