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