6 #include "run-command.h"
12 #include "transport.h"
13 #include "string-list.h"
14 #include "sha1-array.h"
15 #include "connected.h"
16 #include "argv-array.h"
19 static const char receive_pack_usage[] = "git receive-pack <git-dir>";
28 static int deny_deletes;
29 static int deny_non_fast_forwards;
30 static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
31 static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
32 static int receive_fsck_objects = -1;
33 static int transfer_fsck_objects = -1;
34 static int receive_unpack_limit = -1;
35 static int transfer_unpack_limit = -1;
36 static int unpack_limit = 100;
37 static int report_status;
38 static int use_sideband;
40 static int prefer_ofs_delta = 1;
41 static int auto_update_server_info;
42 static int auto_gc = 1;
43 static int fix_thin = 1;
44 static const char *head_name;
45 static void *head_name_to_free;
46 static int sent_capabilities;
47 static int shallow_update;
48 static const char *alt_shallow_file;
49 static int accept_push_cert = 1;
50 static struct strbuf push_cert = STRBUF_INIT;
51 static unsigned char push_cert_sha1[20];
53 static enum deny_action parse_deny_action(const char *var, const char *value)
56 if (!strcasecmp(value, "ignore"))
58 if (!strcasecmp(value, "warn"))
60 if (!strcasecmp(value, "refuse"))
63 if (git_config_bool(var, value))
68 static int receive_pack_config(const char *var, const char *value, void *cb)
70 int status = parse_hide_refs_config(var, value, "receive");
75 if (strcmp(var, "receive.denydeletes") == 0) {
76 deny_deletes = git_config_bool(var, value);
80 if (strcmp(var, "receive.denynonfastforwards") == 0) {
81 deny_non_fast_forwards = git_config_bool(var, value);
85 if (strcmp(var, "receive.unpacklimit") == 0) {
86 receive_unpack_limit = git_config_int(var, value);
90 if (strcmp(var, "transfer.unpacklimit") == 0) {
91 transfer_unpack_limit = git_config_int(var, value);
95 if (strcmp(var, "receive.fsckobjects") == 0) {
96 receive_fsck_objects = git_config_bool(var, value);
100 if (strcmp(var, "transfer.fsckobjects") == 0) {
101 transfer_fsck_objects = git_config_bool(var, value);
105 if (!strcmp(var, "receive.denycurrentbranch")) {
106 deny_current_branch = parse_deny_action(var, value);
110 if (strcmp(var, "receive.denydeletecurrent") == 0) {
111 deny_delete_current = parse_deny_action(var, value);
115 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
116 prefer_ofs_delta = git_config_bool(var, value);
120 if (strcmp(var, "receive.updateserverinfo") == 0) {
121 auto_update_server_info = git_config_bool(var, value);
125 if (strcmp(var, "receive.autogc") == 0) {
126 auto_gc = git_config_bool(var, value);
130 if (strcmp(var, "receive.shallowupdate") == 0) {
131 shallow_update = git_config_bool(var, value);
135 if (strcmp(var, "receive.acceptpushcert") == 0) {
136 accept_push_cert = git_config_bool(var, value);
140 return git_default_config(var, value, cb);
143 static void show_ref(const char *path, const unsigned char *sha1)
145 if (ref_is_hidden(path))
148 if (sent_capabilities) {
149 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
151 struct strbuf cap = STRBUF_INIT;
154 "report-status delete-refs side-band-64k quiet");
155 if (prefer_ofs_delta)
156 strbuf_addstr(&cap, " ofs-delta");
157 if (accept_push_cert)
158 strbuf_addstr(&cap, " push-cert");
159 strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
160 packet_write(1, "%s %s%c%s\n",
161 sha1_to_hex(sha1), path, 0, cap.buf);
162 strbuf_release(&cap);
163 sent_capabilities = 1;
167 static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
169 path = strip_namespace(path);
171 * Advertise refs outside our current namespace as ".have"
172 * refs, so that the client can use them to minimize data
173 * transfer but will otherwise ignore them. This happens to
174 * cover ".have" that are thrown in by add_one_alternate_ref()
175 * to mark histories that are complete in our alternates as
180 show_ref(path, sha1);
184 static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
186 show_ref(".have", sha1);
189 static void collect_one_alternate_ref(const struct ref *ref, void *data)
191 struct sha1_array *sa = data;
192 sha1_array_append(sa, ref->old_sha1);
195 static void write_head_info(void)
197 struct sha1_array sa = SHA1_ARRAY_INIT;
198 for_each_alternate_ref(collect_one_alternate_ref, &sa);
199 sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
200 sha1_array_clear(&sa);
201 for_each_ref(show_ref_cb, NULL);
202 if (!sent_capabilities)
203 show_ref("capabilities^{}", null_sha1);
205 advertise_shallow_grafts(1);
212 struct command *next;
213 const char *error_string;
214 unsigned int skip_update:1,
217 unsigned char old_sha1[20];
218 unsigned char new_sha1[20];
219 char ref_name[FLEX_ARRAY]; /* more */
222 static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
223 static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
225 static void report_message(const char *prefix, const char *err, va_list params)
227 int sz = strlen(prefix);
230 strncpy(msg, prefix, sz);
231 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
232 if (sz > (sizeof(msg) - 1))
233 sz = sizeof(msg) - 1;
237 send_sideband(1, 2, msg, sz, use_sideband);
242 static void rp_warning(const char *err, ...)
245 va_start(params, err);
246 report_message("warning: ", err, params);
250 static void rp_error(const char *err, ...)
253 va_start(params, err);
254 report_message("error: ", err, params);
258 static int copy_to_sideband(int in, int out, void *arg)
262 ssize_t sz = xread(in, data, sizeof(data));
265 send_sideband(1, 2, data, sz, use_sideband);
271 static void prepare_push_cert_sha1(struct child_process *proc)
273 static int already_done;
274 struct argv_array env = ARGV_ARRAY_INIT;
281 if (write_sha1_file(push_cert.buf, push_cert.len, "blob", push_cert_sha1))
282 hashclr(push_cert_sha1);
284 if (!is_null_sha1(push_cert_sha1)) {
285 argv_array_pushf(&env, "GIT_PUSH_CERT=%s", sha1_to_hex(push_cert_sha1));
286 proc->env = env.argv;
290 typedef int (*feed_fn)(void *, const char **, size_t *);
291 static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
293 struct child_process proc;
298 argv[0] = find_hook(hook_name);
304 memset(&proc, 0, sizeof(proc));
307 proc.stdout_to_stderr = 1;
309 prepare_push_cert_sha1(&proc);
312 memset(&muxer, 0, sizeof(muxer));
313 muxer.proc = copy_to_sideband;
315 code = start_async(&muxer);
321 code = start_command(&proc);
324 finish_async(&muxer);
331 if (feed(feed_state, &buf, &n))
333 if (write_in_full(proc.in, buf, n) != n)
338 finish_async(&muxer);
339 return finish_command(&proc);
342 struct receive_hook_feed_state {
348 static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
350 struct receive_hook_feed_state *state = state_;
351 struct command *cmd = state->cmd;
354 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
358 strbuf_reset(&state->buf);
359 strbuf_addf(&state->buf, "%s %s %s\n",
360 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
362 state->cmd = cmd->next;
364 *bufp = state->buf.buf;
365 *sizep = state->buf.len;
370 static int run_receive_hook(struct command *commands, const char *hook_name,
373 struct receive_hook_feed_state state;
376 strbuf_init(&state.buf, 0);
377 state.cmd = commands;
378 state.skip_broken = skip_broken;
379 if (feed_receive_hook(&state, NULL, NULL))
381 state.cmd = commands;
382 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
383 strbuf_release(&state.buf);
387 static int run_update_hook(struct command *cmd)
390 struct child_process proc;
393 argv[0] = find_hook("update");
397 argv[1] = cmd->ref_name;
398 argv[2] = sha1_to_hex(cmd->old_sha1);
399 argv[3] = sha1_to_hex(cmd->new_sha1);
402 memset(&proc, 0, sizeof(proc));
404 proc.stdout_to_stderr = 1;
405 proc.err = use_sideband ? -1 : 0;
408 code = start_command(&proc);
412 copy_to_sideband(proc.err, -1, NULL);
413 return finish_command(&proc);
416 static int is_ref_checked_out(const char *ref)
418 if (is_bare_repository())
423 return !strcmp(head_name, ref);
426 static char *refuse_unconfigured_deny_msg[] = {
427 "By default, updating the current branch in a non-bare repository",
428 "is denied, because it will make the index and work tree inconsistent",
429 "with what you pushed, and will require 'git reset --hard' to match",
430 "the work tree to HEAD.",
432 "You can set 'receive.denyCurrentBranch' configuration variable to",
433 "'ignore' or 'warn' in the remote repository to allow pushing into",
434 "its current branch; however, this is not recommended unless you",
435 "arranged to update its work tree to match what you pushed in some",
438 "To squelch this message and still keep the default behaviour, set",
439 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
442 static void refuse_unconfigured_deny(void)
445 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
446 rp_error("%s", refuse_unconfigured_deny_msg[i]);
449 static char *refuse_unconfigured_deny_delete_current_msg[] = {
450 "By default, deleting the current branch is denied, because the next",
451 "'git clone' won't result in any file checked out, causing confusion.",
453 "You can set 'receive.denyDeleteCurrent' configuration variable to",
454 "'warn' or 'ignore' in the remote repository to allow deleting the",
455 "current branch, with or without a warning message.",
457 "To squelch this message, you can set it to 'refuse'."
460 static void refuse_unconfigured_deny_delete_current(void)
464 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
466 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
469 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]);
470 static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
472 static struct lock_file shallow_lock;
473 struct sha1_array extra = SHA1_ARRAY_INIT;
474 const char *alt_file;
475 uint32_t mask = 1 << (cmd->index % 32);
478 trace_printf_key(&trace_shallow,
479 "shallow: update_shallow_ref %s\n", cmd->ref_name);
480 for (i = 0; i < si->shallow->nr; i++)
481 if (si->used_shallow[i] &&
482 (si->used_shallow[i][cmd->index / 32] & mask) &&
483 !delayed_reachability_test(si, i))
484 sha1_array_append(&extra, si->shallow->sha1[i]);
486 setup_alternate_shallow(&shallow_lock, &alt_file, &extra);
487 if (check_shallow_connected(command_singleton_iterator,
489 rollback_lock_file(&shallow_lock);
490 sha1_array_clear(&extra);
494 commit_lock_file(&shallow_lock);
497 * Make sure setup_alternate_shallow() for the next ref does
498 * not lose these new roots..
500 for (i = 0; i < extra.nr; i++)
501 register_shallow(extra.sha1[i]);
503 si->shallow_ref[cmd->index] = 0;
504 sha1_array_clear(&extra);
508 static const char *update(struct command *cmd, struct shallow_info *si)
510 const char *name = cmd->ref_name;
511 struct strbuf namespaced_name_buf = STRBUF_INIT;
512 const char *namespaced_name;
513 unsigned char *old_sha1 = cmd->old_sha1;
514 unsigned char *new_sha1 = cmd->new_sha1;
515 struct ref_lock *lock;
517 /* only refs/... are allowed */
518 if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
519 rp_error("refusing to create funny ref '%s' remotely", name);
520 return "funny refname";
523 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
524 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
526 if (is_ref_checked_out(namespaced_name)) {
527 switch (deny_current_branch) {
531 rp_warning("updating the current branch");
534 case DENY_UNCONFIGURED:
535 rp_error("refusing to update checked out branch: %s", name);
536 if (deny_current_branch == DENY_UNCONFIGURED)
537 refuse_unconfigured_deny();
538 return "branch is currently checked out";
542 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
543 error("unpack should have generated %s, "
544 "but I can't find it!", sha1_to_hex(new_sha1));
548 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
549 if (deny_deletes && starts_with(name, "refs/heads/")) {
550 rp_error("denying ref deletion for %s", name);
551 return "deletion prohibited";
554 if (!strcmp(namespaced_name, head_name)) {
555 switch (deny_delete_current) {
559 rp_warning("deleting the current branch");
562 case DENY_UNCONFIGURED:
563 if (deny_delete_current == DENY_UNCONFIGURED)
564 refuse_unconfigured_deny_delete_current();
565 rp_error("refusing to delete the current branch: %s", name);
566 return "deletion of the current branch prohibited";
571 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
572 !is_null_sha1(old_sha1) &&
573 starts_with(name, "refs/heads/")) {
574 struct object *old_object, *new_object;
575 struct commit *old_commit, *new_commit;
577 old_object = parse_object(old_sha1);
578 new_object = parse_object(new_sha1);
580 if (!old_object || !new_object ||
581 old_object->type != OBJ_COMMIT ||
582 new_object->type != OBJ_COMMIT) {
583 error("bad sha1 objects for %s", name);
586 old_commit = (struct commit *)old_object;
587 new_commit = (struct commit *)new_object;
588 if (!in_merge_bases(old_commit, new_commit)) {
589 rp_error("denying non-fast-forward %s"
590 " (you should pull first)", name);
591 return "non-fast-forward";
594 if (run_update_hook(cmd)) {
595 rp_error("hook declined to update %s", name);
596 return "hook declined";
599 if (is_null_sha1(new_sha1)) {
600 if (!parse_object(old_sha1)) {
602 if (ref_exists(name)) {
603 rp_warning("Allowing deletion of corrupt ref.");
605 rp_warning("Deleting a non-existent ref.");
606 cmd->did_not_exist = 1;
609 if (delete_ref(namespaced_name, old_sha1, 0)) {
610 rp_error("failed to delete %s", name);
611 return "failed to delete";
613 return NULL; /* good */
616 if (shallow_update && si->shallow_ref[cmd->index] &&
617 update_shallow_ref(cmd, si))
618 return "shallow error";
620 lock = lock_any_ref_for_update(namespaced_name, old_sha1,
623 rp_error("failed to lock %s", name);
624 return "failed to lock";
626 if (write_ref_sha1(lock, new_sha1, "push")) {
627 return "failed to write"; /* error() already called */
629 return NULL; /* good */
633 static void run_update_post_hook(struct command *commands)
638 struct child_process proc;
641 hook = find_hook("post-update");
642 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
643 if (cmd->error_string || cmd->did_not_exist)
650 argv = xmalloc(sizeof(*argv) * (2 + argc));
653 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
654 if (cmd->error_string || cmd->did_not_exist)
656 argv[argc] = xstrdup(cmd->ref_name);
661 memset(&proc, 0, sizeof(proc));
663 proc.stdout_to_stderr = 1;
664 proc.err = use_sideband ? -1 : 0;
667 if (!start_command(&proc)) {
669 copy_to_sideband(proc.err, -1, NULL);
670 finish_command(&proc);
674 static void check_aliased_update(struct command *cmd, struct string_list *list)
676 struct strbuf buf = STRBUF_INIT;
677 const char *dst_name;
678 struct string_list_item *item;
679 struct command *dst_cmd;
680 unsigned char sha1[20];
681 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
684 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
685 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
686 strbuf_release(&buf);
688 if (!(flag & REF_ISSYMREF))
691 dst_name = strip_namespace(dst_name);
693 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
694 cmd->skip_update = 1;
695 cmd->error_string = "broken symref";
699 if ((item = string_list_lookup(list, dst_name)) == NULL)
702 cmd->skip_update = 1;
704 dst_cmd = (struct command *) item->util;
706 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
707 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
710 dst_cmd->skip_update = 1;
712 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
713 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
714 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
715 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
716 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
717 " its target '%s' (%s..%s)",
718 cmd->ref_name, cmd_oldh, cmd_newh,
719 dst_cmd->ref_name, dst_oldh, dst_newh);
721 cmd->error_string = dst_cmd->error_string =
722 "inconsistent aliased update";
725 static void check_aliased_updates(struct command *commands)
728 struct string_list ref_list = STRING_LIST_INIT_NODUP;
730 for (cmd = commands; cmd; cmd = cmd->next) {
731 struct string_list_item *item =
732 string_list_append(&ref_list, cmd->ref_name);
733 item->util = (void *)cmd;
735 sort_string_list(&ref_list);
737 for (cmd = commands; cmd; cmd = cmd->next) {
738 if (!cmd->error_string)
739 check_aliased_update(cmd, &ref_list);
742 string_list_clear(&ref_list, 0);
745 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
747 struct command **cmd_list = cb_data;
748 struct command *cmd = *cmd_list;
750 if (!cmd || is_null_sha1(cmd->new_sha1))
751 return -1; /* end of list */
752 *cmd_list = NULL; /* this returns only one */
753 hashcpy(sha1, cmd->new_sha1);
757 static void set_connectivity_errors(struct command *commands,
758 struct shallow_info *si)
762 for (cmd = commands; cmd; cmd = cmd->next) {
763 struct command *singleton = cmd;
764 if (shallow_update && si->shallow_ref[cmd->index])
765 /* to be checked in update_shallow_ref() */
767 if (!check_everything_connected(command_singleton_iterator,
770 cmd->error_string = "missing necessary objects";
774 struct iterate_data {
775 struct command *cmds;
776 struct shallow_info *si;
779 static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
781 struct iterate_data *data = cb_data;
782 struct command **cmd_list = &data->cmds;
783 struct command *cmd = *cmd_list;
785 for (; cmd; cmd = cmd->next) {
786 if (shallow_update && data->si->shallow_ref[cmd->index])
787 /* to be checked in update_shallow_ref() */
789 if (!is_null_sha1(cmd->new_sha1) && !cmd->skip_update) {
790 hashcpy(sha1, cmd->new_sha1);
791 *cmd_list = cmd->next;
796 return -1; /* end of list */
799 static void reject_updates_to_hidden(struct command *commands)
803 for (cmd = commands; cmd; cmd = cmd->next) {
804 if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
806 if (is_null_sha1(cmd->new_sha1))
807 cmd->error_string = "deny deleting a hidden ref";
809 cmd->error_string = "deny updating a hidden ref";
813 static void execute_commands(struct command *commands,
814 const char *unpacker_error,
815 struct shallow_info *si)
817 int checked_connectivity;
819 unsigned char sha1[20];
820 struct iterate_data data;
822 if (unpacker_error) {
823 for (cmd = commands; cmd; cmd = cmd->next)
824 cmd->error_string = "unpacker error";
828 data.cmds = commands;
830 if (check_everything_connected(iterate_receive_command_list, 0, &data))
831 set_connectivity_errors(commands, si);
833 reject_updates_to_hidden(commands);
835 if (run_receive_hook(commands, "pre-receive", 0)) {
836 for (cmd = commands; cmd; cmd = cmd->next) {
837 if (!cmd->error_string)
838 cmd->error_string = "pre-receive hook declined";
843 check_aliased_updates(commands);
845 free(head_name_to_free);
846 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
848 checked_connectivity = 1;
849 for (cmd = commands; cmd; cmd = cmd->next) {
850 if (cmd->error_string)
853 if (cmd->skip_update)
856 cmd->error_string = update(cmd, si);
857 if (shallow_update && !cmd->error_string &&
858 si->shallow_ref[cmd->index]) {
859 error("BUG: connectivity check has not been run on ref %s",
861 checked_connectivity = 0;
865 if (shallow_update && !checked_connectivity)
866 error("BUG: run 'git fsck' for safety.\n"
867 "If there are errors, try to remove "
868 "the reported refs above");
871 static struct command **queue_command(struct command **tail,
875 unsigned char old_sha1[20], new_sha1[20];
883 get_sha1_hex(line, old_sha1) ||
884 get_sha1_hex(line + 41, new_sha1))
885 die("protocol error: expected old/new/ref, got '%s'", line);
888 reflen = linelen - 82;
889 cmd = xcalloc(1, sizeof(struct command) + reflen + 1);
890 hashcpy(cmd->old_sha1, old_sha1);
891 hashcpy(cmd->new_sha1, new_sha1);
892 memcpy(cmd->ref_name, refname, reflen);
893 cmd->ref_name[reflen] = '\0';
898 static struct command *read_head_info(struct sha1_array *shallow)
900 struct command *commands = NULL;
901 struct command **p = &commands;
906 line = packet_read_line(0, &len);
910 if (len == 48 && starts_with(line, "shallow ")) {
911 unsigned char sha1[20];
912 if (get_sha1_hex(line + 8, sha1))
913 die("protocol error: expected shallow sha, got '%s'",
915 sha1_array_append(shallow, sha1);
919 linelen = strlen(line);
921 const char *feature_list = line + linelen + 1;
922 if (parse_feature_request(feature_list, "report-status"))
924 if (parse_feature_request(feature_list, "side-band-64k"))
925 use_sideband = LARGE_PACKET_MAX;
926 if (parse_feature_request(feature_list, "quiet"))
930 if (!strcmp(line, "push-cert")) {
935 len = packet_read(0, NULL, NULL,
936 certbuf, sizeof(certbuf), 0);
941 if (!strcmp(certbuf, "push-cert-end\n"))
942 break; /* end of cert */
943 strbuf_addstr(&push_cert, certbuf);
951 p = queue_command(p, line, linelen);
956 static const char *parse_pack_header(struct pack_header *hdr)
958 switch (read_pack_header(0, hdr)) {
960 return "eof before pack header was fully read";
962 case PH_ERROR_PACK_SIGNATURE:
963 return "protocol error (pack signature mismatch detected)";
965 case PH_ERROR_PROTOCOL:
966 return "protocol error (pack version unsupported)";
969 return "unknown error in parse_pack_header";
976 static const char *pack_lockfile;
978 static const char *unpack(int err_fd, struct shallow_info *si)
980 struct pack_header hdr;
981 struct argv_array av = ARGV_ARRAY_INIT;
985 struct child_process child;
986 int fsck_objects = (receive_fsck_objects >= 0
987 ? receive_fsck_objects
988 : transfer_fsck_objects >= 0
989 ? transfer_fsck_objects
992 hdr_err = parse_pack_header(&hdr);
998 snprintf(hdr_arg, sizeof(hdr_arg),
999 "--pack_header=%"PRIu32",%"PRIu32,
1000 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
1002 if (si->nr_ours || si->nr_theirs) {
1003 alt_shallow_file = setup_temporary_shallow(si->shallow);
1004 argv_array_pushl(&av, "--shallow-file", alt_shallow_file, NULL);
1007 memset(&child, 0, sizeof(child));
1008 if (ntohl(hdr.hdr_entries) < unpack_limit) {
1009 argv_array_pushl(&av, "unpack-objects", hdr_arg, NULL);
1011 argv_array_push(&av, "-q");
1013 argv_array_push(&av, "--strict");
1014 child.argv = av.argv;
1015 child.no_stdout = 1;
1018 status = run_command(&child);
1020 return "unpack-objects abnormal exit";
1025 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
1026 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
1027 strcpy(keep_arg + s, "localhost");
1029 argv_array_pushl(&av, "index-pack",
1030 "--stdin", hdr_arg, keep_arg, NULL);
1032 argv_array_push(&av, "--strict");
1034 argv_array_push(&av, "--fix-thin");
1035 child.argv = av.argv;
1039 status = start_command(&child);
1041 return "index-pack fork failed";
1042 pack_lockfile = index_pack_lockfile(child.out);
1044 status = finish_command(&child);
1046 return "index-pack abnormal exit";
1047 reprepare_packed_git();
1052 static const char *unpack_with_sideband(struct shallow_info *si)
1058 return unpack(0, si);
1060 memset(&muxer, 0, sizeof(muxer));
1061 muxer.proc = copy_to_sideband;
1063 if (start_async(&muxer))
1066 ret = unpack(muxer.in, si);
1068 finish_async(&muxer);
1072 static void prepare_shallow_update(struct command *commands,
1073 struct shallow_info *si)
1075 int i, j, k, bitmap_size = (si->ref->nr + 31) / 32;
1077 si->used_shallow = xmalloc(sizeof(*si->used_shallow) *
1079 assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
1081 si->need_reachability_test =
1082 xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
1084 xcalloc(si->shallow->nr, sizeof(*si->reachable));
1085 si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
1087 for (i = 0; i < si->nr_ours; i++)
1088 si->need_reachability_test[si->ours[i]] = 1;
1090 for (i = 0; i < si->shallow->nr; i++) {
1091 if (!si->used_shallow[i])
1093 for (j = 0; j < bitmap_size; j++) {
1094 if (!si->used_shallow[i][j])
1096 si->need_reachability_test[i]++;
1097 for (k = 0; k < 32; k++)
1098 if (si->used_shallow[i][j] & (1 << k))
1099 si->shallow_ref[j * 32 + k]++;
1103 * true for those associated with some refs and belong
1104 * in "ours" list aka "step 7 not done yet"
1106 si->need_reachability_test[i] =
1107 si->need_reachability_test[i] > 1;
1111 * keep hooks happy by forcing a temporary shallow file via
1112 * env variable because we can't add --shallow-file to every
1113 * command. check_everything_connected() will be done with
1114 * true .git/shallow though.
1116 setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
1119 static void update_shallow_info(struct command *commands,
1120 struct shallow_info *si,
1121 struct sha1_array *ref)
1123 struct command *cmd;
1125 remove_nonexistent_theirs_shallow(si);
1126 if (!si->nr_ours && !si->nr_theirs) {
1131 for (cmd = commands; cmd; cmd = cmd->next) {
1132 if (is_null_sha1(cmd->new_sha1))
1134 sha1_array_append(ref, cmd->new_sha1);
1135 cmd->index = ref->nr - 1;
1139 if (shallow_update) {
1140 prepare_shallow_update(commands, si);
1144 ref_status = xmalloc(sizeof(*ref_status) * ref->nr);
1145 assign_shallow_commits_to_refs(si, NULL, ref_status);
1146 for (cmd = commands; cmd; cmd = cmd->next) {
1147 if (is_null_sha1(cmd->new_sha1))
1149 if (ref_status[cmd->index]) {
1150 cmd->error_string = "shallow update not allowed";
1151 cmd->skip_update = 1;
1157 static void report(struct command *commands, const char *unpack_status)
1159 struct command *cmd;
1160 struct strbuf buf = STRBUF_INIT;
1162 packet_buf_write(&buf, "unpack %s\n",
1163 unpack_status ? unpack_status : "ok");
1164 for (cmd = commands; cmd; cmd = cmd->next) {
1165 if (!cmd->error_string)
1166 packet_buf_write(&buf, "ok %s\n",
1169 packet_buf_write(&buf, "ng %s %s\n",
1170 cmd->ref_name, cmd->error_string);
1172 packet_buf_flush(&buf);
1175 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
1177 write_or_die(1, buf.buf, buf.len);
1178 strbuf_release(&buf);
1181 static int delete_only(struct command *commands)
1183 struct command *cmd;
1184 for (cmd = commands; cmd; cmd = cmd->next) {
1185 if (!is_null_sha1(cmd->new_sha1))
1191 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
1193 int advertise_refs = 0;
1194 int stateless_rpc = 0;
1196 const char *dir = NULL;
1197 struct command *commands;
1198 struct sha1_array shallow = SHA1_ARRAY_INIT;
1199 struct sha1_array ref = SHA1_ARRAY_INIT;
1200 struct shallow_info si;
1202 packet_trace_identity("receive-pack");
1205 for (i = 1; i < argc; i++) {
1206 const char *arg = *argv++;
1209 if (!strcmp(arg, "--quiet")) {
1214 if (!strcmp(arg, "--advertise-refs")) {
1218 if (!strcmp(arg, "--stateless-rpc")) {
1222 if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
1227 usage(receive_pack_usage);
1230 usage(receive_pack_usage);
1234 usage(receive_pack_usage);
1238 if (!enter_repo(dir, 0))
1239 die("'%s' does not appear to be a git repository", dir);
1241 git_config(receive_pack_config, NULL);
1243 if (0 <= transfer_unpack_limit)
1244 unpack_limit = transfer_unpack_limit;
1245 else if (0 <= receive_unpack_limit)
1246 unpack_limit = receive_unpack_limit;
1248 if (advertise_refs || !stateless_rpc) {
1254 if ((commands = read_head_info(&shallow)) != NULL) {
1255 const char *unpack_status = NULL;
1257 prepare_shallow_info(&si, &shallow);
1258 if (!si.nr_ours && !si.nr_theirs)
1260 if (!delete_only(commands)) {
1261 unpack_status = unpack_with_sideband(&si);
1262 update_shallow_info(commands, &si, &ref);
1264 execute_commands(commands, unpack_status, &si);
1266 unlink_or_warn(pack_lockfile);
1268 report(commands, unpack_status);
1269 run_receive_hook(commands, "post-receive", 1);
1270 run_update_post_hook(commands);
1272 const char *argv_gc_auto[] = {
1273 "gc", "--auto", "--quiet", NULL,
1275 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1276 run_command_v_opt(argv_gc_auto, opt);
1278 if (auto_update_server_info)
1279 update_server_info(0);
1280 clear_shallow_info(&si);
1284 sha1_array_clear(&shallow);
1285 sha1_array_clear(&ref);