gitweb: Add gitweb.conf(5) manpage for gitweb configuration files
[alt-git.git] / builtin / receive-pack.c
blobae164da4d5a7b7a2c87937ba0983126586f1e646
1 #include "builtin.h"
2 #include "pack.h"
3 #include "refs.h"
4 #include "pkt-line.h"
5 #include "sideband.h"
6 #include "run-command.h"
7 #include "exec_cmd.h"
8 #include "commit.h"
9 #include "object.h"
10 #include "remote.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>";
17 enum deny_action {
18 DENY_UNCONFIGURED,
19 DENY_IGNORE,
20 DENY_WARN,
21 DENY_REFUSE
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)
42 if (value) {
43 if (!strcasecmp(value, "ignore"))
44 return DENY_IGNORE;
45 if (!strcasecmp(value, "warn"))
46 return DENY_WARN;
47 if (!strcasecmp(value, "refuse"))
48 return DENY_REFUSE;
50 if (git_config_bool(var, value))
51 return DENY_REFUSE;
52 return DENY_IGNORE;
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);
59 return 0;
62 if (strcmp(var, "receive.denynonfastforwards") == 0) {
63 deny_non_fast_forwards = git_config_bool(var, value);
64 return 0;
67 if (strcmp(var, "receive.unpacklimit") == 0) {
68 receive_unpack_limit = git_config_int(var, value);
69 return 0;
72 if (strcmp(var, "transfer.unpacklimit") == 0) {
73 transfer_unpack_limit = git_config_int(var, value);
74 return 0;
77 if (strcmp(var, "receive.fsckobjects") == 0) {
78 receive_fsck_objects = git_config_bool(var, value);
79 return 0;
82 if (!strcmp(var, "receive.denycurrentbranch")) {
83 deny_current_branch = parse_deny_action(var, value);
84 return 0;
87 if (strcmp(var, "receive.denydeletecurrent") == 0) {
88 deny_delete_current = parse_deny_action(var, value);
89 return 0;
92 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
93 prefer_ofs_delta = git_config_bool(var, value);
94 return 0;
97 if (strcmp(var, "receive.updateserverinfo") == 0) {
98 auto_update_server_info = git_config_bool(var, value);
99 return 0;
102 if (strcmp(var, "receive.autogc") == 0) {
103 auto_gc = git_config_bool(var, value);
104 return 0;
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);
114 else
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;
120 return 0;
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
132 * well.
134 if (!path)
135 path = ".have";
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);
147 struct command {
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);
165 char msg[4096];
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;
171 msg[sz++] = '\n';
173 if (use_sideband)
174 send_sideband(1, 2, msg, sz, use_sideband);
175 else
176 xwrite(2, msg, sz);
179 static void rp_warning(const char *err, ...)
181 va_list params;
182 va_start(params, err);
183 report_message("warning: ", err, params);
184 va_end(params);
187 static void rp_error(const char *err, ...)
189 va_list params;
190 va_start(params, err);
191 report_message("error: ", err, params);
192 va_end(params);
195 static int copy_to_sideband(int in, int out, void *arg)
197 char data[128];
198 while (1) {
199 ssize_t sz = xread(in, data, sizeof(data));
200 if (sz <= 0)
201 break;
202 send_sideband(1, 2, data, sz, use_sideband);
204 close(in);
205 return 0;
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];
211 struct command *cmd;
212 struct child_process proc;
213 struct async muxer;
214 const char *argv[2];
215 int have_input = 0, code;
217 for (cmd = commands; !have_input && cmd; cmd = cmd->next) {
218 if (!cmd->error_string)
219 have_input = 1;
222 if (!have_input || access(hook_name, X_OK) < 0)
223 return 0;
225 argv[0] = hook_name;
226 argv[1] = NULL;
228 memset(&proc, 0, sizeof(proc));
229 proc.argv = argv;
230 proc.in = -1;
231 proc.stdout_to_stderr = 1;
233 if (use_sideband) {
234 memset(&muxer, 0, sizeof(muxer));
235 muxer.proc = copy_to_sideband;
236 muxer.in = -1;
237 code = start_async(&muxer);
238 if (code)
239 return code;
240 proc.err = muxer.in;
243 code = start_command(&proc);
244 if (code) {
245 if (use_sideband)
246 finish_async(&muxer);
247 return code;
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),
255 cmd->ref_name);
256 if (write_in_full(proc.in, buf, n) != n)
257 break;
260 close(proc.in);
261 if (use_sideband)
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";
269 const char *argv[5];
270 struct child_process proc;
271 int code;
273 if (access(update_hook, X_OK) < 0)
274 return 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);
280 argv[4] = NULL;
282 memset(&proc, 0, sizeof(proc));
283 proc.no_stdin = 1;
284 proc.stdout_to_stderr = 1;
285 proc.err = use_sideband ? -1 : 0;
286 proc.argv = argv;
288 code = start_command(&proc);
289 if (code)
290 return code;
291 if (use_sideband)
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())
299 return 0;
301 if (!head_name)
302 return 0;
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",
316 "other way.",
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)
324 int i;
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)
342 int i;
343 for (i = 0;
344 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
345 i++)
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) {
369 case DENY_IGNORE:
370 break;
371 case DENY_WARN:
372 rp_warning("updating the current branch");
373 break;
374 case DENY_REFUSE:
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));
386 return "bad pack";
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) {
397 case DENY_IGNORE:
398 break;
399 case DENY_WARN:
400 rp_warning("deleting the current branch");
401 break;
402 case DENY_REFUSE:
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);
426 return "bad ref";
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))
433 break;
434 free_commit_list(bases);
435 if (!ent) {
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.");
449 old_sha1 = NULL;
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 */
457 else {
458 lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0);
459 if (!lock) {
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)
474 struct command *cmd;
475 int argc;
476 const char **argv;
477 struct child_process proc;
479 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
480 if (cmd->error_string)
481 continue;
482 argc++;
484 if (!argc || access(update_post_hook, X_OK) < 0)
485 return;
486 argv = xmalloc(sizeof(*argv) * (2 + argc));
487 argv[0] = update_post_hook;
489 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
490 char *p;
491 if (cmd->error_string)
492 continue;
493 p = xmalloc(strlen(cmd->ref_name) + 1);
494 strcpy(p, cmd->ref_name);
495 argv[argc] = p;
496 argc++;
498 argv[argc] = NULL;
500 memset(&proc, 0, sizeof(proc));
501 proc.no_stdin = 1;
502 proc.stdout_to_stderr = 1;
503 proc.err = use_sideband ? -1 : 0;
504 proc.argv = argv;
506 if (!start_command(&proc)) {
507 if (use_sideband)
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];
521 int flag;
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))
528 return;
530 dst_name = strip_namespace(dst_name);
531 if (!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";
535 return;
538 if ((item = string_list_lookup(list, dst_name)) == NULL)
539 return;
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))
547 return;
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)
566 struct command *cmd;
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)
584 struct command *cmd;
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)";
590 return;
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";
596 return;
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;
612 for (;;) {
613 static char line[1000];
614 unsigned char old_sha1[20], new_sha1[20];
615 struct command *cmd;
616 char *refname;
617 int len, reflen;
619 len = packet_read_line(0, line, sizeof(line));
620 if (!len)
621 break;
622 if (line[len-1] == '\n')
623 line[--len] = 0;
624 if (len < 83 ||
625 line[40] != ' ' ||
626 line[81] != ' ' ||
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'",
630 line);
632 refname = line + 82;
633 reflen = strlen(refname);
634 if (reflen + 82 < len) {
635 if (strstr(refname + reflen + 1, "report-status"))
636 report_status = 1;
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);
644 *p = cmd;
645 p = &cmd->next;
647 return commands;
650 static const char *parse_pack_header(struct pack_header *hdr)
652 switch (read_pack_header(0, hdr)) {
653 case PH_ERROR_EOF:
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)";
662 default:
663 return "unknown error in parse_pack_header";
665 case 0:
666 return NULL;
670 static const char *pack_lockfile;
672 static const char *unpack(void)
674 struct pack_header hdr;
675 const char *hdr_err;
676 char hdr_arg[38];
678 hdr_err = parse_pack_header(&hdr);
679 if (hdr_err)
680 return hdr_err;
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) {
686 int code, i = 0;
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);
694 if (!code)
695 return NULL;
696 return "unpack-objects abnormal exit";
697 } else {
698 const char *keeper[7];
699 int s, status, i = 0;
700 char keep_arg[256];
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;
714 keeper[i++] = NULL;
715 memset(&ip, 0, sizeof(ip));
716 ip.argv = keeper;
717 ip.out = -1;
718 ip.git_cmd = 1;
719 status = start_command(&ip);
720 if (status) {
721 return "index-pack fork failed";
723 pack_lockfile = index_pack_lockfile(ip.out);
724 close(ip.out);
725 status = finish_command(&ip);
726 if (!status) {
727 reprepare_packed_git();
728 return NULL;
730 return "index-pack abnormal exit";
734 static void report(struct command *commands, const char *unpack_status)
736 struct command *cmd;
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",
744 cmd->ref_name);
745 else
746 packet_buf_write(&buf, "ng %s %s\n",
747 cmd->ref_name, cmd->error_string);
749 packet_buf_flush(&buf);
751 if (use_sideband)
752 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
753 else
754 safe_write(1, buf.buf, buf.len);
755 strbuf_release(&buf);
758 static int delete_only(struct command *commands)
760 struct command *cmd;
761 for (cmd = commands; cmd; cmd = cmd->next) {
762 if (!is_null_sha1(cmd->new_sha1))
763 return 0;
765 return 1;
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;
791 int i;
792 char *dir = NULL;
793 struct command *commands;
795 packet_trace_identity("receive-pack");
797 argv++;
798 for (i = 1; i < argc; i++) {
799 const char *arg = *argv++;
801 if (*arg == '-') {
802 if (!strcmp(arg, "--advertise-refs")) {
803 advertise_refs = 1;
804 continue;
806 if (!strcmp(arg, "--stateless-rpc")) {
807 stateless_rpc = 1;
808 continue;
811 usage(receive_pack_usage);
813 if (dir)
814 usage(receive_pack_usage);
815 dir = xstrdup(arg);
817 if (!dir)
818 usage(receive_pack_usage);
820 setup_path();
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();
837 write_head_info();
838 clear_extra_refs();
840 /* EOF */
841 packet_flush(1);
843 if (advertise_refs)
844 return 0;
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);
852 if (pack_lockfile)
853 unlink_or_warn(pack_lockfile);
854 if (report_status)
855 report(commands, unpack_status);
856 run_receive_hook(commands, post_receive_hook);
857 run_update_post_hook(commands);
858 if (auto_gc) {
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);
867 if (use_sideband)
868 packet_flush(1);
869 return 0;