Merge branch 'ap/cvsserver'
[gitweb.git] / receive-pack.c
index c176d8fd008ad858a1e60e19e7bf3ea14d735eb5..7311c822dd3af2c6a1cd8da47184428d5b627b3e 100644 (file)
@@ -10,6 +10,8 @@
 static const char receive_pack_usage[] = "git-receive-pack <git-dir>";
 
 static int deny_non_fast_forwards = 0;
+static int receive_unpack_limit = -1;
+static int transfer_unpack_limit = -1;
 static int unpack_limit = 100;
 static int report_status;
 
@@ -18,21 +20,22 @@ static int capabilities_sent;
 
 static int receive_pack_config(const char *var, const char *value)
 {
-       git_default_config(var, value);
-
-       if (strcmp(var, "receive.denynonfastforwards") == 0)
-       {
+       if (strcmp(var, "receive.denynonfastforwards") == 0) {
                deny_non_fast_forwards = git_config_bool(var, value);
                return 0;
        }
 
-       if (strcmp(var, "receive.unpacklimit") == 0)
-       {
-               unpack_limit = git_config_int(var, value);
+       if (strcmp(var, "receive.unpacklimit") == 0) {
+               receive_unpack_limit = git_config_int(var, value);
                return 0;
        }
 
-       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 int show_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
@@ -250,20 +253,22 @@ static void read_head_info(void)
 
 static const char *parse_pack_header(struct pack_header *hdr)
 {
-       char *c = (char*)hdr;
-       ssize_t remaining = sizeof(struct pack_header);
-       do {
-               ssize_t r = xread(0, c, remaining);
-               if (r <= 0)
-                       return "eof before pack header was fully read";
-               remaining -= r;
-               c += r;
-       } while (remaining > 0);
-       if (hdr->hdr_signature != htonl(PACK_SIGNATURE))
+       switch (read_pack_header(0, hdr)) {
+       case PH_ERROR_EOF:
+               return "eof before pack header was fully read";
+
+       case PH_ERROR_PACK_SIGNATURE:
                return "protocol error (pack signature mismatch detected)";
-       if (!pack_version_ok(hdr->hdr_version))
+
+       case PH_ERROR_PROTOCOL:
                return "protocol error (pack version unsupported)";
-       return NULL;
+
+       default:
+               return "unknown error in parse_pack_header";
+
+       case 0:
+               return NULL;
+       }
 }
 
 static const char *pack_lockfile;
@@ -421,11 +426,16 @@ int main(int argc, char **argv)
        if (!enter_repo(dir, 0))
                die("'%s': unable to chdir or not a git archive", dir);
 
-       setup_ident();
-       /* don't die if gecos is empty */
-       ignore_missing_committer_name();
+       if (is_repository_shallow())
+               die("attempt to push into a shallow repository");
+
        git_config(receive_pack_config);
 
+       if (0 <= transfer_unpack_limit)
+               unpack_limit = transfer_unpack_limit;
+       else if (0 <= receive_unpack_limit)
+               unpack_limit = receive_unpack_limit;
+
        write_head_info();
 
        /* EOF */