6 #include "run-command.h"
12 #include "transport.h"
13 #include "string-list.h"
14 #include "sha1-array.h"
15 #include "connected.h"
16 #include "argv-array.h"
19 #include "gpg-interface.h"
22 static const char receive_pack_usage
[] = "git receive-pack <git-dir>";
31 static int deny_deletes
;
32 static int deny_non_fast_forwards
;
33 static enum deny_action deny_current_branch
= DENY_UNCONFIGURED
;
34 static enum deny_action deny_delete_current
= DENY_UNCONFIGURED
;
35 static int receive_fsck_objects
= -1;
36 static int transfer_fsck_objects
= -1;
37 static int receive_unpack_limit
= -1;
38 static int transfer_unpack_limit
= -1;
39 static int unpack_limit
= 100;
40 static int report_status
;
41 static int use_sideband
;
43 static int prefer_ofs_delta
= 1;
44 static int auto_update_server_info
;
45 static int auto_gc
= 1;
46 static int fix_thin
= 1;
47 static int stateless_rpc
;
48 static const char *service_dir
;
49 static const char *head_name
;
50 static void *head_name_to_free
;
51 static int sent_capabilities
;
52 static int shallow_update
;
53 static const char *alt_shallow_file
;
54 static struct strbuf push_cert
= STRBUF_INIT
;
55 static unsigned char push_cert_sha1
[20];
56 static struct signature_check sigcheck
;
57 static const char *push_cert_nonce
;
58 static const char *cert_nonce_seed
;
60 static const char *NONCE_UNSOLICITED
= "UNSOLICITED";
61 static const char *NONCE_BAD
= "BAD";
62 static const char *NONCE_MISSING
= "MISSING";
63 static const char *NONCE_OK
= "OK";
64 static const char *NONCE_SLOP
= "SLOP";
65 static const char *nonce_status
;
66 static long nonce_stamp_slop
;
67 static unsigned long nonce_stamp_slop_limit
;
69 static enum deny_action
parse_deny_action(const char *var
, const char *value
)
72 if (!strcasecmp(value
, "ignore"))
74 if (!strcasecmp(value
, "warn"))
76 if (!strcasecmp(value
, "refuse"))
79 if (git_config_bool(var
, value
))
84 static int receive_pack_config(const char *var
, const char *value
, void *cb
)
86 int status
= parse_hide_refs_config(var
, value
, "receive");
91 if (strcmp(var
, "receive.denydeletes") == 0) {
92 deny_deletes
= git_config_bool(var
, value
);
96 if (strcmp(var
, "receive.denynonfastforwards") == 0) {
97 deny_non_fast_forwards
= git_config_bool(var
, value
);
101 if (strcmp(var
, "receive.unpacklimit") == 0) {
102 receive_unpack_limit
= git_config_int(var
, value
);
106 if (strcmp(var
, "transfer.unpacklimit") == 0) {
107 transfer_unpack_limit
= git_config_int(var
, value
);
111 if (strcmp(var
, "receive.fsckobjects") == 0) {
112 receive_fsck_objects
= git_config_bool(var
, value
);
116 if (strcmp(var
, "transfer.fsckobjects") == 0) {
117 transfer_fsck_objects
= git_config_bool(var
, value
);
121 if (!strcmp(var
, "receive.denycurrentbranch")) {
122 deny_current_branch
= parse_deny_action(var
, value
);
126 if (strcmp(var
, "receive.denydeletecurrent") == 0) {
127 deny_delete_current
= parse_deny_action(var
, value
);
131 if (strcmp(var
, "repack.usedeltabaseoffset") == 0) {
132 prefer_ofs_delta
= git_config_bool(var
, value
);
136 if (strcmp(var
, "receive.updateserverinfo") == 0) {
137 auto_update_server_info
= git_config_bool(var
, value
);
141 if (strcmp(var
, "receive.autogc") == 0) {
142 auto_gc
= git_config_bool(var
, value
);
146 if (strcmp(var
, "receive.shallowupdate") == 0) {
147 shallow_update
= git_config_bool(var
, value
);
151 if (strcmp(var
, "receive.certnonceseed") == 0)
152 return git_config_string(&cert_nonce_seed
, var
, value
);
154 if (strcmp(var
, "receive.certnonceslop") == 0) {
155 nonce_stamp_slop_limit
= git_config_ulong(var
, value
);
159 return git_default_config(var
, value
, cb
);
162 static void show_ref(const char *path
, const unsigned char *sha1
)
164 if (ref_is_hidden(path
))
167 if (sent_capabilities
) {
168 packet_write(1, "%s %s\n", sha1_to_hex(sha1
), path
);
170 struct strbuf cap
= STRBUF_INIT
;
173 "report-status delete-refs side-band-64k quiet");
174 if (prefer_ofs_delta
)
175 strbuf_addstr(&cap
, " ofs-delta");
177 strbuf_addf(&cap
, " push-cert=%s", push_cert_nonce
);
178 strbuf_addf(&cap
, " agent=%s", git_user_agent_sanitized());
179 packet_write(1, "%s %s%c%s\n",
180 sha1_to_hex(sha1
), path
, 0, cap
.buf
);
181 strbuf_release(&cap
);
182 sent_capabilities
= 1;
186 static int show_ref_cb(const char *path
, const unsigned char *sha1
, int flag
, void *unused
)
188 path
= strip_namespace(path
);
190 * Advertise refs outside our current namespace as ".have"
191 * refs, so that the client can use them to minimize data
192 * transfer but will otherwise ignore them. This happens to
193 * cover ".have" that are thrown in by add_one_alternate_ref()
194 * to mark histories that are complete in our alternates as
199 show_ref(path
, sha1
);
203 static void show_one_alternate_sha1(const unsigned char sha1
[20], void *unused
)
205 show_ref(".have", sha1
);
208 static void collect_one_alternate_ref(const struct ref
*ref
, void *data
)
210 struct sha1_array
*sa
= data
;
211 sha1_array_append(sa
, ref
->old_sha1
);
214 static void write_head_info(void)
216 struct sha1_array sa
= SHA1_ARRAY_INIT
;
217 for_each_alternate_ref(collect_one_alternate_ref
, &sa
);
218 sha1_array_for_each_unique(&sa
, show_one_alternate_sha1
, NULL
);
219 sha1_array_clear(&sa
);
220 for_each_ref(show_ref_cb
, NULL
);
221 if (!sent_capabilities
)
222 show_ref("capabilities^{}", null_sha1
);
224 advertise_shallow_grafts(1);
231 struct command
*next
;
232 const char *error_string
;
233 unsigned int skip_update
:1,
236 unsigned char old_sha1
[20];
237 unsigned char new_sha1
[20];
238 char ref_name
[FLEX_ARRAY
]; /* more */
241 static void rp_error(const char *err
, ...) __attribute__((format (printf
, 1, 2)));
242 static void rp_warning(const char *err
, ...) __attribute__((format (printf
, 1, 2)));
244 static void report_message(const char *prefix
, const char *err
, va_list params
)
246 int sz
= strlen(prefix
);
249 strncpy(msg
, prefix
, sz
);
250 sz
+= vsnprintf(msg
+ sz
, sizeof(msg
) - sz
, err
, params
);
251 if (sz
> (sizeof(msg
) - 1))
252 sz
= sizeof(msg
) - 1;
256 send_sideband(1, 2, msg
, sz
, use_sideband
);
261 static void rp_warning(const char *err
, ...)
264 va_start(params
, err
);
265 report_message("warning: ", err
, params
);
269 static void rp_error(const char *err
, ...)
272 va_start(params
, err
);
273 report_message("error: ", err
, params
);
277 static int copy_to_sideband(int in
, int out
, void *arg
)
281 ssize_t sz
= xread(in
, data
, sizeof(data
));
284 send_sideband(1, 2, data
, sz
, use_sideband
);
290 #define HMAC_BLOCK_SIZE 64
292 static void hmac_sha1(unsigned char *out
,
293 const char *key_in
, size_t key_len
,
294 const char *text
, size_t text_len
)
296 unsigned char key
[HMAC_BLOCK_SIZE
];
297 unsigned char k_ipad
[HMAC_BLOCK_SIZE
];
298 unsigned char k_opad
[HMAC_BLOCK_SIZE
];
302 /* RFC 2104 2. (1) */
303 memset(key
, '\0', HMAC_BLOCK_SIZE
);
304 if (HMAC_BLOCK_SIZE
< key_len
) {
306 git_SHA1_Update(&ctx
, key_in
, key_len
);
307 git_SHA1_Final(key
, &ctx
);
309 memcpy(key
, key_in
, key_len
);
312 /* RFC 2104 2. (2) & (5) */
313 for (i
= 0; i
< sizeof(key
); i
++) {
314 k_ipad
[i
] = key
[i
] ^ 0x36;
315 k_opad
[i
] = key
[i
] ^ 0x5c;
318 /* RFC 2104 2. (3) & (4) */
320 git_SHA1_Update(&ctx
, k_ipad
, sizeof(k_ipad
));
321 git_SHA1_Update(&ctx
, text
, text_len
);
322 git_SHA1_Final(out
, &ctx
);
324 /* RFC 2104 2. (6) & (7) */
326 git_SHA1_Update(&ctx
, k_opad
, sizeof(k_opad
));
327 git_SHA1_Update(&ctx
, out
, 20);
328 git_SHA1_Final(out
, &ctx
);
331 static char *prepare_push_cert_nonce(const char *path
, unsigned long stamp
)
333 struct strbuf buf
= STRBUF_INIT
;
334 unsigned char sha1
[20];
336 strbuf_addf(&buf
, "%s:%lu", path
, stamp
);
337 hmac_sha1(sha1
, buf
.buf
, buf
.len
, cert_nonce_seed
, strlen(cert_nonce_seed
));;
338 strbuf_release(&buf
);
340 /* RFC 2104 5. HMAC-SHA1-80 */
341 strbuf_addf(&buf
, "%lu-%.*s", stamp
, 20, sha1_to_hex(sha1
));
342 return strbuf_detach(&buf
, NULL
);
346 * NEEDSWORK: reuse find_commit_header() from jk/commit-author-parsing
347 * after dropping "_commit" from its name and possibly moving it out
350 static char *find_header(const char *msg
, size_t len
, const char *key
)
352 int key_len
= strlen(key
);
353 const char *line
= msg
;
355 while (line
&& line
< msg
+ len
) {
356 const char *eol
= strchrnul(line
, '\n');
358 if ((msg
+ len
<= eol
) || line
== eol
)
360 if (line
+ key_len
< eol
&&
361 !memcmp(line
, key
, key_len
) && line
[key_len
] == ' ') {
362 int offset
= key_len
+ 1;
363 return xmemdupz(line
+ offset
, (eol
- line
) - offset
);
365 line
= *eol
? eol
+ 1 : NULL
;
370 static const char *check_nonce(const char *buf
, size_t len
)
372 char *nonce
= find_header(buf
, len
, "nonce");
373 unsigned long stamp
, ostamp
;
374 char *bohmac
, *expect
= NULL
;
375 const char *retval
= NONCE_BAD
;
378 retval
= NONCE_MISSING
;
380 } else if (!push_cert_nonce
) {
381 retval
= NONCE_UNSOLICITED
;
383 } else if (!strcmp(push_cert_nonce
, nonce
)) {
388 if (!stateless_rpc
) {
389 /* returned nonce MUST match what we gave out earlier */
395 * In stateless mode, we may be receiving a nonce issued by
396 * another instance of the server that serving the same
397 * repository, and the timestamps may not match, but the
398 * nonce-seed and dir should match, so we can recompute and
399 * report the time slop.
401 * In addition, when a nonce issued by another instance has
402 * timestamp within receive.certnonceslop seconds, we pretend
403 * as if we issued that nonce when reporting to the hook.
406 /* nonce is concat(<seconds-since-epoch>, "-", <hmac>) */
407 if (*nonce
<= '0' || '9' < *nonce
) {
411 stamp
= strtoul(nonce
, &bohmac
, 10);
412 if (bohmac
== nonce
|| bohmac
[0] != '-') {
417 expect
= prepare_push_cert_nonce(service_dir
, stamp
);
418 if (strcmp(expect
, nonce
)) {
419 /* Not what we would have signed earlier */
425 * By how many seconds is this nonce stale? Negative value
426 * would mean it was issued by another server with its clock
427 * skewed in the future.
429 ostamp
= strtoul(push_cert_nonce
, NULL
, 10);
430 nonce_stamp_slop
= (long)ostamp
- (long)stamp
;
432 if (nonce_stamp_slop_limit
&&
433 abs(nonce_stamp_slop
) <= nonce_stamp_slop_limit
) {
435 * Pretend as if the received nonce (which passes the
436 * HMAC check, so it is not a forged by third-party)
439 free((void *)push_cert_nonce
);
440 push_cert_nonce
= xstrdup(nonce
);
452 static void prepare_push_cert_sha1(struct child_process
*proc
)
454 static int already_done
;
455 struct argv_array env
= ARGV_ARRAY_INIT
;
461 struct strbuf gpg_output
= STRBUF_INIT
;
462 struct strbuf gpg_status
= STRBUF_INIT
;
463 int bogs
/* beginning_of_gpg_sig */;
466 if (write_sha1_file(push_cert
.buf
, push_cert
.len
, "blob", push_cert_sha1
))
467 hashclr(push_cert_sha1
);
469 memset(&sigcheck
, '\0', sizeof(sigcheck
));
470 sigcheck
.result
= 'N';
472 bogs
= parse_signature(push_cert
.buf
, push_cert
.len
);
473 if (verify_signed_buffer(push_cert
.buf
, bogs
,
474 push_cert
.buf
+ bogs
, push_cert
.len
- bogs
,
475 &gpg_output
, &gpg_status
) < 0) {
476 ; /* error running gpg */
478 sigcheck
.payload
= push_cert
.buf
;
479 sigcheck
.gpg_output
= gpg_output
.buf
;
480 sigcheck
.gpg_status
= gpg_status
.buf
;
481 parse_gpg_output(&sigcheck
);
484 strbuf_release(&gpg_output
);
485 strbuf_release(&gpg_status
);
486 nonce_status
= check_nonce(push_cert
.buf
, bogs
);
488 if (!is_null_sha1(push_cert_sha1
)) {
489 argv_array_pushf(&env
, "GIT_PUSH_CERT=%s", sha1_to_hex(push_cert_sha1
));
490 argv_array_pushf(&env
, "GIT_PUSH_CERT_SIGNER=%s",
491 sigcheck
.signer
? sigcheck
.signer
: "");
492 argv_array_pushf(&env
, "GIT_PUSH_CERT_KEY=%s",
493 sigcheck
.key
? sigcheck
.key
: "");
494 argv_array_pushf(&env
, "GIT_PUSH_CERT_STATUS=%c", sigcheck
.result
);
495 if (push_cert_nonce
) {
496 argv_array_pushf(&env
, "GIT_PUSH_CERT_NONCE=%s", push_cert_nonce
);
497 argv_array_pushf(&env
, "GIT_PUSH_CERT_NONCE_STATUS=%s", nonce_status
);
498 if (nonce_status
== NONCE_SLOP
)
499 argv_array_pushf(&env
, "GIT_PUSH_CERT_NONCE_SLOP=%ld",
502 proc
->env
= env
.argv
;
506 typedef int (*feed_fn
)(void *, const char **, size_t *);
507 static int run_and_feed_hook(const char *hook_name
, feed_fn feed
, void *feed_state
)
509 struct child_process proc
= CHILD_PROCESS_INIT
;
514 argv
[0] = find_hook(hook_name
);
522 proc
.stdout_to_stderr
= 1;
524 prepare_push_cert_sha1(&proc
);
527 memset(&muxer
, 0, sizeof(muxer
));
528 muxer
.proc
= copy_to_sideband
;
530 code
= start_async(&muxer
);
536 code
= start_command(&proc
);
539 finish_async(&muxer
);
543 sigchain_push(SIGPIPE
, SIG_IGN
);
548 if (feed(feed_state
, &buf
, &n
))
550 if (write_in_full(proc
.in
, buf
, n
) != n
)
555 finish_async(&muxer
);
557 sigchain_pop(SIGPIPE
);
559 return finish_command(&proc
);
562 struct receive_hook_feed_state
{
568 static int feed_receive_hook(void *state_
, const char **bufp
, size_t *sizep
)
570 struct receive_hook_feed_state
*state
= state_
;
571 struct command
*cmd
= state
->cmd
;
574 state
->skip_broken
&& (cmd
->error_string
|| cmd
->did_not_exist
))
578 strbuf_reset(&state
->buf
);
579 strbuf_addf(&state
->buf
, "%s %s %s\n",
580 sha1_to_hex(cmd
->old_sha1
), sha1_to_hex(cmd
->new_sha1
),
582 state
->cmd
= cmd
->next
;
584 *bufp
= state
->buf
.buf
;
585 *sizep
= state
->buf
.len
;
590 static int run_receive_hook(struct command
*commands
, const char *hook_name
,
593 struct receive_hook_feed_state state
;
596 strbuf_init(&state
.buf
, 0);
597 state
.cmd
= commands
;
598 state
.skip_broken
= skip_broken
;
599 if (feed_receive_hook(&state
, NULL
, NULL
))
601 state
.cmd
= commands
;
602 status
= run_and_feed_hook(hook_name
, feed_receive_hook
, &state
);
603 strbuf_release(&state
.buf
);
607 static int run_update_hook(struct command
*cmd
)
610 struct child_process proc
= CHILD_PROCESS_INIT
;
613 argv
[0] = find_hook("update");
617 argv
[1] = cmd
->ref_name
;
618 argv
[2] = sha1_to_hex(cmd
->old_sha1
);
619 argv
[3] = sha1_to_hex(cmd
->new_sha1
);
623 proc
.stdout_to_stderr
= 1;
624 proc
.err
= use_sideband
? -1 : 0;
627 code
= start_command(&proc
);
631 copy_to_sideband(proc
.err
, -1, NULL
);
632 return finish_command(&proc
);
635 static int is_ref_checked_out(const char *ref
)
637 if (is_bare_repository())
642 return !strcmp(head_name
, ref
);
645 static char *refuse_unconfigured_deny_msg
[] = {
646 "By default, updating the current branch in a non-bare repository",
647 "is denied, because it will make the index and work tree inconsistent",
648 "with what you pushed, and will require 'git reset --hard' to match",
649 "the work tree to HEAD.",
651 "You can set 'receive.denyCurrentBranch' configuration variable to",
652 "'ignore' or 'warn' in the remote repository to allow pushing into",
653 "its current branch; however, this is not recommended unless you",
654 "arranged to update its work tree to match what you pushed in some",
657 "To squelch this message and still keep the default behaviour, set",
658 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
661 static void refuse_unconfigured_deny(void)
664 for (i
= 0; i
< ARRAY_SIZE(refuse_unconfigured_deny_msg
); i
++)
665 rp_error("%s", refuse_unconfigured_deny_msg
[i
]);
668 static char *refuse_unconfigured_deny_delete_current_msg
[] = {
669 "By default, deleting the current branch is denied, because the next",
670 "'git clone' won't result in any file checked out, causing confusion.",
672 "You can set 'receive.denyDeleteCurrent' configuration variable to",
673 "'warn' or 'ignore' in the remote repository to allow deleting the",
674 "current branch, with or without a warning message.",
676 "To squelch this message, you can set it to 'refuse'."
679 static void refuse_unconfigured_deny_delete_current(void)
683 i
< ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg
);
685 rp_error("%s", refuse_unconfigured_deny_delete_current_msg
[i
]);
688 static int command_singleton_iterator(void *cb_data
, unsigned char sha1
[20]);
689 static int update_shallow_ref(struct command
*cmd
, struct shallow_info
*si
)
691 static struct lock_file shallow_lock
;
692 struct sha1_array extra
= SHA1_ARRAY_INIT
;
693 const char *alt_file
;
694 uint32_t mask
= 1 << (cmd
->index
% 32);
697 trace_printf_key(&trace_shallow
,
698 "shallow: update_shallow_ref %s\n", cmd
->ref_name
);
699 for (i
= 0; i
< si
->shallow
->nr
; i
++)
700 if (si
->used_shallow
[i
] &&
701 (si
->used_shallow
[i
][cmd
->index
/ 32] & mask
) &&
702 !delayed_reachability_test(si
, i
))
703 sha1_array_append(&extra
, si
->shallow
->sha1
[i
]);
705 setup_alternate_shallow(&shallow_lock
, &alt_file
, &extra
);
706 if (check_shallow_connected(command_singleton_iterator
,
708 rollback_lock_file(&shallow_lock
);
709 sha1_array_clear(&extra
);
713 commit_lock_file(&shallow_lock
);
716 * Make sure setup_alternate_shallow() for the next ref does
717 * not lose these new roots..
719 for (i
= 0; i
< extra
.nr
; i
++)
720 register_shallow(extra
.sha1
[i
]);
722 si
->shallow_ref
[cmd
->index
] = 0;
723 sha1_array_clear(&extra
);
727 static const char *update(struct command
*cmd
, struct shallow_info
*si
)
729 const char *name
= cmd
->ref_name
;
730 struct strbuf namespaced_name_buf
= STRBUF_INIT
;
731 const char *namespaced_name
;
732 unsigned char *old_sha1
= cmd
->old_sha1
;
733 unsigned char *new_sha1
= cmd
->new_sha1
;
735 /* only refs/... are allowed */
736 if (!starts_with(name
, "refs/") || check_refname_format(name
+ 5, 0)) {
737 rp_error("refusing to create funny ref '%s' remotely", name
);
738 return "funny refname";
741 strbuf_addf(&namespaced_name_buf
, "%s%s", get_git_namespace(), name
);
742 namespaced_name
= strbuf_detach(&namespaced_name_buf
, NULL
);
744 if (is_ref_checked_out(namespaced_name
)) {
745 switch (deny_current_branch
) {
749 rp_warning("updating the current branch");
752 case DENY_UNCONFIGURED
:
753 rp_error("refusing to update checked out branch: %s", name
);
754 if (deny_current_branch
== DENY_UNCONFIGURED
)
755 refuse_unconfigured_deny();
756 return "branch is currently checked out";
760 if (!is_null_sha1(new_sha1
) && !has_sha1_file(new_sha1
)) {
761 error("unpack should have generated %s, "
762 "but I can't find it!", sha1_to_hex(new_sha1
));
766 if (!is_null_sha1(old_sha1
) && is_null_sha1(new_sha1
)) {
767 if (deny_deletes
&& starts_with(name
, "refs/heads/")) {
768 rp_error("denying ref deletion for %s", name
);
769 return "deletion prohibited";
772 if (!strcmp(namespaced_name
, head_name
)) {
773 switch (deny_delete_current
) {
777 rp_warning("deleting the current branch");
780 case DENY_UNCONFIGURED
:
781 if (deny_delete_current
== DENY_UNCONFIGURED
)
782 refuse_unconfigured_deny_delete_current();
783 rp_error("refusing to delete the current branch: %s", name
);
784 return "deletion of the current branch prohibited";
789 if (deny_non_fast_forwards
&& !is_null_sha1(new_sha1
) &&
790 !is_null_sha1(old_sha1
) &&
791 starts_with(name
, "refs/heads/")) {
792 struct object
*old_object
, *new_object
;
793 struct commit
*old_commit
, *new_commit
;
795 old_object
= parse_object(old_sha1
);
796 new_object
= parse_object(new_sha1
);
798 if (!old_object
|| !new_object
||
799 old_object
->type
!= OBJ_COMMIT
||
800 new_object
->type
!= OBJ_COMMIT
) {
801 error("bad sha1 objects for %s", name
);
804 old_commit
= (struct commit
*)old_object
;
805 new_commit
= (struct commit
*)new_object
;
806 if (!in_merge_bases(old_commit
, new_commit
)) {
807 rp_error("denying non-fast-forward %s"
808 " (you should pull first)", name
);
809 return "non-fast-forward";
812 if (run_update_hook(cmd
)) {
813 rp_error("hook declined to update %s", name
);
814 return "hook declined";
817 if (is_null_sha1(new_sha1
)) {
818 if (!parse_object(old_sha1
)) {
820 if (ref_exists(name
)) {
821 rp_warning("Allowing deletion of corrupt ref.");
823 rp_warning("Deleting a non-existent ref.");
824 cmd
->did_not_exist
= 1;
827 if (delete_ref(namespaced_name
, old_sha1
, 0)) {
828 rp_error("failed to delete %s", name
);
829 return "failed to delete";
831 return NULL
; /* good */
834 struct strbuf err
= STRBUF_INIT
;
835 struct ref_transaction
*transaction
;
837 if (shallow_update
&& si
->shallow_ref
[cmd
->index
] &&
838 update_shallow_ref(cmd
, si
))
839 return "shallow error";
841 transaction
= ref_transaction_begin(&err
);
843 ref_transaction_update(transaction
, namespaced_name
,
844 new_sha1
, old_sha1
, 0, 1, &err
) ||
845 ref_transaction_commit(transaction
, "push", &err
)) {
846 ref_transaction_free(transaction
);
848 rp_error("%s", err
.buf
);
849 strbuf_release(&err
);
850 return "failed to update ref";
853 ref_transaction_free(transaction
);
854 strbuf_release(&err
);
855 return NULL
; /* good */
859 static void run_update_post_hook(struct command
*commands
)
864 struct child_process proc
= CHILD_PROCESS_INIT
;
867 hook
= find_hook("post-update");
868 for (argc
= 0, cmd
= commands
; cmd
; cmd
= cmd
->next
) {
869 if (cmd
->error_string
|| cmd
->did_not_exist
)
876 argv
= xmalloc(sizeof(*argv
) * (2 + argc
));
879 for (argc
= 1, cmd
= commands
; cmd
; cmd
= cmd
->next
) {
880 if (cmd
->error_string
|| cmd
->did_not_exist
)
882 argv
[argc
] = xstrdup(cmd
->ref_name
);
888 proc
.stdout_to_stderr
= 1;
889 proc
.err
= use_sideband
? -1 : 0;
892 if (!start_command(&proc
)) {
894 copy_to_sideband(proc
.err
, -1, NULL
);
895 finish_command(&proc
);
899 static void check_aliased_update(struct command
*cmd
, struct string_list
*list
)
901 struct strbuf buf
= STRBUF_INIT
;
902 const char *dst_name
;
903 struct string_list_item
*item
;
904 struct command
*dst_cmd
;
905 unsigned char sha1
[20];
906 char cmd_oldh
[41], cmd_newh
[41], dst_oldh
[41], dst_newh
[41];
909 strbuf_addf(&buf
, "%s%s", get_git_namespace(), cmd
->ref_name
);
910 dst_name
= resolve_ref_unsafe(buf
.buf
, sha1
, 0, &flag
);
911 strbuf_release(&buf
);
913 if (!(flag
& REF_ISSYMREF
))
916 dst_name
= strip_namespace(dst_name
);
918 rp_error("refusing update to broken symref '%s'", cmd
->ref_name
);
919 cmd
->skip_update
= 1;
920 cmd
->error_string
= "broken symref";
924 if ((item
= string_list_lookup(list
, dst_name
)) == NULL
)
927 cmd
->skip_update
= 1;
929 dst_cmd
= (struct command
*) item
->util
;
931 if (!hashcmp(cmd
->old_sha1
, dst_cmd
->old_sha1
) &&
932 !hashcmp(cmd
->new_sha1
, dst_cmd
->new_sha1
))
935 dst_cmd
->skip_update
= 1;
937 strcpy(cmd_oldh
, find_unique_abbrev(cmd
->old_sha1
, DEFAULT_ABBREV
));
938 strcpy(cmd_newh
, find_unique_abbrev(cmd
->new_sha1
, DEFAULT_ABBREV
));
939 strcpy(dst_oldh
, find_unique_abbrev(dst_cmd
->old_sha1
, DEFAULT_ABBREV
));
940 strcpy(dst_newh
, find_unique_abbrev(dst_cmd
->new_sha1
, DEFAULT_ABBREV
));
941 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
942 " its target '%s' (%s..%s)",
943 cmd
->ref_name
, cmd_oldh
, cmd_newh
,
944 dst_cmd
->ref_name
, dst_oldh
, dst_newh
);
946 cmd
->error_string
= dst_cmd
->error_string
=
947 "inconsistent aliased update";
950 static void check_aliased_updates(struct command
*commands
)
953 struct string_list ref_list
= STRING_LIST_INIT_NODUP
;
955 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
956 struct string_list_item
*item
=
957 string_list_append(&ref_list
, cmd
->ref_name
);
958 item
->util
= (void *)cmd
;
960 sort_string_list(&ref_list
);
962 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
963 if (!cmd
->error_string
)
964 check_aliased_update(cmd
, &ref_list
);
967 string_list_clear(&ref_list
, 0);
970 static int command_singleton_iterator(void *cb_data
, unsigned char sha1
[20])
972 struct command
**cmd_list
= cb_data
;
973 struct command
*cmd
= *cmd_list
;
975 if (!cmd
|| is_null_sha1(cmd
->new_sha1
))
976 return -1; /* end of list */
977 *cmd_list
= NULL
; /* this returns only one */
978 hashcpy(sha1
, cmd
->new_sha1
);
982 static void set_connectivity_errors(struct command
*commands
,
983 struct shallow_info
*si
)
987 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
988 struct command
*singleton
= cmd
;
989 if (shallow_update
&& si
->shallow_ref
[cmd
->index
])
990 /* to be checked in update_shallow_ref() */
992 if (!check_everything_connected(command_singleton_iterator
,
995 cmd
->error_string
= "missing necessary objects";
999 struct iterate_data
{
1000 struct command
*cmds
;
1001 struct shallow_info
*si
;
1004 static int iterate_receive_command_list(void *cb_data
, unsigned char sha1
[20])
1006 struct iterate_data
*data
= cb_data
;
1007 struct command
**cmd_list
= &data
->cmds
;
1008 struct command
*cmd
= *cmd_list
;
1010 for (; cmd
; cmd
= cmd
->next
) {
1011 if (shallow_update
&& data
->si
->shallow_ref
[cmd
->index
])
1012 /* to be checked in update_shallow_ref() */
1014 if (!is_null_sha1(cmd
->new_sha1
) && !cmd
->skip_update
) {
1015 hashcpy(sha1
, cmd
->new_sha1
);
1016 *cmd_list
= cmd
->next
;
1021 return -1; /* end of list */
1024 static void reject_updates_to_hidden(struct command
*commands
)
1026 struct command
*cmd
;
1028 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1029 if (cmd
->error_string
|| !ref_is_hidden(cmd
->ref_name
))
1031 if (is_null_sha1(cmd
->new_sha1
))
1032 cmd
->error_string
= "deny deleting a hidden ref";
1034 cmd
->error_string
= "deny updating a hidden ref";
1038 static void execute_commands(struct command
*commands
,
1039 const char *unpacker_error
,
1040 struct shallow_info
*si
)
1042 int checked_connectivity
;
1043 struct command
*cmd
;
1044 unsigned char sha1
[20];
1045 struct iterate_data data
;
1047 if (unpacker_error
) {
1048 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
1049 cmd
->error_string
= "unpacker error";
1053 data
.cmds
= commands
;
1055 if (check_everything_connected(iterate_receive_command_list
, 0, &data
))
1056 set_connectivity_errors(commands
, si
);
1058 reject_updates_to_hidden(commands
);
1060 if (run_receive_hook(commands
, "pre-receive", 0)) {
1061 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1062 if (!cmd
->error_string
)
1063 cmd
->error_string
= "pre-receive hook declined";
1068 check_aliased_updates(commands
);
1070 free(head_name_to_free
);
1071 head_name
= head_name_to_free
= resolve_refdup("HEAD", sha1
, 0, NULL
);
1073 checked_connectivity
= 1;
1074 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1075 if (cmd
->error_string
)
1078 if (cmd
->skip_update
)
1081 cmd
->error_string
= update(cmd
, si
);
1082 if (shallow_update
&& !cmd
->error_string
&&
1083 si
->shallow_ref
[cmd
->index
]) {
1084 error("BUG: connectivity check has not been run on ref %s",
1086 checked_connectivity
= 0;
1090 if (shallow_update
&& !checked_connectivity
)
1091 error("BUG: run 'git fsck' for safety.\n"
1092 "If there are errors, try to remove "
1093 "the reported refs above");
1096 static struct command
**queue_command(struct command
**tail
,
1100 unsigned char old_sha1
[20], new_sha1
[20];
1101 struct command
*cmd
;
1102 const char *refname
;
1108 get_sha1_hex(line
, old_sha1
) ||
1109 get_sha1_hex(line
+ 41, new_sha1
))
1110 die("protocol error: expected old/new/ref, got '%s'", line
);
1112 refname
= line
+ 82;
1113 reflen
= linelen
- 82;
1114 cmd
= xcalloc(1, sizeof(struct command
) + reflen
+ 1);
1115 hashcpy(cmd
->old_sha1
, old_sha1
);
1116 hashcpy(cmd
->new_sha1
, new_sha1
);
1117 memcpy(cmd
->ref_name
, refname
, reflen
);
1118 cmd
->ref_name
[reflen
] = '\0';
1123 static void queue_commands_from_cert(struct command
**tail
,
1124 struct strbuf
*push_cert
)
1126 const char *boc
, *eoc
;
1129 die("protocol error: got both push certificate and unsigned commands");
1131 boc
= strstr(push_cert
->buf
, "\n\n");
1133 die("malformed push certificate %.*s", 100, push_cert
->buf
);
1136 eoc
= push_cert
->buf
+ parse_signature(push_cert
->buf
, push_cert
->len
);
1139 const char *eol
= memchr(boc
, '\n', eoc
- boc
);
1140 tail
= queue_command(tail
, boc
, eol
? eol
- boc
: eoc
- eol
);
1141 boc
= eol
? eol
+ 1 : eoc
;
1145 static struct command
*read_head_info(struct sha1_array
*shallow
)
1147 struct command
*commands
= NULL
;
1148 struct command
**p
= &commands
;
1153 line
= packet_read_line(0, &len
);
1157 if (len
== 48 && starts_with(line
, "shallow ")) {
1158 unsigned char sha1
[20];
1159 if (get_sha1_hex(line
+ 8, sha1
))
1160 die("protocol error: expected shallow sha, got '%s'",
1162 sha1_array_append(shallow
, sha1
);
1166 linelen
= strlen(line
);
1167 if (linelen
< len
) {
1168 const char *feature_list
= line
+ linelen
+ 1;
1169 if (parse_feature_request(feature_list
, "report-status"))
1171 if (parse_feature_request(feature_list
, "side-band-64k"))
1172 use_sideband
= LARGE_PACKET_MAX
;
1173 if (parse_feature_request(feature_list
, "quiet"))
1177 if (!strcmp(line
, "push-cert")) {
1182 len
= packet_read(0, NULL
, NULL
,
1183 certbuf
, sizeof(certbuf
), 0);
1188 if (!strcmp(certbuf
, "push-cert-end\n"))
1189 break; /* end of cert */
1190 strbuf_addstr(&push_cert
, certbuf
);
1198 p
= queue_command(p
, line
, linelen
);
1202 queue_commands_from_cert(p
, &push_cert
);
1207 static const char *parse_pack_header(struct pack_header
*hdr
)
1209 switch (read_pack_header(0, hdr
)) {
1211 return "eof before pack header was fully read";
1213 case PH_ERROR_PACK_SIGNATURE
:
1214 return "protocol error (pack signature mismatch detected)";
1216 case PH_ERROR_PROTOCOL
:
1217 return "protocol error (pack version unsupported)";
1220 return "unknown error in parse_pack_header";
1227 static const char *pack_lockfile
;
1229 static const char *unpack(int err_fd
, struct shallow_info
*si
)
1231 struct pack_header hdr
;
1232 struct argv_array av
= ARGV_ARRAY_INIT
;
1233 const char *hdr_err
;
1236 struct child_process child
= CHILD_PROCESS_INIT
;
1237 int fsck_objects
= (receive_fsck_objects
>= 0
1238 ? receive_fsck_objects
1239 : transfer_fsck_objects
>= 0
1240 ? transfer_fsck_objects
1243 hdr_err
= parse_pack_header(&hdr
);
1249 snprintf(hdr_arg
, sizeof(hdr_arg
),
1250 "--pack_header=%"PRIu32
",%"PRIu32
,
1251 ntohl(hdr
.hdr_version
), ntohl(hdr
.hdr_entries
));
1253 if (si
->nr_ours
|| si
->nr_theirs
) {
1254 alt_shallow_file
= setup_temporary_shallow(si
->shallow
);
1255 argv_array_pushl(&av
, "--shallow-file", alt_shallow_file
, NULL
);
1258 if (ntohl(hdr
.hdr_entries
) < unpack_limit
) {
1259 argv_array_pushl(&av
, "unpack-objects", hdr_arg
, NULL
);
1261 argv_array_push(&av
, "-q");
1263 argv_array_push(&av
, "--strict");
1264 child
.argv
= av
.argv
;
1265 child
.no_stdout
= 1;
1268 status
= run_command(&child
);
1270 return "unpack-objects abnormal exit";
1275 s
= sprintf(keep_arg
, "--keep=receive-pack %"PRIuMAX
" on ", (uintmax_t) getpid());
1276 if (gethostname(keep_arg
+ s
, sizeof(keep_arg
) - s
))
1277 strcpy(keep_arg
+ s
, "localhost");
1279 argv_array_pushl(&av
, "index-pack",
1280 "--stdin", hdr_arg
, keep_arg
, NULL
);
1282 argv_array_push(&av
, "--strict");
1284 argv_array_push(&av
, "--fix-thin");
1285 child
.argv
= av
.argv
;
1289 status
= start_command(&child
);
1291 return "index-pack fork failed";
1292 pack_lockfile
= index_pack_lockfile(child
.out
);
1294 status
= finish_command(&child
);
1296 return "index-pack abnormal exit";
1297 reprepare_packed_git();
1302 static const char *unpack_with_sideband(struct shallow_info
*si
)
1308 return unpack(0, si
);
1310 memset(&muxer
, 0, sizeof(muxer
));
1311 muxer
.proc
= copy_to_sideband
;
1313 if (start_async(&muxer
))
1316 ret
= unpack(muxer
.in
, si
);
1318 finish_async(&muxer
);
1322 static void prepare_shallow_update(struct command
*commands
,
1323 struct shallow_info
*si
)
1325 int i
, j
, k
, bitmap_size
= (si
->ref
->nr
+ 31) / 32;
1327 si
->used_shallow
= xmalloc(sizeof(*si
->used_shallow
) *
1329 assign_shallow_commits_to_refs(si
, si
->used_shallow
, NULL
);
1331 si
->need_reachability_test
=
1332 xcalloc(si
->shallow
->nr
, sizeof(*si
->need_reachability_test
));
1334 xcalloc(si
->shallow
->nr
, sizeof(*si
->reachable
));
1335 si
->shallow_ref
= xcalloc(si
->ref
->nr
, sizeof(*si
->shallow_ref
));
1337 for (i
= 0; i
< si
->nr_ours
; i
++)
1338 si
->need_reachability_test
[si
->ours
[i
]] = 1;
1340 for (i
= 0; i
< si
->shallow
->nr
; i
++) {
1341 if (!si
->used_shallow
[i
])
1343 for (j
= 0; j
< bitmap_size
; j
++) {
1344 if (!si
->used_shallow
[i
][j
])
1346 si
->need_reachability_test
[i
]++;
1347 for (k
= 0; k
< 32; k
++)
1348 if (si
->used_shallow
[i
][j
] & (1 << k
))
1349 si
->shallow_ref
[j
* 32 + k
]++;
1353 * true for those associated with some refs and belong
1354 * in "ours" list aka "step 7 not done yet"
1356 si
->need_reachability_test
[i
] =
1357 si
->need_reachability_test
[i
] > 1;
1361 * keep hooks happy by forcing a temporary shallow file via
1362 * env variable because we can't add --shallow-file to every
1363 * command. check_everything_connected() will be done with
1364 * true .git/shallow though.
1366 setenv(GIT_SHALLOW_FILE_ENVIRONMENT
, alt_shallow_file
, 1);
1369 static void update_shallow_info(struct command
*commands
,
1370 struct shallow_info
*si
,
1371 struct sha1_array
*ref
)
1373 struct command
*cmd
;
1375 remove_nonexistent_theirs_shallow(si
);
1376 if (!si
->nr_ours
&& !si
->nr_theirs
) {
1381 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1382 if (is_null_sha1(cmd
->new_sha1
))
1384 sha1_array_append(ref
, cmd
->new_sha1
);
1385 cmd
->index
= ref
->nr
- 1;
1389 if (shallow_update
) {
1390 prepare_shallow_update(commands
, si
);
1394 ref_status
= xmalloc(sizeof(*ref_status
) * ref
->nr
);
1395 assign_shallow_commits_to_refs(si
, NULL
, ref_status
);
1396 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1397 if (is_null_sha1(cmd
->new_sha1
))
1399 if (ref_status
[cmd
->index
]) {
1400 cmd
->error_string
= "shallow update not allowed";
1401 cmd
->skip_update
= 1;
1407 static void report(struct command
*commands
, const char *unpack_status
)
1409 struct command
*cmd
;
1410 struct strbuf buf
= STRBUF_INIT
;
1412 packet_buf_write(&buf
, "unpack %s\n",
1413 unpack_status
? unpack_status
: "ok");
1414 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1415 if (!cmd
->error_string
)
1416 packet_buf_write(&buf
, "ok %s\n",
1419 packet_buf_write(&buf
, "ng %s %s\n",
1420 cmd
->ref_name
, cmd
->error_string
);
1422 packet_buf_flush(&buf
);
1425 send_sideband(1, 1, buf
.buf
, buf
.len
, use_sideband
);
1427 write_or_die(1, buf
.buf
, buf
.len
);
1428 strbuf_release(&buf
);
1431 static int delete_only(struct command
*commands
)
1433 struct command
*cmd
;
1434 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1435 if (!is_null_sha1(cmd
->new_sha1
))
1441 int cmd_receive_pack(int argc
, const char **argv
, const char *prefix
)
1443 int advertise_refs
= 0;
1445 struct command
*commands
;
1446 struct sha1_array shallow
= SHA1_ARRAY_INIT
;
1447 struct sha1_array ref
= SHA1_ARRAY_INIT
;
1448 struct shallow_info si
;
1450 packet_trace_identity("receive-pack");
1453 for (i
= 1; i
< argc
; i
++) {
1454 const char *arg
= *argv
++;
1457 if (!strcmp(arg
, "--quiet")) {
1462 if (!strcmp(arg
, "--advertise-refs")) {
1466 if (!strcmp(arg
, "--stateless-rpc")) {
1470 if (!strcmp(arg
, "--reject-thin-pack-for-testing")) {
1475 usage(receive_pack_usage
);
1478 usage(receive_pack_usage
);
1482 usage(receive_pack_usage
);
1486 if (!enter_repo(service_dir
, 0))
1487 die("'%s' does not appear to be a git repository", service_dir
);
1489 git_config(receive_pack_config
, NULL
);
1490 if (cert_nonce_seed
)
1491 push_cert_nonce
= prepare_push_cert_nonce(service_dir
, time(NULL
));
1493 if (0 <= transfer_unpack_limit
)
1494 unpack_limit
= transfer_unpack_limit
;
1495 else if (0 <= receive_unpack_limit
)
1496 unpack_limit
= receive_unpack_limit
;
1498 if (advertise_refs
|| !stateless_rpc
) {
1504 if ((commands
= read_head_info(&shallow
)) != NULL
) {
1505 const char *unpack_status
= NULL
;
1507 prepare_shallow_info(&si
, &shallow
);
1508 if (!si
.nr_ours
&& !si
.nr_theirs
)
1510 if (!delete_only(commands
)) {
1511 unpack_status
= unpack_with_sideband(&si
);
1512 update_shallow_info(commands
, &si
, &ref
);
1514 execute_commands(commands
, unpack_status
, &si
);
1516 unlink_or_warn(pack_lockfile
);
1518 report(commands
, unpack_status
);
1519 run_receive_hook(commands
, "post-receive", 1);
1520 run_update_post_hook(commands
);
1522 const char *argv_gc_auto
[] = {
1523 "gc", "--auto", "--quiet", NULL
,
1525 int opt
= RUN_GIT_CMD
| RUN_COMMAND_STDOUT_TO_STDERR
;
1526 run_command_v_opt(argv_gc_auto
, opt
);
1528 if (auto_update_server_info
)
1529 update_server_info(0);
1530 clear_shallow_info(&si
);
1534 sha1_array_clear(&shallow
);
1535 sha1_array_clear(&ref
);
1536 free((void *)push_cert_nonce
);