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