smart-http: support shallow fetch/clone
[gitweb.git] / builtin / send-pack.c
index 6027ead5a9f60cf1986d0ad6aeb7dca9f776c9b5..664dd20f407dffed002d63b8dab5a83079463445 100644 (file)
@@ -10,6 +10,7 @@
 #include "quote.h"
 #include "transport.h"
 #include "version.h"
+#include "sha1-array.h"
 
 static const char send_pack_usage[] =
 "git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...]\n"
@@ -55,6 +56,11 @@ static void print_helper_status(struct ref *ref)
                        msg = "needs force";
                        break;
 
+               case REF_STATUS_REJECT_STALE:
+                       res = "error";
+                       msg = "stale info";
+                       break;
+
                case REF_STATUS_REJECT_ALREADY_EXISTS:
                        res = "error";
                        msg = "already exists";
@@ -94,7 +100,8 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
        const char *dest = NULL;
        int fd[2];
        struct child_process *conn;
-       struct extra_have_objects extra_have;
+       struct sha1_array extra_have = SHA1_ARRAY_INIT;
+       struct sha1_array shallow = SHA1_ARRAY_INIT;
        struct ref *remote_refs, *local_refs;
        int ret;
        int helper_status = 0;
@@ -178,7 +185,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
                        }
                        if (!prefixcmp(arg, "--" CAS_OPT_NAME "=")) {
                                if (parse_push_cas_option(&cas,
-                                                         strchr(arg, '=') + 1, 1) < 0)
+                                                         strchr(arg, '=') + 1, 0) < 0)
                                        exit(1);
                                continue;
                        }
@@ -202,6 +209,9 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
            (send_all && args.send_mirror))
                usage(send_pack_usage);
 
+       if (is_repository_shallow() && args.stateless_rpc)
+               die("attempt to push from a shallow repository");
+
        if (remote_name) {
                remote = remote_get(remote_name);
                if (!remote_has_url(remote, dest)) {
@@ -223,9 +233,8 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
                        args.verbose ? CONNECT_VERBOSE : 0);
        }
 
-       memset(&extra_have, 0, sizeof(extra_have));
-
-       get_remote_heads(fd[0], NULL, 0, &remote_refs, REF_NORMAL, &extra_have);
+       get_remote_heads(fd[0], NULL, 0, &remote_refs, REF_NORMAL,
+                        &extra_have, &shallow);
 
        transport_verify_remote_names(nr_refspecs, refspecs);