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