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