log,diff-tree: add --combined-all-paths option
[gitweb.git] / upload-pack.c
index 14e42526ce4c002ecba9d572d8fc4ff12611d33b..9df27b55a098135629ef4eccea4cb18aadb7dad3 100644 (file)
@@ -43,7 +43,6 @@
 
 static timestamp_t oldest_have;
 
-static int deepen_relative;
 static int multi_ack;
 static int no_done;
 static int use_thin_pack, use_ofs_delta, use_include_tag;
@@ -449,6 +448,7 @@ static int do_reachable_revlist(struct child_process *cmd,
        struct object *o;
        char namebuf[GIT_MAX_HEXSZ + 2]; /* ^ + hash + LF */
        int i;
+       const unsigned hexsz = the_hash_algo->hexsz;
 
        cmd->argv = argv;
        cmd->git_cmd = 1;
@@ -467,7 +467,7 @@ static int do_reachable_revlist(struct child_process *cmd,
                goto error;
 
        namebuf[0] = '^';
-       namebuf[GIT_SHA1_HEXSZ + 1] = '\n';
+       namebuf[hexsz + 1] = '\n';
        for (i = get_max_object_index(); 0 < i; ) {
                o = get_indexed_object(--i);
                if (!o)
@@ -476,11 +476,11 @@ static int do_reachable_revlist(struct child_process *cmd,
                        o->flags &= ~TMP_MARK;
                if (!is_our_ref(o))
                        continue;
-               memcpy(namebuf + 1, oid_to_hex(&o->oid), GIT_SHA1_HEXSZ);
-               if (write_in_full(cmd->in, namebuf, GIT_SHA1_HEXSZ + 2) < 0)
+               memcpy(namebuf + 1, oid_to_hex(&o->oid), hexsz);
+               if (write_in_full(cmd->in, namebuf, hexsz + 2) < 0)
                        goto error;
        }
-       namebuf[GIT_SHA1_HEXSZ] = '\n';
+       namebuf[hexsz] = '\n';
        for (i = 0; i < src->nr; i++) {
                o = src->objects[i].item;
                if (is_our_ref(o)) {
@@ -490,8 +490,8 @@ static int do_reachable_revlist(struct child_process *cmd,
                }
                if (reachable && o->type == OBJ_COMMIT)
                        o->flags |= TMP_MARK;
-               memcpy(namebuf, oid_to_hex(&o->oid), GIT_SHA1_HEXSZ);
-               if (write_in_full(cmd->in, namebuf, GIT_SHA1_HEXSZ + 1) < 0)
+               memcpy(namebuf, oid_to_hex(&o->oid), hexsz);
+               if (write_in_full(cmd->in, namebuf, hexsz + 1) < 0)
                        goto error;
        }
        close(cmd->in);
@@ -661,6 +661,9 @@ static void send_unshallow(const struct object_array *shallows,
        }
 }
 
+static int check_ref(const char *refname_full, const struct object_id *oid,
+                    int flag, void *cb_data);
+
 static void deepen(int depth, int deepen_relative,
                   struct object_array *shallows, struct object_array *want_obj)
 {
@@ -675,6 +678,13 @@ static void deepen(int depth, int deepen_relative,
                struct object_array reachable_shallows = OBJECT_ARRAY_INIT;
                struct commit_list *result;
 
+               /*
+                * Checking for reachable shallows requires that our refs be
+                * marked with OUR_REF.
+                */
+               head_ref_namespaced(check_ref, NULL);
+               for_each_namespaced_ref(check_ref, NULL);
+
                get_reachable_list(shallows, &reachable_shallows);
                result = get_shallow_commits(&reachable_shallows,
                                             depth + 1,
@@ -711,6 +721,7 @@ static void deepen_by_rev_list(int ac, const char **av,
 static int send_shallow_list(int depth, int deepen_rev_list,
                             timestamp_t deepen_since,
                             struct string_list *deepen_not,
+                            int deepen_relative,
                             struct object_array *shallows,
                             struct object_array *want_obj)
 {
@@ -833,6 +844,7 @@ static void receive_needs(struct object_array *want_obj)
        int has_non_tip = 0;
        timestamp_t deepen_since = 0;
        int deepen_rev_list = 0;
+       int deepen_relative = 0;
 
        shallow_nr = 0;
        for (;;) {
@@ -924,7 +936,8 @@ static void receive_needs(struct object_array *want_obj)
                return;
 
        if (send_shallow_list(depth, deepen_rev_list, deepen_since,
-                             &deepen_not, &shallows, want_obj))
+                             &deepen_not, deepen_relative, &shallows,
+                             want_obj))
                packet_flush(1);
        object_array_clear(&shallows);
 }
@@ -1036,14 +1049,17 @@ static int upload_pack_config(const char *var, const char *value, void *unused)
                keepalive = git_config_int(var, value);
                if (!keepalive)
                        keepalive = -1;
-       } else if (current_config_scope() != CONFIG_SCOPE_REPO) {
-               if (!strcmp("uploadpack.packobjectshook", var))
-                       return git_config_string(&pack_objects_hook, var, value);
        } else if (!strcmp("uploadpack.allowfilter", var)) {
                allow_filter = git_config_bool(var, value);
        } else if (!strcmp("uploadpack.allowrefinwant", var)) {
                allow_ref_in_want = git_config_bool(var, value);
        }
+
+       if (current_config_scope() != CONFIG_SCOPE_REPO) {
+               if (!strcmp("uploadpack.packobjectshook", var))
+                       return git_config_string(&pack_objects_hook, var, value);
+       }
+
        return parse_hide_refs_config(var, value, "uploadpack");
 }
 
@@ -1394,6 +1410,7 @@ static void send_shallow_info(struct upload_pack_data *data,
 
        if (!send_shallow_list(data->depth, data->deepen_rev_list,
                               data->deepen_since, &data->deepen_not,
+                              data->deepen_relative,
                               &data->shallows, want_obj) &&
            is_repository_shallow(the_repository))
                deepen(INFINITE_DEPTH, data->deepen_relative, &data->shallows,