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