6 #include "run-command.h"
12 #include "transport.h"
13 #include "string-list.h"
14 #include "sha1-array.h"
15 #include "connected.h"
18 static const char receive_pack_usage[] = "git receive-pack <git-dir>";
27 static int deny_deletes;
28 static int deny_non_fast_forwards;
29 static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
30 static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
31 static int receive_fsck_objects = -1;
32 static int transfer_fsck_objects = -1;
33 static int receive_unpack_limit = -1;
34 static int transfer_unpack_limit = -1;
35 static int unpack_limit = 100;
36 static int report_status;
37 static int use_sideband;
39 static int prefer_ofs_delta = 1;
40 static int auto_update_server_info;
41 static int auto_gc = 1;
42 static int fix_thin = 1;
43 static const char *head_name;
44 static void *head_name_to_free;
45 static int sent_capabilities;
47 static enum deny_action parse_deny_action(const char *var, const char *value)
50 if (!strcasecmp(value, "ignore"))
52 if (!strcasecmp(value, "warn"))
54 if (!strcasecmp(value, "refuse"))
57 if (git_config_bool(var, value))
62 static int receive_pack_config(const char *var, const char *value, void *cb)
64 int status = parse_hide_refs_config(var, value, "receive");
69 if (strcmp(var, "receive.denydeletes") == 0) {
70 deny_deletes = git_config_bool(var, value);
74 if (strcmp(var, "receive.denynonfastforwards") == 0) {
75 deny_non_fast_forwards = git_config_bool(var, value);
79 if (strcmp(var, "receive.unpacklimit") == 0) {
80 receive_unpack_limit = git_config_int(var, value);
84 if (strcmp(var, "transfer.unpacklimit") == 0) {
85 transfer_unpack_limit = git_config_int(var, value);
89 if (strcmp(var, "receive.fsckobjects") == 0) {
90 receive_fsck_objects = git_config_bool(var, value);
94 if (strcmp(var, "transfer.fsckobjects") == 0) {
95 transfer_fsck_objects = git_config_bool(var, value);
99 if (!strcmp(var, "receive.denycurrentbranch")) {
100 deny_current_branch = parse_deny_action(var, value);
104 if (strcmp(var, "receive.denydeletecurrent") == 0) {
105 deny_delete_current = parse_deny_action(var, value);
109 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
110 prefer_ofs_delta = git_config_bool(var, value);
114 if (strcmp(var, "receive.updateserverinfo") == 0) {
115 auto_update_server_info = git_config_bool(var, value);
119 if (strcmp(var, "receive.autogc") == 0) {
120 auto_gc = git_config_bool(var, value);
124 return git_default_config(var, value, cb);
127 static void show_ref(const char *path, const unsigned char *sha1)
129 if (ref_is_hidden(path))
132 if (sent_capabilities)
133 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
135 packet_write(1, "%s %s%c%s%s agent=%s\n",
136 sha1_to_hex(sha1), path, 0,
137 " report-status delete-refs side-band-64k quiet",
138 prefer_ofs_delta ? " ofs-delta" : "",
139 git_user_agent_sanitized());
140 sent_capabilities = 1;
143 static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
145 path = strip_namespace(path);
147 * Advertise refs outside our current namespace as ".have"
148 * refs, so that the client can use them to minimize data
149 * transfer but will otherwise ignore them. This happens to
150 * cover ".have" that are thrown in by add_one_alternate_ref()
151 * to mark histories that are complete in our alternates as
156 show_ref(path, sha1);
160 static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
162 show_ref(".have", sha1);
165 static void collect_one_alternate_ref(const struct ref *ref, void *data)
167 struct sha1_array *sa = data;
168 sha1_array_append(sa, ref->old_sha1);
171 static void write_head_info(void)
173 struct sha1_array sa = SHA1_ARRAY_INIT;
174 for_each_alternate_ref(collect_one_alternate_ref, &sa);
175 sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
176 sha1_array_clear(&sa);
177 for_each_ref(show_ref_cb, NULL);
178 if (!sent_capabilities)
179 show_ref("capabilities^{}", null_sha1);
186 struct command *next;
187 const char *error_string;
188 unsigned int skip_update:1,
190 unsigned char old_sha1[20];
191 unsigned char new_sha1[20];
192 char ref_name[FLEX_ARRAY]; /* more */
195 static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
196 static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
198 static void report_message(const char *prefix, const char *err, va_list params)
200 int sz = strlen(prefix);
203 strncpy(msg, prefix, sz);
204 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
205 if (sz > (sizeof(msg) - 1))
206 sz = sizeof(msg) - 1;
210 send_sideband(1, 2, msg, sz, use_sideband);
215 static void rp_warning(const char *err, ...)
218 va_start(params, err);
219 report_message("warning: ", err, params);
223 static void rp_error(const char *err, ...)
226 va_start(params, err);
227 report_message("error: ", err, params);
231 static int copy_to_sideband(int in, int out, void *arg)
235 ssize_t sz = xread(in, data, sizeof(data));
238 send_sideband(1, 2, data, sz, use_sideband);
244 typedef int (*feed_fn)(void *, const char **, size_t *);
245 static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
247 struct child_process proc;
252 argv[0] = find_hook(hook_name);
258 memset(&proc, 0, sizeof(proc));
261 proc.stdout_to_stderr = 1;
264 memset(&muxer, 0, sizeof(muxer));
265 muxer.proc = copy_to_sideband;
267 code = start_async(&muxer);
273 code = start_command(&proc);
276 finish_async(&muxer);
283 if (feed(feed_state, &buf, &n))
285 if (write_in_full(proc.in, buf, n) != n)
290 finish_async(&muxer);
291 return finish_command(&proc);
294 struct receive_hook_feed_state {
300 static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
302 struct receive_hook_feed_state *state = state_;
303 struct command *cmd = state->cmd;
306 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
310 strbuf_reset(&state->buf);
311 strbuf_addf(&state->buf, "%s %s %s\n",
312 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
314 state->cmd = cmd->next;
316 *bufp = state->buf.buf;
317 *sizep = state->buf.len;
322 static int run_receive_hook(struct command *commands, const char *hook_name,
325 struct receive_hook_feed_state state;
328 strbuf_init(&state.buf, 0);
329 state.cmd = commands;
330 state.skip_broken = skip_broken;
331 if (feed_receive_hook(&state, NULL, NULL))
333 state.cmd = commands;
334 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
335 strbuf_release(&state.buf);
339 static int run_update_hook(struct command *cmd)
342 struct child_process proc;
345 argv[0] = find_hook("update");
349 argv[1] = cmd->ref_name;
350 argv[2] = sha1_to_hex(cmd->old_sha1);
351 argv[3] = sha1_to_hex(cmd->new_sha1);
354 memset(&proc, 0, sizeof(proc));
356 proc.stdout_to_stderr = 1;
357 proc.err = use_sideband ? -1 : 0;
360 code = start_command(&proc);
364 copy_to_sideband(proc.err, -1, NULL);
365 return finish_command(&proc);
368 static int is_ref_checked_out(const char *ref)
370 if (is_bare_repository())
375 return !strcmp(head_name, ref);
378 static char *refuse_unconfigured_deny_msg[] = {
379 "By default, updating the current branch in a non-bare repository",
380 "is denied, because it will make the index and work tree inconsistent",
381 "with what you pushed, and will require 'git reset --hard' to match",
382 "the work tree to HEAD.",
384 "You can set 'receive.denyCurrentBranch' configuration variable to",
385 "'ignore' or 'warn' in the remote repository to allow pushing into",
386 "its current branch; however, this is not recommended unless you",
387 "arranged to update its work tree to match what you pushed in some",
390 "To squelch this message and still keep the default behaviour, set",
391 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
394 static void refuse_unconfigured_deny(void)
397 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
398 rp_error("%s", refuse_unconfigured_deny_msg[i]);
401 static char *refuse_unconfigured_deny_delete_current_msg[] = {
402 "By default, deleting the current branch is denied, because the next",
403 "'git clone' won't result in any file checked out, causing confusion.",
405 "You can set 'receive.denyDeleteCurrent' configuration variable to",
406 "'warn' or 'ignore' in the remote repository to allow deleting the",
407 "current branch, with or without a warning message.",
409 "To squelch this message, you can set it to 'refuse'."
412 static void refuse_unconfigured_deny_delete_current(void)
416 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
418 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
421 static const char *update(struct command *cmd)
423 const char *name = cmd->ref_name;
424 struct strbuf namespaced_name_buf = STRBUF_INIT;
425 const char *namespaced_name;
426 unsigned char *old_sha1 = cmd->old_sha1;
427 unsigned char *new_sha1 = cmd->new_sha1;
428 struct ref_lock *lock;
430 /* only refs/... are allowed */
431 if (prefixcmp(name, "refs/") || check_refname_format(name + 5, 0)) {
432 rp_error("refusing to create funny ref '%s' remotely", name);
433 return "funny refname";
436 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
437 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
439 if (is_ref_checked_out(namespaced_name)) {
440 switch (deny_current_branch) {
444 rp_warning("updating the current branch");
447 case DENY_UNCONFIGURED:
448 rp_error("refusing to update checked out branch: %s", name);
449 if (deny_current_branch == DENY_UNCONFIGURED)
450 refuse_unconfigured_deny();
451 return "branch is currently checked out";
455 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
456 error("unpack should have generated %s, "
457 "but I can't find it!", sha1_to_hex(new_sha1));
461 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
462 if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
463 rp_error("denying ref deletion for %s", name);
464 return "deletion prohibited";
467 if (!strcmp(namespaced_name, head_name)) {
468 switch (deny_delete_current) {
472 rp_warning("deleting the current branch");
475 case DENY_UNCONFIGURED:
476 if (deny_delete_current == DENY_UNCONFIGURED)
477 refuse_unconfigured_deny_delete_current();
478 rp_error("refusing to delete the current branch: %s", name);
479 return "deletion of the current branch prohibited";
484 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
485 !is_null_sha1(old_sha1) &&
486 !prefixcmp(name, "refs/heads/")) {
487 struct object *old_object, *new_object;
488 struct commit *old_commit, *new_commit;
490 old_object = parse_object(old_sha1);
491 new_object = parse_object(new_sha1);
493 if (!old_object || !new_object ||
494 old_object->type != OBJ_COMMIT ||
495 new_object->type != OBJ_COMMIT) {
496 error("bad sha1 objects for %s", name);
499 old_commit = (struct commit *)old_object;
500 new_commit = (struct commit *)new_object;
501 if (!in_merge_bases(old_commit, new_commit)) {
502 rp_error("denying non-fast-forward %s"
503 " (you should pull first)", name);
504 return "non-fast-forward";
507 if (run_update_hook(cmd)) {
508 rp_error("hook declined to update %s", name);
509 return "hook declined";
512 if (is_null_sha1(new_sha1)) {
513 if (!parse_object(old_sha1)) {
515 if (ref_exists(name)) {
516 rp_warning("Allowing deletion of corrupt ref.");
518 rp_warning("Deleting a non-existent ref.");
519 cmd->did_not_exist = 1;
522 if (delete_ref(namespaced_name, old_sha1, 0)) {
523 rp_error("failed to delete %s", name);
524 return "failed to delete";
526 return NULL; /* good */
529 lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0);
531 rp_error("failed to lock %s", name);
532 return "failed to lock";
534 if (write_ref_sha1(lock, new_sha1, "push")) {
535 return "failed to write"; /* error() already called */
537 return NULL; /* good */
541 static void run_update_post_hook(struct command *commands)
546 struct child_process proc;
549 hook = find_hook("post-update");
550 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
551 if (cmd->error_string || cmd->did_not_exist)
558 argv = xmalloc(sizeof(*argv) * (2 + argc));
561 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
563 if (cmd->error_string || cmd->did_not_exist)
565 p = xmalloc(strlen(cmd->ref_name) + 1);
566 strcpy(p, cmd->ref_name);
572 memset(&proc, 0, sizeof(proc));
574 proc.stdout_to_stderr = 1;
575 proc.err = use_sideband ? -1 : 0;
578 if (!start_command(&proc)) {
580 copy_to_sideband(proc.err, -1, NULL);
581 finish_command(&proc);
585 static void check_aliased_update(struct command *cmd, struct string_list *list)
587 struct strbuf buf = STRBUF_INIT;
588 const char *dst_name;
589 struct string_list_item *item;
590 struct command *dst_cmd;
591 unsigned char sha1[20];
592 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
595 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
596 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
597 strbuf_release(&buf);
599 if (!(flag & REF_ISSYMREF))
602 dst_name = strip_namespace(dst_name);
604 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
605 cmd->skip_update = 1;
606 cmd->error_string = "broken symref";
610 if ((item = string_list_lookup(list, dst_name)) == NULL)
613 cmd->skip_update = 1;
615 dst_cmd = (struct command *) item->util;
617 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
618 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
621 dst_cmd->skip_update = 1;
623 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
624 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
625 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
626 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
627 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
628 " its target '%s' (%s..%s)",
629 cmd->ref_name, cmd_oldh, cmd_newh,
630 dst_cmd->ref_name, dst_oldh, dst_newh);
632 cmd->error_string = dst_cmd->error_string =
633 "inconsistent aliased update";
636 static void check_aliased_updates(struct command *commands)
639 struct string_list ref_list = STRING_LIST_INIT_NODUP;
641 for (cmd = commands; cmd; cmd = cmd->next) {
642 struct string_list_item *item =
643 string_list_append(&ref_list, cmd->ref_name);
644 item->util = (void *)cmd;
646 sort_string_list(&ref_list);
648 for (cmd = commands; cmd; cmd = cmd->next) {
649 if (!cmd->error_string)
650 check_aliased_update(cmd, &ref_list);
653 string_list_clear(&ref_list, 0);
656 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
658 struct command **cmd_list = cb_data;
659 struct command *cmd = *cmd_list;
661 if (!cmd || is_null_sha1(cmd->new_sha1))
662 return -1; /* end of list */
663 *cmd_list = NULL; /* this returns only one */
664 hashcpy(sha1, cmd->new_sha1);
668 static void set_connectivity_errors(struct command *commands)
672 for (cmd = commands; cmd; cmd = cmd->next) {
673 struct command *singleton = cmd;
674 if (!check_everything_connected(command_singleton_iterator,
677 cmd->error_string = "missing necessary objects";
681 static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
683 struct command **cmd_list = cb_data;
684 struct command *cmd = *cmd_list;
687 if (!is_null_sha1(cmd->new_sha1)) {
688 hashcpy(sha1, cmd->new_sha1);
689 *cmd_list = cmd->next;
695 return -1; /* end of list */
698 static void reject_updates_to_hidden(struct command *commands)
702 for (cmd = commands; cmd; cmd = cmd->next) {
703 if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
705 if (is_null_sha1(cmd->new_sha1))
706 cmd->error_string = "deny deleting a hidden ref";
708 cmd->error_string = "deny updating a hidden ref";
712 static void execute_commands(struct command *commands, const char *unpacker_error)
715 unsigned char sha1[20];
717 if (unpacker_error) {
718 for (cmd = commands; cmd; cmd = cmd->next)
719 cmd->error_string = "unpacker error";
724 if (check_everything_connected(iterate_receive_command_list,
726 set_connectivity_errors(commands);
728 reject_updates_to_hidden(commands);
730 if (run_receive_hook(commands, "pre-receive", 0)) {
731 for (cmd = commands; cmd; cmd = cmd->next) {
732 if (!cmd->error_string)
733 cmd->error_string = "pre-receive hook declined";
738 check_aliased_updates(commands);
740 free(head_name_to_free);
741 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
743 for (cmd = commands; cmd; cmd = cmd->next) {
744 if (cmd->error_string)
747 if (cmd->skip_update)
750 cmd->error_string = update(cmd);
754 static struct command *read_head_info(void)
756 struct command *commands = NULL;
757 struct command **p = &commands;
760 unsigned char old_sha1[20], new_sha1[20];
765 line = packet_read_line(0, &len);
771 get_sha1_hex(line, old_sha1) ||
772 get_sha1_hex(line + 41, new_sha1))
773 die("protocol error: expected old/new/ref, got '%s'",
777 reflen = strlen(refname);
778 if (reflen + 82 < len) {
779 const char *feature_list = refname + reflen + 1;
780 if (parse_feature_request(feature_list, "report-status"))
782 if (parse_feature_request(feature_list, "side-band-64k"))
783 use_sideband = LARGE_PACKET_MAX;
784 if (parse_feature_request(feature_list, "quiet"))
787 cmd = xcalloc(1, sizeof(struct command) + len - 80);
788 hashcpy(cmd->old_sha1, old_sha1);
789 hashcpy(cmd->new_sha1, new_sha1);
790 memcpy(cmd->ref_name, line + 82, len - 81);
797 static const char *parse_pack_header(struct pack_header *hdr)
799 switch (read_pack_header(0, hdr)) {
801 return "eof before pack header was fully read";
803 case PH_ERROR_PACK_SIGNATURE:
804 return "protocol error (pack signature mismatch detected)";
806 case PH_ERROR_PROTOCOL:
807 return "protocol error (pack version unsupported)";
810 return "unknown error in parse_pack_header";
817 static const char *pack_lockfile;
819 static const char *unpack(int err_fd)
821 struct pack_header hdr;
824 int fsck_objects = (receive_fsck_objects >= 0
825 ? receive_fsck_objects
826 : transfer_fsck_objects >= 0
827 ? transfer_fsck_objects
830 hdr_err = parse_pack_header(&hdr);
836 snprintf(hdr_arg, sizeof(hdr_arg),
837 "--pack_header=%"PRIu32",%"PRIu32,
838 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
840 if (ntohl(hdr.hdr_entries) < unpack_limit) {
842 struct child_process child;
843 const char *unpacker[5];
844 unpacker[i++] = "unpack-objects";
846 unpacker[i++] = "-q";
848 unpacker[i++] = "--strict";
849 unpacker[i++] = hdr_arg;
850 unpacker[i++] = NULL;
851 memset(&child, 0, sizeof(child));
852 child.argv = unpacker;
856 code = run_command(&child);
859 return "unpack-objects abnormal exit";
861 const char *keeper[7];
862 int s, status, i = 0;
864 struct child_process ip;
866 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
867 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
868 strcpy(keep_arg + s, "localhost");
870 keeper[i++] = "index-pack";
871 keeper[i++] = "--stdin";
873 keeper[i++] = "--strict";
875 keeper[i++] = "--fix-thin";
876 keeper[i++] = hdr_arg;
877 keeper[i++] = keep_arg;
879 memset(&ip, 0, sizeof(ip));
884 status = start_command(&ip);
886 return "index-pack fork failed";
888 pack_lockfile = index_pack_lockfile(ip.out);
890 status = finish_command(&ip);
892 reprepare_packed_git();
895 return "index-pack abnormal exit";
899 static const char *unpack_with_sideband(void)
907 memset(&muxer, 0, sizeof(muxer));
908 muxer.proc = copy_to_sideband;
910 if (start_async(&muxer))
913 ret = unpack(muxer.in);
915 finish_async(&muxer);
919 static void report(struct command *commands, const char *unpack_status)
922 struct strbuf buf = STRBUF_INIT;
924 packet_buf_write(&buf, "unpack %s\n",
925 unpack_status ? unpack_status : "ok");
926 for (cmd = commands; cmd; cmd = cmd->next) {
927 if (!cmd->error_string)
928 packet_buf_write(&buf, "ok %s\n",
931 packet_buf_write(&buf, "ng %s %s\n",
932 cmd->ref_name, cmd->error_string);
934 packet_buf_flush(&buf);
937 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
939 write_or_die(1, buf.buf, buf.len);
940 strbuf_release(&buf);
943 static int delete_only(struct command *commands)
946 for (cmd = commands; cmd; cmd = cmd->next) {
947 if (!is_null_sha1(cmd->new_sha1))
953 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
955 int advertise_refs = 0;
956 int stateless_rpc = 0;
959 struct command *commands;
961 packet_trace_identity("receive-pack");
964 for (i = 1; i < argc; i++) {
965 const char *arg = *argv++;
968 if (!strcmp(arg, "--quiet")) {
973 if (!strcmp(arg, "--advertise-refs")) {
977 if (!strcmp(arg, "--stateless-rpc")) {
981 if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
986 usage(receive_pack_usage);
989 usage(receive_pack_usage);
993 usage(receive_pack_usage);
997 if (!enter_repo(dir, 0))
998 die("'%s' does not appear to be a git repository", dir);
1000 if (is_repository_shallow())
1001 die("attempt to push into a shallow repository");
1003 git_config(receive_pack_config, NULL);
1005 if (0 <= transfer_unpack_limit)
1006 unpack_limit = transfer_unpack_limit;
1007 else if (0 <= receive_unpack_limit)
1008 unpack_limit = receive_unpack_limit;
1010 if (advertise_refs || !stateless_rpc) {
1016 if ((commands = read_head_info()) != NULL) {
1017 const char *unpack_status = NULL;
1019 if (!delete_only(commands))
1020 unpack_status = unpack_with_sideband();
1021 execute_commands(commands, unpack_status);
1023 unlink_or_warn(pack_lockfile);
1025 report(commands, unpack_status);
1026 run_receive_hook(commands, "post-receive", 1);
1027 run_update_post_hook(commands);
1029 const char *argv_gc_auto[] = {
1030 "gc", "--auto", "--quiet", NULL,
1032 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1033 run_command_v_opt(argv_gc_auto, opt);
1035 if (auto_update_server_info)
1036 update_server_info(0);