1#include "builtin.h"
2#include "pack.h"
3#include "refs.h"
4#include "pkt-line.h"
5#include "sideband.h"
6#include "run-command.h"
7#include "exec_cmd.h"
8#include "commit.h"
9#include "object.h"
10#include "remote.h"
11#include "connect.h"
12#include "transport.h"
13#include "string-list.h"
14#include "sha1-array.h"
15#include "connected.h"
16#include "argv-array.h"
17#include "version.h"
18
19static const char receive_pack_usage[] = "git receive-pack <git-dir>";
20
21enum deny_action {
22 DENY_UNCONFIGURED,
23 DENY_IGNORE,
24 DENY_WARN,
25 DENY_REFUSE
26};
27
28static int deny_deletes;
29static int deny_non_fast_forwards;
30static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
31static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
32static int receive_fsck_objects = -1;
33static int transfer_fsck_objects = -1;
34static int receive_unpack_limit = -1;
35static int transfer_unpack_limit = -1;
36static int unpack_limit = 100;
37static int report_status;
38static int use_sideband;
39static int quiet;
40static int prefer_ofs_delta = 1;
41static int auto_update_server_info;
42static int auto_gc = 1;
43static int fix_thin = 1;
44static const char *head_name;
45static void *head_name_to_free;
46static int sent_capabilities;
47static int shallow_update;
48static const char *alt_shallow_file;
49
50static enum deny_action parse_deny_action(const char *var, const char *value)
51{
52 if (value) {
53 if (!strcasecmp(value, "ignore"))
54 return DENY_IGNORE;
55 if (!strcasecmp(value, "warn"))
56 return DENY_WARN;
57 if (!strcasecmp(value, "refuse"))
58 return DENY_REFUSE;
59 }
60 if (git_config_bool(var, value))
61 return DENY_REFUSE;
62 return DENY_IGNORE;
63}
64
65static int receive_pack_config(const char *var, const char *value, void *cb)
66{
67 int status = parse_hide_refs_config(var, value, "receive");
68
69 if (status)
70 return status;
71
72 if (strcmp(var, "receive.denydeletes") == 0) {
73 deny_deletes = git_config_bool(var, value);
74 return 0;
75 }
76
77 if (strcmp(var, "receive.denynonfastforwards") == 0) {
78 deny_non_fast_forwards = git_config_bool(var, value);
79 return 0;
80 }
81
82 if (strcmp(var, "receive.unpacklimit") == 0) {
83 receive_unpack_limit = git_config_int(var, value);
84 return 0;
85 }
86
87 if (strcmp(var, "transfer.unpacklimit") == 0) {
88 transfer_unpack_limit = git_config_int(var, value);
89 return 0;
90 }
91
92 if (strcmp(var, "receive.fsckobjects") == 0) {
93 receive_fsck_objects = git_config_bool(var, value);
94 return 0;
95 }
96
97 if (strcmp(var, "transfer.fsckobjects") == 0) {
98 transfer_fsck_objects = git_config_bool(var, value);
99 return 0;
100 }
101
102 if (!strcmp(var, "receive.denycurrentbranch")) {
103 deny_current_branch = parse_deny_action(var, value);
104 return 0;
105 }
106
107 if (strcmp(var, "receive.denydeletecurrent") == 0) {
108 deny_delete_current = parse_deny_action(var, value);
109 return 0;
110 }
111
112 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
113 prefer_ofs_delta = git_config_bool(var, value);
114 return 0;
115 }
116
117 if (strcmp(var, "receive.updateserverinfo") == 0) {
118 auto_update_server_info = git_config_bool(var, value);
119 return 0;
120 }
121
122 if (strcmp(var, "receive.autogc") == 0) {
123 auto_gc = git_config_bool(var, value);
124 return 0;
125 }
126
127 if (strcmp(var, "receive.shallowupdate") == 0) {
128 shallow_update = git_config_bool(var, value);
129 return 0;
130 }
131
132 return git_default_config(var, value, cb);
133}
134
135static void show_ref(const char *path, const unsigned char *sha1)
136{
137 if (ref_is_hidden(path))
138 return;
139
140 if (sent_capabilities)
141 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
142 else
143 packet_write(1, "%s %s%c%s%s agent=%s\n",
144 sha1_to_hex(sha1), path, 0,
145 " report-status delete-refs side-band-64k quiet",
146 prefer_ofs_delta ? " ofs-delta" : "",
147 git_user_agent_sanitized());
148 sent_capabilities = 1;
149}
150
151static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
152{
153 path = strip_namespace(path);
154 /*
155 * Advertise refs outside our current namespace as ".have"
156 * refs, so that the client can use them to minimize data
157 * transfer but will otherwise ignore them. This happens to
158 * cover ".have" that are thrown in by add_one_alternate_ref()
159 * to mark histories that are complete in our alternates as
160 * well.
161 */
162 if (!path)
163 path = ".have";
164 show_ref(path, sha1);
165 return 0;
166}
167
168static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
169{
170 show_ref(".have", sha1);
171}
172
173static void collect_one_alternate_ref(const struct ref *ref, void *data)
174{
175 struct sha1_array *sa = data;
176 sha1_array_append(sa, ref->old_sha1);
177}
178
179static void write_head_info(void)
180{
181 struct sha1_array sa = SHA1_ARRAY_INIT;
182 for_each_alternate_ref(collect_one_alternate_ref, &sa);
183 sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
184 sha1_array_clear(&sa);
185 for_each_ref(show_ref_cb, NULL);
186 if (!sent_capabilities)
187 show_ref("capabilities^{}", null_sha1);
188
189 advertise_shallow_grafts(1);
190
191 /* EOF */
192 packet_flush(1);
193}
194
195struct command {
196 struct command *next;
197 const char *error_string;
198 unsigned int skip_update:1,
199 did_not_exist:1;
200 int index;
201 unsigned char old_sha1[20];
202 unsigned char new_sha1[20];
203 char ref_name[FLEX_ARRAY]; /* more */
204};
205
206static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
207static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
208
209static void report_message(const char *prefix, const char *err, va_list params)
210{
211 int sz = strlen(prefix);
212 char msg[4096];
213
214 strncpy(msg, prefix, sz);
215 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
216 if (sz > (sizeof(msg) - 1))
217 sz = sizeof(msg) - 1;
218 msg[sz++] = '\n';
219
220 if (use_sideband)
221 send_sideband(1, 2, msg, sz, use_sideband);
222 else
223 xwrite(2, msg, sz);
224}
225
226static void rp_warning(const char *err, ...)
227{
228 va_list params;
229 va_start(params, err);
230 report_message("warning: ", err, params);
231 va_end(params);
232}
233
234static void rp_error(const char *err, ...)
235{
236 va_list params;
237 va_start(params, err);
238 report_message("error: ", err, params);
239 va_end(params);
240}
241
242static int copy_to_sideband(int in, int out, void *arg)
243{
244 char data[128];
245 while (1) {
246 ssize_t sz = xread(in, data, sizeof(data));
247 if (sz <= 0)
248 break;
249 send_sideband(1, 2, data, sz, use_sideband);
250 }
251 close(in);
252 return 0;
253}
254
255typedef int (*feed_fn)(void *, const char **, size_t *);
256static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
257{
258 struct child_process proc = CHILD_PROCESS_INIT;
259 struct async muxer;
260 const char *argv[2];
261 int code;
262
263 argv[0] = find_hook(hook_name);
264 if (!argv[0])
265 return 0;
266
267 argv[1] = NULL;
268
269 proc.argv = argv;
270 proc.in = -1;
271 proc.stdout_to_stderr = 1;
272
273 if (use_sideband) {
274 memset(&muxer, 0, sizeof(muxer));
275 muxer.proc = copy_to_sideband;
276 muxer.in = -1;
277 code = start_async(&muxer);
278 if (code)
279 return code;
280 proc.err = muxer.in;
281 }
282
283 code = start_command(&proc);
284 if (code) {
285 if (use_sideband)
286 finish_async(&muxer);
287 return code;
288 }
289
290 while (1) {
291 const char *buf;
292 size_t n;
293 if (feed(feed_state, &buf, &n))
294 break;
295 if (write_in_full(proc.in, buf, n) != n)
296 break;
297 }
298 close(proc.in);
299 if (use_sideband)
300 finish_async(&muxer);
301 return finish_command(&proc);
302}
303
304struct receive_hook_feed_state {
305 struct command *cmd;
306 int skip_broken;
307 struct strbuf buf;
308};
309
310static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
311{
312 struct receive_hook_feed_state *state = state_;
313 struct command *cmd = state->cmd;
314
315 while (cmd &&
316 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
317 cmd = cmd->next;
318 if (!cmd)
319 return -1; /* EOF */
320 strbuf_reset(&state->buf);
321 strbuf_addf(&state->buf, "%s %s %s\n",
322 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
323 cmd->ref_name);
324 state->cmd = cmd->next;
325 if (bufp) {
326 *bufp = state->buf.buf;
327 *sizep = state->buf.len;
328 }
329 return 0;
330}
331
332static int run_receive_hook(struct command *commands, const char *hook_name,
333 int skip_broken)
334{
335 struct receive_hook_feed_state state;
336 int status;
337
338 strbuf_init(&state.buf, 0);
339 state.cmd = commands;
340 state.skip_broken = skip_broken;
341 if (feed_receive_hook(&state, NULL, NULL))
342 return 0;
343 state.cmd = commands;
344 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
345 strbuf_release(&state.buf);
346 return status;
347}
348
349static int run_update_hook(struct command *cmd)
350{
351 const char *argv[5];
352 struct child_process proc = CHILD_PROCESS_INIT;
353 int code;
354
355 argv[0] = find_hook("update");
356 if (!argv[0])
357 return 0;
358
359 argv[1] = cmd->ref_name;
360 argv[2] = sha1_to_hex(cmd->old_sha1);
361 argv[3] = sha1_to_hex(cmd->new_sha1);
362 argv[4] = NULL;
363
364 proc.no_stdin = 1;
365 proc.stdout_to_stderr = 1;
366 proc.err = use_sideband ? -1 : 0;
367 proc.argv = argv;
368
369 code = start_command(&proc);
370 if (code)
371 return code;
372 if (use_sideband)
373 copy_to_sideband(proc.err, -1, NULL);
374 return finish_command(&proc);
375}
376
377static int is_ref_checked_out(const char *ref)
378{
379 if (is_bare_repository())
380 return 0;
381
382 if (!head_name)
383 return 0;
384 return !strcmp(head_name, ref);
385}
386
387static char *refuse_unconfigured_deny_msg[] = {
388 "By default, updating the current branch in a non-bare repository",
389 "is denied, because it will make the index and work tree inconsistent",
390 "with what you pushed, and will require 'git reset --hard' to match",
391 "the work tree to HEAD.",
392 "",
393 "You can set 'receive.denyCurrentBranch' configuration variable to",
394 "'ignore' or 'warn' in the remote repository to allow pushing into",
395 "its current branch; however, this is not recommended unless you",
396 "arranged to update its work tree to match what you pushed in some",
397 "other way.",
398 "",
399 "To squelch this message and still keep the default behaviour, set",
400 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
401};
402
403static void refuse_unconfigured_deny(void)
404{
405 int i;
406 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
407 rp_error("%s", refuse_unconfigured_deny_msg[i]);
408}
409
410static char *refuse_unconfigured_deny_delete_current_msg[] = {
411 "By default, deleting the current branch is denied, because the next",
412 "'git clone' won't result in any file checked out, causing confusion.",
413 "",
414 "You can set 'receive.denyDeleteCurrent' configuration variable to",
415 "'warn' or 'ignore' in the remote repository to allow deleting the",
416 "current branch, with or without a warning message.",
417 "",
418 "To squelch this message, you can set it to 'refuse'."
419};
420
421static void refuse_unconfigured_deny_delete_current(void)
422{
423 int i;
424 for (i = 0;
425 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
426 i++)
427 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
428}
429
430static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]);
431static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
432{
433 static struct lock_file shallow_lock;
434 struct sha1_array extra = SHA1_ARRAY_INIT;
435 const char *alt_file;
436 uint32_t mask = 1 << (cmd->index % 32);
437 int i;
438
439 trace_printf_key(&trace_shallow,
440 "shallow: update_shallow_ref %s\n", cmd->ref_name);
441 for (i = 0; i < si->shallow->nr; i++)
442 if (si->used_shallow[i] &&
443 (si->used_shallow[i][cmd->index / 32] & mask) &&
444 !delayed_reachability_test(si, i))
445 sha1_array_append(&extra, si->shallow->sha1[i]);
446
447 setup_alternate_shallow(&shallow_lock, &alt_file, &extra);
448 if (check_shallow_connected(command_singleton_iterator,
449 0, cmd, alt_file)) {
450 rollback_lock_file(&shallow_lock);
451 sha1_array_clear(&extra);
452 return -1;
453 }
454
455 commit_lock_file(&shallow_lock);
456
457 /*
458 * Make sure setup_alternate_shallow() for the next ref does
459 * not lose these new roots..
460 */
461 for (i = 0; i < extra.nr; i++)
462 register_shallow(extra.sha1[i]);
463
464 si->shallow_ref[cmd->index] = 0;
465 sha1_array_clear(&extra);
466 return 0;
467}
468
469static const char *update(struct command *cmd, struct shallow_info *si)
470{
471 const char *name = cmd->ref_name;
472 struct strbuf namespaced_name_buf = STRBUF_INIT;
473 const char *namespaced_name;
474 unsigned char *old_sha1 = cmd->old_sha1;
475 unsigned char *new_sha1 = cmd->new_sha1;
476
477 /* only refs/... are allowed */
478 if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
479 rp_error("refusing to create funny ref '%s' remotely", name);
480 return "funny refname";
481 }
482
483 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
484 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
485
486 if (is_ref_checked_out(namespaced_name)) {
487 switch (deny_current_branch) {
488 case DENY_IGNORE:
489 break;
490 case DENY_WARN:
491 rp_warning("updating the current branch");
492 break;
493 case DENY_REFUSE:
494 case DENY_UNCONFIGURED:
495 rp_error("refusing to update checked out branch: %s", name);
496 if (deny_current_branch == DENY_UNCONFIGURED)
497 refuse_unconfigured_deny();
498 return "branch is currently checked out";
499 }
500 }
501
502 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
503 error("unpack should have generated %s, "
504 "but I can't find it!", sha1_to_hex(new_sha1));
505 return "bad pack";
506 }
507
508 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
509 if (deny_deletes && starts_with(name, "refs/heads/")) {
510 rp_error("denying ref deletion for %s", name);
511 return "deletion prohibited";
512 }
513
514 if (!strcmp(namespaced_name, head_name)) {
515 switch (deny_delete_current) {
516 case DENY_IGNORE:
517 break;
518 case DENY_WARN:
519 rp_warning("deleting the current branch");
520 break;
521 case DENY_REFUSE:
522 case DENY_UNCONFIGURED:
523 if (deny_delete_current == DENY_UNCONFIGURED)
524 refuse_unconfigured_deny_delete_current();
525 rp_error("refusing to delete the current branch: %s", name);
526 return "deletion of the current branch prohibited";
527 }
528 }
529 }
530
531 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
532 !is_null_sha1(old_sha1) &&
533 starts_with(name, "refs/heads/")) {
534 struct object *old_object, *new_object;
535 struct commit *old_commit, *new_commit;
536
537 old_object = parse_object(old_sha1);
538 new_object = parse_object(new_sha1);
539
540 if (!old_object || !new_object ||
541 old_object->type != OBJ_COMMIT ||
542 new_object->type != OBJ_COMMIT) {
543 error("bad sha1 objects for %s", name);
544 return "bad ref";
545 }
546 old_commit = (struct commit *)old_object;
547 new_commit = (struct commit *)new_object;
548 if (!in_merge_bases(old_commit, new_commit)) {
549 rp_error("denying non-fast-forward %s"
550 " (you should pull first)", name);
551 return "non-fast-forward";
552 }
553 }
554 if (run_update_hook(cmd)) {
555 rp_error("hook declined to update %s", name);
556 return "hook declined";
557 }
558
559 if (is_null_sha1(new_sha1)) {
560 if (!parse_object(old_sha1)) {
561 old_sha1 = NULL;
562 if (ref_exists(name)) {
563 rp_warning("Allowing deletion of corrupt ref.");
564 } else {
565 rp_warning("Deleting a non-existent ref.");
566 cmd->did_not_exist = 1;
567 }
568 }
569 if (delete_ref(namespaced_name, old_sha1, 0)) {
570 rp_error("failed to delete %s", name);
571 return "failed to delete";
572 }
573 return NULL; /* good */
574 }
575 else {
576 struct strbuf err = STRBUF_INIT;
577 struct ref_transaction *transaction;
578
579 if (shallow_update && si->shallow_ref[cmd->index] &&
580 update_shallow_ref(cmd, si))
581 return "shallow error";
582
583 transaction = ref_transaction_begin(&err);
584 if (!transaction ||
585 ref_transaction_update(transaction, namespaced_name,
586 new_sha1, old_sha1, 0, 1, &err) ||
587 ref_transaction_commit(transaction, "push", &err)) {
588 ref_transaction_free(transaction);
589
590 rp_error("%s", err.buf);
591 strbuf_release(&err);
592 return "failed to update ref";
593 }
594
595 ref_transaction_free(transaction);
596 strbuf_release(&err);
597 return NULL; /* good */
598 }
599}
600
601static void run_update_post_hook(struct command *commands)
602{
603 struct command *cmd;
604 int argc;
605 const char **argv;
606 struct child_process proc = CHILD_PROCESS_INIT;
607 char *hook;
608
609 hook = find_hook("post-update");
610 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
611 if (cmd->error_string || cmd->did_not_exist)
612 continue;
613 argc++;
614 }
615 if (!argc || !hook)
616 return;
617
618 argv = xmalloc(sizeof(*argv) * (2 + argc));
619 argv[0] = hook;
620
621 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
622 if (cmd->error_string || cmd->did_not_exist)
623 continue;
624 argv[argc] = xstrdup(cmd->ref_name);
625 argc++;
626 }
627 argv[argc] = NULL;
628
629 proc.no_stdin = 1;
630 proc.stdout_to_stderr = 1;
631 proc.err = use_sideband ? -1 : 0;
632 proc.argv = argv;
633
634 if (!start_command(&proc)) {
635 if (use_sideband)
636 copy_to_sideband(proc.err, -1, NULL);
637 finish_command(&proc);
638 }
639}
640
641static void check_aliased_update(struct command *cmd, struct string_list *list)
642{
643 struct strbuf buf = STRBUF_INIT;
644 const char *dst_name;
645 struct string_list_item *item;
646 struct command *dst_cmd;
647 unsigned char sha1[20];
648 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
649 int flag;
650
651 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
652 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
653 strbuf_release(&buf);
654
655 if (!(flag & REF_ISSYMREF))
656 return;
657
658 dst_name = strip_namespace(dst_name);
659 if (!dst_name) {
660 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
661 cmd->skip_update = 1;
662 cmd->error_string = "broken symref";
663 return;
664 }
665
666 if ((item = string_list_lookup(list, dst_name)) == NULL)
667 return;
668
669 cmd->skip_update = 1;
670
671 dst_cmd = (struct command *) item->util;
672
673 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
674 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
675 return;
676
677 dst_cmd->skip_update = 1;
678
679 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
680 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
681 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
682 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
683 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
684 " its target '%s' (%s..%s)",
685 cmd->ref_name, cmd_oldh, cmd_newh,
686 dst_cmd->ref_name, dst_oldh, dst_newh);
687
688 cmd->error_string = dst_cmd->error_string =
689 "inconsistent aliased update";
690}
691
692static void check_aliased_updates(struct command *commands)
693{
694 struct command *cmd;
695 struct string_list ref_list = STRING_LIST_INIT_NODUP;
696
697 for (cmd = commands; cmd; cmd = cmd->next) {
698 struct string_list_item *item =
699 string_list_append(&ref_list, cmd->ref_name);
700 item->util = (void *)cmd;
701 }
702 sort_string_list(&ref_list);
703
704 for (cmd = commands; cmd; cmd = cmd->next) {
705 if (!cmd->error_string)
706 check_aliased_update(cmd, &ref_list);
707 }
708
709 string_list_clear(&ref_list, 0);
710}
711
712static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
713{
714 struct command **cmd_list = cb_data;
715 struct command *cmd = *cmd_list;
716
717 if (!cmd || is_null_sha1(cmd->new_sha1))
718 return -1; /* end of list */
719 *cmd_list = NULL; /* this returns only one */
720 hashcpy(sha1, cmd->new_sha1);
721 return 0;
722}
723
724static void set_connectivity_errors(struct command *commands,
725 struct shallow_info *si)
726{
727 struct command *cmd;
728
729 for (cmd = commands; cmd; cmd = cmd->next) {
730 struct command *singleton = cmd;
731 if (shallow_update && si->shallow_ref[cmd->index])
732 /* to be checked in update_shallow_ref() */
733 continue;
734 if (!check_everything_connected(command_singleton_iterator,
735 0, &singleton))
736 continue;
737 cmd->error_string = "missing necessary objects";
738 }
739}
740
741struct iterate_data {
742 struct command *cmds;
743 struct shallow_info *si;
744};
745
746static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
747{
748 struct iterate_data *data = cb_data;
749 struct command **cmd_list = &data->cmds;
750 struct command *cmd = *cmd_list;
751
752 for (; cmd; cmd = cmd->next) {
753 if (shallow_update && data->si->shallow_ref[cmd->index])
754 /* to be checked in update_shallow_ref() */
755 continue;
756 if (!is_null_sha1(cmd->new_sha1) && !cmd->skip_update) {
757 hashcpy(sha1, cmd->new_sha1);
758 *cmd_list = cmd->next;
759 return 0;
760 }
761 }
762 *cmd_list = NULL;
763 return -1; /* end of list */
764}
765
766static void reject_updates_to_hidden(struct command *commands)
767{
768 struct command *cmd;
769
770 for (cmd = commands; cmd; cmd = cmd->next) {
771 if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
772 continue;
773 if (is_null_sha1(cmd->new_sha1))
774 cmd->error_string = "deny deleting a hidden ref";
775 else
776 cmd->error_string = "deny updating a hidden ref";
777 }
778}
779
780static void execute_commands(struct command *commands,
781 const char *unpacker_error,
782 struct shallow_info *si)
783{
784 int checked_connectivity;
785 struct command *cmd;
786 unsigned char sha1[20];
787 struct iterate_data data;
788
789 if (unpacker_error) {
790 for (cmd = commands; cmd; cmd = cmd->next)
791 cmd->error_string = "unpacker error";
792 return;
793 }
794
795 data.cmds = commands;
796 data.si = si;
797 if (check_everything_connected(iterate_receive_command_list, 0, &data))
798 set_connectivity_errors(commands, si);
799
800 reject_updates_to_hidden(commands);
801
802 if (run_receive_hook(commands, "pre-receive", 0)) {
803 for (cmd = commands; cmd; cmd = cmd->next) {
804 if (!cmd->error_string)
805 cmd->error_string = "pre-receive hook declined";
806 }
807 return;
808 }
809
810 check_aliased_updates(commands);
811
812 free(head_name_to_free);
813 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
814
815 checked_connectivity = 1;
816 for (cmd = commands; cmd; cmd = cmd->next) {
817 if (cmd->error_string)
818 continue;
819
820 if (cmd->skip_update)
821 continue;
822
823 cmd->error_string = update(cmd, si);
824 if (shallow_update && !cmd->error_string &&
825 si->shallow_ref[cmd->index]) {
826 error("BUG: connectivity check has not been run on ref %s",
827 cmd->ref_name);
828 checked_connectivity = 0;
829 }
830 }
831
832 if (shallow_update && !checked_connectivity)
833 error("BUG: run 'git fsck' for safety.\n"
834 "If there are errors, try to remove "
835 "the reported refs above");
836}
837
838static struct command *read_head_info(struct sha1_array *shallow)
839{
840 struct command *commands = NULL;
841 struct command **p = &commands;
842 for (;;) {
843 char *line;
844 unsigned char old_sha1[20], new_sha1[20];
845 struct command *cmd;
846 char *refname;
847 int len, reflen;
848
849 line = packet_read_line(0, &len);
850 if (!line)
851 break;
852
853 if (len == 48 && starts_with(line, "shallow ")) {
854 if (get_sha1_hex(line + 8, old_sha1))
855 die("protocol error: expected shallow sha, got '%s'", line + 8);
856 sha1_array_append(shallow, old_sha1);
857 continue;
858 }
859
860 if (len < 83 ||
861 line[40] != ' ' ||
862 line[81] != ' ' ||
863 get_sha1_hex(line, old_sha1) ||
864 get_sha1_hex(line + 41, new_sha1))
865 die("protocol error: expected old/new/ref, got '%s'",
866 line);
867
868 refname = line + 82;
869 reflen = strlen(refname);
870 if (reflen + 82 < len) {
871 const char *feature_list = refname + reflen + 1;
872 if (parse_feature_request(feature_list, "report-status"))
873 report_status = 1;
874 if (parse_feature_request(feature_list, "side-band-64k"))
875 use_sideband = LARGE_PACKET_MAX;
876 if (parse_feature_request(feature_list, "quiet"))
877 quiet = 1;
878 }
879 cmd = xcalloc(1, sizeof(struct command) + len - 80);
880 hashcpy(cmd->old_sha1, old_sha1);
881 hashcpy(cmd->new_sha1, new_sha1);
882 memcpy(cmd->ref_name, line + 82, len - 81);
883 *p = cmd;
884 p = &cmd->next;
885 }
886 return commands;
887}
888
889static const char *parse_pack_header(struct pack_header *hdr)
890{
891 switch (read_pack_header(0, hdr)) {
892 case PH_ERROR_EOF:
893 return "eof before pack header was fully read";
894
895 case PH_ERROR_PACK_SIGNATURE:
896 return "protocol error (pack signature mismatch detected)";
897
898 case PH_ERROR_PROTOCOL:
899 return "protocol error (pack version unsupported)";
900
901 default:
902 return "unknown error in parse_pack_header";
903
904 case 0:
905 return NULL;
906 }
907}
908
909static const char *pack_lockfile;
910
911static const char *unpack(int err_fd, struct shallow_info *si)
912{
913 struct pack_header hdr;
914 struct argv_array av = ARGV_ARRAY_INIT;
915 const char *hdr_err;
916 int status;
917 char hdr_arg[38];
918 struct child_process child = CHILD_PROCESS_INIT;
919 int fsck_objects = (receive_fsck_objects >= 0
920 ? receive_fsck_objects
921 : transfer_fsck_objects >= 0
922 ? transfer_fsck_objects
923 : 0);
924
925 hdr_err = parse_pack_header(&hdr);
926 if (hdr_err) {
927 if (err_fd > 0)
928 close(err_fd);
929 return hdr_err;
930 }
931 snprintf(hdr_arg, sizeof(hdr_arg),
932 "--pack_header=%"PRIu32",%"PRIu32,
933 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
934
935 if (si->nr_ours || si->nr_theirs) {
936 alt_shallow_file = setup_temporary_shallow(si->shallow);
937 argv_array_pushl(&av, "--shallow-file", alt_shallow_file, NULL);
938 }
939
940 if (ntohl(hdr.hdr_entries) < unpack_limit) {
941 argv_array_pushl(&av, "unpack-objects", hdr_arg, NULL);
942 if (quiet)
943 argv_array_push(&av, "-q");
944 if (fsck_objects)
945 argv_array_push(&av, "--strict");
946 child.argv = av.argv;
947 child.no_stdout = 1;
948 child.err = err_fd;
949 child.git_cmd = 1;
950 status = run_command(&child);
951 if (status)
952 return "unpack-objects abnormal exit";
953 } else {
954 int s;
955 char keep_arg[256];
956
957 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
958 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
959 strcpy(keep_arg + s, "localhost");
960
961 argv_array_pushl(&av, "index-pack",
962 "--stdin", hdr_arg, keep_arg, NULL);
963 if (fsck_objects)
964 argv_array_push(&av, "--strict");
965 if (fix_thin)
966 argv_array_push(&av, "--fix-thin");
967 child.argv = av.argv;
968 child.out = -1;
969 child.err = err_fd;
970 child.git_cmd = 1;
971 status = start_command(&child);
972 if (status)
973 return "index-pack fork failed";
974 pack_lockfile = index_pack_lockfile(child.out);
975 close(child.out);
976 status = finish_command(&child);
977 if (status)
978 return "index-pack abnormal exit";
979 reprepare_packed_git();
980 }
981 return NULL;
982}
983
984static const char *unpack_with_sideband(struct shallow_info *si)
985{
986 struct async muxer;
987 const char *ret;
988
989 if (!use_sideband)
990 return unpack(0, si);
991
992 memset(&muxer, 0, sizeof(muxer));
993 muxer.proc = copy_to_sideband;
994 muxer.in = -1;
995 if (start_async(&muxer))
996 return NULL;
997
998 ret = unpack(muxer.in, si);
999
1000 finish_async(&muxer);
1001 return ret;
1002}
1003
1004static void prepare_shallow_update(struct command *commands,
1005 struct shallow_info *si)
1006{
1007 int i, j, k, bitmap_size = (si->ref->nr + 31) / 32;
1008
1009 si->used_shallow = xmalloc(sizeof(*si->used_shallow) *
1010 si->shallow->nr);
1011 assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
1012
1013 si->need_reachability_test =
1014 xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
1015 si->reachable =
1016 xcalloc(si->shallow->nr, sizeof(*si->reachable));
1017 si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
1018
1019 for (i = 0; i < si->nr_ours; i++)
1020 si->need_reachability_test[si->ours[i]] = 1;
1021
1022 for (i = 0; i < si->shallow->nr; i++) {
1023 if (!si->used_shallow[i])
1024 continue;
1025 for (j = 0; j < bitmap_size; j++) {
1026 if (!si->used_shallow[i][j])
1027 continue;
1028 si->need_reachability_test[i]++;
1029 for (k = 0; k < 32; k++)
1030 if (si->used_shallow[i][j] & (1 << k))
1031 si->shallow_ref[j * 32 + k]++;
1032 }
1033
1034 /*
1035 * true for those associated with some refs and belong
1036 * in "ours" list aka "step 7 not done yet"
1037 */
1038 si->need_reachability_test[i] =
1039 si->need_reachability_test[i] > 1;
1040 }
1041
1042 /*
1043 * keep hooks happy by forcing a temporary shallow file via
1044 * env variable because we can't add --shallow-file to every
1045 * command. check_everything_connected() will be done with
1046 * true .git/shallow though.
1047 */
1048 setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
1049}
1050
1051static void update_shallow_info(struct command *commands,
1052 struct shallow_info *si,
1053 struct sha1_array *ref)
1054{
1055 struct command *cmd;
1056 int *ref_status;
1057 remove_nonexistent_theirs_shallow(si);
1058 if (!si->nr_ours && !si->nr_theirs) {
1059 shallow_update = 0;
1060 return;
1061 }
1062
1063 for (cmd = commands; cmd; cmd = cmd->next) {
1064 if (is_null_sha1(cmd->new_sha1))
1065 continue;
1066 sha1_array_append(ref, cmd->new_sha1);
1067 cmd->index = ref->nr - 1;
1068 }
1069 si->ref = ref;
1070
1071 if (shallow_update) {
1072 prepare_shallow_update(commands, si);
1073 return;
1074 }
1075
1076 ref_status = xmalloc(sizeof(*ref_status) * ref->nr);
1077 assign_shallow_commits_to_refs(si, NULL, ref_status);
1078 for (cmd = commands; cmd; cmd = cmd->next) {
1079 if (is_null_sha1(cmd->new_sha1))
1080 continue;
1081 if (ref_status[cmd->index]) {
1082 cmd->error_string = "shallow update not allowed";
1083 cmd->skip_update = 1;
1084 }
1085 }
1086 free(ref_status);
1087}
1088
1089static void report(struct command *commands, const char *unpack_status)
1090{
1091 struct command *cmd;
1092 struct strbuf buf = STRBUF_INIT;
1093
1094 packet_buf_write(&buf, "unpack %s\n",
1095 unpack_status ? unpack_status : "ok");
1096 for (cmd = commands; cmd; cmd = cmd->next) {
1097 if (!cmd->error_string)
1098 packet_buf_write(&buf, "ok %s\n",
1099 cmd->ref_name);
1100 else
1101 packet_buf_write(&buf, "ng %s %s\n",
1102 cmd->ref_name, cmd->error_string);
1103 }
1104 packet_buf_flush(&buf);
1105
1106 if (use_sideband)
1107 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
1108 else
1109 write_or_die(1, buf.buf, buf.len);
1110 strbuf_release(&buf);
1111}
1112
1113static int delete_only(struct command *commands)
1114{
1115 struct command *cmd;
1116 for (cmd = commands; cmd; cmd = cmd->next) {
1117 if (!is_null_sha1(cmd->new_sha1))
1118 return 0;
1119 }
1120 return 1;
1121}
1122
1123int cmd_receive_pack(int argc, const char **argv, const char *prefix)
1124{
1125 int advertise_refs = 0;
1126 int stateless_rpc = 0;
1127 int i;
1128 const char *dir = NULL;
1129 struct command *commands;
1130 struct sha1_array shallow = SHA1_ARRAY_INIT;
1131 struct sha1_array ref = SHA1_ARRAY_INIT;
1132 struct shallow_info si;
1133
1134 packet_trace_identity("receive-pack");
1135
1136 argv++;
1137 for (i = 1; i < argc; i++) {
1138 const char *arg = *argv++;
1139
1140 if (*arg == '-') {
1141 if (!strcmp(arg, "--quiet")) {
1142 quiet = 1;
1143 continue;
1144 }
1145
1146 if (!strcmp(arg, "--advertise-refs")) {
1147 advertise_refs = 1;
1148 continue;
1149 }
1150 if (!strcmp(arg, "--stateless-rpc")) {
1151 stateless_rpc = 1;
1152 continue;
1153 }
1154 if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
1155 fix_thin = 0;
1156 continue;
1157 }
1158
1159 usage(receive_pack_usage);
1160 }
1161 if (dir)
1162 usage(receive_pack_usage);
1163 dir = arg;
1164 }
1165 if (!dir)
1166 usage(receive_pack_usage);
1167
1168 setup_path();
1169
1170 if (!enter_repo(dir, 0))
1171 die("'%s' does not appear to be a git repository", dir);
1172
1173 git_config(receive_pack_config, NULL);
1174
1175 if (0 <= transfer_unpack_limit)
1176 unpack_limit = transfer_unpack_limit;
1177 else if (0 <= receive_unpack_limit)
1178 unpack_limit = receive_unpack_limit;
1179
1180 if (advertise_refs || !stateless_rpc) {
1181 write_head_info();
1182 }
1183 if (advertise_refs)
1184 return 0;
1185
1186 if ((commands = read_head_info(&shallow)) != NULL) {
1187 const char *unpack_status = NULL;
1188
1189 prepare_shallow_info(&si, &shallow);
1190 if (!si.nr_ours && !si.nr_theirs)
1191 shallow_update = 0;
1192 if (!delete_only(commands)) {
1193 unpack_status = unpack_with_sideband(&si);
1194 update_shallow_info(commands, &si, &ref);
1195 }
1196 execute_commands(commands, unpack_status, &si);
1197 if (pack_lockfile)
1198 unlink_or_warn(pack_lockfile);
1199 if (report_status)
1200 report(commands, unpack_status);
1201 run_receive_hook(commands, "post-receive", 1);
1202 run_update_post_hook(commands);
1203 if (auto_gc) {
1204 const char *argv_gc_auto[] = {
1205 "gc", "--auto", "--quiet", NULL,
1206 };
1207 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1208 run_command_v_opt(argv_gc_auto, opt);
1209 }
1210 if (auto_update_server_info)
1211 update_server_info(0);
1212 clear_shallow_info(&si);
1213 }
1214 if (use_sideband)
1215 packet_flush(1);
1216 sha1_array_clear(&shallow);
1217 sha1_array_clear(&ref);
1218 return 0;
1219}