fast-import.c: use a ref transaction when dumping tags
[git/git-svn.git] / builtin / receive-pack.c
blob224fadccc31108104d727ec2a3961304a78b779f
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 "connect.h"
12 #include "transport.h"
13 #include "string-list.h"
14 #include "sha1-array.h"
15 #include "connected.h"
16 #include "argv-array.h"
17 #include "version.h"
19 static const char receive_pack_usage[] = "git receive-pack <git-dir>";
21 enum deny_action {
22 DENY_UNCONFIGURED,
23 DENY_IGNORE,
24 DENY_WARN,
25 DENY_REFUSE
28 static int deny_deletes;
29 static int deny_non_fast_forwards;
30 static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
31 static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
32 static int receive_fsck_objects = -1;
33 static int transfer_fsck_objects = -1;
34 static int receive_unpack_limit = -1;
35 static int transfer_unpack_limit = -1;
36 static int unpack_limit = 100;
37 static int report_status;
38 static int use_sideband;
39 static int quiet;
40 static int prefer_ofs_delta = 1;
41 static int auto_update_server_info;
42 static int auto_gc = 1;
43 static int fix_thin = 1;
44 static const char *head_name;
45 static void *head_name_to_free;
46 static int sent_capabilities;
47 static int shallow_update;
48 static const char *alt_shallow_file;
50 static enum deny_action parse_deny_action(const char *var, const char *value)
52 if (value) {
53 if (!strcasecmp(value, "ignore"))
54 return DENY_IGNORE;
55 if (!strcasecmp(value, "warn"))
56 return DENY_WARN;
57 if (!strcasecmp(value, "refuse"))
58 return DENY_REFUSE;
60 if (git_config_bool(var, value))
61 return DENY_REFUSE;
62 return DENY_IGNORE;
65 static int receive_pack_config(const char *var, const char *value, void *cb)
67 int status = parse_hide_refs_config(var, value, "receive");
69 if (status)
70 return status;
72 if (strcmp(var, "receive.denydeletes") == 0) {
73 deny_deletes = git_config_bool(var, value);
74 return 0;
77 if (strcmp(var, "receive.denynonfastforwards") == 0) {
78 deny_non_fast_forwards = git_config_bool(var, value);
79 return 0;
82 if (strcmp(var, "receive.unpacklimit") == 0) {
83 receive_unpack_limit = git_config_int(var, value);
84 return 0;
87 if (strcmp(var, "transfer.unpacklimit") == 0) {
88 transfer_unpack_limit = git_config_int(var, value);
89 return 0;
92 if (strcmp(var, "receive.fsckobjects") == 0) {
93 receive_fsck_objects = git_config_bool(var, value);
94 return 0;
97 if (strcmp(var, "transfer.fsckobjects") == 0) {
98 transfer_fsck_objects = git_config_bool(var, value);
99 return 0;
102 if (!strcmp(var, "receive.denycurrentbranch")) {
103 deny_current_branch = parse_deny_action(var, value);
104 return 0;
107 if (strcmp(var, "receive.denydeletecurrent") == 0) {
108 deny_delete_current = parse_deny_action(var, value);
109 return 0;
112 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
113 prefer_ofs_delta = git_config_bool(var, value);
114 return 0;
117 if (strcmp(var, "receive.updateserverinfo") == 0) {
118 auto_update_server_info = git_config_bool(var, value);
119 return 0;
122 if (strcmp(var, "receive.autogc") == 0) {
123 auto_gc = git_config_bool(var, value);
124 return 0;
127 if (strcmp(var, "receive.shallowupdate") == 0) {
128 shallow_update = git_config_bool(var, value);
129 return 0;
132 return git_default_config(var, value, cb);
135 static void show_ref(const char *path, const unsigned char *sha1)
137 if (ref_is_hidden(path))
138 return;
140 if (sent_capabilities)
141 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
142 else
143 packet_write(1, "%s %s%c%s%s agent=%s\n",
144 sha1_to_hex(sha1), path, 0,
145 " report-status delete-refs side-band-64k quiet",
146 prefer_ofs_delta ? " ofs-delta" : "",
147 git_user_agent_sanitized());
148 sent_capabilities = 1;
151 static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
153 path = strip_namespace(path);
155 * Advertise refs outside our current namespace as ".have"
156 * refs, so that the client can use them to minimize data
157 * transfer but will otherwise ignore them. This happens to
158 * cover ".have" that are thrown in by add_one_alternate_ref()
159 * to mark histories that are complete in our alternates as
160 * well.
162 if (!path)
163 path = ".have";
164 show_ref(path, sha1);
165 return 0;
168 static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
170 show_ref(".have", sha1);
173 static void collect_one_alternate_ref(const struct ref *ref, void *data)
175 struct sha1_array *sa = data;
176 sha1_array_append(sa, ref->old_sha1);
179 static void write_head_info(void)
181 struct sha1_array sa = SHA1_ARRAY_INIT;
182 for_each_alternate_ref(collect_one_alternate_ref, &sa);
183 sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
184 sha1_array_clear(&sa);
185 for_each_ref(show_ref_cb, NULL);
186 if (!sent_capabilities)
187 show_ref("capabilities^{}", null_sha1);
189 advertise_shallow_grafts(1);
191 /* EOF */
192 packet_flush(1);
195 struct command {
196 struct command *next;
197 const char *error_string;
198 unsigned int skip_update:1,
199 did_not_exist:1;
200 int index;
201 unsigned char old_sha1[20];
202 unsigned char new_sha1[20];
203 char ref_name[FLEX_ARRAY]; /* more */
206 static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
207 static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
209 static void report_message(const char *prefix, const char *err, va_list params)
211 int sz = strlen(prefix);
212 char msg[4096];
214 strncpy(msg, prefix, sz);
215 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
216 if (sz > (sizeof(msg) - 1))
217 sz = sizeof(msg) - 1;
218 msg[sz++] = '\n';
220 if (use_sideband)
221 send_sideband(1, 2, msg, sz, use_sideband);
222 else
223 xwrite(2, msg, sz);
226 static void rp_warning(const char *err, ...)
228 va_list params;
229 va_start(params, err);
230 report_message("warning: ", err, params);
231 va_end(params);
234 static void rp_error(const char *err, ...)
236 va_list params;
237 va_start(params, err);
238 report_message("error: ", err, params);
239 va_end(params);
242 static int copy_to_sideband(int in, int out, void *arg)
244 char data[128];
245 while (1) {
246 ssize_t sz = xread(in, data, sizeof(data));
247 if (sz <= 0)
248 break;
249 send_sideband(1, 2, data, sz, use_sideband);
251 close(in);
252 return 0;
255 typedef int (*feed_fn)(void *, const char **, size_t *);
256 static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
258 struct child_process proc;
259 struct async muxer;
260 const char *argv[2];
261 int code;
263 argv[0] = find_hook(hook_name);
264 if (!argv[0])
265 return 0;
267 argv[1] = NULL;
269 memset(&proc, 0, sizeof(proc));
270 proc.argv = argv;
271 proc.in = -1;
272 proc.stdout_to_stderr = 1;
274 if (use_sideband) {
275 memset(&muxer, 0, sizeof(muxer));
276 muxer.proc = copy_to_sideband;
277 muxer.in = -1;
278 code = start_async(&muxer);
279 if (code)
280 return code;
281 proc.err = muxer.in;
284 code = start_command(&proc);
285 if (code) {
286 if (use_sideband)
287 finish_async(&muxer);
288 return code;
291 while (1) {
292 const char *buf;
293 size_t n;
294 if (feed(feed_state, &buf, &n))
295 break;
296 if (write_in_full(proc.in, buf, n) != n)
297 break;
299 close(proc.in);
300 if (use_sideband)
301 finish_async(&muxer);
302 return finish_command(&proc);
305 struct receive_hook_feed_state {
306 struct command *cmd;
307 int skip_broken;
308 struct strbuf buf;
311 static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
313 struct receive_hook_feed_state *state = state_;
314 struct command *cmd = state->cmd;
316 while (cmd &&
317 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
318 cmd = cmd->next;
319 if (!cmd)
320 return -1; /* EOF */
321 strbuf_reset(&state->buf);
322 strbuf_addf(&state->buf, "%s %s %s\n",
323 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
324 cmd->ref_name);
325 state->cmd = cmd->next;
326 if (bufp) {
327 *bufp = state->buf.buf;
328 *sizep = state->buf.len;
330 return 0;
333 static int run_receive_hook(struct command *commands, const char *hook_name,
334 int skip_broken)
336 struct receive_hook_feed_state state;
337 int status;
339 strbuf_init(&state.buf, 0);
340 state.cmd = commands;
341 state.skip_broken = skip_broken;
342 if (feed_receive_hook(&state, NULL, NULL))
343 return 0;
344 state.cmd = commands;
345 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
346 strbuf_release(&state.buf);
347 return status;
350 static int run_update_hook(struct command *cmd)
352 const char *argv[5];
353 struct child_process proc;
354 int code;
356 argv[0] = find_hook("update");
357 if (!argv[0])
358 return 0;
360 argv[1] = cmd->ref_name;
361 argv[2] = sha1_to_hex(cmd->old_sha1);
362 argv[3] = sha1_to_hex(cmd->new_sha1);
363 argv[4] = NULL;
365 memset(&proc, 0, sizeof(proc));
366 proc.no_stdin = 1;
367 proc.stdout_to_stderr = 1;
368 proc.err = use_sideband ? -1 : 0;
369 proc.argv = argv;
371 code = start_command(&proc);
372 if (code)
373 return code;
374 if (use_sideband)
375 copy_to_sideband(proc.err, -1, NULL);
376 return finish_command(&proc);
379 static int is_ref_checked_out(const char *ref)
381 if (is_bare_repository())
382 return 0;
384 if (!head_name)
385 return 0;
386 return !strcmp(head_name, ref);
389 static char *refuse_unconfigured_deny_msg[] = {
390 "By default, updating the current branch in a non-bare repository",
391 "is denied, because it will make the index and work tree inconsistent",
392 "with what you pushed, and will require 'git reset --hard' to match",
393 "the work tree to HEAD.",
395 "You can set 'receive.denyCurrentBranch' configuration variable to",
396 "'ignore' or 'warn' in the remote repository to allow pushing into",
397 "its current branch; however, this is not recommended unless you",
398 "arranged to update its work tree to match what you pushed in some",
399 "other way.",
401 "To squelch this message and still keep the default behaviour, set",
402 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
405 static void refuse_unconfigured_deny(void)
407 int i;
408 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
409 rp_error("%s", refuse_unconfigured_deny_msg[i]);
412 static char *refuse_unconfigured_deny_delete_current_msg[] = {
413 "By default, deleting the current branch is denied, because the next",
414 "'git clone' won't result in any file checked out, causing confusion.",
416 "You can set 'receive.denyDeleteCurrent' configuration variable to",
417 "'warn' or 'ignore' in the remote repository to allow deleting the",
418 "current branch, with or without a warning message.",
420 "To squelch this message, you can set it to 'refuse'."
423 static void refuse_unconfigured_deny_delete_current(void)
425 int i;
426 for (i = 0;
427 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
428 i++)
429 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
432 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]);
433 static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
435 static struct lock_file shallow_lock;
436 struct sha1_array extra = SHA1_ARRAY_INIT;
437 const char *alt_file;
438 uint32_t mask = 1 << (cmd->index % 32);
439 int i;
441 trace_printf_key("GIT_TRACE_SHALLOW",
442 "shallow: update_shallow_ref %s\n", cmd->ref_name);
443 for (i = 0; i < si->shallow->nr; i++)
444 if (si->used_shallow[i] &&
445 (si->used_shallow[i][cmd->index / 32] & mask) &&
446 !delayed_reachability_test(si, i))
447 sha1_array_append(&extra, si->shallow->sha1[i]);
449 setup_alternate_shallow(&shallow_lock, &alt_file, &extra);
450 if (check_shallow_connected(command_singleton_iterator,
451 0, cmd, alt_file)) {
452 rollback_lock_file(&shallow_lock);
453 sha1_array_clear(&extra);
454 return -1;
457 commit_lock_file(&shallow_lock);
460 * Make sure setup_alternate_shallow() for the next ref does
461 * not lose these new roots..
463 for (i = 0; i < extra.nr; i++)
464 register_shallow(extra.sha1[i]);
466 si->shallow_ref[cmd->index] = 0;
467 sha1_array_clear(&extra);
468 return 0;
471 static const char *update(struct command *cmd, struct shallow_info *si)
473 const char *name = cmd->ref_name;
474 struct strbuf namespaced_name_buf = STRBUF_INIT;
475 const char *namespaced_name;
476 unsigned char *old_sha1 = cmd->old_sha1;
477 unsigned char *new_sha1 = cmd->new_sha1;
479 /* only refs/... are allowed */
480 if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
481 rp_error("refusing to create funny ref '%s' remotely", name);
482 return "funny refname";
485 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
486 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
488 if (is_ref_checked_out(namespaced_name)) {
489 switch (deny_current_branch) {
490 case DENY_IGNORE:
491 break;
492 case DENY_WARN:
493 rp_warning("updating the current branch");
494 break;
495 case DENY_REFUSE:
496 case DENY_UNCONFIGURED:
497 rp_error("refusing to update checked out branch: %s", name);
498 if (deny_current_branch == DENY_UNCONFIGURED)
499 refuse_unconfigured_deny();
500 return "branch is currently checked out";
504 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
505 error("unpack should have generated %s, "
506 "but I can't find it!", sha1_to_hex(new_sha1));
507 return "bad pack";
510 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
511 if (deny_deletes && starts_with(name, "refs/heads/")) {
512 rp_error("denying ref deletion for %s", name);
513 return "deletion prohibited";
516 if (!strcmp(namespaced_name, head_name)) {
517 switch (deny_delete_current) {
518 case DENY_IGNORE:
519 break;
520 case DENY_WARN:
521 rp_warning("deleting the current branch");
522 break;
523 case DENY_REFUSE:
524 case DENY_UNCONFIGURED:
525 if (deny_delete_current == DENY_UNCONFIGURED)
526 refuse_unconfigured_deny_delete_current();
527 rp_error("refusing to delete the current branch: %s", name);
528 return "deletion of the current branch prohibited";
533 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
534 !is_null_sha1(old_sha1) &&
535 starts_with(name, "refs/heads/")) {
536 struct object *old_object, *new_object;
537 struct commit *old_commit, *new_commit;
539 old_object = parse_object(old_sha1);
540 new_object = parse_object(new_sha1);
542 if (!old_object || !new_object ||
543 old_object->type != OBJ_COMMIT ||
544 new_object->type != OBJ_COMMIT) {
545 error("bad sha1 objects for %s", name);
546 return "bad ref";
548 old_commit = (struct commit *)old_object;
549 new_commit = (struct commit *)new_object;
550 if (!in_merge_bases(old_commit, new_commit)) {
551 rp_error("denying non-fast-forward %s"
552 " (you should pull first)", name);
553 return "non-fast-forward";
556 if (run_update_hook(cmd)) {
557 rp_error("hook declined to update %s", name);
558 return "hook declined";
561 if (is_null_sha1(new_sha1)) {
562 if (!parse_object(old_sha1)) {
563 old_sha1 = NULL;
564 if (ref_exists(name)) {
565 rp_warning("Allowing deletion of corrupt ref.");
566 } else {
567 rp_warning("Deleting a non-existent ref.");
568 cmd->did_not_exist = 1;
571 if (delete_ref(namespaced_name, old_sha1, 0)) {
572 rp_error("failed to delete %s", name);
573 return "failed to delete";
575 return NULL; /* good */
577 else {
578 struct strbuf err = STRBUF_INIT;
579 struct ref_transaction *transaction;
581 if (shallow_update && si->shallow_ref[cmd->index] &&
582 update_shallow_ref(cmd, si))
583 return "shallow error";
585 transaction = ref_transaction_begin(&err);
586 if (!transaction ||
587 ref_transaction_update(transaction, namespaced_name,
588 new_sha1, old_sha1, 0, 1, &err) ||
589 ref_transaction_commit(transaction, "push", &err)) {
590 ref_transaction_free(transaction);
592 rp_error("%s", err.buf);
593 strbuf_release(&err);
594 return "failed to update ref";
597 ref_transaction_free(transaction);
598 strbuf_release(&err);
599 return NULL; /* good */
603 static void run_update_post_hook(struct command *commands)
605 struct command *cmd;
606 int argc;
607 const char **argv;
608 struct child_process proc;
609 char *hook;
611 hook = find_hook("post-update");
612 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
613 if (cmd->error_string || cmd->did_not_exist)
614 continue;
615 argc++;
617 if (!argc || !hook)
618 return;
620 argv = xmalloc(sizeof(*argv) * (2 + argc));
621 argv[0] = hook;
623 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
624 char *p;
625 if (cmd->error_string || cmd->did_not_exist)
626 continue;
627 p = xmalloc(strlen(cmd->ref_name) + 1);
628 strcpy(p, cmd->ref_name);
629 argv[argc] = p;
630 argc++;
632 argv[argc] = NULL;
634 memset(&proc, 0, sizeof(proc));
635 proc.no_stdin = 1;
636 proc.stdout_to_stderr = 1;
637 proc.err = use_sideband ? -1 : 0;
638 proc.argv = argv;
640 if (!start_command(&proc)) {
641 if (use_sideband)
642 copy_to_sideband(proc.err, -1, NULL);
643 finish_command(&proc);
647 static void check_aliased_update(struct command *cmd, struct string_list *list)
649 struct strbuf buf = STRBUF_INIT;
650 const char *dst_name;
651 struct string_list_item *item;
652 struct command *dst_cmd;
653 unsigned char sha1[20];
654 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
655 int flag;
657 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
658 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
659 strbuf_release(&buf);
661 if (!(flag & REF_ISSYMREF))
662 return;
664 dst_name = strip_namespace(dst_name);
665 if (!dst_name) {
666 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
667 cmd->skip_update = 1;
668 cmd->error_string = "broken symref";
669 return;
672 if ((item = string_list_lookup(list, dst_name)) == NULL)
673 return;
675 cmd->skip_update = 1;
677 dst_cmd = (struct command *) item->util;
679 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
680 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
681 return;
683 dst_cmd->skip_update = 1;
685 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
686 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
687 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
688 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
689 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
690 " its target '%s' (%s..%s)",
691 cmd->ref_name, cmd_oldh, cmd_newh,
692 dst_cmd->ref_name, dst_oldh, dst_newh);
694 cmd->error_string = dst_cmd->error_string =
695 "inconsistent aliased update";
698 static void check_aliased_updates(struct command *commands)
700 struct command *cmd;
701 struct string_list ref_list = STRING_LIST_INIT_NODUP;
703 for (cmd = commands; cmd; cmd = cmd->next) {
704 struct string_list_item *item =
705 string_list_append(&ref_list, cmd->ref_name);
706 item->util = (void *)cmd;
708 sort_string_list(&ref_list);
710 for (cmd = commands; cmd; cmd = cmd->next) {
711 if (!cmd->error_string)
712 check_aliased_update(cmd, &ref_list);
715 string_list_clear(&ref_list, 0);
718 static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
720 struct command **cmd_list = cb_data;
721 struct command *cmd = *cmd_list;
723 if (!cmd || is_null_sha1(cmd->new_sha1))
724 return -1; /* end of list */
725 *cmd_list = NULL; /* this returns only one */
726 hashcpy(sha1, cmd->new_sha1);
727 return 0;
730 static void set_connectivity_errors(struct command *commands,
731 struct shallow_info *si)
733 struct command *cmd;
735 for (cmd = commands; cmd; cmd = cmd->next) {
736 struct command *singleton = cmd;
737 if (shallow_update && si->shallow_ref[cmd->index])
738 /* to be checked in update_shallow_ref() */
739 continue;
740 if (!check_everything_connected(command_singleton_iterator,
741 0, &singleton))
742 continue;
743 cmd->error_string = "missing necessary objects";
747 struct iterate_data {
748 struct command *cmds;
749 struct shallow_info *si;
752 static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
754 struct iterate_data *data = cb_data;
755 struct command **cmd_list = &data->cmds;
756 struct command *cmd = *cmd_list;
758 for (; cmd; cmd = cmd->next) {
759 if (shallow_update && data->si->shallow_ref[cmd->index])
760 /* to be checked in update_shallow_ref() */
761 continue;
762 if (!is_null_sha1(cmd->new_sha1) && !cmd->skip_update) {
763 hashcpy(sha1, cmd->new_sha1);
764 *cmd_list = cmd->next;
765 return 0;
768 *cmd_list = NULL;
769 return -1; /* end of list */
772 static void reject_updates_to_hidden(struct command *commands)
774 struct command *cmd;
776 for (cmd = commands; cmd; cmd = cmd->next) {
777 if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
778 continue;
779 if (is_null_sha1(cmd->new_sha1))
780 cmd->error_string = "deny deleting a hidden ref";
781 else
782 cmd->error_string = "deny updating a hidden ref";
786 static void execute_commands(struct command *commands,
787 const char *unpacker_error,
788 struct shallow_info *si)
790 int checked_connectivity;
791 struct command *cmd;
792 unsigned char sha1[20];
793 struct iterate_data data;
795 if (unpacker_error) {
796 for (cmd = commands; cmd; cmd = cmd->next)
797 cmd->error_string = "unpacker error";
798 return;
801 data.cmds = commands;
802 data.si = si;
803 if (check_everything_connected(iterate_receive_command_list, 0, &data))
804 set_connectivity_errors(commands, si);
806 reject_updates_to_hidden(commands);
808 if (run_receive_hook(commands, "pre-receive", 0)) {
809 for (cmd = commands; cmd; cmd = cmd->next) {
810 if (!cmd->error_string)
811 cmd->error_string = "pre-receive hook declined";
813 return;
816 check_aliased_updates(commands);
818 free(head_name_to_free);
819 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
821 checked_connectivity = 1;
822 for (cmd = commands; cmd; cmd = cmd->next) {
823 if (cmd->error_string)
824 continue;
826 if (cmd->skip_update)
827 continue;
829 cmd->error_string = update(cmd, si);
830 if (shallow_update && !cmd->error_string &&
831 si->shallow_ref[cmd->index]) {
832 error("BUG: connectivity check has not been run on ref %s",
833 cmd->ref_name);
834 checked_connectivity = 0;
838 if (shallow_update && !checked_connectivity)
839 error("BUG: run 'git fsck' for safety.\n"
840 "If there are errors, try to remove "
841 "the reported refs above");
844 static struct command *read_head_info(struct sha1_array *shallow)
846 struct command *commands = NULL;
847 struct command **p = &commands;
848 for (;;) {
849 char *line;
850 unsigned char old_sha1[20], new_sha1[20];
851 struct command *cmd;
852 char *refname;
853 int len, reflen;
855 line = packet_read_line(0, &len);
856 if (!line)
857 break;
859 if (len == 48 && starts_with(line, "shallow ")) {
860 if (get_sha1_hex(line + 8, old_sha1))
861 die("protocol error: expected shallow sha, got '%s'", line + 8);
862 sha1_array_append(shallow, old_sha1);
863 continue;
866 if (len < 83 ||
867 line[40] != ' ' ||
868 line[81] != ' ' ||
869 get_sha1_hex(line, old_sha1) ||
870 get_sha1_hex(line + 41, new_sha1))
871 die("protocol error: expected old/new/ref, got '%s'",
872 line);
874 refname = line + 82;
875 reflen = strlen(refname);
876 if (reflen + 82 < len) {
877 const char *feature_list = refname + reflen + 1;
878 if (parse_feature_request(feature_list, "report-status"))
879 report_status = 1;
880 if (parse_feature_request(feature_list, "side-band-64k"))
881 use_sideband = LARGE_PACKET_MAX;
882 if (parse_feature_request(feature_list, "quiet"))
883 quiet = 1;
885 cmd = xcalloc(1, sizeof(struct command) + len - 80);
886 hashcpy(cmd->old_sha1, old_sha1);
887 hashcpy(cmd->new_sha1, new_sha1);
888 memcpy(cmd->ref_name, line + 82, len - 81);
889 *p = cmd;
890 p = &cmd->next;
892 return commands;
895 static const char *parse_pack_header(struct pack_header *hdr)
897 switch (read_pack_header(0, hdr)) {
898 case PH_ERROR_EOF:
899 return "eof before pack header was fully read";
901 case PH_ERROR_PACK_SIGNATURE:
902 return "protocol error (pack signature mismatch detected)";
904 case PH_ERROR_PROTOCOL:
905 return "protocol error (pack version unsupported)";
907 default:
908 return "unknown error in parse_pack_header";
910 case 0:
911 return NULL;
915 static const char *pack_lockfile;
917 static const char *unpack(int err_fd, struct shallow_info *si)
919 struct pack_header hdr;
920 struct argv_array av = ARGV_ARRAY_INIT;
921 const char *hdr_err;
922 int status;
923 char hdr_arg[38];
924 struct child_process child;
925 int fsck_objects = (receive_fsck_objects >= 0
926 ? receive_fsck_objects
927 : transfer_fsck_objects >= 0
928 ? transfer_fsck_objects
929 : 0);
931 hdr_err = parse_pack_header(&hdr);
932 if (hdr_err) {
933 if (err_fd > 0)
934 close(err_fd);
935 return hdr_err;
937 snprintf(hdr_arg, sizeof(hdr_arg),
938 "--pack_header=%"PRIu32",%"PRIu32,
939 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
941 if (si->nr_ours || si->nr_theirs) {
942 alt_shallow_file = setup_temporary_shallow(si->shallow);
943 argv_array_pushl(&av, "--shallow-file", alt_shallow_file, NULL);
946 memset(&child, 0, sizeof(child));
947 if (ntohl(hdr.hdr_entries) < unpack_limit) {
948 argv_array_pushl(&av, "unpack-objects", hdr_arg, NULL);
949 if (quiet)
950 argv_array_push(&av, "-q");
951 if (fsck_objects)
952 argv_array_push(&av, "--strict");
953 child.argv = av.argv;
954 child.no_stdout = 1;
955 child.err = err_fd;
956 child.git_cmd = 1;
957 status = run_command(&child);
958 if (status)
959 return "unpack-objects abnormal exit";
960 } else {
961 int s;
962 char keep_arg[256];
964 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
965 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
966 strcpy(keep_arg + s, "localhost");
968 argv_array_pushl(&av, "index-pack",
969 "--stdin", hdr_arg, keep_arg, NULL);
970 if (fsck_objects)
971 argv_array_push(&av, "--strict");
972 if (fix_thin)
973 argv_array_push(&av, "--fix-thin");
974 child.argv = av.argv;
975 child.out = -1;
976 child.err = err_fd;
977 child.git_cmd = 1;
978 status = start_command(&child);
979 if (status)
980 return "index-pack fork failed";
981 pack_lockfile = index_pack_lockfile(child.out);
982 close(child.out);
983 status = finish_command(&child);
984 if (status)
985 return "index-pack abnormal exit";
986 reprepare_packed_git();
988 return NULL;
991 static const char *unpack_with_sideband(struct shallow_info *si)
993 struct async muxer;
994 const char *ret;
996 if (!use_sideband)
997 return unpack(0, si);
999 memset(&muxer, 0, sizeof(muxer));
1000 muxer.proc = copy_to_sideband;
1001 muxer.in = -1;
1002 if (start_async(&muxer))
1003 return NULL;
1005 ret = unpack(muxer.in, si);
1007 finish_async(&muxer);
1008 return ret;
1011 static void prepare_shallow_update(struct command *commands,
1012 struct shallow_info *si)
1014 int i, j, k, bitmap_size = (si->ref->nr + 31) / 32;
1016 si->used_shallow = xmalloc(sizeof(*si->used_shallow) *
1017 si->shallow->nr);
1018 assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
1020 si->need_reachability_test =
1021 xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
1022 si->reachable =
1023 xcalloc(si->shallow->nr, sizeof(*si->reachable));
1024 si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
1026 for (i = 0; i < si->nr_ours; i++)
1027 si->need_reachability_test[si->ours[i]] = 1;
1029 for (i = 0; i < si->shallow->nr; i++) {
1030 if (!si->used_shallow[i])
1031 continue;
1032 for (j = 0; j < bitmap_size; j++) {
1033 if (!si->used_shallow[i][j])
1034 continue;
1035 si->need_reachability_test[i]++;
1036 for (k = 0; k < 32; k++)
1037 if (si->used_shallow[i][j] & (1 << k))
1038 si->shallow_ref[j * 32 + k]++;
1042 * true for those associated with some refs and belong
1043 * in "ours" list aka "step 7 not done yet"
1045 si->need_reachability_test[i] =
1046 si->need_reachability_test[i] > 1;
1050 * keep hooks happy by forcing a temporary shallow file via
1051 * env variable because we can't add --shallow-file to every
1052 * command. check_everything_connected() will be done with
1053 * true .git/shallow though.
1055 setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
1058 static void update_shallow_info(struct command *commands,
1059 struct shallow_info *si,
1060 struct sha1_array *ref)
1062 struct command *cmd;
1063 int *ref_status;
1064 remove_nonexistent_theirs_shallow(si);
1065 if (!si->nr_ours && !si->nr_theirs) {
1066 shallow_update = 0;
1067 return;
1070 for (cmd = commands; cmd; cmd = cmd->next) {
1071 if (is_null_sha1(cmd->new_sha1))
1072 continue;
1073 sha1_array_append(ref, cmd->new_sha1);
1074 cmd->index = ref->nr - 1;
1076 si->ref = ref;
1078 if (shallow_update) {
1079 prepare_shallow_update(commands, si);
1080 return;
1083 ref_status = xmalloc(sizeof(*ref_status) * ref->nr);
1084 assign_shallow_commits_to_refs(si, NULL, ref_status);
1085 for (cmd = commands; cmd; cmd = cmd->next) {
1086 if (is_null_sha1(cmd->new_sha1))
1087 continue;
1088 if (ref_status[cmd->index]) {
1089 cmd->error_string = "shallow update not allowed";
1090 cmd->skip_update = 1;
1093 free(ref_status);
1096 static void report(struct command *commands, const char *unpack_status)
1098 struct command *cmd;
1099 struct strbuf buf = STRBUF_INIT;
1101 packet_buf_write(&buf, "unpack %s\n",
1102 unpack_status ? unpack_status : "ok");
1103 for (cmd = commands; cmd; cmd = cmd->next) {
1104 if (!cmd->error_string)
1105 packet_buf_write(&buf, "ok %s\n",
1106 cmd->ref_name);
1107 else
1108 packet_buf_write(&buf, "ng %s %s\n",
1109 cmd->ref_name, cmd->error_string);
1111 packet_buf_flush(&buf);
1113 if (use_sideband)
1114 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
1115 else
1116 write_or_die(1, buf.buf, buf.len);
1117 strbuf_release(&buf);
1120 static int delete_only(struct command *commands)
1122 struct command *cmd;
1123 for (cmd = commands; cmd; cmd = cmd->next) {
1124 if (!is_null_sha1(cmd->new_sha1))
1125 return 0;
1127 return 1;
1130 int cmd_receive_pack(int argc, const char **argv, const char *prefix)
1132 int advertise_refs = 0;
1133 int stateless_rpc = 0;
1134 int i;
1135 char *dir = NULL;
1136 struct command *commands;
1137 struct sha1_array shallow = SHA1_ARRAY_INIT;
1138 struct sha1_array ref = SHA1_ARRAY_INIT;
1139 struct shallow_info si;
1141 packet_trace_identity("receive-pack");
1143 argv++;
1144 for (i = 1; i < argc; i++) {
1145 const char *arg = *argv++;
1147 if (*arg == '-') {
1148 if (!strcmp(arg, "--quiet")) {
1149 quiet = 1;
1150 continue;
1153 if (!strcmp(arg, "--advertise-refs")) {
1154 advertise_refs = 1;
1155 continue;
1157 if (!strcmp(arg, "--stateless-rpc")) {
1158 stateless_rpc = 1;
1159 continue;
1161 if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
1162 fix_thin = 0;
1163 continue;
1166 usage(receive_pack_usage);
1168 if (dir)
1169 usage(receive_pack_usage);
1170 dir = xstrdup(arg);
1172 if (!dir)
1173 usage(receive_pack_usage);
1175 setup_path();
1177 if (!enter_repo(dir, 0))
1178 die("'%s' does not appear to be a git repository", dir);
1180 git_config(receive_pack_config, NULL);
1182 if (0 <= transfer_unpack_limit)
1183 unpack_limit = transfer_unpack_limit;
1184 else if (0 <= receive_unpack_limit)
1185 unpack_limit = receive_unpack_limit;
1187 if (advertise_refs || !stateless_rpc) {
1188 write_head_info();
1190 if (advertise_refs)
1191 return 0;
1193 if ((commands = read_head_info(&shallow)) != NULL) {
1194 const char *unpack_status = NULL;
1196 prepare_shallow_info(&si, &shallow);
1197 if (!si.nr_ours && !si.nr_theirs)
1198 shallow_update = 0;
1199 if (!delete_only(commands)) {
1200 unpack_status = unpack_with_sideband(&si);
1201 update_shallow_info(commands, &si, &ref);
1203 execute_commands(commands, unpack_status, &si);
1204 if (pack_lockfile)
1205 unlink_or_warn(pack_lockfile);
1206 if (report_status)
1207 report(commands, unpack_status);
1208 run_receive_hook(commands, "post-receive", 1);
1209 run_update_post_hook(commands);
1210 if (auto_gc) {
1211 const char *argv_gc_auto[] = {
1212 "gc", "--auto", "--quiet", NULL,
1214 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1215 run_command_v_opt(argv_gc_auto, opt);
1217 if (auto_update_server_info)
1218 update_server_info(0);
1219 clear_shallow_info(&si);
1221 if (use_sideband)
1222 packet_flush(1);
1223 sha1_array_clear(&shallow);
1224 sha1_array_clear(&ref);
1225 return 0;