treewide: include parse-options.h in source files
[git/debian.git] / builtin / receive-pack.c
blobf85f72a183b6320c60ea1794f9b028b63e671cf6
1 #include "builtin.h"
2 #include "repository.h"
3 #include "config.h"
4 #include "lockfile.h"
5 #include "pack.h"
6 #include "refs.h"
7 #include "pkt-line.h"
8 #include "sideband.h"
9 #include "run-command.h"
10 #include "hook.h"
11 #include "exec-cmd.h"
12 #include "commit.h"
13 #include "object.h"
14 #include "remote.h"
15 #include "connect.h"
16 #include "string-list.h"
17 #include "oid-array.h"
18 #include "connected.h"
19 #include "strvec.h"
20 #include "version.h"
21 #include "tag.h"
22 #include "gpg-interface.h"
23 #include "sigchain.h"
24 #include "fsck.h"
25 #include "tmp-objdir.h"
26 #include "oidset.h"
27 #include "packfile.h"
28 #include "object-store.h"
29 #include "protocol.h"
30 #include "commit-reach.h"
31 #include "worktree.h"
32 #include "shallow.h"
33 #include "parse-options.h"
35 static const char * const receive_pack_usage[] = {
36 N_("git receive-pack <git-dir>"),
37 NULL
40 enum deny_action {
41 DENY_UNCONFIGURED,
42 DENY_IGNORE,
43 DENY_WARN,
44 DENY_REFUSE,
45 DENY_UPDATE_INSTEAD
48 static int deny_deletes;
49 static int deny_non_fast_forwards;
50 static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
51 static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
52 static int receive_fsck_objects = -1;
53 static int transfer_fsck_objects = -1;
54 static struct strbuf fsck_msg_types = STRBUF_INIT;
55 static int receive_unpack_limit = -1;
56 static int transfer_unpack_limit = -1;
57 static int advertise_atomic_push = 1;
58 static int advertise_push_options;
59 static int advertise_sid;
60 static int unpack_limit = 100;
61 static off_t max_input_size;
62 static int report_status;
63 static int report_status_v2;
64 static int use_sideband;
65 static int use_atomic;
66 static int use_push_options;
67 static int quiet;
68 static int prefer_ofs_delta = 1;
69 static int auto_update_server_info;
70 static int auto_gc = 1;
71 static int reject_thin;
72 static int stateless_rpc;
73 static const char *service_dir;
74 static const char *head_name;
75 static void *head_name_to_free;
76 static int sent_capabilities;
77 static int shallow_update;
78 static const char *alt_shallow_file;
79 static struct strbuf push_cert = STRBUF_INIT;
80 static struct object_id push_cert_oid;
81 static struct signature_check sigcheck;
82 static const char *push_cert_nonce;
83 static const char *cert_nonce_seed;
84 static struct string_list hidden_refs = STRING_LIST_INIT_DUP;
86 static const char *NONCE_UNSOLICITED = "UNSOLICITED";
87 static const char *NONCE_BAD = "BAD";
88 static const char *NONCE_MISSING = "MISSING";
89 static const char *NONCE_OK = "OK";
90 static const char *NONCE_SLOP = "SLOP";
91 static const char *nonce_status;
92 static long nonce_stamp_slop;
93 static timestamp_t nonce_stamp_slop_limit;
94 static struct ref_transaction *transaction;
96 static enum {
97 KEEPALIVE_NEVER = 0,
98 KEEPALIVE_AFTER_NUL,
99 KEEPALIVE_ALWAYS
100 } use_keepalive;
101 static int keepalive_in_sec = 5;
103 static struct tmp_objdir *tmp_objdir;
105 static struct proc_receive_ref {
106 unsigned int want_add:1,
107 want_delete:1,
108 want_modify:1,
109 negative_ref:1;
110 char *ref_prefix;
111 struct proc_receive_ref *next;
112 } *proc_receive_ref;
114 static void proc_receive_ref_append(const char *prefix);
116 static enum deny_action parse_deny_action(const char *var, const char *value)
118 if (value) {
119 if (!strcasecmp(value, "ignore"))
120 return DENY_IGNORE;
121 if (!strcasecmp(value, "warn"))
122 return DENY_WARN;
123 if (!strcasecmp(value, "refuse"))
124 return DENY_REFUSE;
125 if (!strcasecmp(value, "updateinstead"))
126 return DENY_UPDATE_INSTEAD;
128 if (git_config_bool(var, value))
129 return DENY_REFUSE;
130 return DENY_IGNORE;
133 static int receive_pack_config(const char *var, const char *value, void *cb)
135 int status = parse_hide_refs_config(var, value, "receive", &hidden_refs);
137 if (status)
138 return status;
140 status = git_gpg_config(var, value, NULL);
141 if (status)
142 return status;
144 if (strcmp(var, "receive.denydeletes") == 0) {
145 deny_deletes = git_config_bool(var, value);
146 return 0;
149 if (strcmp(var, "receive.denynonfastforwards") == 0) {
150 deny_non_fast_forwards = git_config_bool(var, value);
151 return 0;
154 if (strcmp(var, "receive.unpacklimit") == 0) {
155 receive_unpack_limit = git_config_int(var, value);
156 return 0;
159 if (strcmp(var, "transfer.unpacklimit") == 0) {
160 transfer_unpack_limit = git_config_int(var, value);
161 return 0;
164 if (strcmp(var, "receive.fsck.skiplist") == 0) {
165 const char *path;
167 if (git_config_pathname(&path, var, value))
168 return 1;
169 strbuf_addf(&fsck_msg_types, "%cskiplist=%s",
170 fsck_msg_types.len ? ',' : '=', path);
171 free((char *)path);
172 return 0;
175 if (skip_prefix(var, "receive.fsck.", &var)) {
176 if (is_valid_msg_type(var, value))
177 strbuf_addf(&fsck_msg_types, "%c%s=%s",
178 fsck_msg_types.len ? ',' : '=', var, value);
179 else
180 warning("skipping unknown msg id '%s'", var);
181 return 0;
184 if (strcmp(var, "receive.fsckobjects") == 0) {
185 receive_fsck_objects = git_config_bool(var, value);
186 return 0;
189 if (strcmp(var, "transfer.fsckobjects") == 0) {
190 transfer_fsck_objects = git_config_bool(var, value);
191 return 0;
194 if (!strcmp(var, "receive.denycurrentbranch")) {
195 deny_current_branch = parse_deny_action(var, value);
196 return 0;
199 if (strcmp(var, "receive.denydeletecurrent") == 0) {
200 deny_delete_current = parse_deny_action(var, value);
201 return 0;
204 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
205 prefer_ofs_delta = git_config_bool(var, value);
206 return 0;
209 if (strcmp(var, "receive.updateserverinfo") == 0) {
210 auto_update_server_info = git_config_bool(var, value);
211 return 0;
214 if (strcmp(var, "receive.autogc") == 0) {
215 auto_gc = git_config_bool(var, value);
216 return 0;
219 if (strcmp(var, "receive.shallowupdate") == 0) {
220 shallow_update = git_config_bool(var, value);
221 return 0;
224 if (strcmp(var, "receive.certnonceseed") == 0)
225 return git_config_string(&cert_nonce_seed, var, value);
227 if (strcmp(var, "receive.certnonceslop") == 0) {
228 nonce_stamp_slop_limit = git_config_ulong(var, value);
229 return 0;
232 if (strcmp(var, "receive.advertiseatomic") == 0) {
233 advertise_atomic_push = git_config_bool(var, value);
234 return 0;
237 if (strcmp(var, "receive.advertisepushoptions") == 0) {
238 advertise_push_options = git_config_bool(var, value);
239 return 0;
242 if (strcmp(var, "receive.keepalive") == 0) {
243 keepalive_in_sec = git_config_int(var, value);
244 return 0;
247 if (strcmp(var, "receive.maxinputsize") == 0) {
248 max_input_size = git_config_int64(var, value);
249 return 0;
252 if (strcmp(var, "receive.procreceiverefs") == 0) {
253 if (!value)
254 return config_error_nonbool(var);
255 proc_receive_ref_append(value);
256 return 0;
259 if (strcmp(var, "transfer.advertisesid") == 0) {
260 advertise_sid = git_config_bool(var, value);
261 return 0;
264 return git_default_config(var, value, cb);
267 static void show_ref(const char *path, const struct object_id *oid)
269 if (sent_capabilities) {
270 packet_write_fmt(1, "%s %s\n", oid_to_hex(oid), path);
271 } else {
272 struct strbuf cap = STRBUF_INIT;
274 strbuf_addstr(&cap,
275 "report-status report-status-v2 delete-refs side-band-64k quiet");
276 if (advertise_atomic_push)
277 strbuf_addstr(&cap, " atomic");
278 if (prefer_ofs_delta)
279 strbuf_addstr(&cap, " ofs-delta");
280 if (push_cert_nonce)
281 strbuf_addf(&cap, " push-cert=%s", push_cert_nonce);
282 if (advertise_push_options)
283 strbuf_addstr(&cap, " push-options");
284 if (advertise_sid)
285 strbuf_addf(&cap, " session-id=%s", trace2_session_id());
286 strbuf_addf(&cap, " object-format=%s", the_hash_algo->name);
287 strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
288 packet_write_fmt(1, "%s %s%c%s\n",
289 oid_to_hex(oid), path, 0, cap.buf);
290 strbuf_release(&cap);
291 sent_capabilities = 1;
295 static int show_ref_cb(const char *path_full, const struct object_id *oid,
296 int flag UNUSED, void *data)
298 struct oidset *seen = data;
299 const char *path = strip_namespace(path_full);
301 if (ref_is_hidden(path, path_full, &hidden_refs))
302 return 0;
305 * Advertise refs outside our current namespace as ".have"
306 * refs, so that the client can use them to minimize data
307 * transfer but will otherwise ignore them.
309 if (!path) {
310 if (oidset_insert(seen, oid))
311 return 0;
312 path = ".have";
313 } else {
314 oidset_insert(seen, oid);
316 show_ref(path, oid);
317 return 0;
320 static void show_one_alternate_ref(const struct object_id *oid,
321 void *data)
323 struct oidset *seen = data;
325 if (oidset_insert(seen, oid))
326 return;
328 show_ref(".have", oid);
331 static void write_head_info(void)
333 static struct oidset seen = OIDSET_INIT;
335 for_each_ref(show_ref_cb, &seen);
336 for_each_alternate_ref(show_one_alternate_ref, &seen);
337 oidset_clear(&seen);
338 if (!sent_capabilities)
339 show_ref("capabilities^{}", null_oid());
341 advertise_shallow_grafts(1);
343 /* EOF */
344 packet_flush(1);
347 #define RUN_PROC_RECEIVE_SCHEDULED 1
348 #define RUN_PROC_RECEIVE_RETURNED 2
349 struct command {
350 struct command *next;
351 const char *error_string;
352 struct ref_push_report *report;
353 unsigned int skip_update:1,
354 did_not_exist:1,
355 run_proc_receive:2;
356 int index;
357 struct object_id old_oid;
358 struct object_id new_oid;
359 char ref_name[FLEX_ARRAY]; /* more */
362 static void proc_receive_ref_append(const char *prefix)
364 struct proc_receive_ref *ref_pattern;
365 char *p;
366 int len;
368 CALLOC_ARRAY(ref_pattern, 1);
369 p = strchr(prefix, ':');
370 if (p) {
371 while (prefix < p) {
372 if (*prefix == 'a')
373 ref_pattern->want_add = 1;
374 else if (*prefix == 'd')
375 ref_pattern->want_delete = 1;
376 else if (*prefix == 'm')
377 ref_pattern->want_modify = 1;
378 else if (*prefix == '!')
379 ref_pattern->negative_ref = 1;
380 prefix++;
382 prefix++;
383 } else {
384 ref_pattern->want_add = 1;
385 ref_pattern->want_delete = 1;
386 ref_pattern->want_modify = 1;
388 len = strlen(prefix);
389 while (len && prefix[len - 1] == '/')
390 len--;
391 ref_pattern->ref_prefix = xmemdupz(prefix, len);
392 if (!proc_receive_ref) {
393 proc_receive_ref = ref_pattern;
394 } else {
395 struct proc_receive_ref *end;
397 end = proc_receive_ref;
398 while (end->next)
399 end = end->next;
400 end->next = ref_pattern;
404 static int proc_receive_ref_matches(struct command *cmd)
406 struct proc_receive_ref *p;
408 if (!proc_receive_ref)
409 return 0;
411 for (p = proc_receive_ref; p; p = p->next) {
412 const char *match = p->ref_prefix;
413 const char *remains;
415 if (!p->want_add && is_null_oid(&cmd->old_oid))
416 continue;
417 else if (!p->want_delete && is_null_oid(&cmd->new_oid))
418 continue;
419 else if (!p->want_modify &&
420 !is_null_oid(&cmd->old_oid) &&
421 !is_null_oid(&cmd->new_oid))
422 continue;
424 if (skip_prefix(cmd->ref_name, match, &remains) &&
425 (!*remains || *remains == '/')) {
426 if (!p->negative_ref)
427 return 1;
428 } else if (p->negative_ref) {
429 return 1;
432 return 0;
435 static void report_message(const char *prefix, const char *err, va_list params)
437 int sz;
438 char msg[4096];
440 sz = xsnprintf(msg, sizeof(msg), "%s", prefix);
441 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
442 if (sz > (sizeof(msg) - 1))
443 sz = sizeof(msg) - 1;
444 msg[sz++] = '\n';
446 if (use_sideband)
447 send_sideband(1, 2, msg, sz, use_sideband);
448 else
449 xwrite(2, msg, sz);
452 __attribute__((format (printf, 1, 2)))
453 static void rp_warning(const char *err, ...)
455 va_list params;
456 va_start(params, err);
457 report_message("warning: ", err, params);
458 va_end(params);
461 __attribute__((format (printf, 1, 2)))
462 static void rp_error(const char *err, ...)
464 va_list params;
465 va_start(params, err);
466 report_message("error: ", err, params);
467 va_end(params);
470 static int copy_to_sideband(int in, int out UNUSED, void *arg UNUSED)
472 char data[128];
473 int keepalive_active = 0;
475 if (keepalive_in_sec <= 0)
476 use_keepalive = KEEPALIVE_NEVER;
477 if (use_keepalive == KEEPALIVE_ALWAYS)
478 keepalive_active = 1;
480 while (1) {
481 ssize_t sz;
483 if (keepalive_active) {
484 struct pollfd pfd;
485 int ret;
487 pfd.fd = in;
488 pfd.events = POLLIN;
489 ret = poll(&pfd, 1, 1000 * keepalive_in_sec);
491 if (ret < 0) {
492 if (errno == EINTR)
493 continue;
494 else
495 break;
496 } else if (ret == 0) {
497 /* no data; send a keepalive packet */
498 static const char buf[] = "0005\1";
499 write_or_die(1, buf, sizeof(buf) - 1);
500 continue;
501 } /* else there is actual data to read */
504 sz = xread(in, data, sizeof(data));
505 if (sz <= 0)
506 break;
508 if (use_keepalive == KEEPALIVE_AFTER_NUL && !keepalive_active) {
509 const char *p = memchr(data, '\0', sz);
510 if (p) {
512 * The NUL tells us to start sending keepalives. Make
513 * sure we send any other data we read along
514 * with it.
516 keepalive_active = 1;
517 send_sideband(1, 2, data, p - data, use_sideband);
518 send_sideband(1, 2, p + 1, sz - (p - data + 1), use_sideband);
519 continue;
524 * Either we're not looking for a NUL signal, or we didn't see
525 * it yet; just pass along the data.
527 send_sideband(1, 2, data, sz, use_sideband);
529 close(in);
530 return 0;
533 static void hmac_hash(unsigned char *out,
534 const char *key_in, size_t key_len,
535 const char *text, size_t text_len)
537 unsigned char key[GIT_MAX_BLKSZ];
538 unsigned char k_ipad[GIT_MAX_BLKSZ];
539 unsigned char k_opad[GIT_MAX_BLKSZ];
540 int i;
541 git_hash_ctx ctx;
543 /* RFC 2104 2. (1) */
544 memset(key, '\0', GIT_MAX_BLKSZ);
545 if (the_hash_algo->blksz < key_len) {
546 the_hash_algo->init_fn(&ctx);
547 the_hash_algo->update_fn(&ctx, key_in, key_len);
548 the_hash_algo->final_fn(key, &ctx);
549 } else {
550 memcpy(key, key_in, key_len);
553 /* RFC 2104 2. (2) & (5) */
554 for (i = 0; i < sizeof(key); i++) {
555 k_ipad[i] = key[i] ^ 0x36;
556 k_opad[i] = key[i] ^ 0x5c;
559 /* RFC 2104 2. (3) & (4) */
560 the_hash_algo->init_fn(&ctx);
561 the_hash_algo->update_fn(&ctx, k_ipad, sizeof(k_ipad));
562 the_hash_algo->update_fn(&ctx, text, text_len);
563 the_hash_algo->final_fn(out, &ctx);
565 /* RFC 2104 2. (6) & (7) */
566 the_hash_algo->init_fn(&ctx);
567 the_hash_algo->update_fn(&ctx, k_opad, sizeof(k_opad));
568 the_hash_algo->update_fn(&ctx, out, the_hash_algo->rawsz);
569 the_hash_algo->final_fn(out, &ctx);
572 static char *prepare_push_cert_nonce(const char *path, timestamp_t stamp)
574 struct strbuf buf = STRBUF_INIT;
575 unsigned char hash[GIT_MAX_RAWSZ];
577 strbuf_addf(&buf, "%s:%"PRItime, path, stamp);
578 hmac_hash(hash, buf.buf, buf.len, cert_nonce_seed, strlen(cert_nonce_seed));
579 strbuf_release(&buf);
581 /* RFC 2104 5. HMAC-SHA1 or HMAC-SHA256 */
582 strbuf_addf(&buf, "%"PRItime"-%.*s", stamp, (int)the_hash_algo->hexsz, hash_to_hex(hash));
583 return strbuf_detach(&buf, NULL);
586 static char *find_header(const char *msg, size_t len, const char *key,
587 const char **next_line)
589 size_t out_len;
590 const char *val = find_header_mem(msg, len, key, &out_len);
592 if (!val)
593 return NULL;
595 if (next_line)
596 *next_line = val + out_len + 1;
598 return xmemdupz(val, out_len);
602 * Return zero if a and b are equal up to n bytes and nonzero if they are not.
603 * This operation is guaranteed to run in constant time to avoid leaking data.
605 static int constant_memequal(const char *a, const char *b, size_t n)
607 int res = 0;
608 size_t i;
610 for (i = 0; i < n; i++)
611 res |= a[i] ^ b[i];
612 return res;
615 static const char *check_nonce(const char *buf, size_t len)
617 char *nonce = find_header(buf, len, "nonce", NULL);
618 timestamp_t stamp, ostamp;
619 char *bohmac, *expect = NULL;
620 const char *retval = NONCE_BAD;
621 size_t noncelen;
623 if (!nonce) {
624 retval = NONCE_MISSING;
625 goto leave;
626 } else if (!push_cert_nonce) {
627 retval = NONCE_UNSOLICITED;
628 goto leave;
629 } else if (!strcmp(push_cert_nonce, nonce)) {
630 retval = NONCE_OK;
631 goto leave;
634 if (!stateless_rpc) {
635 /* returned nonce MUST match what we gave out earlier */
636 retval = NONCE_BAD;
637 goto leave;
641 * In stateless mode, we may be receiving a nonce issued by
642 * another instance of the server that serving the same
643 * repository, and the timestamps may not match, but the
644 * nonce-seed and dir should match, so we can recompute and
645 * report the time slop.
647 * In addition, when a nonce issued by another instance has
648 * timestamp within receive.certnonceslop seconds, we pretend
649 * as if we issued that nonce when reporting to the hook.
652 /* nonce is concat(<seconds-since-epoch>, "-", <hmac>) */
653 if (*nonce <= '0' || '9' < *nonce) {
654 retval = NONCE_BAD;
655 goto leave;
657 stamp = parse_timestamp(nonce, &bohmac, 10);
658 if (bohmac == nonce || bohmac[0] != '-') {
659 retval = NONCE_BAD;
660 goto leave;
663 noncelen = strlen(nonce);
664 expect = prepare_push_cert_nonce(service_dir, stamp);
665 if (noncelen != strlen(expect)) {
666 /* This is not even the right size. */
667 retval = NONCE_BAD;
668 goto leave;
670 if (constant_memequal(expect, nonce, noncelen)) {
671 /* Not what we would have signed earlier */
672 retval = NONCE_BAD;
673 goto leave;
677 * By how many seconds is this nonce stale? Negative value
678 * would mean it was issued by another server with its clock
679 * skewed in the future.
681 ostamp = parse_timestamp(push_cert_nonce, NULL, 10);
682 nonce_stamp_slop = (long)ostamp - (long)stamp;
684 if (nonce_stamp_slop_limit &&
685 labs(nonce_stamp_slop) <= nonce_stamp_slop_limit) {
687 * Pretend as if the received nonce (which passes the
688 * HMAC check, so it is not a forged by third-party)
689 * is what we issued.
691 free((void *)push_cert_nonce);
692 push_cert_nonce = xstrdup(nonce);
693 retval = NONCE_OK;
694 } else {
695 retval = NONCE_SLOP;
698 leave:
699 free(nonce);
700 free(expect);
701 return retval;
705 * Return 1 if there is no push_cert or if the push options in push_cert are
706 * the same as those in the argument; 0 otherwise.
708 static int check_cert_push_options(const struct string_list *push_options)
710 const char *buf = push_cert.buf;
711 int len = push_cert.len;
713 char *option;
714 const char *next_line;
715 int options_seen = 0;
717 int retval = 1;
719 if (!len)
720 return 1;
722 while ((option = find_header(buf, len, "push-option", &next_line))) {
723 len -= (next_line - buf);
724 buf = next_line;
725 options_seen++;
726 if (options_seen > push_options->nr
727 || strcmp(option,
728 push_options->items[options_seen - 1].string)) {
729 retval = 0;
730 goto leave;
732 free(option);
735 if (options_seen != push_options->nr)
736 retval = 0;
738 leave:
739 free(option);
740 return retval;
743 static void prepare_push_cert_sha1(struct child_process *proc)
745 static int already_done;
747 if (!push_cert.len)
748 return;
750 if (!already_done) {
751 int bogs /* beginning_of_gpg_sig */;
753 already_done = 1;
754 if (write_object_file(push_cert.buf, push_cert.len, OBJ_BLOB,
755 &push_cert_oid))
756 oidclr(&push_cert_oid);
758 memset(&sigcheck, '\0', sizeof(sigcheck));
760 bogs = parse_signed_buffer(push_cert.buf, push_cert.len);
761 sigcheck.payload = xmemdupz(push_cert.buf, bogs);
762 sigcheck.payload_len = bogs;
763 check_signature(&sigcheck, push_cert.buf + bogs,
764 push_cert.len - bogs);
766 nonce_status = check_nonce(push_cert.buf, bogs);
768 if (!is_null_oid(&push_cert_oid)) {
769 strvec_pushf(&proc->env, "GIT_PUSH_CERT=%s",
770 oid_to_hex(&push_cert_oid));
771 strvec_pushf(&proc->env, "GIT_PUSH_CERT_SIGNER=%s",
772 sigcheck.signer ? sigcheck.signer : "");
773 strvec_pushf(&proc->env, "GIT_PUSH_CERT_KEY=%s",
774 sigcheck.key ? sigcheck.key : "");
775 strvec_pushf(&proc->env, "GIT_PUSH_CERT_STATUS=%c",
776 sigcheck.result);
777 if (push_cert_nonce) {
778 strvec_pushf(&proc->env,
779 "GIT_PUSH_CERT_NONCE=%s",
780 push_cert_nonce);
781 strvec_pushf(&proc->env,
782 "GIT_PUSH_CERT_NONCE_STATUS=%s",
783 nonce_status);
784 if (nonce_status == NONCE_SLOP)
785 strvec_pushf(&proc->env,
786 "GIT_PUSH_CERT_NONCE_SLOP=%ld",
787 nonce_stamp_slop);
792 struct receive_hook_feed_state {
793 struct command *cmd;
794 struct ref_push_report *report;
795 int skip_broken;
796 struct strbuf buf;
797 const struct string_list *push_options;
800 typedef int (*feed_fn)(void *, const char **, size_t *);
801 static int run_and_feed_hook(const char *hook_name, feed_fn feed,
802 struct receive_hook_feed_state *feed_state)
804 struct child_process proc = CHILD_PROCESS_INIT;
805 struct async muxer;
806 int code;
807 const char *hook_path = find_hook(hook_name);
809 if (!hook_path)
810 return 0;
812 strvec_push(&proc.args, hook_path);
813 proc.in = -1;
814 proc.stdout_to_stderr = 1;
815 proc.trace2_hook_name = hook_name;
817 if (feed_state->push_options) {
818 size_t i;
819 for (i = 0; i < feed_state->push_options->nr; i++)
820 strvec_pushf(&proc.env,
821 "GIT_PUSH_OPTION_%"PRIuMAX"=%s",
822 (uintmax_t)i,
823 feed_state->push_options->items[i].string);
824 strvec_pushf(&proc.env, "GIT_PUSH_OPTION_COUNT=%"PRIuMAX"",
825 (uintmax_t)feed_state->push_options->nr);
826 } else
827 strvec_pushf(&proc.env, "GIT_PUSH_OPTION_COUNT");
829 if (tmp_objdir)
830 strvec_pushv(&proc.env, tmp_objdir_env(tmp_objdir));
832 if (use_sideband) {
833 memset(&muxer, 0, sizeof(muxer));
834 muxer.proc = copy_to_sideband;
835 muxer.in = -1;
836 code = start_async(&muxer);
837 if (code)
838 return code;
839 proc.err = muxer.in;
842 prepare_push_cert_sha1(&proc);
844 code = start_command(&proc);
845 if (code) {
846 if (use_sideband)
847 finish_async(&muxer);
848 return code;
851 sigchain_push(SIGPIPE, SIG_IGN);
853 while (1) {
854 const char *buf;
855 size_t n;
856 if (feed(feed_state, &buf, &n))
857 break;
858 if (write_in_full(proc.in, buf, n) < 0)
859 break;
861 close(proc.in);
862 if (use_sideband)
863 finish_async(&muxer);
865 sigchain_pop(SIGPIPE);
867 return finish_command(&proc);
870 static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
872 struct receive_hook_feed_state *state = state_;
873 struct command *cmd = state->cmd;
875 while (cmd &&
876 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
877 cmd = cmd->next;
878 if (!cmd)
879 return -1; /* EOF */
880 if (!bufp)
881 return 0; /* OK, can feed something. */
882 strbuf_reset(&state->buf);
883 if (!state->report)
884 state->report = cmd->report;
885 if (state->report) {
886 struct object_id *old_oid;
887 struct object_id *new_oid;
888 const char *ref_name;
890 old_oid = state->report->old_oid ? state->report->old_oid : &cmd->old_oid;
891 new_oid = state->report->new_oid ? state->report->new_oid : &cmd->new_oid;
892 ref_name = state->report->ref_name ? state->report->ref_name : cmd->ref_name;
893 strbuf_addf(&state->buf, "%s %s %s\n",
894 oid_to_hex(old_oid), oid_to_hex(new_oid),
895 ref_name);
896 state->report = state->report->next;
897 if (!state->report)
898 state->cmd = cmd->next;
899 } else {
900 strbuf_addf(&state->buf, "%s %s %s\n",
901 oid_to_hex(&cmd->old_oid), oid_to_hex(&cmd->new_oid),
902 cmd->ref_name);
903 state->cmd = cmd->next;
905 if (bufp) {
906 *bufp = state->buf.buf;
907 *sizep = state->buf.len;
909 return 0;
912 static int run_receive_hook(struct command *commands,
913 const char *hook_name,
914 int skip_broken,
915 const struct string_list *push_options)
917 struct receive_hook_feed_state state;
918 int status;
920 strbuf_init(&state.buf, 0);
921 state.cmd = commands;
922 state.skip_broken = skip_broken;
923 state.report = NULL;
924 if (feed_receive_hook(&state, NULL, NULL))
925 return 0;
926 state.cmd = commands;
927 state.push_options = push_options;
928 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
929 strbuf_release(&state.buf);
930 return status;
933 static int run_update_hook(struct command *cmd)
935 struct child_process proc = CHILD_PROCESS_INIT;
936 int code;
937 const char *hook_path = find_hook("update");
939 if (!hook_path)
940 return 0;
942 strvec_push(&proc.args, hook_path);
943 strvec_push(&proc.args, cmd->ref_name);
944 strvec_push(&proc.args, oid_to_hex(&cmd->old_oid));
945 strvec_push(&proc.args, oid_to_hex(&cmd->new_oid));
947 proc.no_stdin = 1;
948 proc.stdout_to_stderr = 1;
949 proc.err = use_sideband ? -1 : 0;
950 proc.trace2_hook_name = "update";
952 code = start_command(&proc);
953 if (code)
954 return code;
955 if (use_sideband)
956 copy_to_sideband(proc.err, -1, NULL);
957 return finish_command(&proc);
960 static struct command *find_command_by_refname(struct command *list,
961 const char *refname)
963 for (; list; list = list->next)
964 if (!strcmp(list->ref_name, refname))
965 return list;
966 return NULL;
969 static int read_proc_receive_report(struct packet_reader *reader,
970 struct command *commands,
971 struct strbuf *errmsg)
973 struct command *cmd;
974 struct command *hint = NULL;
975 struct ref_push_report *report = NULL;
976 int new_report = 0;
977 int code = 0;
978 int once = 0;
979 int response = 0;
981 for (;;) {
982 struct object_id old_oid, new_oid;
983 const char *head;
984 const char *refname;
985 char *p;
986 enum packet_read_status status;
988 status = packet_reader_read(reader);
989 if (status != PACKET_READ_NORMAL) {
990 /* Check whether proc-receive exited abnormally */
991 if (status == PACKET_READ_EOF && !response) {
992 strbuf_addstr(errmsg, "proc-receive exited abnormally");
993 return -1;
995 break;
997 response++;
999 head = reader->line;
1000 p = strchr(head, ' ');
1001 if (!p) {
1002 strbuf_addf(errmsg, "proc-receive reported incomplete status line: '%s'\n", head);
1003 code = -1;
1004 continue;
1006 *p++ = '\0';
1007 if (!strcmp(head, "option")) {
1008 const char *key, *val;
1010 if (!hint || !(report || new_report)) {
1011 if (!once++)
1012 strbuf_addstr(errmsg, "proc-receive reported 'option' without a matching 'ok/ng' directive\n");
1013 code = -1;
1014 continue;
1016 if (new_report) {
1017 if (!hint->report) {
1018 CALLOC_ARRAY(hint->report, 1);
1019 report = hint->report;
1020 } else {
1021 report = hint->report;
1022 while (report->next)
1023 report = report->next;
1024 report->next = xcalloc(1, sizeof(struct ref_push_report));
1025 report = report->next;
1027 new_report = 0;
1029 key = p;
1030 p = strchr(key, ' ');
1031 if (p)
1032 *p++ = '\0';
1033 val = p;
1034 if (!strcmp(key, "refname"))
1035 report->ref_name = xstrdup_or_null(val);
1036 else if (!strcmp(key, "old-oid") && val &&
1037 !parse_oid_hex(val, &old_oid, &val))
1038 report->old_oid = oiddup(&old_oid);
1039 else if (!strcmp(key, "new-oid") && val &&
1040 !parse_oid_hex(val, &new_oid, &val))
1041 report->new_oid = oiddup(&new_oid);
1042 else if (!strcmp(key, "forced-update"))
1043 report->forced_update = 1;
1044 else if (!strcmp(key, "fall-through"))
1045 /* Fall through, let 'receive-pack' to execute it. */
1046 hint->run_proc_receive = 0;
1047 continue;
1050 report = NULL;
1051 new_report = 0;
1052 refname = p;
1053 p = strchr(refname, ' ');
1054 if (p)
1055 *p++ = '\0';
1056 if (strcmp(head, "ok") && strcmp(head, "ng")) {
1057 strbuf_addf(errmsg, "proc-receive reported bad status '%s' on ref '%s'\n",
1058 head, refname);
1059 code = -1;
1060 continue;
1063 /* first try searching at our hint, falling back to all refs */
1064 if (hint)
1065 hint = find_command_by_refname(hint, refname);
1066 if (!hint)
1067 hint = find_command_by_refname(commands, refname);
1068 if (!hint) {
1069 strbuf_addf(errmsg, "proc-receive reported status on unknown ref: %s\n",
1070 refname);
1071 code = -1;
1072 continue;
1074 if (!hint->run_proc_receive) {
1075 strbuf_addf(errmsg, "proc-receive reported status on unexpected ref: %s\n",
1076 refname);
1077 code = -1;
1078 continue;
1080 hint->run_proc_receive |= RUN_PROC_RECEIVE_RETURNED;
1081 if (!strcmp(head, "ng")) {
1082 if (p)
1083 hint->error_string = xstrdup(p);
1084 else
1085 hint->error_string = "failed";
1086 code = -1;
1087 continue;
1089 new_report = 1;
1092 for (cmd = commands; cmd; cmd = cmd->next)
1093 if (cmd->run_proc_receive && !cmd->error_string &&
1094 !(cmd->run_proc_receive & RUN_PROC_RECEIVE_RETURNED)) {
1095 cmd->error_string = "proc-receive failed to report status";
1096 code = -1;
1098 return code;
1101 static int run_proc_receive_hook(struct command *commands,
1102 const struct string_list *push_options)
1104 struct child_process proc = CHILD_PROCESS_INIT;
1105 struct async muxer;
1106 struct command *cmd;
1107 struct packet_reader reader;
1108 struct strbuf cap = STRBUF_INIT;
1109 struct strbuf errmsg = STRBUF_INIT;
1110 int hook_use_push_options = 0;
1111 int version = 0;
1112 int code;
1113 const char *hook_path = find_hook("proc-receive");
1115 if (!hook_path) {
1116 rp_error("cannot find hook 'proc-receive'");
1117 return -1;
1120 strvec_push(&proc.args, hook_path);
1121 proc.in = -1;
1122 proc.out = -1;
1123 proc.trace2_hook_name = "proc-receive";
1125 if (use_sideband) {
1126 memset(&muxer, 0, sizeof(muxer));
1127 muxer.proc = copy_to_sideband;
1128 muxer.in = -1;
1129 code = start_async(&muxer);
1130 if (code)
1131 return code;
1132 proc.err = muxer.in;
1133 } else {
1134 proc.err = 0;
1137 code = start_command(&proc);
1138 if (code) {
1139 if (use_sideband)
1140 finish_async(&muxer);
1141 return code;
1144 sigchain_push(SIGPIPE, SIG_IGN);
1146 /* Version negotiaton */
1147 packet_reader_init(&reader, proc.out, NULL, 0,
1148 PACKET_READ_CHOMP_NEWLINE |
1149 PACKET_READ_GENTLE_ON_EOF);
1150 if (use_atomic)
1151 strbuf_addstr(&cap, " atomic");
1152 if (use_push_options)
1153 strbuf_addstr(&cap, " push-options");
1154 if (cap.len) {
1155 code = packet_write_fmt_gently(proc.in, "version=1%c%s\n", '\0', cap.buf + 1);
1156 strbuf_release(&cap);
1157 } else {
1158 code = packet_write_fmt_gently(proc.in, "version=1\n");
1160 if (!code)
1161 code = packet_flush_gently(proc.in);
1163 if (!code)
1164 for (;;) {
1165 int linelen;
1166 enum packet_read_status status;
1168 status = packet_reader_read(&reader);
1169 if (status != PACKET_READ_NORMAL) {
1170 /* Check whether proc-receive exited abnormally */
1171 if (status == PACKET_READ_EOF)
1172 code = -1;
1173 break;
1176 if (reader.pktlen > 8 && starts_with(reader.line, "version=")) {
1177 version = atoi(reader.line + 8);
1178 linelen = strlen(reader.line);
1179 if (linelen < reader.pktlen) {
1180 const char *feature_list = reader.line + linelen + 1;
1181 if (parse_feature_request(feature_list, "push-options"))
1182 hook_use_push_options = 1;
1187 if (code) {
1188 strbuf_addstr(&errmsg, "fail to negotiate version with proc-receive hook");
1189 goto cleanup;
1192 switch (version) {
1193 case 0:
1194 /* fallthrough */
1195 case 1:
1196 break;
1197 default:
1198 strbuf_addf(&errmsg, "proc-receive version '%d' is not supported",
1199 version);
1200 code = -1;
1201 goto cleanup;
1204 /* Send commands */
1205 for (cmd = commands; cmd; cmd = cmd->next) {
1206 if (!cmd->run_proc_receive || cmd->skip_update || cmd->error_string)
1207 continue;
1208 code = packet_write_fmt_gently(proc.in, "%s %s %s",
1209 oid_to_hex(&cmd->old_oid),
1210 oid_to_hex(&cmd->new_oid),
1211 cmd->ref_name);
1212 if (code)
1213 break;
1215 if (!code)
1216 code = packet_flush_gently(proc.in);
1217 if (code) {
1218 strbuf_addstr(&errmsg, "fail to write commands to proc-receive hook");
1219 goto cleanup;
1222 /* Send push options */
1223 if (hook_use_push_options) {
1224 struct string_list_item *item;
1226 for_each_string_list_item(item, push_options) {
1227 code = packet_write_fmt_gently(proc.in, "%s", item->string);
1228 if (code)
1229 break;
1231 if (!code)
1232 code = packet_flush_gently(proc.in);
1233 if (code) {
1234 strbuf_addstr(&errmsg,
1235 "fail to write push-options to proc-receive hook");
1236 goto cleanup;
1240 /* Read result from proc-receive */
1241 code = read_proc_receive_report(&reader, commands, &errmsg);
1243 cleanup:
1244 close(proc.in);
1245 close(proc.out);
1246 if (use_sideband)
1247 finish_async(&muxer);
1248 if (finish_command(&proc))
1249 code = -1;
1250 if (errmsg.len >0) {
1251 char *p = errmsg.buf;
1253 p += errmsg.len - 1;
1254 if (*p == '\n')
1255 *p = '\0';
1256 rp_error("%s", errmsg.buf);
1257 strbuf_release(&errmsg);
1259 sigchain_pop(SIGPIPE);
1261 return code;
1264 static char *refuse_unconfigured_deny_msg =
1265 N_("By default, updating the current branch in a non-bare repository\n"
1266 "is denied, because it will make the index and work tree inconsistent\n"
1267 "with what you pushed, and will require 'git reset --hard' to match\n"
1268 "the work tree to HEAD.\n"
1269 "\n"
1270 "You can set the 'receive.denyCurrentBranch' configuration variable\n"
1271 "to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
1272 "its current branch; however, this is not recommended unless you\n"
1273 "arranged to update its work tree to match what you pushed in some\n"
1274 "other way.\n"
1275 "\n"
1276 "To squelch this message and still keep the default behaviour, set\n"
1277 "'receive.denyCurrentBranch' configuration variable to 'refuse'.");
1279 static void refuse_unconfigured_deny(void)
1281 rp_error("%s", _(refuse_unconfigured_deny_msg));
1284 static char *refuse_unconfigured_deny_delete_current_msg =
1285 N_("By default, deleting the current branch is denied, because the next\n"
1286 "'git clone' won't result in any file checked out, causing confusion.\n"
1287 "\n"
1288 "You can set 'receive.denyDeleteCurrent' configuration variable to\n"
1289 "'warn' or 'ignore' in the remote repository to allow deleting the\n"
1290 "current branch, with or without a warning message.\n"
1291 "\n"
1292 "To squelch this message, you can set it to 'refuse'.");
1294 static void refuse_unconfigured_deny_delete_current(void)
1296 rp_error("%s", _(refuse_unconfigured_deny_delete_current_msg));
1299 static const struct object_id *command_singleton_iterator(void *cb_data);
1300 static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
1302 struct shallow_lock shallow_lock = SHALLOW_LOCK_INIT;
1303 struct oid_array extra = OID_ARRAY_INIT;
1304 struct check_connected_options opt = CHECK_CONNECTED_INIT;
1305 uint32_t mask = 1 << (cmd->index % 32);
1306 int i;
1308 trace_printf_key(&trace_shallow,
1309 "shallow: update_shallow_ref %s\n", cmd->ref_name);
1310 for (i = 0; i < si->shallow->nr; i++)
1311 if (si->used_shallow[i] &&
1312 (si->used_shallow[i][cmd->index / 32] & mask) &&
1313 !delayed_reachability_test(si, i))
1314 oid_array_append(&extra, &si->shallow->oid[i]);
1316 opt.env = tmp_objdir_env(tmp_objdir);
1317 setup_alternate_shallow(&shallow_lock, &opt.shallow_file, &extra);
1318 if (check_connected(command_singleton_iterator, cmd, &opt)) {
1319 rollback_shallow_file(the_repository, &shallow_lock);
1320 oid_array_clear(&extra);
1321 return -1;
1324 commit_shallow_file(the_repository, &shallow_lock);
1327 * Make sure setup_alternate_shallow() for the next ref does
1328 * not lose these new roots..
1330 for (i = 0; i < extra.nr; i++)
1331 register_shallow(the_repository, &extra.oid[i]);
1333 si->shallow_ref[cmd->index] = 0;
1334 oid_array_clear(&extra);
1335 return 0;
1339 * NEEDSWORK: we should consolidate various implementions of "are we
1340 * on an unborn branch?" test into one, and make the unified one more
1341 * robust. !get_sha1() based check used here and elsewhere would not
1342 * allow us to tell an unborn branch from corrupt ref, for example.
1343 * For the purpose of fixing "deploy-to-update does not work when
1344 * pushing into an empty repository" issue, this should suffice for
1345 * now.
1347 static int head_has_history(void)
1349 struct object_id oid;
1351 return !get_oid("HEAD", &oid);
1354 static const char *push_to_deploy(unsigned char *sha1,
1355 struct strvec *env,
1356 const char *work_tree)
1358 struct child_process child = CHILD_PROCESS_INIT;
1360 strvec_pushl(&child.args, "update-index", "-q", "--ignore-submodules",
1361 "--refresh", NULL);
1362 strvec_pushv(&child.env, env->v);
1363 child.dir = work_tree;
1364 child.no_stdin = 1;
1365 child.stdout_to_stderr = 1;
1366 child.git_cmd = 1;
1367 if (run_command(&child))
1368 return "Up-to-date check failed";
1370 /* run_command() does not clean up completely; reinitialize */
1371 child_process_init(&child);
1372 strvec_pushl(&child.args, "diff-files", "--quiet",
1373 "--ignore-submodules", "--", NULL);
1374 strvec_pushv(&child.env, env->v);
1375 child.dir = work_tree;
1376 child.no_stdin = 1;
1377 child.stdout_to_stderr = 1;
1378 child.git_cmd = 1;
1379 if (run_command(&child))
1380 return "Working directory has unstaged changes";
1382 child_process_init(&child);
1383 strvec_pushl(&child.args, "diff-index", "--quiet", "--cached",
1384 "--ignore-submodules",
1385 /* diff-index with either HEAD or an empty tree */
1386 head_has_history() ? "HEAD" : empty_tree_oid_hex(),
1387 "--", NULL);
1388 strvec_pushv(&child.env, env->v);
1389 child.no_stdin = 1;
1390 child.no_stdout = 1;
1391 child.stdout_to_stderr = 0;
1392 child.git_cmd = 1;
1393 if (run_command(&child))
1394 return "Working directory has staged changes";
1396 child_process_init(&child);
1397 strvec_pushl(&child.args, "read-tree", "-u", "-m", hash_to_hex(sha1),
1398 NULL);
1399 strvec_pushv(&child.env, env->v);
1400 child.dir = work_tree;
1401 child.no_stdin = 1;
1402 child.no_stdout = 1;
1403 child.stdout_to_stderr = 0;
1404 child.git_cmd = 1;
1405 if (run_command(&child))
1406 return "Could not update working tree to new HEAD";
1408 return NULL;
1411 static const char *push_to_checkout_hook = "push-to-checkout";
1413 static const char *push_to_checkout(unsigned char *hash,
1414 int *invoked_hook,
1415 struct strvec *env,
1416 const char *work_tree)
1418 struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
1419 opt.invoked_hook = invoked_hook;
1421 strvec_pushf(env, "GIT_WORK_TREE=%s", absolute_path(work_tree));
1422 strvec_pushv(&opt.env, env->v);
1423 strvec_push(&opt.args, hash_to_hex(hash));
1424 if (run_hooks_opt(push_to_checkout_hook, &opt))
1425 return "push-to-checkout hook declined";
1426 else
1427 return NULL;
1430 static const char *update_worktree(unsigned char *sha1, const struct worktree *worktree)
1432 const char *retval, *git_dir;
1433 struct strvec env = STRVEC_INIT;
1434 int invoked_hook;
1436 if (!worktree || !worktree->path)
1437 BUG("worktree->path must be non-NULL");
1439 if (worktree->is_bare)
1440 return "denyCurrentBranch = updateInstead needs a worktree";
1441 git_dir = get_worktree_git_dir(worktree);
1443 strvec_pushf(&env, "GIT_DIR=%s", absolute_path(git_dir));
1445 retval = push_to_checkout(sha1, &invoked_hook, &env, worktree->path);
1446 if (!invoked_hook)
1447 retval = push_to_deploy(sha1, &env, worktree->path);
1449 strvec_clear(&env);
1450 return retval;
1453 static const char *update(struct command *cmd, struct shallow_info *si)
1455 const char *name = cmd->ref_name;
1456 struct strbuf namespaced_name_buf = STRBUF_INIT;
1457 static char *namespaced_name;
1458 const char *ret;
1459 struct object_id *old_oid = &cmd->old_oid;
1460 struct object_id *new_oid = &cmd->new_oid;
1461 int do_update_worktree = 0;
1462 struct worktree **worktrees = get_worktrees();
1463 const struct worktree *worktree =
1464 find_shared_symref(worktrees, "HEAD", name);
1466 /* only refs/... are allowed */
1467 if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
1468 rp_error("refusing to create funny ref '%s' remotely", name);
1469 ret = "funny refname";
1470 goto out;
1473 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
1474 free(namespaced_name);
1475 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
1477 if (worktree && !worktree->is_bare) {
1478 switch (deny_current_branch) {
1479 case DENY_IGNORE:
1480 break;
1481 case DENY_WARN:
1482 rp_warning("updating the current branch");
1483 break;
1484 case DENY_REFUSE:
1485 case DENY_UNCONFIGURED:
1486 rp_error("refusing to update checked out branch: %s", name);
1487 if (deny_current_branch == DENY_UNCONFIGURED)
1488 refuse_unconfigured_deny();
1489 ret = "branch is currently checked out";
1490 goto out;
1491 case DENY_UPDATE_INSTEAD:
1492 /* pass -- let other checks intervene first */
1493 do_update_worktree = 1;
1494 break;
1498 if (!is_null_oid(new_oid) && !has_object_file(new_oid)) {
1499 error("unpack should have generated %s, "
1500 "but I can't find it!", oid_to_hex(new_oid));
1501 ret = "bad pack";
1502 goto out;
1505 if (!is_null_oid(old_oid) && is_null_oid(new_oid)) {
1506 if (deny_deletes && starts_with(name, "refs/heads/")) {
1507 rp_error("denying ref deletion for %s", name);
1508 ret = "deletion prohibited";
1509 goto out;
1512 if (worktree || (head_name && !strcmp(namespaced_name, head_name))) {
1513 switch (deny_delete_current) {
1514 case DENY_IGNORE:
1515 break;
1516 case DENY_WARN:
1517 rp_warning("deleting the current branch");
1518 break;
1519 case DENY_REFUSE:
1520 case DENY_UNCONFIGURED:
1521 case DENY_UPDATE_INSTEAD:
1522 if (deny_delete_current == DENY_UNCONFIGURED)
1523 refuse_unconfigured_deny_delete_current();
1524 rp_error("refusing to delete the current branch: %s", name);
1525 ret = "deletion of the current branch prohibited";
1526 goto out;
1527 default:
1528 ret = "Invalid denyDeleteCurrent setting";
1529 goto out;
1534 if (deny_non_fast_forwards && !is_null_oid(new_oid) &&
1535 !is_null_oid(old_oid) &&
1536 starts_with(name, "refs/heads/")) {
1537 struct object *old_object, *new_object;
1538 struct commit *old_commit, *new_commit;
1540 old_object = parse_object(the_repository, old_oid);
1541 new_object = parse_object(the_repository, new_oid);
1543 if (!old_object || !new_object ||
1544 old_object->type != OBJ_COMMIT ||
1545 new_object->type != OBJ_COMMIT) {
1546 error("bad sha1 objects for %s", name);
1547 ret = "bad ref";
1548 goto out;
1550 old_commit = (struct commit *)old_object;
1551 new_commit = (struct commit *)new_object;
1552 if (!in_merge_bases(old_commit, new_commit)) {
1553 rp_error("denying non-fast-forward %s"
1554 " (you should pull first)", name);
1555 ret = "non-fast-forward";
1556 goto out;
1559 if (run_update_hook(cmd)) {
1560 rp_error("hook declined to update %s", name);
1561 ret = "hook declined";
1562 goto out;
1565 if (do_update_worktree) {
1566 ret = update_worktree(new_oid->hash, worktree);
1567 if (ret)
1568 goto out;
1571 if (is_null_oid(new_oid)) {
1572 struct strbuf err = STRBUF_INIT;
1573 if (!parse_object(the_repository, old_oid)) {
1574 old_oid = NULL;
1575 if (ref_exists(name)) {
1576 rp_warning("allowing deletion of corrupt ref");
1577 } else {
1578 rp_warning("deleting a non-existent ref");
1579 cmd->did_not_exist = 1;
1582 if (ref_transaction_delete(transaction,
1583 namespaced_name,
1584 old_oid,
1585 0, "push", &err)) {
1586 rp_error("%s", err.buf);
1587 ret = "failed to delete";
1588 } else {
1589 ret = NULL; /* good */
1591 strbuf_release(&err);
1593 else {
1594 struct strbuf err = STRBUF_INIT;
1595 if (shallow_update && si->shallow_ref[cmd->index] &&
1596 update_shallow_ref(cmd, si)) {
1597 ret = "shallow error";
1598 goto out;
1601 if (ref_transaction_update(transaction,
1602 namespaced_name,
1603 new_oid, old_oid,
1604 0, "push",
1605 &err)) {
1606 rp_error("%s", err.buf);
1607 ret = "failed to update ref";
1608 } else {
1609 ret = NULL; /* good */
1611 strbuf_release(&err);
1614 out:
1615 free_worktrees(worktrees);
1616 return ret;
1619 static void run_update_post_hook(struct command *commands)
1621 struct command *cmd;
1622 struct child_process proc = CHILD_PROCESS_INIT;
1623 const char *hook;
1625 hook = find_hook("post-update");
1626 if (!hook)
1627 return;
1629 for (cmd = commands; cmd; cmd = cmd->next) {
1630 if (cmd->error_string || cmd->did_not_exist)
1631 continue;
1632 if (!proc.args.nr)
1633 strvec_push(&proc.args, hook);
1634 strvec_push(&proc.args, cmd->ref_name);
1636 if (!proc.args.nr)
1637 return;
1639 proc.no_stdin = 1;
1640 proc.stdout_to_stderr = 1;
1641 proc.err = use_sideband ? -1 : 0;
1642 proc.trace2_hook_name = "post-update";
1644 if (!start_command(&proc)) {
1645 if (use_sideband)
1646 copy_to_sideband(proc.err, -1, NULL);
1647 finish_command(&proc);
1651 static void check_aliased_update_internal(struct command *cmd,
1652 struct string_list *list,
1653 const char *dst_name, int flag)
1655 struct string_list_item *item;
1656 struct command *dst_cmd;
1658 if (!(flag & REF_ISSYMREF))
1659 return;
1661 if (!dst_name) {
1662 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
1663 cmd->skip_update = 1;
1664 cmd->error_string = "broken symref";
1665 return;
1667 dst_name = strip_namespace(dst_name);
1669 if (!(item = string_list_lookup(list, dst_name)))
1670 return;
1672 cmd->skip_update = 1;
1674 dst_cmd = (struct command *) item->util;
1676 if (oideq(&cmd->old_oid, &dst_cmd->old_oid) &&
1677 oideq(&cmd->new_oid, &dst_cmd->new_oid))
1678 return;
1680 dst_cmd->skip_update = 1;
1682 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
1683 " its target '%s' (%s..%s)",
1684 cmd->ref_name,
1685 find_unique_abbrev(&cmd->old_oid, DEFAULT_ABBREV),
1686 find_unique_abbrev(&cmd->new_oid, DEFAULT_ABBREV),
1687 dst_cmd->ref_name,
1688 find_unique_abbrev(&dst_cmd->old_oid, DEFAULT_ABBREV),
1689 find_unique_abbrev(&dst_cmd->new_oid, DEFAULT_ABBREV));
1691 cmd->error_string = dst_cmd->error_string =
1692 "inconsistent aliased update";
1695 static void check_aliased_update(struct command *cmd, struct string_list *list)
1697 struct strbuf buf = STRBUF_INIT;
1698 const char *dst_name;
1699 int flag;
1701 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
1702 dst_name = resolve_ref_unsafe(buf.buf, 0, NULL, &flag);
1703 check_aliased_update_internal(cmd, list, dst_name, flag);
1704 strbuf_release(&buf);
1707 static void check_aliased_updates(struct command *commands)
1709 struct command *cmd;
1710 struct string_list ref_list = STRING_LIST_INIT_NODUP;
1712 for (cmd = commands; cmd; cmd = cmd->next) {
1713 struct string_list_item *item =
1714 string_list_append(&ref_list, cmd->ref_name);
1715 item->util = (void *)cmd;
1717 string_list_sort(&ref_list);
1719 for (cmd = commands; cmd; cmd = cmd->next) {
1720 if (!cmd->error_string)
1721 check_aliased_update(cmd, &ref_list);
1724 string_list_clear(&ref_list, 0);
1727 static const struct object_id *command_singleton_iterator(void *cb_data)
1729 struct command **cmd_list = cb_data;
1730 struct command *cmd = *cmd_list;
1732 if (!cmd || is_null_oid(&cmd->new_oid))
1733 return NULL;
1734 *cmd_list = NULL; /* this returns only one */
1735 return &cmd->new_oid;
1738 static void set_connectivity_errors(struct command *commands,
1739 struct shallow_info *si)
1741 struct command *cmd;
1743 for (cmd = commands; cmd; cmd = cmd->next) {
1744 struct command *singleton = cmd;
1745 struct check_connected_options opt = CHECK_CONNECTED_INIT;
1747 if (shallow_update && si->shallow_ref[cmd->index])
1748 /* to be checked in update_shallow_ref() */
1749 continue;
1751 opt.env = tmp_objdir_env(tmp_objdir);
1752 if (!check_connected(command_singleton_iterator, &singleton,
1753 &opt))
1754 continue;
1756 cmd->error_string = "missing necessary objects";
1760 struct iterate_data {
1761 struct command *cmds;
1762 struct shallow_info *si;
1765 static const struct object_id *iterate_receive_command_list(void *cb_data)
1767 struct iterate_data *data = cb_data;
1768 struct command **cmd_list = &data->cmds;
1769 struct command *cmd = *cmd_list;
1771 for (; cmd; cmd = cmd->next) {
1772 if (shallow_update && data->si->shallow_ref[cmd->index])
1773 /* to be checked in update_shallow_ref() */
1774 continue;
1775 if (!is_null_oid(&cmd->new_oid) && !cmd->skip_update) {
1776 *cmd_list = cmd->next;
1777 return &cmd->new_oid;
1780 return NULL;
1783 static void reject_updates_to_hidden(struct command *commands)
1785 struct strbuf refname_full = STRBUF_INIT;
1786 size_t prefix_len;
1787 struct command *cmd;
1789 strbuf_addstr(&refname_full, get_git_namespace());
1790 prefix_len = refname_full.len;
1792 for (cmd = commands; cmd; cmd = cmd->next) {
1793 if (cmd->error_string)
1794 continue;
1796 strbuf_setlen(&refname_full, prefix_len);
1797 strbuf_addstr(&refname_full, cmd->ref_name);
1799 if (!ref_is_hidden(cmd->ref_name, refname_full.buf, &hidden_refs))
1800 continue;
1801 if (is_null_oid(&cmd->new_oid))
1802 cmd->error_string = "deny deleting a hidden ref";
1803 else
1804 cmd->error_string = "deny updating a hidden ref";
1807 strbuf_release(&refname_full);
1810 static int should_process_cmd(struct command *cmd)
1812 return !cmd->error_string && !cmd->skip_update;
1815 static void BUG_if_skipped_connectivity_check(struct command *commands,
1816 struct shallow_info *si)
1818 struct command *cmd;
1820 for (cmd = commands; cmd; cmd = cmd->next) {
1821 if (should_process_cmd(cmd) && si->shallow_ref[cmd->index])
1822 bug("connectivity check has not been run on ref %s",
1823 cmd->ref_name);
1825 BUG_if_bug("connectivity check skipped???");
1828 static void execute_commands_non_atomic(struct command *commands,
1829 struct shallow_info *si)
1831 struct command *cmd;
1832 struct strbuf err = STRBUF_INIT;
1834 for (cmd = commands; cmd; cmd = cmd->next) {
1835 if (!should_process_cmd(cmd) || cmd->run_proc_receive)
1836 continue;
1838 transaction = ref_transaction_begin(&err);
1839 if (!transaction) {
1840 rp_error("%s", err.buf);
1841 strbuf_reset(&err);
1842 cmd->error_string = "transaction failed to start";
1843 continue;
1846 cmd->error_string = update(cmd, si);
1848 if (!cmd->error_string
1849 && ref_transaction_commit(transaction, &err)) {
1850 rp_error("%s", err.buf);
1851 strbuf_reset(&err);
1852 cmd->error_string = "failed to update ref";
1854 ref_transaction_free(transaction);
1856 strbuf_release(&err);
1859 static void execute_commands_atomic(struct command *commands,
1860 struct shallow_info *si)
1862 struct command *cmd;
1863 struct strbuf err = STRBUF_INIT;
1864 const char *reported_error = "atomic push failure";
1866 transaction = ref_transaction_begin(&err);
1867 if (!transaction) {
1868 rp_error("%s", err.buf);
1869 strbuf_reset(&err);
1870 reported_error = "transaction failed to start";
1871 goto failure;
1874 for (cmd = commands; cmd; cmd = cmd->next) {
1875 if (!should_process_cmd(cmd) || cmd->run_proc_receive)
1876 continue;
1878 cmd->error_string = update(cmd, si);
1880 if (cmd->error_string)
1881 goto failure;
1884 if (ref_transaction_commit(transaction, &err)) {
1885 rp_error("%s", err.buf);
1886 reported_error = "atomic transaction failed";
1887 goto failure;
1889 goto cleanup;
1891 failure:
1892 for (cmd = commands; cmd; cmd = cmd->next)
1893 if (!cmd->error_string)
1894 cmd->error_string = reported_error;
1896 cleanup:
1897 ref_transaction_free(transaction);
1898 strbuf_release(&err);
1901 static void execute_commands(struct command *commands,
1902 const char *unpacker_error,
1903 struct shallow_info *si,
1904 const struct string_list *push_options)
1906 struct check_connected_options opt = CHECK_CONNECTED_INIT;
1907 struct command *cmd;
1908 struct iterate_data data;
1909 struct async muxer;
1910 int err_fd = 0;
1911 int run_proc_receive = 0;
1913 if (unpacker_error) {
1914 for (cmd = commands; cmd; cmd = cmd->next)
1915 cmd->error_string = "unpacker error";
1916 return;
1919 if (use_sideband) {
1920 memset(&muxer, 0, sizeof(muxer));
1921 muxer.proc = copy_to_sideband;
1922 muxer.in = -1;
1923 if (!start_async(&muxer))
1924 err_fd = muxer.in;
1925 /* ...else, continue without relaying sideband */
1928 data.cmds = commands;
1929 data.si = si;
1930 opt.err_fd = err_fd;
1931 opt.progress = err_fd && !quiet;
1932 opt.env = tmp_objdir_env(tmp_objdir);
1933 opt.exclude_hidden_refs_section = "receive";
1935 if (check_connected(iterate_receive_command_list, &data, &opt))
1936 set_connectivity_errors(commands, si);
1938 if (use_sideband)
1939 finish_async(&muxer);
1941 reject_updates_to_hidden(commands);
1944 * Try to find commands that have special prefix in their reference names,
1945 * and mark them to run an external "proc-receive" hook later.
1947 if (proc_receive_ref) {
1948 for (cmd = commands; cmd; cmd = cmd->next) {
1949 if (!should_process_cmd(cmd))
1950 continue;
1952 if (proc_receive_ref_matches(cmd)) {
1953 cmd->run_proc_receive = RUN_PROC_RECEIVE_SCHEDULED;
1954 run_proc_receive = 1;
1959 if (run_receive_hook(commands, "pre-receive", 0, push_options)) {
1960 for (cmd = commands; cmd; cmd = cmd->next) {
1961 if (!cmd->error_string)
1962 cmd->error_string = "pre-receive hook declined";
1964 return;
1968 * If there is no command ready to run, should return directly to destroy
1969 * temporary data in the quarantine area.
1971 for (cmd = commands; cmd && cmd->error_string; cmd = cmd->next)
1972 ; /* nothing */
1973 if (!cmd)
1974 return;
1977 * Now we'll start writing out refs, which means the objects need
1978 * to be in their final positions so that other processes can see them.
1980 if (tmp_objdir_migrate(tmp_objdir) < 0) {
1981 for (cmd = commands; cmd; cmd = cmd->next) {
1982 if (!cmd->error_string)
1983 cmd->error_string = "unable to migrate objects to permanent storage";
1985 return;
1987 tmp_objdir = NULL;
1989 check_aliased_updates(commands);
1991 free(head_name_to_free);
1992 head_name = head_name_to_free = resolve_refdup("HEAD", 0, NULL, NULL);
1994 if (run_proc_receive &&
1995 run_proc_receive_hook(commands, push_options))
1996 for (cmd = commands; cmd; cmd = cmd->next)
1997 if (!cmd->error_string &&
1998 !(cmd->run_proc_receive & RUN_PROC_RECEIVE_RETURNED) &&
1999 (cmd->run_proc_receive || use_atomic))
2000 cmd->error_string = "fail to run proc-receive hook";
2002 if (use_atomic)
2003 execute_commands_atomic(commands, si);
2004 else
2005 execute_commands_non_atomic(commands, si);
2007 if (shallow_update)
2008 BUG_if_skipped_connectivity_check(commands, si);
2011 static struct command **queue_command(struct command **tail,
2012 const char *line,
2013 int linelen)
2015 struct object_id old_oid, new_oid;
2016 struct command *cmd;
2017 const char *refname;
2018 int reflen;
2019 const char *p;
2021 if (parse_oid_hex(line, &old_oid, &p) ||
2022 *p++ != ' ' ||
2023 parse_oid_hex(p, &new_oid, &p) ||
2024 *p++ != ' ')
2025 die("protocol error: expected old/new/ref, got '%s'", line);
2027 refname = p;
2028 reflen = linelen - (p - line);
2029 FLEX_ALLOC_MEM(cmd, ref_name, refname, reflen);
2030 oidcpy(&cmd->old_oid, &old_oid);
2031 oidcpy(&cmd->new_oid, &new_oid);
2032 *tail = cmd;
2033 return &cmd->next;
2036 static void free_commands(struct command *commands)
2038 while (commands) {
2039 struct command *next = commands->next;
2041 free(commands);
2042 commands = next;
2046 static void queue_commands_from_cert(struct command **tail,
2047 struct strbuf *push_cert)
2049 const char *boc, *eoc;
2051 if (*tail)
2052 die("protocol error: got both push certificate and unsigned commands");
2054 boc = strstr(push_cert->buf, "\n\n");
2055 if (!boc)
2056 die("malformed push certificate %.*s", 100, push_cert->buf);
2057 else
2058 boc += 2;
2059 eoc = push_cert->buf + parse_signed_buffer(push_cert->buf, push_cert->len);
2061 while (boc < eoc) {
2062 const char *eol = memchr(boc, '\n', eoc - boc);
2063 tail = queue_command(tail, boc, eol ? eol - boc : eoc - boc);
2064 boc = eol ? eol + 1 : eoc;
2068 static struct command *read_head_info(struct packet_reader *reader,
2069 struct oid_array *shallow)
2071 struct command *commands = NULL;
2072 struct command **p = &commands;
2073 for (;;) {
2074 int linelen;
2076 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
2077 break;
2079 if (reader->pktlen > 8 && starts_with(reader->line, "shallow ")) {
2080 struct object_id oid;
2081 if (get_oid_hex(reader->line + 8, &oid))
2082 die("protocol error: expected shallow sha, got '%s'",
2083 reader->line + 8);
2084 oid_array_append(shallow, &oid);
2085 continue;
2088 linelen = strlen(reader->line);
2089 if (linelen < reader->pktlen) {
2090 const char *feature_list = reader->line + linelen + 1;
2091 const char *hash = NULL;
2092 const char *client_sid;
2093 int len = 0;
2094 if (parse_feature_request(feature_list, "report-status"))
2095 report_status = 1;
2096 if (parse_feature_request(feature_list, "report-status-v2"))
2097 report_status_v2 = 1;
2098 if (parse_feature_request(feature_list, "side-band-64k"))
2099 use_sideband = LARGE_PACKET_MAX;
2100 if (parse_feature_request(feature_list, "quiet"))
2101 quiet = 1;
2102 if (advertise_atomic_push
2103 && parse_feature_request(feature_list, "atomic"))
2104 use_atomic = 1;
2105 if (advertise_push_options
2106 && parse_feature_request(feature_list, "push-options"))
2107 use_push_options = 1;
2108 hash = parse_feature_value(feature_list, "object-format", &len, NULL);
2109 if (!hash) {
2110 hash = hash_algos[GIT_HASH_SHA1].name;
2111 len = strlen(hash);
2113 if (xstrncmpz(the_hash_algo->name, hash, len))
2114 die("error: unsupported object format '%s'", hash);
2115 client_sid = parse_feature_value(feature_list, "session-id", &len, NULL);
2116 if (client_sid) {
2117 char *sid = xstrndup(client_sid, len);
2118 trace2_data_string("transfer", NULL, "client-sid", client_sid);
2119 free(sid);
2123 if (!strcmp(reader->line, "push-cert")) {
2124 int true_flush = 0;
2125 int saved_options = reader->options;
2126 reader->options &= ~PACKET_READ_CHOMP_NEWLINE;
2128 for (;;) {
2129 packet_reader_read(reader);
2130 if (reader->status == PACKET_READ_FLUSH) {
2131 true_flush = 1;
2132 break;
2134 if (reader->status != PACKET_READ_NORMAL) {
2135 die("protocol error: got an unexpected packet");
2137 if (!strcmp(reader->line, "push-cert-end\n"))
2138 break; /* end of cert */
2139 strbuf_addstr(&push_cert, reader->line);
2141 reader->options = saved_options;
2143 if (true_flush)
2144 break;
2145 continue;
2148 p = queue_command(p, reader->line, linelen);
2151 if (push_cert.len)
2152 queue_commands_from_cert(p, &push_cert);
2154 return commands;
2157 static void read_push_options(struct packet_reader *reader,
2158 struct string_list *options)
2160 while (1) {
2161 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
2162 break;
2164 string_list_append(options, reader->line);
2168 static const char *parse_pack_header(struct pack_header *hdr)
2170 switch (read_pack_header(0, hdr)) {
2171 case PH_ERROR_EOF:
2172 return "eof before pack header was fully read";
2174 case PH_ERROR_PACK_SIGNATURE:
2175 return "protocol error (pack signature mismatch detected)";
2177 case PH_ERROR_PROTOCOL:
2178 return "protocol error (pack version unsupported)";
2180 default:
2181 return "unknown error in parse_pack_header";
2183 case 0:
2184 return NULL;
2188 static const char *pack_lockfile;
2190 static void push_header_arg(struct strvec *args, struct pack_header *hdr)
2192 strvec_pushf(args, "--pack_header=%"PRIu32",%"PRIu32,
2193 ntohl(hdr->hdr_version), ntohl(hdr->hdr_entries));
2196 static const char *unpack(int err_fd, struct shallow_info *si)
2198 struct pack_header hdr;
2199 const char *hdr_err;
2200 int status;
2201 struct child_process child = CHILD_PROCESS_INIT;
2202 int fsck_objects = (receive_fsck_objects >= 0
2203 ? receive_fsck_objects
2204 : transfer_fsck_objects >= 0
2205 ? transfer_fsck_objects
2206 : 0);
2208 hdr_err = parse_pack_header(&hdr);
2209 if (hdr_err) {
2210 if (err_fd > 0)
2211 close(err_fd);
2212 return hdr_err;
2215 if (si->nr_ours || si->nr_theirs) {
2216 alt_shallow_file = setup_temporary_shallow(si->shallow);
2217 strvec_push(&child.args, "--shallow-file");
2218 strvec_push(&child.args, alt_shallow_file);
2221 tmp_objdir = tmp_objdir_create("incoming");
2222 if (!tmp_objdir) {
2223 if (err_fd > 0)
2224 close(err_fd);
2225 return "unable to create temporary object directory";
2227 strvec_pushv(&child.env, tmp_objdir_env(tmp_objdir));
2230 * Normally we just pass the tmp_objdir environment to the child
2231 * processes that do the heavy lifting, but we may need to see these
2232 * objects ourselves to set up shallow information.
2234 tmp_objdir_add_as_alternate(tmp_objdir);
2236 if (ntohl(hdr.hdr_entries) < unpack_limit) {
2237 strvec_push(&child.args, "unpack-objects");
2238 push_header_arg(&child.args, &hdr);
2239 if (quiet)
2240 strvec_push(&child.args, "-q");
2241 if (fsck_objects)
2242 strvec_pushf(&child.args, "--strict%s",
2243 fsck_msg_types.buf);
2244 if (max_input_size)
2245 strvec_pushf(&child.args, "--max-input-size=%"PRIuMAX,
2246 (uintmax_t)max_input_size);
2247 child.no_stdout = 1;
2248 child.err = err_fd;
2249 child.git_cmd = 1;
2250 status = run_command(&child);
2251 if (status)
2252 return "unpack-objects abnormal exit";
2253 } else {
2254 char hostname[HOST_NAME_MAX + 1];
2256 strvec_pushl(&child.args, "index-pack", "--stdin", NULL);
2257 push_header_arg(&child.args, &hdr);
2259 if (xgethostname(hostname, sizeof(hostname)))
2260 xsnprintf(hostname, sizeof(hostname), "localhost");
2261 strvec_pushf(&child.args,
2262 "--keep=receive-pack %"PRIuMAX" on %s",
2263 (uintmax_t)getpid(),
2264 hostname);
2266 if (!quiet && err_fd)
2267 strvec_push(&child.args, "--show-resolving-progress");
2268 if (use_sideband)
2269 strvec_push(&child.args, "--report-end-of-input");
2270 if (fsck_objects)
2271 strvec_pushf(&child.args, "--strict%s",
2272 fsck_msg_types.buf);
2273 if (!reject_thin)
2274 strvec_push(&child.args, "--fix-thin");
2275 if (max_input_size)
2276 strvec_pushf(&child.args, "--max-input-size=%"PRIuMAX,
2277 (uintmax_t)max_input_size);
2278 child.out = -1;
2279 child.err = err_fd;
2280 child.git_cmd = 1;
2281 status = start_command(&child);
2282 if (status)
2283 return "index-pack fork failed";
2284 pack_lockfile = index_pack_lockfile(child.out, NULL);
2285 close(child.out);
2286 status = finish_command(&child);
2287 if (status)
2288 return "index-pack abnormal exit";
2289 reprepare_packed_git(the_repository);
2291 return NULL;
2294 static const char *unpack_with_sideband(struct shallow_info *si)
2296 struct async muxer;
2297 const char *ret;
2299 if (!use_sideband)
2300 return unpack(0, si);
2302 use_keepalive = KEEPALIVE_AFTER_NUL;
2303 memset(&muxer, 0, sizeof(muxer));
2304 muxer.proc = copy_to_sideband;
2305 muxer.in = -1;
2306 if (start_async(&muxer))
2307 return NULL;
2309 ret = unpack(muxer.in, si);
2311 finish_async(&muxer);
2312 return ret;
2315 static void prepare_shallow_update(struct shallow_info *si)
2317 int i, j, k, bitmap_size = DIV_ROUND_UP(si->ref->nr, 32);
2319 ALLOC_ARRAY(si->used_shallow, si->shallow->nr);
2320 assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
2322 CALLOC_ARRAY(si->need_reachability_test, si->shallow->nr);
2323 CALLOC_ARRAY(si->reachable, si->shallow->nr);
2324 CALLOC_ARRAY(si->shallow_ref, si->ref->nr);
2326 for (i = 0; i < si->nr_ours; i++)
2327 si->need_reachability_test[si->ours[i]] = 1;
2329 for (i = 0; i < si->shallow->nr; i++) {
2330 if (!si->used_shallow[i])
2331 continue;
2332 for (j = 0; j < bitmap_size; j++) {
2333 if (!si->used_shallow[i][j])
2334 continue;
2335 si->need_reachability_test[i]++;
2336 for (k = 0; k < 32; k++)
2337 if (si->used_shallow[i][j] & (1U << k))
2338 si->shallow_ref[j * 32 + k]++;
2342 * true for those associated with some refs and belong
2343 * in "ours" list aka "step 7 not done yet"
2345 si->need_reachability_test[i] =
2346 si->need_reachability_test[i] > 1;
2350 * keep hooks happy by forcing a temporary shallow file via
2351 * env variable because we can't add --shallow-file to every
2352 * command. check_connected() will be done with
2353 * true .git/shallow though.
2355 setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
2358 static void update_shallow_info(struct command *commands,
2359 struct shallow_info *si,
2360 struct oid_array *ref)
2362 struct command *cmd;
2363 int *ref_status;
2364 remove_nonexistent_theirs_shallow(si);
2365 if (!si->nr_ours && !si->nr_theirs) {
2366 shallow_update = 0;
2367 return;
2370 for (cmd = commands; cmd; cmd = cmd->next) {
2371 if (is_null_oid(&cmd->new_oid))
2372 continue;
2373 oid_array_append(ref, &cmd->new_oid);
2374 cmd->index = ref->nr - 1;
2376 si->ref = ref;
2378 if (shallow_update) {
2379 prepare_shallow_update(si);
2380 return;
2383 ALLOC_ARRAY(ref_status, ref->nr);
2384 assign_shallow_commits_to_refs(si, NULL, ref_status);
2385 for (cmd = commands; cmd; cmd = cmd->next) {
2386 if (is_null_oid(&cmd->new_oid))
2387 continue;
2388 if (ref_status[cmd->index]) {
2389 cmd->error_string = "shallow update not allowed";
2390 cmd->skip_update = 1;
2393 free(ref_status);
2396 static void report(struct command *commands, const char *unpack_status)
2398 struct command *cmd;
2399 struct strbuf buf = STRBUF_INIT;
2401 packet_buf_write(&buf, "unpack %s\n",
2402 unpack_status ? unpack_status : "ok");
2403 for (cmd = commands; cmd; cmd = cmd->next) {
2404 if (!cmd->error_string)
2405 packet_buf_write(&buf, "ok %s\n",
2406 cmd->ref_name);
2407 else
2408 packet_buf_write(&buf, "ng %s %s\n",
2409 cmd->ref_name, cmd->error_string);
2411 packet_buf_flush(&buf);
2413 if (use_sideband)
2414 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
2415 else
2416 write_or_die(1, buf.buf, buf.len);
2417 strbuf_release(&buf);
2420 static void report_v2(struct command *commands, const char *unpack_status)
2422 struct command *cmd;
2423 struct strbuf buf = STRBUF_INIT;
2424 struct ref_push_report *report;
2426 packet_buf_write(&buf, "unpack %s\n",
2427 unpack_status ? unpack_status : "ok");
2428 for (cmd = commands; cmd; cmd = cmd->next) {
2429 int count = 0;
2431 if (cmd->error_string) {
2432 packet_buf_write(&buf, "ng %s %s\n",
2433 cmd->ref_name,
2434 cmd->error_string);
2435 continue;
2437 packet_buf_write(&buf, "ok %s\n",
2438 cmd->ref_name);
2439 for (report = cmd->report; report; report = report->next) {
2440 if (count++ > 0)
2441 packet_buf_write(&buf, "ok %s\n",
2442 cmd->ref_name);
2443 if (report->ref_name)
2444 packet_buf_write(&buf, "option refname %s\n",
2445 report->ref_name);
2446 if (report->old_oid)
2447 packet_buf_write(&buf, "option old-oid %s\n",
2448 oid_to_hex(report->old_oid));
2449 if (report->new_oid)
2450 packet_buf_write(&buf, "option new-oid %s\n",
2451 oid_to_hex(report->new_oid));
2452 if (report->forced_update)
2453 packet_buf_write(&buf, "option forced-update\n");
2456 packet_buf_flush(&buf);
2458 if (use_sideband)
2459 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
2460 else
2461 write_or_die(1, buf.buf, buf.len);
2462 strbuf_release(&buf);
2465 static int delete_only(struct command *commands)
2467 struct command *cmd;
2468 for (cmd = commands; cmd; cmd = cmd->next) {
2469 if (!is_null_oid(&cmd->new_oid))
2470 return 0;
2472 return 1;
2475 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
2477 int advertise_refs = 0;
2478 struct command *commands;
2479 struct oid_array shallow = OID_ARRAY_INIT;
2480 struct oid_array ref = OID_ARRAY_INIT;
2481 struct shallow_info si;
2482 struct packet_reader reader;
2484 struct option options[] = {
2485 OPT__QUIET(&quiet, N_("quiet")),
2486 OPT_HIDDEN_BOOL(0, "stateless-rpc", &stateless_rpc, NULL),
2487 OPT_HIDDEN_BOOL(0, "http-backend-info-refs", &advertise_refs, NULL),
2488 OPT_ALIAS(0, "advertise-refs", "http-backend-info-refs"),
2489 OPT_HIDDEN_BOOL(0, "reject-thin-pack-for-testing", &reject_thin, NULL),
2490 OPT_END()
2493 packet_trace_identity("receive-pack");
2495 argc = parse_options(argc, argv, prefix, options, receive_pack_usage, 0);
2497 if (argc > 1)
2498 usage_msg_opt(_("too many arguments"), receive_pack_usage, options);
2499 if (argc == 0)
2500 usage_msg_opt(_("you must specify a directory"), receive_pack_usage, options);
2502 service_dir = argv[0];
2504 setup_path();
2506 if (!enter_repo(service_dir, 0))
2507 die("'%s' does not appear to be a git repository", service_dir);
2509 git_config(receive_pack_config, NULL);
2510 if (cert_nonce_seed)
2511 push_cert_nonce = prepare_push_cert_nonce(service_dir, time(NULL));
2513 if (0 <= transfer_unpack_limit)
2514 unpack_limit = transfer_unpack_limit;
2515 else if (0 <= receive_unpack_limit)
2516 unpack_limit = receive_unpack_limit;
2518 switch (determine_protocol_version_server()) {
2519 case protocol_v2:
2521 * push support for protocol v2 has not been implemented yet,
2522 * so ignore the request to use v2 and fallback to using v0.
2524 break;
2525 case protocol_v1:
2527 * v1 is just the original protocol with a version string,
2528 * so just fall through after writing the version string.
2530 if (advertise_refs || !stateless_rpc)
2531 packet_write_fmt(1, "version 1\n");
2533 /* fallthrough */
2534 case protocol_v0:
2535 break;
2536 case protocol_unknown_version:
2537 BUG("unknown protocol version");
2540 if (advertise_refs || !stateless_rpc) {
2541 write_head_info();
2543 if (advertise_refs)
2544 return 0;
2546 packet_reader_init(&reader, 0, NULL, 0,
2547 PACKET_READ_CHOMP_NEWLINE |
2548 PACKET_READ_DIE_ON_ERR_PACKET);
2550 if ((commands = read_head_info(&reader, &shallow))) {
2551 const char *unpack_status = NULL;
2552 struct string_list push_options = STRING_LIST_INIT_DUP;
2554 if (use_push_options)
2555 read_push_options(&reader, &push_options);
2556 if (!check_cert_push_options(&push_options)) {
2557 struct command *cmd;
2558 for (cmd = commands; cmd; cmd = cmd->next)
2559 cmd->error_string = "inconsistent push options";
2562 prepare_shallow_info(&si, &shallow);
2563 if (!si.nr_ours && !si.nr_theirs)
2564 shallow_update = 0;
2565 if (!delete_only(commands)) {
2566 unpack_status = unpack_with_sideband(&si);
2567 update_shallow_info(commands, &si, &ref);
2569 use_keepalive = KEEPALIVE_ALWAYS;
2570 execute_commands(commands, unpack_status, &si,
2571 &push_options);
2572 if (pack_lockfile)
2573 unlink_or_warn(pack_lockfile);
2574 sigchain_push(SIGPIPE, SIG_IGN);
2575 if (report_status_v2)
2576 report_v2(commands, unpack_status);
2577 else if (report_status)
2578 report(commands, unpack_status);
2579 sigchain_pop(SIGPIPE);
2580 run_receive_hook(commands, "post-receive", 1,
2581 &push_options);
2582 run_update_post_hook(commands);
2583 free_commands(commands);
2584 string_list_clear(&push_options, 0);
2585 if (auto_gc) {
2586 struct child_process proc = CHILD_PROCESS_INIT;
2588 proc.no_stdin = 1;
2589 proc.stdout_to_stderr = 1;
2590 proc.err = use_sideband ? -1 : 0;
2591 proc.git_cmd = proc.close_object_store = 1;
2592 strvec_pushl(&proc.args, "gc", "--auto", "--quiet",
2593 NULL);
2595 if (!start_command(&proc)) {
2596 if (use_sideband)
2597 copy_to_sideband(proc.err, -1, NULL);
2598 finish_command(&proc);
2601 if (auto_update_server_info)
2602 update_server_info(0);
2603 clear_shallow_info(&si);
2605 if (use_sideband)
2606 packet_flush(1);
2607 oid_array_clear(&shallow);
2608 oid_array_clear(&ref);
2609 string_list_clear(&hidden_refs, 0);
2610 free((void *)push_cert_nonce);
2611 return 0;