blob: 8506030a648e5b1866b233c93de4d2cb632fd9be [file] [log] [blame]
Brandon Williamsa3d6b532018-03-14 11:31:41 -07001#include "cache.h"
2#include "builtin.h"
Junio C Hamano9bfa0f92018-05-08 15:59:15 +09003#include "exec-cmd.h"
Brandon Williamsa3d6b532018-03-14 11:31:41 -07004#include "pkt-line.h"
5#include "parse-options.h"
6#include "protocol.h"
7#include "upload-pack.h"
Brandon Williamse52449b2018-03-15 10:31:21 -07008#include "serve.h"
Brandon Williamsa3d6b532018-03-14 11:31:41 -07009
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;
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020019 int advertise_refs = 0;
20 int stateless_rpc = 0;
21 int timeout = 0;
Brandon Williamsa3d6b532018-03-14 11:31:41 -070022 struct option options[] = {
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020023 OPT_BOOL(0, "stateless-rpc", &stateless_rpc,
Brandon Williamsa3d6b532018-03-14 11:31:41 -070024 N_("quit after a single request/response exchange")),
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020025 OPT_BOOL(0, "advertise-refs", &advertise_refs,
Brandon Williamsa3d6b532018-03-14 11:31:41 -070026 N_("exit immediately after initial ref advertisement")),
27 OPT_BOOL(0, "strict", &strict,
28 N_("do not try <directory>/.git/ if <directory> is no Git directory")),
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020029 OPT_INTEGER(0, "timeout", &timeout,
Brandon Williamsa3d6b532018-03-14 11:31:41 -070030 N_("interrupt transfer after <n> seconds of inactivity")),
31 OPT_END()
32 };
33
34 packet_trace_identity("upload-pack");
Jeff King6ebd1ca2018-07-18 16:45:20 -040035 read_replace_refs = 0;
Brandon Williamsa3d6b532018-03-14 11:31:41 -070036
Jeff Kingd64db5b2019-05-09 17:28:51 -040037 argc = parse_options(argc, argv, prefix, options, upload_pack_usage, 0);
Brandon Williamsa3d6b532018-03-14 11:31:41 -070038
39 if (argc != 1)
40 usage_with_options(upload_pack_usage, options);
41
Brandon Williamsa3d6b532018-03-14 11:31:41 -070042 setup_path();
43
44 dir = argv[0];
45
46 if (!enter_repo(dir, strict))
47 die("'%s' does not appear to be a git repository", dir);
48
49 switch (determine_protocol_version_server()) {
Brandon Williams8f6982b2018-03-14 11:31:47 -070050 case protocol_v2:
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020051 if (advertise_refs)
52 protocol_v2_advertise_capabilities();
53 else
54 protocol_v2_serve_loop(stateless_rpc);
Brandon Williams8f6982b2018-03-14 11:31:47 -070055 break;
Brandon Williamsa3d6b532018-03-14 11:31:41 -070056 case protocol_v1:
57 /*
58 * v1 is just the original protocol with a version string,
59 * so just fall through after writing the version string.
60 */
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020061 if (advertise_refs || !stateless_rpc)
Brandon Williamsa3d6b532018-03-14 11:31:41 -070062 packet_write_fmt(1, "version 1\n");
63
64 /* fallthrough */
65 case protocol_v0:
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020066 upload_pack(advertise_refs, stateless_rpc, timeout);
Brandon Williamsa3d6b532018-03-14 11:31:41 -070067 break;
68 case protocol_unknown_version:
69 BUG("unknown protocol version");
70 }
71
72 return 0;
73}