6 #include "run-command.h"
11 #include "transport.h"
12 #include "string-list.h"
13 #include "sha1-array.h"
15 static const char receive_pack_usage[] = "git receive-pack <git-dir>";
24 static int deny_deletes;
25 static int deny_non_fast_forwards;
26 static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
27 static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
28 static int receive_fsck_objects;
29 static int receive_unpack_limit = -1;
30 static int transfer_unpack_limit = -1;
31 static int unpack_limit = 100;
32 static int report_status;
33 static int use_sideband;
34 static int prefer_ofs_delta = 1;
35 static int auto_update_server_info;
36 static int auto_gc = 1;
37 static const char *head_name;
38 static int sent_capabilities;
40 static enum deny_action parse_deny_action(const char *var, const char *value)
43 if (!strcasecmp(value, "ignore"))
45 if (!strcasecmp(value, "warn"))
47 if (!strcasecmp(value, "refuse"))
50 if (git_config_bool(var, value))
55 static int receive_pack_config(const char *var, const char *value, void *cb)
57 if (strcmp(var, "receive.denydeletes") == 0) {
58 deny_deletes = git_config_bool(var, value);
62 if (strcmp(var, "receive.denynonfastforwards") == 0) {
63 deny_non_fast_forwards = git_config_bool(var, value);
67 if (strcmp(var, "receive.unpacklimit") == 0) {
68 receive_unpack_limit = git_config_int(var, value);
72 if (strcmp(var, "transfer.unpacklimit") == 0) {
73 transfer_unpack_limit = git_config_int(var, value);
77 if (strcmp(var, "receive.fsckobjects") == 0) {
78 receive_fsck_objects = git_config_bool(var, value);
82 if (!strcmp(var, "receive.denycurrentbranch")) {
83 deny_current_branch = parse_deny_action(var, value);
87 if (strcmp(var, "receive.denydeletecurrent") == 0) {
88 deny_delete_current = parse_deny_action(var, value);
92 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
93 prefer_ofs_delta = git_config_bool(var, value);
97 if (strcmp(var, "receive.updateserverinfo") == 0) {
98 auto_update_server_info = git_config_bool(var, value);
102 if (strcmp(var, "receive.autogc") == 0) {
103 auto_gc = git_config_bool(var, value);
107 return git_default_config(var, value, cb);
110 static int show_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
112 if (sent_capabilities)
113 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
115 packet_write(1, "%s %s%c%s%s\n",
116 sha1_to_hex(sha1), path, 0,
117 " report-status delete-refs side-band-64k",
118 prefer_ofs_delta ? " ofs-delta" : "");
119 sent_capabilities = 1;
123 static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *cb_data)
125 path = strip_namespace(path);
127 * Advertise refs outside our current namespace as ".have"
128 * refs, so that the client can use them to minimize data
129 * transfer but will otherwise ignore them. This happens to
130 * cover ".have" that are thrown in by add_one_alternate_ref()
131 * to mark histories that are complete in our alternates as
136 return show_ref(path, sha1, flag, cb_data);
139 static void write_head_info(void)
141 for_each_ref(show_ref_cb, NULL);
142 if (!sent_capabilities)
143 show_ref("capabilities^{}", null_sha1, 0, NULL);
148 struct command *next;
149 const char *error_string;
150 unsigned int skip_update;
151 unsigned char old_sha1[20];
152 unsigned char new_sha1[20];
153 char ref_name[FLEX_ARRAY]; /* more */
156 static const char pre_receive_hook[] = "hooks/pre-receive";
157 static const char post_receive_hook[] = "hooks/post-receive";
159 static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
160 static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
162 static void report_message(const char *prefix, const char *err, va_list params)
164 int sz = strlen(prefix);
167 strncpy(msg, prefix, sz);
168 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
169 if (sz > (sizeof(msg) - 1))
170 sz = sizeof(msg) - 1;
174 send_sideband(1, 2, msg, sz, use_sideband);
179 static void rp_warning(const char *err, ...)
182 va_start(params, err);
183 report_message("warning: ", err, params);
187 static void rp_error(const char *err, ...)
190 va_start(params, err);
191 report_message("error: ", err, params);
195 static int copy_to_sideband(int in, int out, void *arg)
199 ssize_t sz = xread(in, data, sizeof(data));
202 send_sideband(1, 2, data, sz, use_sideband);
208 static int run_receive_hook(struct command *commands, const char *hook_name)
210 static char buf[sizeof(commands->old_sha1) * 2 + PATH_MAX + 4];
212 struct child_process proc;
215 int have_input = 0, code;
217 for (cmd = commands; !have_input && cmd; cmd = cmd->next) {
218 if (!cmd->error_string)
222 if (!have_input || access(hook_name, X_OK) < 0)
228 memset(&proc, 0, sizeof(proc));
231 proc.stdout_to_stderr = 1;
234 memset(&muxer, 0, sizeof(muxer));
235 muxer.proc = copy_to_sideband;
237 code = start_async(&muxer);
243 code = start_command(&proc);
246 finish_async(&muxer);
250 for (cmd = commands; cmd; cmd = cmd->next) {
251 if (!cmd->error_string) {
252 size_t n = snprintf(buf, sizeof(buf), "%s %s %s\n",
253 sha1_to_hex(cmd->old_sha1),
254 sha1_to_hex(cmd->new_sha1),
256 if (write_in_full(proc.in, buf, n) != n)
262 finish_async(&muxer);
263 return finish_command(&proc);
266 static int run_update_hook(struct command *cmd)
268 static const char update_hook[] = "hooks/update";
270 struct child_process proc;
273 if (access(update_hook, X_OK) < 0)
276 argv[0] = update_hook;
277 argv[1] = cmd->ref_name;
278 argv[2] = sha1_to_hex(cmd->old_sha1);
279 argv[3] = sha1_to_hex(cmd->new_sha1);
282 memset(&proc, 0, sizeof(proc));
284 proc.stdout_to_stderr = 1;
285 proc.err = use_sideband ? -1 : 0;
288 code = start_command(&proc);
292 copy_to_sideband(proc.err, -1, NULL);
293 return finish_command(&proc);
296 static int is_ref_checked_out(const char *ref)
298 if (is_bare_repository())
303 return !strcmp(head_name, ref);
306 static char *refuse_unconfigured_deny_msg[] = {
307 "By default, updating the current branch in a non-bare repository",
308 "is denied, because it will make the index and work tree inconsistent",
309 "with what you pushed, and will require 'git reset --hard' to match",
310 "the work tree to HEAD.",
312 "You can set 'receive.denyCurrentBranch' configuration variable to",
313 "'ignore' or 'warn' in the remote repository to allow pushing into",
314 "its current branch; however, this is not recommended unless you",
315 "arranged to update its work tree to match what you pushed in some",
318 "To squelch this message and still keep the default behaviour, set",
319 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
322 static void refuse_unconfigured_deny(void)
325 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
326 rp_error("%s", refuse_unconfigured_deny_msg[i]);
329 static char *refuse_unconfigured_deny_delete_current_msg[] = {
330 "By default, deleting the current branch is denied, because the next",
331 "'git clone' won't result in any file checked out, causing confusion.",
333 "You can set 'receive.denyDeleteCurrent' configuration variable to",
334 "'warn' or 'ignore' in the remote repository to allow deleting the",
335 "current branch, with or without a warning message.",
337 "To squelch this message, you can set it to 'refuse'."
340 static void refuse_unconfigured_deny_delete_current(void)
344 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
346 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
349 static const char *update(struct command *cmd)
351 const char *name = cmd->ref_name;
352 struct strbuf namespaced_name_buf = STRBUF_INIT;
353 const char *namespaced_name;
354 unsigned char *old_sha1 = cmd->old_sha1;
355 unsigned char *new_sha1 = cmd->new_sha1;
356 struct ref_lock *lock;
358 /* only refs/... are allowed */
359 if (prefixcmp(name, "refs/") || check_refname_format(name + 5, 0)) {
360 rp_error("refusing to create funny ref '%s' remotely", name);
361 return "funny refname";
364 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
365 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
367 if (is_ref_checked_out(namespaced_name)) {
368 switch (deny_current_branch) {
372 rp_warning("updating the current branch");
375 case DENY_UNCONFIGURED:
376 rp_error("refusing to update checked out branch: %s", name);
377 if (deny_current_branch == DENY_UNCONFIGURED)
378 refuse_unconfigured_deny();
379 return "branch is currently checked out";
383 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
384 error("unpack should have generated %s, "
385 "but I can't find it!", sha1_to_hex(new_sha1));
389 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
390 if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
391 rp_error("denying ref deletion for %s", name);
392 return "deletion prohibited";
395 if (!strcmp(namespaced_name, head_name)) {
396 switch (deny_delete_current) {
400 rp_warning("deleting the current branch");
403 case DENY_UNCONFIGURED:
404 if (deny_delete_current == DENY_UNCONFIGURED)
405 refuse_unconfigured_deny_delete_current();
406 rp_error("refusing to delete the current branch: %s", name);
407 return "deletion of the current branch prohibited";
412 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
413 !is_null_sha1(old_sha1) &&
414 !prefixcmp(name, "refs/heads/")) {
415 struct object *old_object, *new_object;
416 struct commit *old_commit, *new_commit;
417 struct commit_list *bases, *ent;
419 old_object = parse_object(old_sha1);
420 new_object = parse_object(new_sha1);
422 if (!old_object || !new_object ||
423 old_object->type != OBJ_COMMIT ||
424 new_object->type != OBJ_COMMIT) {
425 error("bad sha1 objects for %s", name);
428 old_commit = (struct commit *)old_object;
429 new_commit = (struct commit *)new_object;
430 bases = get_merge_bases(old_commit, new_commit, 1);
431 for (ent = bases; ent; ent = ent->next)
432 if (!hashcmp(old_sha1, ent->item->object.sha1))
434 free_commit_list(bases);
436 rp_error("denying non-fast-forward %s"
437 " (you should pull first)", name);
438 return "non-fast-forward";
441 if (run_update_hook(cmd)) {
442 rp_error("hook declined to update %s", name);
443 return "hook declined";
446 if (is_null_sha1(new_sha1)) {
447 if (!parse_object(old_sha1)) {
448 rp_warning("Allowing deletion of corrupt ref.");
451 if (delete_ref(namespaced_name, old_sha1, 0)) {
452 rp_error("failed to delete %s", name);
453 return "failed to delete";
455 return NULL; /* good */
458 lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0);
460 rp_error("failed to lock %s", name);
461 return "failed to lock";
463 if (write_ref_sha1(lock, new_sha1, "push")) {
464 return "failed to write"; /* error() already called */
466 return NULL; /* good */
470 static char update_post_hook[] = "hooks/post-update";
472 static void run_update_post_hook(struct command *commands)
477 struct child_process proc;
479 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
480 if (cmd->error_string)
484 if (!argc || access(update_post_hook, X_OK) < 0)
486 argv = xmalloc(sizeof(*argv) * (2 + argc));
487 argv[0] = update_post_hook;
489 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
491 if (cmd->error_string)
493 p = xmalloc(strlen(cmd->ref_name) + 1);
494 strcpy(p, cmd->ref_name);
500 memset(&proc, 0, sizeof(proc));
502 proc.stdout_to_stderr = 1;
503 proc.err = use_sideband ? -1 : 0;
506 if (!start_command(&proc)) {
508 copy_to_sideband(proc.err, -1, NULL);
509 finish_command(&proc);
513 static void check_aliased_update(struct command *cmd, struct string_list *list)
515 struct strbuf buf = STRBUF_INIT;
516 const char *dst_name;
517 struct string_list_item *item;
518 struct command *dst_cmd;
519 unsigned char sha1[20];
520 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
523 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
524 dst_name = resolve_ref(buf.buf, sha1, 0, &flag);
525 strbuf_release(&buf);
527 if (!(flag & REF_ISSYMREF))
530 dst_name = strip_namespace(dst_name);
532 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
533 cmd->skip_update = 1;
534 cmd->error_string = "broken symref";
538 if ((item = string_list_lookup(list, dst_name)) == NULL)
541 cmd->skip_update = 1;
543 dst_cmd = (struct command *) item->util;
545 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
546 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
549 dst_cmd->skip_update = 1;
551 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
552 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
553 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
554 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
555 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
556 " its target '%s' (%s..%s)",
557 cmd->ref_name, cmd_oldh, cmd_newh,
558 dst_cmd->ref_name, dst_oldh, dst_newh);
560 cmd->error_string = dst_cmd->error_string =
561 "inconsistent aliased update";
564 static void check_aliased_updates(struct command *commands)
567 struct string_list ref_list = STRING_LIST_INIT_NODUP;
569 for (cmd = commands; cmd; cmd = cmd->next) {
570 struct string_list_item *item =
571 string_list_append(&ref_list, cmd->ref_name);
572 item->util = (void *)cmd;
574 sort_string_list(&ref_list);
576 for (cmd = commands; cmd; cmd = cmd->next)
577 check_aliased_update(cmd, &ref_list);
579 string_list_clear(&ref_list, 0);
582 static void execute_commands(struct command *commands, const char *unpacker_error)
585 unsigned char sha1[20];
587 if (unpacker_error) {
588 for (cmd = commands; cmd; cmd = cmd->next)
589 cmd->error_string = "n/a (unpacker error)";
593 if (run_receive_hook(commands, pre_receive_hook)) {
594 for (cmd = commands; cmd; cmd = cmd->next)
595 cmd->error_string = "pre-receive hook declined";
599 check_aliased_updates(commands);
601 head_name = resolve_ref("HEAD", sha1, 0, NULL);
603 for (cmd = commands; cmd; cmd = cmd->next)
604 if (!cmd->skip_update)
605 cmd->error_string = update(cmd);
608 static struct command *read_head_info(void)
610 struct command *commands = NULL;
611 struct command **p = &commands;
613 static char line[1000];
614 unsigned char old_sha1[20], new_sha1[20];
619 len = packet_read_line(0, line, sizeof(line));
622 if (line[len-1] == '\n')
627 get_sha1_hex(line, old_sha1) ||
628 get_sha1_hex(line + 41, new_sha1))
629 die("protocol error: expected old/new/ref, got '%s'",
633 reflen = strlen(refname);
634 if (reflen + 82 < len) {
635 if (strstr(refname + reflen + 1, "report-status"))
637 if (strstr(refname + reflen + 1, "side-band-64k"))
638 use_sideband = LARGE_PACKET_MAX;
640 cmd = xcalloc(1, sizeof(struct command) + len - 80);
641 hashcpy(cmd->old_sha1, old_sha1);
642 hashcpy(cmd->new_sha1, new_sha1);
643 memcpy(cmd->ref_name, line + 82, len - 81);
650 static const char *parse_pack_header(struct pack_header *hdr)
652 switch (read_pack_header(0, hdr)) {
654 return "eof before pack header was fully read";
656 case PH_ERROR_PACK_SIGNATURE:
657 return "protocol error (pack signature mismatch detected)";
659 case PH_ERROR_PROTOCOL:
660 return "protocol error (pack version unsupported)";
663 return "unknown error in parse_pack_header";
670 static const char *pack_lockfile;
672 static const char *unpack(void)
674 struct pack_header hdr;
678 hdr_err = parse_pack_header(&hdr);
681 snprintf(hdr_arg, sizeof(hdr_arg),
682 "--pack_header=%"PRIu32",%"PRIu32,
683 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
685 if (ntohl(hdr.hdr_entries) < unpack_limit) {
687 const char *unpacker[4];
688 unpacker[i++] = "unpack-objects";
689 if (receive_fsck_objects)
690 unpacker[i++] = "--strict";
691 unpacker[i++] = hdr_arg;
692 unpacker[i++] = NULL;
693 code = run_command_v_opt(unpacker, RUN_GIT_CMD);
696 return "unpack-objects abnormal exit";
698 const char *keeper[7];
699 int s, status, i = 0;
701 struct child_process ip;
703 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
704 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
705 strcpy(keep_arg + s, "localhost");
707 keeper[i++] = "index-pack";
708 keeper[i++] = "--stdin";
709 if (receive_fsck_objects)
710 keeper[i++] = "--strict";
711 keeper[i++] = "--fix-thin";
712 keeper[i++] = hdr_arg;
713 keeper[i++] = keep_arg;
715 memset(&ip, 0, sizeof(ip));
719 status = start_command(&ip);
721 return "index-pack fork failed";
723 pack_lockfile = index_pack_lockfile(ip.out);
725 status = finish_command(&ip);
727 reprepare_packed_git();
730 return "index-pack abnormal exit";
734 static void report(struct command *commands, const char *unpack_status)
737 struct strbuf buf = STRBUF_INIT;
739 packet_buf_write(&buf, "unpack %s\n",
740 unpack_status ? unpack_status : "ok");
741 for (cmd = commands; cmd; cmd = cmd->next) {
742 if (!cmd->error_string)
743 packet_buf_write(&buf, "ok %s\n",
746 packet_buf_write(&buf, "ng %s %s\n",
747 cmd->ref_name, cmd->error_string);
749 packet_buf_flush(&buf);
752 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
754 safe_write(1, buf.buf, buf.len);
755 strbuf_release(&buf);
758 static int delete_only(struct command *commands)
761 for (cmd = commands; cmd; cmd = cmd->next) {
762 if (!is_null_sha1(cmd->new_sha1))
768 static void add_one_alternate_sha1(const unsigned char sha1[20], void *unused)
770 add_extra_ref(".have", sha1, 0);
773 static void collect_one_alternate_ref(const struct ref *ref, void *data)
775 struct sha1_array *sa = data;
776 sha1_array_append(sa, ref->old_sha1);
779 static void add_alternate_refs(void)
781 struct sha1_array sa = SHA1_ARRAY_INIT;
782 for_each_alternate_ref(collect_one_alternate_ref, &sa);
783 sha1_array_for_each_unique(&sa, add_one_alternate_sha1, NULL);
784 sha1_array_clear(&sa);
787 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
789 int advertise_refs = 0;
790 int stateless_rpc = 0;
793 struct command *commands;
795 packet_trace_identity("receive-pack");
798 for (i = 1; i < argc; i++) {
799 const char *arg = *argv++;
802 if (!strcmp(arg, "--advertise-refs")) {
806 if (!strcmp(arg, "--stateless-rpc")) {
811 usage(receive_pack_usage);
814 usage(receive_pack_usage);
818 usage(receive_pack_usage);
822 if (!enter_repo(dir, 0))
823 die("'%s' does not appear to be a git repository", dir);
825 if (is_repository_shallow())
826 die("attempt to push into a shallow repository");
828 git_config(receive_pack_config, NULL);
830 if (0 <= transfer_unpack_limit)
831 unpack_limit = transfer_unpack_limit;
832 else if (0 <= receive_unpack_limit)
833 unpack_limit = receive_unpack_limit;
835 if (advertise_refs || !stateless_rpc) {
836 add_alternate_refs();
846 if ((commands = read_head_info()) != NULL) {
847 const char *unpack_status = NULL;
849 if (!delete_only(commands))
850 unpack_status = unpack();
851 execute_commands(commands, unpack_status);
853 unlink_or_warn(pack_lockfile);
855 report(commands, unpack_status);
856 run_receive_hook(commands, post_receive_hook);
857 run_update_post_hook(commands);
859 const char *argv_gc_auto[] = {
860 "gc", "--auto", "--quiet", NULL,
862 run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
864 if (auto_update_server_info)
865 update_server_info(0);