6 #include "run-command.h"
11 #include "transport.h"
12 #include "string-list.h"
13 #include "sha1-array.h"
14 #include "connected.h"
16 static const char receive_pack_usage
[] = "git receive-pack <git-dir>";
25 static int deny_deletes
;
26 static int deny_non_fast_forwards
;
27 static enum deny_action deny_current_branch
= DENY_UNCONFIGURED
;
28 static enum deny_action deny_delete_current
= DENY_UNCONFIGURED
;
29 static int receive_fsck_objects
= -1;
30 static int transfer_fsck_objects
= -1;
31 static int receive_unpack_limit
= -1;
32 static int transfer_unpack_limit
= -1;
33 static int unpack_limit
= 100;
34 static int report_status
;
35 static int use_sideband
;
36 static int prefer_ofs_delta
= 1;
37 static int auto_update_server_info
;
38 static int auto_gc
= 1;
39 static const char *head_name
;
40 static void *head_name_to_free
;
41 static int sent_capabilities
;
43 static enum deny_action
parse_deny_action(const char *var
, const char *value
)
46 if (!strcasecmp(value
, "ignore"))
48 if (!strcasecmp(value
, "warn"))
50 if (!strcasecmp(value
, "refuse"))
53 if (git_config_bool(var
, value
))
58 static int receive_pack_config(const char *var
, const char *value
, void *cb
)
60 if (strcmp(var
, "receive.denydeletes") == 0) {
61 deny_deletes
= git_config_bool(var
, value
);
65 if (strcmp(var
, "receive.denynonfastforwards") == 0) {
66 deny_non_fast_forwards
= git_config_bool(var
, value
);
70 if (strcmp(var
, "receive.unpacklimit") == 0) {
71 receive_unpack_limit
= git_config_int(var
, value
);
75 if (strcmp(var
, "transfer.unpacklimit") == 0) {
76 transfer_unpack_limit
= git_config_int(var
, value
);
80 if (strcmp(var
, "receive.fsckobjects") == 0) {
81 receive_fsck_objects
= git_config_bool(var
, value
);
85 if (strcmp(var
, "transfer.fsckobjects") == 0) {
86 transfer_fsck_objects
= git_config_bool(var
, value
);
90 if (!strcmp(var
, "receive.denycurrentbranch")) {
91 deny_current_branch
= parse_deny_action(var
, value
);
95 if (strcmp(var
, "receive.denydeletecurrent") == 0) {
96 deny_delete_current
= parse_deny_action(var
, value
);
100 if (strcmp(var
, "repack.usedeltabaseoffset") == 0) {
101 prefer_ofs_delta
= git_config_bool(var
, value
);
105 if (strcmp(var
, "receive.updateserverinfo") == 0) {
106 auto_update_server_info
= git_config_bool(var
, value
);
110 if (strcmp(var
, "receive.autogc") == 0) {
111 auto_gc
= git_config_bool(var
, value
);
115 return git_default_config(var
, value
, cb
);
118 static int show_ref(const char *path
, const unsigned char *sha1
, int flag
, void *cb_data
)
120 if (sent_capabilities
)
121 packet_write(1, "%s %s\n", sha1_to_hex(sha1
), path
);
123 packet_write(1, "%s %s%c%s%s\n",
124 sha1_to_hex(sha1
), path
, 0,
125 " report-status delete-refs side-band-64k",
126 prefer_ofs_delta
? " ofs-delta" : "");
127 sent_capabilities
= 1;
131 static int show_ref_cb(const char *path
, const unsigned char *sha1
, int flag
, void *cb_data
)
133 path
= strip_namespace(path
);
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
144 return show_ref(path
, sha1
, flag
, cb_data
);
147 static void write_head_info(void)
149 for_each_ref(show_ref_cb
, NULL
);
150 if (!sent_capabilities
)
151 show_ref("capabilities^{}", null_sha1
, 0, NULL
);
156 struct command
*next
;
157 const char *error_string
;
158 unsigned int skip_update
:1,
160 unsigned char old_sha1
[20];
161 unsigned char new_sha1
[20];
162 char ref_name
[FLEX_ARRAY
]; /* more */
165 static const char pre_receive_hook
[] = "hooks/pre-receive";
166 static const char post_receive_hook
[] = "hooks/post-receive";
168 static void rp_error(const char *err
, ...) __attribute__((format (printf
, 1, 2)));
169 static void rp_warning(const char *err
, ...) __attribute__((format (printf
, 1, 2)));
171 static void report_message(const char *prefix
, const char *err
, va_list params
)
173 int sz
= strlen(prefix
);
176 strncpy(msg
, prefix
, sz
);
177 sz
+= vsnprintf(msg
+ sz
, sizeof(msg
) - sz
, err
, params
);
178 if (sz
> (sizeof(msg
) - 1))
179 sz
= sizeof(msg
) - 1;
183 send_sideband(1, 2, msg
, sz
, use_sideband
);
188 static void rp_warning(const char *err
, ...)
191 va_start(params
, err
);
192 report_message("warning: ", err
, params
);
196 static void rp_error(const char *err
, ...)
199 va_start(params
, err
);
200 report_message("error: ", err
, params
);
204 static int copy_to_sideband(int in
, int out
, void *arg
)
208 ssize_t sz
= xread(in
, data
, sizeof(data
));
211 send_sideband(1, 2, data
, sz
, use_sideband
);
217 typedef int (*feed_fn
)(void *, const char **, size_t *);
218 static int run_and_feed_hook(const char *hook_name
, feed_fn feed
, void *feed_state
)
220 struct child_process proc
;
225 if (access(hook_name
, X_OK
) < 0)
231 memset(&proc
, 0, sizeof(proc
));
234 proc
.stdout_to_stderr
= 1;
237 memset(&muxer
, 0, sizeof(muxer
));
238 muxer
.proc
= copy_to_sideband
;
240 code
= start_async(&muxer
);
246 code
= start_command(&proc
);
249 finish_async(&muxer
);
256 if (feed(feed_state
, &buf
, &n
))
258 if (write_in_full(proc
.in
, buf
, n
) != n
)
263 finish_async(&muxer
);
264 return finish_command(&proc
);
267 struct receive_hook_feed_state
{
273 static int feed_receive_hook(void *state_
, const char **bufp
, size_t *sizep
)
275 struct receive_hook_feed_state
*state
= state_
;
276 struct command
*cmd
= state
->cmd
;
279 state
->skip_broken
&& (cmd
->error_string
|| cmd
->did_not_exist
))
283 strbuf_reset(&state
->buf
);
284 strbuf_addf(&state
->buf
, "%s %s %s\n",
285 sha1_to_hex(cmd
->old_sha1
), sha1_to_hex(cmd
->new_sha1
),
287 state
->cmd
= cmd
->next
;
289 *bufp
= state
->buf
.buf
;
290 *sizep
= state
->buf
.len
;
295 static int run_receive_hook(struct command
*commands
, const char *hook_name
,
298 struct receive_hook_feed_state state
;
301 strbuf_init(&state
.buf
, 0);
302 state
.cmd
= commands
;
303 state
.skip_broken
= skip_broken
;
304 if (feed_receive_hook(&state
, NULL
, NULL
))
306 state
.cmd
= commands
;
307 status
= run_and_feed_hook(hook_name
, feed_receive_hook
, &state
);
308 strbuf_release(&state
.buf
);
312 static int run_update_hook(struct command
*cmd
)
314 static const char update_hook
[] = "hooks/update";
316 struct child_process proc
;
319 if (access(update_hook
, X_OK
) < 0)
322 argv
[0] = update_hook
;
323 argv
[1] = cmd
->ref_name
;
324 argv
[2] = sha1_to_hex(cmd
->old_sha1
);
325 argv
[3] = sha1_to_hex(cmd
->new_sha1
);
328 memset(&proc
, 0, sizeof(proc
));
330 proc
.stdout_to_stderr
= 1;
331 proc
.err
= use_sideband
? -1 : 0;
334 code
= start_command(&proc
);
338 copy_to_sideband(proc
.err
, -1, NULL
);
339 return finish_command(&proc
);
342 static int is_ref_checked_out(const char *ref
)
344 if (is_bare_repository())
349 return !strcmp(head_name
, ref
);
352 static char *refuse_unconfigured_deny_msg
[] = {
353 "By default, updating the current branch in a non-bare repository",
354 "is denied, because it will make the index and work tree inconsistent",
355 "with what you pushed, and will require 'git reset --hard' to match",
356 "the work tree to HEAD.",
358 "You can set 'receive.denyCurrentBranch' configuration variable to",
359 "'ignore' or 'warn' in the remote repository to allow pushing into",
360 "its current branch; however, this is not recommended unless you",
361 "arranged to update its work tree to match what you pushed in some",
364 "To squelch this message and still keep the default behaviour, set",
365 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
368 static void refuse_unconfigured_deny(void)
371 for (i
= 0; i
< ARRAY_SIZE(refuse_unconfigured_deny_msg
); i
++)
372 rp_error("%s", refuse_unconfigured_deny_msg
[i
]);
375 static char *refuse_unconfigured_deny_delete_current_msg
[] = {
376 "By default, deleting the current branch is denied, because the next",
377 "'git clone' won't result in any file checked out, causing confusion.",
379 "You can set 'receive.denyDeleteCurrent' configuration variable to",
380 "'warn' or 'ignore' in the remote repository to allow deleting the",
381 "current branch, with or without a warning message.",
383 "To squelch this message, you can set it to 'refuse'."
386 static void refuse_unconfigured_deny_delete_current(void)
390 i
< ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg
);
392 rp_error("%s", refuse_unconfigured_deny_delete_current_msg
[i
]);
395 static const char *update(struct command
*cmd
)
397 const char *name
= cmd
->ref_name
;
398 struct strbuf namespaced_name_buf
= STRBUF_INIT
;
399 const char *namespaced_name
;
400 unsigned char *old_sha1
= cmd
->old_sha1
;
401 unsigned char *new_sha1
= cmd
->new_sha1
;
402 struct ref_lock
*lock
;
404 /* only refs/... are allowed */
405 if (prefixcmp(name
, "refs/") || check_refname_format(name
+ 5, 0)) {
406 rp_error("refusing to create funny ref '%s' remotely", name
);
407 return "funny refname";
410 strbuf_addf(&namespaced_name_buf
, "%s%s", get_git_namespace(), name
);
411 namespaced_name
= strbuf_detach(&namespaced_name_buf
, NULL
);
413 if (is_ref_checked_out(namespaced_name
)) {
414 switch (deny_current_branch
) {
418 rp_warning("updating the current branch");
421 case DENY_UNCONFIGURED
:
422 rp_error("refusing to update checked out branch: %s", name
);
423 if (deny_current_branch
== DENY_UNCONFIGURED
)
424 refuse_unconfigured_deny();
425 return "branch is currently checked out";
429 if (!is_null_sha1(new_sha1
) && !has_sha1_file(new_sha1
)) {
430 error("unpack should have generated %s, "
431 "but I can't find it!", sha1_to_hex(new_sha1
));
435 if (!is_null_sha1(old_sha1
) && is_null_sha1(new_sha1
)) {
436 if (deny_deletes
&& !prefixcmp(name
, "refs/heads/")) {
437 rp_error("denying ref deletion for %s", name
);
438 return "deletion prohibited";
441 if (!strcmp(namespaced_name
, head_name
)) {
442 switch (deny_delete_current
) {
446 rp_warning("deleting the current branch");
449 case DENY_UNCONFIGURED
:
450 if (deny_delete_current
== DENY_UNCONFIGURED
)
451 refuse_unconfigured_deny_delete_current();
452 rp_error("refusing to delete the current branch: %s", name
);
453 return "deletion of the current branch prohibited";
458 if (deny_non_fast_forwards
&& !is_null_sha1(new_sha1
) &&
459 !is_null_sha1(old_sha1
) &&
460 !prefixcmp(name
, "refs/heads/")) {
461 struct object
*old_object
, *new_object
;
462 struct commit
*old_commit
, *new_commit
;
463 struct commit_list
*bases
, *ent
;
465 old_object
= parse_object(old_sha1
);
466 new_object
= parse_object(new_sha1
);
468 if (!old_object
|| !new_object
||
469 old_object
->type
!= OBJ_COMMIT
||
470 new_object
->type
!= OBJ_COMMIT
) {
471 error("bad sha1 objects for %s", name
);
474 old_commit
= (struct commit
*)old_object
;
475 new_commit
= (struct commit
*)new_object
;
476 bases
= get_merge_bases(old_commit
, new_commit
, 1);
477 for (ent
= bases
; ent
; ent
= ent
->next
)
478 if (!hashcmp(old_sha1
, ent
->item
->object
.sha1
))
480 free_commit_list(bases
);
482 rp_error("denying non-fast-forward %s"
483 " (you should pull first)", name
);
484 return "non-fast-forward";
487 if (run_update_hook(cmd
)) {
488 rp_error("hook declined to update %s", name
);
489 return "hook declined";
492 if (is_null_sha1(new_sha1
)) {
493 if (!parse_object(old_sha1
)) {
495 if (ref_exists(name
)) {
496 rp_warning("Allowing deletion of corrupt ref.");
498 rp_warning("Deleting a non-existent ref.");
499 cmd
->did_not_exist
= 1;
502 if (delete_ref(namespaced_name
, old_sha1
, 0)) {
503 rp_error("failed to delete %s", name
);
504 return "failed to delete";
506 return NULL
; /* good */
509 lock
= lock_any_ref_for_update(namespaced_name
, old_sha1
, 0);
511 rp_error("failed to lock %s", name
);
512 return "failed to lock";
514 if (write_ref_sha1(lock
, new_sha1
, "push")) {
515 return "failed to write"; /* error() already called */
517 return NULL
; /* good */
521 static char update_post_hook
[] = "hooks/post-update";
523 static void run_update_post_hook(struct command
*commands
)
528 struct child_process proc
;
530 for (argc
= 0, cmd
= commands
; cmd
; cmd
= cmd
->next
) {
531 if (cmd
->error_string
|| cmd
->did_not_exist
)
535 if (!argc
|| access(update_post_hook
, X_OK
) < 0)
537 argv
= xmalloc(sizeof(*argv
) * (2 + argc
));
538 argv
[0] = update_post_hook
;
540 for (argc
= 1, cmd
= commands
; cmd
; cmd
= cmd
->next
) {
542 if (cmd
->error_string
|| cmd
->did_not_exist
)
544 p
= xmalloc(strlen(cmd
->ref_name
) + 1);
545 strcpy(p
, cmd
->ref_name
);
551 memset(&proc
, 0, sizeof(proc
));
553 proc
.stdout_to_stderr
= 1;
554 proc
.err
= use_sideband
? -1 : 0;
557 if (!start_command(&proc
)) {
559 copy_to_sideband(proc
.err
, -1, NULL
);
560 finish_command(&proc
);
564 static void check_aliased_update(struct command
*cmd
, struct string_list
*list
)
566 struct strbuf buf
= STRBUF_INIT
;
567 const char *dst_name
;
568 struct string_list_item
*item
;
569 struct command
*dst_cmd
;
570 unsigned char sha1
[20];
571 char cmd_oldh
[41], cmd_newh
[41], dst_oldh
[41], dst_newh
[41];
574 strbuf_addf(&buf
, "%s%s", get_git_namespace(), cmd
->ref_name
);
575 dst_name
= resolve_ref_unsafe(buf
.buf
, sha1
, 0, &flag
);
576 strbuf_release(&buf
);
578 if (!(flag
& REF_ISSYMREF
))
581 dst_name
= strip_namespace(dst_name
);
583 rp_error("refusing update to broken symref '%s'", cmd
->ref_name
);
584 cmd
->skip_update
= 1;
585 cmd
->error_string
= "broken symref";
589 if ((item
= string_list_lookup(list
, dst_name
)) == NULL
)
592 cmd
->skip_update
= 1;
594 dst_cmd
= (struct command
*) item
->util
;
596 if (!hashcmp(cmd
->old_sha1
, dst_cmd
->old_sha1
) &&
597 !hashcmp(cmd
->new_sha1
, dst_cmd
->new_sha1
))
600 dst_cmd
->skip_update
= 1;
602 strcpy(cmd_oldh
, find_unique_abbrev(cmd
->old_sha1
, DEFAULT_ABBREV
));
603 strcpy(cmd_newh
, find_unique_abbrev(cmd
->new_sha1
, DEFAULT_ABBREV
));
604 strcpy(dst_oldh
, find_unique_abbrev(dst_cmd
->old_sha1
, DEFAULT_ABBREV
));
605 strcpy(dst_newh
, find_unique_abbrev(dst_cmd
->new_sha1
, DEFAULT_ABBREV
));
606 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
607 " its target '%s' (%s..%s)",
608 cmd
->ref_name
, cmd_oldh
, cmd_newh
,
609 dst_cmd
->ref_name
, dst_oldh
, dst_newh
);
611 cmd
->error_string
= dst_cmd
->error_string
=
612 "inconsistent aliased update";
615 static void check_aliased_updates(struct command
*commands
)
618 struct string_list ref_list
= STRING_LIST_INIT_NODUP
;
620 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
621 struct string_list_item
*item
=
622 string_list_append(&ref_list
, cmd
->ref_name
);
623 item
->util
= (void *)cmd
;
625 sort_string_list(&ref_list
);
627 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
628 check_aliased_update(cmd
, &ref_list
);
630 string_list_clear(&ref_list
, 0);
633 static int command_singleton_iterator(void *cb_data
, unsigned char sha1
[20])
635 struct command
**cmd_list
= cb_data
;
636 struct command
*cmd
= *cmd_list
;
638 if (!cmd
|| is_null_sha1(cmd
->new_sha1
))
639 return -1; /* end of list */
640 *cmd_list
= NULL
; /* this returns only one */
641 hashcpy(sha1
, cmd
->new_sha1
);
645 static void set_connectivity_errors(struct command
*commands
)
649 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
650 struct command
*singleton
= cmd
;
651 if (!check_everything_connected(command_singleton_iterator
,
654 cmd
->error_string
= "missing necessary objects";
658 static int iterate_receive_command_list(void *cb_data
, unsigned char sha1
[20])
660 struct command
**cmd_list
= cb_data
;
661 struct command
*cmd
= *cmd_list
;
664 if (!is_null_sha1(cmd
->new_sha1
)) {
665 hashcpy(sha1
, cmd
->new_sha1
);
666 *cmd_list
= cmd
->next
;
672 return -1; /* end of list */
675 static void execute_commands(struct command
*commands
, const char *unpacker_error
)
678 unsigned char sha1
[20];
680 if (unpacker_error
) {
681 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
682 cmd
->error_string
= "n/a (unpacker error)";
687 if (check_everything_connected(iterate_receive_command_list
,
689 set_connectivity_errors(commands
);
691 if (run_receive_hook(commands
, pre_receive_hook
, 0)) {
692 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
693 cmd
->error_string
= "pre-receive hook declined";
697 check_aliased_updates(commands
);
699 free(head_name_to_free
);
700 head_name
= head_name_to_free
= resolve_refdup("HEAD", sha1
, 0, NULL
);
702 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
703 if (!cmd
->skip_update
)
704 cmd
->error_string
= update(cmd
);
707 static struct command
*read_head_info(void)
709 struct command
*commands
= NULL
;
710 struct command
**p
= &commands
;
712 static char line
[1000];
713 unsigned char old_sha1
[20], new_sha1
[20];
718 len
= packet_read_line(0, line
, sizeof(line
));
721 if (line
[len
-1] == '\n')
726 get_sha1_hex(line
, old_sha1
) ||
727 get_sha1_hex(line
+ 41, new_sha1
))
728 die("protocol error: expected old/new/ref, got '%s'",
732 reflen
= strlen(refname
);
733 if (reflen
+ 82 < len
) {
734 if (strstr(refname
+ reflen
+ 1, "report-status"))
736 if (strstr(refname
+ reflen
+ 1, "side-band-64k"))
737 use_sideband
= LARGE_PACKET_MAX
;
739 cmd
= xcalloc(1, sizeof(struct command
) + len
- 80);
740 hashcpy(cmd
->old_sha1
, old_sha1
);
741 hashcpy(cmd
->new_sha1
, new_sha1
);
742 memcpy(cmd
->ref_name
, line
+ 82, len
- 81);
749 static const char *parse_pack_header(struct pack_header
*hdr
)
751 switch (read_pack_header(0, hdr
)) {
753 return "eof before pack header was fully read";
755 case PH_ERROR_PACK_SIGNATURE
:
756 return "protocol error (pack signature mismatch detected)";
758 case PH_ERROR_PROTOCOL
:
759 return "protocol error (pack version unsupported)";
762 return "unknown error in parse_pack_header";
769 static const char *pack_lockfile
;
771 static const char *unpack(void)
773 struct pack_header hdr
;
776 int fsck_objects
= (receive_fsck_objects
>= 0
777 ? receive_fsck_objects
778 : transfer_fsck_objects
>= 0
779 ? transfer_fsck_objects
782 hdr_err
= parse_pack_header(&hdr
);
785 snprintf(hdr_arg
, sizeof(hdr_arg
),
786 "--pack_header=%"PRIu32
",%"PRIu32
,
787 ntohl(hdr
.hdr_version
), ntohl(hdr
.hdr_entries
));
789 if (ntohl(hdr
.hdr_entries
) < unpack_limit
) {
791 const char *unpacker
[4];
792 unpacker
[i
++] = "unpack-objects";
794 unpacker
[i
++] = "--strict";
795 unpacker
[i
++] = hdr_arg
;
796 unpacker
[i
++] = NULL
;
797 code
= run_command_v_opt(unpacker
, RUN_GIT_CMD
);
800 return "unpack-objects abnormal exit";
802 const char *keeper
[7];
803 int s
, status
, i
= 0;
805 struct child_process ip
;
807 s
= sprintf(keep_arg
, "--keep=receive-pack %"PRIuMAX
" on ", (uintmax_t) getpid());
808 if (gethostname(keep_arg
+ s
, sizeof(keep_arg
) - s
))
809 strcpy(keep_arg
+ s
, "localhost");
811 keeper
[i
++] = "index-pack";
812 keeper
[i
++] = "--stdin";
814 keeper
[i
++] = "--strict";
815 keeper
[i
++] = "--fix-thin";
816 keeper
[i
++] = hdr_arg
;
817 keeper
[i
++] = keep_arg
;
819 memset(&ip
, 0, sizeof(ip
));
823 status
= start_command(&ip
);
825 return "index-pack fork failed";
827 pack_lockfile
= index_pack_lockfile(ip
.out
);
829 status
= finish_command(&ip
);
831 reprepare_packed_git();
834 return "index-pack abnormal exit";
838 static void report(struct command
*commands
, const char *unpack_status
)
841 struct strbuf buf
= STRBUF_INIT
;
843 packet_buf_write(&buf
, "unpack %s\n",
844 unpack_status
? unpack_status
: "ok");
845 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
846 if (!cmd
->error_string
)
847 packet_buf_write(&buf
, "ok %s\n",
850 packet_buf_write(&buf
, "ng %s %s\n",
851 cmd
->ref_name
, cmd
->error_string
);
853 packet_buf_flush(&buf
);
856 send_sideband(1, 1, buf
.buf
, buf
.len
, use_sideband
);
858 safe_write(1, buf
.buf
, buf
.len
);
859 strbuf_release(&buf
);
862 static int delete_only(struct command
*commands
)
865 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
866 if (!is_null_sha1(cmd
->new_sha1
))
872 static void add_one_alternate_sha1(const unsigned char sha1
[20], void *unused
)
874 add_extra_ref(".have", sha1
, 0);
877 static void collect_one_alternate_ref(const struct ref
*ref
, void *data
)
879 struct sha1_array
*sa
= data
;
880 sha1_array_append(sa
, ref
->old_sha1
);
883 static void add_alternate_refs(void)
885 struct sha1_array sa
= SHA1_ARRAY_INIT
;
886 for_each_alternate_ref(collect_one_alternate_ref
, &sa
);
887 sha1_array_for_each_unique(&sa
, add_one_alternate_sha1
, NULL
);
888 sha1_array_clear(&sa
);
891 int cmd_receive_pack(int argc
, const char **argv
, const char *prefix
)
893 int advertise_refs
= 0;
894 int stateless_rpc
= 0;
897 struct command
*commands
;
899 packet_trace_identity("receive-pack");
902 for (i
= 1; i
< argc
; i
++) {
903 const char *arg
= *argv
++;
906 if (!strcmp(arg
, "--advertise-refs")) {
910 if (!strcmp(arg
, "--stateless-rpc")) {
915 usage(receive_pack_usage
);
918 usage(receive_pack_usage
);
922 usage(receive_pack_usage
);
926 if (!enter_repo(dir
, 0))
927 die("'%s' does not appear to be a git repository", dir
);
929 if (is_repository_shallow())
930 die("attempt to push into a shallow repository");
932 git_config(receive_pack_config
, NULL
);
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
;
939 if (advertise_refs
|| !stateless_rpc
) {
940 add_alternate_refs();
950 if ((commands
= read_head_info()) != NULL
) {
951 const char *unpack_status
= NULL
;
953 if (!delete_only(commands
))
954 unpack_status
= unpack();
955 execute_commands(commands
, unpack_status
);
957 unlink_or_warn(pack_lockfile
);
959 report(commands
, unpack_status
);
960 run_receive_hook(commands
, post_receive_hook
, 1);
961 run_update_post_hook(commands
);
963 const char *argv_gc_auto
[] = {
964 "gc", "--auto", "--quiet", NULL
,
966 run_command_v_opt(argv_gc_auto
, RUN_GIT_CMD
);
968 if (auto_update_server_info
)
969 update_server_info(0);