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