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 struct ref_lock *lock;
477
478 /* only refs/... are allowed */
479 if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
480 rp_error("refusing to create funny ref '%s' remotely", name);
481 return "funny refname";
482 }
483
484 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
485 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
486
487 if (is_ref_checked_out(namespaced_name)) {
488 switch (deny_current_branch) {
489 case DENY_IGNORE:
490 break;
491 case DENY_WARN:
492 rp_warning("updating the current branch");
493 break;
494 case DENY_REFUSE:
495 case DENY_UNCONFIGURED:
496 rp_error("refusing to update checked out branch: %s", name);
497 if (deny_current_branch == DENY_UNCONFIGURED)
498 refuse_unconfigured_deny();
499 return "branch is currently checked out";
500 }
501 }
502
503 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
504 error("unpack should have generated %s, "
505 "but I can't find it!", sha1_to_hex(new_sha1));
506 return "bad pack";
507 }
508
509 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
510 if (deny_deletes && starts_with(name, "refs/heads/")) {
511 rp_error("denying ref deletion for %s", name);
512 return "deletion prohibited";
513 }
514
515 if (!strcmp(namespaced_name, head_name)) {
516 switch (deny_delete_current) {
517 case DENY_IGNORE:
518 break;
519 case DENY_WARN:
520 rp_warning("deleting the current branch");
521 break;
522 case DENY_REFUSE:
523 case DENY_UNCONFIGURED:
524 if (deny_delete_current == DENY_UNCONFIGURED)
525 refuse_unconfigured_deny_delete_current();
526 rp_error("refusing to delete the current branch: %s", name);
527 return "deletion of the current branch prohibited";
528 }
529 }
530 }
531
532 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
533 !is_null_sha1(old_sha1) &&
534 starts_with(name, "refs/heads/")) {
535 struct object *old_object, *new_object;
536 struct commit *old_commit, *new_commit;
537
538 old_object = parse_object(old_sha1);
539 new_object = parse_object(new_sha1);
540
541 if (!old_object || !new_object ||
542 old_object->type != OBJ_COMMIT ||
543 new_object->type != OBJ_COMMIT) {
544 error("bad sha1 objects for %s", name);
545 return "bad ref";
546 }
547 old_commit = (struct commit *)old_object;
548 new_commit = (struct commit *)new_object;
549 if (!in_merge_bases(old_commit, new_commit)) {
550 rp_error("denying non-fast-forward %s"
551 " (you should pull first)", name);
552 return "non-fast-forward";
553 }
554 }
555 if (run_update_hook(cmd)) {
556 rp_error("hook declined to update %s", name);
557 return "hook declined";
558 }
559
560 if (is_null_sha1(new_sha1)) {
561 if (!parse_object(old_sha1)) {
562 old_sha1 = NULL;
563 if (ref_exists(name)) {
564 rp_warning("Allowing deletion of corrupt ref.");
565 } else {
566 rp_warning("Deleting a non-existent ref.");
567 cmd->did_not_exist = 1;
568 }
569 }
570 if (delete_ref(namespaced_name, old_sha1, 0)) {
571 rp_error("failed to delete %s", name);
572 return "failed to delete";
573 }
574 return NULL; /* good */
575 }
576 else {
577 if (shallow_update && si->shallow_ref[cmd->index] &&
578 update_shallow_ref(cmd, si))
579 return "shallow error";
580
581 lock = lock_any_ref_for_update(namespaced_name, old_sha1,
582 0, NULL);
583 if (!lock) {
584 rp_error("failed to lock %s", name);
585 return "failed to lock";
586 }
587 if (write_ref_sha1(lock, new_sha1, "push")) {
588 return "failed to write"; /* error() already called */
589 }
590 return NULL; /* good */
591 }
592}
593
594static void run_update_post_hook(struct command *commands)
595{
596 struct command *cmd;
597 int argc;
598 const char **argv;
599 struct child_process proc = CHILD_PROCESS_INIT;
600 char *hook;
601
602 hook = find_hook("post-update");
603 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
604 if (cmd->error_string || cmd->did_not_exist)
605 continue;
606 argc++;
607 }
608 if (!argc || !hook)
609 return;
610
611 argv = xmalloc(sizeof(*argv) * (2 + argc));
612 argv[0] = hook;
613
614 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
615 if (cmd->error_string || cmd->did_not_exist)
616 continue;
617 argv[argc] = xstrdup(cmd->ref_name);
618 argc++;
619 }
620 argv[argc] = NULL;
621
622 proc.no_stdin = 1;
623 proc.stdout_to_stderr = 1;
624 proc.err = use_sideband ? -1 : 0;
625 proc.argv = argv;
626
627 if (!start_command(&proc)) {
628 if (use_sideband)
629 copy_to_sideband(proc.err, -1, NULL);
630 finish_command(&proc);
631 }
632}
633
634static void check_aliased_update(struct command *cmd, struct string_list *list)
635{
636 struct strbuf buf = STRBUF_INIT;
637 const char *dst_name;
638 struct string_list_item *item;
639 struct command *dst_cmd;
640 unsigned char sha1[20];
641 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
642 int flag;
643
644 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
645 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
646 strbuf_release(&buf);
647
648 if (!(flag & REF_ISSYMREF))
649 return;
650
651 dst_name = strip_namespace(dst_name);
652 if (!dst_name) {
653 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
654 cmd->skip_update = 1;
655 cmd->error_string = "broken symref";
656 return;
657 }
658
659 if ((item = string_list_lookup(list, dst_name)) == NULL)
660 return;
661
662 cmd->skip_update = 1;
663
664 dst_cmd = (struct command *) item->util;
665
666 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
667 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
668 return;
669
670 dst_cmd->skip_update = 1;
671
672 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
673 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
674 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
675 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
676 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
677 " its target '%s' (%s..%s)",
678 cmd->ref_name, cmd_oldh, cmd_newh,
679 dst_cmd->ref_name, dst_oldh, dst_newh);
680
681 cmd->error_string = dst_cmd->error_string =
682 "inconsistent aliased update";
683}
684
685static void check_aliased_updates(struct command *commands)
686{
687 struct command *cmd;
688 struct string_list ref_list = STRING_LIST_INIT_NODUP;
689
690 for (cmd = commands; cmd; cmd = cmd->next) {
691 struct string_list_item *item =
692 string_list_append(&ref_list, cmd->ref_name);
693 item->util = (void *)cmd;
694 }
695 sort_string_list(&ref_list);
696
697 for (cmd = commands; cmd; cmd = cmd->next) {
698 if (!cmd->error_string)
699 check_aliased_update(cmd, &ref_list);
700 }
701
702 string_list_clear(&ref_list, 0);
703}
704
705static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
706{
707 struct command **cmd_list = cb_data;
708 struct command *cmd = *cmd_list;
709
710 if (!cmd || is_null_sha1(cmd->new_sha1))
711 return -1; /* end of list */
712 *cmd_list = NULL; /* this returns only one */
713 hashcpy(sha1, cmd->new_sha1);
714 return 0;
715}
716
717static void set_connectivity_errors(struct command *commands,
718 struct shallow_info *si)
719{
720 struct command *cmd;
721
722 for (cmd = commands; cmd; cmd = cmd->next) {
723 struct command *singleton = cmd;
724 if (shallow_update && si->shallow_ref[cmd->index])
725 /* to be checked in update_shallow_ref() */
726 continue;
727 if (!check_everything_connected(command_singleton_iterator,
728 0, &singleton))
729 continue;
730 cmd->error_string = "missing necessary objects";
731 }
732}
733
734struct iterate_data {
735 struct command *cmds;
736 struct shallow_info *si;
737};
738
739static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
740{
741 struct iterate_data *data = cb_data;
742 struct command **cmd_list = &data->cmds;
743 struct command *cmd = *cmd_list;
744
745 for (; cmd; cmd = cmd->next) {
746 if (shallow_update && data->si->shallow_ref[cmd->index])
747 /* to be checked in update_shallow_ref() */
748 continue;
749 if (!is_null_sha1(cmd->new_sha1) && !cmd->skip_update) {
750 hashcpy(sha1, cmd->new_sha1);
751 *cmd_list = cmd->next;
752 return 0;
753 }
754 }
755 *cmd_list = NULL;
756 return -1; /* end of list */
757}
758
759static void reject_updates_to_hidden(struct command *commands)
760{
761 struct command *cmd;
762
763 for (cmd = commands; cmd; cmd = cmd->next) {
764 if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
765 continue;
766 if (is_null_sha1(cmd->new_sha1))
767 cmd->error_string = "deny deleting a hidden ref";
768 else
769 cmd->error_string = "deny updating a hidden ref";
770 }
771}
772
773static void execute_commands(struct command *commands,
774 const char *unpacker_error,
775 struct shallow_info *si)
776{
777 int checked_connectivity;
778 struct command *cmd;
779 unsigned char sha1[20];
780 struct iterate_data data;
781
782 if (unpacker_error) {
783 for (cmd = commands; cmd; cmd = cmd->next)
784 cmd->error_string = "unpacker error";
785 return;
786 }
787
788 data.cmds = commands;
789 data.si = si;
790 if (check_everything_connected(iterate_receive_command_list, 0, &data))
791 set_connectivity_errors(commands, si);
792
793 reject_updates_to_hidden(commands);
794
795 if (run_receive_hook(commands, "pre-receive", 0)) {
796 for (cmd = commands; cmd; cmd = cmd->next) {
797 if (!cmd->error_string)
798 cmd->error_string = "pre-receive hook declined";
799 }
800 return;
801 }
802
803 check_aliased_updates(commands);
804
805 free(head_name_to_free);
806 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
807
808 checked_connectivity = 1;
809 for (cmd = commands; cmd; cmd = cmd->next) {
810 if (cmd->error_string)
811 continue;
812
813 if (cmd->skip_update)
814 continue;
815
816 cmd->error_string = update(cmd, si);
817 if (shallow_update && !cmd->error_string &&
818 si->shallow_ref[cmd->index]) {
819 error("BUG: connectivity check has not been run on ref %s",
820 cmd->ref_name);
821 checked_connectivity = 0;
822 }
823 }
824
825 if (shallow_update && !checked_connectivity)
826 error("BUG: run 'git fsck' for safety.\n"
827 "If there are errors, try to remove "
828 "the reported refs above");
829}
830
831static struct command *read_head_info(struct sha1_array *shallow)
832{
833 struct command *commands = NULL;
834 struct command **p = &commands;
835 for (;;) {
836 char *line;
837 unsigned char old_sha1[20], new_sha1[20];
838 struct command *cmd;
839 char *refname;
840 int len, reflen;
841
842 line = packet_read_line(0, &len);
843 if (!line)
844 break;
845
846 if (len == 48 && starts_with(line, "shallow ")) {
847 if (get_sha1_hex(line + 8, old_sha1))
848 die("protocol error: expected shallow sha, got '%s'", line + 8);
849 sha1_array_append(shallow, old_sha1);
850 continue;
851 }
852
853 if (len < 83 ||
854 line[40] != ' ' ||
855 line[81] != ' ' ||
856 get_sha1_hex(line, old_sha1) ||
857 get_sha1_hex(line + 41, new_sha1))
858 die("protocol error: expected old/new/ref, got '%s'",
859 line);
860
861 refname = line + 82;
862 reflen = strlen(refname);
863 if (reflen + 82 < len) {
864 const char *feature_list = refname + reflen + 1;
865 if (parse_feature_request(feature_list, "report-status"))
866 report_status = 1;
867 if (parse_feature_request(feature_list, "side-band-64k"))
868 use_sideband = LARGE_PACKET_MAX;
869 if (parse_feature_request(feature_list, "quiet"))
870 quiet = 1;
871 }
872 cmd = xcalloc(1, sizeof(struct command) + len - 80);
873 hashcpy(cmd->old_sha1, old_sha1);
874 hashcpy(cmd->new_sha1, new_sha1);
875 memcpy(cmd->ref_name, line + 82, len - 81);
876 *p = cmd;
877 p = &cmd->next;
878 }
879 return commands;
880}
881
882static const char *parse_pack_header(struct pack_header *hdr)
883{
884 switch (read_pack_header(0, hdr)) {
885 case PH_ERROR_EOF:
886 return "eof before pack header was fully read";
887
888 case PH_ERROR_PACK_SIGNATURE:
889 return "protocol error (pack signature mismatch detected)";
890
891 case PH_ERROR_PROTOCOL:
892 return "protocol error (pack version unsupported)";
893
894 default:
895 return "unknown error in parse_pack_header";
896
897 case 0:
898 return NULL;
899 }
900}
901
902static const char *pack_lockfile;
903
904static const char *unpack(int err_fd, struct shallow_info *si)
905{
906 struct pack_header hdr;
907 struct argv_array av = ARGV_ARRAY_INIT;
908 const char *hdr_err;
909 int status;
910 char hdr_arg[38];
911 struct child_process child = CHILD_PROCESS_INIT;
912 int fsck_objects = (receive_fsck_objects >= 0
913 ? receive_fsck_objects
914 : transfer_fsck_objects >= 0
915 ? transfer_fsck_objects
916 : 0);
917
918 hdr_err = parse_pack_header(&hdr);
919 if (hdr_err) {
920 if (err_fd > 0)
921 close(err_fd);
922 return hdr_err;
923 }
924 snprintf(hdr_arg, sizeof(hdr_arg),
925 "--pack_header=%"PRIu32",%"PRIu32,
926 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
927
928 if (si->nr_ours || si->nr_theirs) {
929 alt_shallow_file = setup_temporary_shallow(si->shallow);
930 argv_array_pushl(&av, "--shallow-file", alt_shallow_file, NULL);
931 }
932
933 if (ntohl(hdr.hdr_entries) < unpack_limit) {
934 argv_array_pushl(&av, "unpack-objects", hdr_arg, NULL);
935 if (quiet)
936 argv_array_push(&av, "-q");
937 if (fsck_objects)
938 argv_array_push(&av, "--strict");
939 child.argv = av.argv;
940 child.no_stdout = 1;
941 child.err = err_fd;
942 child.git_cmd = 1;
943 status = run_command(&child);
944 if (status)
945 return "unpack-objects abnormal exit";
946 } else {
947 int s;
948 char keep_arg[256];
949
950 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
951 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
952 strcpy(keep_arg + s, "localhost");
953
954 argv_array_pushl(&av, "index-pack",
955 "--stdin", hdr_arg, keep_arg, NULL);
956 if (fsck_objects)
957 argv_array_push(&av, "--strict");
958 if (fix_thin)
959 argv_array_push(&av, "--fix-thin");
960 child.argv = av.argv;
961 child.out = -1;
962 child.err = err_fd;
963 child.git_cmd = 1;
964 status = start_command(&child);
965 if (status)
966 return "index-pack fork failed";
967 pack_lockfile = index_pack_lockfile(child.out);
968 close(child.out);
969 status = finish_command(&child);
970 if (status)
971 return "index-pack abnormal exit";
972 reprepare_packed_git();
973 }
974 return NULL;
975}
976
977static const char *unpack_with_sideband(struct shallow_info *si)
978{
979 struct async muxer;
980 const char *ret;
981
982 if (!use_sideband)
983 return unpack(0, si);
984
985 memset(&muxer, 0, sizeof(muxer));
986 muxer.proc = copy_to_sideband;
987 muxer.in = -1;
988 if (start_async(&muxer))
989 return NULL;
990
991 ret = unpack(muxer.in, si);
992
993 finish_async(&muxer);
994 return ret;
995}
996
997static void prepare_shallow_update(struct command *commands,
998 struct shallow_info *si)
999{
1000 int i, j, k, bitmap_size = (si->ref->nr + 31) / 32;
1001
1002 si->used_shallow = xmalloc(sizeof(*si->used_shallow) *
1003 si->shallow->nr);
1004 assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
1005
1006 si->need_reachability_test =
1007 xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
1008 si->reachable =
1009 xcalloc(si->shallow->nr, sizeof(*si->reachable));
1010 si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
1011
1012 for (i = 0; i < si->nr_ours; i++)
1013 si->need_reachability_test[si->ours[i]] = 1;
1014
1015 for (i = 0; i < si->shallow->nr; i++) {
1016 if (!si->used_shallow[i])
1017 continue;
1018 for (j = 0; j < bitmap_size; j++) {
1019 if (!si->used_shallow[i][j])
1020 continue;
1021 si->need_reachability_test[i]++;
1022 for (k = 0; k < 32; k++)
1023 if (si->used_shallow[i][j] & (1 << k))
1024 si->shallow_ref[j * 32 + k]++;
1025 }
1026
1027 /*
1028 * true for those associated with some refs and belong
1029 * in "ours" list aka "step 7 not done yet"
1030 */
1031 si->need_reachability_test[i] =
1032 si->need_reachability_test[i] > 1;
1033 }
1034
1035 /*
1036 * keep hooks happy by forcing a temporary shallow file via
1037 * env variable because we can't add --shallow-file to every
1038 * command. check_everything_connected() will be done with
1039 * true .git/shallow though.
1040 */
1041 setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
1042}
1043
1044static void update_shallow_info(struct command *commands,
1045 struct shallow_info *si,
1046 struct sha1_array *ref)
1047{
1048 struct command *cmd;
1049 int *ref_status;
1050 remove_nonexistent_theirs_shallow(si);
1051 if (!si->nr_ours && !si->nr_theirs) {
1052 shallow_update = 0;
1053 return;
1054 }
1055
1056 for (cmd = commands; cmd; cmd = cmd->next) {
1057 if (is_null_sha1(cmd->new_sha1))
1058 continue;
1059 sha1_array_append(ref, cmd->new_sha1);
1060 cmd->index = ref->nr - 1;
1061 }
1062 si->ref = ref;
1063
1064 if (shallow_update) {
1065 prepare_shallow_update(commands, si);
1066 return;
1067 }
1068
1069 ref_status = xmalloc(sizeof(*ref_status) * ref->nr);
1070 assign_shallow_commits_to_refs(si, NULL, ref_status);
1071 for (cmd = commands; cmd; cmd = cmd->next) {
1072 if (is_null_sha1(cmd->new_sha1))
1073 continue;
1074 if (ref_status[cmd->index]) {
1075 cmd->error_string = "shallow update not allowed";
1076 cmd->skip_update = 1;
1077 }
1078 }
1079 free(ref_status);
1080}
1081
1082static void report(struct command *commands, const char *unpack_status)
1083{
1084 struct command *cmd;
1085 struct strbuf buf = STRBUF_INIT;
1086
1087 packet_buf_write(&buf, "unpack %s\n",
1088 unpack_status ? unpack_status : "ok");
1089 for (cmd = commands; cmd; cmd = cmd->next) {
1090 if (!cmd->error_string)
1091 packet_buf_write(&buf, "ok %s\n",
1092 cmd->ref_name);
1093 else
1094 packet_buf_write(&buf, "ng %s %s\n",
1095 cmd->ref_name, cmd->error_string);
1096 }
1097 packet_buf_flush(&buf);
1098
1099 if (use_sideband)
1100 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
1101 else
1102 write_or_die(1, buf.buf, buf.len);
1103 strbuf_release(&buf);
1104}
1105
1106static int delete_only(struct command *commands)
1107{
1108 struct command *cmd;
1109 for (cmd = commands; cmd; cmd = cmd->next) {
1110 if (!is_null_sha1(cmd->new_sha1))
1111 return 0;
1112 }
1113 return 1;
1114}
1115
1116int cmd_receive_pack(int argc, const char **argv, const char *prefix)
1117{
1118 int advertise_refs = 0;
1119 int stateless_rpc = 0;
1120 int i;
1121 const char *dir = NULL;
1122 struct command *commands;
1123 struct sha1_array shallow = SHA1_ARRAY_INIT;
1124 struct sha1_array ref = SHA1_ARRAY_INIT;
1125 struct shallow_info si;
1126
1127 packet_trace_identity("receive-pack");
1128
1129 argv++;
1130 for (i = 1; i < argc; i++) {
1131 const char *arg = *argv++;
1132
1133 if (*arg == '-') {
1134 if (!strcmp(arg, "--quiet")) {
1135 quiet = 1;
1136 continue;
1137 }
1138
1139 if (!strcmp(arg, "--advertise-refs")) {
1140 advertise_refs = 1;
1141 continue;
1142 }
1143 if (!strcmp(arg, "--stateless-rpc")) {
1144 stateless_rpc = 1;
1145 continue;
1146 }
1147 if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
1148 fix_thin = 0;
1149 continue;
1150 }
1151
1152 usage(receive_pack_usage);
1153 }
1154 if (dir)
1155 usage(receive_pack_usage);
1156 dir = arg;
1157 }
1158 if (!dir)
1159 usage(receive_pack_usage);
1160
1161 setup_path();
1162
1163 if (!enter_repo(dir, 0))
1164 die("'%s' does not appear to be a git repository", dir);
1165
1166 git_config(receive_pack_config, NULL);
1167
1168 if (0 <= transfer_unpack_limit)
1169 unpack_limit = transfer_unpack_limit;
1170 else if (0 <= receive_unpack_limit)
1171 unpack_limit = receive_unpack_limit;
1172
1173 if (advertise_refs || !stateless_rpc) {
1174 write_head_info();
1175 }
1176 if (advertise_refs)
1177 return 0;
1178
1179 if ((commands = read_head_info(&shallow)) != NULL) {
1180 const char *unpack_status = NULL;
1181
1182 prepare_shallow_info(&si, &shallow);
1183 if (!si.nr_ours && !si.nr_theirs)
1184 shallow_update = 0;
1185 if (!delete_only(commands)) {
1186 unpack_status = unpack_with_sideband(&si);
1187 update_shallow_info(commands, &si, &ref);
1188 }
1189 execute_commands(commands, unpack_status, &si);
1190 if (pack_lockfile)
1191 unlink_or_warn(pack_lockfile);
1192 if (report_status)
1193 report(commands, unpack_status);
1194 run_receive_hook(commands, "post-receive", 1);
1195 run_update_post_hook(commands);
1196 if (auto_gc) {
1197 const char *argv_gc_auto[] = {
1198 "gc", "--auto", "--quiet", NULL,
1199 };
1200 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1201 run_command_v_opt(argv_gc_auto, opt);
1202 }
1203 if (auto_update_server_info)
1204 update_server_info(0);
1205 clear_shallow_info(&si);
1206 }
1207 if (use_sideband)
1208 packet_flush(1);
1209 sha1_array_clear(&shallow);
1210 sha1_array_clear(&ref);
1211 return 0;
1212}