3 #include "repository.h"
5 #include "environment.h"
13 #include "run-command.h"
20 #include "string-list.h"
21 #include "oid-array.h"
22 #include "connected.h"
25 #include "gpg-interface.h"
28 #include "tmp-objdir.h"
31 #include "object-name.h"
32 #include "object-store-ll.h"
35 #include "commit-reach.h"
36 #include "server-info.h"
41 #include "parse-options.h"
43 static const char * const receive_pack_usage
[] = {
44 N_("git receive-pack <git-dir>"),
56 static int deny_deletes
;
57 static int deny_non_fast_forwards
;
58 static enum deny_action deny_current_branch
= DENY_UNCONFIGURED
;
59 static enum deny_action deny_delete_current
= DENY_UNCONFIGURED
;
60 static int receive_fsck_objects
= -1;
61 static int transfer_fsck_objects
= -1;
62 static struct strbuf fsck_msg_types
= STRBUF_INIT
;
63 static int receive_unpack_limit
= -1;
64 static int transfer_unpack_limit
= -1;
65 static int advertise_atomic_push
= 1;
66 static int advertise_push_options
;
67 static int advertise_sid
;
68 static int unpack_limit
= 100;
69 static off_t max_input_size
;
70 static int report_status
;
71 static int report_status_v2
;
72 static int use_sideband
;
73 static int use_atomic
;
74 static int use_push_options
;
76 static int prefer_ofs_delta
= 1;
77 static int auto_update_server_info
;
78 static int auto_gc
= 1;
79 static int reject_thin
;
80 static int stateless_rpc
;
81 static const char *service_dir
;
82 static const char *head_name
;
83 static void *head_name_to_free
;
84 static int sent_capabilities
;
85 static int shallow_update
;
86 static const char *alt_shallow_file
;
87 static struct strbuf push_cert
= STRBUF_INIT
;
88 static struct object_id push_cert_oid
;
89 static struct signature_check sigcheck
;
90 static const char *push_cert_nonce
;
91 static const char *cert_nonce_seed
;
92 static struct strvec hidden_refs
= STRVEC_INIT
;
94 static const char *NONCE_UNSOLICITED
= "UNSOLICITED";
95 static const char *NONCE_BAD
= "BAD";
96 static const char *NONCE_MISSING
= "MISSING";
97 static const char *NONCE_OK
= "OK";
98 static const char *NONCE_SLOP
= "SLOP";
99 static const char *nonce_status
;
100 static long nonce_stamp_slop
;
101 static timestamp_t nonce_stamp_slop_limit
;
102 static struct ref_transaction
*transaction
;
109 static int keepalive_in_sec
= 5;
111 static struct tmp_objdir
*tmp_objdir
;
113 static struct proc_receive_ref
{
114 unsigned int want_add
:1,
119 struct proc_receive_ref
*next
;
122 static void proc_receive_ref_append(const char *prefix
);
124 static enum deny_action
parse_deny_action(const char *var
, const char *value
)
127 if (!strcasecmp(value
, "ignore"))
129 if (!strcasecmp(value
, "warn"))
131 if (!strcasecmp(value
, "refuse"))
133 if (!strcasecmp(value
, "updateinstead"))
134 return DENY_UPDATE_INSTEAD
;
136 if (git_config_bool(var
, value
))
141 static int receive_pack_config(const char *var
, const char *value
,
142 const struct config_context
*ctx
, void *cb
)
145 int status
= parse_hide_refs_config(var
, value
, "receive", &hidden_refs
);
150 if (strcmp(var
, "receive.denydeletes") == 0) {
151 deny_deletes
= git_config_bool(var
, value
);
155 if (strcmp(var
, "receive.denynonfastforwards") == 0) {
156 deny_non_fast_forwards
= git_config_bool(var
, value
);
160 if (strcmp(var
, "receive.unpacklimit") == 0) {
161 receive_unpack_limit
= git_config_int(var
, value
, ctx
->kvi
);
165 if (strcmp(var
, "transfer.unpacklimit") == 0) {
166 transfer_unpack_limit
= git_config_int(var
, value
, ctx
->kvi
);
170 if (strcmp(var
, "receive.fsck.skiplist") == 0) {
173 if (git_config_pathname(&path
, var
, value
))
175 strbuf_addf(&fsck_msg_types
, "%cskiplist=%s",
176 fsck_msg_types
.len
? ',' : '=', path
);
181 if (skip_prefix(var
, "receive.fsck.", &msg_id
)) {
183 return config_error_nonbool(var
);
184 if (is_valid_msg_type(msg_id
, value
))
185 strbuf_addf(&fsck_msg_types
, "%c%s=%s",
186 fsck_msg_types
.len
? ',' : '=', msg_id
, value
);
188 warning("skipping unknown msg id '%s'", msg_id
);
192 if (strcmp(var
, "receive.fsckobjects") == 0) {
193 receive_fsck_objects
= git_config_bool(var
, value
);
197 if (strcmp(var
, "transfer.fsckobjects") == 0) {
198 transfer_fsck_objects
= git_config_bool(var
, value
);
202 if (!strcmp(var
, "receive.denycurrentbranch")) {
203 deny_current_branch
= parse_deny_action(var
, value
);
207 if (strcmp(var
, "receive.denydeletecurrent") == 0) {
208 deny_delete_current
= parse_deny_action(var
, value
);
212 if (strcmp(var
, "repack.usedeltabaseoffset") == 0) {
213 prefer_ofs_delta
= git_config_bool(var
, value
);
217 if (strcmp(var
, "receive.updateserverinfo") == 0) {
218 auto_update_server_info
= git_config_bool(var
, value
);
222 if (strcmp(var
, "receive.autogc") == 0) {
223 auto_gc
= git_config_bool(var
, value
);
227 if (strcmp(var
, "receive.shallowupdate") == 0) {
228 shallow_update
= git_config_bool(var
, value
);
232 if (strcmp(var
, "receive.certnonceseed") == 0)
233 return git_config_string(&cert_nonce_seed
, var
, value
);
235 if (strcmp(var
, "receive.certnonceslop") == 0) {
236 nonce_stamp_slop_limit
= git_config_ulong(var
, value
, ctx
->kvi
);
240 if (strcmp(var
, "receive.advertiseatomic") == 0) {
241 advertise_atomic_push
= git_config_bool(var
, value
);
245 if (strcmp(var
, "receive.advertisepushoptions") == 0) {
246 advertise_push_options
= git_config_bool(var
, value
);
250 if (strcmp(var
, "receive.keepalive") == 0) {
251 keepalive_in_sec
= git_config_int(var
, value
, ctx
->kvi
);
255 if (strcmp(var
, "receive.maxinputsize") == 0) {
256 max_input_size
= git_config_int64(var
, value
, ctx
->kvi
);
260 if (strcmp(var
, "receive.procreceiverefs") == 0) {
262 return config_error_nonbool(var
);
263 proc_receive_ref_append(value
);
267 if (strcmp(var
, "transfer.advertisesid") == 0) {
268 advertise_sid
= git_config_bool(var
, value
);
272 return git_default_config(var
, value
, ctx
, cb
);
275 static void show_ref(const char *path
, const struct object_id
*oid
)
277 if (sent_capabilities
) {
278 packet_write_fmt(1, "%s %s\n", oid_to_hex(oid
), path
);
280 struct strbuf cap
= STRBUF_INIT
;
283 "report-status report-status-v2 delete-refs side-band-64k quiet");
284 if (advertise_atomic_push
)
285 strbuf_addstr(&cap
, " atomic");
286 if (prefer_ofs_delta
)
287 strbuf_addstr(&cap
, " ofs-delta");
289 strbuf_addf(&cap
, " push-cert=%s", push_cert_nonce
);
290 if (advertise_push_options
)
291 strbuf_addstr(&cap
, " push-options");
293 strbuf_addf(&cap
, " session-id=%s", trace2_session_id());
294 strbuf_addf(&cap
, " object-format=%s", the_hash_algo
->name
);
295 strbuf_addf(&cap
, " agent=%s", git_user_agent_sanitized());
296 packet_write_fmt(1, "%s %s%c%s\n",
297 oid_to_hex(oid
), path
, 0, cap
.buf
);
298 strbuf_release(&cap
);
299 sent_capabilities
= 1;
303 static int show_ref_cb(const char *path_full
, const struct object_id
*oid
,
304 int flag UNUSED
, void *data
)
306 struct oidset
*seen
= data
;
307 const char *path
= strip_namespace(path_full
);
309 if (ref_is_hidden(path
, path_full
, &hidden_refs
))
313 * Advertise refs outside our current namespace as ".have"
314 * refs, so that the client can use them to minimize data
315 * transfer but will otherwise ignore them.
318 if (oidset_insert(seen
, oid
))
322 oidset_insert(seen
, oid
);
328 static void show_one_alternate_ref(const struct object_id
*oid
,
331 struct oidset
*seen
= data
;
333 if (oidset_insert(seen
, oid
))
336 show_ref(".have", oid
);
339 static void write_head_info(void)
341 static struct oidset seen
= OIDSET_INIT
;
343 refs_for_each_fullref_in(get_main_ref_store(the_repository
), "",
344 hidden_refs_to_excludes(&hidden_refs
),
346 for_each_alternate_ref(show_one_alternate_ref
, &seen
);
348 if (!sent_capabilities
)
349 show_ref("capabilities^{}", null_oid());
351 advertise_shallow_grafts(1);
357 #define RUN_PROC_RECEIVE_SCHEDULED 1
358 #define RUN_PROC_RECEIVE_RETURNED 2
360 struct command
*next
;
361 const char *error_string
;
362 struct ref_push_report
*report
;
363 unsigned int skip_update
:1,
367 struct object_id old_oid
;
368 struct object_id new_oid
;
369 char ref_name
[FLEX_ARRAY
]; /* more */
372 static void proc_receive_ref_append(const char *prefix
)
374 struct proc_receive_ref
*ref_pattern
;
378 CALLOC_ARRAY(ref_pattern
, 1);
379 p
= strchr(prefix
, ':');
383 ref_pattern
->want_add
= 1;
384 else if (*prefix
== 'd')
385 ref_pattern
->want_delete
= 1;
386 else if (*prefix
== 'm')
387 ref_pattern
->want_modify
= 1;
388 else if (*prefix
== '!')
389 ref_pattern
->negative_ref
= 1;
394 ref_pattern
->want_add
= 1;
395 ref_pattern
->want_delete
= 1;
396 ref_pattern
->want_modify
= 1;
398 len
= strlen(prefix
);
399 while (len
&& prefix
[len
- 1] == '/')
401 ref_pattern
->ref_prefix
= xmemdupz(prefix
, len
);
402 if (!proc_receive_ref
) {
403 proc_receive_ref
= ref_pattern
;
405 struct proc_receive_ref
*end
;
407 end
= proc_receive_ref
;
410 end
->next
= ref_pattern
;
414 static int proc_receive_ref_matches(struct command
*cmd
)
416 struct proc_receive_ref
*p
;
418 if (!proc_receive_ref
)
421 for (p
= proc_receive_ref
; p
; p
= p
->next
) {
422 const char *match
= p
->ref_prefix
;
425 if (!p
->want_add
&& is_null_oid(&cmd
->old_oid
))
427 else if (!p
->want_delete
&& is_null_oid(&cmd
->new_oid
))
429 else if (!p
->want_modify
&&
430 !is_null_oid(&cmd
->old_oid
) &&
431 !is_null_oid(&cmd
->new_oid
))
434 if (skip_prefix(cmd
->ref_name
, match
, &remains
) &&
435 (!*remains
|| *remains
== '/')) {
436 if (!p
->negative_ref
)
438 } else if (p
->negative_ref
) {
445 static void report_message(const char *prefix
, const char *err
, va_list params
)
450 sz
= xsnprintf(msg
, sizeof(msg
), "%s", prefix
);
451 sz
+= vsnprintf(msg
+ sz
, sizeof(msg
) - sz
, err
, params
);
452 if (sz
> (sizeof(msg
) - 1))
453 sz
= sizeof(msg
) - 1;
457 send_sideband(1, 2, msg
, sz
, use_sideband
);
462 __attribute__((format (printf
, 1, 2)))
463 static void rp_warning(const char *err
, ...)
466 va_start(params
, err
);
467 report_message("warning: ", err
, params
);
471 __attribute__((format (printf
, 1, 2)))
472 static void rp_error(const char *err
, ...)
475 va_start(params
, err
);
476 report_message("error: ", err
, params
);
480 static int copy_to_sideband(int in
, int out UNUSED
, void *arg UNUSED
)
483 int keepalive_active
= 0;
485 if (keepalive_in_sec
<= 0)
486 use_keepalive
= KEEPALIVE_NEVER
;
487 if (use_keepalive
== KEEPALIVE_ALWAYS
)
488 keepalive_active
= 1;
493 if (keepalive_active
) {
499 ret
= poll(&pfd
, 1, 1000 * keepalive_in_sec
);
506 } else if (ret
== 0) {
507 /* no data; send a keepalive packet */
508 static const char buf
[] = "0005\1";
509 write_or_die(1, buf
, sizeof(buf
) - 1);
511 } /* else there is actual data to read */
514 sz
= xread(in
, data
, sizeof(data
));
518 if (use_keepalive
== KEEPALIVE_AFTER_NUL
&& !keepalive_active
) {
519 const char *p
= memchr(data
, '\0', sz
);
522 * The NUL tells us to start sending keepalives. Make
523 * sure we send any other data we read along
526 keepalive_active
= 1;
527 send_sideband(1, 2, data
, p
- data
, use_sideband
);
528 send_sideband(1, 2, p
+ 1, sz
- (p
- data
+ 1), use_sideband
);
534 * Either we're not looking for a NUL signal, or we didn't see
535 * it yet; just pass along the data.
537 send_sideband(1, 2, data
, sz
, use_sideband
);
543 static void hmac_hash(unsigned char *out
,
544 const char *key_in
, size_t key_len
,
545 const char *text
, size_t text_len
)
547 unsigned char key
[GIT_MAX_BLKSZ
];
548 unsigned char k_ipad
[GIT_MAX_BLKSZ
];
549 unsigned char k_opad
[GIT_MAX_BLKSZ
];
553 /* RFC 2104 2. (1) */
554 memset(key
, '\0', GIT_MAX_BLKSZ
);
555 if (the_hash_algo
->blksz
< key_len
) {
556 the_hash_algo
->init_fn(&ctx
);
557 the_hash_algo
->update_fn(&ctx
, key_in
, key_len
);
558 the_hash_algo
->final_fn(key
, &ctx
);
560 memcpy(key
, key_in
, key_len
);
563 /* RFC 2104 2. (2) & (5) */
564 for (i
= 0; i
< sizeof(key
); i
++) {
565 k_ipad
[i
] = key
[i
] ^ 0x36;
566 k_opad
[i
] = key
[i
] ^ 0x5c;
569 /* RFC 2104 2. (3) & (4) */
570 the_hash_algo
->init_fn(&ctx
);
571 the_hash_algo
->update_fn(&ctx
, k_ipad
, sizeof(k_ipad
));
572 the_hash_algo
->update_fn(&ctx
, text
, text_len
);
573 the_hash_algo
->final_fn(out
, &ctx
);
575 /* RFC 2104 2. (6) & (7) */
576 the_hash_algo
->init_fn(&ctx
);
577 the_hash_algo
->update_fn(&ctx
, k_opad
, sizeof(k_opad
));
578 the_hash_algo
->update_fn(&ctx
, out
, the_hash_algo
->rawsz
);
579 the_hash_algo
->final_fn(out
, &ctx
);
582 static char *prepare_push_cert_nonce(const char *path
, timestamp_t stamp
)
584 struct strbuf buf
= STRBUF_INIT
;
585 unsigned char hash
[GIT_MAX_RAWSZ
];
587 strbuf_addf(&buf
, "%s:%"PRItime
, path
, stamp
);
588 hmac_hash(hash
, buf
.buf
, buf
.len
, cert_nonce_seed
, strlen(cert_nonce_seed
));
589 strbuf_release(&buf
);
591 /* RFC 2104 5. HMAC-SHA1 or HMAC-SHA256 */
592 strbuf_addf(&buf
, "%"PRItime
"-%.*s", stamp
, (int)the_hash_algo
->hexsz
, hash_to_hex(hash
));
593 return strbuf_detach(&buf
, NULL
);
597 * Return zero if a and b are equal up to n bytes and nonzero if they are not.
598 * This operation is guaranteed to run in constant time to avoid leaking data.
600 static int constant_memequal(const char *a
, const char *b
, size_t n
)
605 for (i
= 0; i
< n
; i
++)
610 static const char *check_nonce(const char *buf
)
613 const char *found
= find_commit_header(buf
, "nonce", &noncelen
);
614 char *nonce
= found
? xmemdupz(found
, noncelen
) : NULL
;
615 timestamp_t stamp
, ostamp
;
616 char *bohmac
, *expect
= NULL
;
617 const char *retval
= NONCE_BAD
;
620 retval
= NONCE_MISSING
;
622 } else if (!push_cert_nonce
) {
623 retval
= NONCE_UNSOLICITED
;
625 } else if (!strcmp(push_cert_nonce
, nonce
)) {
630 if (!stateless_rpc
) {
631 /* returned nonce MUST match what we gave out earlier */
637 * In stateless mode, we may be receiving a nonce issued by
638 * another instance of the server that serving the same
639 * repository, and the timestamps may not match, but the
640 * nonce-seed and dir should match, so we can recompute and
641 * report the time slop.
643 * In addition, when a nonce issued by another instance has
644 * timestamp within receive.certnonceslop seconds, we pretend
645 * as if we issued that nonce when reporting to the hook.
648 /* nonce is concat(<seconds-since-epoch>, "-", <hmac>) */
649 if (*nonce
<= '0' || '9' < *nonce
) {
653 stamp
= parse_timestamp(nonce
, &bohmac
, 10);
654 if (bohmac
== nonce
|| bohmac
[0] != '-') {
659 expect
= prepare_push_cert_nonce(service_dir
, stamp
);
660 if (noncelen
!= strlen(expect
)) {
661 /* This is not even the right size. */
665 if (constant_memequal(expect
, nonce
, noncelen
)) {
666 /* Not what we would have signed earlier */
672 * By how many seconds is this nonce stale? Negative value
673 * would mean it was issued by another server with its clock
674 * skewed in the future.
676 ostamp
= parse_timestamp(push_cert_nonce
, NULL
, 10);
677 nonce_stamp_slop
= (long)ostamp
- (long)stamp
;
679 if (nonce_stamp_slop_limit
&&
680 labs(nonce_stamp_slop
) <= nonce_stamp_slop_limit
) {
682 * Pretend as if the received nonce (which passes the
683 * HMAC check, so it is not a forged by third-party)
686 free((void *)push_cert_nonce
);
687 push_cert_nonce
= xstrdup(nonce
);
700 * Return 1 if there is no push_cert or if the push options in push_cert are
701 * the same as those in the argument; 0 otherwise.
703 static int check_cert_push_options(const struct string_list
*push_options
)
705 const char *buf
= push_cert
.buf
;
709 int options_seen
= 0;
716 while ((option
= find_commit_header(buf
, "push-option", &optionlen
))) {
717 buf
= option
+ optionlen
+ 1;
719 if (options_seen
> push_options
->nr
720 || xstrncmpz(push_options
->items
[options_seen
- 1].string
,
725 if (options_seen
!= push_options
->nr
)
731 static void prepare_push_cert_sha1(struct child_process
*proc
)
733 static int already_done
;
739 int bogs
/* beginning_of_gpg_sig */;
742 if (write_object_file(push_cert
.buf
, push_cert
.len
, OBJ_BLOB
,
744 oidclr(&push_cert_oid
);
746 memset(&sigcheck
, '\0', sizeof(sigcheck
));
748 bogs
= parse_signed_buffer(push_cert
.buf
, push_cert
.len
);
749 sigcheck
.payload
= xmemdupz(push_cert
.buf
, bogs
);
750 sigcheck
.payload_len
= bogs
;
751 check_signature(&sigcheck
, push_cert
.buf
+ bogs
,
752 push_cert
.len
- bogs
);
754 nonce_status
= check_nonce(sigcheck
.payload
);
756 if (!is_null_oid(&push_cert_oid
)) {
757 strvec_pushf(&proc
->env
, "GIT_PUSH_CERT=%s",
758 oid_to_hex(&push_cert_oid
));
759 strvec_pushf(&proc
->env
, "GIT_PUSH_CERT_SIGNER=%s",
760 sigcheck
.signer
? sigcheck
.signer
: "");
761 strvec_pushf(&proc
->env
, "GIT_PUSH_CERT_KEY=%s",
762 sigcheck
.key
? sigcheck
.key
: "");
763 strvec_pushf(&proc
->env
, "GIT_PUSH_CERT_STATUS=%c",
765 if (push_cert_nonce
) {
766 strvec_pushf(&proc
->env
,
767 "GIT_PUSH_CERT_NONCE=%s",
769 strvec_pushf(&proc
->env
,
770 "GIT_PUSH_CERT_NONCE_STATUS=%s",
772 if (nonce_status
== NONCE_SLOP
)
773 strvec_pushf(&proc
->env
,
774 "GIT_PUSH_CERT_NONCE_SLOP=%ld",
780 struct receive_hook_feed_state
{
782 struct ref_push_report
*report
;
785 const struct string_list
*push_options
;
788 typedef int (*feed_fn
)(void *, const char **, size_t *);
789 static int run_and_feed_hook(const char *hook_name
, feed_fn feed
,
790 struct receive_hook_feed_state
*feed_state
)
792 struct child_process proc
= CHILD_PROCESS_INIT
;
795 const char *hook_path
= find_hook(hook_name
);
800 strvec_push(&proc
.args
, hook_path
);
802 proc
.stdout_to_stderr
= 1;
803 proc
.trace2_hook_name
= hook_name
;
805 if (feed_state
->push_options
) {
807 for (i
= 0; i
< feed_state
->push_options
->nr
; i
++)
808 strvec_pushf(&proc
.env
,
809 "GIT_PUSH_OPTION_%"PRIuMAX
"=%s",
811 feed_state
->push_options
->items
[i
].string
);
812 strvec_pushf(&proc
.env
, "GIT_PUSH_OPTION_COUNT=%"PRIuMAX
"",
813 (uintmax_t)feed_state
->push_options
->nr
);
815 strvec_pushf(&proc
.env
, "GIT_PUSH_OPTION_COUNT");
818 strvec_pushv(&proc
.env
, tmp_objdir_env(tmp_objdir
));
821 memset(&muxer
, 0, sizeof(muxer
));
822 muxer
.proc
= copy_to_sideband
;
824 code
= start_async(&muxer
);
830 prepare_push_cert_sha1(&proc
);
832 code
= start_command(&proc
);
835 finish_async(&muxer
);
839 sigchain_push(SIGPIPE
, SIG_IGN
);
844 if (feed(feed_state
, &buf
, &n
))
846 if (write_in_full(proc
.in
, buf
, n
) < 0)
851 finish_async(&muxer
);
853 sigchain_pop(SIGPIPE
);
855 return finish_command(&proc
);
858 static int feed_receive_hook(void *state_
, const char **bufp
, size_t *sizep
)
860 struct receive_hook_feed_state
*state
= state_
;
861 struct command
*cmd
= state
->cmd
;
864 state
->skip_broken
&& (cmd
->error_string
|| cmd
->did_not_exist
))
869 return 0; /* OK, can feed something. */
870 strbuf_reset(&state
->buf
);
872 state
->report
= cmd
->report
;
874 struct object_id
*old_oid
;
875 struct object_id
*new_oid
;
876 const char *ref_name
;
878 old_oid
= state
->report
->old_oid
? state
->report
->old_oid
: &cmd
->old_oid
;
879 new_oid
= state
->report
->new_oid
? state
->report
->new_oid
: &cmd
->new_oid
;
880 ref_name
= state
->report
->ref_name
? state
->report
->ref_name
: cmd
->ref_name
;
881 strbuf_addf(&state
->buf
, "%s %s %s\n",
882 oid_to_hex(old_oid
), oid_to_hex(new_oid
),
884 state
->report
= state
->report
->next
;
886 state
->cmd
= cmd
->next
;
888 strbuf_addf(&state
->buf
, "%s %s %s\n",
889 oid_to_hex(&cmd
->old_oid
), oid_to_hex(&cmd
->new_oid
),
891 state
->cmd
= cmd
->next
;
894 *bufp
= state
->buf
.buf
;
895 *sizep
= state
->buf
.len
;
900 static int run_receive_hook(struct command
*commands
,
901 const char *hook_name
,
903 const struct string_list
*push_options
)
905 struct receive_hook_feed_state state
;
908 strbuf_init(&state
.buf
, 0);
909 state
.cmd
= commands
;
910 state
.skip_broken
= skip_broken
;
912 if (feed_receive_hook(&state
, NULL
, NULL
))
914 state
.cmd
= commands
;
915 state
.push_options
= push_options
;
916 status
= run_and_feed_hook(hook_name
, feed_receive_hook
, &state
);
917 strbuf_release(&state
.buf
);
921 static int run_update_hook(struct command
*cmd
)
923 struct child_process proc
= CHILD_PROCESS_INIT
;
925 const char *hook_path
= find_hook("update");
930 strvec_push(&proc
.args
, hook_path
);
931 strvec_push(&proc
.args
, cmd
->ref_name
);
932 strvec_push(&proc
.args
, oid_to_hex(&cmd
->old_oid
));
933 strvec_push(&proc
.args
, oid_to_hex(&cmd
->new_oid
));
936 proc
.stdout_to_stderr
= 1;
937 proc
.err
= use_sideband
? -1 : 0;
938 proc
.trace2_hook_name
= "update";
940 code
= start_command(&proc
);
944 copy_to_sideband(proc
.err
, -1, NULL
);
945 return finish_command(&proc
);
948 static struct command
*find_command_by_refname(struct command
*list
,
951 for (; list
; list
= list
->next
)
952 if (!strcmp(list
->ref_name
, refname
))
957 static int read_proc_receive_report(struct packet_reader
*reader
,
958 struct command
*commands
,
959 struct strbuf
*errmsg
)
962 struct command
*hint
= NULL
;
963 struct ref_push_report
*report
= NULL
;
970 struct object_id old_oid
, new_oid
;
974 enum packet_read_status status
;
976 status
= packet_reader_read(reader
);
977 if (status
!= PACKET_READ_NORMAL
) {
978 /* Check whether proc-receive exited abnormally */
979 if (status
== PACKET_READ_EOF
&& !response
) {
980 strbuf_addstr(errmsg
, "proc-receive exited abnormally");
988 p
= strchr(head
, ' ');
990 strbuf_addf(errmsg
, "proc-receive reported incomplete status line: '%s'\n", head
);
995 if (!strcmp(head
, "option")) {
996 const char *key
, *val
;
998 if (!hint
|| !(report
|| new_report
)) {
1000 strbuf_addstr(errmsg
, "proc-receive reported 'option' without a matching 'ok/ng' directive\n");
1005 if (!hint
->report
) {
1006 CALLOC_ARRAY(hint
->report
, 1);
1007 report
= hint
->report
;
1009 report
= hint
->report
;
1010 while (report
->next
)
1011 report
= report
->next
;
1012 report
->next
= xcalloc(1, sizeof(struct ref_push_report
));
1013 report
= report
->next
;
1018 p
= strchr(key
, ' ');
1022 if (!strcmp(key
, "refname"))
1023 report
->ref_name
= xstrdup_or_null(val
);
1024 else if (!strcmp(key
, "old-oid") && val
&&
1025 !parse_oid_hex(val
, &old_oid
, &val
))
1026 report
->old_oid
= oiddup(&old_oid
);
1027 else if (!strcmp(key
, "new-oid") && val
&&
1028 !parse_oid_hex(val
, &new_oid
, &val
))
1029 report
->new_oid
= oiddup(&new_oid
);
1030 else if (!strcmp(key
, "forced-update"))
1031 report
->forced_update
= 1;
1032 else if (!strcmp(key
, "fall-through"))
1033 /* Fall through, let 'receive-pack' to execute it. */
1034 hint
->run_proc_receive
= 0;
1041 p
= strchr(refname
, ' ');
1044 if (strcmp(head
, "ok") && strcmp(head
, "ng")) {
1045 strbuf_addf(errmsg
, "proc-receive reported bad status '%s' on ref '%s'\n",
1051 /* first try searching at our hint, falling back to all refs */
1053 hint
= find_command_by_refname(hint
, refname
);
1055 hint
= find_command_by_refname(commands
, refname
);
1057 strbuf_addf(errmsg
, "proc-receive reported status on unknown ref: %s\n",
1062 if (!hint
->run_proc_receive
) {
1063 strbuf_addf(errmsg
, "proc-receive reported status on unexpected ref: %s\n",
1068 hint
->run_proc_receive
|= RUN_PROC_RECEIVE_RETURNED
;
1069 if (!strcmp(head
, "ng")) {
1071 hint
->error_string
= xstrdup(p
);
1073 hint
->error_string
= "failed";
1080 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
1081 if (cmd
->run_proc_receive
&& !cmd
->error_string
&&
1082 !(cmd
->run_proc_receive
& RUN_PROC_RECEIVE_RETURNED
)) {
1083 cmd
->error_string
= "proc-receive failed to report status";
1089 static int run_proc_receive_hook(struct command
*commands
,
1090 const struct string_list
*push_options
)
1092 struct child_process proc
= CHILD_PROCESS_INIT
;
1094 struct command
*cmd
;
1095 struct packet_reader reader
;
1096 struct strbuf cap
= STRBUF_INIT
;
1097 struct strbuf errmsg
= STRBUF_INIT
;
1098 int hook_use_push_options
= 0;
1101 const char *hook_path
= find_hook("proc-receive");
1104 rp_error("cannot find hook 'proc-receive'");
1108 strvec_push(&proc
.args
, hook_path
);
1111 proc
.trace2_hook_name
= "proc-receive";
1114 memset(&muxer
, 0, sizeof(muxer
));
1115 muxer
.proc
= copy_to_sideband
;
1117 code
= start_async(&muxer
);
1120 proc
.err
= muxer
.in
;
1125 code
= start_command(&proc
);
1128 finish_async(&muxer
);
1132 sigchain_push(SIGPIPE
, SIG_IGN
);
1134 /* Version negotiaton */
1135 packet_reader_init(&reader
, proc
.out
, NULL
, 0,
1136 PACKET_READ_CHOMP_NEWLINE
|
1137 PACKET_READ_GENTLE_ON_EOF
);
1139 strbuf_addstr(&cap
, " atomic");
1140 if (use_push_options
)
1141 strbuf_addstr(&cap
, " push-options");
1143 code
= packet_write_fmt_gently(proc
.in
, "version=1%c%s\n", '\0', cap
.buf
+ 1);
1144 strbuf_release(&cap
);
1146 code
= packet_write_fmt_gently(proc
.in
, "version=1\n");
1149 code
= packet_flush_gently(proc
.in
);
1154 enum packet_read_status status
;
1156 status
= packet_reader_read(&reader
);
1157 if (status
!= PACKET_READ_NORMAL
) {
1158 /* Check whether proc-receive exited abnormally */
1159 if (status
== PACKET_READ_EOF
)
1164 if (reader
.pktlen
> 8 && starts_with(reader
.line
, "version=")) {
1165 version
= atoi(reader
.line
+ 8);
1166 linelen
= strlen(reader
.line
);
1167 if (linelen
< reader
.pktlen
) {
1168 const char *feature_list
= reader
.line
+ linelen
+ 1;
1169 if (parse_feature_request(feature_list
, "push-options"))
1170 hook_use_push_options
= 1;
1176 strbuf_addstr(&errmsg
, "fail to negotiate version with proc-receive hook");
1186 strbuf_addf(&errmsg
, "proc-receive version '%d' is not supported",
1193 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1194 if (!cmd
->run_proc_receive
|| cmd
->skip_update
|| cmd
->error_string
)
1196 code
= packet_write_fmt_gently(proc
.in
, "%s %s %s",
1197 oid_to_hex(&cmd
->old_oid
),
1198 oid_to_hex(&cmd
->new_oid
),
1204 code
= packet_flush_gently(proc
.in
);
1206 strbuf_addstr(&errmsg
, "fail to write commands to proc-receive hook");
1210 /* Send push options */
1211 if (hook_use_push_options
) {
1212 struct string_list_item
*item
;
1214 for_each_string_list_item(item
, push_options
) {
1215 code
= packet_write_fmt_gently(proc
.in
, "%s", item
->string
);
1220 code
= packet_flush_gently(proc
.in
);
1222 strbuf_addstr(&errmsg
,
1223 "fail to write push-options to proc-receive hook");
1228 /* Read result from proc-receive */
1229 code
= read_proc_receive_report(&reader
, commands
, &errmsg
);
1235 finish_async(&muxer
);
1236 if (finish_command(&proc
))
1238 if (errmsg
.len
>0) {
1239 char *p
= errmsg
.buf
;
1241 p
+= errmsg
.len
- 1;
1244 rp_error("%s", errmsg
.buf
);
1245 strbuf_release(&errmsg
);
1247 sigchain_pop(SIGPIPE
);
1252 static char *refuse_unconfigured_deny_msg
=
1253 N_("By default, updating the current branch in a non-bare repository\n"
1254 "is denied, because it will make the index and work tree inconsistent\n"
1255 "with what you pushed, and will require 'git reset --hard' to match\n"
1256 "the work tree to HEAD.\n"
1258 "You can set the 'receive.denyCurrentBranch' configuration variable\n"
1259 "to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
1260 "its current branch; however, this is not recommended unless you\n"
1261 "arranged to update its work tree to match what you pushed in some\n"
1264 "To squelch this message and still keep the default behaviour, set\n"
1265 "'receive.denyCurrentBranch' configuration variable to 'refuse'.");
1267 static void refuse_unconfigured_deny(void)
1269 rp_error("%s", _(refuse_unconfigured_deny_msg
));
1272 static char *refuse_unconfigured_deny_delete_current_msg
=
1273 N_("By default, deleting the current branch is denied, because the next\n"
1274 "'git clone' won't result in any file checked out, causing confusion.\n"
1276 "You can set 'receive.denyDeleteCurrent' configuration variable to\n"
1277 "'warn' or 'ignore' in the remote repository to allow deleting the\n"
1278 "current branch, with or without a warning message.\n"
1280 "To squelch this message, you can set it to 'refuse'.");
1282 static void refuse_unconfigured_deny_delete_current(void)
1284 rp_error("%s", _(refuse_unconfigured_deny_delete_current_msg
));
1287 static const struct object_id
*command_singleton_iterator(void *cb_data
);
1288 static int update_shallow_ref(struct command
*cmd
, struct shallow_info
*si
)
1290 struct shallow_lock shallow_lock
= SHALLOW_LOCK_INIT
;
1291 struct oid_array extra
= OID_ARRAY_INIT
;
1292 struct check_connected_options opt
= CHECK_CONNECTED_INIT
;
1293 uint32_t mask
= 1 << (cmd
->index
% 32);
1296 trace_printf_key(&trace_shallow
,
1297 "shallow: update_shallow_ref %s\n", cmd
->ref_name
);
1298 for (i
= 0; i
< si
->shallow
->nr
; i
++)
1299 if (si
->used_shallow
[i
] &&
1300 (si
->used_shallow
[i
][cmd
->index
/ 32] & mask
) &&
1301 !delayed_reachability_test(si
, i
))
1302 oid_array_append(&extra
, &si
->shallow
->oid
[i
]);
1304 opt
.env
= tmp_objdir_env(tmp_objdir
);
1305 setup_alternate_shallow(&shallow_lock
, &opt
.shallow_file
, &extra
);
1306 if (check_connected(command_singleton_iterator
, cmd
, &opt
)) {
1307 rollback_shallow_file(the_repository
, &shallow_lock
);
1308 oid_array_clear(&extra
);
1312 commit_shallow_file(the_repository
, &shallow_lock
);
1315 * Make sure setup_alternate_shallow() for the next ref does
1316 * not lose these new roots..
1318 for (i
= 0; i
< extra
.nr
; i
++)
1319 register_shallow(the_repository
, &extra
.oid
[i
]);
1321 si
->shallow_ref
[cmd
->index
] = 0;
1322 oid_array_clear(&extra
);
1327 * NEEDSWORK: we should consolidate various implementions of "are we
1328 * on an unborn branch?" test into one, and make the unified one more
1329 * robust. !get_sha1() based check used here and elsewhere would not
1330 * allow us to tell an unborn branch from corrupt ref, for example.
1331 * For the purpose of fixing "deploy-to-update does not work when
1332 * pushing into an empty repository" issue, this should suffice for
1335 static int head_has_history(void)
1337 struct object_id oid
;
1339 return !repo_get_oid(the_repository
, "HEAD", &oid
);
1342 static const char *push_to_deploy(unsigned char *sha1
,
1344 const char *work_tree
)
1346 struct child_process child
= CHILD_PROCESS_INIT
;
1348 strvec_pushl(&child
.args
, "update-index", "-q", "--ignore-submodules",
1350 strvec_pushv(&child
.env
, env
->v
);
1351 child
.dir
= work_tree
;
1353 child
.stdout_to_stderr
= 1;
1355 if (run_command(&child
))
1356 return "Up-to-date check failed";
1358 /* run_command() does not clean up completely; reinitialize */
1359 child_process_init(&child
);
1360 strvec_pushl(&child
.args
, "diff-files", "--quiet",
1361 "--ignore-submodules", "--", NULL
);
1362 strvec_pushv(&child
.env
, env
->v
);
1363 child
.dir
= work_tree
;
1365 child
.stdout_to_stderr
= 1;
1367 if (run_command(&child
))
1368 return "Working directory has unstaged changes";
1370 child_process_init(&child
);
1371 strvec_pushl(&child
.args
, "diff-index", "--quiet", "--cached",
1372 "--ignore-submodules",
1373 /* diff-index with either HEAD or an empty tree */
1374 head_has_history() ? "HEAD" : empty_tree_oid_hex(),
1376 strvec_pushv(&child
.env
, env
->v
);
1378 child
.no_stdout
= 1;
1379 child
.stdout_to_stderr
= 0;
1381 if (run_command(&child
))
1382 return "Working directory has staged changes";
1384 child_process_init(&child
);
1385 strvec_pushl(&child
.args
, "read-tree", "-u", "-m", hash_to_hex(sha1
),
1387 strvec_pushv(&child
.env
, env
->v
);
1388 child
.dir
= work_tree
;
1390 child
.no_stdout
= 1;
1391 child
.stdout_to_stderr
= 0;
1393 if (run_command(&child
))
1394 return "Could not update working tree to new HEAD";
1399 static const char *push_to_checkout_hook
= "push-to-checkout";
1401 static const char *push_to_checkout(unsigned char *hash
,
1404 const char *work_tree
)
1406 struct run_hooks_opt opt
= RUN_HOOKS_OPT_INIT
;
1407 opt
.invoked_hook
= invoked_hook
;
1409 strvec_pushf(env
, "GIT_WORK_TREE=%s", absolute_path(work_tree
));
1410 strvec_pushv(&opt
.env
, env
->v
);
1411 strvec_push(&opt
.args
, hash_to_hex(hash
));
1412 if (run_hooks_opt(push_to_checkout_hook
, &opt
))
1413 return "push-to-checkout hook declined";
1418 static const char *update_worktree(unsigned char *sha1
, const struct worktree
*worktree
)
1420 const char *retval
, *git_dir
;
1421 struct strvec env
= STRVEC_INIT
;
1424 if (!worktree
|| !worktree
->path
)
1425 BUG("worktree->path must be non-NULL");
1427 if (worktree
->is_bare
)
1428 return "denyCurrentBranch = updateInstead needs a worktree";
1429 git_dir
= get_worktree_git_dir(worktree
);
1431 strvec_pushf(&env
, "GIT_DIR=%s", absolute_path(git_dir
));
1433 retval
= push_to_checkout(sha1
, &invoked_hook
, &env
, worktree
->path
);
1435 retval
= push_to_deploy(sha1
, &env
, worktree
->path
);
1441 static const char *update(struct command
*cmd
, struct shallow_info
*si
)
1443 const char *name
= cmd
->ref_name
;
1444 struct strbuf namespaced_name_buf
= STRBUF_INIT
;
1445 static char *namespaced_name
;
1447 struct object_id
*old_oid
= &cmd
->old_oid
;
1448 struct object_id
*new_oid
= &cmd
->new_oid
;
1449 int do_update_worktree
= 0;
1450 struct worktree
**worktrees
= get_worktrees();
1451 const struct worktree
*worktree
=
1452 find_shared_symref(worktrees
, "HEAD", name
);
1454 /* only refs/... are allowed */
1455 if (!starts_with(name
, "refs/") ||
1456 check_refname_format(name
+ 5, is_null_oid(new_oid
) ?
1457 REFNAME_ALLOW_ONELEVEL
: 0)) {
1458 rp_error("refusing to update funny ref '%s' remotely", name
);
1459 ret
= "funny refname";
1463 strbuf_addf(&namespaced_name_buf
, "%s%s", get_git_namespace(), name
);
1464 free(namespaced_name
);
1465 namespaced_name
= strbuf_detach(&namespaced_name_buf
, NULL
);
1467 if (worktree
&& !worktree
->is_bare
) {
1468 switch (deny_current_branch
) {
1472 rp_warning("updating the current branch");
1475 case DENY_UNCONFIGURED
:
1476 rp_error("refusing to update checked out branch: %s", name
);
1477 if (deny_current_branch
== DENY_UNCONFIGURED
)
1478 refuse_unconfigured_deny();
1479 ret
= "branch is currently checked out";
1481 case DENY_UPDATE_INSTEAD
:
1482 /* pass -- let other checks intervene first */
1483 do_update_worktree
= 1;
1488 if (!is_null_oid(new_oid
) && !repo_has_object_file(the_repository
, new_oid
)) {
1489 error("unpack should have generated %s, "
1490 "but I can't find it!", oid_to_hex(new_oid
));
1495 if (!is_null_oid(old_oid
) && is_null_oid(new_oid
)) {
1496 if (deny_deletes
&& starts_with(name
, "refs/heads/")) {
1497 rp_error("denying ref deletion for %s", name
);
1498 ret
= "deletion prohibited";
1502 if (worktree
|| (head_name
&& !strcmp(namespaced_name
, head_name
))) {
1503 switch (deny_delete_current
) {
1507 rp_warning("deleting the current branch");
1510 case DENY_UNCONFIGURED
:
1511 case DENY_UPDATE_INSTEAD
:
1512 if (deny_delete_current
== DENY_UNCONFIGURED
)
1513 refuse_unconfigured_deny_delete_current();
1514 rp_error("refusing to delete the current branch: %s", name
);
1515 ret
= "deletion of the current branch prohibited";
1518 ret
= "Invalid denyDeleteCurrent setting";
1524 if (deny_non_fast_forwards
&& !is_null_oid(new_oid
) &&
1525 !is_null_oid(old_oid
) &&
1526 starts_with(name
, "refs/heads/")) {
1527 struct object
*old_object
, *new_object
;
1528 struct commit
*old_commit
, *new_commit
;
1531 old_object
= parse_object(the_repository
, old_oid
);
1532 new_object
= parse_object(the_repository
, new_oid
);
1534 if (!old_object
|| !new_object
||
1535 old_object
->type
!= OBJ_COMMIT
||
1536 new_object
->type
!= OBJ_COMMIT
) {
1537 error("bad sha1 objects for %s", name
);
1541 old_commit
= (struct commit
*)old_object
;
1542 new_commit
= (struct commit
*)new_object
;
1543 ret2
= repo_in_merge_bases(the_repository
, old_commit
, new_commit
);
1547 rp_error("denying non-fast-forward %s"
1548 " (you should pull first)", name
);
1549 ret
= "non-fast-forward";
1553 if (run_update_hook(cmd
)) {
1554 rp_error("hook declined to update %s", name
);
1555 ret
= "hook declined";
1559 if (do_update_worktree
) {
1560 ret
= update_worktree(new_oid
->hash
, worktree
);
1565 if (is_null_oid(new_oid
)) {
1566 struct strbuf err
= STRBUF_INIT
;
1567 if (!parse_object(the_repository
, old_oid
)) {
1569 if (refs_ref_exists(get_main_ref_store(the_repository
), name
)) {
1570 rp_warning("allowing deletion of corrupt ref");
1572 rp_warning("deleting a non-existent ref");
1573 cmd
->did_not_exist
= 1;
1576 if (ref_transaction_delete(transaction
,
1580 rp_error("%s", err
.buf
);
1581 ret
= "failed to delete";
1583 ret
= NULL
; /* good */
1585 strbuf_release(&err
);
1588 struct strbuf err
= STRBUF_INIT
;
1589 if (shallow_update
&& si
->shallow_ref
[cmd
->index
] &&
1590 update_shallow_ref(cmd
, si
)) {
1591 ret
= "shallow error";
1595 if (ref_transaction_update(transaction
,
1601 rp_error("%s", err
.buf
);
1602 ret
= "failed to update ref";
1604 ret
= NULL
; /* good */
1606 strbuf_release(&err
);
1610 free_worktrees(worktrees
);
1614 static void run_update_post_hook(struct command
*commands
)
1616 struct command
*cmd
;
1617 struct child_process proc
= CHILD_PROCESS_INIT
;
1620 hook
= find_hook("post-update");
1624 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1625 if (cmd
->error_string
|| cmd
->did_not_exist
)
1628 strvec_push(&proc
.args
, hook
);
1629 strvec_push(&proc
.args
, cmd
->ref_name
);
1635 proc
.stdout_to_stderr
= 1;
1636 proc
.err
= use_sideband
? -1 : 0;
1637 proc
.trace2_hook_name
= "post-update";
1639 if (!start_command(&proc
)) {
1641 copy_to_sideband(proc
.err
, -1, NULL
);
1642 finish_command(&proc
);
1646 static void check_aliased_update_internal(struct command
*cmd
,
1647 struct string_list
*list
,
1648 const char *dst_name
, int flag
)
1650 struct string_list_item
*item
;
1651 struct command
*dst_cmd
;
1653 if (!(flag
& REF_ISSYMREF
))
1657 rp_error("refusing update to broken symref '%s'", cmd
->ref_name
);
1658 cmd
->skip_update
= 1;
1659 cmd
->error_string
= "broken symref";
1662 dst_name
= strip_namespace(dst_name
);
1664 if (!(item
= string_list_lookup(list
, dst_name
)))
1667 cmd
->skip_update
= 1;
1669 dst_cmd
= (struct command
*) item
->util
;
1671 if (oideq(&cmd
->old_oid
, &dst_cmd
->old_oid
) &&
1672 oideq(&cmd
->new_oid
, &dst_cmd
->new_oid
))
1675 dst_cmd
->skip_update
= 1;
1677 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
1678 " its target '%s' (%s..%s)",
1680 repo_find_unique_abbrev(the_repository
, &cmd
->old_oid
, DEFAULT_ABBREV
),
1681 repo_find_unique_abbrev(the_repository
, &cmd
->new_oid
, DEFAULT_ABBREV
),
1683 repo_find_unique_abbrev(the_repository
, &dst_cmd
->old_oid
, DEFAULT_ABBREV
),
1684 repo_find_unique_abbrev(the_repository
, &dst_cmd
->new_oid
, DEFAULT_ABBREV
));
1686 cmd
->error_string
= dst_cmd
->error_string
=
1687 "inconsistent aliased update";
1690 static void check_aliased_update(struct command
*cmd
, struct string_list
*list
)
1692 struct strbuf buf
= STRBUF_INIT
;
1693 const char *dst_name
;
1696 strbuf_addf(&buf
, "%s%s", get_git_namespace(), cmd
->ref_name
);
1697 dst_name
= refs_resolve_ref_unsafe(get_main_ref_store(the_repository
),
1698 buf
.buf
, 0, NULL
, &flag
);
1699 check_aliased_update_internal(cmd
, list
, dst_name
, flag
);
1700 strbuf_release(&buf
);
1703 static void check_aliased_updates(struct command
*commands
)
1705 struct command
*cmd
;
1706 struct string_list ref_list
= STRING_LIST_INIT_NODUP
;
1708 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1709 struct string_list_item
*item
=
1710 string_list_append(&ref_list
, cmd
->ref_name
);
1711 item
->util
= (void *)cmd
;
1713 string_list_sort(&ref_list
);
1715 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1716 if (!cmd
->error_string
)
1717 check_aliased_update(cmd
, &ref_list
);
1720 string_list_clear(&ref_list
, 0);
1723 static const struct object_id
*command_singleton_iterator(void *cb_data
)
1725 struct command
**cmd_list
= cb_data
;
1726 struct command
*cmd
= *cmd_list
;
1728 if (!cmd
|| is_null_oid(&cmd
->new_oid
))
1730 *cmd_list
= NULL
; /* this returns only one */
1731 return &cmd
->new_oid
;
1734 static void set_connectivity_errors(struct command
*commands
,
1735 struct shallow_info
*si
)
1737 struct command
*cmd
;
1739 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1740 struct command
*singleton
= cmd
;
1741 struct check_connected_options opt
= CHECK_CONNECTED_INIT
;
1743 if (shallow_update
&& si
->shallow_ref
[cmd
->index
])
1744 /* to be checked in update_shallow_ref() */
1747 opt
.env
= tmp_objdir_env(tmp_objdir
);
1748 if (!check_connected(command_singleton_iterator
, &singleton
,
1752 cmd
->error_string
= "missing necessary objects";
1756 struct iterate_data
{
1757 struct command
*cmds
;
1758 struct shallow_info
*si
;
1761 static const struct object_id
*iterate_receive_command_list(void *cb_data
)
1763 struct iterate_data
*data
= cb_data
;
1764 struct command
**cmd_list
= &data
->cmds
;
1765 struct command
*cmd
= *cmd_list
;
1767 for (; cmd
; cmd
= cmd
->next
) {
1768 if (shallow_update
&& data
->si
->shallow_ref
[cmd
->index
])
1769 /* to be checked in update_shallow_ref() */
1771 if (!is_null_oid(&cmd
->new_oid
) && !cmd
->skip_update
) {
1772 *cmd_list
= cmd
->next
;
1773 return &cmd
->new_oid
;
1779 static void reject_updates_to_hidden(struct command
*commands
)
1781 struct strbuf refname_full
= STRBUF_INIT
;
1783 struct command
*cmd
;
1785 strbuf_addstr(&refname_full
, get_git_namespace());
1786 prefix_len
= refname_full
.len
;
1788 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1789 if (cmd
->error_string
)
1792 strbuf_setlen(&refname_full
, prefix_len
);
1793 strbuf_addstr(&refname_full
, cmd
->ref_name
);
1795 if (!ref_is_hidden(cmd
->ref_name
, refname_full
.buf
, &hidden_refs
))
1797 if (is_null_oid(&cmd
->new_oid
))
1798 cmd
->error_string
= "deny deleting a hidden ref";
1800 cmd
->error_string
= "deny updating a hidden ref";
1803 strbuf_release(&refname_full
);
1806 static int should_process_cmd(struct command
*cmd
)
1808 return !cmd
->error_string
&& !cmd
->skip_update
;
1811 static void BUG_if_skipped_connectivity_check(struct command
*commands
,
1812 struct shallow_info
*si
)
1814 struct command
*cmd
;
1816 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1817 if (should_process_cmd(cmd
) && si
->shallow_ref
[cmd
->index
])
1818 bug("connectivity check has not been run on ref %s",
1821 BUG_if_bug("connectivity check skipped???");
1824 static void execute_commands_non_atomic(struct command
*commands
,
1825 struct shallow_info
*si
)
1827 struct command
*cmd
;
1828 struct strbuf err
= STRBUF_INIT
;
1830 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1831 if (!should_process_cmd(cmd
) || cmd
->run_proc_receive
)
1834 transaction
= ref_store_transaction_begin(get_main_ref_store(the_repository
),
1837 rp_error("%s", err
.buf
);
1839 cmd
->error_string
= "transaction failed to start";
1843 cmd
->error_string
= update(cmd
, si
);
1845 if (!cmd
->error_string
1846 && ref_transaction_commit(transaction
, &err
)) {
1847 rp_error("%s", err
.buf
);
1849 cmd
->error_string
= "failed to update ref";
1851 ref_transaction_free(transaction
);
1853 strbuf_release(&err
);
1856 static void execute_commands_atomic(struct command
*commands
,
1857 struct shallow_info
*si
)
1859 struct command
*cmd
;
1860 struct strbuf err
= STRBUF_INIT
;
1861 const char *reported_error
= "atomic push failure";
1863 transaction
= ref_store_transaction_begin(get_main_ref_store(the_repository
),
1866 rp_error("%s", err
.buf
);
1868 reported_error
= "transaction failed to start";
1872 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1873 if (!should_process_cmd(cmd
) || cmd
->run_proc_receive
)
1876 cmd
->error_string
= update(cmd
, si
);
1878 if (cmd
->error_string
)
1882 if (ref_transaction_commit(transaction
, &err
)) {
1883 rp_error("%s", err
.buf
);
1884 reported_error
= "atomic transaction failed";
1890 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
1891 if (!cmd
->error_string
)
1892 cmd
->error_string
= reported_error
;
1895 ref_transaction_free(transaction
);
1896 strbuf_release(&err
);
1899 static void execute_commands(struct command
*commands
,
1900 const char *unpacker_error
,
1901 struct shallow_info
*si
,
1902 const struct string_list
*push_options
)
1904 struct check_connected_options opt
= CHECK_CONNECTED_INIT
;
1905 struct command
*cmd
;
1906 struct iterate_data data
;
1909 int run_proc_receive
= 0;
1911 if (unpacker_error
) {
1912 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
1913 cmd
->error_string
= "unpacker error";
1918 memset(&muxer
, 0, sizeof(muxer
));
1919 muxer
.proc
= copy_to_sideband
;
1921 if (!start_async(&muxer
))
1923 /* ...else, continue without relaying sideband */
1926 data
.cmds
= commands
;
1928 opt
.err_fd
= err_fd
;
1929 opt
.progress
= err_fd
&& !quiet
;
1930 opt
.env
= tmp_objdir_env(tmp_objdir
);
1931 opt
.exclude_hidden_refs_section
= "receive";
1933 if (check_connected(iterate_receive_command_list
, &data
, &opt
))
1934 set_connectivity_errors(commands
, si
);
1937 finish_async(&muxer
);
1939 reject_updates_to_hidden(commands
);
1942 * Try to find commands that have special prefix in their reference names,
1943 * and mark them to run an external "proc-receive" hook later.
1945 if (proc_receive_ref
) {
1946 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1947 if (!should_process_cmd(cmd
))
1950 if (proc_receive_ref_matches(cmd
)) {
1951 cmd
->run_proc_receive
= RUN_PROC_RECEIVE_SCHEDULED
;
1952 run_proc_receive
= 1;
1957 if (run_receive_hook(commands
, "pre-receive", 0, push_options
)) {
1958 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1959 if (!cmd
->error_string
)
1960 cmd
->error_string
= "pre-receive hook declined";
1966 * If there is no command ready to run, should return directly to destroy
1967 * temporary data in the quarantine area.
1969 for (cmd
= commands
; cmd
&& cmd
->error_string
; cmd
= cmd
->next
)
1975 * Now we'll start writing out refs, which means the objects need
1976 * to be in their final positions so that other processes can see them.
1978 if (tmp_objdir_migrate(tmp_objdir
) < 0) {
1979 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
1980 if (!cmd
->error_string
)
1981 cmd
->error_string
= "unable to migrate objects to permanent storage";
1987 check_aliased_updates(commands
);
1989 free(head_name_to_free
);
1990 head_name
= head_name_to_free
= refs_resolve_refdup(get_main_ref_store(the_repository
),
1994 if (run_proc_receive
&&
1995 run_proc_receive_hook(commands
, push_options
))
1996 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
1997 if (!cmd
->error_string
&&
1998 !(cmd
->run_proc_receive
& RUN_PROC_RECEIVE_RETURNED
) &&
1999 (cmd
->run_proc_receive
|| use_atomic
))
2000 cmd
->error_string
= "fail to run proc-receive hook";
2003 execute_commands_atomic(commands
, si
);
2005 execute_commands_non_atomic(commands
, si
);
2008 BUG_if_skipped_connectivity_check(commands
, si
);
2011 static struct command
**queue_command(struct command
**tail
,
2015 struct object_id old_oid
, new_oid
;
2016 struct command
*cmd
;
2017 const char *refname
;
2021 if (parse_oid_hex(line
, &old_oid
, &p
) ||
2023 parse_oid_hex(p
, &new_oid
, &p
) ||
2025 die("protocol error: expected old/new/ref, got '%s'", line
);
2028 reflen
= linelen
- (p
- line
);
2029 FLEX_ALLOC_MEM(cmd
, ref_name
, refname
, reflen
);
2030 oidcpy(&cmd
->old_oid
, &old_oid
);
2031 oidcpy(&cmd
->new_oid
, &new_oid
);
2036 static void free_commands(struct command
*commands
)
2039 struct command
*next
= commands
->next
;
2046 static void queue_commands_from_cert(struct command
**tail
,
2047 struct strbuf
*push_cert
)
2049 const char *boc
, *eoc
;
2052 die("protocol error: got both push certificate and unsigned commands");
2054 boc
= strstr(push_cert
->buf
, "\n\n");
2056 die("malformed push certificate %.*s", 100, push_cert
->buf
);
2059 eoc
= push_cert
->buf
+ parse_signed_buffer(push_cert
->buf
, push_cert
->len
);
2062 const char *eol
= memchr(boc
, '\n', eoc
- boc
);
2063 tail
= queue_command(tail
, boc
, eol
? eol
- boc
: eoc
- boc
);
2064 boc
= eol
? eol
+ 1 : eoc
;
2068 static struct command
*read_head_info(struct packet_reader
*reader
,
2069 struct oid_array
*shallow
)
2071 struct command
*commands
= NULL
;
2072 struct command
**p
= &commands
;
2076 if (packet_reader_read(reader
) != PACKET_READ_NORMAL
)
2079 if (reader
->pktlen
> 8 && starts_with(reader
->line
, "shallow ")) {
2080 struct object_id oid
;
2081 if (get_oid_hex(reader
->line
+ 8, &oid
))
2082 die("protocol error: expected shallow sha, got '%s'",
2084 oid_array_append(shallow
, &oid
);
2088 linelen
= strlen(reader
->line
);
2089 if (linelen
< reader
->pktlen
) {
2090 const char *feature_list
= reader
->line
+ linelen
+ 1;
2091 const char *hash
= NULL
;
2092 const char *client_sid
;
2094 if (parse_feature_request(feature_list
, "report-status"))
2096 if (parse_feature_request(feature_list
, "report-status-v2"))
2097 report_status_v2
= 1;
2098 if (parse_feature_request(feature_list
, "side-band-64k"))
2099 use_sideband
= LARGE_PACKET_MAX
;
2100 if (parse_feature_request(feature_list
, "quiet"))
2102 if (advertise_atomic_push
2103 && parse_feature_request(feature_list
, "atomic"))
2105 if (advertise_push_options
2106 && parse_feature_request(feature_list
, "push-options"))
2107 use_push_options
= 1;
2108 hash
= parse_feature_value(feature_list
, "object-format", &len
, NULL
);
2110 hash
= hash_algos
[GIT_HASH_SHA1
].name
;
2113 if (xstrncmpz(the_hash_algo
->name
, hash
, len
))
2114 die("error: unsupported object format '%s'", hash
);
2115 client_sid
= parse_feature_value(feature_list
, "session-id", &len
, NULL
);
2117 char *sid
= xstrndup(client_sid
, len
);
2118 trace2_data_string("transfer", NULL
, "client-sid", client_sid
);
2123 if (!strcmp(reader
->line
, "push-cert")) {
2125 int saved_options
= reader
->options
;
2126 reader
->options
&= ~PACKET_READ_CHOMP_NEWLINE
;
2129 packet_reader_read(reader
);
2130 if (reader
->status
== PACKET_READ_FLUSH
) {
2134 if (reader
->status
!= PACKET_READ_NORMAL
) {
2135 die("protocol error: got an unexpected packet");
2137 if (!strcmp(reader
->line
, "push-cert-end\n"))
2138 break; /* end of cert */
2139 strbuf_addstr(&push_cert
, reader
->line
);
2141 reader
->options
= saved_options
;
2148 p
= queue_command(p
, reader
->line
, linelen
);
2152 queue_commands_from_cert(p
, &push_cert
);
2157 static void read_push_options(struct packet_reader
*reader
,
2158 struct string_list
*options
)
2161 if (packet_reader_read(reader
) != PACKET_READ_NORMAL
)
2164 string_list_append(options
, reader
->line
);
2168 static const char *parse_pack_header(struct pack_header
*hdr
)
2170 switch (read_pack_header(0, hdr
)) {
2172 return "eof before pack header was fully read";
2174 case PH_ERROR_PACK_SIGNATURE
:
2175 return "protocol error (pack signature mismatch detected)";
2177 case PH_ERROR_PROTOCOL
:
2178 return "protocol error (pack version unsupported)";
2181 return "unknown error in parse_pack_header";
2188 static struct tempfile
*pack_lockfile
;
2190 static void push_header_arg(struct strvec
*args
, struct pack_header
*hdr
)
2192 strvec_pushf(args
, "--pack_header=%"PRIu32
",%"PRIu32
,
2193 ntohl(hdr
->hdr_version
), ntohl(hdr
->hdr_entries
));
2196 static const char *unpack(int err_fd
, struct shallow_info
*si
)
2198 struct pack_header hdr
;
2199 const char *hdr_err
;
2201 struct child_process child
= CHILD_PROCESS_INIT
;
2202 int fsck_objects
= (receive_fsck_objects
>= 0
2203 ? receive_fsck_objects
2204 : transfer_fsck_objects
>= 0
2205 ? transfer_fsck_objects
2208 hdr_err
= parse_pack_header(&hdr
);
2215 if (si
->nr_ours
|| si
->nr_theirs
) {
2216 alt_shallow_file
= setup_temporary_shallow(si
->shallow
);
2217 strvec_push(&child
.args
, "--shallow-file");
2218 strvec_push(&child
.args
, alt_shallow_file
);
2221 tmp_objdir
= tmp_objdir_create("incoming");
2225 return "unable to create temporary object directory";
2227 strvec_pushv(&child
.env
, tmp_objdir_env(tmp_objdir
));
2230 * Normally we just pass the tmp_objdir environment to the child
2231 * processes that do the heavy lifting, but we may need to see these
2232 * objects ourselves to set up shallow information.
2234 tmp_objdir_add_as_alternate(tmp_objdir
);
2236 if (ntohl(hdr
.hdr_entries
) < unpack_limit
) {
2237 strvec_push(&child
.args
, "unpack-objects");
2238 push_header_arg(&child
.args
, &hdr
);
2240 strvec_push(&child
.args
, "-q");
2242 strvec_pushf(&child
.args
, "--strict%s",
2243 fsck_msg_types
.buf
);
2245 strvec_pushf(&child
.args
, "--max-input-size=%"PRIuMAX
,
2246 (uintmax_t)max_input_size
);
2247 child
.no_stdout
= 1;
2250 status
= run_command(&child
);
2252 return "unpack-objects abnormal exit";
2254 char hostname
[HOST_NAME_MAX
+ 1];
2257 strvec_pushl(&child
.args
, "index-pack", "--stdin", NULL
);
2258 push_header_arg(&child
.args
, &hdr
);
2260 if (xgethostname(hostname
, sizeof(hostname
)))
2261 xsnprintf(hostname
, sizeof(hostname
), "localhost");
2262 strvec_pushf(&child
.args
,
2263 "--keep=receive-pack %"PRIuMAX
" on %s",
2264 (uintmax_t)getpid(),
2267 if (!quiet
&& err_fd
)
2268 strvec_push(&child
.args
, "--show-resolving-progress");
2270 strvec_push(&child
.args
, "--report-end-of-input");
2272 strvec_pushf(&child
.args
, "--strict%s",
2273 fsck_msg_types
.buf
);
2275 strvec_push(&child
.args
, "--fix-thin");
2277 strvec_pushf(&child
.args
, "--max-input-size=%"PRIuMAX
,
2278 (uintmax_t)max_input_size
);
2282 status
= start_command(&child
);
2284 return "index-pack fork failed";
2286 lockfile
= index_pack_lockfile(child
.out
, NULL
);
2288 pack_lockfile
= register_tempfile(lockfile
);
2293 status
= finish_command(&child
);
2295 return "index-pack abnormal exit";
2296 reprepare_packed_git(the_repository
);
2301 static const char *unpack_with_sideband(struct shallow_info
*si
)
2307 return unpack(0, si
);
2309 use_keepalive
= KEEPALIVE_AFTER_NUL
;
2310 memset(&muxer
, 0, sizeof(muxer
));
2311 muxer
.proc
= copy_to_sideband
;
2313 if (start_async(&muxer
))
2316 ret
= unpack(muxer
.in
, si
);
2318 finish_async(&muxer
);
2322 static void prepare_shallow_update(struct shallow_info
*si
)
2324 int i
, j
, k
, bitmap_size
= DIV_ROUND_UP(si
->ref
->nr
, 32);
2326 ALLOC_ARRAY(si
->used_shallow
, si
->shallow
->nr
);
2327 assign_shallow_commits_to_refs(si
, si
->used_shallow
, NULL
);
2329 CALLOC_ARRAY(si
->need_reachability_test
, si
->shallow
->nr
);
2330 CALLOC_ARRAY(si
->reachable
, si
->shallow
->nr
);
2331 CALLOC_ARRAY(si
->shallow_ref
, si
->ref
->nr
);
2333 for (i
= 0; i
< si
->nr_ours
; i
++)
2334 si
->need_reachability_test
[si
->ours
[i
]] = 1;
2336 for (i
= 0; i
< si
->shallow
->nr
; i
++) {
2337 if (!si
->used_shallow
[i
])
2339 for (j
= 0; j
< bitmap_size
; j
++) {
2340 if (!si
->used_shallow
[i
][j
])
2342 si
->need_reachability_test
[i
]++;
2343 for (k
= 0; k
< 32; k
++)
2344 if (si
->used_shallow
[i
][j
] & (1U << k
))
2345 si
->shallow_ref
[j
* 32 + k
]++;
2349 * true for those associated with some refs and belong
2350 * in "ours" list aka "step 7 not done yet"
2352 si
->need_reachability_test
[i
] =
2353 si
->need_reachability_test
[i
] > 1;
2357 * keep hooks happy by forcing a temporary shallow file via
2358 * env variable because we can't add --shallow-file to every
2359 * command. check_connected() will be done with
2360 * true .git/shallow though.
2362 setenv(GIT_SHALLOW_FILE_ENVIRONMENT
, alt_shallow_file
, 1);
2365 static void update_shallow_info(struct command
*commands
,
2366 struct shallow_info
*si
,
2367 struct oid_array
*ref
)
2369 struct command
*cmd
;
2371 remove_nonexistent_theirs_shallow(si
);
2372 if (!si
->nr_ours
&& !si
->nr_theirs
) {
2377 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
2378 if (is_null_oid(&cmd
->new_oid
))
2380 oid_array_append(ref
, &cmd
->new_oid
);
2381 cmd
->index
= ref
->nr
- 1;
2385 if (shallow_update
) {
2386 prepare_shallow_update(si
);
2390 ALLOC_ARRAY(ref_status
, ref
->nr
);
2391 assign_shallow_commits_to_refs(si
, NULL
, ref_status
);
2392 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
2393 if (is_null_oid(&cmd
->new_oid
))
2395 if (ref_status
[cmd
->index
]) {
2396 cmd
->error_string
= "shallow update not allowed";
2397 cmd
->skip_update
= 1;
2403 static void report(struct command
*commands
, const char *unpack_status
)
2405 struct command
*cmd
;
2406 struct strbuf buf
= STRBUF_INIT
;
2408 packet_buf_write(&buf
, "unpack %s\n",
2409 unpack_status
? unpack_status
: "ok");
2410 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
2411 if (!cmd
->error_string
)
2412 packet_buf_write(&buf
, "ok %s\n",
2415 packet_buf_write(&buf
, "ng %s %s\n",
2416 cmd
->ref_name
, cmd
->error_string
);
2418 packet_buf_flush(&buf
);
2421 send_sideband(1, 1, buf
.buf
, buf
.len
, use_sideband
);
2423 write_or_die(1, buf
.buf
, buf
.len
);
2424 strbuf_release(&buf
);
2427 static void report_v2(struct command
*commands
, const char *unpack_status
)
2429 struct command
*cmd
;
2430 struct strbuf buf
= STRBUF_INIT
;
2431 struct ref_push_report
*report
;
2433 packet_buf_write(&buf
, "unpack %s\n",
2434 unpack_status
? unpack_status
: "ok");
2435 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
2438 if (cmd
->error_string
) {
2439 packet_buf_write(&buf
, "ng %s %s\n",
2444 packet_buf_write(&buf
, "ok %s\n",
2446 for (report
= cmd
->report
; report
; report
= report
->next
) {
2448 packet_buf_write(&buf
, "ok %s\n",
2450 if (report
->ref_name
)
2451 packet_buf_write(&buf
, "option refname %s\n",
2453 if (report
->old_oid
)
2454 packet_buf_write(&buf
, "option old-oid %s\n",
2455 oid_to_hex(report
->old_oid
));
2456 if (report
->new_oid
)
2457 packet_buf_write(&buf
, "option new-oid %s\n",
2458 oid_to_hex(report
->new_oid
));
2459 if (report
->forced_update
)
2460 packet_buf_write(&buf
, "option forced-update\n");
2463 packet_buf_flush(&buf
);
2466 send_sideband(1, 1, buf
.buf
, buf
.len
, use_sideband
);
2468 write_or_die(1, buf
.buf
, buf
.len
);
2469 strbuf_release(&buf
);
2472 static int delete_only(struct command
*commands
)
2474 struct command
*cmd
;
2475 for (cmd
= commands
; cmd
; cmd
= cmd
->next
) {
2476 if (!is_null_oid(&cmd
->new_oid
))
2482 int cmd_receive_pack(int argc
, const char **argv
, const char *prefix
)
2484 int advertise_refs
= 0;
2485 struct command
*commands
;
2486 struct oid_array shallow
= OID_ARRAY_INIT
;
2487 struct oid_array ref
= OID_ARRAY_INIT
;
2488 struct shallow_info si
;
2489 struct packet_reader reader
;
2491 struct option options
[] = {
2492 OPT__QUIET(&quiet
, N_("quiet")),
2493 OPT_HIDDEN_BOOL(0, "stateless-rpc", &stateless_rpc
, NULL
),
2494 OPT_HIDDEN_BOOL(0, "http-backend-info-refs", &advertise_refs
, NULL
),
2495 OPT_ALIAS(0, "advertise-refs", "http-backend-info-refs"),
2496 OPT_HIDDEN_BOOL(0, "reject-thin-pack-for-testing", &reject_thin
, NULL
),
2500 packet_trace_identity("receive-pack");
2502 argc
= parse_options(argc
, argv
, prefix
, options
, receive_pack_usage
, 0);
2505 usage_msg_opt(_("too many arguments"), receive_pack_usage
, options
);
2507 usage_msg_opt(_("you must specify a directory"), receive_pack_usage
, options
);
2509 service_dir
= argv
[0];
2513 if (!enter_repo(service_dir
, 0))
2514 die("'%s' does not appear to be a git repository", service_dir
);
2516 git_config(receive_pack_config
, NULL
);
2517 if (cert_nonce_seed
)
2518 push_cert_nonce
= prepare_push_cert_nonce(service_dir
, time(NULL
));
2520 if (0 <= receive_unpack_limit
)
2521 unpack_limit
= receive_unpack_limit
;
2522 else if (0 <= transfer_unpack_limit
)
2523 unpack_limit
= transfer_unpack_limit
;
2525 switch (determine_protocol_version_server()) {
2528 * push support for protocol v2 has not been implemented yet,
2529 * so ignore the request to use v2 and fallback to using v0.
2534 * v1 is just the original protocol with a version string,
2535 * so just fall through after writing the version string.
2537 if (advertise_refs
|| !stateless_rpc
)
2538 packet_write_fmt(1, "version 1\n");
2543 case protocol_unknown_version
:
2544 BUG("unknown protocol version");
2547 if (advertise_refs
|| !stateless_rpc
) {
2553 packet_reader_init(&reader
, 0, NULL
, 0,
2554 PACKET_READ_CHOMP_NEWLINE
|
2555 PACKET_READ_DIE_ON_ERR_PACKET
);
2557 if ((commands
= read_head_info(&reader
, &shallow
))) {
2558 const char *unpack_status
= NULL
;
2559 struct string_list push_options
= STRING_LIST_INIT_DUP
;
2561 if (use_push_options
)
2562 read_push_options(&reader
, &push_options
);
2563 if (!check_cert_push_options(&push_options
)) {
2564 struct command
*cmd
;
2565 for (cmd
= commands
; cmd
; cmd
= cmd
->next
)
2566 cmd
->error_string
= "inconsistent push options";
2569 prepare_shallow_info(&si
, &shallow
);
2570 if (!si
.nr_ours
&& !si
.nr_theirs
)
2572 if (!delete_only(commands
)) {
2573 unpack_status
= unpack_with_sideband(&si
);
2574 update_shallow_info(commands
, &si
, &ref
);
2576 use_keepalive
= KEEPALIVE_ALWAYS
;
2577 execute_commands(commands
, unpack_status
, &si
,
2579 delete_tempfile(&pack_lockfile
);
2580 sigchain_push(SIGPIPE
, SIG_IGN
);
2581 if (report_status_v2
)
2582 report_v2(commands
, unpack_status
);
2583 else if (report_status
)
2584 report(commands
, unpack_status
);
2585 sigchain_pop(SIGPIPE
);
2586 run_receive_hook(commands
, "post-receive", 1,
2588 run_update_post_hook(commands
);
2589 free_commands(commands
);
2590 string_list_clear(&push_options
, 0);
2592 struct child_process proc
= CHILD_PROCESS_INIT
;
2594 if (prepare_auto_maintenance(1, &proc
)) {
2596 proc
.stdout_to_stderr
= 1;
2597 proc
.err
= use_sideband
? -1 : 0;
2599 if (!start_command(&proc
)) {
2601 copy_to_sideband(proc
.err
, -1, NULL
);
2602 finish_command(&proc
);
2606 if (auto_update_server_info
)
2607 update_server_info(0);
2608 clear_shallow_info(&si
);
2612 oid_array_clear(&shallow
);
2613 oid_array_clear(&ref
);
2614 strvec_clear(&hidden_refs
);
2615 free((void *)push_cert_nonce
);