builtin / upload-pack.con commit Merge branch 'sg/rebase-progress' (6624e07)
   1#include "cache.h"
   2#include "builtin.h"
   3#include "exec-cmd.h"
   4#include "pkt-line.h"
   5#include "parse-options.h"
   6#include "protocol.h"
   7#include "upload-pack.h"
   8#include "serve.h"
   9
  10static const char * const upload_pack_usage[] = {
  11        N_("git upload-pack [<options>] <dir>"),
  12        NULL
  13};
  14
  15int cmd_upload_pack(int argc, const char **argv, const char *prefix)
  16{
  17        const char *dir;
  18        int strict = 0;
  19        struct upload_pack_options opts = { 0 };
  20        struct serve_options serve_opts = SERVE_OPTIONS_INIT;
  21        struct option options[] = {
  22                OPT_BOOL(0, "stateless-rpc", &opts.stateless_rpc,
  23                         N_("quit after a single request/response exchange")),
  24                OPT_BOOL(0, "advertise-refs", &opts.advertise_refs,
  25                         N_("exit immediately after initial ref advertisement")),
  26                OPT_BOOL(0, "strict", &strict,
  27                         N_("do not try <directory>/.git/ if <directory> is no Git directory")),
  28                OPT_INTEGER(0, "timeout", &opts.timeout,
  29                            N_("interrupt transfer after <n> seconds of inactivity")),
  30                OPT_END()
  31        };
  32
  33        packet_trace_identity("upload-pack");
  34        read_replace_refs = 0;
  35
  36        argc = parse_options(argc, argv, prefix, options, upload_pack_usage, 0);
  37
  38        if (argc != 1)
  39                usage_with_options(upload_pack_usage, options);
  40
  41        if (opts.timeout)
  42                opts.daemon_mode = 1;
  43
  44        setup_path();
  45
  46        dir = argv[0];
  47
  48        if (!enter_repo(dir, strict))
  49                die("'%s' does not appear to be a git repository", dir);
  50
  51        switch (determine_protocol_version_server()) {
  52        case protocol_v2:
  53                serve_opts.advertise_capabilities = opts.advertise_refs;
  54                serve_opts.stateless_rpc = opts.stateless_rpc;
  55                serve(&serve_opts);
  56                break;
  57        case protocol_v1:
  58                /*
  59                 * v1 is just the original protocol with a version string,
  60                 * so just fall through after writing the version string.
  61                 */
  62                if (opts.advertise_refs || !opts.stateless_rpc)
  63                        packet_write_fmt(1, "version 1\n");
  64
  65                /* fallthrough */
  66        case protocol_v0:
  67                upload_pack(&opts);
  68                break;
  69        case protocol_unknown_version:
  70                BUG("unknown protocol version");
  71        }
  72
  73        return 0;
  74}