Update draft release notes to 1.7.7
[git/jrn.git] / builtin / receive-pack.c
blob60260d0aa93a878968e5ed72a2a77b96c5c0f040
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(int quiet)
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[5];
688 unpacker[i++] = "unpack-objects";
689 if (quiet)
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);
696 if (!code)
697 return NULL;
698 return "unpack-objects abnormal exit";
699 } else {
700 const char *keeper[7];
701 int s, status, i = 0;
702 char keep_arg[256];
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;
716 keeper[i++] = NULL;
717 memset(&ip, 0, sizeof(ip));
718 ip.argv = keeper;
719 ip.out = -1;
720 ip.git_cmd = 1;
721 status = start_command(&ip);
722 if (status) {
723 return "index-pack fork failed";
725 pack_lockfile = index_pack_lockfile(ip.out);
726 close(ip.out);
727 status = finish_command(&ip);
728 if (!status) {
729 reprepare_packed_git();
730 return NULL;
732 return "index-pack abnormal exit";
736 static void report(struct command *commands, const char *unpack_status)
738 struct command *cmd;
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",
746 cmd->ref_name);
747 else
748 packet_buf_write(&buf, "ng %s %s\n",
749 cmd->ref_name, cmd->error_string);
751 packet_buf_flush(&buf);
753 if (use_sideband)
754 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
755 else
756 safe_write(1, buf.buf, buf.len);
757 strbuf_release(&buf);
760 static int delete_only(struct command *commands)
762 struct command *cmd;
763 for (cmd = commands; cmd; cmd = cmd->next) {
764 if (!is_null_sha1(cmd->new_sha1))
765 return 0;
767 return 1;
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)
791 int quiet = 0;
792 int advertise_refs = 0;
793 int stateless_rpc = 0;
794 int i;
795 char *dir = NULL;
796 struct command *commands;
798 packet_trace_identity("receive-pack");
800 argv++;
801 for (i = 1; i < argc; i++) {
802 const char *arg = *argv++;
804 if (*arg == '-') {
805 if (!strcmp(arg, "--quiet")) {
806 quiet = 1;
807 continue;
810 if (!strcmp(arg, "--advertise-refs")) {
811 advertise_refs = 1;
812 continue;
814 if (!strcmp(arg, "--stateless-rpc")) {
815 stateless_rpc = 1;
816 continue;
819 usage(receive_pack_usage);
821 if (dir)
822 usage(receive_pack_usage);
823 dir = xstrdup(arg);
825 if (!dir)
826 usage(receive_pack_usage);
828 setup_path();
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();
845 write_head_info();
846 clear_extra_refs();
848 /* EOF */
849 packet_flush(1);
851 if (advertise_refs)
852 return 0;
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);
860 if (pack_lockfile)
861 unlink_or_warn(pack_lockfile);
862 if (report_status)
863 report(commands, unpack_status);
864 run_receive_hook(commands, post_receive_hook);
865 run_update_post_hook(commands);
866 if (auto_gc) {
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);
875 if (use_sideband)
876 packet_flush(1);
877 return 0;