7 #include "run-command.h"
13 #include "transport.h"
14 #include "string-list.h"
15 #include "sha1-array.h"
16 #include "connected.h"
17 #include "argv-array.h"
21 static const char receive_pack_usage
[] = "git receive-pack <git-dir>";
30 static int deny_deletes
;
31 static int deny_non_fast_forwards
;
32 static enum deny_action deny_current_branch
= DENY_UNCONFIGURED
;
33 static enum deny_action deny_delete_current
= DENY_UNCONFIGURED
;
34 static int receive_fsck_objects
= -1;
35 static int transfer_fsck_objects
= -1;
36 static int receive_unpack_limit
= -1;
37 static int transfer_unpack_limit
= -1;
38 static int unpack_limit
= 100;
39 static int report_status
;
40 static int use_sideband
;
42 static int prefer_ofs_delta
= 1;
43 static int auto_update_server_info
;
44 static int auto_gc
= 1;
45 static int fix_thin
= 1;
46 static const char *head_name
;
47 static void *head_name_to_free
;
48 static int sent_capabilities
;
49 static int shallow_update
;
50 static const char *alt_shallow_file
;
52 static enum deny_action
parse_deny_action(const char *var
, const char *value
)
55 if (!strcasecmp(value
, "ignore"))
57 if (!strcasecmp(value
, "warn"))
59 if (!strcasecmp(value
, "refuse"))
62 if (git_config_bool(var
, value
))
67 static int receive_pack_config(const char *var
, const char *value
, void *cb
)
69 int status
= parse_hide_refs_config(var
, value
, "receive");
74 if (strcmp(var
, "receive.denydeletes") == 0) {
75 deny_deletes
= git_config_bool(var
, value
);
79 if (strcmp(var
, "receive.denynonfastforwards") == 0) {
80 deny_non_fast_forwards
= git_config_bool(var
, value
);
84 if (strcmp(var
, "receive.unpacklimit") == 0) {
85 receive_unpack_limit
= git_config_int(var
, value
);
89 if (strcmp(var
, "transfer.unpacklimit") == 0) {
90 transfer_unpack_limit
= git_config_int(var
, value
);
94 if (strcmp(var
, "receive.fsckobjects") == 0) {
95 receive_fsck_objects
= git_config_bool(var
, value
);
99 if (strcmp(var
, "transfer.fsckobjects") == 0) {
100 transfer_fsck_objects
= git_config_bool(var
, value
);
104 if (!strcmp(var
, "receive.denycurrentbranch")) {
105 deny_current_branch
= parse_deny_action(var
, value
);
109 if (strcmp(var
, "receive.denydeletecurrent") == 0) {
110 deny_delete_current
= parse_deny_action(var
, value
);
114 if (strcmp(var
, "repack.usedeltabaseoffset") == 0) {
115 prefer_ofs_delta
= git_config_bool(var
, value
);
119 if (strcmp(var
, "receive.updateserverinfo") == 0) {
120 auto_update_server_info
= git_config_bool(var
, value
);
124 if (strcmp(var
, "receive.autogc") == 0) {
125 auto_gc
= git_config_bool(var
, value
);
129 if (strcmp(var
, "receive.shallowupdate") == 0) {
130 shallow_update
= git_config_bool(var
, value
);
134 return git_default_config(var
, value
, cb
);
137 static void show_ref(const char *path
, const unsigned char *sha1
)
139 if (ref_is_hidden(path
))
142 if (sent_capabilities
)
143 packet_write(1, "%s %s\n", sha1_to_hex(sha1
), path
);
145 packet_write(1, "%s %s%c%s%s agent=%s\n",
146 sha1_to_hex(sha1
), path
, 0,
147 " report-status delete-refs side-band-64k quiet",
148 prefer_ofs_delta
? " ofs-delta" : "",
149 git_user_agent_sanitized());
150 sent_capabilities
= 1;
153 static int show_ref_cb(const char *path
, const unsigned char *sha1
, int flag
, void *unused
)
155 path
= strip_namespace(path
);
157 * Advertise refs outside our current namespace as ".have"
158 * refs, so that the client can use them to minimize data
159 * transfer but will otherwise ignore them. This happens to
160 * cover ".have" that are thrown in by add_one_alternate_ref()
161 * to mark histories that are complete in our alternates as
166 show_ref(path
, sha1
);
170 static void show_one_alternate_sha1(const unsigned char sha1
[20], void *unused
)
172 show_ref(".have", sha1
);
175 static void collect_one_alternate_ref(const struct ref
*ref
, void *data
)
177 struct sha1_array
*sa
= data
;
178 sha1_array_append(sa
, ref
->old_sha1
);
181 static void write_head_info(void)
183 struct sha1_array sa
= SHA1_ARRAY_INIT
;
184 for_each_alternate_ref(collect_one_alternate_ref
, &sa
);
185 sha1_array_for_each_unique(&sa
, show_one_alternate_sha1
, NULL
);
186 sha1_array_clear(&sa
);
187 for_each_ref(show_ref_cb
, NULL
);
188 if (!sent_capabilities
)
189 show_ref("capabilities^{}", null_sha1
);
191 advertise_shallow_grafts(1);
198 struct command
*next
;
199 const char *error_string
;
200 unsigned int skip_update
:1,
203 unsigned char old_sha1
[20];
204 unsigned char new_sha1
[20];
205 char ref_name
[FLEX_ARRAY
]; /* more */
208 static void rp_error(const char *err
, ...) __attribute__((format (printf
, 1, 2)));
209 static void rp_warning(const char *err
, ...) __attribute__((format (printf
, 1, 2)));
211 static void report_message(const char *prefix
, const char *err
, va_list params
)
213 int sz
= strlen(prefix
);
216 strncpy(msg
, prefix
, sz
);
217 sz
+= vsnprintf(msg
+ sz
, sizeof(msg
) - sz
, err
, params
);
218 if (sz
> (sizeof(msg
) - 1))
219 sz
= sizeof(msg
) - 1;
223 send_sideband(1, 2, msg
, sz
, use_sideband
);
228 static void rp_warning(const char *err
, ...)
231 va_start(params
, err
);
232 report_message("warning: ", err
, params
);
236 static void rp_error(const char *err
, ...)
239 va_start(params
, err
);
240 report_message("error: ", err
, params
);
244 static int copy_to_sideband(int in
, int out
, void *arg
)
248 ssize_t sz
= xread(in
, data
, sizeof(data
));
251 send_sideband(1, 2, data
, sz
, use_sideband
);
257 typedef int (*feed_fn
)(void *, const char **, size_t *);
258 static int run_and_feed_hook(const char *hook_name
, feed_fn feed
, void *feed_state
)
260 struct child_process proc
= CHILD_PROCESS_INIT
;
265 argv
[0] = find_hook(hook_name
);
273 proc
.stdout_to_stderr
= 1;
276 memset(&muxer
, 0, sizeof(muxer
));
277 muxer
.proc
= copy_to_sideband
;
279 code
= start_async(&muxer
);
285 code
= start_command(&proc
);
288 finish_async(&muxer
);
292 sigchain_push(SIGPIPE
, SIG_IGN
);
297 if (feed(feed_state
, &buf
, &n
))
299 if (write_in_full(proc
.in
, buf
, n
) != n
)
304 finish_async(&muxer
);
306 sigchain_pop(SIGPIPE
);
308 return finish_command(&proc
);
311 struct receive_hook_feed_state
{
317 static int feed_receive_hook(void *state_
, const char **bufp
, size_t *sizep
)
319 struct receive_hook_feed_state
*state
= state_
;
320 struct command
*cmd
= state
->cmd
;
323 state
->skip_broken
&& (cmd
->error_string
|| cmd
->did_not_exist
))
327 strbuf_reset(&state
->buf
);
328 strbuf_addf(&state
->buf
, "%s %s %s\n",
329 sha1_to_hex(cmd
->old_sha1
), sha1_to_hex(cmd
->new_sha1
),
331 state
->cmd
= cmd
->next
;
333 *bufp
= state
->buf
.buf
;
334 *sizep
= state
->buf
.len
;
339 static int run_receive_hook(struct command
*commands
, const char *hook_name
,
342 struct receive_hook_feed_state state
;
345 strbuf_init(&state
.buf
, 0);
346 state
.cmd
= commands
;
347 state
.skip_broken
= skip_broken
;
348 if (feed_receive_hook(&state
, NULL
, NULL
))
350 state
.cmd
= commands
;
351 status
= run_and_feed_hook(hook_name
, feed_receive_hook
, &state
);
352 strbuf_release(&state
.buf
);
356 static int run_update_hook(struct command
*cmd
)
359 struct child_process proc
= CHILD_PROCESS_INIT
;
362 argv
[0] = find_hook("update");
366 argv
[1] = cmd
->ref_name
;
367 argv
[2] = sha1_to_hex(cmd
->old_sha1
);
368 argv
[3] = sha1_to_hex(cmd
->new_sha1
);
372 proc
.stdout_to_stderr
= 1;
373 proc
.err
= use_sideband
? -1 : 0;
376 code
= start_command(&proc
);
380 copy_to_sideband(proc
.err
, -1, NULL
);
381 return finish_command(&proc
);
384 static int is_ref_checked_out(const char *ref
)
386 if (is_bare_repository())
391 return !strcmp(head_name
, ref
);
394 static char *refuse_unconfigured_deny_msg
[] = {
395 "By default, updating the current branch in a non-bare repository",
396 "is denied, because it will make the index and work tree inconsistent",
397 "with what you pushed, and will require 'git reset --hard' to match",
398 "the work tree to HEAD.",
400 "You can set 'receive.denyCurrentBranch' configuration variable to",
401 "'ignore' or 'warn' in the remote repository to allow pushing into",
402 "its current branch; however, this is not recommended unless you",
403 "arranged to update its work tree to match what you pushed in some",
406 "To squelch this message and still keep the default behaviour, set",
407 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
410 static void refuse_unconfigured_deny(void)
413 for (i
= 0; i
< ARRAY_SIZE(refuse_unconfigured_deny_msg
); i
++)
414 rp_error("%s", refuse_unconfigured_deny_msg
[i
]);
417 static char *refuse_unconfigured_deny_delete_current_msg
[] = {
418 "By default, deleting the current branch is denied, because the next",
419 "'git clone' won't result in any file checked out, causing confusion.",
421 "You can set 'receive.denyDeleteCurrent' configuration variable to",
422 "'warn' or 'ignore' in the remote repository to allow deleting the",
423 "current branch, with or without a warning message.",
425 "To squelch this message, you can set it to 'refuse'."
428 static void refuse_unconfigured_deny_delete_current(void)
432 i
< ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg
);
434 rp_error("%s", refuse_unconfigured_deny_delete_current_msg
[i
]);
437 static int command_singleton_iterator(void *cb_data
, unsigned char sha1
[20]);
438 static int update_shallow_ref(struct command
*cmd
, struct shallow_info
*si
)
440 static struct lock_file shallow_lock
;
441 struct sha1_array extra
= SHA1_ARRAY_INIT
;
442 const char *alt_file
;
443 uint32_t mask
= 1 << (cmd
->index
% 32);
446 trace_printf_key(&trace_shallow
,
447 "shallow: update_shallow_ref %s\n", cmd
->ref_name
);
448 for (i
= 0; i
< si
->shallow
->nr
; i
++)
449 if (si
->used_shallow
[i
] &&
450 (si
->used_shallow
[i
][cmd
->index
/ 32] & mask
) &&
451 !delayed_reachability_test(si
, i
))
452 sha1_array_append(&extra
, si
->shallow
->sha1
[i
]);
454 setup_alternate_shallow(&shallow_lock
, &alt_file
, &extra
);
455 if (check_shallow_connected(command_singleton_iterator
,
457 rollback_lock_file(&shallow_lock
);
458 sha1_array_clear(&extra
);
462 commit_lock_file(&shallow_lock
);
465 * Make sure setup_alternate_shallow() for the next ref does
466 * not lose these new roots..
468 for (i
= 0; i
< extra
.nr
; i
++)
469 register_shallow(extra
.sha1
[i
]);
471 si
->shallow_ref
[cmd
->index
] = 0;
472 sha1_array_clear(&extra
);
476 static const char *update(struct command
*cmd
, struct shallow_info
*si
)
478 const char *name
= cmd
->ref_name
;
479 struct strbuf namespaced_name_buf
= STRBUF_INIT
;
480 const char *namespaced_name
;
481 unsigned char *old_sha1
= cmd
->old_sha1
;
482 unsigned char *new_sha1
= cmd
->new_sha1
;
484 /* only refs/... are allowed */
485 if (!starts_with(name
, "refs/") || check_refname_format(name
+ 5, 0)) {
486 rp_error("refusing to create funny ref '%s' remotely", name
);
487 return "funny refname";
490 strbuf_addf(&namespaced_name_buf
, "%s%s", get_git_namespace(), name
);
491 namespaced_name
= strbuf_detach(&namespaced_name_buf
, NULL
);
493 if (is_ref_checked_out(namespaced_name
)) {
494 switch (deny_current_branch
) {
498 rp_warning("updating the current branch");
501 case DENY_UNCONFIGURED
:
502 rp_error("refusing to update checked out branch: %s", name
);
503 if (deny_current_branch
== DENY_UNCONFIGURED
)
504 refuse_unconfigured_deny();
505 return "branch is currently checked out";
509 if (!is_null_sha1(new_sha1
) && !has_sha1_file(new_sha1
)) {
510 error("unpack should have generated %s, "
511 "but I can't find it!", sha1_to_hex(new_sha1
));
515 if (!is_null_sha1(old_sha1
) && is_null_sha1(new_sha1
)) {
516 if (deny_deletes
&& starts_with(name
, "refs/heads/")) {
517 rp_error("denying ref deletion for %s", name
);
518 return "deletion prohibited";
521 if (!strcmp(namespaced_name
, head_name
)) {
522 switch (deny_delete_current
) {
526 rp_warning("deleting the current branch");
529 case DENY_UNCONFIGURED
:
530 if (deny_delete_current
== DENY_UNCONFIGURED
)
531 refuse_unconfigured_deny_delete_current();
532 rp_error("refusing to delete the current branch: %s", name
);
533 return "deletion of the current branch prohibited";
538 if (deny_non_fast_forwards
&& !is_null_sha1(new_sha1
) &&
539 !is_null_sha1(old_sha1
) &&
540 starts_with(name
, "refs/heads/")) {
541 struct object
*old_object
, *new_object
;
542 struct commit
*old_commit
, *new_commit
;
544 old_object
= parse_object(old_sha1
);
545 new_object
= parse_object(new_sha1
);
547 if (!old_object
|| !new_object
||
548 old_object
->type
!= OBJ_COMMIT
||
549 new_object
->type
!= OBJ_COMMIT
) {
550 error("bad sha1 objects for %s", name
);
553 old_commit
= (struct commit
*)old_object
;
554 new_commit
= (struct commit
*)new_object
;
555 if (!in_merge_bases(old_commit
, new_commit
)) {
556 rp_error("denying non-fast-forward %s"
557 " (you should pull first)", name
);
558 return "non-fast-forward";
561 if (run_update_hook(cmd
)) {
562 rp_error("hook declined to update %s", name
);
563 return "hook declined";
566 if (is_null_sha1(new_sha1
)) {
567 if (!parse_object(old_sha1
)) {
569 if (ref_exists(name
)) {
570 rp_warning("Allowing deletion of corrupt ref.");
572 rp_warning("Deleting a non-existent ref.");
573 cmd
->did_not_exist
= 1;
576 if (delete_ref(namespaced_name
, old_sha1
, 0)) {
577 rp_error("failed to delete %s", name
);
578 return "failed to delete";
580 return NULL
; /* good */
583 struct strbuf err
= STRBUF_INIT
;
584 struct ref_transaction
*transaction
;
586 if (shallow_update
&& si
->shallow_ref
[cmd
->index
] &&
587 update_shallow_ref(cmd
, si
))
588 return "shallow error";
590 transaction
= ref_transaction_begin(&err
);
592 ref_transaction_update(transaction
, namespaced_name
,
593 new_sha1
, old_sha1
, 0, 1, &err
) ||
594 ref_transaction_commit(transaction
, "push", &err
)) {
595 ref_transaction_free(transaction
);
597 rp_error("%s", err
.buf
);
598 strbuf_release(&err
);
599 return "failed to update ref";
602 ref_transaction_free(transaction
);
603 strbuf_release(&err
);
604 return NULL
; /* good */
608 static void run_update_post_hook(struct command
*commands
)
613 struct child_process proc
= CHILD_PROCESS_INIT
;
616 hook
= find_hook("post-update");
617 for (argc
= 0, cmd
= commands
; cmd
; cmd
= cmd
->next
) {
618 if (cmd
->error_string
|| cmd
->did_not_exist
)
625 argv
= xmalloc(sizeof(*argv
) * (2 + argc
));
628 for (argc
= 1, cmd
= commands
; cmd
; cmd
= cmd
->next
) {
629 if (cmd
->error_string
|| cmd
->did_not_exist
)
631 argv
[argc
] = xstrdup(cmd
->ref_name
);
637 proc
.stdout_to_stderr
= 1;
638 proc
.err
= use_sideband
? -1 : 0;
641 if (!start_command(&proc
)) {
643 copy_to_sideband(proc
.err
, -1, NULL
);
644 finish_command(&proc
);
648 static void check_aliased_update(struct command
*cmd
, struct string_list
*list
)
650 struct strbuf buf
= STRBUF_INIT
;
651 const char *dst_name
;
652 struct string_list_item
*item
;
653 struct command
*dst_cmd
;
654 unsigned char sha1
[20];
655 char cmd_oldh
[41], cmd_newh
[41], dst_oldh
[41], dst_newh
[41];
658 strbuf_addf(&buf
, "%s%s", get_git_namespace(), cmd
->ref_name
);
659 dst_name
= resolve_ref_unsafe(buf
.buf
, sha1
, 0, &flag
);
660 strbuf_release(&buf
);
662 if (!(flag
& REF_ISSYMREF
))
665 dst_name
= strip_namespace(dst_name
);
667 rp_error("refusing update to broken symref '%s'", cmd
->ref_name
);
668 cmd
->skip_update
= 1;
669 cmd
->error_string
= "broken symref";
673 if ((item
= string_list_lookup(list
, dst_name
)) == NULL
)
676 cmd
->skip_update
= 1;
678 dst_cmd
= (struct command
*) item
->util
;
680 if (!hashcmp(cmd
->old_sha1
, dst_cmd
->old_sha1
) &&
681 !hashcmp(cmd
->new_sha1
, dst_cmd
->new_sha1
))
684 dst_cmd
->skip_update
= 1;
686 strcpy(cmd_oldh
, find_unique_abbrev(cmd
->old_sha1
, DEFAULT_ABBREV
));
687 strcpy(cmd_newh
, find_unique_abbrev(cmd
->new_sha1
, DEFAULT_ABBREV
));
688 strcpy(dst_oldh
, find_unique_abbrev(dst_cmd
->old_sha1
, DEFAULT_ABBREV
));
689 strcpy(dst_newh
, find_unique_abbrev(dst_cmd
->new_sha1
, DEFAULT_ABBREV
));
690 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
691 " its target '%s' (%s..%s)",
692 cmd
->ref_name
, cmd_oldh
, cmd_newh
,
693 dst_cmd
->ref_name
, dst_oldh
, dst_newh
);
695 cmd
->error_string
= dst_cmd
->error_string
=
696 "inconsistent aliased update";
699 static void check_aliased_updates(struct command
*commands
)
702 struct string_list ref_list
= STRING_LIST_INIT_NODUP
;
704 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
705 struct string_list_item
*item
=
706 string_list_append(&ref_list
, cmd
->ref_name
);
707 item
->util
= (void *)cmd
;
709 sort_string_list(&ref_list
);
711 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
712 if (!cmd
->error_string
)
713 check_aliased_update(cmd
, &ref_list
);
716 string_list_clear(&ref_list
, 0);
719 static int command_singleton_iterator(void *cb_data
, unsigned char sha1
[20])
721 struct command
**cmd_list
= cb_data
;
722 struct command
*cmd
= *cmd_list
;
724 if (!cmd
|| is_null_sha1(cmd
->new_sha1
))
725 return -1; /* end of list */
726 *cmd_list
= NULL
; /* this returns only one */
727 hashcpy(sha1
, cmd
->new_sha1
);
731 static void set_connectivity_errors(struct command
*commands
,
732 struct shallow_info
*si
)
736 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
737 struct command
*singleton
= cmd
;
738 if (shallow_update
&& si
->shallow_ref
[cmd
->index
])
739 /* to be checked in update_shallow_ref() */
741 if (!check_everything_connected(command_singleton_iterator
,
744 cmd
->error_string
= "missing necessary objects";
748 struct iterate_data
{
749 struct command
*cmds
;
750 struct shallow_info
*si
;
753 static int iterate_receive_command_list(void *cb_data
, unsigned char sha1
[20])
755 struct iterate_data
*data
= cb_data
;
756 struct command
**cmd_list
= &data
->cmds
;
757 struct command
*cmd
= *cmd_list
;
759 for (; cmd
; cmd
= cmd
->next
) {
760 if (shallow_update
&& data
->si
->shallow_ref
[cmd
->index
])
761 /* to be checked in update_shallow_ref() */
763 if (!is_null_sha1(cmd
->new_sha1
) && !cmd
->skip_update
) {
764 hashcpy(sha1
, cmd
->new_sha1
);
765 *cmd_list
= cmd
->next
;
770 return -1; /* end of list */
773 static void reject_updates_to_hidden(struct command
*commands
)
777 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
778 if (cmd
->error_string
|| !ref_is_hidden(cmd
->ref_name
))
780 if (is_null_sha1(cmd
->new_sha1
))
781 cmd
->error_string
= "deny deleting a hidden ref";
783 cmd
->error_string
= "deny updating a hidden ref";
787 static void execute_commands(struct command
*commands
,
788 const char *unpacker_error
,
789 struct shallow_info
*si
)
791 int checked_connectivity
;
793 unsigned char sha1
[20];
794 struct iterate_data data
;
796 if (unpacker_error
) {
797 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
798 cmd
->error_string
= "unpacker error";
802 data
.cmds
= commands
;
804 if (check_everything_connected(iterate_receive_command_list
, 0, &data
))
805 set_connectivity_errors(commands
, si
);
807 reject_updates_to_hidden(commands
);
809 if (run_receive_hook(commands
, "pre-receive", 0)) {
810 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
811 if (!cmd
->error_string
)
812 cmd
->error_string
= "pre-receive hook declined";
817 check_aliased_updates(commands
);
819 free(head_name_to_free
);
820 head_name
= head_name_to_free
= resolve_refdup("HEAD", sha1
, 0, NULL
);
822 checked_connectivity
= 1;
823 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
824 if (cmd
->error_string
)
827 if (cmd
->skip_update
)
830 cmd
->error_string
= update(cmd
, si
);
831 if (shallow_update
&& !cmd
->error_string
&&
832 si
->shallow_ref
[cmd
->index
]) {
833 error("BUG: connectivity check has not been run on ref %s",
835 checked_connectivity
= 0;
839 if (shallow_update
&& !checked_connectivity
)
840 error("BUG: run 'git fsck' for safety.\n"
841 "If there are errors, try to remove "
842 "the reported refs above");
845 static struct command
*read_head_info(struct sha1_array
*shallow
)
847 struct command
*commands
= NULL
;
848 struct command
**p
= &commands
;
851 unsigned char old_sha1
[20], new_sha1
[20];
856 line
= packet_read_line(0, &len
);
860 if (len
== 48 && starts_with(line
, "shallow ")) {
861 if (get_sha1_hex(line
+ 8, old_sha1
))
862 die("protocol error: expected shallow sha, got '%s'", line
+ 8);
863 sha1_array_append(shallow
, old_sha1
);
870 get_sha1_hex(line
, old_sha1
) ||
871 get_sha1_hex(line
+ 41, new_sha1
))
872 die("protocol error: expected old/new/ref, got '%s'",
876 reflen
= strlen(refname
);
877 if (reflen
+ 82 < len
) {
878 const char *feature_list
= refname
+ reflen
+ 1;
879 if (parse_feature_request(feature_list
, "report-status"))
881 if (parse_feature_request(feature_list
, "side-band-64k"))
882 use_sideband
= LARGE_PACKET_MAX
;
883 if (parse_feature_request(feature_list
, "quiet"))
886 cmd
= xcalloc(1, sizeof(struct command
) + len
- 80);
887 hashcpy(cmd
->old_sha1
, old_sha1
);
888 hashcpy(cmd
->new_sha1
, new_sha1
);
889 memcpy(cmd
->ref_name
, line
+ 82, len
- 81);
896 static const char *parse_pack_header(struct pack_header
*hdr
)
898 switch (read_pack_header(0, hdr
)) {
900 return "eof before pack header was fully read";
902 case PH_ERROR_PACK_SIGNATURE
:
903 return "protocol error (pack signature mismatch detected)";
905 case PH_ERROR_PROTOCOL
:
906 return "protocol error (pack version unsupported)";
909 return "unknown error in parse_pack_header";
916 static const char *pack_lockfile
;
918 static const char *unpack(int err_fd
, struct shallow_info
*si
)
920 struct pack_header hdr
;
921 struct argv_array av
= ARGV_ARRAY_INIT
;
925 struct child_process child
= CHILD_PROCESS_INIT
;
926 int fsck_objects
= (receive_fsck_objects
>= 0
927 ? receive_fsck_objects
928 : transfer_fsck_objects
>= 0
929 ? transfer_fsck_objects
932 hdr_err
= parse_pack_header(&hdr
);
938 snprintf(hdr_arg
, sizeof(hdr_arg
),
939 "--pack_header=%"PRIu32
",%"PRIu32
,
940 ntohl(hdr
.hdr_version
), ntohl(hdr
.hdr_entries
));
942 if (si
->nr_ours
|| si
->nr_theirs
) {
943 alt_shallow_file
= setup_temporary_shallow(si
->shallow
);
944 argv_array_pushl(&av
, "--shallow-file", alt_shallow_file
, NULL
);
947 if (ntohl(hdr
.hdr_entries
) < unpack_limit
) {
948 argv_array_pushl(&av
, "unpack-objects", hdr_arg
, NULL
);
950 argv_array_push(&av
, "-q");
952 argv_array_push(&av
, "--strict");
953 child
.argv
= av
.argv
;
957 status
= run_command(&child
);
959 return "unpack-objects abnormal exit";
964 s
= sprintf(keep_arg
, "--keep=receive-pack %"PRIuMAX
" on ", (uintmax_t) getpid());
965 if (gethostname(keep_arg
+ s
, sizeof(keep_arg
) - s
))
966 strcpy(keep_arg
+ s
, "localhost");
968 argv_array_pushl(&av
, "index-pack",
969 "--stdin", hdr_arg
, keep_arg
, NULL
);
971 argv_array_push(&av
, "--strict");
973 argv_array_push(&av
, "--fix-thin");
974 child
.argv
= av
.argv
;
978 status
= start_command(&child
);
980 return "index-pack fork failed";
981 pack_lockfile
= index_pack_lockfile(child
.out
);
983 status
= finish_command(&child
);
985 return "index-pack abnormal exit";
986 reprepare_packed_git();
991 static const char *unpack_with_sideband(struct shallow_info
*si
)
997 return unpack(0, si
);
999 memset(&muxer
, 0, sizeof(muxer
));
1000 muxer
.proc
= copy_to_sideband
;
1002 if (start_async(&muxer
))
1005 ret
= unpack(muxer
.in
, si
);
1007 finish_async(&muxer
);
1011 static void prepare_shallow_update(struct command
*commands
,
1012 struct shallow_info
*si
)
1014 int i
, j
, k
, bitmap_size
= (si
->ref
->nr
+ 31) / 32;
1016 si
->used_shallow
= xmalloc(sizeof(*si
->used_shallow
) *
1018 assign_shallow_commits_to_refs(si
, si
->used_shallow
, NULL
);
1020 si
->need_reachability_test
=
1021 xcalloc(si
->shallow
->nr
, sizeof(*si
->need_reachability_test
));
1023 xcalloc(si
->shallow
->nr
, sizeof(*si
->reachable
));
1024 si
->shallow_ref
= xcalloc(si
->ref
->nr
, sizeof(*si
->shallow_ref
));
1026 for (i
= 0; i
< si
->nr_ours
; i
++)
1027 si
->need_reachability_test
[si
->ours
[i
]] = 1;
1029 for (i
= 0; i
< si
->shallow
->nr
; i
++) {
1030 if (!si
->used_shallow
[i
])
1032 for (j
= 0; j
< bitmap_size
; j
++) {
1033 if (!si
->used_shallow
[i
][j
])
1035 si
->need_reachability_test
[i
]++;
1036 for (k
= 0; k
< 32; k
++)
1037 if (si
->used_shallow
[i
][j
] & (1 << k
))
1038 si
->shallow_ref
[j
* 32 + k
]++;
1042 * true for those associated with some refs and belong
1043 * in "ours" list aka "step 7 not done yet"
1045 si
->need_reachability_test
[i
] =
1046 si
->need_reachability_test
[i
] > 1;
1050 * keep hooks happy by forcing a temporary shallow file via
1051 * env variable because we can't add --shallow-file to every
1052 * command. check_everything_connected() will be done with
1053 * true .git/shallow though.
1055 setenv(GIT_SHALLOW_FILE_ENVIRONMENT
, alt_shallow_file
, 1);
1058 static void update_shallow_info(struct command
*commands
,
1059 struct shallow_info
*si
,
1060 struct sha1_array
*ref
)
1062 struct command
*cmd
;
1064 remove_nonexistent_theirs_shallow(si
);
1065 if (!si
->nr_ours
&& !si
->nr_theirs
) {
1070 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1071 if (is_null_sha1(cmd
->new_sha1
))
1073 sha1_array_append(ref
, cmd
->new_sha1
);
1074 cmd
->index
= ref
->nr
- 1;
1078 if (shallow_update
) {
1079 prepare_shallow_update(commands
, si
);
1083 ref_status
= xmalloc(sizeof(*ref_status
) * ref
->nr
);
1084 assign_shallow_commits_to_refs(si
, NULL
, ref_status
);
1085 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1086 if (is_null_sha1(cmd
->new_sha1
))
1088 if (ref_status
[cmd
->index
]) {
1089 cmd
->error_string
= "shallow update not allowed";
1090 cmd
->skip_update
= 1;
1096 static void report(struct command
*commands
, const char *unpack_status
)
1098 struct command
*cmd
;
1099 struct strbuf buf
= STRBUF_INIT
;
1101 packet_buf_write(&buf
, "unpack %s\n",
1102 unpack_status
? unpack_status
: "ok");
1103 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1104 if (!cmd
->error_string
)
1105 packet_buf_write(&buf
, "ok %s\n",
1108 packet_buf_write(&buf
, "ng %s %s\n",
1109 cmd
->ref_name
, cmd
->error_string
);
1111 packet_buf_flush(&buf
);
1114 send_sideband(1, 1, buf
.buf
, buf
.len
, use_sideband
);
1116 write_or_die(1, buf
.buf
, buf
.len
);
1117 strbuf_release(&buf
);
1120 static int delete_only(struct command
*commands
)
1122 struct command
*cmd
;
1123 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1124 if (!is_null_sha1(cmd
->new_sha1
))
1130 int cmd_receive_pack(int argc
, const char **argv
, const char *prefix
)
1132 int advertise_refs
= 0;
1133 int stateless_rpc
= 0;
1135 const char *dir
= NULL
;
1136 struct command
*commands
;
1137 struct sha1_array shallow
= SHA1_ARRAY_INIT
;
1138 struct sha1_array ref
= SHA1_ARRAY_INIT
;
1139 struct shallow_info si
;
1141 packet_trace_identity("receive-pack");
1144 for (i
= 1; i
< argc
; i
++) {
1145 const char *arg
= *argv
++;
1148 if (!strcmp(arg
, "--quiet")) {
1153 if (!strcmp(arg
, "--advertise-refs")) {
1157 if (!strcmp(arg
, "--stateless-rpc")) {
1161 if (!strcmp(arg
, "--reject-thin-pack-for-testing")) {
1166 usage(receive_pack_usage
);
1169 usage(receive_pack_usage
);
1173 usage(receive_pack_usage
);
1177 if (!enter_repo(dir
, 0))
1178 die("'%s' does not appear to be a git repository", dir
);
1180 git_config(receive_pack_config
, NULL
);
1182 if (0 <= transfer_unpack_limit
)
1183 unpack_limit
= transfer_unpack_limit
;
1184 else if (0 <= receive_unpack_limit
)
1185 unpack_limit
= receive_unpack_limit
;
1187 if (advertise_refs
|| !stateless_rpc
) {
1193 if ((commands
= read_head_info(&shallow
)) != NULL
) {
1194 const char *unpack_status
= NULL
;
1196 prepare_shallow_info(&si
, &shallow
);
1197 if (!si
.nr_ours
&& !si
.nr_theirs
)
1199 if (!delete_only(commands
)) {
1200 unpack_status
= unpack_with_sideband(&si
);
1201 update_shallow_info(commands
, &si
, &ref
);
1203 execute_commands(commands
, unpack_status
, &si
);
1205 unlink_or_warn(pack_lockfile
);
1207 report(commands
, unpack_status
);
1208 run_receive_hook(commands
, "post-receive", 1);
1209 run_update_post_hook(commands
);
1211 const char *argv_gc_auto
[] = {
1212 "gc", "--auto", "--quiet", NULL
,
1214 int opt
= RUN_GIT_CMD
| RUN_COMMAND_STDOUT_TO_STDERR
;
1215 run_command_v_opt(argv_gc_auto
, opt
);
1217 if (auto_update_server_info
)
1218 update_server_info(0);
1219 clear_shallow_info(&si
);
1223 sha1_array_clear(&shallow
);
1224 sha1_array_clear(&ref
);