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