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
;
30 static int receive_unpack_limit
= -1;
31 static int transfer_unpack_limit
= -1;
32 static int unpack_limit
= 100;
33 static int report_status
;
34 static int use_sideband
;
35 static int prefer_ofs_delta
= 1;
36 static int auto_update_server_info
;
37 static int auto_gc
= 1;
38 static const char *head_name
;
39 static int sent_capabilities
;
41 static enum deny_action
parse_deny_action(const char *var
, const char *value
)
44 if (!strcasecmp(value
, "ignore"))
46 if (!strcasecmp(value
, "warn"))
48 if (!strcasecmp(value
, "refuse"))
51 if (git_config_bool(var
, value
))
56 static int receive_pack_config(const char *var
, const char *value
, void *cb
)
58 if (strcmp(var
, "receive.denydeletes") == 0) {
59 deny_deletes
= git_config_bool(var
, value
);
63 if (strcmp(var
, "receive.denynonfastforwards") == 0) {
64 deny_non_fast_forwards
= git_config_bool(var
, value
);
68 if (strcmp(var
, "receive.unpacklimit") == 0) {
69 receive_unpack_limit
= git_config_int(var
, value
);
73 if (strcmp(var
, "transfer.unpacklimit") == 0) {
74 transfer_unpack_limit
= git_config_int(var
, value
);
78 if (strcmp(var
, "receive.fsckobjects") == 0) {
79 receive_fsck_objects
= git_config_bool(var
, value
);
83 if (!strcmp(var
, "receive.denycurrentbranch")) {
84 deny_current_branch
= parse_deny_action(var
, value
);
88 if (strcmp(var
, "receive.denydeletecurrent") == 0) {
89 deny_delete_current
= parse_deny_action(var
, value
);
93 if (strcmp(var
, "repack.usedeltabaseoffset") == 0) {
94 prefer_ofs_delta
= git_config_bool(var
, value
);
98 if (strcmp(var
, "receive.updateserverinfo") == 0) {
99 auto_update_server_info
= git_config_bool(var
, value
);
103 if (strcmp(var
, "receive.autogc") == 0) {
104 auto_gc
= git_config_bool(var
, value
);
108 return git_default_config(var
, value
, cb
);
111 static int show_ref(const char *path
, const unsigned char *sha1
, int flag
, void *cb_data
)
113 if (sent_capabilities
)
114 packet_write(1, "%s %s\n", sha1_to_hex(sha1
), path
);
116 packet_write(1, "%s %s%c%s%s\n",
117 sha1_to_hex(sha1
), path
, 0,
118 " report-status delete-refs side-band-64k",
119 prefer_ofs_delta
? " ofs-delta" : "");
120 sent_capabilities
= 1;
124 static void write_head_info(void)
126 for_each_ref(show_ref
, NULL
);
127 if (!sent_capabilities
)
128 show_ref("capabilities^{}", null_sha1
, 0, NULL
);
133 struct command
*next
;
134 const char *error_string
;
135 unsigned int skip_update
;
136 unsigned char old_sha1
[20];
137 unsigned char new_sha1
[20];
138 char ref_name
[FLEX_ARRAY
]; /* more */
141 static const char pre_receive_hook
[] = "hooks/pre-receive";
142 static const char post_receive_hook
[] = "hooks/post-receive";
144 static void rp_error(const char *err
, ...) __attribute__((format (printf
, 1, 2)));
145 static void rp_warning(const char *err
, ...) __attribute__((format (printf
, 1, 2)));
147 static void report_message(const char *prefix
, const char *err
, va_list params
)
149 int sz
= strlen(prefix
);
152 strncpy(msg
, prefix
, sz
);
153 sz
+= vsnprintf(msg
+ sz
, sizeof(msg
) - sz
, err
, params
);
154 if (sz
> (sizeof(msg
) - 1))
155 sz
= sizeof(msg
) - 1;
159 send_sideband(1, 2, msg
, sz
, use_sideband
);
164 static void rp_warning(const char *err
, ...)
167 va_start(params
, err
);
168 report_message("warning: ", err
, params
);
172 static void rp_error(const char *err
, ...)
175 va_start(params
, err
);
176 report_message("error: ", err
, params
);
180 static int copy_to_sideband(int in
, int out
, void *arg
)
184 ssize_t sz
= xread(in
, data
, sizeof(data
));
187 send_sideband(1, 2, data
, sz
, use_sideband
);
193 static int run_receive_hook(struct command
*commands
, const char *hook_name
)
195 static char buf
[sizeof(commands
->old_sha1
) * 2 + PATH_MAX
+ 4];
197 struct child_process proc
;
200 int have_input
= 0, code
;
202 for (cmd
= commands
; !have_input
&& cmd
; cmd
= cmd
->next
) {
203 if (!cmd
->error_string
)
207 if (!have_input
|| access(hook_name
, X_OK
) < 0)
213 memset(&proc
, 0, sizeof(proc
));
216 proc
.stdout_to_stderr
= 1;
219 memset(&muxer
, 0, sizeof(muxer
));
220 muxer
.proc
= copy_to_sideband
;
222 code
= start_async(&muxer
);
228 code
= start_command(&proc
);
231 finish_async(&muxer
);
235 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
236 if (!cmd
->error_string
) {
237 size_t n
= snprintf(buf
, sizeof(buf
), "%s %s %s\n",
238 sha1_to_hex(cmd
->old_sha1
),
239 sha1_to_hex(cmd
->new_sha1
),
241 if (write_in_full(proc
.in
, buf
, n
) != n
)
247 finish_async(&muxer
);
248 return finish_command(&proc
);
251 static int run_update_hook(struct command
*cmd
)
253 static const char update_hook
[] = "hooks/update";
255 struct child_process proc
;
258 if (access(update_hook
, X_OK
) < 0)
261 argv
[0] = update_hook
;
262 argv
[1] = cmd
->ref_name
;
263 argv
[2] = sha1_to_hex(cmd
->old_sha1
);
264 argv
[3] = sha1_to_hex(cmd
->new_sha1
);
267 memset(&proc
, 0, sizeof(proc
));
269 proc
.stdout_to_stderr
= 1;
270 proc
.err
= use_sideband
? -1 : 0;
273 code
= start_command(&proc
);
277 copy_to_sideband(proc
.err
, -1, NULL
);
278 return finish_command(&proc
);
281 static int is_ref_checked_out(const char *ref
)
283 if (is_bare_repository())
288 return !strcmp(head_name
, ref
);
291 static char *refuse_unconfigured_deny_msg
[] = {
292 "By default, updating the current branch in a non-bare repository",
293 "is denied, because it will make the index and work tree inconsistent",
294 "with what you pushed, and will require 'git reset --hard' to match",
295 "the work tree to HEAD.",
297 "You can set 'receive.denyCurrentBranch' configuration variable to",
298 "'ignore' or 'warn' in the remote repository to allow pushing into",
299 "its current branch; however, this is not recommended unless you",
300 "arranged to update its work tree to match what you pushed in some",
303 "To squelch this message and still keep the default behaviour, set",
304 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
307 static void refuse_unconfigured_deny(void)
310 for (i
= 0; i
< ARRAY_SIZE(refuse_unconfigured_deny_msg
); i
++)
311 rp_error("%s", refuse_unconfigured_deny_msg
[i
]);
314 static char *refuse_unconfigured_deny_delete_current_msg
[] = {
315 "By default, deleting the current branch is denied, because the next",
316 "'git clone' won't result in any file checked out, causing confusion.",
318 "You can set 'receive.denyDeleteCurrent' configuration variable to",
319 "'warn' or 'ignore' in the remote repository to allow deleting the",
320 "current branch, with or without a warning message.",
322 "To squelch this message, you can set it to 'refuse'."
325 static void refuse_unconfigured_deny_delete_current(void)
329 i
< ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg
);
331 rp_error("%s", refuse_unconfigured_deny_delete_current_msg
[i
]);
334 static const char *update(struct command
*cmd
)
336 const char *name
= cmd
->ref_name
;
337 unsigned char *old_sha1
= cmd
->old_sha1
;
338 unsigned char *new_sha1
= cmd
->new_sha1
;
339 struct ref_lock
*lock
;
341 /* only refs/... are allowed */
342 if (prefixcmp(name
, "refs/") || check_ref_format(name
+ 5)) {
343 rp_error("refusing to create funny ref '%s' remotely", name
);
344 return "funny refname";
347 if (is_ref_checked_out(name
)) {
348 switch (deny_current_branch
) {
352 rp_warning("updating the current branch");
355 case DENY_UNCONFIGURED
:
356 rp_error("refusing to update checked out branch: %s", name
);
357 if (deny_current_branch
== DENY_UNCONFIGURED
)
358 refuse_unconfigured_deny();
359 return "branch is currently checked out";
363 if (!is_null_sha1(new_sha1
) && !has_sha1_file(new_sha1
)) {
364 error("unpack should have generated %s, "
365 "but I can't find it!", sha1_to_hex(new_sha1
));
369 if (!is_null_sha1(old_sha1
) && is_null_sha1(new_sha1
)) {
370 if (deny_deletes
&& !prefixcmp(name
, "refs/heads/")) {
371 rp_error("denying ref deletion for %s", name
);
372 return "deletion prohibited";
375 if (!strcmp(name
, head_name
)) {
376 switch (deny_delete_current
) {
380 rp_warning("deleting the current branch");
383 case DENY_UNCONFIGURED
:
384 if (deny_delete_current
== DENY_UNCONFIGURED
)
385 refuse_unconfigured_deny_delete_current();
386 rp_error("refusing to delete the current branch: %s", name
);
387 return "deletion of the current branch prohibited";
392 if (deny_non_fast_forwards
&& !is_null_sha1(new_sha1
) &&
393 !is_null_sha1(old_sha1
) &&
394 !prefixcmp(name
, "refs/heads/")) {
395 struct object
*old_object
, *new_object
;
396 struct commit
*old_commit
, *new_commit
;
397 struct commit_list
*bases
, *ent
;
399 old_object
= parse_object(old_sha1
);
400 new_object
= parse_object(new_sha1
);
402 if (!old_object
|| !new_object
||
403 old_object
->type
!= OBJ_COMMIT
||
404 new_object
->type
!= OBJ_COMMIT
) {
405 error("bad sha1 objects for %s", name
);
408 old_commit
= (struct commit
*)old_object
;
409 new_commit
= (struct commit
*)new_object
;
410 bases
= get_merge_bases(old_commit
, new_commit
, 1);
411 for (ent
= bases
; ent
; ent
= ent
->next
)
412 if (!hashcmp(old_sha1
, ent
->item
->object
.sha1
))
414 free_commit_list(bases
);
416 rp_error("denying non-fast-forward %s"
417 " (you should pull first)", name
);
418 return "non-fast-forward";
421 if (run_update_hook(cmd
)) {
422 rp_error("hook declined to update %s", name
);
423 return "hook declined";
426 if (is_null_sha1(new_sha1
)) {
427 if (!parse_object(old_sha1
)) {
428 rp_warning("Allowing deletion of corrupt ref.");
431 if (delete_ref(name
, old_sha1
, 0)) {
432 rp_error("failed to delete %s", name
);
433 return "failed to delete";
435 return NULL
; /* good */
438 lock
= lock_any_ref_for_update(name
, old_sha1
, 0);
440 rp_error("failed to lock %s", name
);
441 return "failed to lock";
443 if (write_ref_sha1(lock
, new_sha1
, "push")) {
444 return "failed to write"; /* error() already called */
446 return NULL
; /* good */
450 static char update_post_hook
[] = "hooks/post-update";
452 static void run_update_post_hook(struct command
*commands
)
457 struct child_process proc
;
459 for (argc
= 0, cmd
= commands
; cmd
; cmd
= cmd
->next
) {
460 if (cmd
->error_string
)
464 if (!argc
|| access(update_post_hook
, X_OK
) < 0)
466 argv
= xmalloc(sizeof(*argv
) * (2 + argc
));
467 argv
[0] = update_post_hook
;
469 for (argc
= 1, cmd
= commands
; cmd
; cmd
= cmd
->next
) {
471 if (cmd
->error_string
)
473 p
= xmalloc(strlen(cmd
->ref_name
) + 1);
474 strcpy(p
, cmd
->ref_name
);
480 memset(&proc
, 0, sizeof(proc
));
482 proc
.stdout_to_stderr
= 1;
483 proc
.err
= use_sideband
? -1 : 0;
486 if (!start_command(&proc
)) {
488 copy_to_sideband(proc
.err
, -1, NULL
);
489 finish_command(&proc
);
493 static void check_aliased_update(struct command
*cmd
, struct string_list
*list
)
495 struct string_list_item
*item
;
496 struct command
*dst_cmd
;
497 unsigned char sha1
[20];
498 char cmd_oldh
[41], cmd_newh
[41], dst_oldh
[41], dst_newh
[41];
501 const char *dst_name
= resolve_ref(cmd
->ref_name
, sha1
, 0, &flag
);
503 if (!(flag
& REF_ISSYMREF
))
506 if ((item
= string_list_lookup(list
, dst_name
)) == NULL
)
509 cmd
->skip_update
= 1;
511 dst_cmd
= (struct command
*) item
->util
;
513 if (!hashcmp(cmd
->old_sha1
, dst_cmd
->old_sha1
) &&
514 !hashcmp(cmd
->new_sha1
, dst_cmd
->new_sha1
))
517 dst_cmd
->skip_update
= 1;
519 strcpy(cmd_oldh
, find_unique_abbrev(cmd
->old_sha1
, DEFAULT_ABBREV
));
520 strcpy(cmd_newh
, find_unique_abbrev(cmd
->new_sha1
, DEFAULT_ABBREV
));
521 strcpy(dst_oldh
, find_unique_abbrev(dst_cmd
->old_sha1
, DEFAULT_ABBREV
));
522 strcpy(dst_newh
, find_unique_abbrev(dst_cmd
->new_sha1
, DEFAULT_ABBREV
));
523 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
524 " its target '%s' (%s..%s)",
525 cmd
->ref_name
, cmd_oldh
, cmd_newh
,
526 dst_cmd
->ref_name
, dst_oldh
, dst_newh
);
528 cmd
->error_string
= dst_cmd
->error_string
=
529 "inconsistent aliased update";
532 static void check_aliased_updates(struct command
*commands
)
535 struct string_list ref_list
= STRING_LIST_INIT_NODUP
;
537 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
538 struct string_list_item
*item
=
539 string_list_append(&ref_list
, cmd
->ref_name
);
540 item
->util
= (void *)cmd
;
542 sort_string_list(&ref_list
);
544 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
545 check_aliased_update(cmd
, &ref_list
);
547 string_list_clear(&ref_list
, 0);
550 static int command_singleton_iterator(void *cb_data
, unsigned char sha1
[20])
552 struct command
**cmd_list
= cb_data
;
553 struct command
*cmd
= *cmd_list
;
556 return -1; /* end of list */
557 *cmd_list
= NULL
; /* this returns only one */
558 hashcpy(sha1
, cmd
->new_sha1
);
562 static void set_connectivity_errors(struct command
*commands
)
566 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
567 struct command
*singleton
= cmd
;
568 if (!check_everything_connected(command_singleton_iterator
,
571 cmd
->error_string
= "missing necessary objects";
575 static int iterate_receive_command_list(void *cb_data
, unsigned char sha1
[20])
577 struct command
**cmd_list
= cb_data
;
578 struct command
*cmd
= *cmd_list
;
581 return -1; /* end of list */
582 *cmd_list
= cmd
->next
;
583 hashcpy(sha1
, cmd
->new_sha1
);
587 static void execute_commands(struct command
*commands
, const char *unpacker_error
)
590 unsigned char sha1
[20];
592 if (unpacker_error
) {
593 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
594 cmd
->error_string
= "n/a (unpacker error)";
599 if (check_everything_connected(iterate_receive_command_list
,
601 set_connectivity_errors(commands
);
603 if (run_receive_hook(commands
, pre_receive_hook
)) {
604 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
605 cmd
->error_string
= "pre-receive hook declined";
609 check_aliased_updates(commands
);
611 head_name
= resolve_ref("HEAD", sha1
, 0, NULL
);
613 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
614 if (!cmd
->skip_update
)
615 cmd
->error_string
= update(cmd
);
618 static struct command
*read_head_info(void)
620 struct command
*commands
= NULL
;
621 struct command
**p
= &commands
;
623 static char line
[1000];
624 unsigned char old_sha1
[20], new_sha1
[20];
629 len
= packet_read_line(0, line
, sizeof(line
));
632 if (line
[len
-1] == '\n')
637 get_sha1_hex(line
, old_sha1
) ||
638 get_sha1_hex(line
+ 41, new_sha1
))
639 die("protocol error: expected old/new/ref, got '%s'",
643 reflen
= strlen(refname
);
644 if (reflen
+ 82 < len
) {
645 if (strstr(refname
+ reflen
+ 1, "report-status"))
647 if (strstr(refname
+ reflen
+ 1, "side-band-64k"))
648 use_sideband
= LARGE_PACKET_MAX
;
650 cmd
= xcalloc(1, sizeof(struct command
) + len
- 80);
651 hashcpy(cmd
->old_sha1
, old_sha1
);
652 hashcpy(cmd
->new_sha1
, new_sha1
);
653 memcpy(cmd
->ref_name
, line
+ 82, len
- 81);
660 static const char *parse_pack_header(struct pack_header
*hdr
)
662 switch (read_pack_header(0, hdr
)) {
664 return "eof before pack header was fully read";
666 case PH_ERROR_PACK_SIGNATURE
:
667 return "protocol error (pack signature mismatch detected)";
669 case PH_ERROR_PROTOCOL
:
670 return "protocol error (pack version unsupported)";
673 return "unknown error in parse_pack_header";
680 static const char *pack_lockfile
;
682 static const char *unpack(void)
684 struct pack_header hdr
;
688 hdr_err
= parse_pack_header(&hdr
);
691 snprintf(hdr_arg
, sizeof(hdr_arg
),
692 "--pack_header=%"PRIu32
",%"PRIu32
,
693 ntohl(hdr
.hdr_version
), ntohl(hdr
.hdr_entries
));
695 if (ntohl(hdr
.hdr_entries
) < unpack_limit
) {
697 const char *unpacker
[4];
698 unpacker
[i
++] = "unpack-objects";
699 if (receive_fsck_objects
)
700 unpacker
[i
++] = "--strict";
701 unpacker
[i
++] = hdr_arg
;
702 unpacker
[i
++] = NULL
;
703 code
= run_command_v_opt(unpacker
, RUN_GIT_CMD
);
706 return "unpack-objects abnormal exit";
708 const char *keeper
[7];
709 int s
, status
, i
= 0;
711 struct child_process ip
;
713 s
= sprintf(keep_arg
, "--keep=receive-pack %"PRIuMAX
" on ", (uintmax_t) getpid());
714 if (gethostname(keep_arg
+ s
, sizeof(keep_arg
) - s
))
715 strcpy(keep_arg
+ s
, "localhost");
717 keeper
[i
++] = "index-pack";
718 keeper
[i
++] = "--stdin";
719 if (receive_fsck_objects
)
720 keeper
[i
++] = "--strict";
721 keeper
[i
++] = "--fix-thin";
722 keeper
[i
++] = hdr_arg
;
723 keeper
[i
++] = keep_arg
;
725 memset(&ip
, 0, sizeof(ip
));
729 status
= start_command(&ip
);
731 return "index-pack fork failed";
733 pack_lockfile
= index_pack_lockfile(ip
.out
);
735 status
= finish_command(&ip
);
737 reprepare_packed_git();
740 return "index-pack abnormal exit";
744 static void report(struct command
*commands
, const char *unpack_status
)
747 struct strbuf buf
= STRBUF_INIT
;
749 packet_buf_write(&buf
, "unpack %s\n",
750 unpack_status
? unpack_status
: "ok");
751 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
752 if (!cmd
->error_string
)
753 packet_buf_write(&buf
, "ok %s\n",
756 packet_buf_write(&buf
, "ng %s %s\n",
757 cmd
->ref_name
, cmd
->error_string
);
759 packet_buf_flush(&buf
);
762 send_sideband(1, 1, buf
.buf
, buf
.len
, use_sideband
);
764 safe_write(1, buf
.buf
, buf
.len
);
765 strbuf_release(&buf
);
768 static int delete_only(struct command
*commands
)
771 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
772 if (!is_null_sha1(cmd
->new_sha1
))
778 static void add_one_alternate_sha1(const unsigned char sha1
[20], void *unused
)
780 add_extra_ref(".have", sha1
, 0);
783 static void collect_one_alternate_ref(const struct ref
*ref
, void *data
)
785 struct sha1_array
*sa
= data
;
786 sha1_array_append(sa
, ref
->old_sha1
);
789 static void add_alternate_refs(void)
791 struct sha1_array sa
= SHA1_ARRAY_INIT
;
792 for_each_alternate_ref(collect_one_alternate_ref
, &sa
);
793 sha1_array_for_each_unique(&sa
, add_one_alternate_sha1
, NULL
);
794 sha1_array_clear(&sa
);
797 int cmd_receive_pack(int argc
, const char **argv
, const char *prefix
)
799 int advertise_refs
= 0;
800 int stateless_rpc
= 0;
803 struct command
*commands
;
805 packet_trace_identity("receive-pack");
808 for (i
= 1; i
< argc
; i
++) {
809 const char *arg
= *argv
++;
812 if (!strcmp(arg
, "--advertise-refs")) {
816 if (!strcmp(arg
, "--stateless-rpc")) {
821 usage(receive_pack_usage
);
824 usage(receive_pack_usage
);
828 usage(receive_pack_usage
);
832 if (!enter_repo(dir
, 0))
833 die("'%s' does not appear to be a git repository", dir
);
835 if (is_repository_shallow())
836 die("attempt to push into a shallow repository");
838 git_config(receive_pack_config
, NULL
);
840 if (0 <= transfer_unpack_limit
)
841 unpack_limit
= transfer_unpack_limit
;
842 else if (0 <= receive_unpack_limit
)
843 unpack_limit
= receive_unpack_limit
;
845 if (advertise_refs
|| !stateless_rpc
) {
846 add_alternate_refs();
856 if ((commands
= read_head_info()) != NULL
) {
857 const char *unpack_status
= NULL
;
859 if (!delete_only(commands
))
860 unpack_status
= unpack();
861 execute_commands(commands
, unpack_status
);
863 unlink_or_warn(pack_lockfile
);
865 report(commands
, unpack_status
);
866 run_receive_hook(commands
, post_receive_hook
);
867 run_update_post_hook(commands
);
869 const char *argv_gc_auto
[] = {
870 "gc", "--auto", "--quiet", NULL
,
872 run_command_v_opt(argv_gc_auto
, RUN_GIT_CMD
);
874 if (auto_update_server_info
)
875 update_server_info(0);