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