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_ref_format(name + 5)) {
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(int quiet)
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[5];
688 unpacker[i++] = "unpack-objects";
690 unpacker[i++] = "-q";
691 if (receive_fsck_objects)
692 unpacker[i++] = "--strict";
693 unpacker[i++] = hdr_arg;
694 unpacker[i++] = NULL;
695 code = run_command_v_opt(unpacker, RUN_GIT_CMD);
698 return "unpack-objects abnormal exit";
700 const char *keeper[7];
701 int s, status, i = 0;
703 struct child_process ip;
705 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
706 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
707 strcpy(keep_arg + s, "localhost");
709 keeper[i++] = "index-pack";
710 keeper[i++] = "--stdin";
711 if (receive_fsck_objects)
712 keeper[i++] = "--strict";
713 keeper[i++] = "--fix-thin";
714 keeper[i++] = hdr_arg;
715 keeper[i++] = keep_arg;
717 memset(&ip, 0, sizeof(ip));
721 status = start_command(&ip);
723 return "index-pack fork failed";
725 pack_lockfile = index_pack_lockfile(ip.out);
727 status = finish_command(&ip);
729 reprepare_packed_git();
732 return "index-pack abnormal exit";
736 static void report(struct command *commands, const char *unpack_status)
739 struct strbuf buf = STRBUF_INIT;
741 packet_buf_write(&buf, "unpack %s\n",
742 unpack_status ? unpack_status : "ok");
743 for (cmd = commands; cmd; cmd = cmd->next) {
744 if (!cmd->error_string)
745 packet_buf_write(&buf, "ok %s\n",
748 packet_buf_write(&buf, "ng %s %s\n",
749 cmd->ref_name, cmd->error_string);
751 packet_buf_flush(&buf);
754 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
756 safe_write(1, buf.buf, buf.len);
757 strbuf_release(&buf);
760 static int delete_only(struct command *commands)
763 for (cmd = commands; cmd; cmd = cmd->next) {
764 if (!is_null_sha1(cmd->new_sha1))
770 static void add_one_alternate_sha1(const unsigned char sha1[20], void *unused)
772 add_extra_ref(".have", sha1, 0);
775 static void collect_one_alternate_ref(const struct ref *ref, void *data)
777 struct sha1_array *sa = data;
778 sha1_array_append(sa, ref->old_sha1);
781 static void add_alternate_refs(void)
783 struct sha1_array sa = SHA1_ARRAY_INIT;
784 for_each_alternate_ref(collect_one_alternate_ref, &sa);
785 sha1_array_for_each_unique(&sa, add_one_alternate_sha1, NULL);
786 sha1_array_clear(&sa);
789 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
792 int advertise_refs = 0;
793 int stateless_rpc = 0;
796 struct command *commands;
798 packet_trace_identity("receive-pack");
801 for (i = 1; i < argc; i++) {
802 const char *arg = *argv++;
805 if (!strcmp(arg, "--quiet")) {
810 if (!strcmp(arg, "--advertise-refs")) {
814 if (!strcmp(arg, "--stateless-rpc")) {
819 usage(receive_pack_usage);
822 usage(receive_pack_usage);
826 usage(receive_pack_usage);
830 if (!enter_repo(dir, 0))
831 die("'%s' does not appear to be a git repository", dir);
833 if (is_repository_shallow())
834 die("attempt to push into a shallow repository");
836 git_config(receive_pack_config, NULL);
838 if (0 <= transfer_unpack_limit)
839 unpack_limit = transfer_unpack_limit;
840 else if (0 <= receive_unpack_limit)
841 unpack_limit = receive_unpack_limit;
843 if (advertise_refs || !stateless_rpc) {
844 add_alternate_refs();
854 if ((commands = read_head_info()) != NULL) {
855 const char *unpack_status = NULL;
857 if (!delete_only(commands))
858 unpack_status = unpack(quiet);
859 execute_commands(commands, unpack_status);
861 unlink_or_warn(pack_lockfile);
863 report(commands, unpack_status);
864 run_receive_hook(commands, post_receive_hook);
865 run_update_post_hook(commands);
867 const char *argv_gc_auto[] = {
868 "gc", "--auto", "--quiet", NULL,
870 run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
872 if (auto_update_server_info)
873 update_server_info(0);