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 struct commit_list *bases, *ent;
482
483 old_object = parse_object(old_sha1);
484 new_object = parse_object(new_sha1);
485
486 if (!old_object || !new_object ||
487 old_object->type != OBJ_COMMIT ||
488 new_object->type != OBJ_COMMIT) {
489 error("bad sha1 objects for %s", name);
490 return "bad ref";
491 }
492 old_commit = (struct commit *)old_object;
493 new_commit = (struct commit *)new_object;
494 bases = get_merge_bases(old_commit, new_commit, 1);
495 for (ent = bases; ent; ent = ent->next)
496 if (!hashcmp(old_sha1, ent->item->object.sha1))
497 break;
498 free_commit_list(bases);
499 if (!ent) {
500 rp_error("denying non-fast-forward %s"
501 " (you should pull first)", name);
502 return "non-fast-forward";
503 }
504 }
505 if (run_update_hook(cmd)) {
506 rp_error("hook declined to update %s", name);
507 return "hook declined";
508 }
509
510 if (is_null_sha1(new_sha1)) {
511 if (!parse_object(old_sha1)) {
512 old_sha1 = NULL;
513 if (ref_exists(name)) {
514 rp_warning("Allowing deletion of corrupt ref.");
515 } else {
516 rp_warning("Deleting a non-existent ref.");
517 cmd->did_not_exist = 1;
518 }
519 }
520 if (delete_ref(namespaced_name, old_sha1, 0)) {
521 rp_error("failed to delete %s", name);
522 return "failed to delete";
523 }
524 return NULL; /* good */
525 }
526 else {
527 lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0);
528 if (!lock) {
529 rp_error("failed to lock %s", name);
530 return "failed to lock";
531 }
532 if (write_ref_sha1(lock, new_sha1, "push")) {
533 return "failed to write"; /* error() already called */
534 }
535 return NULL; /* good */
536 }
537}
538
539static char update_post_hook[] = "hooks/post-update";
540
541static void run_update_post_hook(struct command *commands)
542{
543 struct command *cmd;
544 int argc;
545 const char **argv;
546 struct child_process proc;
547
548 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
549 if (cmd->error_string || cmd->did_not_exist)
550 continue;
551 argc++;
552 }
553 if (!argc || access(update_post_hook, X_OK) < 0)
554 return;
555 argv = xmalloc(sizeof(*argv) * (2 + argc));
556 argv[0] = update_post_hook;
557
558 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
559 char *p;
560 if (cmd->error_string || cmd->did_not_exist)
561 continue;
562 p = xmalloc(strlen(cmd->ref_name) + 1);
563 strcpy(p, cmd->ref_name);
564 argv[argc] = p;
565 argc++;
566 }
567 argv[argc] = NULL;
568
569 memset(&proc, 0, sizeof(proc));
570 proc.no_stdin = 1;
571 proc.stdout_to_stderr = 1;
572 proc.err = use_sideband ? -1 : 0;
573 proc.argv = argv;
574
575 if (!start_command(&proc)) {
576 if (use_sideband)
577 copy_to_sideband(proc.err, -1, NULL);
578 finish_command(&proc);
579 }
580}
581
582static void check_aliased_update(struct command *cmd, struct string_list *list)
583{
584 struct strbuf buf = STRBUF_INIT;
585 const char *dst_name;
586 struct string_list_item *item;
587 struct command *dst_cmd;
588 unsigned char sha1[20];
589 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
590 int flag;
591
592 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
593 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
594 strbuf_release(&buf);
595
596 if (!(flag & REF_ISSYMREF))
597 return;
598
599 dst_name = strip_namespace(dst_name);
600 if (!dst_name) {
601 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
602 cmd->skip_update = 1;
603 cmd->error_string = "broken symref";
604 return;
605 }
606
607 if ((item = string_list_lookup(list, dst_name)) == NULL)
608 return;
609
610 cmd->skip_update = 1;
611
612 dst_cmd = (struct command *) item->util;
613
614 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
615 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
616 return;
617
618 dst_cmd->skip_update = 1;
619
620 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
621 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
622 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
623 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
624 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
625 " its target '%s' (%s..%s)",
626 cmd->ref_name, cmd_oldh, cmd_newh,
627 dst_cmd->ref_name, dst_oldh, dst_newh);
628
629 cmd->error_string = dst_cmd->error_string =
630 "inconsistent aliased update";
631}
632
633static void check_aliased_updates(struct command *commands)
634{
635 struct command *cmd;
636 struct string_list ref_list = STRING_LIST_INIT_NODUP;
637
638 for (cmd = commands; cmd; cmd = cmd->next) {
639 struct string_list_item *item =
640 string_list_append(&ref_list, cmd->ref_name);
641 item->util = (void *)cmd;
642 }
643 sort_string_list(&ref_list);
644
645 for (cmd = commands; cmd; cmd = cmd->next) {
646 if (!cmd->error_string)
647 check_aliased_update(cmd, &ref_list);
648 }
649
650 string_list_clear(&ref_list, 0);
651}
652
653static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
654{
655 struct command **cmd_list = cb_data;
656 struct command *cmd = *cmd_list;
657
658 if (!cmd || is_null_sha1(cmd->new_sha1))
659 return -1; /* end of list */
660 *cmd_list = NULL; /* this returns only one */
661 hashcpy(sha1, cmd->new_sha1);
662 return 0;
663}
664
665static void set_connectivity_errors(struct command *commands)
666{
667 struct command *cmd;
668
669 for (cmd = commands; cmd; cmd = cmd->next) {
670 struct command *singleton = cmd;
671 if (!check_everything_connected(command_singleton_iterator,
672 0, &singleton))
673 continue;
674 cmd->error_string = "missing necessary objects";
675 }
676}
677
678static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
679{
680 struct command **cmd_list = cb_data;
681 struct command *cmd = *cmd_list;
682
683 while (cmd) {
684 if (!is_null_sha1(cmd->new_sha1)) {
685 hashcpy(sha1, cmd->new_sha1);
686 *cmd_list = cmd->next;
687 return 0;
688 }
689 cmd = cmd->next;
690 }
691 *cmd_list = NULL;
692 return -1; /* end of list */
693}
694
695static void execute_commands(struct command *commands, const char *unpacker_error)
696{
697 struct command *cmd;
698 unsigned char sha1[20];
699
700 if (unpacker_error) {
701 for (cmd = commands; cmd; cmd = cmd->next)
702 cmd->error_string = "n/a (unpacker error)";
703 return;
704 }
705
706 cmd = commands;
707 if (check_everything_connected(iterate_receive_command_list,
708 0, &cmd))
709 set_connectivity_errors(commands);
710
711 if (run_receive_hook(commands, pre_receive_hook, 0)) {
712 for (cmd = commands; cmd; cmd = cmd->next) {
713 if (!cmd->error_string)
714 cmd->error_string = "pre-receive hook declined";
715 }
716 return;
717 }
718
719 check_aliased_updates(commands);
720
721 free(head_name_to_free);
722 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
723
724 for (cmd = commands; cmd; cmd = cmd->next) {
725 if (cmd->error_string)
726 continue;
727
728 if (cmd->skip_update)
729 continue;
730
731 cmd->error_string = update(cmd);
732 }
733}
734
735static struct command *read_head_info(void)
736{
737 struct command *commands = NULL;
738 struct command **p = &commands;
739 for (;;) {
740 static char line[1000];
741 unsigned char old_sha1[20], new_sha1[20];
742 struct command *cmd;
743 char *refname;
744 int len, reflen;
745
746 len = packet_read_line(0, line, sizeof(line));
747 if (!len)
748 break;
749 if (line[len-1] == '\n')
750 line[--len] = 0;
751 if (len < 83 ||
752 line[40] != ' ' ||
753 line[81] != ' ' ||
754 get_sha1_hex(line, old_sha1) ||
755 get_sha1_hex(line + 41, new_sha1))
756 die("protocol error: expected old/new/ref, got '%s'",
757 line);
758
759 refname = line + 82;
760 reflen = strlen(refname);
761 if (reflen + 82 < len) {
762 const char *feature_list = refname + reflen + 1;
763 if (parse_feature_request(feature_list, "report-status"))
764 report_status = 1;
765 if (parse_feature_request(feature_list, "side-band-64k"))
766 use_sideband = LARGE_PACKET_MAX;
767 if (parse_feature_request(feature_list, "quiet"))
768 quiet = 1;
769 }
770 cmd = xcalloc(1, sizeof(struct command) + len - 80);
771 hashcpy(cmd->old_sha1, old_sha1);
772 hashcpy(cmd->new_sha1, new_sha1);
773 memcpy(cmd->ref_name, line + 82, len - 81);
774 *p = cmd;
775 p = &cmd->next;
776 }
777 return commands;
778}
779
780static const char *parse_pack_header(struct pack_header *hdr)
781{
782 switch (read_pack_header(0, hdr)) {
783 case PH_ERROR_EOF:
784 return "eof before pack header was fully read";
785
786 case PH_ERROR_PACK_SIGNATURE:
787 return "protocol error (pack signature mismatch detected)";
788
789 case PH_ERROR_PROTOCOL:
790 return "protocol error (pack version unsupported)";
791
792 default:
793 return "unknown error in parse_pack_header";
794
795 case 0:
796 return NULL;
797 }
798}
799
800static const char *pack_lockfile;
801
802static const char *unpack(void)
803{
804 struct pack_header hdr;
805 const char *hdr_err;
806 char hdr_arg[38];
807 int fsck_objects = (receive_fsck_objects >= 0
808 ? receive_fsck_objects
809 : transfer_fsck_objects >= 0
810 ? transfer_fsck_objects
811 : 0);
812
813 hdr_err = parse_pack_header(&hdr);
814 if (hdr_err)
815 return hdr_err;
816 snprintf(hdr_arg, sizeof(hdr_arg),
817 "--pack_header=%"PRIu32",%"PRIu32,
818 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
819
820 if (ntohl(hdr.hdr_entries) < unpack_limit) {
821 int code, i = 0;
822 const char *unpacker[5];
823 unpacker[i++] = "unpack-objects";
824 if (quiet)
825 unpacker[i++] = "-q";
826 if (fsck_objects)
827 unpacker[i++] = "--strict";
828 unpacker[i++] = hdr_arg;
829 unpacker[i++] = NULL;
830 code = run_command_v_opt(unpacker, RUN_GIT_CMD);
831 if (!code)
832 return NULL;
833 return "unpack-objects abnormal exit";
834 } else {
835 const char *keeper[7];
836 int s, status, i = 0;
837 char keep_arg[256];
838 struct child_process ip;
839
840 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
841 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
842 strcpy(keep_arg + s, "localhost");
843
844 keeper[i++] = "index-pack";
845 keeper[i++] = "--stdin";
846 if (fsck_objects)
847 keeper[i++] = "--strict";
848 keeper[i++] = "--fix-thin";
849 keeper[i++] = hdr_arg;
850 keeper[i++] = keep_arg;
851 keeper[i++] = NULL;
852 memset(&ip, 0, sizeof(ip));
853 ip.argv = keeper;
854 ip.out = -1;
855 ip.git_cmd = 1;
856 status = start_command(&ip);
857 if (status) {
858 return "index-pack fork failed";
859 }
860 pack_lockfile = index_pack_lockfile(ip.out);
861 close(ip.out);
862 status = finish_command(&ip);
863 if (!status) {
864 reprepare_packed_git();
865 return NULL;
866 }
867 return "index-pack abnormal exit";
868 }
869}
870
871static void report(struct command *commands, const char *unpack_status)
872{
873 struct command *cmd;
874 struct strbuf buf = STRBUF_INIT;
875
876 packet_buf_write(&buf, "unpack %s\n",
877 unpack_status ? unpack_status : "ok");
878 for (cmd = commands; cmd; cmd = cmd->next) {
879 if (!cmd->error_string)
880 packet_buf_write(&buf, "ok %s\n",
881 cmd->ref_name);
882 else
883 packet_buf_write(&buf, "ng %s %s\n",
884 cmd->ref_name, cmd->error_string);
885 }
886 packet_buf_flush(&buf);
887
888 if (use_sideband)
889 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
890 else
891 safe_write(1, buf.buf, buf.len);
892 strbuf_release(&buf);
893}
894
895static int delete_only(struct command *commands)
896{
897 struct command *cmd;
898 for (cmd = commands; cmd; cmd = cmd->next) {
899 if (!is_null_sha1(cmd->new_sha1))
900 return 0;
901 }
902 return 1;
903}
904
905int cmd_receive_pack(int argc, const char **argv, const char *prefix)
906{
907 int advertise_refs = 0;
908 int stateless_rpc = 0;
909 int i;
910 char *dir = NULL;
911 struct command *commands;
912
913 packet_trace_identity("receive-pack");
914
915 argv++;
916 for (i = 1; i < argc; i++) {
917 const char *arg = *argv++;
918
919 if (*arg == '-') {
920 if (!strcmp(arg, "--quiet")) {
921 quiet = 1;
922 continue;
923 }
924
925 if (!strcmp(arg, "--advertise-refs")) {
926 advertise_refs = 1;
927 continue;
928 }
929 if (!strcmp(arg, "--stateless-rpc")) {
930 stateless_rpc = 1;
931 continue;
932 }
933
934 usage(receive_pack_usage);
935 }
936 if (dir)
937 usage(receive_pack_usage);
938 dir = xstrdup(arg);
939 }
940 if (!dir)
941 usage(receive_pack_usage);
942
943 setup_path();
944
945 if (!enter_repo(dir, 0))
946 die("'%s' does not appear to be a git repository", dir);
947
948 if (is_repository_shallow())
949 die("attempt to push into a shallow repository");
950
951 git_config(receive_pack_config, NULL);
952
953 if (0 <= transfer_unpack_limit)
954 unpack_limit = transfer_unpack_limit;
955 else if (0 <= receive_unpack_limit)
956 unpack_limit = receive_unpack_limit;
957
958 if (advertise_refs || !stateless_rpc) {
959 write_head_info();
960 }
961 if (advertise_refs)
962 return 0;
963
964 if ((commands = read_head_info()) != NULL) {
965 const char *unpack_status = NULL;
966
967 if (!delete_only(commands))
968 unpack_status = unpack();
969 execute_commands(commands, unpack_status);
970 if (pack_lockfile)
971 unlink_or_warn(pack_lockfile);
972 if (report_status)
973 report(commands, unpack_status);
974 run_receive_hook(commands, post_receive_hook, 1);
975 run_update_post_hook(commands);
976 if (auto_gc) {
977 const char *argv_gc_auto[] = {
978 "gc", "--auto", "--quiet", NULL,
979 };
980 run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
981 }
982 if (auto_update_server_info)
983 update_server_info(0);
984 }
985 if (use_sideband)
986 packet_flush(1);
987 return 0;
988}