Merge branch 'sb/submodule-parallel-fetch'
[gitweb.git] / fetch-pack.c
index 820251a8d80518508514b728b4b2afd8a171e296..f96f6dfb35afb419ac38fcec9b4013fbf0e6d36d 100644 (file)
@@ -15,6 +15,7 @@
 #include "version.h"
 #include "prio-queue.h"
 #include "sha1-array.h"
+#include "sigchain.h"
 
 static int transfer_unpack_limit = -1;
 static int fetch_unpack_limit = -1;
@@ -169,7 +170,7 @@ static const unsigned char *get_rev(void)
                }
        }
 
-       return commit->object.sha1;
+       return commit->object.oid.hash;
 }
 
 enum ack_type {
@@ -238,7 +239,7 @@ static void send_request(struct fetch_pack_args *args,
 
 static void insert_one_alternate_ref(const struct ref *ref, void *unused)
 {
-       rev_list_insert_ref(NULL, ref->old_sha1);
+       rev_list_insert_ref(NULL, ref->old_oid.hash);
 }
 
 #define INITIAL_FLUSH 16
@@ -280,7 +281,7 @@ static int find_common(struct fetch_pack_args *args,
 
        fetching = 0;
        for ( ; refs ; refs = refs->next) {
-               unsigned char *remote = refs->old_sha1;
+               unsigned char *remote = refs->old_oid.hash;
                const char *remote_hex;
                struct object *o;
 
@@ -487,7 +488,7 @@ static int mark_complete(const unsigned char *sha1)
                if (!t->tagged)
                        break; /* broken repository */
                o->flags |= COMPLETE;
-               o = parse_object(t->tagged->sha1);
+               o = parse_object(t->tagged->oid.hash);
        }
        if (o && o->type == OBJ_COMMIT) {
                struct commit *commit = (struct commit *)o;
@@ -511,7 +512,7 @@ static void mark_recent_complete_commits(struct fetch_pack_args *args,
        while (complete && cutoff <= complete->item->date) {
                if (args->verbose)
                        fprintf(stderr, "Marking %s as complete\n",
-                               sha1_to_hex(complete->item->object.sha1));
+                               oid_to_hex(&complete->item->object.oid));
                pop_most_recent_commit(&complete, COMPLETE);
        }
 }
@@ -570,7 +571,7 @@ static void filter_refs(struct fetch_pack_args *args,
                                continue;
                        if (get_sha1_hex(ref->name, sha1) ||
                            ref->name[40] != '\0' ||
-                           hashcmp(sha1, ref->old_sha1))
+                           hashcmp(sha1, ref->old_oid.hash))
                                continue;
 
                        ref->matched = 1;
@@ -583,7 +584,7 @@ static void filter_refs(struct fetch_pack_args *args,
 
 static void mark_alternate_complete(const struct ref *ref, void *unused)
 {
-       mark_complete(ref->old_sha1);
+       mark_complete(ref->old_oid.hash);
 }
 
 static int everything_local(struct fetch_pack_args *args,
@@ -599,10 +600,10 @@ static int everything_local(struct fetch_pack_args *args,
        for (ref = *refs; ref; ref = ref->next) {
                struct object *o;
 
-               if (!has_sha1_file(ref->old_sha1))
+               if (!has_object_file(&ref->old_oid))
                        continue;
 
-               o = parse_object(ref->old_sha1);
+               o = parse_object(ref->old_oid.hash);
                if (!o)
                        continue;
 
@@ -630,7 +631,7 @@ static int everything_local(struct fetch_pack_args *args,
         * Don't mark them common yet; the server has to be told so first.
         */
        for (ref = *refs; ref; ref = ref->next) {
-               struct object *o = deref_tag(lookup_object(ref->old_sha1),
+               struct object *o = deref_tag(lookup_object(ref->old_oid.hash),
                                             NULL, 0);
 
                if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
@@ -646,7 +647,7 @@ static int everything_local(struct fetch_pack_args *args,
        filter_refs(args, refs, sought, nr_sought);
 
        for (retval = 1, ref = *refs; ref ; ref = ref->next) {
-               const unsigned char *remote = ref->old_sha1;
+               const unsigned char *remote = ref->old_oid.hash;
                struct object *o;
 
                o = lookup_object(remote);
@@ -671,9 +672,12 @@ static int everything_local(struct fetch_pack_args *args,
 static int sideband_demux(int in, int out, void *data)
 {
        int *xd = data;
+       int ret;
 
-       int ret = recv_sideband("fetch-pack", xd[0], out);
+       sigchain_push(SIGPIPE, SIG_IGN);
+       ret = recv_sideband("fetch-pack", xd[0], out);
        close(out);
+       sigchain_pop(SIGPIPE);
        return ret;
 }
 
@@ -681,11 +685,10 @@ static int get_pack(struct fetch_pack_args *args,
                    int xd[2], char **pack_lockfile)
 {
        struct async demux;
-       const char *argv[22];
-       char keep_arg[256];
-       char hdr_arg[256];
-       const char **av, *cmd_name;
        int do_keep = args->keep_pack;
+       const char *cmd_name;
+       struct pack_header header;
+       int pass_header = 0;
        struct child_process cmd = CHILD_PROCESS_INIT;
        int ret;
 
@@ -705,17 +708,11 @@ static int get_pack(struct fetch_pack_args *args,
        else
                demux.out = xd[0];
 
-       cmd.argv = argv;
-       av = argv;
-       *hdr_arg = 0;
        if (!args->keep_pack && unpack_limit) {
-               struct pack_header header;
 
                if (read_pack_header(demux.out, &header))
                        die("protocol error: bad pack header");
-               snprintf(hdr_arg, sizeof(hdr_arg),
-                        "--pack_header=%"PRIu32",%"PRIu32,
-                        ntohl(header.hdr_version), ntohl(header.hdr_entries));
+               pass_header = 1;
                if (ntohl(header.hdr_entries) < unpack_limit)
                        do_keep = 0;
                else
@@ -723,44 +720,49 @@ static int get_pack(struct fetch_pack_args *args,
        }
 
        if (alternate_shallow_file) {
-               *av++ = "--shallow-file";
-               *av++ = alternate_shallow_file;
+               argv_array_push(&cmd.args, "--shallow-file");
+               argv_array_push(&cmd.args, alternate_shallow_file);
        }
 
        if (do_keep) {
                if (pack_lockfile)
                        cmd.out = -1;
-               *av++ = cmd_name = "index-pack";
-               *av++ = "--stdin";
+               cmd_name = "index-pack";
+               argv_array_push(&cmd.args, cmd_name);
+               argv_array_push(&cmd.args, "--stdin");
                if (!args->quiet && !args->no_progress)
-                       *av++ = "-v";
+                       argv_array_push(&cmd.args, "-v");
                if (args->use_thin_pack)
-                       *av++ = "--fix-thin";
+                       argv_array_push(&cmd.args, "--fix-thin");
                if (args->lock_pack || unpack_limit) {
-                       int s = sprintf(keep_arg,
-                                       "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
-                       if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
-                               strcpy(keep_arg + s, "localhost");
-                       *av++ = keep_arg;
+                       char hostname[256];
+                       if (gethostname(hostname, sizeof(hostname)))
+                               xsnprintf(hostname, sizeof(hostname), "localhost");
+                       argv_array_pushf(&cmd.args,
+                                       "--keep=fetch-pack %"PRIuMAX " on %s",
+                                       (uintmax_t)getpid(), hostname);
                }
                if (args->check_self_contained_and_connected)
-                       *av++ = "--check-self-contained-and-connected";
+                       argv_array_push(&cmd.args, "--check-self-contained-and-connected");
        }
        else {
-               *av++ = cmd_name = "unpack-objects";
+               cmd_name = "unpack-objects";
+               argv_array_push(&cmd.args, cmd_name);
                if (args->quiet || args->no_progress)
-                       *av++ = "-q";
+                       argv_array_push(&cmd.args, "-q");
                args->check_self_contained_and_connected = 0;
        }
-       if (*hdr_arg)
-               *av++ = hdr_arg;
+
+       if (pass_header)
+               argv_array_pushf(&cmd.args, "--pack_header=%"PRIu32",%"PRIu32,
+                                ntohl(header.hdr_version),
+                                ntohl(header.hdr_entries));
        if (fetch_fsck_objects >= 0
            ? fetch_fsck_objects
            : transfer_fsck_objects >= 0
            ? transfer_fsck_objects
            : 0)
-               *av++ = "--strict";
-       *av++ = NULL;
+               argv_array_push(&cmd.args, "--strict");
 
        cmd.in = demux.out;
        cmd.git_cmd = 1;
@@ -987,7 +989,7 @@ static void update_shallow(struct fetch_pack_args *args,
        if (!si->nr_ours && !si->nr_theirs)
                return;
        for (i = 0; i < nr_sought; i++)
-               sha1_array_append(&ref, sought[i]->old_sha1);
+               sha1_array_append(&ref, sought[i]->old_oid.hash);
        si->ref = &ref;
 
        if (args->update_shallow) {