6 #include "run-command.h"
11 #include "transport.h"
12 #include "string-list.h"
13 #include "sha1-array.h"
14 #include "connected.h"
17 static const char receive_pack_usage[] = "git receive-pack <git-dir>";
26 static int deny_deletes;
27 static int deny_non_fast_forwards;
28 static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
29 static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
30 static int receive_fsck_objects = -1;
31 static int transfer_fsck_objects = -1;
32 static int receive_unpack_limit = -1;
33 static int transfer_unpack_limit = -1;
34 static int unpack_limit = 100;
35 static int report_status;
36 static int use_sideband;
38 static int prefer_ofs_delta = 1;
39 static int auto_update_server_info;
40 static int auto_gc = 1;
41 static const char *head_name;
42 static void *head_name_to_free;
43 static int sent_capabilities;
45 static enum deny_action parse_deny_action(const char *var, const char *value)
48 if (!strcasecmp(value, "ignore"))
50 if (!strcasecmp(value, "warn"))
52 if (!strcasecmp(value, "refuse"))
55 if (git_config_bool(var, value))
60 static int receive_pack_config(const char *var, const char *value, void *cb)
62 if (strcmp(var, "receive.denydeletes") == 0) {
63 deny_deletes = git_config_bool(var, value);
67 if (strcmp(var, "receive.denynonfastforwards") == 0) {
68 deny_non_fast_forwards = git_config_bool(var, value);
72 if (strcmp(var, "receive.unpacklimit") == 0) {
73 receive_unpack_limit = git_config_int(var, value);
77 if (strcmp(var, "transfer.unpacklimit") == 0) {
78 transfer_unpack_limit = git_config_int(var, value);
82 if (strcmp(var, "receive.fsckobjects") == 0) {
83 receive_fsck_objects = git_config_bool(var, value);
87 if (strcmp(var, "transfer.fsckobjects") == 0) {
88 transfer_fsck_objects = git_config_bool(var, value);
92 if (!strcmp(var, "receive.denycurrentbranch")) {
93 deny_current_branch = parse_deny_action(var, value);
97 if (strcmp(var, "receive.denydeletecurrent") == 0) {
98 deny_delete_current = parse_deny_action(var, value);
102 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
103 prefer_ofs_delta = git_config_bool(var, value);
107 if (strcmp(var, "receive.updateserverinfo") == 0) {
108 auto_update_server_info = git_config_bool(var, value);
112 if (strcmp(var, "receive.autogc") == 0) {
113 auto_gc = git_config_bool(var, value);
117 return git_default_config(var, value, cb);
120 static void show_ref(const char *path, const unsigned char *sha1)
122 if (sent_capabilities)
123 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
125 packet_write(1, "%s %s%c%s%s agent=%s\n",
126 sha1_to_hex(sha1), path, 0,
127 " report-status delete-refs side-band-64k quiet",
128 prefer_ofs_delta ? " ofs-delta" : "",
129 git_user_agent_sanitized());
130 sent_capabilities = 1;
133 static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
135 path = strip_namespace(path);
137 * Advertise refs outside our current namespace as ".have"
138 * refs, so that the client can use them to minimize data
139 * transfer but will otherwise ignore them. This happens to
140 * cover ".have" that are thrown in by add_one_alternate_ref()
141 * to mark histories that are complete in our alternates as
146 show_ref(path, sha1);
150 static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
152 show_ref(".have", sha1);
155 static void collect_one_alternate_ref(const struct ref *ref, void *data)
157 struct sha1_array *sa = data;
158 sha1_array_append(sa, ref->old_sha1);
161 static void write_head_info(void)
163 struct sha1_array sa = SHA1_ARRAY_INIT;
164 for_each_alternate_ref(collect_one_alternate_ref, &sa);
165 sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
166 sha1_array_clear(&sa);
167 for_each_ref(show_ref_cb, NULL);
168 if (!sent_capabilities)
169 show_ref("capabilities^{}", null_sha1);
176 struct command *next;
177 const char *error_string;
178 unsigned int skip_update:1,
180 unsigned char old_sha1[20];
181 unsigned char new_sha1[20];
182 char ref_name[FLEX_ARRAY]; /* more */
185 static const char pre_receive_hook[] = "hooks/pre-receive";
186 static const char post_receive_hook[] = "hooks/post-receive";
188 static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
189 static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
191 static void report_message(const char *prefix, const char *err, va_list params)
193 int sz = strlen(prefix);
196 strncpy(msg, prefix, sz);
197 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
198 if (sz > (sizeof(msg) - 1))
199 sz = sizeof(msg) - 1;
203 send_sideband(1, 2, msg, sz, use_sideband);
208 static void rp_warning(const char *err, ...)
211 va_start(params, err);
212 report_message("warning: ", err, params);
216 static void rp_error(const char *err, ...)
219 va_start(params, err);
220 report_message("error: ", err, params);
224 static int copy_to_sideband(int in, int out, void *arg)
228 ssize_t sz = xread(in, data, sizeof(data));
231 send_sideband(1, 2, data, sz, use_sideband);
237 typedef int (*feed_fn)(void *, const char **, size_t *);
238 static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
240 struct child_process proc;
245 if (access(hook_name, X_OK) < 0)
251 memset(&proc, 0, sizeof(proc));
254 proc.stdout_to_stderr = 1;
257 memset(&muxer, 0, sizeof(muxer));
258 muxer.proc = copy_to_sideband;
260 code = start_async(&muxer);
266 code = start_command(&proc);
269 finish_async(&muxer);
276 if (feed(feed_state, &buf, &n))
278 if (write_in_full(proc.in, buf, n) != n)
283 finish_async(&muxer);
284 return finish_command(&proc);
287 struct receive_hook_feed_state {
293 static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
295 struct receive_hook_feed_state *state = state_;
296 struct command *cmd = state->cmd;
299 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
303 strbuf_reset(&state->buf);
304 strbuf_addf(&state->buf, "%s %s %s\n",
305 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
307 state->cmd = cmd->next;
309 *bufp = state->buf.buf;
310 *sizep = state->buf.len;
315 static int run_receive_hook(struct command *commands, const char *hook_name,
318 struct receive_hook_feed_state state;
321 strbuf_init(&state.buf, 0);
322 state.cmd = commands;
323 state.skip_broken = skip_broken;
324 if (feed_receive_hook(&state, NULL, NULL))
326 state.cmd = commands;
327 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
328 strbuf_release(&state.buf);
332 static int run_update_hook(struct command *cmd)
334 static const char update_hook[] = "hooks/update";
336 struct child_process proc;
339 if (access(update_hook, X_OK) < 0)
342 argv[0] = update_hook;
343 argv[1] = cmd->ref_name;
344 argv[2] = sha1_to_hex(cmd->old_sha1);
345 argv[3] = sha1_to_hex(cmd->new_sha1);
348 memset(&proc, 0, sizeof(proc));
350 proc.stdout_to_stderr = 1;
351 proc.err = use_sideband ? -1 : 0;
354 code = start_command(&proc);
358 copy_to_sideband(proc.err, -1, NULL);
359 return finish_command(&proc);
362 static int is_ref_checked_out(const char *ref)
364 if (is_bare_repository())
369 return !strcmp(head_name, ref);
372 static char *refuse_unconfigured_deny_msg[] = {
373 "By default, updating the current branch in a non-bare repository",
374 "is denied, because it will make the index and work tree inconsistent",
375 "with what you pushed, and will require 'git reset --hard' to match",
376 "the work tree to HEAD.",
378 "You can set 'receive.denyCurrentBranch' configuration variable to",
379 "'ignore' or 'warn' in the remote repository to allow pushing into",
380 "its current branch; however, this is not recommended unless you",
381 "arranged to update its work tree to match what you pushed in some",
384 "To squelch this message and still keep the default behaviour, set",
385 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
388 static void refuse_unconfigured_deny(void)
391 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
392 rp_error("%s", refuse_unconfigured_deny_msg[i]);
395 static char *refuse_unconfigured_deny_delete_current_msg[] = {
396 "By default, deleting the current branch is denied, because the next",
397 "'git clone' won't result in any file checked out, causing confusion.",
399 "You can set 'receive.denyDeleteCurrent' configuration variable to",
400 "'warn' or 'ignore' in the remote repository to allow deleting the",
401 "current branch, with or without a warning message.",
403 "To squelch this message, you can set it to 'refuse'."
406 static void refuse_unconfigured_deny_delete_current(void)
410 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
412 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
415 static const char *update(struct command *cmd)
417 const char *name = cmd->ref_name;
418 struct strbuf namespaced_name_buf = STRBUF_INIT;
419 const char *namespaced_name;
420 unsigned char *old_sha1 = cmd->old_sha1;
421 unsigned char *new_sha1 = cmd->new_sha1;
422 struct ref_lock *lock;
424 /* only refs/... are allowed */
425 if (prefixcmp(name, "refs/") || check_refname_format(name + 5, 0)) {
426 rp_error("refusing to create funny ref '%s' remotely", name);
427 return "funny refname";
430 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
431 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
433 if (is_ref_checked_out(namespaced_name)) {
434 switch (deny_current_branch) {
438 rp_warning("updating the current branch");
441 case DENY_UNCONFIGURED:
442 rp_error("refusing to update checked out branch: %s", name);
443 if (deny_current_branch == DENY_UNCONFIGURED)
444 refuse_unconfigured_deny();
445 return "branch is currently checked out";
449 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
450 error("unpack should have generated %s, "
451 "but I can't find it!", sha1_to_hex(new_sha1));
455 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
456 if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
457 rp_error("denying ref deletion for %s", name);
458 return "deletion prohibited";
461 if (!strcmp(namespaced_name, head_name)) {
462 switch (deny_delete_current) {
466 rp_warning("deleting the current branch");
469 case DENY_UNCONFIGURED:
470 if (deny_delete_current == DENY_UNCONFIGURED)
471 refuse_unconfigured_deny_delete_current();
472 rp_error("refusing to delete the current branch: %s", name);
473 return "deletion of the current branch prohibited";
478 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
479 !is_null_sha1(old_sha1) &&
480 !prefixcmp(name, "refs/heads/")) {
481 struct object *old_object, *new_object;
482 struct commit *old_commit, *new_commit;
484 old_object = parse_object(old_sha1);
485 new_object = parse_object(new_sha1);
487 if (!old_object || !new_object ||
488 old_object->type != OBJ_COMMIT ||
489 new_object->type != OBJ_COMMIT) {
490 error("bad sha1 objects for %s", name);
493 old_commit = (struct commit *)old_object;
494 new_commit = (struct commit *)new_object;
495 if (!in_merge_bases(old_commit, new_commit)) {
496 rp_error("denying non-fast-forward %s"
497 " (you should pull first)", name);
498 return "non-fast-forward";
501 if (run_update_hook(cmd)) {
502 rp_error("hook declined to update %s", name);
503 return "hook declined";
506 if (is_null_sha1(new_sha1)) {
507 if (!parse_object(old_sha1)) {
509 if (ref_exists(name)) {
510 rp_warning("Allowing deletion of corrupt ref.");
512 rp_warning("Deleting a non-existent ref.");
513 cmd->did_not_exist = 1;
516 if (delete_ref(namespaced_name, old_sha1, 0)) {
517 rp_error("failed to delete %s", name);
518 return "failed to delete";
520 return NULL; /* good */
523 lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0);
525 rp_error("failed to lock %s", name);
526 return "failed to lock";
528 if (write_ref_sha1(lock, new_sha1, "push")) {
529 return "failed to write"; /* error() already called */
531 return NULL; /* good */
535 static char update_post_hook[] = "hooks/post-update";
537 static void run_update_post_hook(struct command *commands)
542 struct child_process proc;
544 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
545 if (cmd->error_string || cmd->did_not_exist)
549 if (!argc || access(update_post_hook, X_OK) < 0)
551 argv = xmalloc(sizeof(*argv) * (2 + argc));
552 argv[0] = update_post_hook;
554 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
556 if (cmd->error_string || cmd->did_not_exist)
558 p = xmalloc(strlen(cmd->ref_name) + 1);
559 strcpy(p, cmd->ref_name);
565 memset(&proc, 0, sizeof(proc));
567 proc.stdout_to_stderr = 1;
568 proc.err = use_sideband ? -1 : 0;
571 if (!start_command(&proc)) {
573 copy_to_sideband(proc.err, -1, NULL);
574 finish_command(&proc);
578 static void check_aliased_update(struct command *cmd, struct string_list *list)
580 struct strbuf buf = STRBUF_INIT;
581 const char *dst_name;
582 struct string_list_item *item;
583 struct command *dst_cmd;
584 unsigned char sha1[20];
585 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
588 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
589 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
590 strbuf_release(&buf);
592 if (!(flag & REF_ISSYMREF))
595 dst_name = strip_namespace(dst_name);
597 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
598 cmd->skip_update = 1;
599 cmd->error_string = "broken symref";
603 if ((item = string_list_lookup(list, dst_name)) == NULL)
606 cmd->skip_update = 1;
608 dst_cmd = (struct command *) item->util;
610 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
611 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
614 dst_cmd->skip_update = 1;
616 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
617 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
618 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
619 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
620 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
621 " its target '%s' (%s..%s)",
622 cmd->ref_name, cmd_oldh, cmd_newh,
623 dst_cmd->ref_name, dst_oldh, dst_newh);
625 cmd->error_string = dst_cmd->error_string =
626 "inconsistent aliased update";
629 static void check_aliased_updates(struct command *commands)
632 struct string_list ref_list = STRING_LIST_INIT_NODUP;
634 for (cmd = commands; cmd; cmd = cmd->next) {
635 struct string_list_item *item =
636 string_list_append(&ref_list, cmd->ref_name);
637 item->util = (void *)cmd;
639 sort_string_list(&ref_list);
641 for (cmd = commands; cmd; cmd = cmd->next) {
642 if (!cmd->error_string)
643 check_aliased_update(cmd, &ref_list);
646 string_list_clear(&ref_list, 0);
649 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
651 struct command **cmd_list = cb_data;
652 struct command *cmd = *cmd_list;
654 if (!cmd || is_null_sha1(cmd->new_sha1))
655 return -1; /* end of list */
656 *cmd_list = NULL; /* this returns only one */
657 hashcpy(sha1, cmd->new_sha1);
661 static void set_connectivity_errors(struct command *commands)
665 for (cmd = commands; cmd; cmd = cmd->next) {
666 struct command *singleton = cmd;
667 if (!check_everything_connected(command_singleton_iterator,
670 cmd->error_string = "missing necessary objects";
674 static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
676 struct command **cmd_list = cb_data;
677 struct command *cmd = *cmd_list;
680 if (!is_null_sha1(cmd->new_sha1)) {
681 hashcpy(sha1, cmd->new_sha1);
682 *cmd_list = cmd->next;
688 return -1; /* end of list */
691 static void execute_commands(struct command *commands, const char *unpacker_error)
694 unsigned char sha1[20];
696 if (unpacker_error) {
697 for (cmd = commands; cmd; cmd = cmd->next)
698 cmd->error_string = "n/a (unpacker error)";
703 if (check_everything_connected(iterate_receive_command_list,
705 set_connectivity_errors(commands);
707 if (run_receive_hook(commands, pre_receive_hook, 0)) {
708 for (cmd = commands; cmd; cmd = cmd->next) {
709 if (!cmd->error_string)
710 cmd->error_string = "pre-receive hook declined";
715 check_aliased_updates(commands);
717 free(head_name_to_free);
718 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
720 for (cmd = commands; cmd; cmd = cmd->next) {
721 if (cmd->error_string)
724 if (cmd->skip_update)
727 cmd->error_string = update(cmd);
731 static struct command *read_head_info(void)
733 struct command *commands = NULL;
734 struct command **p = &commands;
736 static char line[1000];
737 unsigned char old_sha1[20], new_sha1[20];
742 len = packet_read_line(0, line, sizeof(line));
745 if (line[len-1] == '\n')
750 get_sha1_hex(line, old_sha1) ||
751 get_sha1_hex(line + 41, new_sha1))
752 die("protocol error: expected old/new/ref, got '%s'",
756 reflen = strlen(refname);
757 if (reflen + 82 < len) {
758 const char *feature_list = refname + reflen + 1;
759 if (parse_feature_request(feature_list, "report-status"))
761 if (parse_feature_request(feature_list, "side-band-64k"))
762 use_sideband = LARGE_PACKET_MAX;
763 if (parse_feature_request(feature_list, "quiet"))
766 cmd = xcalloc(1, sizeof(struct command) + len - 80);
767 hashcpy(cmd->old_sha1, old_sha1);
768 hashcpy(cmd->new_sha1, new_sha1);
769 memcpy(cmd->ref_name, line + 82, len - 81);
776 static const char *parse_pack_header(struct pack_header *hdr)
778 switch (read_pack_header(0, hdr)) {
780 return "eof before pack header was fully read";
782 case PH_ERROR_PACK_SIGNATURE:
783 return "protocol error (pack signature mismatch detected)";
785 case PH_ERROR_PROTOCOL:
786 return "protocol error (pack version unsupported)";
789 return "unknown error in parse_pack_header";
796 static const char *pack_lockfile;
798 static const char *unpack(void)
800 struct pack_header hdr;
803 int fsck_objects = (receive_fsck_objects >= 0
804 ? receive_fsck_objects
805 : transfer_fsck_objects >= 0
806 ? transfer_fsck_objects
809 hdr_err = parse_pack_header(&hdr);
812 snprintf(hdr_arg, sizeof(hdr_arg),
813 "--pack_header=%"PRIu32",%"PRIu32,
814 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
816 if (ntohl(hdr.hdr_entries) < unpack_limit) {
818 const char *unpacker[5];
819 unpacker[i++] = "unpack-objects";
821 unpacker[i++] = "-q";
823 unpacker[i++] = "--strict";
824 unpacker[i++] = hdr_arg;
825 unpacker[i++] = NULL;
826 code = run_command_v_opt(unpacker, RUN_GIT_CMD);
829 return "unpack-objects abnormal exit";
831 const char *keeper[7];
832 int s, status, i = 0;
834 struct child_process ip;
836 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
837 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
838 strcpy(keep_arg + s, "localhost");
840 keeper[i++] = "index-pack";
841 keeper[i++] = "--stdin";
843 keeper[i++] = "--strict";
844 keeper[i++] = "--fix-thin";
845 keeper[i++] = hdr_arg;
846 keeper[i++] = keep_arg;
848 memset(&ip, 0, sizeof(ip));
852 status = start_command(&ip);
854 return "index-pack fork failed";
856 pack_lockfile = index_pack_lockfile(ip.out);
858 status = finish_command(&ip);
860 reprepare_packed_git();
863 return "index-pack abnormal exit";
867 static void report(struct command *commands, const char *unpack_status)
870 struct strbuf buf = STRBUF_INIT;
872 packet_buf_write(&buf, "unpack %s\n",
873 unpack_status ? unpack_status : "ok");
874 for (cmd = commands; cmd; cmd = cmd->next) {
875 if (!cmd->error_string)
876 packet_buf_write(&buf, "ok %s\n",
879 packet_buf_write(&buf, "ng %s %s\n",
880 cmd->ref_name, cmd->error_string);
882 packet_buf_flush(&buf);
885 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
887 safe_write(1, buf.buf, buf.len);
888 strbuf_release(&buf);
891 static int delete_only(struct command *commands)
894 for (cmd = commands; cmd; cmd = cmd->next) {
895 if (!is_null_sha1(cmd->new_sha1))
901 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
903 int advertise_refs = 0;
904 int stateless_rpc = 0;
907 struct command *commands;
909 packet_trace_identity("receive-pack");
912 for (i = 1; i < argc; i++) {
913 const char *arg = *argv++;
916 if (!strcmp(arg, "--quiet")) {
921 if (!strcmp(arg, "--advertise-refs")) {
925 if (!strcmp(arg, "--stateless-rpc")) {
930 usage(receive_pack_usage);
933 usage(receive_pack_usage);
937 usage(receive_pack_usage);
941 if (!enter_repo(dir, 0))
942 die("'%s' does not appear to be a git repository", dir);
944 if (is_repository_shallow())
945 die("attempt to push into a shallow repository");
947 git_config(receive_pack_config, NULL);
949 if (0 <= transfer_unpack_limit)
950 unpack_limit = transfer_unpack_limit;
951 else if (0 <= receive_unpack_limit)
952 unpack_limit = receive_unpack_limit;
954 if (advertise_refs || !stateless_rpc) {
960 if ((commands = read_head_info()) != NULL) {
961 const char *unpack_status = NULL;
963 if (!delete_only(commands))
964 unpack_status = unpack();
965 execute_commands(commands, unpack_status);
967 unlink_or_warn(pack_lockfile);
969 report(commands, unpack_status);
970 run_receive_hook(commands, post_receive_hook, 1);
971 run_update_post_hook(commands);
973 const char *argv_gc_auto[] = {
974 "gc", "--auto", "--quiet", NULL,
976 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
977 run_command_v_opt(argv_gc_auto, opt);
979 if (auto_update_server_info)
980 update_server_info(0);