]> git.ipfire.org Git - thirdparty/git.git/blame - builtin/receive-pack.c
Merge branch 'pb/ref-filter-with-crlf'
[thirdparty/git.git] / builtin / receive-pack.c
CommitLineData
1e4cd68c 1#include "builtin.h"
a49d2834 2#include "repository.h"
b2141fc1 3#include "config.h"
697cc8ef 4#include "lockfile.h"
fc04c412 5#include "pack.h"
8a65ff76 6#include "refs.h"
f3a3214e 7#include "pkt-line.h"
38a81b4e 8#include "sideband.h"
b1bf95bb 9#include "run-command.h"
d807c4a0 10#include "exec-cmd.h"
11031d7e
JS
11#include "commit.h"
12#include "object.h"
d79796bc 13#include "remote.h"
47a59185 14#include "connect.h"
da3efdb1 15#include "string-list.h"
fe299ec5 16#include "oid-array.h"
52fed6e1 17#include "connected.h"
dbbcd44f 18#include "strvec.h"
ff5effdf 19#include "version.h"
d05b9618
JH
20#include "tag.h"
21#include "gpg-interface.h"
ec7dbd14 22#include "sigchain.h"
5d477a33 23#include "fsck.h"
722ff7f8 24#include "tmp-objdir.h"
ab6eea6f 25#include "oidset.h"
3836d88a 26#include "packfile.h"
cbd53a21 27#include "object-store.h"
aa9bab29 28#include "protocol.h"
64043556 29#include "commit-reach.h"
4ef34648 30#include "worktree.h"
120ad2b0 31#include "shallow.h"
575f4974 32
1b68387e
SS
33static const char * const receive_pack_usage[] = {
34 N_("git receive-pack <git-dir>"),
35 NULL
36};
575f4974 37
986e8239 38enum deny_action {
3d95d92b 39 DENY_UNCONFIGURED,
986e8239
JK
40 DENY_IGNORE,
41 DENY_WARN,
1404bcbb
JS
42 DENY_REFUSE,
43 DENY_UPDATE_INSTEAD
986e8239
JK
44};
45
1b53a076
JH
46static int deny_deletes;
47static int deny_non_fast_forwards;
3d95d92b 48static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
747ca245 49static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
dab76d3a
JH
50static int receive_fsck_objects = -1;
51static int transfer_fsck_objects = -1;
5d477a33 52static struct strbuf fsck_msg_types = STRBUF_INIT;
e28714c5
JH
53static int receive_unpack_limit = -1;
54static int transfer_unpack_limit = -1;
1b70fe5d 55static int advertise_atomic_push = 1;
c714e45f 56static int advertise_push_options;
46732fae 57static int unpack_limit = 100;
c08db5a2 58static off_t max_input_size;
96f1e58f 59static int report_status;
63518a57 60static int report_status_v2;
38a81b4e 61static int use_sideband;
68deed29 62static int use_atomic;
c714e45f 63static int use_push_options;
c207e34f 64static int quiet;
b74fce16 65static int prefer_ofs_delta = 1;
77e3efbf
JH
66static int auto_update_server_info;
67static int auto_gc = 1;
1b68387e 68static int reject_thin;
5732373d
JH
69static int stateless_rpc;
70static const char *service_dir;
747ca245 71static const char *head_name;
96ec7b1e 72static void *head_name_to_free;
185c04e0 73static int sent_capabilities;
0a1bc12b 74static int shallow_update;
5dbd7676 75static const char *alt_shallow_file;
a85b377d 76static struct strbuf push_cert = STRBUF_INIT;
a09c985e 77static struct object_id push_cert_oid;
d05b9618 78static struct signature_check sigcheck;
b89363e4
JH
79static const char *push_cert_nonce;
80static const char *cert_nonce_seed;
81
82static const char *NONCE_UNSOLICITED = "UNSOLICITED";
83static const char *NONCE_BAD = "BAD";
84static const char *NONCE_MISSING = "MISSING";
85static const char *NONCE_OK = "OK";
5732373d 86static const char *NONCE_SLOP = "SLOP";
b89363e4 87static const char *nonce_status;
5732373d 88static long nonce_stamp_slop;
dddbad72 89static timestamp_t nonce_stamp_slop_limit;
222368c6 90static struct ref_transaction *transaction;
cfee10a7 91
83558686
JK
92static enum {
93 KEEPALIVE_NEVER = 0,
94 KEEPALIVE_AFTER_NUL,
95 KEEPALIVE_ALWAYS
96} use_keepalive;
97static int keepalive_in_sec = 5;
98
722ff7f8
JK
99static struct tmp_objdir *tmp_objdir;
100
31e8595a
JX
101static struct proc_receive_ref {
102 unsigned int want_add:1,
103 want_delete:1,
104 want_modify:1,
105 negative_ref:1;
106 char *ref_prefix;
107 struct proc_receive_ref *next;
108} *proc_receive_ref;
109
110static void proc_receive_ref_append(const char *prefix);
111
986e8239
JK
112static enum deny_action parse_deny_action(const char *var, const char *value)
113{
114 if (value) {
115 if (!strcasecmp(value, "ignore"))
116 return DENY_IGNORE;
117 if (!strcasecmp(value, "warn"))
118 return DENY_WARN;
119 if (!strcasecmp(value, "refuse"))
120 return DENY_REFUSE;
1404bcbb
JS
121 if (!strcasecmp(value, "updateinstead"))
122 return DENY_UPDATE_INSTEAD;
986e8239
JK
123 }
124 if (git_config_bool(var, value))
125 return DENY_REFUSE;
126 return DENY_IGNORE;
127}
128
ef90d6d4 129static int receive_pack_config(const char *var, const char *value, void *cb)
6fb75bed 130{
daebaa78
JH
131 int status = parse_hide_refs_config(var, value, "receive");
132
133 if (status)
134 return status;
135
a240de11
JK
136 if (strcmp(var, "receive.denydeletes") == 0) {
137 deny_deletes = git_config_bool(var, value);
138 return 0;
139 }
140
e28714c5 141 if (strcmp(var, "receive.denynonfastforwards") == 0) {
6fb75bed
SP
142 deny_non_fast_forwards = git_config_bool(var, value);
143 return 0;
144 }
145
e28714c5
JH
146 if (strcmp(var, "receive.unpacklimit") == 0) {
147 receive_unpack_limit = git_config_int(var, value);
fc04c412
SP
148 return 0;
149 }
150
e28714c5
JH
151 if (strcmp(var, "transfer.unpacklimit") == 0) {
152 transfer_unpack_limit = git_config_int(var, value);
153 return 0;
154 }
155
cd94c6f9
JS
156 if (strcmp(var, "receive.fsck.skiplist") == 0) {
157 const char *path;
158
159 if (git_config_pathname(&path, var, value))
160 return 1;
161 strbuf_addf(&fsck_msg_types, "%cskiplist=%s",
162 fsck_msg_types.len ? ',' : '=', path);
163 free((char *)path);
164 return 0;
165 }
166
5d477a33
JS
167 if (skip_prefix(var, "receive.fsck.", &var)) {
168 if (is_valid_msg_type(var, value))
169 strbuf_addf(&fsck_msg_types, "%c%s=%s",
170 fsck_msg_types.len ? ',' : '=', var, value);
171 else
172 warning("Skipping unknown msg id '%s'", var);
173 return 0;
174 }
175
20dc0016
MK
176 if (strcmp(var, "receive.fsckobjects") == 0) {
177 receive_fsck_objects = git_config_bool(var, value);
178 return 0;
179 }
180
dab76d3a
JH
181 if (strcmp(var, "transfer.fsckobjects") == 0) {
182 transfer_fsck_objects = git_config_bool(var, value);
183 return 0;
184 }
185
986e8239
JK
186 if (!strcmp(var, "receive.denycurrentbranch")) {
187 deny_current_branch = parse_deny_action(var, value);
188 return 0;
189 }
190
747ca245
JH
191 if (strcmp(var, "receive.denydeletecurrent") == 0) {
192 deny_delete_current = parse_deny_action(var, value);
193 return 0;
194 }
195
b74fce16
NP
196 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
197 prefer_ofs_delta = git_config_bool(var, value);
198 return 0;
199 }
200
77e3efbf
JH
201 if (strcmp(var, "receive.updateserverinfo") == 0) {
202 auto_update_server_info = git_config_bool(var, value);
203 return 0;
204 }
205
206 if (strcmp(var, "receive.autogc") == 0) {
207 auto_gc = git_config_bool(var, value);
208 return 0;
209 }
210
0a1bc12b
NTND
211 if (strcmp(var, "receive.shallowupdate") == 0) {
212 shallow_update = git_config_bool(var, value);
213 return 0;
214 }
215
b89363e4
JH
216 if (strcmp(var, "receive.certnonceseed") == 0)
217 return git_config_string(&cert_nonce_seed, var, value);
a85b377d 218
5732373d
JH
219 if (strcmp(var, "receive.certnonceslop") == 0) {
220 nonce_stamp_slop_limit = git_config_ulong(var, value);
221 return 0;
222 }
223
1b70fe5d
RS
224 if (strcmp(var, "receive.advertiseatomic") == 0) {
225 advertise_atomic_push = git_config_bool(var, value);
226 return 0;
227 }
228
c714e45f
SB
229 if (strcmp(var, "receive.advertisepushoptions") == 0) {
230 advertise_push_options = git_config_bool(var, value);
231 return 0;
232 }
233
83558686
JK
234 if (strcmp(var, "receive.keepalive") == 0) {
235 keepalive_in_sec = git_config_int(var, value);
236 return 0;
237 }
238
c08db5a2
JK
239 if (strcmp(var, "receive.maxinputsize") == 0) {
240 max_input_size = git_config_int64(var, value);
241 return 0;
242 }
243
31e8595a
JX
244 if (strcmp(var, "receive.procreceiverefs") == 0) {
245 if (!value)
246 return config_error_nonbool(var);
247 proc_receive_ref_append(value);
248 return 0;
249 }
250
ef90d6d4 251 return git_default_config(var, value, cb);
6fb75bed
SP
252}
253
1b7ba794 254static void show_ref(const char *path, const struct object_id *oid)
575f4974 255{
52d2ae58 256 if (sent_capabilities) {
1b7ba794 257 packet_write_fmt(1, "%s %s\n", oid_to_hex(oid), path);
52d2ae58
JH
258 } else {
259 struct strbuf cap = STRBUF_INIT;
260
261 strbuf_addstr(&cap,
63518a57 262 "report-status report-status-v2 delete-refs side-band-64k quiet");
1b70fe5d
RS
263 if (advertise_atomic_push)
264 strbuf_addstr(&cap, " atomic");
52d2ae58
JH
265 if (prefer_ofs_delta)
266 strbuf_addstr(&cap, " ofs-delta");
b89363e4
JH
267 if (push_cert_nonce)
268 strbuf_addf(&cap, " push-cert=%s", push_cert_nonce);
c714e45f
SB
269 if (advertise_push_options)
270 strbuf_addstr(&cap, " push-options");
bf30dbf8 271 strbuf_addf(&cap, " object-format=%s", the_hash_algo->name);
52d2ae58 272 strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
81c634e9 273 packet_write_fmt(1, "%s %s%c%s\n",
1b7ba794 274 oid_to_hex(oid), path, 0, cap.buf);
52d2ae58
JH
275 strbuf_release(&cap);
276 sent_capabilities = 1;
277 }
575f4974
LT
278}
279
78a766ab 280static int show_ref_cb(const char *path_full, const struct object_id *oid,
8b24b9e7 281 int flag, void *data)
6b01ecfe 282{
8b24b9e7 283 struct oidset *seen = data;
78a766ab
LF
284 const char *path = strip_namespace(path_full);
285
286 if (ref_is_hidden(path, path_full))
287 return 0;
288
6b01ecfe
JT
289 /*
290 * Advertise refs outside our current namespace as ".have"
291 * refs, so that the client can use them to minimize data
fea6c47f 292 * transfer but will otherwise ignore them.
6b01ecfe 293 */
8b24b9e7
JK
294 if (!path) {
295 if (oidset_insert(seen, oid))
296 return 0;
6b01ecfe 297 path = ".have";
63d428e6
JK
298 } else {
299 oidset_insert(seen, oid);
8b24b9e7 300 }
1b7ba794 301 show_ref(path, oid);
bc98201d 302 return 0;
6b01ecfe
JT
303}
304
bdf4276c 305static void show_one_alternate_ref(const struct object_id *oid,
ab6eea6f 306 void *data)
b7a025d9 307{
ab6eea6f 308 struct oidset *seen = data;
b7a025d9 309
ab6eea6f
JK
310 if (oidset_insert(seen, oid))
311 return;
312
1b7ba794 313 show_ref(".have", oid);
6b01ecfe
JT
314}
315
8a65ff76 316static void write_head_info(void)
575f4974 317{
ab6eea6f 318 static struct oidset seen = OIDSET_INIT;
2b2a5be3 319
63d428e6 320 for_each_ref(show_ref_cb, &seen);
ab6eea6f
JK
321 for_each_alternate_ref(show_one_alternate_ref, &seen);
322 oidset_clear(&seen);
185c04e0 323 if (!sent_capabilities)
1b7ba794 324 show_ref("capabilities^{}", &null_oid);
cfee10a7 325
ad491366
NTND
326 advertise_shallow_grafts(1);
327
b7a025d9
MH
328 /* EOF */
329 packet_flush(1);
575f4974
LT
330}
331
15d3af5e
JX
332#define RUN_PROC_RECEIVE_SCHEDULED 1
333#define RUN_PROC_RECEIVE_RETURNED 2
eb1af2df
LT
334struct command {
335 struct command *next;
cfee10a7 336 const char *error_string;
15d3af5e 337 struct ref_push_report *report;
160b81ed 338 unsigned int skip_update:1,
15d3af5e
JX
339 did_not_exist:1,
340 run_proc_receive:2;
5dbd7676 341 int index;
9c44ea44 342 struct object_id old_oid;
343 struct object_id new_oid;
8f1d2e6f 344 char ref_name[FLEX_ARRAY]; /* more */
575f4974
LT
345};
346
31e8595a
JX
347static void proc_receive_ref_append(const char *prefix)
348{
349 struct proc_receive_ref *ref_pattern;
350 char *p;
351 int len;
352
353 ref_pattern = xcalloc(1, sizeof(struct proc_receive_ref));
354 p = strchr(prefix, ':');
355 if (p) {
356 while (prefix < p) {
357 if (*prefix == 'a')
358 ref_pattern->want_add = 1;
359 else if (*prefix == 'd')
360 ref_pattern->want_delete = 1;
361 else if (*prefix == 'm')
362 ref_pattern->want_modify = 1;
363 else if (*prefix == '!')
364 ref_pattern->negative_ref = 1;
365 prefix++;
366 }
367 prefix++;
368 } else {
369 ref_pattern->want_add = 1;
370 ref_pattern->want_delete = 1;
371 ref_pattern->want_modify = 1;
372 }
373 len = strlen(prefix);
374 while (len && prefix[len - 1] == '/')
375 len--;
376 ref_pattern->ref_prefix = xmemdupz(prefix, len);
377 if (!proc_receive_ref) {
378 proc_receive_ref = ref_pattern;
379 } else {
380 struct proc_receive_ref *end;
381
382 end = proc_receive_ref;
383 while (end->next)
384 end = end->next;
385 end->next = ref_pattern;
386 }
387}
388
389static int proc_receive_ref_matches(struct command *cmd)
390{
391 struct proc_receive_ref *p;
392
393 if (!proc_receive_ref)
394 return 0;
395
396 for (p = proc_receive_ref; p; p = p->next) {
397 const char *match = p->ref_prefix;
398 const char *remains;
399
400 if (!p->want_add && is_null_oid(&cmd->old_oid))
401 continue;
402 else if (!p->want_delete && is_null_oid(&cmd->new_oid))
403 continue;
404 else if (!p->want_modify &&
405 !is_null_oid(&cmd->old_oid) &&
406 !is_null_oid(&cmd->new_oid))
407 continue;
408
409 if (skip_prefix(cmd->ref_name, match, &remains) &&
410 (!*remains || *remains == '/')) {
411 if (!p->negative_ref)
412 return 1;
413 } else if (p->negative_ref) {
414 return 1;
415 }
416 }
417 return 0;
418}
419
466dbc42
SP
420static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
421static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
422
423static void report_message(const char *prefix, const char *err, va_list params)
424{
b7115a35 425 int sz;
466dbc42
SP
426 char msg[4096];
427
b7115a35 428 sz = xsnprintf(msg, sizeof(msg), "%s", prefix);
466dbc42
SP
429 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
430 if (sz > (sizeof(msg) - 1))
431 sz = sizeof(msg) - 1;
432 msg[sz++] = '\n';
433
434 if (use_sideband)
435 send_sideband(1, 2, msg, sz, use_sideband);
436 else
437 xwrite(2, msg, sz);
438}
439
440static void rp_warning(const char *err, ...)
441{
442 va_list params;
443 va_start(params, err);
444 report_message("warning: ", err, params);
445 va_end(params);
446}
447
448static void rp_error(const char *err, ...)
449{
450 va_list params;
451 va_start(params, err);
452 report_message("error: ", err, params);
453 va_end(params);
454}
455
6d525d38
SP
456static int copy_to_sideband(int in, int out, void *arg)
457{
458 char data[128];
83558686
JK
459 int keepalive_active = 0;
460
461 if (keepalive_in_sec <= 0)
462 use_keepalive = KEEPALIVE_NEVER;
463 if (use_keepalive == KEEPALIVE_ALWAYS)
464 keepalive_active = 1;
465
6d525d38 466 while (1) {
83558686
JK
467 ssize_t sz;
468
469 if (keepalive_active) {
470 struct pollfd pfd;
471 int ret;
472
473 pfd.fd = in;
474 pfd.events = POLLIN;
475 ret = poll(&pfd, 1, 1000 * keepalive_in_sec);
476
477 if (ret < 0) {
478 if (errno == EINTR)
479 continue;
480 else
481 break;
482 } else if (ret == 0) {
483 /* no data; send a keepalive packet */
484 static const char buf[] = "0005\1";
485 write_or_die(1, buf, sizeof(buf) - 1);
486 continue;
487 } /* else there is actual data to read */
488 }
489
490 sz = xread(in, data, sizeof(data));
6d525d38
SP
491 if (sz <= 0)
492 break;
83558686
JK
493
494 if (use_keepalive == KEEPALIVE_AFTER_NUL && !keepalive_active) {
495 const char *p = memchr(data, '\0', sz);
496 if (p) {
497 /*
498 * The NUL tells us to start sending keepalives. Make
499 * sure we send any other data we read along
500 * with it.
501 */
502 keepalive_active = 1;
503 send_sideband(1, 2, data, p - data, use_sideband);
504 send_sideband(1, 2, p + 1, sz - (p - data + 1), use_sideband);
505 continue;
506 }
507 }
508
509 /*
510 * Either we're not looking for a NUL signal, or we didn't see
511 * it yet; just pass along the data.
512 */
6d525d38
SP
513 send_sideband(1, 2, data, sz, use_sideband);
514 }
515 close(in);
516 return 0;
517}
518
3013118e 519static void hmac_hash(unsigned char *out,
b89363e4
JH
520 const char *key_in, size_t key_len,
521 const char *text, size_t text_len)
522{
fabec2c5 523 unsigned char key[GIT_MAX_BLKSZ];
524 unsigned char k_ipad[GIT_MAX_BLKSZ];
525 unsigned char k_opad[GIT_MAX_BLKSZ];
b89363e4 526 int i;
fabec2c5 527 git_hash_ctx ctx;
b89363e4
JH
528
529 /* RFC 2104 2. (1) */
fabec2c5 530 memset(key, '\0', GIT_MAX_BLKSZ);
531 if (the_hash_algo->blksz < key_len) {
532 the_hash_algo->init_fn(&ctx);
533 the_hash_algo->update_fn(&ctx, key_in, key_len);
534 the_hash_algo->final_fn(key, &ctx);
b89363e4
JH
535 } else {
536 memcpy(key, key_in, key_len);
537 }
538
539 /* RFC 2104 2. (2) & (5) */
540 for (i = 0; i < sizeof(key); i++) {
541 k_ipad[i] = key[i] ^ 0x36;
542 k_opad[i] = key[i] ^ 0x5c;
543 }
544
545 /* RFC 2104 2. (3) & (4) */
fabec2c5 546 the_hash_algo->init_fn(&ctx);
547 the_hash_algo->update_fn(&ctx, k_ipad, sizeof(k_ipad));
548 the_hash_algo->update_fn(&ctx, text, text_len);
549 the_hash_algo->final_fn(out, &ctx);
b89363e4
JH
550
551 /* RFC 2104 2. (6) & (7) */
fabec2c5 552 the_hash_algo->init_fn(&ctx);
553 the_hash_algo->update_fn(&ctx, k_opad, sizeof(k_opad));
554 the_hash_algo->update_fn(&ctx, out, the_hash_algo->rawsz);
555 the_hash_algo->final_fn(out, &ctx);
b89363e4
JH
556}
557
dddbad72 558static char *prepare_push_cert_nonce(const char *path, timestamp_t stamp)
b89363e4
JH
559{
560 struct strbuf buf = STRBUF_INIT;
fabec2c5 561 unsigned char hash[GIT_MAX_RAWSZ];
b89363e4 562
cb71f8bd 563 strbuf_addf(&buf, "%s:%"PRItime, path, stamp);
3013118e 564 hmac_hash(hash, buf.buf, buf.len, cert_nonce_seed, strlen(cert_nonce_seed));
b89363e4
JH
565 strbuf_release(&buf);
566
3013118e 567 /* RFC 2104 5. HMAC-SHA1 or HMAC-SHA256 */
fc06be3b 568 strbuf_addf(&buf, "%"PRItime"-%.*s", stamp, (int)the_hash_algo->hexsz, hash_to_hex(hash));
b89363e4
JH
569 return strbuf_detach(&buf, NULL);
570}
571
572/*
573 * NEEDSWORK: reuse find_commit_header() from jk/commit-author-parsing
574 * after dropping "_commit" from its name and possibly moving it out
575 * of commit.c
576 */
cbaf82cc
JT
577static char *find_header(const char *msg, size_t len, const char *key,
578 const char **next_line)
b89363e4
JH
579{
580 int key_len = strlen(key);
581 const char *line = msg;
582
583 while (line && line < msg + len) {
584 const char *eol = strchrnul(line, '\n');
585
586 if ((msg + len <= eol) || line == eol)
587 return NULL;
588 if (line + key_len < eol &&
589 !memcmp(line, key, key_len) && line[key_len] == ' ') {
590 int offset = key_len + 1;
cbaf82cc
JT
591 if (next_line)
592 *next_line = *eol ? eol + 1 : eol;
b89363e4
JH
593 return xmemdupz(line + offset, (eol - line) - offset);
594 }
595 line = *eol ? eol + 1 : NULL;
596 }
597 return NULL;
598}
599
edc6dccf 600/*
601 * Return zero if a and b are equal up to n bytes and nonzero if they are not.
602 * This operation is guaranteed to run in constant time to avoid leaking data.
603 */
604static int constant_memequal(const char *a, const char *b, size_t n)
605{
606 int res = 0;
719483e5
JH
607 size_t i;
608
609 for (i = 0; i < n; i++)
edc6dccf 610 res |= a[i] ^ b[i];
611 return res;
612}
613
b89363e4
JH
614static const char *check_nonce(const char *buf, size_t len)
615{
cbaf82cc 616 char *nonce = find_header(buf, len, "nonce", NULL);
dddbad72 617 timestamp_t stamp, ostamp;
5732373d 618 char *bohmac, *expect = NULL;
b89363e4 619 const char *retval = NONCE_BAD;
edc6dccf 620 size_t noncelen;
b89363e4
JH
621
622 if (!nonce) {
623 retval = NONCE_MISSING;
624 goto leave;
625 } else if (!push_cert_nonce) {
626 retval = NONCE_UNSOLICITED;
627 goto leave;
628 } else if (!strcmp(push_cert_nonce, nonce)) {
629 retval = NONCE_OK;
630 goto leave;
631 }
632
5732373d
JH
633 if (!stateless_rpc) {
634 /* returned nonce MUST match what we gave out earlier */
635 retval = NONCE_BAD;
636 goto leave;
637 }
638
639 /*
640 * In stateless mode, we may be receiving a nonce issued by
641 * another instance of the server that serving the same
642 * repository, and the timestamps may not match, but the
643 * nonce-seed and dir should match, so we can recompute and
644 * report the time slop.
645 *
646 * In addition, when a nonce issued by another instance has
647 * timestamp within receive.certnonceslop seconds, we pretend
648 * as if we issued that nonce when reporting to the hook.
649 */
650
651 /* nonce is concat(<seconds-since-epoch>, "-", <hmac>) */
652 if (*nonce <= '0' || '9' < *nonce) {
653 retval = NONCE_BAD;
654 goto leave;
655 }
1aeb7e75 656 stamp = parse_timestamp(nonce, &bohmac, 10);
5732373d
JH
657 if (bohmac == nonce || bohmac[0] != '-') {
658 retval = NONCE_BAD;
659 goto leave;
660 }
661
edc6dccf 662 noncelen = strlen(nonce);
5732373d 663 expect = prepare_push_cert_nonce(service_dir, stamp);
edc6dccf 664 if (noncelen != strlen(expect)) {
665 /* This is not even the right size. */
666 retval = NONCE_BAD;
667 goto leave;
668 }
669 if (constant_memequal(expect, nonce, noncelen)) {
5732373d
JH
670 /* Not what we would have signed earlier */
671 retval = NONCE_BAD;
672 goto leave;
673 }
674
675 /*
676 * By how many seconds is this nonce stale? Negative value
677 * would mean it was issued by another server with its clock
678 * skewed in the future.
679 */
1aeb7e75 680 ostamp = parse_timestamp(push_cert_nonce, NULL, 10);
5732373d
JH
681 nonce_stamp_slop = (long)ostamp - (long)stamp;
682
683 if (nonce_stamp_slop_limit &&
31a8aa1e 684 labs(nonce_stamp_slop) <= nonce_stamp_slop_limit) {
5732373d
JH
685 /*
686 * Pretend as if the received nonce (which passes the
687 * HMAC check, so it is not a forged by third-party)
688 * is what we issued.
689 */
690 free((void *)push_cert_nonce);
691 push_cert_nonce = xstrdup(nonce);
692 retval = NONCE_OK;
693 } else {
694 retval = NONCE_SLOP;
695 }
b89363e4
JH
696
697leave:
698 free(nonce);
5732373d 699 free(expect);
b89363e4
JH
700 return retval;
701}
702
cbaf82cc
JT
703/*
704 * Return 1 if there is no push_cert or if the push options in push_cert are
705 * the same as those in the argument; 0 otherwise.
706 */
707static int check_cert_push_options(const struct string_list *push_options)
708{
709 const char *buf = push_cert.buf;
710 int len = push_cert.len;
711
712 char *option;
713 const char *next_line;
714 int options_seen = 0;
715
716 int retval = 1;
717
718 if (!len)
719 return 1;
720
721 while ((option = find_header(buf, len, "push-option", &next_line))) {
722 len -= (next_line - buf);
723 buf = next_line;
724 options_seen++;
725 if (options_seen > push_options->nr
726 || strcmp(option,
727 push_options->items[options_seen - 1].string)) {
728 retval = 0;
729 goto leave;
730 }
731 free(option);
732 }
733
734 if (options_seen != push_options->nr)
735 retval = 0;
736
737leave:
738 free(option);
739 return retval;
740}
741
a85b377d
JH
742static void prepare_push_cert_sha1(struct child_process *proc)
743{
744 static int already_done;
a85b377d
JH
745
746 if (!push_cert.len)
747 return;
748
749 if (!already_done) {
d05b9618
JH
750 int bogs /* beginning_of_gpg_sig */;
751
a85b377d 752 already_done = 1;
a09c985e
PO
753 if (write_object_file(push_cert.buf, push_cert.len, "blob",
754 &push_cert_oid))
755 oidclr(&push_cert_oid);
d05b9618
JH
756
757 memset(&sigcheck, '\0', sizeof(sigcheck));
d05b9618
JH
758
759 bogs = parse_signature(push_cert.buf, push_cert.len);
3b9291e1
HS
760 check_signature(push_cert.buf, bogs, push_cert.buf + bogs,
761 push_cert.len - bogs, &sigcheck);
d05b9618 762
b89363e4 763 nonce_status = check_nonce(push_cert.buf, bogs);
a85b377d 764 }
a09c985e 765 if (!is_null_oid(&push_cert_oid)) {
22f9b7f3 766 strvec_pushf(&proc->env_array, "GIT_PUSH_CERT=%s",
f6d8942b 767 oid_to_hex(&push_cert_oid));
22f9b7f3 768 strvec_pushf(&proc->env_array, "GIT_PUSH_CERT_SIGNER=%s",
f6d8942b 769 sigcheck.signer ? sigcheck.signer : "");
22f9b7f3 770 strvec_pushf(&proc->env_array, "GIT_PUSH_CERT_KEY=%s",
f6d8942b 771 sigcheck.key ? sigcheck.key : "");
22f9b7f3 772 strvec_pushf(&proc->env_array, "GIT_PUSH_CERT_STATUS=%c",
f6d8942b 773 sigcheck.result);
b89363e4 774 if (push_cert_nonce) {
22f9b7f3 775 strvec_pushf(&proc->env_array,
f6d8942b
JK
776 "GIT_PUSH_CERT_NONCE=%s",
777 push_cert_nonce);
22f9b7f3 778 strvec_pushf(&proc->env_array,
f6d8942b
JK
779 "GIT_PUSH_CERT_NONCE_STATUS=%s",
780 nonce_status);
5732373d 781 if (nonce_status == NONCE_SLOP)
22f9b7f3 782 strvec_pushf(&proc->env_array,
f6d8942b
JK
783 "GIT_PUSH_CERT_NONCE_SLOP=%ld",
784 nonce_stamp_slop);
b89363e4 785 }
a85b377d
JH
786 }
787}
788
77a9745d
SB
789struct receive_hook_feed_state {
790 struct command *cmd;
195d6eae 791 struct ref_push_report *report;
77a9745d
SB
792 int skip_broken;
793 struct strbuf buf;
794 const struct string_list *push_options;
795};
796
9684e44a 797typedef int (*feed_fn)(void *, const char **, size_t *);
77a9745d
SB
798static int run_and_feed_hook(const char *hook_name, feed_fn feed,
799 struct receive_hook_feed_state *feed_state)
b1bf95bb 800{
d3180279 801 struct child_process proc = CHILD_PROCESS_INIT;
6d525d38 802 struct async muxer;
f43cd49f 803 const char *argv[2];
9684e44a 804 int code;
b1bf95bb 805
5a7da2dc
AS
806 argv[0] = find_hook(hook_name);
807 if (!argv[0])
b1bf95bb 808 return 0;
c8dd2771 809
f43cd49f
SP
810 argv[1] = NULL;
811
f43cd49f
SP
812 proc.argv = argv;
813 proc.in = -1;
814 proc.stdout_to_stderr = 1;
6206286e
JH
815 proc.trace2_hook_name = hook_name;
816
77a9745d
SB
817 if (feed_state->push_options) {
818 int i;
819 for (i = 0; i < feed_state->push_options->nr; i++)
22f9b7f3 820 strvec_pushf(&proc.env_array,
f6d8942b
JK
821 "GIT_PUSH_OPTION_%d=%s", i,
822 feed_state->push_options->items[i].string);
22f9b7f3 823 strvec_pushf(&proc.env_array, "GIT_PUSH_OPTION_COUNT=%d",
f6d8942b 824 feed_state->push_options->nr);
77a9745d 825 } else
22f9b7f3 826 strvec_pushf(&proc.env_array, "GIT_PUSH_OPTION_COUNT");
f43cd49f 827
722ff7f8 828 if (tmp_objdir)
22f9b7f3 829 strvec_pushv(&proc.env_array, tmp_objdir_env(tmp_objdir));
722ff7f8 830
6d525d38
SP
831 if (use_sideband) {
832 memset(&muxer, 0, sizeof(muxer));
833 muxer.proc = copy_to_sideband;
834 muxer.in = -1;
835 code = start_async(&muxer);
836 if (code)
837 return code;
838 proc.err = muxer.in;
839 }
840
5d222c09
RS
841 prepare_push_cert_sha1(&proc);
842
f43cd49f 843 code = start_command(&proc);
6d525d38
SP
844 if (code) {
845 if (use_sideband)
846 finish_async(&muxer);
90e41a89 847 return code;
6d525d38
SP
848 }
849
ec7dbd14
JH
850 sigchain_push(SIGPIPE, SIG_IGN);
851
9684e44a
JH
852 while (1) {
853 const char *buf;
854 size_t n;
855 if (feed(feed_state, &buf, &n))
856 break;
06f46f23 857 if (write_in_full(proc.in, buf, n) < 0)
9684e44a 858 break;
c8dd2771 859 }
e72ae288 860 close(proc.in);
6d525d38
SP
861 if (use_sideband)
862 finish_async(&muxer);
ec7dbd14
JH
863
864 sigchain_pop(SIGPIPE);
865
90e41a89 866 return finish_command(&proc);
b1bf95bb
JW
867}
868
9684e44a
JH
869static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
870{
871 struct receive_hook_feed_state *state = state_;
872 struct command *cmd = state->cmd;
873
cdc2b2f3
JH
874 while (cmd &&
875 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
9684e44a
JH
876 cmd = cmd->next;
877 if (!cmd)
878 return -1; /* EOF */
195d6eae
JX
879 if (!bufp)
880 return 0; /* OK, can feed something. */
9684e44a 881 strbuf_reset(&state->buf);
195d6eae
JX
882 if (!state->report)
883 state->report = cmd->report;
884 if (state->report) {
885 struct object_id *old_oid;
886 struct object_id *new_oid;
887 const char *ref_name;
888
889 old_oid = state->report->old_oid ? state->report->old_oid : &cmd->old_oid;
890 new_oid = state->report->new_oid ? state->report->new_oid : &cmd->new_oid;
891 ref_name = state->report->ref_name ? state->report->ref_name : cmd->ref_name;
892 strbuf_addf(&state->buf, "%s %s %s\n",
893 oid_to_hex(old_oid), oid_to_hex(new_oid),
894 ref_name);
895 state->report = state->report->next;
896 if (!state->report)
897 state->cmd = cmd->next;
898 } else {
899 strbuf_addf(&state->buf, "%s %s %s\n",
900 oid_to_hex(&cmd->old_oid), oid_to_hex(&cmd->new_oid),
901 cmd->ref_name);
902 state->cmd = cmd->next;
903 }
9684e44a
JH
904 if (bufp) {
905 *bufp = state->buf.buf;
906 *sizep = state->buf.len;
907 }
908 return 0;
909}
910
77a9745d
SB
911static int run_receive_hook(struct command *commands,
912 const char *hook_name,
913 int skip_broken,
914 const struct string_list *push_options)
9684e44a
JH
915{
916 struct receive_hook_feed_state state;
917 int status;
918
919 strbuf_init(&state.buf, 0);
920 state.cmd = commands;
cdc2b2f3 921 state.skip_broken = skip_broken;
195d6eae 922 state.report = NULL;
9684e44a
JH
923 if (feed_receive_hook(&state, NULL, NULL))
924 return 0;
925 state.cmd = commands;
77a9745d 926 state.push_options = push_options;
9684e44a
JH
927 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
928 strbuf_release(&state.buf);
929 return status;
930}
931
1d9e8b56
SP
932static int run_update_hook(struct command *cmd)
933{
1d9e8b56 934 const char *argv[5];
d3180279 935 struct child_process proc = CHILD_PROCESS_INIT;
6d525d38 936 int code;
1d9e8b56 937
5a7da2dc
AS
938 argv[0] = find_hook("update");
939 if (!argv[0])
1d9e8b56
SP
940 return 0;
941
1d9e8b56 942 argv[1] = cmd->ref_name;
9c44ea44 943 argv[2] = oid_to_hex(&cmd->old_oid);
944 argv[3] = oid_to_hex(&cmd->new_oid);
1d9e8b56
SP
945 argv[4] = NULL;
946
6d525d38
SP
947 proc.no_stdin = 1;
948 proc.stdout_to_stderr = 1;
949 proc.err = use_sideband ? -1 : 0;
950 proc.argv = argv;
6206286e 951 proc.trace2_hook_name = "update";
6d525d38
SP
952
953 code = start_command(&proc);
954 if (code)
955 return code;
956 if (use_sideband)
957 copy_to_sideband(proc.err, -1, NULL);
958 return finish_command(&proc);
1d9e8b56
SP
959}
960
15d3af5e
JX
961static struct command *find_command_by_refname(struct command *list,
962 const char *refname)
963{
964 for (; list; list = list->next)
965 if (!strcmp(list->ref_name, refname))
966 return list;
967 return NULL;
968}
969
970static int read_proc_receive_report(struct packet_reader *reader,
971 struct command *commands,
972 struct strbuf *errmsg)
973{
974 struct command *cmd;
975 struct command *hint = NULL;
976 struct ref_push_report *report = NULL;
977 int new_report = 0;
978 int code = 0;
979 int once = 0;
980
981 for (;;) {
982 struct object_id old_oid, new_oid;
983 const char *head;
984 const char *refname;
985 char *p;
986
987 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
988 break;
989
990 head = reader->line;
991 p = strchr(head, ' ');
992 if (!p) {
993 strbuf_addf(errmsg, "proc-receive reported incomplete status line: '%s'\n", head);
994 code = -1;
995 continue;
996 }
997 *p++ = '\0';
998 if (!strcmp(head, "option")) {
999 const char *key, *val;
1000
1001 if (!hint || !(report || new_report)) {
1002 if (!once++)
1003 strbuf_addstr(errmsg, "proc-receive reported 'option' without a matching 'ok/ng' directive\n");
1004 code = -1;
1005 continue;
1006 }
1007 if (new_report) {
1008 if (!hint->report) {
1009 hint->report = xcalloc(1, sizeof(struct ref_push_report));
1010 report = hint->report;
1011 } else {
1012 report = hint->report;
1013 while (report->next)
1014 report = report->next;
1015 report->next = xcalloc(1, sizeof(struct ref_push_report));
1016 report = report->next;
1017 }
1018 new_report = 0;
1019 }
1020 key = p;
1021 p = strchr(key, ' ');
1022 if (p)
1023 *p++ = '\0';
1024 val = p;
1025 if (!strcmp(key, "refname"))
1026 report->ref_name = xstrdup_or_null(val);
1027 else if (!strcmp(key, "old-oid") && val &&
1028 !parse_oid_hex(val, &old_oid, &val))
1029 report->old_oid = oiddup(&old_oid);
1030 else if (!strcmp(key, "new-oid") && val &&
1031 !parse_oid_hex(val, &new_oid, &val))
1032 report->new_oid = oiddup(&new_oid);
1033 else if (!strcmp(key, "forced-update"))
1034 report->forced_update = 1;
1035 else if (!strcmp(key, "fall-through"))
1036 /* Fall through, let 'receive-pack' to execute it. */
1037 hint->run_proc_receive = 0;
1038 continue;
1039 }
1040
1041 report = NULL;
1042 new_report = 0;
1043 refname = p;
1044 p = strchr(refname, ' ');
1045 if (p)
1046 *p++ = '\0';
1047 if (strcmp(head, "ok") && strcmp(head, "ng")) {
1048 strbuf_addf(errmsg, "proc-receive reported bad status '%s' on ref '%s'\n",
1049 head, refname);
1050 code = -1;
1051 continue;
1052 }
1053
1054 /* first try searching at our hint, falling back to all refs */
1055 if (hint)
1056 hint = find_command_by_refname(hint, refname);
1057 if (!hint)
1058 hint = find_command_by_refname(commands, refname);
1059 if (!hint) {
1060 strbuf_addf(errmsg, "proc-receive reported status on unknown ref: %s\n",
1061 refname);
1062 code = -1;
1063 continue;
1064 }
1065 if (!hint->run_proc_receive) {
1066 strbuf_addf(errmsg, "proc-receive reported status on unexpected ref: %s\n",
1067 refname);
1068 code = -1;
1069 continue;
1070 }
1071 hint->run_proc_receive |= RUN_PROC_RECEIVE_RETURNED;
1072 if (!strcmp(head, "ng")) {
1073 if (p)
1074 hint->error_string = xstrdup(p);
1075 else
1076 hint->error_string = "failed";
1077 code = -1;
1078 continue;
1079 }
1080 new_report = 1;
1081 }
1082
1083 for (cmd = commands; cmd; cmd = cmd->next)
1084 if (cmd->run_proc_receive && !cmd->error_string &&
1085 !(cmd->run_proc_receive & RUN_PROC_RECEIVE_RETURNED)) {
1086 cmd->error_string = "proc-receive failed to report status";
1087 code = -1;
1088 }
1089 return code;
1090}
1091
1092static int run_proc_receive_hook(struct command *commands,
1093 const struct string_list *push_options)
1094{
1095 struct child_process proc = CHILD_PROCESS_INIT;
1096 struct async muxer;
1097 struct command *cmd;
1098 const char *argv[2];
1099 struct packet_reader reader;
1100 struct strbuf cap = STRBUF_INIT;
1101 struct strbuf errmsg = STRBUF_INIT;
1102 int hook_use_push_options = 0;
1103 int version = 0;
1104 int code;
1105
1106 argv[0] = find_hook("proc-receive");
1107 if (!argv[0]) {
1108 rp_error("cannot find hook 'proc-receive'");
1109 return -1;
1110 }
1111 argv[1] = NULL;
1112
1113 proc.argv = argv;
1114 proc.in = -1;
1115 proc.out = -1;
1116 proc.trace2_hook_name = "proc-receive";
1117
1118 if (use_sideband) {
1119 memset(&muxer, 0, sizeof(muxer));
1120 muxer.proc = copy_to_sideband;
1121 muxer.in = -1;
1122 code = start_async(&muxer);
1123 if (code)
1124 return code;
1125 proc.err = muxer.in;
1126 } else {
1127 proc.err = 0;
1128 }
1129
1130 code = start_command(&proc);
1131 if (code) {
1132 if (use_sideband)
1133 finish_async(&muxer);
1134 return code;
1135 }
1136
1137 sigchain_push(SIGPIPE, SIG_IGN);
1138
1139 /* Version negotiaton */
1140 packet_reader_init(&reader, proc.out, NULL, 0,
1141 PACKET_READ_CHOMP_NEWLINE |
1142 PACKET_READ_GENTLE_ON_EOF);
1143 if (use_atomic)
1144 strbuf_addstr(&cap, " atomic");
1145 if (use_push_options)
1146 strbuf_addstr(&cap, " push-options");
1147 if (cap.len) {
1148 packet_write_fmt(proc.in, "version=1%c%s\n", '\0', cap.buf + 1);
1149 strbuf_release(&cap);
1150 } else {
1151 packet_write_fmt(proc.in, "version=1\n");
1152 }
1153 packet_flush(proc.in);
1154
1155 for (;;) {
1156 int linelen;
1157
1158 if (packet_reader_read(&reader) != PACKET_READ_NORMAL)
1159 break;
1160
1161 if (reader.pktlen > 8 && starts_with(reader.line, "version=")) {
1162 version = atoi(reader.line + 8);
1163 linelen = strlen(reader.line);
1164 if (linelen < reader.pktlen) {
1165 const char *feature_list = reader.line + linelen + 1;
1166 if (parse_feature_request(feature_list, "push-options"))
1167 hook_use_push_options = 1;
1168 }
1169 }
1170 }
1171
1172 if (version != 1) {
1173 strbuf_addf(&errmsg, "proc-receive version '%d' is not supported",
1174 version);
1175 code = -1;
1176 goto cleanup;
1177 }
1178
1179 /* Send commands */
1180 for (cmd = commands; cmd; cmd = cmd->next) {
1181 if (!cmd->run_proc_receive || cmd->skip_update || cmd->error_string)
1182 continue;
1183 packet_write_fmt(proc.in, "%s %s %s",
1184 oid_to_hex(&cmd->old_oid),
1185 oid_to_hex(&cmd->new_oid),
1186 cmd->ref_name);
1187 }
1188 packet_flush(proc.in);
1189
1190 /* Send push options */
1191 if (hook_use_push_options) {
1192 struct string_list_item *item;
1193
1194 for_each_string_list_item(item, push_options)
1195 packet_write_fmt(proc.in, "%s", item->string);
1196 packet_flush(proc.in);
1197 }
1198
1199 /* Read result from proc-receive */
1200 code = read_proc_receive_report(&reader, commands, &errmsg);
1201
1202cleanup:
1203 close(proc.in);
1204 close(proc.out);
1205 if (use_sideband)
1206 finish_async(&muxer);
1207 if (finish_command(&proc))
1208 code = -1;
1209 if (errmsg.len >0) {
1210 char *p = errmsg.buf;
1211
1212 p += errmsg.len - 1;
1213 if (*p == '\n')
1214 *p = '\0';
1215 rp_error("%s", errmsg.buf);
1216 strbuf_release(&errmsg);
1217 }
1218 sigchain_pop(SIGPIPE);
1219
1220 return code;
1221}
1222
8ba35a2d
VA
1223static char *refuse_unconfigured_deny_msg =
1224 N_("By default, updating the current branch in a non-bare repository\n"
1225 "is denied, because it will make the index and work tree inconsistent\n"
1226 "with what you pushed, and will require 'git reset --hard' to match\n"
1227 "the work tree to HEAD.\n"
1228 "\n"
2ddaa427
AH
1229 "You can set the 'receive.denyCurrentBranch' configuration variable\n"
1230 "to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
8ba35a2d
VA
1231 "its current branch; however, this is not recommended unless you\n"
1232 "arranged to update its work tree to match what you pushed in some\n"
1233 "other way.\n"
1234 "\n"
1235 "To squelch this message and still keep the default behaviour, set\n"
1236 "'receive.denyCurrentBranch' configuration variable to 'refuse'.");
3d95d92b 1237
acd2a45b 1238static void refuse_unconfigured_deny(void)
3d95d92b 1239{
8ba35a2d 1240 rp_error("%s", _(refuse_unconfigured_deny_msg));
3d95d92b
JH
1241}
1242
8ba35a2d
VA
1243static char *refuse_unconfigured_deny_delete_current_msg =
1244 N_("By default, deleting the current branch is denied, because the next\n"
1245 "'git clone' won't result in any file checked out, causing confusion.\n"
1246 "\n"
1247 "You can set 'receive.denyDeleteCurrent' configuration variable to\n"
1248 "'warn' or 'ignore' in the remote repository to allow deleting the\n"
1249 "current branch, with or without a warning message.\n"
1250 "\n"
1251 "To squelch this message, you can set it to 'refuse'.");
747ca245 1252
375881fa 1253static void refuse_unconfigured_deny_delete_current(void)
747ca245 1254{
8ba35a2d 1255 rp_error("%s", _(refuse_unconfigured_deny_delete_current_msg));
747ca245
JH
1256}
1257
6ccac9ee 1258static int command_singleton_iterator(void *cb_data, struct object_id *oid);
0a1bc12b
NTND
1259static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
1260{
cac4b8e2 1261 struct shallow_lock shallow_lock = SHALLOW_LOCK_INIT;
910650d2 1262 struct oid_array extra = OID_ARRAY_INIT;
7043c707 1263 struct check_connected_options opt = CHECK_CONNECTED_INIT;
0a1bc12b
NTND
1264 uint32_t mask = 1 << (cmd->index % 32);
1265 int i;
1266
6aa30857 1267 trace_printf_key(&trace_shallow,
0a1bc12b
NTND
1268 "shallow: update_shallow_ref %s\n", cmd->ref_name);
1269 for (i = 0; i < si->shallow->nr; i++)
1270 if (si->used_shallow[i] &&
1271 (si->used_shallow[i][cmd->index / 32] & mask) &&
1272 !delayed_reachability_test(si, i))
910650d2 1273 oid_array_append(&extra, &si->shallow->oid[i]);
0a1bc12b 1274
722ff7f8 1275 opt.env = tmp_objdir_env(tmp_objdir);
7043c707
JK
1276 setup_alternate_shallow(&shallow_lock, &opt.shallow_file, &extra);
1277 if (check_connected(command_singleton_iterator, cmd, &opt)) {
37b9dcab 1278 rollback_shallow_file(the_repository, &shallow_lock);
910650d2 1279 oid_array_clear(&extra);
0a1bc12b
NTND
1280 return -1;
1281 }
1282
37b9dcab 1283 commit_shallow_file(the_repository, &shallow_lock);
0a1bc12b
NTND
1284
1285 /*
1286 * Make sure setup_alternate_shallow() for the next ref does
1287 * not lose these new roots..
1288 */
1289 for (i = 0; i < extra.nr; i++)
19143f13 1290 register_shallow(the_repository, &extra.oid[i]);
0a1bc12b
NTND
1291
1292 si->shallow_ref[cmd->index] = 0;
910650d2 1293 oid_array_clear(&extra);
0a1bc12b
NTND
1294 return 0;
1295}
1296
1a51b524
JH
1297/*
1298 * NEEDSWORK: we should consolidate various implementions of "are we
1299 * on an unborn branch?" test into one, and make the unified one more
1300 * robust. !get_sha1() based check used here and elsewhere would not
1301 * allow us to tell an unborn branch from corrupt ref, for example.
1302 * For the purpose of fixing "deploy-to-update does not work when
1303 * pushing into an empty repository" issue, this should suffice for
1304 * now.
1305 */
1306static int head_has_history(void)
1307{
15be4a5d 1308 struct object_id oid;
1a51b524 1309
15be4a5d 1310 return !get_oid("HEAD", &oid);
1a51b524
JH
1311}
1312
21b138d0 1313static const char *push_to_deploy(unsigned char *sha1,
22f9b7f3 1314 struct strvec *env,
21b138d0 1315 const char *work_tree)
1404bcbb
JS
1316{
1317 const char *update_refresh[] = {
1318 "update-index", "-q", "--ignore-submodules", "--refresh", NULL
1319 };
1320 const char *diff_files[] = {
1321 "diff-files", "--quiet", "--ignore-submodules", "--", NULL
1322 };
1323 const char *diff_index[] = {
1324 "diff-index", "--quiet", "--cached", "--ignore-submodules",
1a51b524 1325 NULL, "--", NULL
1404bcbb
JS
1326 };
1327 const char *read_tree[] = {
1328 "read-tree", "-u", "-m", NULL, NULL
1329 };
1404bcbb
JS
1330 struct child_process child = CHILD_PROCESS_INIT;
1331
1404bcbb 1332 child.argv = update_refresh;
d70a9eb6 1333 child.env = env->v;
1404bcbb
JS
1334 child.dir = work_tree;
1335 child.no_stdin = 1;
1336 child.stdout_to_stderr = 1;
1337 child.git_cmd = 1;
21b138d0 1338 if (run_command(&child))
1404bcbb 1339 return "Up-to-date check failed";
1404bcbb
JS
1340
1341 /* run_command() does not clean up completely; reinitialize */
1342 child_process_init(&child);
1343 child.argv = diff_files;
d70a9eb6 1344 child.env = env->v;
1404bcbb
JS
1345 child.dir = work_tree;
1346 child.no_stdin = 1;
1347 child.stdout_to_stderr = 1;
1348 child.git_cmd = 1;
21b138d0 1349 if (run_command(&child))
1404bcbb 1350 return "Working directory has unstaged changes";
1404bcbb 1351
1a51b524 1352 /* diff-index with either HEAD or an empty tree */
c00866a2 1353 diff_index[4] = head_has_history() ? "HEAD" : empty_tree_oid_hex();
1a51b524 1354
1404bcbb
JS
1355 child_process_init(&child);
1356 child.argv = diff_index;
d70a9eb6 1357 child.env = env->v;
1404bcbb
JS
1358 child.no_stdin = 1;
1359 child.no_stdout = 1;
1360 child.stdout_to_stderr = 0;
1361 child.git_cmd = 1;
21b138d0 1362 if (run_command(&child))
1404bcbb 1363 return "Working directory has staged changes";
1404bcbb 1364
fc06be3b 1365 read_tree[3] = hash_to_hex(sha1);
1404bcbb
JS
1366 child_process_init(&child);
1367 child.argv = read_tree;
d70a9eb6 1368 child.env = env->v;
1404bcbb
JS
1369 child.dir = work_tree;
1370 child.no_stdin = 1;
1371 child.no_stdout = 1;
1372 child.stdout_to_stderr = 0;
1373 child.git_cmd = 1;
21b138d0 1374 if (run_command(&child))
1404bcbb 1375 return "Could not update working tree to new HEAD";
1404bcbb 1376
1404bcbb
JS
1377 return NULL;
1378}
1379
08553319
JH
1380static const char *push_to_checkout_hook = "push-to-checkout";
1381
fc06be3b 1382static const char *push_to_checkout(unsigned char *hash,
22f9b7f3 1383 struct strvec *env,
08553319
JH
1384 const char *work_tree)
1385{
22f9b7f3 1386 strvec_pushf(env, "GIT_WORK_TREE=%s", absolute_path(work_tree));
d70a9eb6 1387 if (run_hook_le(env->v, push_to_checkout_hook,
fc06be3b 1388 hash_to_hex(hash), NULL))
08553319
JH
1389 return "push-to-checkout hook declined";
1390 else
1391 return NULL;
1392}
1393
4ef34648 1394static const char *update_worktree(unsigned char *sha1, const struct worktree *worktree)
21b138d0 1395{
4ef34648 1396 const char *retval, *work_tree, *git_dir = NULL;
22f9b7f3 1397 struct strvec env = STRVEC_INIT;
21b138d0 1398
4ef34648
HV
1399 if (worktree && worktree->path)
1400 work_tree = worktree->path;
1401 else if (git_work_tree_cfg)
1402 work_tree = git_work_tree_cfg;
1403 else
1404 work_tree = "..";
1405
21b138d0
JH
1406 if (is_bare_repository())
1407 return "denyCurrentBranch = updateInstead needs a worktree";
4ef34648
HV
1408 if (worktree)
1409 git_dir = get_worktree_git_dir(worktree);
1410 if (!git_dir)
1411 git_dir = get_git_dir();
21b138d0 1412
22f9b7f3 1413 strvec_pushf(&env, "GIT_DIR=%s", absolute_path(git_dir));
21b138d0 1414
08553319
JH
1415 if (!find_hook(push_to_checkout_hook))
1416 retval = push_to_deploy(sha1, &env, work_tree);
1417 else
1418 retval = push_to_checkout(sha1, &env, work_tree);
21b138d0 1419
22f9b7f3 1420 strvec_clear(&env);
21b138d0
JH
1421 return retval;
1422}
1423
0a1bc12b 1424static const char *update(struct command *cmd, struct shallow_info *si)
2eca23da 1425{
cfee10a7 1426 const char *name = cmd->ref_name;
6b01ecfe 1427 struct strbuf namespaced_name_buf = STRBUF_INIT;
bda6e828
JS
1428 static char *namespaced_name;
1429 const char *ret;
9c44ea44 1430 struct object_id *old_oid = &cmd->old_oid;
1431 struct object_id *new_oid = &cmd->new_oid;
b072a25f 1432 int do_update_worktree = 0;
4ef34648 1433 const struct worktree *worktree = is_bare_repository() ? NULL : find_shared_symref("HEAD", name);
2eca23da 1434
061d6b9a 1435 /* only refs/... are allowed */
59556548 1436 if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
466dbc42 1437 rp_error("refusing to create funny ref '%s' remotely", name);
8aaf7d64 1438 return "funny refname";
cfee10a7 1439 }
d8a1deec 1440
6b01ecfe 1441 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
bda6e828 1442 free(namespaced_name);
6b01ecfe
JT
1443 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
1444
4ef34648 1445 if (worktree) {
3d95d92b
JH
1446 switch (deny_current_branch) {
1447 case DENY_IGNORE:
986e8239 1448 break;
3d95d92b 1449 case DENY_WARN:
466dbc42 1450 rp_warning("updating the current branch");
986e8239 1451 break;
3d95d92b 1452 case DENY_REFUSE:
acd2a45b 1453 case DENY_UNCONFIGURED:
466dbc42 1454 rp_error("refusing to update checked out branch: %s", name);
acd2a45b
JH
1455 if (deny_current_branch == DENY_UNCONFIGURED)
1456 refuse_unconfigured_deny();
3d95d92b 1457 return "branch is currently checked out";
1404bcbb 1458 case DENY_UPDATE_INSTEAD:
b072a25f
JH
1459 /* pass -- let other checks intervene first */
1460 do_update_worktree = 1;
1404bcbb 1461 break;
3d95d92b 1462 }
986e8239
JK
1463 }
1464
9c44ea44 1465 if (!is_null_oid(new_oid) && !has_object_file(new_oid)) {
8aaf7d64 1466 error("unpack should have generated %s, "
9c44ea44 1467 "but I can't find it!", oid_to_hex(new_oid));
8aaf7d64 1468 return "bad pack";
cfee10a7 1469 }
747ca245 1470
9c44ea44 1471 if (!is_null_oid(old_oid) && is_null_oid(new_oid)) {
59556548 1472 if (deny_deletes && starts_with(name, "refs/heads/")) {
466dbc42 1473 rp_error("denying ref deletion for %s", name);
747ca245
JH
1474 return "deletion prohibited";
1475 }
1476
4ef34648 1477 if (worktree || (head_name && !strcmp(namespaced_name, head_name))) {
747ca245
JH
1478 switch (deny_delete_current) {
1479 case DENY_IGNORE:
1480 break;
1481 case DENY_WARN:
466dbc42 1482 rp_warning("deleting the current branch");
747ca245
JH
1483 break;
1484 case DENY_REFUSE:
375881fa 1485 case DENY_UNCONFIGURED:
1404bcbb 1486 case DENY_UPDATE_INSTEAD:
375881fa
JH
1487 if (deny_delete_current == DENY_UNCONFIGURED)
1488 refuse_unconfigured_deny_delete_current();
466dbc42 1489 rp_error("refusing to delete the current branch: %s", name);
747ca245 1490 return "deletion of the current branch prohibited";
1404bcbb
JS
1491 default:
1492 return "Invalid denyDeleteCurrent setting";
747ca245
JH
1493 }
1494 }
a240de11 1495 }
747ca245 1496
9c44ea44 1497 if (deny_non_fast_forwards && !is_null_oid(new_oid) &&
1498 !is_null_oid(old_oid) &&
59556548 1499 starts_with(name, "refs/heads/")) {
eab82707 1500 struct object *old_object, *new_object;
11031d7e 1501 struct commit *old_commit, *new_commit;
11031d7e 1502
109cd76d
SB
1503 old_object = parse_object(the_repository, old_oid);
1504 new_object = parse_object(the_repository, new_oid);
eab82707
MK
1505
1506 if (!old_object || !new_object ||
1507 old_object->type != OBJ_COMMIT ||
1508 new_object->type != OBJ_COMMIT) {
1509 error("bad sha1 objects for %s", name);
1510 return "bad ref";
1511 }
1512 old_commit = (struct commit *)old_object;
1513 new_commit = (struct commit *)new_object;
5d55915c 1514 if (!in_merge_bases(old_commit, new_commit)) {
466dbc42
SP
1515 rp_error("denying non-fast-forward %s"
1516 " (you should pull first)", name);
a75d7b54 1517 return "non-fast-forward";
8aaf7d64 1518 }
11031d7e 1519 }
1d9e8b56 1520 if (run_update_hook(cmd)) {
466dbc42 1521 rp_error("hook declined to update %s", name);
8aaf7d64 1522 return "hook declined";
b1bf95bb 1523 }
3159c8dc 1524
b072a25f 1525 if (do_update_worktree) {
4ef34648 1526 ret = update_worktree(new_oid->hash, find_shared_symref("HEAD", name));
b072a25f
JH
1527 if (ret)
1528 return ret;
1529 }
1530
9c44ea44 1531 if (is_null_oid(new_oid)) {
222368c6 1532 struct strbuf err = STRBUF_INIT;
109cd76d 1533 if (!parse_object(the_repository, old_oid)) {
9c44ea44 1534 old_oid = NULL;
160b81ed
PYH
1535 if (ref_exists(name)) {
1536 rp_warning("Allowing deletion of corrupt ref.");
1537 } else {
1538 rp_warning("Deleting a non-existent ref.");
1539 cmd->did_not_exist = 1;
1540 }
28391a80 1541 }
222368c6
SB
1542 if (ref_transaction_delete(transaction,
1543 namespaced_name,
89f3bbdd 1544 old_oid,
fb5a6bb6 1545 0, "push", &err)) {
222368c6
SB
1546 rp_error("%s", err.buf);
1547 strbuf_release(&err);
8aaf7d64 1548 return "failed to delete";
d4f694ba 1549 }
222368c6 1550 strbuf_release(&err);
8aaf7d64 1551 return NULL; /* good */
d4f694ba
JH
1552 }
1553 else {
6629ea2d 1554 struct strbuf err = STRBUF_INIT;
0a1bc12b
NTND
1555 if (shallow_update && si->shallow_ref[cmd->index] &&
1556 update_shallow_ref(cmd, si))
1557 return "shallow error";
1558
222368c6
SB
1559 if (ref_transaction_update(transaction,
1560 namespaced_name,
89f3bbdd 1561 new_oid, old_oid,
1d147bdf 1562 0, "push",
222368c6 1563 &err)) {
6629ea2d
RS
1564 rp_error("%s", err.buf);
1565 strbuf_release(&err);
222368c6 1566
6629ea2d 1567 return "failed to update ref";
ef203f08 1568 }
6629ea2d 1569 strbuf_release(&err);
222368c6 1570
8aaf7d64 1571 return NULL; /* good */
19614330 1572 }
2eca23da
LT
1573}
1574
5e1c71fd 1575static void run_update_post_hook(struct command *commands)
19614330 1576{
5e1c71fd 1577 struct command *cmd;
d3180279 1578 struct child_process proc = CHILD_PROCESS_INIT;
dcf69262 1579 const char *hook;
19614330 1580
5a7da2dc 1581 hook = find_hook("post-update");
dce96c41 1582 if (!hook)
3e6e152c 1583 return;
5a7da2dc 1584
850d2fec 1585 for (cmd = commands; cmd; cmd = cmd->next) {
160b81ed 1586 if (cmd->error_string || cmd->did_not_exist)
19614330 1587 continue;
d70a9eb6 1588 if (!proc.args.nr)
22f9b7f3
JK
1589 strvec_push(&proc.args, hook);
1590 strvec_push(&proc.args, cmd->ref_name);
19614330 1591 }
d70a9eb6 1592 if (!proc.args.nr)
dce96c41 1593 return;
6d525d38 1594
6d525d38
SP
1595 proc.no_stdin = 1;
1596 proc.stdout_to_stderr = 1;
1597 proc.err = use_sideband ? -1 : 0;
6206286e 1598 proc.trace2_hook_name = "post-update";
6d525d38
SP
1599
1600 if (!start_command(&proc)) {
1601 if (use_sideband)
1602 copy_to_sideband(proc.err, -1, NULL);
1603 finish_command(&proc);
1604 }
19614330 1605}
2eca23da 1606
99036237
ÆAB
1607static void check_aliased_update_internal(struct command *cmd,
1608 struct string_list *list,
1609 const char *dst_name, int flag)
da3efdb1
JS
1610{
1611 struct string_list_item *item;
1612 struct command *dst_cmd;
da3efdb1
JS
1613
1614 if (!(flag & REF_ISSYMREF))
1615 return;
1616
6b01ecfe
JT
1617 if (!dst_name) {
1618 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
1619 cmd->skip_update = 1;
1620 cmd->error_string = "broken symref";
1621 return;
1622 }
ded83936 1623 dst_name = strip_namespace(dst_name);
6b01ecfe 1624
e8c8b713 1625 if ((item = string_list_lookup(list, dst_name)) == NULL)
da3efdb1
JS
1626 return;
1627
1628 cmd->skip_update = 1;
1629
1630 dst_cmd = (struct command *) item->util;
1631
4a7e27e9
JK
1632 if (oideq(&cmd->old_oid, &dst_cmd->old_oid) &&
1633 oideq(&cmd->new_oid, &dst_cmd->new_oid))
da3efdb1
JS
1634 return;
1635
1636 dst_cmd->skip_update = 1;
1637
da3efdb1
JS
1638 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
1639 " its target '%s' (%s..%s)",
ef2ed501 1640 cmd->ref_name,
aab9583f 1641 find_unique_abbrev(&cmd->old_oid, DEFAULT_ABBREV),
1642 find_unique_abbrev(&cmd->new_oid, DEFAULT_ABBREV),
ef2ed501 1643 dst_cmd->ref_name,
aab9583f 1644 find_unique_abbrev(&dst_cmd->old_oid, DEFAULT_ABBREV),
1645 find_unique_abbrev(&dst_cmd->new_oid, DEFAULT_ABBREV));
da3efdb1
JS
1646
1647 cmd->error_string = dst_cmd->error_string =
1648 "inconsistent aliased update";
1649}
1650
99036237
ÆAB
1651static void check_aliased_update(struct command *cmd, struct string_list *list)
1652{
1653 struct strbuf buf = STRBUF_INIT;
1654 const char *dst_name;
1655 int flag;
1656
1657 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
1658 dst_name = resolve_ref_unsafe(buf.buf, 0, NULL, &flag);
1659 check_aliased_update_internal(cmd, list, dst_name, flag);
1660 strbuf_release(&buf);
1661}
1662
da3efdb1
JS
1663static void check_aliased_updates(struct command *commands)
1664{
1665 struct command *cmd;
183113a5 1666 struct string_list ref_list = STRING_LIST_INIT_NODUP;
da3efdb1
JS
1667
1668 for (cmd = commands; cmd; cmd = cmd->next) {
1669 struct string_list_item *item =
1d2f80fa 1670 string_list_append(&ref_list, cmd->ref_name);
da3efdb1
JS
1671 item->util = (void *)cmd;
1672 }
3383e199 1673 string_list_sort(&ref_list);
da3efdb1 1674
ef7e93d9
CB
1675 for (cmd = commands; cmd; cmd = cmd->next) {
1676 if (!cmd->error_string)
1677 check_aliased_update(cmd, &ref_list);
1678 }
da3efdb1
JS
1679
1680 string_list_clear(&ref_list, 0);
1681}
1682
6ccac9ee 1683static int command_singleton_iterator(void *cb_data, struct object_id *oid)
52fed6e1
JH
1684{
1685 struct command **cmd_list = cb_data;
1686 struct command *cmd = *cmd_list;
1687
9c44ea44 1688 if (!cmd || is_null_oid(&cmd->new_oid))
52fed6e1
JH
1689 return -1; /* end of list */
1690 *cmd_list = NULL; /* this returns only one */
6ccac9ee 1691 oidcpy(oid, &cmd->new_oid);
52fed6e1
JH
1692 return 0;
1693}
1694
0a1bc12b
NTND
1695static void set_connectivity_errors(struct command *commands,
1696 struct shallow_info *si)
52fed6e1
JH
1697{
1698 struct command *cmd;
1699
1700 for (cmd = commands; cmd; cmd = cmd->next) {
1701 struct command *singleton = cmd;
722ff7f8
JK
1702 struct check_connected_options opt = CHECK_CONNECTED_INIT;
1703
0a1bc12b
NTND
1704 if (shallow_update && si->shallow_ref[cmd->index])
1705 /* to be checked in update_shallow_ref() */
1706 continue;
722ff7f8
JK
1707
1708 opt.env = tmp_objdir_env(tmp_objdir);
7043c707 1709 if (!check_connected(command_singleton_iterator, &singleton,
722ff7f8 1710 &opt))
52fed6e1 1711 continue;
722ff7f8 1712
52fed6e1
JH
1713 cmd->error_string = "missing necessary objects";
1714 }
1715}
1716
0a1bc12b
NTND
1717struct iterate_data {
1718 struct command *cmds;
1719 struct shallow_info *si;
1720};
1721
6ccac9ee 1722static int iterate_receive_command_list(void *cb_data, struct object_id *oid)
52fed6e1 1723{
0a1bc12b
NTND
1724 struct iterate_data *data = cb_data;
1725 struct command **cmd_list = &data->cmds;
52fed6e1
JH
1726 struct command *cmd = *cmd_list;
1727
0a1bc12b
NTND
1728 for (; cmd; cmd = cmd->next) {
1729 if (shallow_update && data->si->shallow_ref[cmd->index])
1730 /* to be checked in update_shallow_ref() */
1731 continue;
9c44ea44 1732 if (!is_null_oid(&cmd->new_oid) && !cmd->skip_update) {
6ccac9ee 1733 oidcpy(oid, &cmd->new_oid);
ee6dfb2d
JH
1734 *cmd_list = cmd->next;
1735 return 0;
1736 }
ee6dfb2d
JH
1737 }
1738 *cmd_list = NULL;
1739 return -1; /* end of list */
52fed6e1
JH
1740}
1741
daebaa78
JH
1742static void reject_updates_to_hidden(struct command *commands)
1743{
78a766ab
LF
1744 struct strbuf refname_full = STRBUF_INIT;
1745 size_t prefix_len;
daebaa78
JH
1746 struct command *cmd;
1747
78a766ab
LF
1748 strbuf_addstr(&refname_full, get_git_namespace());
1749 prefix_len = refname_full.len;
1750
daebaa78 1751 for (cmd = commands; cmd; cmd = cmd->next) {
78a766ab
LF
1752 if (cmd->error_string)
1753 continue;
1754
1755 strbuf_setlen(&refname_full, prefix_len);
1756 strbuf_addstr(&refname_full, cmd->ref_name);
1757
1758 if (!ref_is_hidden(cmd->ref_name, refname_full.buf))
daebaa78 1759 continue;
9c44ea44 1760 if (is_null_oid(&cmd->new_oid))
daebaa78
JH
1761 cmd->error_string = "deny deleting a hidden ref";
1762 else
1763 cmd->error_string = "deny updating a hidden ref";
1764 }
78a766ab
LF
1765
1766 strbuf_release(&refname_full);
daebaa78
JH
1767}
1768
a6a84319
SB
1769static int should_process_cmd(struct command *cmd)
1770{
1771 return !cmd->error_string && !cmd->skip_update;
1772}
1773
1774static void warn_if_skipped_connectivity_check(struct command *commands,
1775 struct shallow_info *si)
1776{
1777 struct command *cmd;
1778 int checked_connectivity = 1;
1779
1780 for (cmd = commands; cmd; cmd = cmd->next) {
1781 if (should_process_cmd(cmd) && si->shallow_ref[cmd->index]) {
1782 error("BUG: connectivity check has not been run on ref %s",
1783 cmd->ref_name);
1784 checked_connectivity = 0;
1785 }
1786 }
1787 if (!checked_connectivity)
033abf97 1788 BUG("connectivity check skipped???");
a6a84319
SB
1789}
1790
a1a26145
SB
1791static void execute_commands_non_atomic(struct command *commands,
1792 struct shallow_info *si)
1793{
1794 struct command *cmd;
222368c6
SB
1795 struct strbuf err = STRBUF_INIT;
1796
a1a26145 1797 for (cmd = commands; cmd; cmd = cmd->next) {
15d3af5e 1798 if (!should_process_cmd(cmd) || cmd->run_proc_receive)
a1a26145
SB
1799 continue;
1800
222368c6
SB
1801 transaction = ref_transaction_begin(&err);
1802 if (!transaction) {
1803 rp_error("%s", err.buf);
1804 strbuf_reset(&err);
1805 cmd->error_string = "transaction failed to start";
1806 continue;
1807 }
1808
a1a26145 1809 cmd->error_string = update(cmd, si);
222368c6
SB
1810
1811 if (!cmd->error_string
1812 && ref_transaction_commit(transaction, &err)) {
1813 rp_error("%s", err.buf);
1814 strbuf_reset(&err);
1815 cmd->error_string = "failed to update ref";
1816 }
1817 ref_transaction_free(transaction);
a1a26145 1818 }
68deed29
SB
1819 strbuf_release(&err);
1820}
222368c6 1821
68deed29
SB
1822static void execute_commands_atomic(struct command *commands,
1823 struct shallow_info *si)
1824{
1825 struct command *cmd;
1826 struct strbuf err = STRBUF_INIT;
1827 const char *reported_error = "atomic push failure";
1828
1829 transaction = ref_transaction_begin(&err);
1830 if (!transaction) {
1831 rp_error("%s", err.buf);
1832 strbuf_reset(&err);
1833 reported_error = "transaction failed to start";
1834 goto failure;
1835 }
1836
1837 for (cmd = commands; cmd; cmd = cmd->next) {
15d3af5e 1838 if (!should_process_cmd(cmd) || cmd->run_proc_receive)
68deed29
SB
1839 continue;
1840
1841 cmd->error_string = update(cmd, si);
1842
1843 if (cmd->error_string)
1844 goto failure;
1845 }
1846
1847 if (ref_transaction_commit(transaction, &err)) {
1848 rp_error("%s", err.buf);
1849 reported_error = "atomic transaction failed";
1850 goto failure;
1851 }
1852 goto cleanup;
1853
1854failure:
1855 for (cmd = commands; cmd; cmd = cmd->next)
1856 if (!cmd->error_string)
1857 cmd->error_string = reported_error;
1858
1859cleanup:
1860 ref_transaction_free(transaction);
222368c6 1861 strbuf_release(&err);
a1a26145
SB
1862}
1863
0a1bc12b
NTND
1864static void execute_commands(struct command *commands,
1865 const char *unpacker_error,
77a9745d
SB
1866 struct shallow_info *si,
1867 const struct string_list *push_options)
575f4974 1868{
d415092a 1869 struct check_connected_options opt = CHECK_CONNECTED_INIT;
5e1c71fd 1870 struct command *cmd;
0a1bc12b 1871 struct iterate_data data;
d415092a
JK
1872 struct async muxer;
1873 int err_fd = 0;
15d3af5e 1874 int run_proc_receive = 0;
8aaf7d64
SP
1875
1876 if (unpacker_error) {
5e1c71fd 1877 for (cmd = commands; cmd; cmd = cmd->next)
74eb32d3 1878 cmd->error_string = "unpacker error";
8aaf7d64
SP
1879 return;
1880 }
1881
d415092a
JK
1882 if (use_sideband) {
1883 memset(&muxer, 0, sizeof(muxer));
1884 muxer.proc = copy_to_sideband;
1885 muxer.in = -1;
1886 if (!start_async(&muxer))
1887 err_fd = muxer.in;
1888 /* ...else, continue without relaying sideband */
1889 }
1890
0a1bc12b
NTND
1891 data.cmds = commands;
1892 data.si = si;
d415092a 1893 opt.err_fd = err_fd;
6b4cd2f8 1894 opt.progress = err_fd && !quiet;
722ff7f8 1895 opt.env = tmp_objdir_env(tmp_objdir);
d415092a 1896 if (check_connected(iterate_receive_command_list, &data, &opt))
0a1bc12b 1897 set_connectivity_errors(commands, si);
52fed6e1 1898
d415092a
JK
1899 if (use_sideband)
1900 finish_async(&muxer);
1901
daebaa78
JH
1902 reject_updates_to_hidden(commands);
1903
15d3af5e
JX
1904 /*
1905 * Try to find commands that have special prefix in their reference names,
1906 * and mark them to run an external "proc-receive" hook later.
1907 */
31e8595a
JX
1908 if (proc_receive_ref) {
1909 for (cmd = commands; cmd; cmd = cmd->next) {
1910 if (!should_process_cmd(cmd))
1911 continue;
15d3af5e 1912
31e8595a
JX
1913 if (proc_receive_ref_matches(cmd)) {
1914 cmd->run_proc_receive = RUN_PROC_RECEIVE_SCHEDULED;
1915 run_proc_receive = 1;
1916 }
15d3af5e
JX
1917 }
1918 }
1919
77a9745d 1920 if (run_receive_hook(commands, "pre-receive", 0, push_options)) {
ef7e93d9
CB
1921 for (cmd = commands; cmd; cmd = cmd->next) {
1922 if (!cmd->error_string)
1923 cmd->error_string = "pre-receive hook declined";
1924 }
05ef58ec
SP
1925 return;
1926 }
1927
722ff7f8
JK
1928 /*
1929 * Now we'll start writing out refs, which means the objects need
1930 * to be in their final positions so that other processes can see them.
1931 */
1932 if (tmp_objdir_migrate(tmp_objdir) < 0) {
1933 for (cmd = commands; cmd; cmd = cmd->next) {
1934 if (!cmd->error_string)
1935 cmd->error_string = "unable to migrate objects to permanent storage";
1936 }
1937 return;
1938 }
1939 tmp_objdir = NULL;
1940
da3efdb1
JS
1941 check_aliased_updates(commands);
1942
96ec7b1e 1943 free(head_name_to_free);
efbd4fdf 1944 head_name = head_name_to_free = resolve_refdup("HEAD", 0, NULL, NULL);
747ca245 1945
15d3af5e
JX
1946 if (run_proc_receive &&
1947 run_proc_receive_hook(commands, push_options))
1948 for (cmd = commands; cmd; cmd = cmd->next)
1949 if (!cmd->error_string &&
1950 !(cmd->run_proc_receive & RUN_PROC_RECEIVE_RETURNED) &&
1951 (cmd->run_proc_receive || use_atomic))
1952 cmd->error_string = "fail to run proc-receive hook";
1953
68deed29
SB
1954 if (use_atomic)
1955 execute_commands_atomic(commands, si);
1956 else
1957 execute_commands_non_atomic(commands, si);
0a1bc12b 1958
a6a84319
SB
1959 if (shallow_update)
1960 warn_if_skipped_connectivity_check(commands, si);
575f4974
LT
1961}
1962
39895c74
JH
1963static struct command **queue_command(struct command **tail,
1964 const char *line,
1965 int linelen)
1966{
9c44ea44 1967 struct object_id old_oid, new_oid;
39895c74
JH
1968 struct command *cmd;
1969 const char *refname;
1970 int reflen;
9c44ea44 1971 const char *p;
39895c74 1972
9c44ea44 1973 if (parse_oid_hex(line, &old_oid, &p) ||
1974 *p++ != ' ' ||
1975 parse_oid_hex(p, &new_oid, &p) ||
1976 *p++ != ' ')
39895c74
JH
1977 die("protocol error: expected old/new/ref, got '%s'", line);
1978
9c44ea44 1979 refname = p;
1980 reflen = linelen - (p - line);
ddd0bfac 1981 FLEX_ALLOC_MEM(cmd, ref_name, refname, reflen);
9c44ea44 1982 oidcpy(&cmd->old_oid, &old_oid);
1983 oidcpy(&cmd->new_oid, &new_oid);
39895c74
JH
1984 *tail = cmd;
1985 return &cmd->next;
1986}
1987
4adf569d
JH
1988static void queue_commands_from_cert(struct command **tail,
1989 struct strbuf *push_cert)
1990{
1991 const char *boc, *eoc;
1992
1993 if (*tail)
1994 die("protocol error: got both push certificate and unsigned commands");
1995
1996 boc = strstr(push_cert->buf, "\n\n");
1997 if (!boc)
1998 die("malformed push certificate %.*s", 100, push_cert->buf);
1999 else
2000 boc += 2;
2001 eoc = push_cert->buf + parse_signature(push_cert->buf, push_cert->len);
2002
2003 while (boc < eoc) {
2004 const char *eol = memchr(boc, '\n', eoc - boc);
f2214ded 2005 tail = queue_command(tail, boc, eol ? eol - boc : eoc - boc);
4adf569d
JH
2006 boc = eol ? eol + 1 : eoc;
2007 }
2008}
2009
01f9ec64
MS
2010static struct command *read_head_info(struct packet_reader *reader,
2011 struct oid_array *shallow)
575f4974 2012{
5e1c71fd 2013 struct command *commands = NULL;
eb1af2df 2014 struct command **p = &commands;
575f4974 2015 for (;;) {
01f9ec64 2016 int linelen;
eb1af2df 2017
01f9ec64 2018 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
575f4974 2019 break;
5dbd7676 2020
01f9ec64 2021 if (reader->pktlen > 8 && starts_with(reader->line, "shallow ")) {
9c44ea44 2022 struct object_id oid;
01f9ec64 2023 if (get_oid_hex(reader->line + 8, &oid))
c09b71cc 2024 die("protocol error: expected shallow sha, got '%s'",
01f9ec64 2025 reader->line + 8);
910650d2 2026 oid_array_append(shallow, &oid);
5dbd7676
NTND
2027 continue;
2028 }
2029
01f9ec64
MS
2030 linelen = strlen(reader->line);
2031 if (linelen < reader->pktlen) {
2032 const char *feature_list = reader->line + linelen + 1;
bb095d08 2033 const char *hash = NULL;
2034 int len = 0;
f47182c8 2035 if (parse_feature_request(feature_list, "report-status"))
cfee10a7 2036 report_status = 1;
63518a57
JX
2037 if (parse_feature_request(feature_list, "report-status-v2"))
2038 report_status_v2 = 1;
f47182c8 2039 if (parse_feature_request(feature_list, "side-band-64k"))
38a81b4e 2040 use_sideband = LARGE_PACKET_MAX;
c207e34f
CB
2041 if (parse_feature_request(feature_list, "quiet"))
2042 quiet = 1;
1b70fe5d
RS
2043 if (advertise_atomic_push
2044 && parse_feature_request(feature_list, "atomic"))
2045 use_atomic = 1;
c714e45f
SB
2046 if (advertise_push_options
2047 && parse_feature_request(feature_list, "push-options"))
2048 use_push_options = 1;
bb095d08 2049 hash = parse_feature_value(feature_list, "object-format", &len, NULL);
2050 if (!hash) {
2051 hash = hash_algos[GIT_HASH_SHA1].name;
2052 len = strlen(hash);
2053 }
2054 if (xstrncmpz(the_hash_algo->name, hash, len))
2055 die("error: unsupported object format '%s'", hash);
cfee10a7 2056 }
0e3c339b 2057
01f9ec64 2058 if (!strcmp(reader->line, "push-cert")) {
a85b377d 2059 int true_flush = 0;
01f9ec64
MS
2060 int saved_options = reader->options;
2061 reader->options &= ~PACKET_READ_CHOMP_NEWLINE;
a85b377d
JH
2062
2063 for (;;) {
01f9ec64
MS
2064 packet_reader_read(reader);
2065 if (reader->status == PACKET_READ_FLUSH) {
a85b377d
JH
2066 true_flush = 1;
2067 break;
2068 }
01f9ec64
MS
2069 if (reader->status != PACKET_READ_NORMAL) {
2070 die("protocol error: got an unexpected packet");
2071 }
2072 if (!strcmp(reader->line, "push-cert-end\n"))
a85b377d 2073 break; /* end of cert */
01f9ec64 2074 strbuf_addstr(&push_cert, reader->line);
a85b377d 2075 }
01f9ec64 2076 reader->options = saved_options;
a85b377d
JH
2077
2078 if (true_flush)
2079 break;
2080 continue;
2081 }
2082
01f9ec64 2083 p = queue_command(p, reader->line, linelen);
575f4974 2084 }
4adf569d
JH
2085
2086 if (push_cert.len)
2087 queue_commands_from_cert(p, &push_cert);
2088
5e1c71fd 2089 return commands;
575f4974
LT
2090}
2091
01f9ec64
MS
2092static void read_push_options(struct packet_reader *reader,
2093 struct string_list *options)
c714e45f
SB
2094{
2095 while (1) {
01f9ec64 2096 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
c714e45f
SB
2097 break;
2098
01f9ec64 2099 string_list_append(options, reader->line);
c714e45f
SB
2100 }
2101}
2102
fc04c412
SP
2103static const char *parse_pack_header(struct pack_header *hdr)
2104{
a69e5429
JH
2105 switch (read_pack_header(0, hdr)) {
2106 case PH_ERROR_EOF:
2107 return "eof before pack header was fully read";
2108
2109 case PH_ERROR_PACK_SIGNATURE:
fc04c412 2110 return "protocol error (pack signature mismatch detected)";
a69e5429
JH
2111
2112 case PH_ERROR_PROTOCOL:
fc04c412 2113 return "protocol error (pack version unsupported)";
a69e5429
JH
2114
2115 default:
2116 return "unknown error in parse_pack_header";
2117
2118 case 0:
2119 return NULL;
2120 }
fc04c412
SP
2121}
2122
576162a4
NP
2123static const char *pack_lockfile;
2124
22f9b7f3 2125static void push_header_arg(struct strvec *args, struct pack_header *hdr)
446d5d91 2126{
22f9b7f3 2127 strvec_pushf(args, "--pack_header=%"PRIu32",%"PRIu32,
f6d8942b 2128 ntohl(hdr->hdr_version), ntohl(hdr->hdr_entries));
446d5d91
JK
2129}
2130
5dbd7676 2131static const char *unpack(int err_fd, struct shallow_info *si)
575f4974 2132{
fc04c412
SP
2133 struct pack_header hdr;
2134 const char *hdr_err;
31c42bff 2135 int status;
d3180279 2136 struct child_process child = CHILD_PROCESS_INIT;
dab76d3a
JH
2137 int fsck_objects = (receive_fsck_objects >= 0
2138 ? receive_fsck_objects
2139 : transfer_fsck_objects >= 0
2140 ? transfer_fsck_objects
2141 : 0);
fc04c412
SP
2142
2143 hdr_err = parse_pack_header(&hdr);
49ecfa13
JK
2144 if (hdr_err) {
2145 if (err_fd > 0)
2146 close(err_fd);
fc04c412 2147 return hdr_err;
49ecfa13 2148 }
fc04c412 2149
5dbd7676
NTND
2150 if (si->nr_ours || si->nr_theirs) {
2151 alt_shallow_file = setup_temporary_shallow(si->shallow);
22f9b7f3
JK
2152 strvec_push(&child.args, "--shallow-file");
2153 strvec_push(&child.args, alt_shallow_file);
5dbd7676
NTND
2154 }
2155
722ff7f8 2156 tmp_objdir = tmp_objdir_create();
6cdad1f1
JK
2157 if (!tmp_objdir) {
2158 if (err_fd > 0)
2159 close(err_fd);
722ff7f8 2160 return "unable to create temporary object directory";
6cdad1f1 2161 }
722ff7f8
JK
2162 child.env = tmp_objdir_env(tmp_objdir);
2163
2164 /*
2165 * Normally we just pass the tmp_objdir environment to the child
2166 * processes that do the heavy lifting, but we may need to see these
2167 * objects ourselves to set up shallow information.
2168 */
2169 tmp_objdir_add_as_alternate(tmp_objdir);
2170
fc04c412 2171 if (ntohl(hdr.hdr_entries) < unpack_limit) {
22f9b7f3 2172 strvec_push(&child.args, "unpack-objects");
446d5d91 2173 push_header_arg(&child.args, &hdr);
c207e34f 2174 if (quiet)
22f9b7f3 2175 strvec_push(&child.args, "-q");
dab76d3a 2176 if (fsck_objects)
22f9b7f3 2177 strvec_pushf(&child.args, "--strict%s",
f6d8942b 2178 fsck_msg_types.buf);
c08db5a2 2179 if (max_input_size)
22f9b7f3 2180 strvec_pushf(&child.args, "--max-input-size=%"PRIuMAX,
f6d8942b 2181 (uintmax_t)max_input_size);
59bfdfb8 2182 child.no_stdout = 1;
a22e6f85 2183 child.err = err_fd;
59bfdfb8 2184 child.git_cmd = 1;
31c42bff
NTND
2185 status = run_command(&child);
2186 if (status)
2187 return "unpack-objects abnormal exit";
576162a4 2188 } else {
da25bdb7 2189 char hostname[HOST_NAME_MAX + 1];
576162a4 2190
22f9b7f3 2191 strvec_pushl(&child.args, "index-pack", "--stdin", NULL);
446d5d91 2192 push_header_arg(&child.args, &hdr);
b26cb7c7 2193
5781a9a2 2194 if (xgethostname(hostname, sizeof(hostname)))
b26cb7c7 2195 xsnprintf(hostname, sizeof(hostname), "localhost");
22f9b7f3 2196 strvec_pushf(&child.args,
f6d8942b
JK
2197 "--keep=receive-pack %"PRIuMAX" on %s",
2198 (uintmax_t)getpid(),
2199 hostname);
b26cb7c7 2200
d06303bb 2201 if (!quiet && err_fd)
22f9b7f3 2202 strvec_push(&child.args, "--show-resolving-progress");
83558686 2203 if (use_sideband)
22f9b7f3 2204 strvec_push(&child.args, "--report-end-of-input");
dab76d3a 2205 if (fsck_objects)
22f9b7f3 2206 strvec_pushf(&child.args, "--strict%s",
f6d8942b 2207 fsck_msg_types.buf);
1b68387e 2208 if (!reject_thin)
22f9b7f3 2209 strvec_push(&child.args, "--fix-thin");
c08db5a2 2210 if (max_input_size)
22f9b7f3 2211 strvec_pushf(&child.args, "--max-input-size=%"PRIuMAX,
f6d8942b 2212 (uintmax_t)max_input_size);
31c42bff
NTND
2213 child.out = -1;
2214 child.err = err_fd;
2215 child.git_cmd = 1;
2216 status = start_command(&child);
2217 if (status)
576162a4 2218 return "index-pack fork failed";
31c42bff
NTND
2219 pack_lockfile = index_pack_lockfile(child.out);
2220 close(child.out);
2221 status = finish_command(&child);
2222 if (status)
2223 return "index-pack abnormal exit";
a49d2834 2224 reprepare_packed_git(the_repository);
cfee10a7 2225 }
31c42bff 2226 return NULL;
cfee10a7
JH
2227}
2228
5dbd7676 2229static const char *unpack_with_sideband(struct shallow_info *si)
a22e6f85
JK
2230{
2231 struct async muxer;
2232 const char *ret;
2233
2234 if (!use_sideband)
5dbd7676 2235 return unpack(0, si);
a22e6f85 2236
83558686 2237 use_keepalive = KEEPALIVE_AFTER_NUL;
a22e6f85
JK
2238 memset(&muxer, 0, sizeof(muxer));
2239 muxer.proc = copy_to_sideband;
2240 muxer.in = -1;
2241 if (start_async(&muxer))
2242 return NULL;
2243
5dbd7676 2244 ret = unpack(muxer.in, si);
a22e6f85
JK
2245
2246 finish_async(&muxer);
2247 return ret;
2248}
2249
c95fc72f 2250static void prepare_shallow_update(struct shallow_info *si)
0a1bc12b 2251{
42c78a21 2252 int i, j, k, bitmap_size = DIV_ROUND_UP(si->ref->nr, 32);
0a1bc12b 2253
b32fa95f 2254 ALLOC_ARRAY(si->used_shallow, si->shallow->nr);
0a1bc12b
NTND
2255 assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
2256
2257 si->need_reachability_test =
2258 xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
2259 si->reachable =
2260 xcalloc(si->shallow->nr, sizeof(*si->reachable));
2261 si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
2262
2263 for (i = 0; i < si->nr_ours; i++)
2264 si->need_reachability_test[si->ours[i]] = 1;
2265
2266 for (i = 0; i < si->shallow->nr; i++) {
2267 if (!si->used_shallow[i])
2268 continue;
2269 for (j = 0; j < bitmap_size; j++) {
2270 if (!si->used_shallow[i][j])
2271 continue;
2272 si->need_reachability_test[i]++;
2273 for (k = 0; k < 32; k++)
9a93c668 2274 if (si->used_shallow[i][j] & (1U << k))
0a1bc12b
NTND
2275 si->shallow_ref[j * 32 + k]++;
2276 }
2277
2278 /*
2279 * true for those associated with some refs and belong
2280 * in "ours" list aka "step 7 not done yet"
2281 */
2282 si->need_reachability_test[i] =
2283 si->need_reachability_test[i] > 1;
2284 }
2285
2286 /*
2287 * keep hooks happy by forcing a temporary shallow file via
2288 * env variable because we can't add --shallow-file to every
7987d223 2289 * command. check_connected() will be done with
0a1bc12b
NTND
2290 * true .git/shallow though.
2291 */
2292 setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
2293}
2294
5dbd7676
NTND
2295static void update_shallow_info(struct command *commands,
2296 struct shallow_info *si,
910650d2 2297 struct oid_array *ref)
5dbd7676
NTND
2298{
2299 struct command *cmd;
2300 int *ref_status;
2301 remove_nonexistent_theirs_shallow(si);
0a1bc12b
NTND
2302 if (!si->nr_ours && !si->nr_theirs) {
2303 shallow_update = 0;
5dbd7676 2304 return;
0a1bc12b 2305 }
5dbd7676
NTND
2306
2307 for (cmd = commands; cmd; cmd = cmd->next) {
9c44ea44 2308 if (is_null_oid(&cmd->new_oid))
5dbd7676 2309 continue;
910650d2 2310 oid_array_append(ref, &cmd->new_oid);
5dbd7676
NTND
2311 cmd->index = ref->nr - 1;
2312 }
2313 si->ref = ref;
2314
0a1bc12b 2315 if (shallow_update) {
c95fc72f 2316 prepare_shallow_update(si);
0a1bc12b
NTND
2317 return;
2318 }
2319
b32fa95f 2320 ALLOC_ARRAY(ref_status, ref->nr);
5dbd7676
NTND
2321 assign_shallow_commits_to_refs(si, NULL, ref_status);
2322 for (cmd = commands; cmd; cmd = cmd->next) {
9c44ea44 2323 if (is_null_oid(&cmd->new_oid))
5dbd7676
NTND
2324 continue;
2325 if (ref_status[cmd->index]) {
2326 cmd->error_string = "shallow update not allowed";
2327 cmd->skip_update = 1;
2328 }
2329 }
5dbd7676
NTND
2330 free(ref_status);
2331}
2332
5e1c71fd 2333static void report(struct command *commands, const char *unpack_status)
cfee10a7
JH
2334{
2335 struct command *cmd;
38a81b4e
SP
2336 struct strbuf buf = STRBUF_INIT;
2337
2338 packet_buf_write(&buf, "unpack %s\n",
2339 unpack_status ? unpack_status : "ok");
cfee10a7
JH
2340 for (cmd = commands; cmd; cmd = cmd->next) {
2341 if (!cmd->error_string)
38a81b4e
SP
2342 packet_buf_write(&buf, "ok %s\n",
2343 cmd->ref_name);
cfee10a7 2344 else
38a81b4e
SP
2345 packet_buf_write(&buf, "ng %s %s\n",
2346 cmd->ref_name, cmd->error_string);
575f4974 2347 }
38a81b4e
SP
2348 packet_buf_flush(&buf);
2349
2350 if (use_sideband)
2351 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
2352 else
cdf4fb8e 2353 write_or_die(1, buf.buf, buf.len);
38a81b4e 2354 strbuf_release(&buf);
575f4974
LT
2355}
2356
63518a57
JX
2357static void report_v2(struct command *commands, const char *unpack_status)
2358{
2359 struct command *cmd;
2360 struct strbuf buf = STRBUF_INIT;
2361 struct ref_push_report *report;
2362
2363 packet_buf_write(&buf, "unpack %s\n",
2364 unpack_status ? unpack_status : "ok");
2365 for (cmd = commands; cmd; cmd = cmd->next) {
2366 int count = 0;
2367
2368 if (cmd->error_string) {
2369 packet_buf_write(&buf, "ng %s %s\n",
2370 cmd->ref_name,
2371 cmd->error_string);
2372 continue;
2373 }
2374 packet_buf_write(&buf, "ok %s\n",
2375 cmd->ref_name);
2376 for (report = cmd->report; report; report = report->next) {
2377 if (count++ > 0)
2378 packet_buf_write(&buf, "ok %s\n",
2379 cmd->ref_name);
2380 if (report->ref_name)
2381 packet_buf_write(&buf, "option refname %s\n",
2382 report->ref_name);
2383 if (report->old_oid)
2384 packet_buf_write(&buf, "option old-oid %s\n",
2385 oid_to_hex(report->old_oid));
2386 if (report->new_oid)
2387 packet_buf_write(&buf, "option new-oid %s\n",
2388 oid_to_hex(report->new_oid));
2389 if (report->forced_update)
2390 packet_buf_write(&buf, "option forced-update\n");
2391 }
2392 }
2393 packet_buf_flush(&buf);
2394
2395 if (use_sideband)
2396 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
2397 else
2398 write_or_die(1, buf.buf, buf.len);
2399 strbuf_release(&buf);
2400}
2401
5e1c71fd 2402static int delete_only(struct command *commands)
d4f694ba 2403{
5e1c71fd
JS
2404 struct command *cmd;
2405 for (cmd = commands; cmd; cmd = cmd->next) {
9c44ea44 2406 if (!is_null_oid(&cmd->new_oid))
d4f694ba 2407 return 0;
d4f694ba
JH
2408 }
2409 return 1;
2410}
2411
be5908ae 2412int cmd_receive_pack(int argc, const char **argv, const char *prefix)
575f4974 2413{
42526b47 2414 int advertise_refs = 0;
5e1c71fd 2415 struct command *commands;
910650d2 2416 struct oid_array shallow = OID_ARRAY_INIT;
2417 struct oid_array ref = OID_ARRAY_INIT;
5dbd7676 2418 struct shallow_info si;
01f9ec64 2419 struct packet_reader reader;
575f4974 2420
1b68387e
SS
2421 struct option options[] = {
2422 OPT__QUIET(&quiet, N_("quiet")),
2423 OPT_HIDDEN_BOOL(0, "stateless-rpc", &stateless_rpc, NULL),
2424 OPT_HIDDEN_BOOL(0, "advertise-refs", &advertise_refs, NULL),
2425 OPT_HIDDEN_BOOL(0, "reject-thin-pack-for-testing", &reject_thin, NULL),
2426 OPT_END()
2427 };
bbc30f99 2428
1b68387e 2429 packet_trace_identity("receive-pack");
575f4974 2430
1b68387e 2431 argc = parse_options(argc, argv, prefix, options, receive_pack_usage, 0);
c207e34f 2432
1b68387e
SS
2433 if (argc > 1)
2434 usage_msg_opt(_("Too many arguments."), receive_pack_usage, options);
2435 if (argc == 0)
2436 usage_msg_opt(_("You must specify a directory."), receive_pack_usage, options);
42526b47 2437
1b68387e 2438 service_dir = argv[0];
575f4974 2439
e1464ca7 2440 setup_path();
5c09f321 2441
5732373d
JH
2442 if (!enter_repo(service_dir, 0))
2443 die("'%s' does not appear to be a git repository", service_dir);
575f4974 2444
ef90d6d4 2445 git_config(receive_pack_config, NULL);
b89363e4 2446 if (cert_nonce_seed)
5732373d 2447 push_cert_nonce = prepare_push_cert_nonce(service_dir, time(NULL));
6fb75bed 2448
e28714c5
JH
2449 if (0 <= transfer_unpack_limit)
2450 unpack_limit = transfer_unpack_limit;
2451 else if (0 <= receive_unpack_limit)
2452 unpack_limit = receive_unpack_limit;
2453
aa9bab29 2454 switch (determine_protocol_version_server()) {
8f6982b4
BW
2455 case protocol_v2:
2456 /*
2457 * push support for protocol v2 has not been implemented yet,
2458 * so ignore the request to use v2 and fallback to using v0.
2459 */
2460 break;
aa9bab29
BW
2461 case protocol_v1:
2462 /*
2463 * v1 is just the original protocol with a version string,
2464 * so just fall through after writing the version string.
2465 */
2466 if (advertise_refs || !stateless_rpc)
2467 packet_write_fmt(1, "version 1\n");
2468
2469 /* fallthrough */
2470 case protocol_v0:
2471 break;
2472 case protocol_unknown_version:
2473 BUG("unknown protocol version");
2474 }
2475
42526b47 2476 if (advertise_refs || !stateless_rpc) {
42526b47 2477 write_head_info();
42526b47
SP
2478 }
2479 if (advertise_refs)
2480 return 0;
575f4974 2481
2d103c31
MS
2482 packet_reader_init(&reader, 0, NULL, 0,
2483 PACKET_READ_CHOMP_NEWLINE |
2484 PACKET_READ_DIE_ON_ERR_PACKET);
01f9ec64
MS
2485
2486 if ((commands = read_head_info(&reader, &shallow)) != NULL) {
d4f694ba 2487 const char *unpack_status = NULL;
77a9745d 2488 struct string_list push_options = STRING_LIST_INIT_DUP;
d4f694ba 2489
c714e45f 2490 if (use_push_options)
01f9ec64 2491 read_push_options(&reader, &push_options);
cbaf82cc
JT
2492 if (!check_cert_push_options(&push_options)) {
2493 struct command *cmd;
2494 for (cmd = commands; cmd; cmd = cmd->next)
2495 cmd->error_string = "inconsistent push options";
2496 }
c714e45f 2497
5dbd7676 2498 prepare_shallow_info(&si, &shallow);
0a1bc12b
NTND
2499 if (!si.nr_ours && !si.nr_theirs)
2500 shallow_update = 0;
5dbd7676
NTND
2501 if (!delete_only(commands)) {
2502 unpack_status = unpack_with_sideband(&si);
2503 update_shallow_info(commands, &si, &ref);
2504 }
83558686 2505 use_keepalive = KEEPALIVE_ALWAYS;
77a9745d
SB
2506 execute_commands(commands, unpack_status, &si,
2507 &push_options);
576162a4 2508 if (pack_lockfile)
691f1a28 2509 unlink_or_warn(pack_lockfile);
63518a57
JX
2510 if (report_status_v2)
2511 report_v2(commands, unpack_status);
2512 else if (report_status)
5e1c71fd 2513 report(commands, unpack_status);
77a9745d
SB
2514 run_receive_hook(commands, "post-receive", 1,
2515 &push_options);
8e663d9e 2516 run_update_post_hook(commands);
4432dd6b 2517 string_list_clear(&push_options, 0);
77e3efbf
JH
2518 if (auto_gc) {
2519 const char *argv_gc_auto[] = {
2520 "gc", "--auto", "--quiet", NULL,
2521 };
860a2ebe
LF
2522 struct child_process proc = CHILD_PROCESS_INIT;
2523
2524 proc.no_stdin = 1;
2525 proc.stdout_to_stderr = 1;
2526 proc.err = use_sideband ? -1 : 0;
2527 proc.git_cmd = 1;
2528 proc.argv = argv_gc_auto;
2529
2d511cfc 2530 close_object_store(the_repository->objects);
860a2ebe
LF
2531 if (!start_command(&proc)) {
2532 if (use_sideband)
2533 copy_to_sideband(proc.err, -1, NULL);
2534 finish_command(&proc);
2535 }
77e3efbf
JH
2536 }
2537 if (auto_update_server_info)
2538 update_server_info(0);
5dbd7676 2539 clear_shallow_info(&si);
7f8e9828 2540 }
38a81b4e
SP
2541 if (use_sideband)
2542 packet_flush(1);
910650d2 2543 oid_array_clear(&shallow);
2544 oid_array_clear(&ref);
b89363e4 2545 free((void *)push_cert_nonce);
575f4974
LT
2546 return 0;
2547}