]> git.ipfire.org Git - thirdparty/git.git/blame - builtin/receive-pack.c
Merge branch 'es/add-doc-list-short-form-of-all-in-synopsis'
[thirdparty/git.git] / builtin / receive-pack.c
CommitLineData
1e4cd68c 1#include "builtin.h"
0b027f6c 2#include "abspath.h"
a49d2834 3#include "repository.h"
b2141fc1 4#include "config.h"
32a8f510 5#include "environment.h"
f394e093 6#include "gettext.h"
41771fa4 7#include "hex.h"
697cc8ef 8#include "lockfile.h"
fc04c412 9#include "pack.h"
8a65ff76 10#include "refs.h"
f3a3214e 11#include "pkt-line.h"
38a81b4e 12#include "sideband.h"
b1bf95bb 13#include "run-command.h"
5e3aba33 14#include "hook.h"
d807c4a0 15#include "exec-cmd.h"
11031d7e
JS
16#include "commit.h"
17#include "object.h"
d79796bc 18#include "remote.h"
47a59185 19#include "connect.h"
da3efdb1 20#include "string-list.h"
fe299ec5 21#include "oid-array.h"
52fed6e1 22#include "connected.h"
dbbcd44f 23#include "strvec.h"
ff5effdf 24#include "version.h"
d05b9618
JH
25#include "tag.h"
26#include "gpg-interface.h"
ec7dbd14 27#include "sigchain.h"
5d477a33 28#include "fsck.h"
722ff7f8 29#include "tmp-objdir.h"
ab6eea6f 30#include "oidset.h"
3836d88a 31#include "packfile.h"
dabab1d6 32#include "object-name.h"
a034e910 33#include "object-store-ll.h"
c339932b 34#include "path.h"
aa9bab29 35#include "protocol.h"
64043556 36#include "commit-reach.h"
623b80be 37#include "server-info.h"
74ea5c95
EN
38#include "trace.h"
39#include "trace2.h"
4ef34648 40#include "worktree.h"
120ad2b0 41#include "shallow.h"
49fd5511 42#include "parse-options.h"
575f4974 43
1b68387e
SS
44static const char * const receive_pack_usage[] = {
45 N_("git receive-pack <git-dir>"),
46 NULL
47};
575f4974 48
986e8239 49enum deny_action {
3d95d92b 50 DENY_UNCONFIGURED,
986e8239
JK
51 DENY_IGNORE,
52 DENY_WARN,
1404bcbb
JS
53 DENY_REFUSE,
54 DENY_UPDATE_INSTEAD
986e8239
JK
55};
56
1b53a076
JH
57static int deny_deletes;
58static int deny_non_fast_forwards;
3d95d92b 59static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
747ca245 60static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
dab76d3a
JH
61static int receive_fsck_objects = -1;
62static int transfer_fsck_objects = -1;
5d477a33 63static struct strbuf fsck_msg_types = STRBUF_INIT;
e28714c5
JH
64static int receive_unpack_limit = -1;
65static int transfer_unpack_limit = -1;
1b70fe5d 66static int advertise_atomic_push = 1;
c714e45f 67static int advertise_push_options;
8073d75b 68static int advertise_sid;
46732fae 69static int unpack_limit = 100;
c08db5a2 70static off_t max_input_size;
96f1e58f 71static int report_status;
63518a57 72static int report_status_v2;
38a81b4e 73static int use_sideband;
68deed29 74static int use_atomic;
c714e45f 75static int use_push_options;
c207e34f 76static int quiet;
b74fce16 77static int prefer_ofs_delta = 1;
77e3efbf
JH
78static int auto_update_server_info;
79static int auto_gc = 1;
1b68387e 80static int reject_thin;
5732373d
JH
81static int stateless_rpc;
82static const char *service_dir;
747ca245 83static const char *head_name;
96ec7b1e 84static void *head_name_to_free;
185c04e0 85static int sent_capabilities;
0a1bc12b 86static int shallow_update;
5dbd7676 87static const char *alt_shallow_file;
a85b377d 88static struct strbuf push_cert = STRBUF_INIT;
a09c985e 89static struct object_id push_cert_oid;
d05b9618 90static struct signature_check sigcheck;
b89363e4
JH
91static const char *push_cert_nonce;
92static const char *cert_nonce_seed;
c45841ff 93static struct strvec hidden_refs = STRVEC_INIT;
b89363e4
JH
94
95static const char *NONCE_UNSOLICITED = "UNSOLICITED";
96static const char *NONCE_BAD = "BAD";
97static const char *NONCE_MISSING = "MISSING";
98static const char *NONCE_OK = "OK";
5732373d 99static const char *NONCE_SLOP = "SLOP";
b89363e4 100static const char *nonce_status;
5732373d 101static long nonce_stamp_slop;
dddbad72 102static timestamp_t nonce_stamp_slop_limit;
222368c6 103static struct ref_transaction *transaction;
cfee10a7 104
83558686
JK
105static enum {
106 KEEPALIVE_NEVER = 0,
107 KEEPALIVE_AFTER_NUL,
108 KEEPALIVE_ALWAYS
109} use_keepalive;
110static int keepalive_in_sec = 5;
111
722ff7f8
JK
112static struct tmp_objdir *tmp_objdir;
113
31e8595a
JX
114static struct proc_receive_ref {
115 unsigned int want_add:1,
116 want_delete:1,
117 want_modify:1,
118 negative_ref:1;
119 char *ref_prefix;
120 struct proc_receive_ref *next;
121} *proc_receive_ref;
122
123static void proc_receive_ref_append(const char *prefix);
124
986e8239
JK
125static enum deny_action parse_deny_action(const char *var, const char *value)
126{
127 if (value) {
128 if (!strcasecmp(value, "ignore"))
129 return DENY_IGNORE;
130 if (!strcasecmp(value, "warn"))
131 return DENY_WARN;
132 if (!strcasecmp(value, "refuse"))
133 return DENY_REFUSE;
1404bcbb
JS
134 if (!strcasecmp(value, "updateinstead"))
135 return DENY_UPDATE_INSTEAD;
986e8239
JK
136 }
137 if (git_config_bool(var, value))
138 return DENY_REFUSE;
139 return DENY_IGNORE;
140}
141
a4e7e317
GC
142static int receive_pack_config(const char *var, const char *value,
143 const struct config_context *ctx, void *cb)
6fb75bed 144{
d49cb162 145 const char *msg_id;
9b67eb6f 146 int status = parse_hide_refs_config(var, value, "receive", &hidden_refs);
daebaa78
JH
147
148 if (status)
149 return status;
150
a240de11
JK
151 if (strcmp(var, "receive.denydeletes") == 0) {
152 deny_deletes = git_config_bool(var, value);
153 return 0;
154 }
155
e28714c5 156 if (strcmp(var, "receive.denynonfastforwards") == 0) {
6fb75bed
SP
157 deny_non_fast_forwards = git_config_bool(var, value);
158 return 0;
159 }
160
e28714c5 161 if (strcmp(var, "receive.unpacklimit") == 0) {
8868b1eb 162 receive_unpack_limit = git_config_int(var, value, ctx->kvi);
fc04c412
SP
163 return 0;
164 }
165
e28714c5 166 if (strcmp(var, "transfer.unpacklimit") == 0) {
8868b1eb 167 transfer_unpack_limit = git_config_int(var, value, ctx->kvi);
e28714c5
JH
168 return 0;
169 }
170
cd94c6f9
JS
171 if (strcmp(var, "receive.fsck.skiplist") == 0) {
172 const char *path;
173
174 if (git_config_pathname(&path, var, value))
175 return 1;
176 strbuf_addf(&fsck_msg_types, "%cskiplist=%s",
177 fsck_msg_types.len ? ',' : '=', path);
178 free((char *)path);
179 return 0;
180 }
181
d49cb162
JK
182 if (skip_prefix(var, "receive.fsck.", &msg_id)) {
183 if (!value)
184 return config_error_nonbool(var);
185 if (is_valid_msg_type(msg_id, value))
5d477a33 186 strbuf_addf(&fsck_msg_types, "%c%s=%s",
d49cb162 187 fsck_msg_types.len ? ',' : '=', msg_id, value);
5d477a33 188 else
d49cb162 189 warning("skipping unknown msg id '%s'", msg_id);
5d477a33
JS
190 return 0;
191 }
192
20dc0016
MK
193 if (strcmp(var, "receive.fsckobjects") == 0) {
194 receive_fsck_objects = git_config_bool(var, value);
195 return 0;
196 }
197
dab76d3a
JH
198 if (strcmp(var, "transfer.fsckobjects") == 0) {
199 transfer_fsck_objects = git_config_bool(var, value);
200 return 0;
201 }
202
986e8239
JK
203 if (!strcmp(var, "receive.denycurrentbranch")) {
204 deny_current_branch = parse_deny_action(var, value);
205 return 0;
206 }
207
747ca245
JH
208 if (strcmp(var, "receive.denydeletecurrent") == 0) {
209 deny_delete_current = parse_deny_action(var, value);
210 return 0;
211 }
212
b74fce16
NP
213 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
214 prefer_ofs_delta = git_config_bool(var, value);
215 return 0;
216 }
217
77e3efbf
JH
218 if (strcmp(var, "receive.updateserverinfo") == 0) {
219 auto_update_server_info = git_config_bool(var, value);
220 return 0;
221 }
222
223 if (strcmp(var, "receive.autogc") == 0) {
224 auto_gc = git_config_bool(var, value);
225 return 0;
226 }
227
0a1bc12b
NTND
228 if (strcmp(var, "receive.shallowupdate") == 0) {
229 shallow_update = git_config_bool(var, value);
230 return 0;
231 }
232
b89363e4
JH
233 if (strcmp(var, "receive.certnonceseed") == 0)
234 return git_config_string(&cert_nonce_seed, var, value);
a85b377d 235
5732373d 236 if (strcmp(var, "receive.certnonceslop") == 0) {
8868b1eb 237 nonce_stamp_slop_limit = git_config_ulong(var, value, ctx->kvi);
5732373d
JH
238 return 0;
239 }
240
1b70fe5d
RS
241 if (strcmp(var, "receive.advertiseatomic") == 0) {
242 advertise_atomic_push = git_config_bool(var, value);
243 return 0;
244 }
245
c714e45f
SB
246 if (strcmp(var, "receive.advertisepushoptions") == 0) {
247 advertise_push_options = git_config_bool(var, value);
248 return 0;
249 }
250
83558686 251 if (strcmp(var, "receive.keepalive") == 0) {
8868b1eb 252 keepalive_in_sec = git_config_int(var, value, ctx->kvi);
83558686
JK
253 return 0;
254 }
255
c08db5a2 256 if (strcmp(var, "receive.maxinputsize") == 0) {
8868b1eb 257 max_input_size = git_config_int64(var, value, ctx->kvi);
c08db5a2
JK
258 return 0;
259 }
260
31e8595a
JX
261 if (strcmp(var, "receive.procreceiverefs") == 0) {
262 if (!value)
263 return config_error_nonbool(var);
264 proc_receive_ref_append(value);
265 return 0;
266 }
267
8073d75b
JS
268 if (strcmp(var, "transfer.advertisesid") == 0) {
269 advertise_sid = git_config_bool(var, value);
270 return 0;
271 }
272
a4e7e317 273 return git_default_config(var, value, ctx, cb);
6fb75bed
SP
274}
275
1b7ba794 276static void show_ref(const char *path, const struct object_id *oid)
575f4974 277{
52d2ae58 278 if (sent_capabilities) {
1b7ba794 279 packet_write_fmt(1, "%s %s\n", oid_to_hex(oid), path);
52d2ae58
JH
280 } else {
281 struct strbuf cap = STRBUF_INIT;
282
283 strbuf_addstr(&cap,
63518a57 284 "report-status report-status-v2 delete-refs side-band-64k quiet");
1b70fe5d
RS
285 if (advertise_atomic_push)
286 strbuf_addstr(&cap, " atomic");
52d2ae58
JH
287 if (prefer_ofs_delta)
288 strbuf_addstr(&cap, " ofs-delta");
b89363e4
JH
289 if (push_cert_nonce)
290 strbuf_addf(&cap, " push-cert=%s", push_cert_nonce);
c714e45f
SB
291 if (advertise_push_options)
292 strbuf_addstr(&cap, " push-options");
8073d75b
JS
293 if (advertise_sid)
294 strbuf_addf(&cap, " session-id=%s", trace2_session_id());
bf30dbf8 295 strbuf_addf(&cap, " object-format=%s", the_hash_algo->name);
52d2ae58 296 strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
81c634e9 297 packet_write_fmt(1, "%s %s%c%s\n",
1b7ba794 298 oid_to_hex(oid), path, 0, cap.buf);
52d2ae58
JH
299 strbuf_release(&cap);
300 sent_capabilities = 1;
301 }
575f4974
LT
302}
303
78a766ab 304static int show_ref_cb(const char *path_full, const struct object_id *oid,
5cf88fd8 305 int flag UNUSED, void *data)
6b01ecfe 306{
8b24b9e7 307 struct oidset *seen = data;
78a766ab
LF
308 const char *path = strip_namespace(path_full);
309
9b67eb6f 310 if (ref_is_hidden(path, path_full, &hidden_refs))
78a766ab
LF
311 return 0;
312
6b01ecfe
JT
313 /*
314 * Advertise refs outside our current namespace as ".have"
315 * refs, so that the client can use them to minimize data
fea6c47f 316 * transfer but will otherwise ignore them.
6b01ecfe 317 */
8b24b9e7
JK
318 if (!path) {
319 if (oidset_insert(seen, oid))
320 return 0;
6b01ecfe 321 path = ".have";
63d428e6
JK
322 } else {
323 oidset_insert(seen, oid);
8b24b9e7 324 }
1b7ba794 325 show_ref(path, oid);
bc98201d 326 return 0;
6b01ecfe
JT
327}
328
bdf4276c 329static void show_one_alternate_ref(const struct object_id *oid,
ab6eea6f 330 void *data)
b7a025d9 331{
ab6eea6f 332 struct oidset *seen = data;
b7a025d9 333
ab6eea6f
JK
334 if (oidset_insert(seen, oid))
335 return;
336
1b7ba794 337 show_ref(".have", oid);
6b01ecfe
JT
338}
339
8a65ff76 340static void write_head_info(void)
575f4974 341{
ab6eea6f 342 static struct oidset seen = OIDSET_INIT;
2b2a5be3 343
cc2a1f98
TB
344 refs_for_each_fullref_in(get_main_ref_store(the_repository), "",
345 hidden_refs_to_excludes(&hidden_refs),
346 show_ref_cb, &seen);
ab6eea6f
JK
347 for_each_alternate_ref(show_one_alternate_ref, &seen);
348 oidset_clear(&seen);
185c04e0 349 if (!sent_capabilities)
14228447 350 show_ref("capabilities^{}", null_oid());
cfee10a7 351
ad491366
NTND
352 advertise_shallow_grafts(1);
353
b7a025d9
MH
354 /* EOF */
355 packet_flush(1);
575f4974
LT
356}
357
15d3af5e
JX
358#define RUN_PROC_RECEIVE_SCHEDULED 1
359#define RUN_PROC_RECEIVE_RETURNED 2
eb1af2df
LT
360struct command {
361 struct command *next;
cfee10a7 362 const char *error_string;
15d3af5e 363 struct ref_push_report *report;
160b81ed 364 unsigned int skip_update:1,
15d3af5e
JX
365 did_not_exist:1,
366 run_proc_receive:2;
5dbd7676 367 int index;
9c44ea44 368 struct object_id old_oid;
369 struct object_id new_oid;
8f1d2e6f 370 char ref_name[FLEX_ARRAY]; /* more */
575f4974
LT
371};
372
31e8595a
JX
373static void proc_receive_ref_append(const char *prefix)
374{
375 struct proc_receive_ref *ref_pattern;
376 char *p;
377 int len;
378
ca56dadb 379 CALLOC_ARRAY(ref_pattern, 1);
31e8595a
JX
380 p = strchr(prefix, ':');
381 if (p) {
382 while (prefix < p) {
383 if (*prefix == 'a')
384 ref_pattern->want_add = 1;
385 else if (*prefix == 'd')
386 ref_pattern->want_delete = 1;
387 else if (*prefix == 'm')
388 ref_pattern->want_modify = 1;
389 else if (*prefix == '!')
390 ref_pattern->negative_ref = 1;
391 prefix++;
392 }
393 prefix++;
394 } else {
395 ref_pattern->want_add = 1;
396 ref_pattern->want_delete = 1;
397 ref_pattern->want_modify = 1;
398 }
399 len = strlen(prefix);
400 while (len && prefix[len - 1] == '/')
401 len--;
402 ref_pattern->ref_prefix = xmemdupz(prefix, len);
403 if (!proc_receive_ref) {
404 proc_receive_ref = ref_pattern;
405 } else {
406 struct proc_receive_ref *end;
407
408 end = proc_receive_ref;
409 while (end->next)
410 end = end->next;
411 end->next = ref_pattern;
412 }
413}
414
415static int proc_receive_ref_matches(struct command *cmd)
416{
417 struct proc_receive_ref *p;
418
419 if (!proc_receive_ref)
420 return 0;
421
422 for (p = proc_receive_ref; p; p = p->next) {
423 const char *match = p->ref_prefix;
424 const char *remains;
425
426 if (!p->want_add && is_null_oid(&cmd->old_oid))
427 continue;
428 else if (!p->want_delete && is_null_oid(&cmd->new_oid))
429 continue;
430 else if (!p->want_modify &&
431 !is_null_oid(&cmd->old_oid) &&
432 !is_null_oid(&cmd->new_oid))
433 continue;
434
435 if (skip_prefix(cmd->ref_name, match, &remains) &&
436 (!*remains || *remains == '/')) {
437 if (!p->negative_ref)
438 return 1;
439 } else if (p->negative_ref) {
440 return 1;
441 }
442 }
443 return 0;
444}
445
466dbc42
SP
446static void report_message(const char *prefix, const char *err, va_list params)
447{
b7115a35 448 int sz;
466dbc42
SP
449 char msg[4096];
450
b7115a35 451 sz = xsnprintf(msg, sizeof(msg), "%s", prefix);
466dbc42
SP
452 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
453 if (sz > (sizeof(msg) - 1))
454 sz = sizeof(msg) - 1;
455 msg[sz++] = '\n';
456
457 if (use_sideband)
458 send_sideband(1, 2, msg, sz, use_sideband);
459 else
460 xwrite(2, msg, sz);
461}
462
103e02c7 463__attribute__((format (printf, 1, 2)))
466dbc42
SP
464static void rp_warning(const char *err, ...)
465{
466 va_list params;
467 va_start(params, err);
468 report_message("warning: ", err, params);
469 va_end(params);
470}
471
103e02c7 472__attribute__((format (printf, 1, 2)))
466dbc42
SP
473static void rp_error(const char *err, ...)
474{
475 va_list params;
476 va_start(params, err);
477 report_message("error: ", err, params);
478 va_end(params);
479}
480
5cf88fd8 481static int copy_to_sideband(int in, int out UNUSED, void *arg UNUSED)
6d525d38
SP
482{
483 char data[128];
83558686
JK
484 int keepalive_active = 0;
485
486 if (keepalive_in_sec <= 0)
487 use_keepalive = KEEPALIVE_NEVER;
488 if (use_keepalive == KEEPALIVE_ALWAYS)
489 keepalive_active = 1;
490
6d525d38 491 while (1) {
83558686
JK
492 ssize_t sz;
493
494 if (keepalive_active) {
495 struct pollfd pfd;
496 int ret;
497
498 pfd.fd = in;
499 pfd.events = POLLIN;
500 ret = poll(&pfd, 1, 1000 * keepalive_in_sec);
501
502 if (ret < 0) {
503 if (errno == EINTR)
504 continue;
505 else
506 break;
507 } else if (ret == 0) {
508 /* no data; send a keepalive packet */
509 static const char buf[] = "0005\1";
510 write_or_die(1, buf, sizeof(buf) - 1);
511 continue;
512 } /* else there is actual data to read */
513 }
514
515 sz = xread(in, data, sizeof(data));
6d525d38
SP
516 if (sz <= 0)
517 break;
83558686
JK
518
519 if (use_keepalive == KEEPALIVE_AFTER_NUL && !keepalive_active) {
520 const char *p = memchr(data, '\0', sz);
521 if (p) {
522 /*
523 * The NUL tells us to start sending keepalives. Make
524 * sure we send any other data we read along
525 * with it.
526 */
527 keepalive_active = 1;
528 send_sideband(1, 2, data, p - data, use_sideband);
529 send_sideband(1, 2, p + 1, sz - (p - data + 1), use_sideband);
530 continue;
531 }
532 }
533
534 /*
535 * Either we're not looking for a NUL signal, or we didn't see
536 * it yet; just pass along the data.
537 */
6d525d38
SP
538 send_sideband(1, 2, data, sz, use_sideband);
539 }
540 close(in);
541 return 0;
542}
543
3013118e 544static void hmac_hash(unsigned char *out,
b89363e4
JH
545 const char *key_in, size_t key_len,
546 const char *text, size_t text_len)
547{
fabec2c5 548 unsigned char key[GIT_MAX_BLKSZ];
549 unsigned char k_ipad[GIT_MAX_BLKSZ];
550 unsigned char k_opad[GIT_MAX_BLKSZ];
b89363e4 551 int i;
fabec2c5 552 git_hash_ctx ctx;
b89363e4
JH
553
554 /* RFC 2104 2. (1) */
fabec2c5 555 memset(key, '\0', GIT_MAX_BLKSZ);
556 if (the_hash_algo->blksz < key_len) {
557 the_hash_algo->init_fn(&ctx);
558 the_hash_algo->update_fn(&ctx, key_in, key_len);
559 the_hash_algo->final_fn(key, &ctx);
b89363e4
JH
560 } else {
561 memcpy(key, key_in, key_len);
562 }
563
564 /* RFC 2104 2. (2) & (5) */
565 for (i = 0; i < sizeof(key); i++) {
566 k_ipad[i] = key[i] ^ 0x36;
567 k_opad[i] = key[i] ^ 0x5c;
568 }
569
570 /* RFC 2104 2. (3) & (4) */
fabec2c5 571 the_hash_algo->init_fn(&ctx);
572 the_hash_algo->update_fn(&ctx, k_ipad, sizeof(k_ipad));
573 the_hash_algo->update_fn(&ctx, text, text_len);
574 the_hash_algo->final_fn(out, &ctx);
b89363e4
JH
575
576 /* RFC 2104 2. (6) & (7) */
fabec2c5 577 the_hash_algo->init_fn(&ctx);
578 the_hash_algo->update_fn(&ctx, k_opad, sizeof(k_opad));
579 the_hash_algo->update_fn(&ctx, out, the_hash_algo->rawsz);
580 the_hash_algo->final_fn(out, &ctx);
b89363e4
JH
581}
582
dddbad72 583static char *prepare_push_cert_nonce(const char *path, timestamp_t stamp)
b89363e4
JH
584{
585 struct strbuf buf = STRBUF_INIT;
fabec2c5 586 unsigned char hash[GIT_MAX_RAWSZ];
b89363e4 587
cb71f8bd 588 strbuf_addf(&buf, "%s:%"PRItime, path, stamp);
3013118e 589 hmac_hash(hash, buf.buf, buf.len, cert_nonce_seed, strlen(cert_nonce_seed));
b89363e4
JH
590 strbuf_release(&buf);
591
3013118e 592 /* RFC 2104 5. HMAC-SHA1 or HMAC-SHA256 */
fc06be3b 593 strbuf_addf(&buf, "%"PRItime"-%.*s", stamp, (int)the_hash_algo->hexsz, hash_to_hex(hash));
b89363e4
JH
594 return strbuf_detach(&buf, NULL);
595}
596
cbaf82cc
JT
597static char *find_header(const char *msg, size_t len, const char *key,
598 const char **next_line)
b89363e4 599{
cfc5cf42
JC
600 size_t out_len;
601 const char *val = find_header_mem(msg, len, key, &out_len);
602
603 if (!val)
604 return NULL;
605
606 if (next_line)
607 *next_line = val + out_len + 1;
608
609 return xmemdupz(val, out_len);
b89363e4
JH
610}
611
edc6dccf 612/*
613 * Return zero if a and b are equal up to n bytes and nonzero if they are not.
614 * This operation is guaranteed to run in constant time to avoid leaking data.
615 */
616static int constant_memequal(const char *a, const char *b, size_t n)
617{
618 int res = 0;
719483e5
JH
619 size_t i;
620
621 for (i = 0; i < n; i++)
edc6dccf 622 res |= a[i] ^ b[i];
623 return res;
624}
625
b89363e4
JH
626static const char *check_nonce(const char *buf, size_t len)
627{
cbaf82cc 628 char *nonce = find_header(buf, len, "nonce", NULL);
dddbad72 629 timestamp_t stamp, ostamp;
5732373d 630 char *bohmac, *expect = NULL;
b89363e4 631 const char *retval = NONCE_BAD;
edc6dccf 632 size_t noncelen;
b89363e4
JH
633
634 if (!nonce) {
635 retval = NONCE_MISSING;
636 goto leave;
637 } else if (!push_cert_nonce) {
638 retval = NONCE_UNSOLICITED;
639 goto leave;
640 } else if (!strcmp(push_cert_nonce, nonce)) {
641 retval = NONCE_OK;
642 goto leave;
643 }
644
5732373d
JH
645 if (!stateless_rpc) {
646 /* returned nonce MUST match what we gave out earlier */
647 retval = NONCE_BAD;
648 goto leave;
649 }
650
651 /*
652 * In stateless mode, we may be receiving a nonce issued by
653 * another instance of the server that serving the same
654 * repository, and the timestamps may not match, but the
655 * nonce-seed and dir should match, so we can recompute and
656 * report the time slop.
657 *
658 * In addition, when a nonce issued by another instance has
659 * timestamp within receive.certnonceslop seconds, we pretend
660 * as if we issued that nonce when reporting to the hook.
661 */
662
663 /* nonce is concat(<seconds-since-epoch>, "-", <hmac>) */
664 if (*nonce <= '0' || '9' < *nonce) {
665 retval = NONCE_BAD;
666 goto leave;
667 }
1aeb7e75 668 stamp = parse_timestamp(nonce, &bohmac, 10);
5732373d
JH
669 if (bohmac == nonce || bohmac[0] != '-') {
670 retval = NONCE_BAD;
671 goto leave;
672 }
673
edc6dccf 674 noncelen = strlen(nonce);
5732373d 675 expect = prepare_push_cert_nonce(service_dir, stamp);
edc6dccf 676 if (noncelen != strlen(expect)) {
677 /* This is not even the right size. */
678 retval = NONCE_BAD;
679 goto leave;
680 }
681 if (constant_memequal(expect, nonce, noncelen)) {
5732373d
JH
682 /* Not what we would have signed earlier */
683 retval = NONCE_BAD;
684 goto leave;
685 }
686
687 /*
688 * By how many seconds is this nonce stale? Negative value
689 * would mean it was issued by another server with its clock
690 * skewed in the future.
691 */
1aeb7e75 692 ostamp = parse_timestamp(push_cert_nonce, NULL, 10);
5732373d
JH
693 nonce_stamp_slop = (long)ostamp - (long)stamp;
694
695 if (nonce_stamp_slop_limit &&
31a8aa1e 696 labs(nonce_stamp_slop) <= nonce_stamp_slop_limit) {
5732373d
JH
697 /*
698 * Pretend as if the received nonce (which passes the
699 * HMAC check, so it is not a forged by third-party)
700 * is what we issued.
701 */
702 free((void *)push_cert_nonce);
703 push_cert_nonce = xstrdup(nonce);
704 retval = NONCE_OK;
705 } else {
706 retval = NONCE_SLOP;
707 }
b89363e4
JH
708
709leave:
710 free(nonce);
5732373d 711 free(expect);
b89363e4
JH
712 return retval;
713}
714
cbaf82cc
JT
715/*
716 * Return 1 if there is no push_cert or if the push options in push_cert are
717 * the same as those in the argument; 0 otherwise.
718 */
719static int check_cert_push_options(const struct string_list *push_options)
720{
721 const char *buf = push_cert.buf;
722 int len = push_cert.len;
723
724 char *option;
725 const char *next_line;
726 int options_seen = 0;
727
728 int retval = 1;
729
730 if (!len)
731 return 1;
732
733 while ((option = find_header(buf, len, "push-option", &next_line))) {
734 len -= (next_line - buf);
735 buf = next_line;
736 options_seen++;
737 if (options_seen > push_options->nr
738 || strcmp(option,
739 push_options->items[options_seen - 1].string)) {
740 retval = 0;
741 goto leave;
742 }
743 free(option);
744 }
745
746 if (options_seen != push_options->nr)
747 retval = 0;
748
749leave:
750 free(option);
751 return retval;
752}
753
a85b377d
JH
754static void prepare_push_cert_sha1(struct child_process *proc)
755{
756 static int already_done;
a85b377d
JH
757
758 if (!push_cert.len)
759 return;
760
761 if (!already_done) {
d05b9618
JH
762 int bogs /* beginning_of_gpg_sig */;
763
a85b377d 764 already_done = 1;
c80d226a 765 if (write_object_file(push_cert.buf, push_cert.len, OBJ_BLOB,
a09c985e
PO
766 &push_cert_oid))
767 oidclr(&push_cert_oid);
d05b9618
JH
768
769 memset(&sigcheck, '\0', sizeof(sigcheck));
d05b9618 770
482c1191 771 bogs = parse_signed_buffer(push_cert.buf, push_cert.len);
02769437
FS
772 sigcheck.payload = xmemdupz(push_cert.buf, bogs);
773 sigcheck.payload_len = bogs;
774 check_signature(&sigcheck, push_cert.buf + bogs,
775 push_cert.len - bogs);
d05b9618 776
b89363e4 777 nonce_status = check_nonce(push_cert.buf, bogs);
a85b377d 778 }
a09c985e 779 if (!is_null_oid(&push_cert_oid)) {
29fda24d 780 strvec_pushf(&proc->env, "GIT_PUSH_CERT=%s",
f6d8942b 781 oid_to_hex(&push_cert_oid));
29fda24d 782 strvec_pushf(&proc->env, "GIT_PUSH_CERT_SIGNER=%s",
f6d8942b 783 sigcheck.signer ? sigcheck.signer : "");
29fda24d 784 strvec_pushf(&proc->env, "GIT_PUSH_CERT_KEY=%s",
f6d8942b 785 sigcheck.key ? sigcheck.key : "");
29fda24d 786 strvec_pushf(&proc->env, "GIT_PUSH_CERT_STATUS=%c",
f6d8942b 787 sigcheck.result);
b89363e4 788 if (push_cert_nonce) {
29fda24d 789 strvec_pushf(&proc->env,
f6d8942b
JK
790 "GIT_PUSH_CERT_NONCE=%s",
791 push_cert_nonce);
29fda24d 792 strvec_pushf(&proc->env,
f6d8942b
JK
793 "GIT_PUSH_CERT_NONCE_STATUS=%s",
794 nonce_status);
5732373d 795 if (nonce_status == NONCE_SLOP)
29fda24d 796 strvec_pushf(&proc->env,
f6d8942b
JK
797 "GIT_PUSH_CERT_NONCE_SLOP=%ld",
798 nonce_stamp_slop);
b89363e4 799 }
a85b377d
JH
800 }
801}
802
77a9745d
SB
803struct receive_hook_feed_state {
804 struct command *cmd;
195d6eae 805 struct ref_push_report *report;
77a9745d
SB
806 int skip_broken;
807 struct strbuf buf;
808 const struct string_list *push_options;
809};
810
9684e44a 811typedef int (*feed_fn)(void *, const char **, size_t *);
77a9745d
SB
812static int run_and_feed_hook(const char *hook_name, feed_fn feed,
813 struct receive_hook_feed_state *feed_state)
b1bf95bb 814{
d3180279 815 struct child_process proc = CHILD_PROCESS_INIT;
6d525d38 816 struct async muxer;
9684e44a 817 int code;
7f14609e 818 const char *hook_path = find_hook(hook_name);
b1bf95bb 819
7f14609e 820 if (!hook_path)
b1bf95bb 821 return 0;
c8dd2771 822
7f14609e 823 strvec_push(&proc.args, hook_path);
f43cd49f
SP
824 proc.in = -1;
825 proc.stdout_to_stderr = 1;
6206286e
JH
826 proc.trace2_hook_name = hook_name;
827
77a9745d 828 if (feed_state->push_options) {
99d60545 829 size_t i;
77a9745d 830 for (i = 0; i < feed_state->push_options->nr; i++)
29fda24d 831 strvec_pushf(&proc.env,
99d60545
ÆAB
832 "GIT_PUSH_OPTION_%"PRIuMAX"=%s",
833 (uintmax_t)i,
f6d8942b 834 feed_state->push_options->items[i].string);
29fda24d 835 strvec_pushf(&proc.env, "GIT_PUSH_OPTION_COUNT=%"PRIuMAX"",
99d60545 836 (uintmax_t)feed_state->push_options->nr);
77a9745d 837 } else
29fda24d 838 strvec_pushf(&proc.env, "GIT_PUSH_OPTION_COUNT");
f43cd49f 839
722ff7f8 840 if (tmp_objdir)
29fda24d 841 strvec_pushv(&proc.env, tmp_objdir_env(tmp_objdir));
722ff7f8 842
6d525d38
SP
843 if (use_sideband) {
844 memset(&muxer, 0, sizeof(muxer));
845 muxer.proc = copy_to_sideband;
846 muxer.in = -1;
847 code = start_async(&muxer);
848 if (code)
849 return code;
850 proc.err = muxer.in;
851 }
852
5d222c09
RS
853 prepare_push_cert_sha1(&proc);
854
f43cd49f 855 code = start_command(&proc);
6d525d38
SP
856 if (code) {
857 if (use_sideband)
858 finish_async(&muxer);
90e41a89 859 return code;
6d525d38
SP
860 }
861
ec7dbd14
JH
862 sigchain_push(SIGPIPE, SIG_IGN);
863
9684e44a
JH
864 while (1) {
865 const char *buf;
866 size_t n;
867 if (feed(feed_state, &buf, &n))
868 break;
06f46f23 869 if (write_in_full(proc.in, buf, n) < 0)
9684e44a 870 break;
c8dd2771 871 }
e72ae288 872 close(proc.in);
6d525d38
SP
873 if (use_sideband)
874 finish_async(&muxer);
ec7dbd14
JH
875
876 sigchain_pop(SIGPIPE);
877
90e41a89 878 return finish_command(&proc);
b1bf95bb
JW
879}
880
9684e44a
JH
881static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
882{
883 struct receive_hook_feed_state *state = state_;
884 struct command *cmd = state->cmd;
885
cdc2b2f3
JH
886 while (cmd &&
887 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
9684e44a
JH
888 cmd = cmd->next;
889 if (!cmd)
890 return -1; /* EOF */
195d6eae
JX
891 if (!bufp)
892 return 0; /* OK, can feed something. */
9684e44a 893 strbuf_reset(&state->buf);
195d6eae
JX
894 if (!state->report)
895 state->report = cmd->report;
896 if (state->report) {
897 struct object_id *old_oid;
898 struct object_id *new_oid;
899 const char *ref_name;
900
901 old_oid = state->report->old_oid ? state->report->old_oid : &cmd->old_oid;
902 new_oid = state->report->new_oid ? state->report->new_oid : &cmd->new_oid;
903 ref_name = state->report->ref_name ? state->report->ref_name : cmd->ref_name;
904 strbuf_addf(&state->buf, "%s %s %s\n",
905 oid_to_hex(old_oid), oid_to_hex(new_oid),
906 ref_name);
907 state->report = state->report->next;
908 if (!state->report)
909 state->cmd = cmd->next;
910 } else {
911 strbuf_addf(&state->buf, "%s %s %s\n",
912 oid_to_hex(&cmd->old_oid), oid_to_hex(&cmd->new_oid),
913 cmd->ref_name);
914 state->cmd = cmd->next;
915 }
9684e44a
JH
916 if (bufp) {
917 *bufp = state->buf.buf;
918 *sizep = state->buf.len;
919 }
920 return 0;
921}
922
77a9745d
SB
923static int run_receive_hook(struct command *commands,
924 const char *hook_name,
925 int skip_broken,
926 const struct string_list *push_options)
9684e44a
JH
927{
928 struct receive_hook_feed_state state;
929 int status;
930
931 strbuf_init(&state.buf, 0);
932 state.cmd = commands;
cdc2b2f3 933 state.skip_broken = skip_broken;
195d6eae 934 state.report = NULL;
9684e44a
JH
935 if (feed_receive_hook(&state, NULL, NULL))
936 return 0;
937 state.cmd = commands;
77a9745d 938 state.push_options = push_options;
9684e44a
JH
939 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
940 strbuf_release(&state.buf);
941 return status;
942}
943
1d9e8b56
SP
944static int run_update_hook(struct command *cmd)
945{
d3180279 946 struct child_process proc = CHILD_PROCESS_INIT;
6d525d38 947 int code;
7f14609e 948 const char *hook_path = find_hook("update");
1d9e8b56 949
7f14609e 950 if (!hook_path)
1d9e8b56
SP
951 return 0;
952
7f14609e
ÆAB
953 strvec_push(&proc.args, hook_path);
954 strvec_push(&proc.args, cmd->ref_name);
955 strvec_push(&proc.args, oid_to_hex(&cmd->old_oid));
956 strvec_push(&proc.args, oid_to_hex(&cmd->new_oid));
1d9e8b56 957
6d525d38
SP
958 proc.no_stdin = 1;
959 proc.stdout_to_stderr = 1;
960 proc.err = use_sideband ? -1 : 0;
6206286e 961 proc.trace2_hook_name = "update";
6d525d38
SP
962
963 code = start_command(&proc);
964 if (code)
965 return code;
966 if (use_sideband)
967 copy_to_sideband(proc.err, -1, NULL);
968 return finish_command(&proc);
1d9e8b56
SP
969}
970
15d3af5e
JX
971static struct command *find_command_by_refname(struct command *list,
972 const char *refname)
973{
974 for (; list; list = list->next)
975 if (!strcmp(list->ref_name, refname))
976 return list;
977 return NULL;
978}
979
980static int read_proc_receive_report(struct packet_reader *reader,
981 struct command *commands,
982 struct strbuf *errmsg)
983{
984 struct command *cmd;
985 struct command *hint = NULL;
986 struct ref_push_report *report = NULL;
987 int new_report = 0;
988 int code = 0;
989 int once = 0;
f65003b4 990 int response = 0;
15d3af5e
JX
991
992 for (;;) {
993 struct object_id old_oid, new_oid;
994 const char *head;
995 const char *refname;
996 char *p;
f65003b4
JX
997 enum packet_read_status status;
998
999 status = packet_reader_read(reader);
1000 if (status != PACKET_READ_NORMAL) {
1001 /* Check whether proc-receive exited abnormally */
1002 if (status == PACKET_READ_EOF && !response) {
1003 strbuf_addstr(errmsg, "proc-receive exited abnormally");
1004 return -1;
1005 }
15d3af5e 1006 break;
f65003b4
JX
1007 }
1008 response++;
15d3af5e
JX
1009
1010 head = reader->line;
1011 p = strchr(head, ' ');
1012 if (!p) {
1013 strbuf_addf(errmsg, "proc-receive reported incomplete status line: '%s'\n", head);
1014 code = -1;
1015 continue;
1016 }
1017 *p++ = '\0';
1018 if (!strcmp(head, "option")) {
1019 const char *key, *val;
1020
1021 if (!hint || !(report || new_report)) {
1022 if (!once++)
1023 strbuf_addstr(errmsg, "proc-receive reported 'option' without a matching 'ok/ng' directive\n");
1024 code = -1;
1025 continue;
1026 }
1027 if (new_report) {
1028 if (!hint->report) {
ca56dadb 1029 CALLOC_ARRAY(hint->report, 1);
15d3af5e
JX
1030 report = hint->report;
1031 } else {
1032 report = hint->report;
1033 while (report->next)
1034 report = report->next;
1035 report->next = xcalloc(1, sizeof(struct ref_push_report));
1036 report = report->next;
1037 }
1038 new_report = 0;
1039 }
1040 key = p;
1041 p = strchr(key, ' ');
1042 if (p)
1043 *p++ = '\0';
1044 val = p;
1045 if (!strcmp(key, "refname"))
1046 report->ref_name = xstrdup_or_null(val);
1047 else if (!strcmp(key, "old-oid") && val &&
1048 !parse_oid_hex(val, &old_oid, &val))
1049 report->old_oid = oiddup(&old_oid);
1050 else if (!strcmp(key, "new-oid") && val &&
1051 !parse_oid_hex(val, &new_oid, &val))
1052 report->new_oid = oiddup(&new_oid);
1053 else if (!strcmp(key, "forced-update"))
1054 report->forced_update = 1;
1055 else if (!strcmp(key, "fall-through"))
1056 /* Fall through, let 'receive-pack' to execute it. */
1057 hint->run_proc_receive = 0;
1058 continue;
1059 }
1060
1061 report = NULL;
1062 new_report = 0;
1063 refname = p;
1064 p = strchr(refname, ' ');
1065 if (p)
1066 *p++ = '\0';
1067 if (strcmp(head, "ok") && strcmp(head, "ng")) {
1068 strbuf_addf(errmsg, "proc-receive reported bad status '%s' on ref '%s'\n",
1069 head, refname);
1070 code = -1;
1071 continue;
1072 }
1073
1074 /* first try searching at our hint, falling back to all refs */
1075 if (hint)
1076 hint = find_command_by_refname(hint, refname);
1077 if (!hint)
1078 hint = find_command_by_refname(commands, refname);
1079 if (!hint) {
1080 strbuf_addf(errmsg, "proc-receive reported status on unknown ref: %s\n",
1081 refname);
1082 code = -1;
1083 continue;
1084 }
1085 if (!hint->run_proc_receive) {
1086 strbuf_addf(errmsg, "proc-receive reported status on unexpected ref: %s\n",
1087 refname);
1088 code = -1;
1089 continue;
1090 }
1091 hint->run_proc_receive |= RUN_PROC_RECEIVE_RETURNED;
1092 if (!strcmp(head, "ng")) {
1093 if (p)
1094 hint->error_string = xstrdup(p);
1095 else
1096 hint->error_string = "failed";
1097 code = -1;
1098 continue;
1099 }
1100 new_report = 1;
1101 }
1102
1103 for (cmd = commands; cmd; cmd = cmd->next)
1104 if (cmd->run_proc_receive && !cmd->error_string &&
1105 !(cmd->run_proc_receive & RUN_PROC_RECEIVE_RETURNED)) {
1106 cmd->error_string = "proc-receive failed to report status";
1107 code = -1;
1108 }
1109 return code;
1110}
1111
1112static int run_proc_receive_hook(struct command *commands,
1113 const struct string_list *push_options)
1114{
1115 struct child_process proc = CHILD_PROCESS_INIT;
1116 struct async muxer;
1117 struct command *cmd;
15d3af5e
JX
1118 struct packet_reader reader;
1119 struct strbuf cap = STRBUF_INIT;
1120 struct strbuf errmsg = STRBUF_INIT;
1121 int hook_use_push_options = 0;
1122 int version = 0;
1123 int code;
7f14609e 1124 const char *hook_path = find_hook("proc-receive");
15d3af5e 1125
7f14609e 1126 if (!hook_path) {
15d3af5e
JX
1127 rp_error("cannot find hook 'proc-receive'");
1128 return -1;
1129 }
15d3af5e 1130
7f14609e 1131 strvec_push(&proc.args, hook_path);
15d3af5e
JX
1132 proc.in = -1;
1133 proc.out = -1;
1134 proc.trace2_hook_name = "proc-receive";
1135
1136 if (use_sideband) {
1137 memset(&muxer, 0, sizeof(muxer));
1138 muxer.proc = copy_to_sideband;
1139 muxer.in = -1;
1140 code = start_async(&muxer);
1141 if (code)
1142 return code;
1143 proc.err = muxer.in;
1144 } else {
1145 proc.err = 0;
1146 }
1147
1148 code = start_command(&proc);
1149 if (code) {
1150 if (use_sideband)
1151 finish_async(&muxer);
1152 return code;
1153 }
1154
1155 sigchain_push(SIGPIPE, SIG_IGN);
1156
1157 /* Version negotiaton */
1158 packet_reader_init(&reader, proc.out, NULL, 0,
1159 PACKET_READ_CHOMP_NEWLINE |
1160 PACKET_READ_GENTLE_ON_EOF);
1161 if (use_atomic)
1162 strbuf_addstr(&cap, " atomic");
1163 if (use_push_options)
1164 strbuf_addstr(&cap, " push-options");
1165 if (cap.len) {
f65003b4 1166 code = packet_write_fmt_gently(proc.in, "version=1%c%s\n", '\0', cap.buf + 1);
15d3af5e
JX
1167 strbuf_release(&cap);
1168 } else {
f65003b4 1169 code = packet_write_fmt_gently(proc.in, "version=1\n");
15d3af5e 1170 }
f65003b4
JX
1171 if (!code)
1172 code = packet_flush_gently(proc.in);
1173
1174 if (!code)
1175 for (;;) {
1176 int linelen;
1177 enum packet_read_status status;
1178
1179 status = packet_reader_read(&reader);
1180 if (status != PACKET_READ_NORMAL) {
1181 /* Check whether proc-receive exited abnormally */
1182 if (status == PACKET_READ_EOF)
1183 code = -1;
1184 break;
1185 }
15d3af5e 1186
f65003b4
JX
1187 if (reader.pktlen > 8 && starts_with(reader.line, "version=")) {
1188 version = atoi(reader.line + 8);
1189 linelen = strlen(reader.line);
1190 if (linelen < reader.pktlen) {
1191 const char *feature_list = reader.line + linelen + 1;
1192 if (parse_feature_request(feature_list, "push-options"))
1193 hook_use_push_options = 1;
1194 }
15d3af5e
JX
1195 }
1196 }
f65003b4
JX
1197
1198 if (code) {
1199 strbuf_addstr(&errmsg, "fail to negotiate version with proc-receive hook");
1200 goto cleanup;
15d3af5e
JX
1201 }
1202
80ffeb94
JX
1203 switch (version) {
1204 case 0:
1205 /* fallthrough */
1206 case 1:
1207 break;
1208 default:
15d3af5e
JX
1209 strbuf_addf(&errmsg, "proc-receive version '%d' is not supported",
1210 version);
1211 code = -1;
1212 goto cleanup;
1213 }
1214
1215 /* Send commands */
1216 for (cmd = commands; cmd; cmd = cmd->next) {
1217 if (!cmd->run_proc_receive || cmd->skip_update || cmd->error_string)
1218 continue;
f65003b4
JX
1219 code = packet_write_fmt_gently(proc.in, "%s %s %s",
1220 oid_to_hex(&cmd->old_oid),
1221 oid_to_hex(&cmd->new_oid),
1222 cmd->ref_name);
1223 if (code)
1224 break;
1225 }
1226 if (!code)
1227 code = packet_flush_gently(proc.in);
1228 if (code) {
1229 strbuf_addstr(&errmsg, "fail to write commands to proc-receive hook");
1230 goto cleanup;
15d3af5e 1231 }
15d3af5e
JX
1232
1233 /* Send push options */
1234 if (hook_use_push_options) {
1235 struct string_list_item *item;
1236
f65003b4
JX
1237 for_each_string_list_item(item, push_options) {
1238 code = packet_write_fmt_gently(proc.in, "%s", item->string);
1239 if (code)
1240 break;
1241 }
1242 if (!code)
1243 code = packet_flush_gently(proc.in);
1244 if (code) {
1245 strbuf_addstr(&errmsg,
1246 "fail to write push-options to proc-receive hook");
1247 goto cleanup;
1248 }
15d3af5e
JX
1249 }
1250
1251 /* Read result from proc-receive */
1252 code = read_proc_receive_report(&reader, commands, &errmsg);
1253
1254cleanup:
1255 close(proc.in);
1256 close(proc.out);
1257 if (use_sideband)
1258 finish_async(&muxer);
1259 if (finish_command(&proc))
1260 code = -1;
1261 if (errmsg.len >0) {
1262 char *p = errmsg.buf;
1263
1264 p += errmsg.len - 1;
1265 if (*p == '\n')
1266 *p = '\0';
1267 rp_error("%s", errmsg.buf);
1268 strbuf_release(&errmsg);
1269 }
1270 sigchain_pop(SIGPIPE);
1271
1272 return code;
1273}
1274
8ba35a2d
VA
1275static char *refuse_unconfigured_deny_msg =
1276 N_("By default, updating the current branch in a non-bare repository\n"
1277 "is denied, because it will make the index and work tree inconsistent\n"
1278 "with what you pushed, and will require 'git reset --hard' to match\n"
1279 "the work tree to HEAD.\n"
1280 "\n"
2ddaa427
AH
1281 "You can set the 'receive.denyCurrentBranch' configuration variable\n"
1282 "to 'ignore' or 'warn' in the remote repository to allow pushing into\n"
8ba35a2d
VA
1283 "its current branch; however, this is not recommended unless you\n"
1284 "arranged to update its work tree to match what you pushed in some\n"
1285 "other way.\n"
1286 "\n"
1287 "To squelch this message and still keep the default behaviour, set\n"
1288 "'receive.denyCurrentBranch' configuration variable to 'refuse'.");
3d95d92b 1289
acd2a45b 1290static void refuse_unconfigured_deny(void)
3d95d92b 1291{
8ba35a2d 1292 rp_error("%s", _(refuse_unconfigured_deny_msg));
3d95d92b
JH
1293}
1294
8ba35a2d
VA
1295static char *refuse_unconfigured_deny_delete_current_msg =
1296 N_("By default, deleting the current branch is denied, because the next\n"
1297 "'git clone' won't result in any file checked out, causing confusion.\n"
1298 "\n"
1299 "You can set 'receive.denyDeleteCurrent' configuration variable to\n"
1300 "'warn' or 'ignore' in the remote repository to allow deleting the\n"
1301 "current branch, with or without a warning message.\n"
1302 "\n"
1303 "To squelch this message, you can set it to 'refuse'.");
747ca245 1304
375881fa 1305static void refuse_unconfigured_deny_delete_current(void)
747ca245 1306{
8ba35a2d 1307 rp_error("%s", _(refuse_unconfigured_deny_delete_current_msg));
747ca245
JH
1308}
1309
9fec7b21 1310static const struct object_id *command_singleton_iterator(void *cb_data);
0a1bc12b
NTND
1311static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
1312{
cac4b8e2 1313 struct shallow_lock shallow_lock = SHALLOW_LOCK_INIT;
910650d2 1314 struct oid_array extra = OID_ARRAY_INIT;
7043c707 1315 struct check_connected_options opt = CHECK_CONNECTED_INIT;
0a1bc12b
NTND
1316 uint32_t mask = 1 << (cmd->index % 32);
1317 int i;
1318
6aa30857 1319 trace_printf_key(&trace_shallow,
0a1bc12b
NTND
1320 "shallow: update_shallow_ref %s\n", cmd->ref_name);
1321 for (i = 0; i < si->shallow->nr; i++)
1322 if (si->used_shallow[i] &&
1323 (si->used_shallow[i][cmd->index / 32] & mask) &&
1324 !delayed_reachability_test(si, i))
910650d2 1325 oid_array_append(&extra, &si->shallow->oid[i]);
0a1bc12b 1326
722ff7f8 1327 opt.env = tmp_objdir_env(tmp_objdir);
7043c707
JK
1328 setup_alternate_shallow(&shallow_lock, &opt.shallow_file, &extra);
1329 if (check_connected(command_singleton_iterator, cmd, &opt)) {
37b9dcab 1330 rollback_shallow_file(the_repository, &shallow_lock);
910650d2 1331 oid_array_clear(&extra);
0a1bc12b
NTND
1332 return -1;
1333 }
1334
37b9dcab 1335 commit_shallow_file(the_repository, &shallow_lock);
0a1bc12b
NTND
1336
1337 /*
1338 * Make sure setup_alternate_shallow() for the next ref does
1339 * not lose these new roots..
1340 */
1341 for (i = 0; i < extra.nr; i++)
19143f13 1342 register_shallow(the_repository, &extra.oid[i]);
0a1bc12b
NTND
1343
1344 si->shallow_ref[cmd->index] = 0;
910650d2 1345 oid_array_clear(&extra);
0a1bc12b
NTND
1346 return 0;
1347}
1348
1a51b524
JH
1349/*
1350 * NEEDSWORK: we should consolidate various implementions of "are we
1351 * on an unborn branch?" test into one, and make the unified one more
1352 * robust. !get_sha1() based check used here and elsewhere would not
1353 * allow us to tell an unborn branch from corrupt ref, for example.
1354 * For the purpose of fixing "deploy-to-update does not work when
1355 * pushing into an empty repository" issue, this should suffice for
1356 * now.
1357 */
1358static int head_has_history(void)
1359{
15be4a5d 1360 struct object_id oid;
1a51b524 1361
d850b7a5 1362 return !repo_get_oid(the_repository, "HEAD", &oid);
1a51b524
JH
1363}
1364
21b138d0 1365static const char *push_to_deploy(unsigned char *sha1,
22f9b7f3 1366 struct strvec *env,
21b138d0 1367 const char *work_tree)
1404bcbb 1368{
1404bcbb
JS
1369 struct child_process child = CHILD_PROCESS_INIT;
1370
2b709893
ÆAB
1371 strvec_pushl(&child.args, "update-index", "-q", "--ignore-submodules",
1372 "--refresh", NULL);
29fda24d 1373 strvec_pushv(&child.env, env->v);
1404bcbb
JS
1374 child.dir = work_tree;
1375 child.no_stdin = 1;
1376 child.stdout_to_stderr = 1;
1377 child.git_cmd = 1;
21b138d0 1378 if (run_command(&child))
1404bcbb 1379 return "Up-to-date check failed";
1404bcbb
JS
1380
1381 /* run_command() does not clean up completely; reinitialize */
1382 child_process_init(&child);
2b709893
ÆAB
1383 strvec_pushl(&child.args, "diff-files", "--quiet",
1384 "--ignore-submodules", "--", NULL);
29fda24d 1385 strvec_pushv(&child.env, env->v);
1404bcbb
JS
1386 child.dir = work_tree;
1387 child.no_stdin = 1;
1388 child.stdout_to_stderr = 1;
1389 child.git_cmd = 1;
21b138d0 1390 if (run_command(&child))
1404bcbb 1391 return "Working directory has unstaged changes";
1404bcbb
JS
1392
1393 child_process_init(&child);
2b709893
ÆAB
1394 strvec_pushl(&child.args, "diff-index", "--quiet", "--cached",
1395 "--ignore-submodules",
1396 /* diff-index with either HEAD or an empty tree */
1397 head_has_history() ? "HEAD" : empty_tree_oid_hex(),
1398 "--", NULL);
29fda24d 1399 strvec_pushv(&child.env, env->v);
1404bcbb
JS
1400 child.no_stdin = 1;
1401 child.no_stdout = 1;
1402 child.stdout_to_stderr = 0;
1403 child.git_cmd = 1;
21b138d0 1404 if (run_command(&child))
1404bcbb 1405 return "Working directory has staged changes";
1404bcbb 1406
1404bcbb 1407 child_process_init(&child);
2b709893
ÆAB
1408 strvec_pushl(&child.args, "read-tree", "-u", "-m", hash_to_hex(sha1),
1409 NULL);
29fda24d 1410 strvec_pushv(&child.env, env->v);
1404bcbb
JS
1411 child.dir = work_tree;
1412 child.no_stdin = 1;
1413 child.no_stdout = 1;
1414 child.stdout_to_stderr = 0;
1415 child.git_cmd = 1;
21b138d0 1416 if (run_command(&child))
1404bcbb 1417 return "Could not update working tree to new HEAD";
1404bcbb 1418
1404bcbb
JS
1419 return NULL;
1420}
1421
08553319
JH
1422static const char *push_to_checkout_hook = "push-to-checkout";
1423
fc06be3b 1424static const char *push_to_checkout(unsigned char *hash,
a8cc5943 1425 int *invoked_hook,
22f9b7f3 1426 struct strvec *env,
08553319
JH
1427 const char *work_tree)
1428{
306f445e 1429 struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
a8cc5943 1430 opt.invoked_hook = invoked_hook;
306f445e 1431
22f9b7f3 1432 strvec_pushf(env, "GIT_WORK_TREE=%s", absolute_path(work_tree));
306f445e
ES
1433 strvec_pushv(&opt.env, env->v);
1434 strvec_push(&opt.args, hash_to_hex(hash));
1435 if (run_hooks_opt(push_to_checkout_hook, &opt))
08553319
JH
1436 return "push-to-checkout hook declined";
1437 else
1438 return NULL;
1439}
1440
4ef34648 1441static const char *update_worktree(unsigned char *sha1, const struct worktree *worktree)
21b138d0 1442{
38baae6c 1443 const char *retval, *git_dir;
22f9b7f3 1444 struct strvec env = STRVEC_INIT;
a8cc5943 1445 int invoked_hook;
21b138d0 1446
38baae6c
AK
1447 if (!worktree || !worktree->path)
1448 BUG("worktree->path must be non-NULL");
4ef34648 1449
9fdf4f1d 1450 if (worktree->is_bare)
21b138d0 1451 return "denyCurrentBranch = updateInstead needs a worktree";
38baae6c 1452 git_dir = get_worktree_git_dir(worktree);
21b138d0 1453
22f9b7f3 1454 strvec_pushf(&env, "GIT_DIR=%s", absolute_path(git_dir));
21b138d0 1455
a8cc5943
ÆAB
1456 retval = push_to_checkout(sha1, &invoked_hook, &env, worktree->path);
1457 if (!invoked_hook)
38baae6c 1458 retval = push_to_deploy(sha1, &env, worktree->path);
21b138d0 1459
22f9b7f3 1460 strvec_clear(&env);
21b138d0
JH
1461 return retval;
1462}
1463
0a1bc12b 1464static const char *update(struct command *cmd, struct shallow_info *si)
2eca23da 1465{
cfee10a7 1466 const char *name = cmd->ref_name;
6b01ecfe 1467 struct strbuf namespaced_name_buf = STRBUF_INIT;
bda6e828
JS
1468 static char *namespaced_name;
1469 const char *ret;
9c44ea44 1470 struct object_id *old_oid = &cmd->old_oid;
1471 struct object_id *new_oid = &cmd->new_oid;
b072a25f 1472 int do_update_worktree = 0;
c8dd491f
AK
1473 struct worktree **worktrees = get_worktrees();
1474 const struct worktree *worktree =
9fdf4f1d 1475 find_shared_symref(worktrees, "HEAD", name);
2eca23da 1476
061d6b9a 1477 /* only refs/... are allowed */
7c3c5502
ZH
1478 if (!starts_with(name, "refs/") ||
1479 check_refname_format(name + 5, is_null_oid(new_oid) ?
1480 REFNAME_ALLOW_ONELEVEL : 0)) {
d81ba50a 1481 rp_error("refusing to update funny ref '%s' remotely", name);
c8dd491f
AK
1482 ret = "funny refname";
1483 goto out;
cfee10a7 1484 }
d8a1deec 1485
6b01ecfe 1486 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
bda6e828 1487 free(namespaced_name);
6b01ecfe
JT
1488 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
1489
9fdf4f1d 1490 if (worktree && !worktree->is_bare) {
3d95d92b
JH
1491 switch (deny_current_branch) {
1492 case DENY_IGNORE:
986e8239 1493 break;
3d95d92b 1494 case DENY_WARN:
466dbc42 1495 rp_warning("updating the current branch");
986e8239 1496 break;
3d95d92b 1497 case DENY_REFUSE:
acd2a45b 1498 case DENY_UNCONFIGURED:
466dbc42 1499 rp_error("refusing to update checked out branch: %s", name);
acd2a45b
JH
1500 if (deny_current_branch == DENY_UNCONFIGURED)
1501 refuse_unconfigured_deny();
c8dd491f
AK
1502 ret = "branch is currently checked out";
1503 goto out;
1404bcbb 1504 case DENY_UPDATE_INSTEAD:
b072a25f
JH
1505 /* pass -- let other checks intervene first */
1506 do_update_worktree = 1;
1404bcbb 1507 break;
3d95d92b 1508 }
986e8239
JK
1509 }
1510
bc726bd0 1511 if (!is_null_oid(new_oid) && !repo_has_object_file(the_repository, new_oid)) {
8aaf7d64 1512 error("unpack should have generated %s, "
9c44ea44 1513 "but I can't find it!", oid_to_hex(new_oid));
c8dd491f
AK
1514 ret = "bad pack";
1515 goto out;
cfee10a7 1516 }
747ca245 1517
9c44ea44 1518 if (!is_null_oid(old_oid) && is_null_oid(new_oid)) {
59556548 1519 if (deny_deletes && starts_with(name, "refs/heads/")) {
466dbc42 1520 rp_error("denying ref deletion for %s", name);
c8dd491f
AK
1521 ret = "deletion prohibited";
1522 goto out;
747ca245
JH
1523 }
1524
4ef34648 1525 if (worktree || (head_name && !strcmp(namespaced_name, head_name))) {
747ca245
JH
1526 switch (deny_delete_current) {
1527 case DENY_IGNORE:
1528 break;
1529 case DENY_WARN:
466dbc42 1530 rp_warning("deleting the current branch");
747ca245
JH
1531 break;
1532 case DENY_REFUSE:
375881fa 1533 case DENY_UNCONFIGURED:
1404bcbb 1534 case DENY_UPDATE_INSTEAD:
375881fa
JH
1535 if (deny_delete_current == DENY_UNCONFIGURED)
1536 refuse_unconfigured_deny_delete_current();
466dbc42 1537 rp_error("refusing to delete the current branch: %s", name);
c8dd491f
AK
1538 ret = "deletion of the current branch prohibited";
1539 goto out;
1404bcbb 1540 default:
c8dd491f
AK
1541 ret = "Invalid denyDeleteCurrent setting";
1542 goto out;
747ca245
JH
1543 }
1544 }
a240de11 1545 }
747ca245 1546
9c44ea44 1547 if (deny_non_fast_forwards && !is_null_oid(new_oid) &&
1548 !is_null_oid(old_oid) &&
59556548 1549 starts_with(name, "refs/heads/")) {
eab82707 1550 struct object *old_object, *new_object;
11031d7e 1551 struct commit *old_commit, *new_commit;
11031d7e 1552
109cd76d
SB
1553 old_object = parse_object(the_repository, old_oid);
1554 new_object = parse_object(the_repository, new_oid);
eab82707
MK
1555
1556 if (!old_object || !new_object ||
1557 old_object->type != OBJ_COMMIT ||
1558 new_object->type != OBJ_COMMIT) {
1559 error("bad sha1 objects for %s", name);
c8dd491f
AK
1560 ret = "bad ref";
1561 goto out;
eab82707
MK
1562 }
1563 old_commit = (struct commit *)old_object;
1564 new_commit = (struct commit *)new_object;
cb338c23 1565 if (!repo_in_merge_bases(the_repository, old_commit, new_commit)) {
466dbc42
SP
1566 rp_error("denying non-fast-forward %s"
1567 " (you should pull first)", name);
c8dd491f
AK
1568 ret = "non-fast-forward";
1569 goto out;
8aaf7d64 1570 }
11031d7e 1571 }
1d9e8b56 1572 if (run_update_hook(cmd)) {
466dbc42 1573 rp_error("hook declined to update %s", name);
c8dd491f
AK
1574 ret = "hook declined";
1575 goto out;
b1bf95bb 1576 }
3159c8dc 1577
b072a25f 1578 if (do_update_worktree) {
38baae6c 1579 ret = update_worktree(new_oid->hash, worktree);
b072a25f 1580 if (ret)
c8dd491f 1581 goto out;
b072a25f
JH
1582 }
1583
9c44ea44 1584 if (is_null_oid(new_oid)) {
222368c6 1585 struct strbuf err = STRBUF_INIT;
109cd76d 1586 if (!parse_object(the_repository, old_oid)) {
9c44ea44 1587 old_oid = NULL;
160b81ed 1588 if (ref_exists(name)) {
c25edee9 1589 rp_warning("allowing deletion of corrupt ref");
160b81ed 1590 } else {
c25edee9 1591 rp_warning("deleting a non-existent ref");
160b81ed
PYH
1592 cmd->did_not_exist = 1;
1593 }
28391a80 1594 }
222368c6
SB
1595 if (ref_transaction_delete(transaction,
1596 namespaced_name,
89f3bbdd 1597 old_oid,
fb5a6bb6 1598 0, "push", &err)) {
222368c6 1599 rp_error("%s", err.buf);
c8dd491f
AK
1600 ret = "failed to delete";
1601 } else {
1602 ret = NULL; /* good */
d4f694ba 1603 }
222368c6 1604 strbuf_release(&err);
d4f694ba
JH
1605 }
1606 else {
6629ea2d 1607 struct strbuf err = STRBUF_INIT;
0a1bc12b 1608 if (shallow_update && si->shallow_ref[cmd->index] &&
c8dd491f
AK
1609 update_shallow_ref(cmd, si)) {
1610 ret = "shallow error";
1611 goto out;
1612 }
0a1bc12b 1613
222368c6
SB
1614 if (ref_transaction_update(transaction,
1615 namespaced_name,
89f3bbdd 1616 new_oid, old_oid,
1d147bdf 1617 0, "push",
222368c6 1618 &err)) {
6629ea2d 1619 rp_error("%s", err.buf);
c8dd491f
AK
1620 ret = "failed to update ref";
1621 } else {
1622 ret = NULL; /* good */
ef203f08 1623 }
6629ea2d 1624 strbuf_release(&err);
19614330 1625 }
c8dd491f
AK
1626
1627out:
1628 free_worktrees(worktrees);
1629 return ret;
2eca23da
LT
1630}
1631
5e1c71fd 1632static void run_update_post_hook(struct command *commands)
19614330 1633{
5e1c71fd 1634 struct command *cmd;
d3180279 1635 struct child_process proc = CHILD_PROCESS_INIT;
dcf69262 1636 const char *hook;
19614330 1637
5a7da2dc 1638 hook = find_hook("post-update");
dce96c41 1639 if (!hook)
3e6e152c 1640 return;
5a7da2dc 1641
850d2fec 1642 for (cmd = commands; cmd; cmd = cmd->next) {
160b81ed 1643 if (cmd->error_string || cmd->did_not_exist)
19614330 1644 continue;
d70a9eb6 1645 if (!proc.args.nr)
22f9b7f3
JK
1646 strvec_push(&proc.args, hook);
1647 strvec_push(&proc.args, cmd->ref_name);
19614330 1648 }
d70a9eb6 1649 if (!proc.args.nr)
dce96c41 1650 return;
6d525d38 1651
6d525d38
SP
1652 proc.no_stdin = 1;
1653 proc.stdout_to_stderr = 1;
1654 proc.err = use_sideband ? -1 : 0;
6206286e 1655 proc.trace2_hook_name = "post-update";
6d525d38
SP
1656
1657 if (!start_command(&proc)) {
1658 if (use_sideband)
1659 copy_to_sideband(proc.err, -1, NULL);
1660 finish_command(&proc);
1661 }
19614330 1662}
2eca23da 1663
99036237
ÆAB
1664static void check_aliased_update_internal(struct command *cmd,
1665 struct string_list *list,
1666 const char *dst_name, int flag)
da3efdb1
JS
1667{
1668 struct string_list_item *item;
1669 struct command *dst_cmd;
da3efdb1
JS
1670
1671 if (!(flag & REF_ISSYMREF))
1672 return;
1673
6b01ecfe
JT
1674 if (!dst_name) {
1675 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
1676 cmd->skip_update = 1;
1677 cmd->error_string = "broken symref";
1678 return;
1679 }
ded83936 1680 dst_name = strip_namespace(dst_name);
6b01ecfe 1681
afe8a907 1682 if (!(item = string_list_lookup(list, dst_name)))
da3efdb1
JS
1683 return;
1684
1685 cmd->skip_update = 1;
1686
1687 dst_cmd = (struct command *) item->util;
1688
4a7e27e9
JK
1689 if (oideq(&cmd->old_oid, &dst_cmd->old_oid) &&
1690 oideq(&cmd->new_oid, &dst_cmd->new_oid))
da3efdb1
JS
1691 return;
1692
1693 dst_cmd->skip_update = 1;
1694
da3efdb1
JS
1695 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
1696 " its target '%s' (%s..%s)",
ef2ed501 1697 cmd->ref_name,
d850b7a5
ÆAB
1698 repo_find_unique_abbrev(the_repository, &cmd->old_oid, DEFAULT_ABBREV),
1699 repo_find_unique_abbrev(the_repository, &cmd->new_oid, DEFAULT_ABBREV),
ef2ed501 1700 dst_cmd->ref_name,
d850b7a5
ÆAB
1701 repo_find_unique_abbrev(the_repository, &dst_cmd->old_oid, DEFAULT_ABBREV),
1702 repo_find_unique_abbrev(the_repository, &dst_cmd->new_oid, DEFAULT_ABBREV));
da3efdb1
JS
1703
1704 cmd->error_string = dst_cmd->error_string =
1705 "inconsistent aliased update";
1706}
1707
99036237
ÆAB
1708static void check_aliased_update(struct command *cmd, struct string_list *list)
1709{
1710 struct strbuf buf = STRBUF_INIT;
1711 const char *dst_name;
1712 int flag;
1713
1714 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
1715 dst_name = resolve_ref_unsafe(buf.buf, 0, NULL, &flag);
1716 check_aliased_update_internal(cmd, list, dst_name, flag);
1717 strbuf_release(&buf);
1718}
1719
da3efdb1
JS
1720static void check_aliased_updates(struct command *commands)
1721{
1722 struct command *cmd;
183113a5 1723 struct string_list ref_list = STRING_LIST_INIT_NODUP;
da3efdb1
JS
1724
1725 for (cmd = commands; cmd; cmd = cmd->next) {
1726 struct string_list_item *item =
1d2f80fa 1727 string_list_append(&ref_list, cmd->ref_name);
da3efdb1
JS
1728 item->util = (void *)cmd;
1729 }
3383e199 1730 string_list_sort(&ref_list);
da3efdb1 1731
ef7e93d9
CB
1732 for (cmd = commands; cmd; cmd = cmd->next) {
1733 if (!cmd->error_string)
1734 check_aliased_update(cmd, &ref_list);
1735 }
da3efdb1
JS
1736
1737 string_list_clear(&ref_list, 0);
1738}
1739
9fec7b21 1740static const struct object_id *command_singleton_iterator(void *cb_data)
52fed6e1
JH
1741{
1742 struct command **cmd_list = cb_data;
1743 struct command *cmd = *cmd_list;
1744
9c44ea44 1745 if (!cmd || is_null_oid(&cmd->new_oid))
9fec7b21 1746 return NULL;
52fed6e1 1747 *cmd_list = NULL; /* this returns only one */
9fec7b21 1748 return &cmd->new_oid;
52fed6e1
JH
1749}
1750
0a1bc12b
NTND
1751static void set_connectivity_errors(struct command *commands,
1752 struct shallow_info *si)
52fed6e1
JH
1753{
1754 struct command *cmd;
1755
1756 for (cmd = commands; cmd; cmd = cmd->next) {
1757 struct command *singleton = cmd;
722ff7f8
JK
1758 struct check_connected_options opt = CHECK_CONNECTED_INIT;
1759
0a1bc12b
NTND
1760 if (shallow_update && si->shallow_ref[cmd->index])
1761 /* to be checked in update_shallow_ref() */
1762 continue;
722ff7f8
JK
1763
1764 opt.env = tmp_objdir_env(tmp_objdir);
7043c707 1765 if (!check_connected(command_singleton_iterator, &singleton,
722ff7f8 1766 &opt))
52fed6e1 1767 continue;
722ff7f8 1768
52fed6e1
JH
1769 cmd->error_string = "missing necessary objects";
1770 }
1771}
1772
0a1bc12b
NTND
1773struct iterate_data {
1774 struct command *cmds;
1775 struct shallow_info *si;
1776};
1777
9fec7b21 1778static const struct object_id *iterate_receive_command_list(void *cb_data)
52fed6e1 1779{
0a1bc12b
NTND
1780 struct iterate_data *data = cb_data;
1781 struct command **cmd_list = &data->cmds;
52fed6e1
JH
1782 struct command *cmd = *cmd_list;
1783
0a1bc12b
NTND
1784 for (; cmd; cmd = cmd->next) {
1785 if (shallow_update && data->si->shallow_ref[cmd->index])
1786 /* to be checked in update_shallow_ref() */
1787 continue;
9c44ea44 1788 if (!is_null_oid(&cmd->new_oid) && !cmd->skip_update) {
ee6dfb2d 1789 *cmd_list = cmd->next;
9fec7b21 1790 return &cmd->new_oid;
ee6dfb2d 1791 }
ee6dfb2d 1792 }
9fec7b21 1793 return NULL;
52fed6e1
JH
1794}
1795
daebaa78
JH
1796static void reject_updates_to_hidden(struct command *commands)
1797{
78a766ab
LF
1798 struct strbuf refname_full = STRBUF_INIT;
1799 size_t prefix_len;
daebaa78
JH
1800 struct command *cmd;
1801
78a766ab
LF
1802 strbuf_addstr(&refname_full, get_git_namespace());
1803 prefix_len = refname_full.len;
1804
daebaa78 1805 for (cmd = commands; cmd; cmd = cmd->next) {
78a766ab
LF
1806 if (cmd->error_string)
1807 continue;
1808
1809 strbuf_setlen(&refname_full, prefix_len);
1810 strbuf_addstr(&refname_full, cmd->ref_name);
1811
9b67eb6f 1812 if (!ref_is_hidden(cmd->ref_name, refname_full.buf, &hidden_refs))
daebaa78 1813 continue;
9c44ea44 1814 if (is_null_oid(&cmd->new_oid))
daebaa78
JH
1815 cmd->error_string = "deny deleting a hidden ref";
1816 else
1817 cmd->error_string = "deny updating a hidden ref";
1818 }
78a766ab
LF
1819
1820 strbuf_release(&refname_full);
daebaa78
JH
1821}
1822
a6a84319
SB
1823static int should_process_cmd(struct command *cmd)
1824{
1825 return !cmd->error_string && !cmd->skip_update;
1826}
1827
07b1d8f1 1828static void BUG_if_skipped_connectivity_check(struct command *commands,
a6a84319
SB
1829 struct shallow_info *si)
1830{
1831 struct command *cmd;
a6a84319
SB
1832
1833 for (cmd = commands; cmd; cmd = cmd->next) {
07b1d8f1
ÆAB
1834 if (should_process_cmd(cmd) && si->shallow_ref[cmd->index])
1835 bug("connectivity check has not been run on ref %s",
1836 cmd->ref_name);
a6a84319 1837 }
07b1d8f1 1838 BUG_if_bug("connectivity check skipped???");
a6a84319
SB
1839}
1840
a1a26145
SB
1841static void execute_commands_non_atomic(struct command *commands,
1842 struct shallow_info *si)
1843{
1844 struct command *cmd;
222368c6
SB
1845 struct strbuf err = STRBUF_INIT;
1846
a1a26145 1847 for (cmd = commands; cmd; cmd = cmd->next) {
15d3af5e 1848 if (!should_process_cmd(cmd) || cmd->run_proc_receive)
a1a26145
SB
1849 continue;
1850
222368c6
SB
1851 transaction = ref_transaction_begin(&err);
1852 if (!transaction) {
1853 rp_error("%s", err.buf);
1854 strbuf_reset(&err);
1855 cmd->error_string = "transaction failed to start";
1856 continue;
1857 }
1858
a1a26145 1859 cmd->error_string = update(cmd, si);
222368c6
SB
1860
1861 if (!cmd->error_string
1862 && ref_transaction_commit(transaction, &err)) {
1863 rp_error("%s", err.buf);
1864 strbuf_reset(&err);
1865 cmd->error_string = "failed to update ref";
1866 }
1867 ref_transaction_free(transaction);
a1a26145 1868 }
68deed29
SB
1869 strbuf_release(&err);
1870}
222368c6 1871
68deed29
SB
1872static void execute_commands_atomic(struct command *commands,
1873 struct shallow_info *si)
1874{
1875 struct command *cmd;
1876 struct strbuf err = STRBUF_INIT;
1877 const char *reported_error = "atomic push failure";
1878
1879 transaction = ref_transaction_begin(&err);
1880 if (!transaction) {
1881 rp_error("%s", err.buf);
1882 strbuf_reset(&err);
1883 reported_error = "transaction failed to start";
1884 goto failure;
1885 }
1886
1887 for (cmd = commands; cmd; cmd = cmd->next) {
15d3af5e 1888 if (!should_process_cmd(cmd) || cmd->run_proc_receive)
68deed29
SB
1889 continue;
1890
1891 cmd->error_string = update(cmd, si);
1892
1893 if (cmd->error_string)
1894 goto failure;
1895 }
1896
1897 if (ref_transaction_commit(transaction, &err)) {
1898 rp_error("%s", err.buf);
1899 reported_error = "atomic transaction failed";
1900 goto failure;
1901 }
1902 goto cleanup;
1903
1904failure:
1905 for (cmd = commands; cmd; cmd = cmd->next)
1906 if (!cmd->error_string)
1907 cmd->error_string = reported_error;
1908
1909cleanup:
1910 ref_transaction_free(transaction);
222368c6 1911 strbuf_release(&err);
a1a26145
SB
1912}
1913
0a1bc12b
NTND
1914static void execute_commands(struct command *commands,
1915 const char *unpacker_error,
77a9745d
SB
1916 struct shallow_info *si,
1917 const struct string_list *push_options)
575f4974 1918{
d415092a 1919 struct check_connected_options opt = CHECK_CONNECTED_INIT;
5e1c71fd 1920 struct command *cmd;
0a1bc12b 1921 struct iterate_data data;
d415092a
JK
1922 struct async muxer;
1923 int err_fd = 0;
15d3af5e 1924 int run_proc_receive = 0;
8aaf7d64
SP
1925
1926 if (unpacker_error) {
5e1c71fd 1927 for (cmd = commands; cmd; cmd = cmd->next)
74eb32d3 1928 cmd->error_string = "unpacker error";
8aaf7d64
SP
1929 return;
1930 }
1931
d415092a
JK
1932 if (use_sideband) {
1933 memset(&muxer, 0, sizeof(muxer));
1934 muxer.proc = copy_to_sideband;
1935 muxer.in = -1;
1936 if (!start_async(&muxer))
1937 err_fd = muxer.in;
1938 /* ...else, continue without relaying sideband */
1939 }
1940
0a1bc12b
NTND
1941 data.cmds = commands;
1942 data.si = si;
d415092a 1943 opt.err_fd = err_fd;
6b4cd2f8 1944 opt.progress = err_fd && !quiet;
722ff7f8 1945 opt.env = tmp_objdir_env(tmp_objdir);
bcec6780
PS
1946 opt.exclude_hidden_refs_section = "receive";
1947
d415092a 1948 if (check_connected(iterate_receive_command_list, &data, &opt))
0a1bc12b 1949 set_connectivity_errors(commands, si);
52fed6e1 1950
d415092a
JK
1951 if (use_sideband)
1952 finish_async(&muxer);
1953
daebaa78
JH
1954 reject_updates_to_hidden(commands);
1955
15d3af5e
JX
1956 /*
1957 * Try to find commands that have special prefix in their reference names,
1958 * and mark them to run an external "proc-receive" hook later.
1959 */
31e8595a
JX
1960 if (proc_receive_ref) {
1961 for (cmd = commands; cmd; cmd = cmd->next) {
1962 if (!should_process_cmd(cmd))
1963 continue;
15d3af5e 1964
31e8595a
JX
1965 if (proc_receive_ref_matches(cmd)) {
1966 cmd->run_proc_receive = RUN_PROC_RECEIVE_SCHEDULED;
1967 run_proc_receive = 1;
1968 }
15d3af5e
JX
1969 }
1970 }
1971
77a9745d 1972 if (run_receive_hook(commands, "pre-receive", 0, push_options)) {
ef7e93d9
CB
1973 for (cmd = commands; cmd; cmd = cmd->next) {
1974 if (!cmd->error_string)
1975 cmd->error_string = "pre-receive hook declined";
1976 }
05ef58ec
SP
1977 return;
1978 }
1979
54077640
CB
1980 /*
1981 * If there is no command ready to run, should return directly to destroy
1982 * temporary data in the quarantine area.
1983 */
1984 for (cmd = commands; cmd && cmd->error_string; cmd = cmd->next)
1985 ; /* nothing */
1986 if (!cmd)
1987 return;
1988
722ff7f8
JK
1989 /*
1990 * Now we'll start writing out refs, which means the objects need
1991 * to be in their final positions so that other processes can see them.
1992 */
1993 if (tmp_objdir_migrate(tmp_objdir) < 0) {
1994 for (cmd = commands; cmd; cmd = cmd->next) {
1995 if (!cmd->error_string)
1996 cmd->error_string = "unable to migrate objects to permanent storage";
1997 }
1998 return;
1999 }
2000 tmp_objdir = NULL;
2001
da3efdb1
JS
2002 check_aliased_updates(commands);
2003
96ec7b1e 2004 free(head_name_to_free);
efbd4fdf 2005 head_name = head_name_to_free = resolve_refdup("HEAD", 0, NULL, NULL);
747ca245 2006
15d3af5e
JX
2007 if (run_proc_receive &&
2008 run_proc_receive_hook(commands, push_options))
2009 for (cmd = commands; cmd; cmd = cmd->next)
2010 if (!cmd->error_string &&
2011 !(cmd->run_proc_receive & RUN_PROC_RECEIVE_RETURNED) &&
2012 (cmd->run_proc_receive || use_atomic))
2013 cmd->error_string = "fail to run proc-receive hook";
2014
68deed29
SB
2015 if (use_atomic)
2016 execute_commands_atomic(commands, si);
2017 else
2018 execute_commands_non_atomic(commands, si);
0a1bc12b 2019
a6a84319 2020 if (shallow_update)
07b1d8f1 2021 BUG_if_skipped_connectivity_check(commands, si);
575f4974
LT
2022}
2023
39895c74
JH
2024static struct command **queue_command(struct command **tail,
2025 const char *line,
2026 int linelen)
2027{
9c44ea44 2028 struct object_id old_oid, new_oid;
39895c74
JH
2029 struct command *cmd;
2030 const char *refname;
2031 int reflen;
9c44ea44 2032 const char *p;
39895c74 2033
9c44ea44 2034 if (parse_oid_hex(line, &old_oid, &p) ||
2035 *p++ != ' ' ||
2036 parse_oid_hex(p, &new_oid, &p) ||
2037 *p++ != ' ')
39895c74
JH
2038 die("protocol error: expected old/new/ref, got '%s'", line);
2039
9c44ea44 2040 refname = p;
2041 reflen = linelen - (p - line);
ddd0bfac 2042 FLEX_ALLOC_MEM(cmd, ref_name, refname, reflen);
9c44ea44 2043 oidcpy(&cmd->old_oid, &old_oid);
2044 oidcpy(&cmd->new_oid, &new_oid);
39895c74
JH
2045 *tail = cmd;
2046 return &cmd->next;
2047}
2048
1fdd31cf
ÆAB
2049static void free_commands(struct command *commands)
2050{
2051 while (commands) {
2052 struct command *next = commands->next;
2053
2054 free(commands);
2055 commands = next;
2056 }
2057}
2058
4adf569d
JH
2059static void queue_commands_from_cert(struct command **tail,
2060 struct strbuf *push_cert)
2061{
2062 const char *boc, *eoc;
2063
2064 if (*tail)
2065 die("protocol error: got both push certificate and unsigned commands");
2066
2067 boc = strstr(push_cert->buf, "\n\n");
2068 if (!boc)
2069 die("malformed push certificate %.*s", 100, push_cert->buf);
2070 else
2071 boc += 2;
482c1191 2072 eoc = push_cert->buf + parse_signed_buffer(push_cert->buf, push_cert->len);
4adf569d
JH
2073
2074 while (boc < eoc) {
2075 const char *eol = memchr(boc, '\n', eoc - boc);
f2214ded 2076 tail = queue_command(tail, boc, eol ? eol - boc : eoc - boc);
4adf569d
JH
2077 boc = eol ? eol + 1 : eoc;
2078 }
2079}
2080
01f9ec64
MS
2081static struct command *read_head_info(struct packet_reader *reader,
2082 struct oid_array *shallow)
575f4974 2083{
5e1c71fd 2084 struct command *commands = NULL;
eb1af2df 2085 struct command **p = &commands;
575f4974 2086 for (;;) {
01f9ec64 2087 int linelen;
eb1af2df 2088
01f9ec64 2089 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
575f4974 2090 break;
5dbd7676 2091
01f9ec64 2092 if (reader->pktlen > 8 && starts_with(reader->line, "shallow ")) {
9c44ea44 2093 struct object_id oid;
01f9ec64 2094 if (get_oid_hex(reader->line + 8, &oid))
c09b71cc 2095 die("protocol error: expected shallow sha, got '%s'",
01f9ec64 2096 reader->line + 8);
910650d2 2097 oid_array_append(shallow, &oid);
5dbd7676
NTND
2098 continue;
2099 }
2100
01f9ec64
MS
2101 linelen = strlen(reader->line);
2102 if (linelen < reader->pktlen) {
2103 const char *feature_list = reader->line + linelen + 1;
bb095d08 2104 const char *hash = NULL;
a2a066d9 2105 const char *client_sid;
7ce4c8f7 2106 size_t len = 0;
f47182c8 2107 if (parse_feature_request(feature_list, "report-status"))
cfee10a7 2108 report_status = 1;
63518a57
JX
2109 if (parse_feature_request(feature_list, "report-status-v2"))
2110 report_status_v2 = 1;
f47182c8 2111 if (parse_feature_request(feature_list, "side-band-64k"))
38a81b4e 2112 use_sideband = LARGE_PACKET_MAX;
c207e34f
CB
2113 if (parse_feature_request(feature_list, "quiet"))
2114 quiet = 1;
1b70fe5d
RS
2115 if (advertise_atomic_push
2116 && parse_feature_request(feature_list, "atomic"))
2117 use_atomic = 1;
c714e45f
SB
2118 if (advertise_push_options
2119 && parse_feature_request(feature_list, "push-options"))
2120 use_push_options = 1;
bb095d08 2121 hash = parse_feature_value(feature_list, "object-format", &len, NULL);
2122 if (!hash) {
2123 hash = hash_algos[GIT_HASH_SHA1].name;
2124 len = strlen(hash);
2125 }
2126 if (xstrncmpz(the_hash_algo->name, hash, len))
2127 die("error: unsupported object format '%s'", hash);
a2a066d9
JS
2128 client_sid = parse_feature_value(feature_list, "session-id", &len, NULL);
2129 if (client_sid) {
2130 char *sid = xstrndup(client_sid, len);
2131 trace2_data_string("transfer", NULL, "client-sid", client_sid);
2132 free(sid);
2133 }
cfee10a7 2134 }
0e3c339b 2135
01f9ec64 2136 if (!strcmp(reader->line, "push-cert")) {
a85b377d 2137 int true_flush = 0;
01f9ec64
MS
2138 int saved_options = reader->options;
2139 reader->options &= ~PACKET_READ_CHOMP_NEWLINE;
a85b377d
JH
2140
2141 for (;;) {
01f9ec64
MS
2142 packet_reader_read(reader);
2143 if (reader->status == PACKET_READ_FLUSH) {
a85b377d
JH
2144 true_flush = 1;
2145 break;
2146 }
01f9ec64
MS
2147 if (reader->status != PACKET_READ_NORMAL) {
2148 die("protocol error: got an unexpected packet");
2149 }
2150 if (!strcmp(reader->line, "push-cert-end\n"))
a85b377d 2151 break; /* end of cert */
01f9ec64 2152 strbuf_addstr(&push_cert, reader->line);
a85b377d 2153 }
01f9ec64 2154 reader->options = saved_options;
a85b377d
JH
2155
2156 if (true_flush)
2157 break;
2158 continue;
2159 }
2160
01f9ec64 2161 p = queue_command(p, reader->line, linelen);
575f4974 2162 }
4adf569d
JH
2163
2164 if (push_cert.len)
2165 queue_commands_from_cert(p, &push_cert);
2166
5e1c71fd 2167 return commands;
575f4974
LT
2168}
2169
01f9ec64
MS
2170static void read_push_options(struct packet_reader *reader,
2171 struct string_list *options)
c714e45f
SB
2172{
2173 while (1) {
01f9ec64 2174 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
c714e45f
SB
2175 break;
2176
01f9ec64 2177 string_list_append(options, reader->line);
c714e45f
SB
2178 }
2179}
2180
fc04c412
SP
2181static const char *parse_pack_header(struct pack_header *hdr)
2182{
a69e5429
JH
2183 switch (read_pack_header(0, hdr)) {
2184 case PH_ERROR_EOF:
2185 return "eof before pack header was fully read";
2186
2187 case PH_ERROR_PACK_SIGNATURE:
fc04c412 2188 return "protocol error (pack signature mismatch detected)";
a69e5429
JH
2189
2190 case PH_ERROR_PROTOCOL:
fc04c412 2191 return "protocol error (pack version unsupported)";
a69e5429
JH
2192
2193 default:
2194 return "unknown error in parse_pack_header";
2195
2196 case 0:
2197 return NULL;
2198 }
fc04c412
SP
2199}
2200
c55c3066 2201static struct tempfile *pack_lockfile;
576162a4 2202
22f9b7f3 2203static void push_header_arg(struct strvec *args, struct pack_header *hdr)
446d5d91 2204{
22f9b7f3 2205 strvec_pushf(args, "--pack_header=%"PRIu32",%"PRIu32,
f6d8942b 2206 ntohl(hdr->hdr_version), ntohl(hdr->hdr_entries));
446d5d91
JK
2207}
2208
5dbd7676 2209static const char *unpack(int err_fd, struct shallow_info *si)
575f4974 2210{
fc04c412
SP
2211 struct pack_header hdr;
2212 const char *hdr_err;
31c42bff 2213 int status;
d3180279 2214 struct child_process child = CHILD_PROCESS_INIT;
dab76d3a
JH
2215 int fsck_objects = (receive_fsck_objects >= 0
2216 ? receive_fsck_objects
2217 : transfer_fsck_objects >= 0
2218 ? transfer_fsck_objects
2219 : 0);
fc04c412
SP
2220
2221 hdr_err = parse_pack_header(&hdr);
49ecfa13
JK
2222 if (hdr_err) {
2223 if (err_fd > 0)
2224 close(err_fd);
fc04c412 2225 return hdr_err;
49ecfa13 2226 }
fc04c412 2227
5dbd7676
NTND
2228 if (si->nr_ours || si->nr_theirs) {
2229 alt_shallow_file = setup_temporary_shallow(si->shallow);
22f9b7f3
JK
2230 strvec_push(&child.args, "--shallow-file");
2231 strvec_push(&child.args, alt_shallow_file);
5dbd7676
NTND
2232 }
2233
b3cecf49 2234 tmp_objdir = tmp_objdir_create("incoming");
6cdad1f1
JK
2235 if (!tmp_objdir) {
2236 if (err_fd > 0)
2237 close(err_fd);
722ff7f8 2238 return "unable to create temporary object directory";
6cdad1f1 2239 }
c21fa3bb 2240 strvec_pushv(&child.env, tmp_objdir_env(tmp_objdir));
722ff7f8
JK
2241
2242 /*
2243 * Normally we just pass the tmp_objdir environment to the child
2244 * processes that do the heavy lifting, but we may need to see these
2245 * objects ourselves to set up shallow information.
2246 */
2247 tmp_objdir_add_as_alternate(tmp_objdir);
2248
fc04c412 2249 if (ntohl(hdr.hdr_entries) < unpack_limit) {
22f9b7f3 2250 strvec_push(&child.args, "unpack-objects");
446d5d91 2251 push_header_arg(&child.args, &hdr);
c207e34f 2252 if (quiet)
22f9b7f3 2253 strvec_push(&child.args, "-q");
dab76d3a 2254 if (fsck_objects)
22f9b7f3 2255 strvec_pushf(&child.args, "--strict%s",
f6d8942b 2256 fsck_msg_types.buf);
c08db5a2 2257 if (max_input_size)
22f9b7f3 2258 strvec_pushf(&child.args, "--max-input-size=%"PRIuMAX,
f6d8942b 2259 (uintmax_t)max_input_size);
59bfdfb8 2260 child.no_stdout = 1;
a22e6f85 2261 child.err = err_fd;
59bfdfb8 2262 child.git_cmd = 1;
31c42bff
NTND
2263 status = run_command(&child);
2264 if (status)
2265 return "unpack-objects abnormal exit";
576162a4 2266 } else {
da25bdb7 2267 char hostname[HOST_NAME_MAX + 1];
c55c3066 2268 char *lockfile;
576162a4 2269
22f9b7f3 2270 strvec_pushl(&child.args, "index-pack", "--stdin", NULL);
446d5d91 2271 push_header_arg(&child.args, &hdr);
b26cb7c7 2272
5781a9a2 2273 if (xgethostname(hostname, sizeof(hostname)))
b26cb7c7 2274 xsnprintf(hostname, sizeof(hostname), "localhost");
22f9b7f3 2275 strvec_pushf(&child.args,
f6d8942b
JK
2276 "--keep=receive-pack %"PRIuMAX" on %s",
2277 (uintmax_t)getpid(),
2278 hostname);
b26cb7c7 2279
d06303bb 2280 if (!quiet && err_fd)
22f9b7f3 2281 strvec_push(&child.args, "--show-resolving-progress");
83558686 2282 if (use_sideband)
22f9b7f3 2283 strvec_push(&child.args, "--report-end-of-input");
dab76d3a 2284 if (fsck_objects)
22f9b7f3 2285 strvec_pushf(&child.args, "--strict%s",
f6d8942b 2286 fsck_msg_types.buf);
1b68387e 2287 if (!reject_thin)
22f9b7f3 2288 strvec_push(&child.args, "--fix-thin");
c08db5a2 2289 if (max_input_size)
22f9b7f3 2290 strvec_pushf(&child.args, "--max-input-size=%"PRIuMAX,
f6d8942b 2291 (uintmax_t)max_input_size);
31c42bff
NTND
2292 child.out = -1;
2293 child.err = err_fd;
2294 child.git_cmd = 1;
2295 status = start_command(&child);
2296 if (status)
576162a4 2297 return "index-pack fork failed";
c55c3066
PS
2298
2299 lockfile = index_pack_lockfile(child.out, NULL);
2300 if (lockfile) {
2301 pack_lockfile = register_tempfile(lockfile);
2302 free(lockfile);
2303 }
31c42bff 2304 close(child.out);
c55c3066 2305
31c42bff
NTND
2306 status = finish_command(&child);
2307 if (status)
2308 return "index-pack abnormal exit";
a49d2834 2309 reprepare_packed_git(the_repository);
cfee10a7 2310 }
31c42bff 2311 return NULL;
cfee10a7
JH
2312}
2313
5dbd7676 2314static const char *unpack_with_sideband(struct shallow_info *si)
a22e6f85
JK
2315{
2316 struct async muxer;
2317 const char *ret;
2318
2319 if (!use_sideband)
5dbd7676 2320 return unpack(0, si);
a22e6f85 2321
83558686 2322 use_keepalive = KEEPALIVE_AFTER_NUL;
a22e6f85
JK
2323 memset(&muxer, 0, sizeof(muxer));
2324 muxer.proc = copy_to_sideband;
2325 muxer.in = -1;
2326 if (start_async(&muxer))
2327 return NULL;
2328
5dbd7676 2329 ret = unpack(muxer.in, si);
a22e6f85
JK
2330
2331 finish_async(&muxer);
2332 return ret;
2333}
2334
c95fc72f 2335static void prepare_shallow_update(struct shallow_info *si)
0a1bc12b 2336{
42c78a21 2337 int i, j, k, bitmap_size = DIV_ROUND_UP(si->ref->nr, 32);
0a1bc12b 2338
b32fa95f 2339 ALLOC_ARRAY(si->used_shallow, si->shallow->nr);
0a1bc12b
NTND
2340 assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
2341
486f4bd1
JH
2342 CALLOC_ARRAY(si->need_reachability_test, si->shallow->nr);
2343 CALLOC_ARRAY(si->reachable, si->shallow->nr);
2344 CALLOC_ARRAY(si->shallow_ref, si->ref->nr);
0a1bc12b
NTND
2345
2346 for (i = 0; i < si->nr_ours; i++)
2347 si->need_reachability_test[si->ours[i]] = 1;
2348
2349 for (i = 0; i < si->shallow->nr; i++) {
2350 if (!si->used_shallow[i])
2351 continue;
2352 for (j = 0; j < bitmap_size; j++) {
2353 if (!si->used_shallow[i][j])
2354 continue;
2355 si->need_reachability_test[i]++;
2356 for (k = 0; k < 32; k++)
9a93c668 2357 if (si->used_shallow[i][j] & (1U << k))
0a1bc12b
NTND
2358 si->shallow_ref[j * 32 + k]++;
2359 }
2360
2361 /*
2362 * true for those associated with some refs and belong
2363 * in "ours" list aka "step 7 not done yet"
2364 */
2365 si->need_reachability_test[i] =
2366 si->need_reachability_test[i] > 1;
2367 }
2368
2369 /*
2370 * keep hooks happy by forcing a temporary shallow file via
2371 * env variable because we can't add --shallow-file to every
7987d223 2372 * command. check_connected() will be done with
0a1bc12b
NTND
2373 * true .git/shallow though.
2374 */
2375 setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
2376}
2377
5dbd7676
NTND
2378static void update_shallow_info(struct command *commands,
2379 struct shallow_info *si,
910650d2 2380 struct oid_array *ref)
5dbd7676
NTND
2381{
2382 struct command *cmd;
2383 int *ref_status;
2384 remove_nonexistent_theirs_shallow(si);
0a1bc12b
NTND
2385 if (!si->nr_ours && !si->nr_theirs) {
2386 shallow_update = 0;
5dbd7676 2387 return;
0a1bc12b 2388 }
5dbd7676
NTND
2389
2390 for (cmd = commands; cmd; cmd = cmd->next) {
9c44ea44 2391 if (is_null_oid(&cmd->new_oid))
5dbd7676 2392 continue;
910650d2 2393 oid_array_append(ref, &cmd->new_oid);
5dbd7676
NTND
2394 cmd->index = ref->nr - 1;
2395 }
2396 si->ref = ref;
2397
0a1bc12b 2398 if (shallow_update) {
c95fc72f 2399 prepare_shallow_update(si);
0a1bc12b
NTND
2400 return;
2401 }
2402
b32fa95f 2403 ALLOC_ARRAY(ref_status, ref->nr);
5dbd7676
NTND
2404 assign_shallow_commits_to_refs(si, NULL, ref_status);
2405 for (cmd = commands; cmd; cmd = cmd->next) {
9c44ea44 2406 if (is_null_oid(&cmd->new_oid))
5dbd7676
NTND
2407 continue;
2408 if (ref_status[cmd->index]) {
2409 cmd->error_string = "shallow update not allowed";
2410 cmd->skip_update = 1;
2411 }
2412 }
5dbd7676
NTND
2413 free(ref_status);
2414}
2415
5e1c71fd 2416static void report(struct command *commands, const char *unpack_status)
cfee10a7
JH
2417{
2418 struct command *cmd;
38a81b4e
SP
2419 struct strbuf buf = STRBUF_INIT;
2420
2421 packet_buf_write(&buf, "unpack %s\n",
2422 unpack_status ? unpack_status : "ok");
cfee10a7
JH
2423 for (cmd = commands; cmd; cmd = cmd->next) {
2424 if (!cmd->error_string)
38a81b4e
SP
2425 packet_buf_write(&buf, "ok %s\n",
2426 cmd->ref_name);
cfee10a7 2427 else
38a81b4e
SP
2428 packet_buf_write(&buf, "ng %s %s\n",
2429 cmd->ref_name, cmd->error_string);
575f4974 2430 }
38a81b4e
SP
2431 packet_buf_flush(&buf);
2432
2433 if (use_sideband)
2434 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
2435 else
cdf4fb8e 2436 write_or_die(1, buf.buf, buf.len);
38a81b4e 2437 strbuf_release(&buf);
575f4974
LT
2438}
2439
63518a57
JX
2440static void report_v2(struct command *commands, const char *unpack_status)
2441{
2442 struct command *cmd;
2443 struct strbuf buf = STRBUF_INIT;
2444 struct ref_push_report *report;
2445
2446 packet_buf_write(&buf, "unpack %s\n",
2447 unpack_status ? unpack_status : "ok");
2448 for (cmd = commands; cmd; cmd = cmd->next) {
2449 int count = 0;
2450
2451 if (cmd->error_string) {
2452 packet_buf_write(&buf, "ng %s %s\n",
2453 cmd->ref_name,
2454 cmd->error_string);
2455 continue;
2456 }
2457 packet_buf_write(&buf, "ok %s\n",
2458 cmd->ref_name);
2459 for (report = cmd->report; report; report = report->next) {
2460 if (count++ > 0)
2461 packet_buf_write(&buf, "ok %s\n",
2462 cmd->ref_name);
2463 if (report->ref_name)
2464 packet_buf_write(&buf, "option refname %s\n",
2465 report->ref_name);
2466 if (report->old_oid)
2467 packet_buf_write(&buf, "option old-oid %s\n",
2468 oid_to_hex(report->old_oid));
2469 if (report->new_oid)
2470 packet_buf_write(&buf, "option new-oid %s\n",
2471 oid_to_hex(report->new_oid));
2472 if (report->forced_update)
2473 packet_buf_write(&buf, "option forced-update\n");
2474 }
2475 }
2476 packet_buf_flush(&buf);
2477
2478 if (use_sideband)
2479 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
2480 else
2481 write_or_die(1, buf.buf, buf.len);
2482 strbuf_release(&buf);
2483}
2484
5e1c71fd 2485static int delete_only(struct command *commands)
d4f694ba 2486{
5e1c71fd
JS
2487 struct command *cmd;
2488 for (cmd = commands; cmd; cmd = cmd->next) {
9c44ea44 2489 if (!is_null_oid(&cmd->new_oid))
d4f694ba 2490 return 0;
d4f694ba
JH
2491 }
2492 return 1;
2493}
2494
be5908ae 2495int cmd_receive_pack(int argc, const char **argv, const char *prefix)
575f4974 2496{
42526b47 2497 int advertise_refs = 0;
5e1c71fd 2498 struct command *commands;
910650d2 2499 struct oid_array shallow = OID_ARRAY_INIT;
2500 struct oid_array ref = OID_ARRAY_INIT;
5dbd7676 2501 struct shallow_info si;
01f9ec64 2502 struct packet_reader reader;
575f4974 2503
1b68387e
SS
2504 struct option options[] = {
2505 OPT__QUIET(&quiet, N_("quiet")),
2506 OPT_HIDDEN_BOOL(0, "stateless-rpc", &stateless_rpc, NULL),
98e2d9d6
ÆAB
2507 OPT_HIDDEN_BOOL(0, "http-backend-info-refs", &advertise_refs, NULL),
2508 OPT_ALIAS(0, "advertise-refs", "http-backend-info-refs"),
1b68387e
SS
2509 OPT_HIDDEN_BOOL(0, "reject-thin-pack-for-testing", &reject_thin, NULL),
2510 OPT_END()
2511 };
bbc30f99 2512
1b68387e 2513 packet_trace_identity("receive-pack");
575f4974 2514
1b68387e 2515 argc = parse_options(argc, argv, prefix, options, receive_pack_usage, 0);
c207e34f 2516
1b68387e 2517 if (argc > 1)
c25edee9 2518 usage_msg_opt(_("too many arguments"), receive_pack_usage, options);
1b68387e 2519 if (argc == 0)
c25edee9 2520 usage_msg_opt(_("you must specify a directory"), receive_pack_usage, options);
42526b47 2521
1b68387e 2522 service_dir = argv[0];
575f4974 2523
e1464ca7 2524 setup_path();
5c09f321 2525
5732373d
JH
2526 if (!enter_repo(service_dir, 0))
2527 die("'%s' does not appear to be a git repository", service_dir);
575f4974 2528
ef90d6d4 2529 git_config(receive_pack_config, NULL);
b89363e4 2530 if (cert_nonce_seed)
5732373d 2531 push_cert_nonce = prepare_push_cert_nonce(service_dir, time(NULL));
6fb75bed 2532
f3d33f8c 2533 if (0 <= receive_unpack_limit)
e28714c5 2534 unpack_limit = receive_unpack_limit;
f3d33f8c
JH
2535 else if (0 <= transfer_unpack_limit)
2536 unpack_limit = transfer_unpack_limit;
e28714c5 2537
aa9bab29 2538 switch (determine_protocol_version_server()) {
8f6982b4
BW
2539 case protocol_v2:
2540 /*
2541 * push support for protocol v2 has not been implemented yet,
2542 * so ignore the request to use v2 and fallback to using v0.
2543 */
2544 break;
aa9bab29
BW
2545 case protocol_v1:
2546 /*
2547 * v1 is just the original protocol with a version string,
2548 * so just fall through after writing the version string.
2549 */
2550 if (advertise_refs || !stateless_rpc)
2551 packet_write_fmt(1, "version 1\n");
2552
2553 /* fallthrough */
2554 case protocol_v0:
2555 break;
2556 case protocol_unknown_version:
2557 BUG("unknown protocol version");
2558 }
2559
42526b47 2560 if (advertise_refs || !stateless_rpc) {
42526b47 2561 write_head_info();
42526b47
SP
2562 }
2563 if (advertise_refs)
2564 return 0;
575f4974 2565
2d103c31
MS
2566 packet_reader_init(&reader, 0, NULL, 0,
2567 PACKET_READ_CHOMP_NEWLINE |
2568 PACKET_READ_DIE_ON_ERR_PACKET);
01f9ec64 2569
afe8a907 2570 if ((commands = read_head_info(&reader, &shallow))) {
d4f694ba 2571 const char *unpack_status = NULL;
77a9745d 2572 struct string_list push_options = STRING_LIST_INIT_DUP;
d4f694ba 2573
c714e45f 2574 if (use_push_options)
01f9ec64 2575 read_push_options(&reader, &push_options);
cbaf82cc
JT
2576 if (!check_cert_push_options(&push_options)) {
2577 struct command *cmd;
2578 for (cmd = commands; cmd; cmd = cmd->next)
2579 cmd->error_string = "inconsistent push options";
2580 }
c714e45f 2581
5dbd7676 2582 prepare_shallow_info(&si, &shallow);
0a1bc12b
NTND
2583 if (!si.nr_ours && !si.nr_theirs)
2584 shallow_update = 0;
5dbd7676
NTND
2585 if (!delete_only(commands)) {
2586 unpack_status = unpack_with_sideband(&si);
2587 update_shallow_info(commands, &si, &ref);
2588 }
83558686 2589 use_keepalive = KEEPALIVE_ALWAYS;
77a9745d
SB
2590 execute_commands(commands, unpack_status, &si,
2591 &push_options);
c55c3066 2592 delete_tempfile(&pack_lockfile);
d34182b9 2593 sigchain_push(SIGPIPE, SIG_IGN);
63518a57
JX
2594 if (report_status_v2)
2595 report_v2(commands, unpack_status);
2596 else if (report_status)
5e1c71fd 2597 report(commands, unpack_status);
d34182b9 2598 sigchain_pop(SIGPIPE);
77a9745d
SB
2599 run_receive_hook(commands, "post-receive", 1,
2600 &push_options);
8e663d9e 2601 run_update_post_hook(commands);
1fdd31cf 2602 free_commands(commands);
4432dd6b 2603 string_list_clear(&push_options, 0);
77e3efbf 2604 if (auto_gc) {
860a2ebe
LF
2605 struct child_process proc = CHILD_PROCESS_INIT;
2606
2607 proc.no_stdin = 1;
2608 proc.stdout_to_stderr = 1;
2609 proc.err = use_sideband ? -1 : 0;
c4dee2c0 2610 proc.git_cmd = proc.close_object_store = 1;
2b709893
ÆAB
2611 strvec_pushl(&proc.args, "gc", "--auto", "--quiet",
2612 NULL);
860a2ebe 2613
860a2ebe
LF
2614 if (!start_command(&proc)) {
2615 if (use_sideband)
2616 copy_to_sideband(proc.err, -1, NULL);
2617 finish_command(&proc);
2618 }
77e3efbf
JH
2619 }
2620 if (auto_update_server_info)
2621 update_server_info(0);
5dbd7676 2622 clear_shallow_info(&si);
7f8e9828 2623 }
38a81b4e
SP
2624 if (use_sideband)
2625 packet_flush(1);
910650d2 2626 oid_array_clear(&shallow);
2627 oid_array_clear(&ref);
c45841ff 2628 strvec_clear(&hidden_refs);
b89363e4 2629 free((void *)push_cert_nonce);
575f4974
LT
2630 return 0;
2631}