git-svn: fix show-ignore when not connected to the repository root
[gitweb.git] / fetch-pack.c
index dd67e48fc7cb945d4f1e11f30abca89d16adfc9d..41bdd27b8fce5dd0656b9dcc71e6768f0b4796c6 100644 (file)
@@ -8,7 +8,9 @@
 #include "sideband.h"
 
 static int keep_pack;
-static int keep_auto;
+static int transfer_unpack_limit = -1;
+static int fetch_unpack_limit = -1;
+static int unpack_limit = 100;
 static int quiet;
 static int verbose;
 static int fetch_all;
@@ -196,13 +198,13 @@ static int find_common(int fd[2], unsigned char *result_sha1,
                int len;
 
                while ((len = packet_read_line(fd[0], line, sizeof(line)))) {
-                       if (!strncmp("shallow ", line, 8)) {
+                       if (!prefixcmp(line, "shallow ")) {
                                if (get_sha1_hex(line + 8, sha1))
                                        die("invalid shallow line: %s", line);
                                register_shallow(sha1);
                                continue;
                        }
-                       if (!strncmp("unshallow ", line, 10)) {
+                       if (!prefixcmp(line, "unshallow ")) {
                                if (get_sha1_hex(line + 10, sha1))
                                        die("invalid unshallow line: %s", line);
                                if (!lookup_object(sha1))
@@ -344,7 +346,7 @@ static void filter_refs(struct ref **refs, int nr_match, char **match)
                    check_ref_format(ref->name + 5))
                        ; /* trash */
                else if (fetch_all &&
-                        (!depth || strncmp(ref->name, "refs/tags/", 10) )) {
+                        (!depth || prefixcmp(ref->name, "refs/tags/") )) {
                        *newtail = ref;
                        ref->next = NULL;
                        newtail = &ref->next;
@@ -503,14 +505,14 @@ static int get_pack(int xd[2])
 
        av = argv;
        *hdr_arg = 0;
-       if (keep_auto) {
+       if (unpack_limit) {
                struct pack_header header;
 
                if (read_pack_header(fd[0], &header))
                        die("protocol error: bad pack header");
                snprintf(hdr_arg, sizeof(hdr_arg), "--pack_header=%u,%u",
                         ntohl(header.hdr_version), ntohl(header.hdr_entries));
-               if (ntohl(header.hdr_entries) < keep_auto)
+               if (ntohl(header.hdr_entries) < unpack_limit)
                        do_keep = 0;
                else
                        do_keep = 1;
@@ -523,7 +525,7 @@ static int get_pack(int xd[2])
                        *av++ = "-v";
                if (use_thin_pack)
                        *av++ = "--fix-thin";
-               if (keep_pack > 1 || keep_auto) {
+               if (keep_pack > 1 || unpack_limit) {
                        int s = sprintf(keep_arg,
                                        "--keep=fetch-pack %d on ", getpid());
                        if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
@@ -642,6 +644,21 @@ static int remove_duplicates(int nr_heads, char **heads)
        return dst;
 }
 
+static int fetch_pack_config(const char *var, const char *value)
+{
+       if (strcmp(var, "fetch.unpacklimit") == 0) {
+               fetch_unpack_limit = git_config_int(var, value);
+               return 0;
+       }
+
+       if (strcmp(var, "transfer.unpacklimit") == 0) {
+               transfer_unpack_limit = git_config_int(var, value);
+               return 0;
+       }
+
+       return git_default_config(var, value);
+}
+
 static struct lock_file lock;
 
 int main(int argc, char **argv)
@@ -653,6 +670,12 @@ int main(int argc, char **argv)
        struct stat st;
 
        setup_git_directory();
+       git_config(fetch_pack_config);
+
+       if (0 <= transfer_unpack_limit)
+               unpack_limit = transfer_unpack_limit;
+       else if (0 <= fetch_unpack_limit)
+               unpack_limit = fetch_unpack_limit;
 
        nr_heads = 0;
        heads = NULL;
@@ -660,11 +683,11 @@ int main(int argc, char **argv)
                char *arg = argv[i];
 
                if (*arg == '-') {
-                       if (!strncmp("--upload-pack=", arg, 14)) {
+                       if (!prefixcmp(arg, "--upload-pack=")) {
                                uploadpack = arg + 14;
                                continue;
                        }
-                       if (!strncmp("--exec=", arg, 7)) {
+                       if (!prefixcmp(arg, "--exec=")) {
                                uploadpack = arg + 7;
                                continue;
                        }
@@ -674,16 +697,7 @@ int main(int argc, char **argv)
                        }
                        if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
                                keep_pack++;
-                               continue;
-                       }
-                       if (!strcmp("--keep-auto", arg)) {
-                               keep_auto = 100;
-                               continue;
-                       }
-                       if (!strncmp("--keep-auto=", arg, 12)) {
-                               keep_auto = strtoul(arg + 12, NULL, 0);
-                               if (keep_auto < 20)
-                                       keep_auto = 20;
+                               unpack_limit = 0;
                                continue;
                        }
                        if (!strcmp("--thin", arg)) {
@@ -698,7 +712,7 @@ int main(int argc, char **argv)
                                verbose = 1;
                                continue;
                        }
-                       if (!strncmp("--depth=", arg, 8)) {
+                       if (!prefixcmp(arg, "--depth=")) {
                                depth = strtol(arg + 8, NULL, 0);
                                if (stat(git_path("shallow"), &st))
                                        st.st_mtime = 0;