blob: 125af53885f89fbd4b691f5d9463774b12a66559 [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ð Bjarmason98e2d9d2021-08-05 03:25:43 +020025 OPT_HIDDEN_BOOL(0, "http-backend-info-refs", &advertise_refs,
26 N_("serve up the info/refs for git-http-backend")),
27 OPT_ALIAS(0, "advertise-refs", "http-backend-info-refs"),
Brandon Williamsa3d6b532018-03-14 11:31:41 -070028 OPT_BOOL(0, "strict", &strict,
29 N_("do not try <directory>/.git/ if <directory> is no Git directory")),
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020030 OPT_INTEGER(0, "timeout", &timeout,
Brandon Williamsa3d6b532018-03-14 11:31:41 -070031 N_("interrupt transfer after <n> seconds of inactivity")),
32 OPT_END()
33 };
34
35 packet_trace_identity("upload-pack");
Jeff King6ebd1ca2018-07-18 16:45:20 -040036 read_replace_refs = 0;
Brandon Williamsa3d6b532018-03-14 11:31:41 -070037
Jeff Kingd64db5b2019-05-09 17:28:51 -040038 argc = parse_options(argc, argv, prefix, options, upload_pack_usage, 0);
Brandon Williamsa3d6b532018-03-14 11:31:41 -070039
40 if (argc != 1)
41 usage_with_options(upload_pack_usage, options);
42
Brandon Williamsa3d6b532018-03-14 11:31:41 -070043 setup_path();
44
45 dir = argv[0];
46
47 if (!enter_repo(dir, strict))
48 die("'%s' does not appear to be a git repository", dir);
49
50 switch (determine_protocol_version_server()) {
Brandon Williams8f6982b2018-03-14 11:31:47 -070051 case protocol_v2:
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020052 if (advertise_refs)
53 protocol_v2_advertise_capabilities();
54 else
55 protocol_v2_serve_loop(stateless_rpc);
Brandon Williams8f6982b2018-03-14 11:31:47 -070056 break;
Brandon Williamsa3d6b532018-03-14 11:31:41 -070057 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 */
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020062 if (advertise_refs || !stateless_rpc)
Brandon Williamsa3d6b532018-03-14 11:31:41 -070063 packet_write_fmt(1, "version 1\n");
64
65 /* fallthrough */
66 case protocol_v0:
Ævar Arnfjörð Bjarmasonf234da82021-08-05 03:25:42 +020067 upload_pack(advertise_refs, stateless_rpc, timeout);
Brandon Williamsa3d6b532018-03-14 11:31:41 -070068 break;
69 case protocol_unknown_version:
70 BUG("unknown protocol version");
71 }
72
73 return 0;
74}