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"
14#include "connected.h"
15
16static const char receive_pack_usage[] = "git receive-pack <git-dir>";
17
18enum deny_action {
19 DENY_UNCONFIGURED,
20 DENY_IGNORE,
21 DENY_WARN,
22 DENY_REFUSE
23};
24
25static int deny_deletes;
26static int deny_non_fast_forwards;
27static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
28static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
29static int receive_fsck_objects = -1;
30static int transfer_fsck_objects = -1;
31static int receive_unpack_limit = -1;
32static int transfer_unpack_limit = -1;
33static int unpack_limit = 100;
34static int report_status;
35static int use_sideband;
36static int prefer_ofs_delta = 1;
37static int auto_update_server_info;
38static int auto_gc = 1;
39static const char *head_name;
40static int sent_capabilities;
41
42static enum deny_action parse_deny_action(const char *var, const char *value)
43{
44 if (value) {
45 if (!strcasecmp(value, "ignore"))
46 return DENY_IGNORE;
47 if (!strcasecmp(value, "warn"))
48 return DENY_WARN;
49 if (!strcasecmp(value, "refuse"))
50 return DENY_REFUSE;
51 }
52 if (git_config_bool(var, value))
53 return DENY_REFUSE;
54 return DENY_IGNORE;
55}
56
57static int receive_pack_config(const char *var, const char *value, void *cb)
58{
59 if (strcmp(var, "receive.denydeletes") == 0) {
60 deny_deletes = git_config_bool(var, value);
61 return 0;
62 }
63
64 if (strcmp(var, "receive.denynonfastforwards") == 0) {
65 deny_non_fast_forwards = git_config_bool(var, value);
66 return 0;
67 }
68
69 if (strcmp(var, "receive.unpacklimit") == 0) {
70 receive_unpack_limit = git_config_int(var, value);
71 return 0;
72 }
73
74 if (strcmp(var, "transfer.unpacklimit") == 0) {
75 transfer_unpack_limit = git_config_int(var, value);
76 return 0;
77 }
78
79 if (strcmp(var, "receive.fsckobjects") == 0) {
80 receive_fsck_objects = git_config_bool(var, value);
81 return 0;
82 }
83
84 if (strcmp(var, "transfer.fsckobjects") == 0) {
85 transfer_fsck_objects = git_config_bool(var, value);
86 return 0;
87 }
88
89 if (!strcmp(var, "receive.denycurrentbranch")) {
90 deny_current_branch = parse_deny_action(var, value);
91 return 0;
92 }
93
94 if (strcmp(var, "receive.denydeletecurrent") == 0) {
95 deny_delete_current = parse_deny_action(var, value);
96 return 0;
97 }
98
99 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
100 prefer_ofs_delta = git_config_bool(var, value);
101 return 0;
102 }
103
104 if (strcmp(var, "receive.updateserverinfo") == 0) {
105 auto_update_server_info = git_config_bool(var, value);
106 return 0;
107 }
108
109 if (strcmp(var, "receive.autogc") == 0) {
110 auto_gc = git_config_bool(var, value);
111 return 0;
112 }
113
114 return git_default_config(var, value, cb);
115}
116
117static void show_ref(const char *path, const unsigned char *sha1)
118{
119 if (sent_capabilities)
120 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
121 else
122 packet_write(1, "%s %s%c%s%s\n",
123 sha1_to_hex(sha1), path, 0,
124 " report-status delete-refs side-band-64k",
125 prefer_ofs_delta ? " ofs-delta" : "");
126 sent_capabilities = 1;
127}
128
129static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
130{
131 path = strip_namespace(path);
132 /*
133 * Advertise refs outside our current namespace as ".have"
134 * refs, so that the client can use them to minimize data
135 * transfer but will otherwise ignore them. This happens to
136 * cover ".have" that are thrown in by add_one_alternate_ref()
137 * to mark histories that are complete in our alternates as
138 * well.
139 */
140 if (!path)
141 path = ".have";
142 show_ref(path, sha1);
143 return 0;
144}
145
146static void add_one_alternate_sha1(const unsigned char sha1[20], void *unused)
147{
148 add_extra_ref(".have", sha1, 0);
149}
150
151static void collect_one_alternate_ref(const struct ref *ref, void *data)
152{
153 struct sha1_array *sa = data;
154 sha1_array_append(sa, ref->old_sha1);
155}
156
157static void write_head_info(void)
158{
159 struct sha1_array sa = SHA1_ARRAY_INIT;
160 for_each_alternate_ref(collect_one_alternate_ref, &sa);
161 sha1_array_for_each_unique(&sa, add_one_alternate_sha1, NULL);
162 sha1_array_clear(&sa);
163 for_each_ref(show_ref_cb, NULL);
164 if (!sent_capabilities)
165 show_ref("capabilities^{}", null_sha1);
166 clear_extra_refs();
167
168 /* EOF */
169 packet_flush(1);
170}
171
172struct command {
173 struct command *next;
174 const char *error_string;
175 unsigned int skip_update:1,
176 did_not_exist:1;
177 unsigned char old_sha1[20];
178 unsigned char new_sha1[20];
179 char ref_name[FLEX_ARRAY]; /* more */
180};
181
182static const char pre_receive_hook[] = "hooks/pre-receive";
183static const char post_receive_hook[] = "hooks/post-receive";
184
185static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
186static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
187
188static void report_message(const char *prefix, const char *err, va_list params)
189{
190 int sz = strlen(prefix);
191 char msg[4096];
192
193 strncpy(msg, prefix, sz);
194 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
195 if (sz > (sizeof(msg) - 1))
196 sz = sizeof(msg) - 1;
197 msg[sz++] = '\n';
198
199 if (use_sideband)
200 send_sideband(1, 2, msg, sz, use_sideband);
201 else
202 xwrite(2, msg, sz);
203}
204
205static void rp_warning(const char *err, ...)
206{
207 va_list params;
208 va_start(params, err);
209 report_message("warning: ", err, params);
210 va_end(params);
211}
212
213static void rp_error(const char *err, ...)
214{
215 va_list params;
216 va_start(params, err);
217 report_message("error: ", err, params);
218 va_end(params);
219}
220
221static int copy_to_sideband(int in, int out, void *arg)
222{
223 char data[128];
224 while (1) {
225 ssize_t sz = xread(in, data, sizeof(data));
226 if (sz <= 0)
227 break;
228 send_sideband(1, 2, data, sz, use_sideband);
229 }
230 close(in);
231 return 0;
232}
233
234typedef int (*feed_fn)(void *, const char **, size_t *);
235static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
236{
237 struct child_process proc;
238 struct async muxer;
239 const char *argv[2];
240 int code;
241
242 if (access(hook_name, X_OK) < 0)
243 return 0;
244
245 argv[0] = hook_name;
246 argv[1] = NULL;
247
248 memset(&proc, 0, sizeof(proc));
249 proc.argv = argv;
250 proc.in = -1;
251 proc.stdout_to_stderr = 1;
252
253 if (use_sideband) {
254 memset(&muxer, 0, sizeof(muxer));
255 muxer.proc = copy_to_sideband;
256 muxer.in = -1;
257 code = start_async(&muxer);
258 if (code)
259 return code;
260 proc.err = muxer.in;
261 }
262
263 code = start_command(&proc);
264 if (code) {
265 if (use_sideband)
266 finish_async(&muxer);
267 return code;
268 }
269
270 while (1) {
271 const char *buf;
272 size_t n;
273 if (feed(feed_state, &buf, &n))
274 break;
275 if (write_in_full(proc.in, buf, n) != n)
276 break;
277 }
278 close(proc.in);
279 if (use_sideband)
280 finish_async(&muxer);
281 return finish_command(&proc);
282}
283
284struct receive_hook_feed_state {
285 struct command *cmd;
286 int skip_broken;
287 struct strbuf buf;
288};
289
290static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
291{
292 struct receive_hook_feed_state *state = state_;
293 struct command *cmd = state->cmd;
294
295 while (cmd &&
296 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
297 cmd = cmd->next;
298 if (!cmd)
299 return -1; /* EOF */
300 strbuf_reset(&state->buf);
301 strbuf_addf(&state->buf, "%s %s %s\n",
302 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
303 cmd->ref_name);
304 state->cmd = cmd->next;
305 if (bufp) {
306 *bufp = state->buf.buf;
307 *sizep = state->buf.len;
308 }
309 return 0;
310}
311
312static int run_receive_hook(struct command *commands, const char *hook_name,
313 int skip_broken)
314{
315 struct receive_hook_feed_state state;
316 int status;
317
318 strbuf_init(&state.buf, 0);
319 state.cmd = commands;
320 state.skip_broken = skip_broken;
321 if (feed_receive_hook(&state, NULL, NULL))
322 return 0;
323 state.cmd = commands;
324 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
325 strbuf_release(&state.buf);
326 return status;
327}
328
329static int run_update_hook(struct command *cmd)
330{
331 static const char update_hook[] = "hooks/update";
332 const char *argv[5];
333 struct child_process proc;
334 int code;
335
336 if (access(update_hook, X_OK) < 0)
337 return 0;
338
339 argv[0] = update_hook;
340 argv[1] = cmd->ref_name;
341 argv[2] = sha1_to_hex(cmd->old_sha1);
342 argv[3] = sha1_to_hex(cmd->new_sha1);
343 argv[4] = NULL;
344
345 memset(&proc, 0, sizeof(proc));
346 proc.no_stdin = 1;
347 proc.stdout_to_stderr = 1;
348 proc.err = use_sideband ? -1 : 0;
349 proc.argv = argv;
350
351 code = start_command(&proc);
352 if (code)
353 return code;
354 if (use_sideband)
355 copy_to_sideband(proc.err, -1, NULL);
356 return finish_command(&proc);
357}
358
359static int is_ref_checked_out(const char *ref)
360{
361 if (is_bare_repository())
362 return 0;
363
364 if (!head_name)
365 return 0;
366 return !strcmp(head_name, ref);
367}
368
369static char *refuse_unconfigured_deny_msg[] = {
370 "By default, updating the current branch in a non-bare repository",
371 "is denied, because it will make the index and work tree inconsistent",
372 "with what you pushed, and will require 'git reset --hard' to match",
373 "the work tree to HEAD.",
374 "",
375 "You can set 'receive.denyCurrentBranch' configuration variable to",
376 "'ignore' or 'warn' in the remote repository to allow pushing into",
377 "its current branch; however, this is not recommended unless you",
378 "arranged to update its work tree to match what you pushed in some",
379 "other way.",
380 "",
381 "To squelch this message and still keep the default behaviour, set",
382 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
383};
384
385static void refuse_unconfigured_deny(void)
386{
387 int i;
388 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
389 rp_error("%s", refuse_unconfigured_deny_msg[i]);
390}
391
392static char *refuse_unconfigured_deny_delete_current_msg[] = {
393 "By default, deleting the current branch is denied, because the next",
394 "'git clone' won't result in any file checked out, causing confusion.",
395 "",
396 "You can set 'receive.denyDeleteCurrent' configuration variable to",
397 "'warn' or 'ignore' in the remote repository to allow deleting the",
398 "current branch, with or without a warning message.",
399 "",
400 "To squelch this message, you can set it to 'refuse'."
401};
402
403static void refuse_unconfigured_deny_delete_current(void)
404{
405 int i;
406 for (i = 0;
407 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
408 i++)
409 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
410}
411
412static const char *update(struct command *cmd)
413{
414 const char *name = cmd->ref_name;
415 struct strbuf namespaced_name_buf = STRBUF_INIT;
416 const char *namespaced_name;
417 unsigned char *old_sha1 = cmd->old_sha1;
418 unsigned char *new_sha1 = cmd->new_sha1;
419 struct ref_lock *lock;
420
421 /* only refs/... are allowed */
422 if (prefixcmp(name, "refs/") || check_refname_format(name + 5, 0)) {
423 rp_error("refusing to create funny ref '%s' remotely", name);
424 return "funny refname";
425 }
426
427 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
428 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
429
430 if (is_ref_checked_out(namespaced_name)) {
431 switch (deny_current_branch) {
432 case DENY_IGNORE:
433 break;
434 case DENY_WARN:
435 rp_warning("updating the current branch");
436 break;
437 case DENY_REFUSE:
438 case DENY_UNCONFIGURED:
439 rp_error("refusing to update checked out branch: %s", name);
440 if (deny_current_branch == DENY_UNCONFIGURED)
441 refuse_unconfigured_deny();
442 return "branch is currently checked out";
443 }
444 }
445
446 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
447 error("unpack should have generated %s, "
448 "but I can't find it!", sha1_to_hex(new_sha1));
449 return "bad pack";
450 }
451
452 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
453 if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
454 rp_error("denying ref deletion for %s", name);
455 return "deletion prohibited";
456 }
457
458 if (!strcmp(namespaced_name, head_name)) {
459 switch (deny_delete_current) {
460 case DENY_IGNORE:
461 break;
462 case DENY_WARN:
463 rp_warning("deleting the current branch");
464 break;
465 case DENY_REFUSE:
466 case DENY_UNCONFIGURED:
467 if (deny_delete_current == DENY_UNCONFIGURED)
468 refuse_unconfigured_deny_delete_current();
469 rp_error("refusing to delete the current branch: %s", name);
470 return "deletion of the current branch prohibited";
471 }
472 }
473 }
474
475 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
476 !is_null_sha1(old_sha1) &&
477 !prefixcmp(name, "refs/heads/")) {
478 struct object *old_object, *new_object;
479 struct commit *old_commit, *new_commit;
480 struct commit_list *bases, *ent;
481
482 old_object = parse_object(old_sha1);
483 new_object = parse_object(new_sha1);
484
485 if (!old_object || !new_object ||
486 old_object->type != OBJ_COMMIT ||
487 new_object->type != OBJ_COMMIT) {
488 error("bad sha1 objects for %s", name);
489 return "bad ref";
490 }
491 old_commit = (struct commit *)old_object;
492 new_commit = (struct commit *)new_object;
493 bases = get_merge_bases(old_commit, new_commit, 1);
494 for (ent = bases; ent; ent = ent->next)
495 if (!hashcmp(old_sha1, ent->item->object.sha1))
496 break;
497 free_commit_list(bases);
498 if (!ent) {
499 rp_error("denying non-fast-forward %s"
500 " (you should pull first)", name);
501 return "non-fast-forward";
502 }
503 }
504 if (run_update_hook(cmd)) {
505 rp_error("hook declined to update %s", name);
506 return "hook declined";
507 }
508
509 if (is_null_sha1(new_sha1)) {
510 if (!parse_object(old_sha1)) {
511 old_sha1 = NULL;
512 if (ref_exists(name)) {
513 rp_warning("Allowing deletion of corrupt ref.");
514 } else {
515 rp_warning("Deleting a non-existent ref.");
516 cmd->did_not_exist = 1;
517 }
518 }
519 if (delete_ref(namespaced_name, old_sha1, 0)) {
520 rp_error("failed to delete %s", name);
521 return "failed to delete";
522 }
523 return NULL; /* good */
524 }
525 else {
526 lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0);
527 if (!lock) {
528 rp_error("failed to lock %s", name);
529 return "failed to lock";
530 }
531 if (write_ref_sha1(lock, new_sha1, "push")) {
532 return "failed to write"; /* error() already called */
533 }
534 return NULL; /* good */
535 }
536}
537
538static char update_post_hook[] = "hooks/post-update";
539
540static void run_update_post_hook(struct command *commands)
541{
542 struct command *cmd;
543 int argc;
544 const char **argv;
545 struct child_process proc;
546
547 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
548 if (cmd->error_string || cmd->did_not_exist)
549 continue;
550 argc++;
551 }
552 if (!argc || access(update_post_hook, X_OK) < 0)
553 return;
554 argv = xmalloc(sizeof(*argv) * (2 + argc));
555 argv[0] = update_post_hook;
556
557 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
558 char *p;
559 if (cmd->error_string || cmd->did_not_exist)
560 continue;
561 p = xmalloc(strlen(cmd->ref_name) + 1);
562 strcpy(p, cmd->ref_name);
563 argv[argc] = p;
564 argc++;
565 }
566 argv[argc] = NULL;
567
568 memset(&proc, 0, sizeof(proc));
569 proc.no_stdin = 1;
570 proc.stdout_to_stderr = 1;
571 proc.err = use_sideband ? -1 : 0;
572 proc.argv = argv;
573
574 if (!start_command(&proc)) {
575 if (use_sideband)
576 copy_to_sideband(proc.err, -1, NULL);
577 finish_command(&proc);
578 }
579}
580
581static void check_aliased_update(struct command *cmd, struct string_list *list)
582{
583 struct strbuf buf = STRBUF_INIT;
584 const char *dst_name;
585 struct string_list_item *item;
586 struct command *dst_cmd;
587 unsigned char sha1[20];
588 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
589 int flag;
590
591 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
592 dst_name = resolve_ref(buf.buf, sha1, 0, &flag);
593 strbuf_release(&buf);
594
595 if (!(flag & REF_ISSYMREF))
596 return;
597
598 dst_name = strip_namespace(dst_name);
599 if (!dst_name) {
600 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
601 cmd->skip_update = 1;
602 cmd->error_string = "broken symref";
603 return;
604 }
605
606 if ((item = string_list_lookup(list, dst_name)) == NULL)
607 return;
608
609 cmd->skip_update = 1;
610
611 dst_cmd = (struct command *) item->util;
612
613 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
614 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
615 return;
616
617 dst_cmd->skip_update = 1;
618
619 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
620 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
621 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
622 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
623 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
624 " its target '%s' (%s..%s)",
625 cmd->ref_name, cmd_oldh, cmd_newh,
626 dst_cmd->ref_name, dst_oldh, dst_newh);
627
628 cmd->error_string = dst_cmd->error_string =
629 "inconsistent aliased update";
630}
631
632static void check_aliased_updates(struct command *commands)
633{
634 struct command *cmd;
635 struct string_list ref_list = STRING_LIST_INIT_NODUP;
636
637 for (cmd = commands; cmd; cmd = cmd->next) {
638 struct string_list_item *item =
639 string_list_append(&ref_list, cmd->ref_name);
640 item->util = (void *)cmd;
641 }
642 sort_string_list(&ref_list);
643
644 for (cmd = commands; cmd; cmd = cmd->next)
645 check_aliased_update(cmd, &ref_list);
646
647 string_list_clear(&ref_list, 0);
648}
649
650static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
651{
652 struct command **cmd_list = cb_data;
653 struct command *cmd = *cmd_list;
654
655 if (!cmd || is_null_sha1(cmd->new_sha1))
656 return -1; /* end of list */
657 *cmd_list = NULL; /* this returns only one */
658 hashcpy(sha1, cmd->new_sha1);
659 return 0;
660}
661
662static void set_connectivity_errors(struct command *commands)
663{
664 struct command *cmd;
665
666 for (cmd = commands; cmd; cmd = cmd->next) {
667 struct command *singleton = cmd;
668 if (!check_everything_connected(command_singleton_iterator,
669 0, &singleton))
670 continue;
671 cmd->error_string = "missing necessary objects";
672 }
673}
674
675static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
676{
677 struct command **cmd_list = cb_data;
678 struct command *cmd = *cmd_list;
679
680 while (cmd) {
681 if (!is_null_sha1(cmd->new_sha1)) {
682 hashcpy(sha1, cmd->new_sha1);
683 *cmd_list = cmd->next;
684 return 0;
685 }
686 cmd = cmd->next;
687 }
688 *cmd_list = NULL;
689 return -1; /* end of list */
690}
691
692static void execute_commands(struct command *commands, const char *unpacker_error)
693{
694 struct command *cmd;
695 unsigned char sha1[20];
696
697 if (unpacker_error) {
698 for (cmd = commands; cmd; cmd = cmd->next)
699 cmd->error_string = "n/a (unpacker error)";
700 return;
701 }
702
703 cmd = commands;
704 if (check_everything_connected(iterate_receive_command_list,
705 0, &cmd))
706 set_connectivity_errors(commands);
707
708 if (run_receive_hook(commands, pre_receive_hook, 0)) {
709 for (cmd = commands; cmd; cmd = cmd->next)
710 cmd->error_string = "pre-receive hook declined";
711 return;
712 }
713
714 check_aliased_updates(commands);
715
716 free((char *)head_name);
717 head_name = resolve_ref("HEAD", sha1, 0, NULL);
718 if (head_name)
719 head_name = xstrdup(head_name);
720
721 for (cmd = commands; cmd; cmd = cmd->next)
722 if (!cmd->skip_update)
723 cmd->error_string = update(cmd);
724}
725
726static struct command *read_head_info(void)
727{
728 struct command *commands = NULL;
729 struct command **p = &commands;
730 for (;;) {
731 static char line[1000];
732 unsigned char old_sha1[20], new_sha1[20];
733 struct command *cmd;
734 char *refname;
735 int len, reflen;
736
737 len = packet_read_line(0, line, sizeof(line));
738 if (!len)
739 break;
740 if (line[len-1] == '\n')
741 line[--len] = 0;
742 if (len < 83 ||
743 line[40] != ' ' ||
744 line[81] != ' ' ||
745 get_sha1_hex(line, old_sha1) ||
746 get_sha1_hex(line + 41, new_sha1))
747 die("protocol error: expected old/new/ref, got '%s'",
748 line);
749
750 refname = line + 82;
751 reflen = strlen(refname);
752 if (reflen + 82 < len) {
753 if (strstr(refname + reflen + 1, "report-status"))
754 report_status = 1;
755 if (strstr(refname + reflen + 1, "side-band-64k"))
756 use_sideband = LARGE_PACKET_MAX;
757 }
758 cmd = xcalloc(1, sizeof(struct command) + len - 80);
759 hashcpy(cmd->old_sha1, old_sha1);
760 hashcpy(cmd->new_sha1, new_sha1);
761 memcpy(cmd->ref_name, line + 82, len - 81);
762 *p = cmd;
763 p = &cmd->next;
764 }
765 return commands;
766}
767
768static const char *parse_pack_header(struct pack_header *hdr)
769{
770 switch (read_pack_header(0, hdr)) {
771 case PH_ERROR_EOF:
772 return "eof before pack header was fully read";
773
774 case PH_ERROR_PACK_SIGNATURE:
775 return "protocol error (pack signature mismatch detected)";
776
777 case PH_ERROR_PROTOCOL:
778 return "protocol error (pack version unsupported)";
779
780 default:
781 return "unknown error in parse_pack_header";
782
783 case 0:
784 return NULL;
785 }
786}
787
788static const char *pack_lockfile;
789
790static const char *unpack(void)
791{
792 struct pack_header hdr;
793 const char *hdr_err;
794 char hdr_arg[38];
795 int fsck_objects = (receive_fsck_objects >= 0
796 ? receive_fsck_objects
797 : transfer_fsck_objects >= 0
798 ? transfer_fsck_objects
799 : 0);
800
801 hdr_err = parse_pack_header(&hdr);
802 if (hdr_err)
803 return hdr_err;
804 snprintf(hdr_arg, sizeof(hdr_arg),
805 "--pack_header=%"PRIu32",%"PRIu32,
806 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
807
808 if (ntohl(hdr.hdr_entries) < unpack_limit) {
809 int code, i = 0;
810 const char *unpacker[4];
811 unpacker[i++] = "unpack-objects";
812 if (fsck_objects)
813 unpacker[i++] = "--strict";
814 unpacker[i++] = hdr_arg;
815 unpacker[i++] = NULL;
816 code = run_command_v_opt(unpacker, RUN_GIT_CMD);
817 if (!code)
818 return NULL;
819 return "unpack-objects abnormal exit";
820 } else {
821 const char *keeper[7];
822 int s, status, i = 0;
823 char keep_arg[256];
824 struct child_process ip;
825
826 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
827 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
828 strcpy(keep_arg + s, "localhost");
829
830 keeper[i++] = "index-pack";
831 keeper[i++] = "--stdin";
832 if (fsck_objects)
833 keeper[i++] = "--strict";
834 keeper[i++] = "--fix-thin";
835 keeper[i++] = hdr_arg;
836 keeper[i++] = keep_arg;
837 keeper[i++] = NULL;
838 memset(&ip, 0, sizeof(ip));
839 ip.argv = keeper;
840 ip.out = -1;
841 ip.git_cmd = 1;
842 status = start_command(&ip);
843 if (status) {
844 return "index-pack fork failed";
845 }
846 pack_lockfile = index_pack_lockfile(ip.out);
847 close(ip.out);
848 status = finish_command(&ip);
849 if (!status) {
850 reprepare_packed_git();
851 return NULL;
852 }
853 return "index-pack abnormal exit";
854 }
855}
856
857static void report(struct command *commands, const char *unpack_status)
858{
859 struct command *cmd;
860 struct strbuf buf = STRBUF_INIT;
861
862 packet_buf_write(&buf, "unpack %s\n",
863 unpack_status ? unpack_status : "ok");
864 for (cmd = commands; cmd; cmd = cmd->next) {
865 if (!cmd->error_string)
866 packet_buf_write(&buf, "ok %s\n",
867 cmd->ref_name);
868 else
869 packet_buf_write(&buf, "ng %s %s\n",
870 cmd->ref_name, cmd->error_string);
871 }
872 packet_buf_flush(&buf);
873
874 if (use_sideband)
875 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
876 else
877 safe_write(1, buf.buf, buf.len);
878 strbuf_release(&buf);
879}
880
881static int delete_only(struct command *commands)
882{
883 struct command *cmd;
884 for (cmd = commands; cmd; cmd = cmd->next) {
885 if (!is_null_sha1(cmd->new_sha1))
886 return 0;
887 }
888 return 1;
889}
890
891int cmd_receive_pack(int argc, const char **argv, const char *prefix)
892{
893 int advertise_refs = 0;
894 int stateless_rpc = 0;
895 int i;
896 char *dir = NULL;
897 struct command *commands;
898
899 packet_trace_identity("receive-pack");
900
901 argv++;
902 for (i = 1; i < argc; i++) {
903 const char *arg = *argv++;
904
905 if (*arg == '-') {
906 if (!strcmp(arg, "--advertise-refs")) {
907 advertise_refs = 1;
908 continue;
909 }
910 if (!strcmp(arg, "--stateless-rpc")) {
911 stateless_rpc = 1;
912 continue;
913 }
914
915 usage(receive_pack_usage);
916 }
917 if (dir)
918 usage(receive_pack_usage);
919 dir = xstrdup(arg);
920 }
921 if (!dir)
922 usage(receive_pack_usage);
923
924 setup_path();
925
926 if (!enter_repo(dir, 0))
927 die("'%s' does not appear to be a git repository", dir);
928
929 if (is_repository_shallow())
930 die("attempt to push into a shallow repository");
931
932 git_config(receive_pack_config, NULL);
933
934 if (0 <= transfer_unpack_limit)
935 unpack_limit = transfer_unpack_limit;
936 else if (0 <= receive_unpack_limit)
937 unpack_limit = receive_unpack_limit;
938
939 if (advertise_refs || !stateless_rpc) {
940 write_head_info();
941 }
942 if (advertise_refs)
943 return 0;
944
945 if ((commands = read_head_info()) != NULL) {
946 const char *unpack_status = NULL;
947
948 if (!delete_only(commands))
949 unpack_status = unpack();
950 execute_commands(commands, unpack_status);
951 if (pack_lockfile)
952 unlink_or_warn(pack_lockfile);
953 if (report_status)
954 report(commands, unpack_status);
955 run_receive_hook(commands, post_receive_hook, 1);
956 run_update_post_hook(commands);
957 if (auto_gc) {
958 const char *argv_gc_auto[] = {
959 "gc", "--auto", "--quiet", NULL,
960 };
961 run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
962 }
963 if (auto_update_server_info)
964 update_server_info(0);
965 }
966 if (use_sideband)
967 packet_flush(1);
968 return 0;
969}