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