]> git.ipfire.org Git - thirdparty/git.git/blame - builtin/receive-pack.c
refs: convert struct ref_entry to use struct object_id
[thirdparty/git.git] / builtin / receive-pack.c
CommitLineData
1e4cd68c 1#include "builtin.h"
697cc8ef 2#include "lockfile.h"
fc04c412 3#include "pack.h"
8a65ff76 4#include "refs.h"
f3a3214e 5#include "pkt-line.h"
38a81b4e 6#include "sideband.h"
b1bf95bb 7#include "run-command.h"
576162a4 8#include "exec_cmd.h"
11031d7e
JS
9#include "commit.h"
10#include "object.h"
d79796bc 11#include "remote.h"
47a59185 12#include "connect.h"
d79796bc 13#include "transport.h"
da3efdb1 14#include "string-list.h"
cff38a5e 15#include "sha1-array.h"
52fed6e1 16#include "connected.h"
31c42bff 17#include "argv-array.h"
ff5effdf 18#include "version.h"
d05b9618
JH
19#include "tag.h"
20#include "gpg-interface.h"
ec7dbd14 21#include "sigchain.h"
575f4974 22
34263de0 23static const char receive_pack_usage[] = "git receive-pack <git-dir>";
575f4974 24
986e8239 25enum deny_action {
3d95d92b 26 DENY_UNCONFIGURED,
986e8239
JK
27 DENY_IGNORE,
28 DENY_WARN,
1404bcbb
JS
29 DENY_REFUSE,
30 DENY_UPDATE_INSTEAD
986e8239
JK
31};
32
1b53a076
JH
33static int deny_deletes;
34static int deny_non_fast_forwards;
3d95d92b 35static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
747ca245 36static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
dab76d3a
JH
37static int receive_fsck_objects = -1;
38static int transfer_fsck_objects = -1;
e28714c5
JH
39static int receive_unpack_limit = -1;
40static int transfer_unpack_limit = -1;
1b70fe5d 41static int advertise_atomic_push = 1;
46732fae 42static int unpack_limit = 100;
96f1e58f 43static int report_status;
38a81b4e 44static int use_sideband;
68deed29 45static int use_atomic;
c207e34f 46static int quiet;
b74fce16 47static int prefer_ofs_delta = 1;
77e3efbf
JH
48static int auto_update_server_info;
49static int auto_gc = 1;
f7c815c3 50static int fix_thin = 1;
5732373d
JH
51static int stateless_rpc;
52static const char *service_dir;
747ca245 53static const char *head_name;
96ec7b1e 54static void *head_name_to_free;
185c04e0 55static int sent_capabilities;
0a1bc12b 56static int shallow_update;
5dbd7676 57static const char *alt_shallow_file;
a85b377d
JH
58static struct strbuf push_cert = STRBUF_INIT;
59static unsigned char push_cert_sha1[20];
d05b9618 60static struct signature_check sigcheck;
b89363e4
JH
61static const char *push_cert_nonce;
62static const char *cert_nonce_seed;
63
64static const char *NONCE_UNSOLICITED = "UNSOLICITED";
65static const char *NONCE_BAD = "BAD";
66static const char *NONCE_MISSING = "MISSING";
67static const char *NONCE_OK = "OK";
5732373d 68static const char *NONCE_SLOP = "SLOP";
b89363e4 69static const char *nonce_status;
5732373d
JH
70static long nonce_stamp_slop;
71static unsigned long nonce_stamp_slop_limit;
222368c6 72static struct ref_transaction *transaction;
cfee10a7 73
986e8239
JK
74static enum deny_action parse_deny_action(const char *var, const char *value)
75{
76 if (value) {
77 if (!strcasecmp(value, "ignore"))
78 return DENY_IGNORE;
79 if (!strcasecmp(value, "warn"))
80 return DENY_WARN;
81 if (!strcasecmp(value, "refuse"))
82 return DENY_REFUSE;
1404bcbb
JS
83 if (!strcasecmp(value, "updateinstead"))
84 return DENY_UPDATE_INSTEAD;
986e8239
JK
85 }
86 if (git_config_bool(var, value))
87 return DENY_REFUSE;
88 return DENY_IGNORE;
89}
90
ef90d6d4 91static int receive_pack_config(const char *var, const char *value, void *cb)
6fb75bed 92{
daebaa78
JH
93 int status = parse_hide_refs_config(var, value, "receive");
94
95 if (status)
96 return status;
97
a240de11
JK
98 if (strcmp(var, "receive.denydeletes") == 0) {
99 deny_deletes = git_config_bool(var, value);
100 return 0;
101 }
102
e28714c5 103 if (strcmp(var, "receive.denynonfastforwards") == 0) {
6fb75bed
SP
104 deny_non_fast_forwards = git_config_bool(var, value);
105 return 0;
106 }
107
e28714c5
JH
108 if (strcmp(var, "receive.unpacklimit") == 0) {
109 receive_unpack_limit = git_config_int(var, value);
fc04c412
SP
110 return 0;
111 }
112
e28714c5
JH
113 if (strcmp(var, "transfer.unpacklimit") == 0) {
114 transfer_unpack_limit = git_config_int(var, value);
115 return 0;
116 }
117
20dc0016
MK
118 if (strcmp(var, "receive.fsckobjects") == 0) {
119 receive_fsck_objects = git_config_bool(var, value);
120 return 0;
121 }
122
dab76d3a
JH
123 if (strcmp(var, "transfer.fsckobjects") == 0) {
124 transfer_fsck_objects = git_config_bool(var, value);
125 return 0;
126 }
127
986e8239
JK
128 if (!strcmp(var, "receive.denycurrentbranch")) {
129 deny_current_branch = parse_deny_action(var, value);
130 return 0;
131 }
132
747ca245
JH
133 if (strcmp(var, "receive.denydeletecurrent") == 0) {
134 deny_delete_current = parse_deny_action(var, value);
135 return 0;
136 }
137
b74fce16
NP
138 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
139 prefer_ofs_delta = git_config_bool(var, value);
140 return 0;
141 }
142
77e3efbf
JH
143 if (strcmp(var, "receive.updateserverinfo") == 0) {
144 auto_update_server_info = git_config_bool(var, value);
145 return 0;
146 }
147
148 if (strcmp(var, "receive.autogc") == 0) {
149 auto_gc = git_config_bool(var, value);
150 return 0;
151 }
152
0a1bc12b
NTND
153 if (strcmp(var, "receive.shallowupdate") == 0) {
154 shallow_update = git_config_bool(var, value);
155 return 0;
156 }
157
b89363e4
JH
158 if (strcmp(var, "receive.certnonceseed") == 0)
159 return git_config_string(&cert_nonce_seed, var, value);
a85b377d 160
5732373d
JH
161 if (strcmp(var, "receive.certnonceslop") == 0) {
162 nonce_stamp_slop_limit = git_config_ulong(var, value);
163 return 0;
164 }
165
1b70fe5d
RS
166 if (strcmp(var, "receive.advertiseatomic") == 0) {
167 advertise_atomic_push = git_config_bool(var, value);
168 return 0;
169 }
170
ef90d6d4 171 return git_default_config(var, value, cb);
6fb75bed
SP
172}
173
bc98201d 174static void show_ref(const char *path, const unsigned char *sha1)
575f4974 175{
daebaa78
JH
176 if (ref_is_hidden(path))
177 return;
178
52d2ae58 179 if (sent_capabilities) {
cfee10a7 180 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
52d2ae58
JH
181 } else {
182 struct strbuf cap = STRBUF_INIT;
183
184 strbuf_addstr(&cap,
185 "report-status delete-refs side-band-64k quiet");
1b70fe5d
RS
186 if (advertise_atomic_push)
187 strbuf_addstr(&cap, " atomic");
52d2ae58
JH
188 if (prefer_ofs_delta)
189 strbuf_addstr(&cap, " ofs-delta");
b89363e4
JH
190 if (push_cert_nonce)
191 strbuf_addf(&cap, " push-cert=%s", push_cert_nonce);
52d2ae58
JH
192 strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
193 packet_write(1, "%s %s%c%s\n",
194 sha1_to_hex(sha1), path, 0, cap.buf);
195 strbuf_release(&cap);
196 sent_capabilities = 1;
197 }
575f4974
LT
198}
199
bc98201d 200static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
6b01ecfe
JT
201{
202 path = strip_namespace(path);
203 /*
204 * Advertise refs outside our current namespace as ".have"
205 * refs, so that the client can use them to minimize data
206 * transfer but will otherwise ignore them. This happens to
207 * cover ".have" that are thrown in by add_one_alternate_ref()
208 * to mark histories that are complete in our alternates as
209 * well.
210 */
211 if (!path)
212 path = ".have";
bc98201d
MH
213 show_ref(path, sha1);
214 return 0;
6b01ecfe
JT
215}
216
85f25104 217static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
b7a025d9 218{
85f25104 219 show_ref(".have", sha1);
b7a025d9
MH
220}
221
222static void collect_one_alternate_ref(const struct ref *ref, void *data)
223{
224 struct sha1_array *sa = data;
225 sha1_array_append(sa, ref->old_sha1);
6b01ecfe
JT
226}
227
8a65ff76 228static void write_head_info(void)
575f4974 229{
b7a025d9
MH
230 struct sha1_array sa = SHA1_ARRAY_INIT;
231 for_each_alternate_ref(collect_one_alternate_ref, &sa);
85f25104 232 sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
b7a025d9 233 sha1_array_clear(&sa);
6b01ecfe 234 for_each_ref(show_ref_cb, NULL);
185c04e0 235 if (!sent_capabilities)
bc98201d 236 show_ref("capabilities^{}", null_sha1);
cfee10a7 237
ad491366
NTND
238 advertise_shallow_grafts(1);
239
b7a025d9
MH
240 /* EOF */
241 packet_flush(1);
575f4974
LT
242}
243
eb1af2df
LT
244struct command {
245 struct command *next;
cfee10a7 246 const char *error_string;
160b81ed
PYH
247 unsigned int skip_update:1,
248 did_not_exist:1;
5dbd7676 249 int index;
eb1af2df
LT
250 unsigned char old_sha1[20];
251 unsigned char new_sha1[20];
8f1d2e6f 252 char ref_name[FLEX_ARRAY]; /* more */
575f4974
LT
253};
254
466dbc42
SP
255static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
256static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
257
258static void report_message(const char *prefix, const char *err, va_list params)
259{
260 int sz = strlen(prefix);
261 char msg[4096];
262
263 strncpy(msg, prefix, sz);
264 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
265 if (sz > (sizeof(msg) - 1))
266 sz = sizeof(msg) - 1;
267 msg[sz++] = '\n';
268
269 if (use_sideband)
270 send_sideband(1, 2, msg, sz, use_sideband);
271 else
272 xwrite(2, msg, sz);
273}
274
275static void rp_warning(const char *err, ...)
276{
277 va_list params;
278 va_start(params, err);
279 report_message("warning: ", err, params);
280 va_end(params);
281}
282
283static void rp_error(const char *err, ...)
284{
285 va_list params;
286 va_start(params, err);
287 report_message("error: ", err, params);
288 va_end(params);
289}
290
6d525d38
SP
291static int copy_to_sideband(int in, int out, void *arg)
292{
293 char data[128];
294 while (1) {
295 ssize_t sz = xread(in, data, sizeof(data));
296 if (sz <= 0)
297 break;
298 send_sideband(1, 2, data, sz, use_sideband);
299 }
300 close(in);
301 return 0;
302}
303
b89363e4
JH
304#define HMAC_BLOCK_SIZE 64
305
6f5ef44e 306static void hmac_sha1(unsigned char *out,
b89363e4
JH
307 const char *key_in, size_t key_len,
308 const char *text, size_t text_len)
309{
310 unsigned char key[HMAC_BLOCK_SIZE];
311 unsigned char k_ipad[HMAC_BLOCK_SIZE];
312 unsigned char k_opad[HMAC_BLOCK_SIZE];
313 int i;
314 git_SHA_CTX ctx;
315
316 /* RFC 2104 2. (1) */
317 memset(key, '\0', HMAC_BLOCK_SIZE);
318 if (HMAC_BLOCK_SIZE < key_len) {
319 git_SHA1_Init(&ctx);
320 git_SHA1_Update(&ctx, key_in, key_len);
321 git_SHA1_Final(key, &ctx);
322 } else {
323 memcpy(key, key_in, key_len);
324 }
325
326 /* RFC 2104 2. (2) & (5) */
327 for (i = 0; i < sizeof(key); i++) {
328 k_ipad[i] = key[i] ^ 0x36;
329 k_opad[i] = key[i] ^ 0x5c;
330 }
331
332 /* RFC 2104 2. (3) & (4) */
333 git_SHA1_Init(&ctx);
334 git_SHA1_Update(&ctx, k_ipad, sizeof(k_ipad));
335 git_SHA1_Update(&ctx, text, text_len);
336 git_SHA1_Final(out, &ctx);
337
338 /* RFC 2104 2. (6) & (7) */
339 git_SHA1_Init(&ctx);
340 git_SHA1_Update(&ctx, k_opad, sizeof(k_opad));
6f5ef44e 341 git_SHA1_Update(&ctx, out, 20);
b89363e4
JH
342 git_SHA1_Final(out, &ctx);
343}
344
345static char *prepare_push_cert_nonce(const char *path, unsigned long stamp)
346{
347 struct strbuf buf = STRBUF_INIT;
348 unsigned char sha1[20];
349
350 strbuf_addf(&buf, "%s:%lu", path, stamp);
351 hmac_sha1(sha1, buf.buf, buf.len, cert_nonce_seed, strlen(cert_nonce_seed));;
352 strbuf_release(&buf);
353
354 /* RFC 2104 5. HMAC-SHA1-80 */
355 strbuf_addf(&buf, "%lu-%.*s", stamp, 20, sha1_to_hex(sha1));
356 return strbuf_detach(&buf, NULL);
357}
358
359/*
360 * NEEDSWORK: reuse find_commit_header() from jk/commit-author-parsing
361 * after dropping "_commit" from its name and possibly moving it out
362 * of commit.c
363 */
364static char *find_header(const char *msg, size_t len, const char *key)
365{
366 int key_len = strlen(key);
367 const char *line = msg;
368
369 while (line && line < msg + len) {
370 const char *eol = strchrnul(line, '\n');
371
372 if ((msg + len <= eol) || line == eol)
373 return NULL;
374 if (line + key_len < eol &&
375 !memcmp(line, key, key_len) && line[key_len] == ' ') {
376 int offset = key_len + 1;
377 return xmemdupz(line + offset, (eol - line) - offset);
378 }
379 line = *eol ? eol + 1 : NULL;
380 }
381 return NULL;
382}
383
384static const char *check_nonce(const char *buf, size_t len)
385{
386 char *nonce = find_header(buf, len, "nonce");
5732373d
JH
387 unsigned long stamp, ostamp;
388 char *bohmac, *expect = NULL;
b89363e4
JH
389 const char *retval = NONCE_BAD;
390
391 if (!nonce) {
392 retval = NONCE_MISSING;
393 goto leave;
394 } else if (!push_cert_nonce) {
395 retval = NONCE_UNSOLICITED;
396 goto leave;
397 } else if (!strcmp(push_cert_nonce, nonce)) {
398 retval = NONCE_OK;
399 goto leave;
400 }
401
5732373d
JH
402 if (!stateless_rpc) {
403 /* returned nonce MUST match what we gave out earlier */
404 retval = NONCE_BAD;
405 goto leave;
406 }
407
408 /*
409 * In stateless mode, we may be receiving a nonce issued by
410 * another instance of the server that serving the same
411 * repository, and the timestamps may not match, but the
412 * nonce-seed and dir should match, so we can recompute and
413 * report the time slop.
414 *
415 * In addition, when a nonce issued by another instance has
416 * timestamp within receive.certnonceslop seconds, we pretend
417 * as if we issued that nonce when reporting to the hook.
418 */
419
420 /* nonce is concat(<seconds-since-epoch>, "-", <hmac>) */
421 if (*nonce <= '0' || '9' < *nonce) {
422 retval = NONCE_BAD;
423 goto leave;
424 }
425 stamp = strtoul(nonce, &bohmac, 10);
426 if (bohmac == nonce || bohmac[0] != '-') {
427 retval = NONCE_BAD;
428 goto leave;
429 }
430
431 expect = prepare_push_cert_nonce(service_dir, stamp);
432 if (strcmp(expect, nonce)) {
433 /* Not what we would have signed earlier */
434 retval = NONCE_BAD;
435 goto leave;
436 }
437
438 /*
439 * By how many seconds is this nonce stale? Negative value
440 * would mean it was issued by another server with its clock
441 * skewed in the future.
442 */
443 ostamp = strtoul(push_cert_nonce, NULL, 10);
444 nonce_stamp_slop = (long)ostamp - (long)stamp;
445
446 if (nonce_stamp_slop_limit &&
31a8aa1e 447 labs(nonce_stamp_slop) <= nonce_stamp_slop_limit) {
5732373d
JH
448 /*
449 * Pretend as if the received nonce (which passes the
450 * HMAC check, so it is not a forged by third-party)
451 * is what we issued.
452 */
453 free((void *)push_cert_nonce);
454 push_cert_nonce = xstrdup(nonce);
455 retval = NONCE_OK;
456 } else {
457 retval = NONCE_SLOP;
458 }
b89363e4
JH
459
460leave:
461 free(nonce);
5732373d 462 free(expect);
b89363e4
JH
463 return retval;
464}
465
a85b377d
JH
466static void prepare_push_cert_sha1(struct child_process *proc)
467{
468 static int already_done;
a85b377d
JH
469
470 if (!push_cert.len)
471 return;
472
473 if (!already_done) {
d05b9618
JH
474 struct strbuf gpg_output = STRBUF_INIT;
475 struct strbuf gpg_status = STRBUF_INIT;
476 int bogs /* beginning_of_gpg_sig */;
477
a85b377d
JH
478 already_done = 1;
479 if (write_sha1_file(push_cert.buf, push_cert.len, "blob", push_cert_sha1))
480 hashclr(push_cert_sha1);
d05b9618
JH
481
482 memset(&sigcheck, '\0', sizeof(sigcheck));
483 sigcheck.result = 'N';
484
485 bogs = parse_signature(push_cert.buf, push_cert.len);
486 if (verify_signed_buffer(push_cert.buf, bogs,
487 push_cert.buf + bogs, push_cert.len - bogs,
488 &gpg_output, &gpg_status) < 0) {
489 ; /* error running gpg */
490 } else {
491 sigcheck.payload = push_cert.buf;
492 sigcheck.gpg_output = gpg_output.buf;
493 sigcheck.gpg_status = gpg_status.buf;
494 parse_gpg_output(&sigcheck);
495 }
496
497 strbuf_release(&gpg_output);
498 strbuf_release(&gpg_status);
b89363e4 499 nonce_status = check_nonce(push_cert.buf, bogs);
a85b377d
JH
500 }
501 if (!is_null_sha1(push_cert_sha1)) {
a9154590
RS
502 argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT=%s",
503 sha1_to_hex(push_cert_sha1));
504 argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_SIGNER=%s",
d05b9618 505 sigcheck.signer ? sigcheck.signer : "");
a9154590 506 argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_KEY=%s",
d05b9618 507 sigcheck.key ? sigcheck.key : "");
a9154590
RS
508 argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_STATUS=%c",
509 sigcheck.result);
b89363e4 510 if (push_cert_nonce) {
a9154590
RS
511 argv_array_pushf(&proc->env_array,
512 "GIT_PUSH_CERT_NONCE=%s",
513 push_cert_nonce);
514 argv_array_pushf(&proc->env_array,
515 "GIT_PUSH_CERT_NONCE_STATUS=%s",
516 nonce_status);
5732373d 517 if (nonce_status == NONCE_SLOP)
a9154590
RS
518 argv_array_pushf(&proc->env_array,
519 "GIT_PUSH_CERT_NONCE_SLOP=%ld",
5732373d 520 nonce_stamp_slop);
b89363e4 521 }
a85b377d
JH
522 }
523}
524
9684e44a
JH
525typedef int (*feed_fn)(void *, const char **, size_t *);
526static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
b1bf95bb 527{
d3180279 528 struct child_process proc = CHILD_PROCESS_INIT;
6d525d38 529 struct async muxer;
f43cd49f 530 const char *argv[2];
9684e44a 531 int code;
b1bf95bb 532
5a7da2dc
AS
533 argv[0] = find_hook(hook_name);
534 if (!argv[0])
b1bf95bb 535 return 0;
c8dd2771 536
f43cd49f
SP
537 argv[1] = NULL;
538
f43cd49f
SP
539 proc.argv = argv;
540 proc.in = -1;
541 proc.stdout_to_stderr = 1;
542
6d525d38
SP
543 if (use_sideband) {
544 memset(&muxer, 0, sizeof(muxer));
545 muxer.proc = copy_to_sideband;
546 muxer.in = -1;
547 code = start_async(&muxer);
548 if (code)
549 return code;
550 proc.err = muxer.in;
551 }
552
5d222c09
RS
553 prepare_push_cert_sha1(&proc);
554
f43cd49f 555 code = start_command(&proc);
6d525d38
SP
556 if (code) {
557 if (use_sideband)
558 finish_async(&muxer);
90e41a89 559 return code;
6d525d38
SP
560 }
561
ec7dbd14
JH
562 sigchain_push(SIGPIPE, SIG_IGN);
563
9684e44a
JH
564 while (1) {
565 const char *buf;
566 size_t n;
567 if (feed(feed_state, &buf, &n))
568 break;
569 if (write_in_full(proc.in, buf, n) != n)
570 break;
c8dd2771 571 }
e72ae288 572 close(proc.in);
6d525d38
SP
573 if (use_sideband)
574 finish_async(&muxer);
ec7dbd14
JH
575
576 sigchain_pop(SIGPIPE);
577
90e41a89 578 return finish_command(&proc);
b1bf95bb
JW
579}
580
9684e44a
JH
581struct receive_hook_feed_state {
582 struct command *cmd;
cdc2b2f3 583 int skip_broken;
9684e44a
JH
584 struct strbuf buf;
585};
586
587static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
588{
589 struct receive_hook_feed_state *state = state_;
590 struct command *cmd = state->cmd;
591
cdc2b2f3
JH
592 while (cmd &&
593 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
9684e44a
JH
594 cmd = cmd->next;
595 if (!cmd)
596 return -1; /* EOF */
597 strbuf_reset(&state->buf);
598 strbuf_addf(&state->buf, "%s %s %s\n",
599 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
600 cmd->ref_name);
601 state->cmd = cmd->next;
602 if (bufp) {
603 *bufp = state->buf.buf;
604 *sizep = state->buf.len;
605 }
606 return 0;
607}
608
cdc2b2f3
JH
609static int run_receive_hook(struct command *commands, const char *hook_name,
610 int skip_broken)
9684e44a
JH
611{
612 struct receive_hook_feed_state state;
613 int status;
614
615 strbuf_init(&state.buf, 0);
616 state.cmd = commands;
cdc2b2f3 617 state.skip_broken = skip_broken;
9684e44a
JH
618 if (feed_receive_hook(&state, NULL, NULL))
619 return 0;
620 state.cmd = commands;
621 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
622 strbuf_release(&state.buf);
623 return status;
624}
625
1d9e8b56
SP
626static int run_update_hook(struct command *cmd)
627{
1d9e8b56 628 const char *argv[5];
d3180279 629 struct child_process proc = CHILD_PROCESS_INIT;
6d525d38 630 int code;
1d9e8b56 631
5a7da2dc
AS
632 argv[0] = find_hook("update");
633 if (!argv[0])
1d9e8b56
SP
634 return 0;
635
1d9e8b56
SP
636 argv[1] = cmd->ref_name;
637 argv[2] = sha1_to_hex(cmd->old_sha1);
638 argv[3] = sha1_to_hex(cmd->new_sha1);
639 argv[4] = NULL;
640
6d525d38
SP
641 proc.no_stdin = 1;
642 proc.stdout_to_stderr = 1;
643 proc.err = use_sideband ? -1 : 0;
644 proc.argv = argv;
645
646 code = start_command(&proc);
647 if (code)
648 return code;
649 if (use_sideband)
650 copy_to_sideband(proc.err, -1, NULL);
651 return finish_command(&proc);
1d9e8b56
SP
652}
653
986e8239
JK
654static int is_ref_checked_out(const char *ref)
655{
986e8239
JK
656 if (is_bare_repository())
657 return 0;
658
747ca245 659 if (!head_name)
986e8239 660 return 0;
747ca245 661 return !strcmp(head_name, ref);
986e8239
JK
662}
663
acd2a45b
JH
664static char *refuse_unconfigured_deny_msg[] = {
665 "By default, updating the current branch in a non-bare repository",
666 "is denied, because it will make the index and work tree inconsistent",
667 "with what you pushed, and will require 'git reset --hard' to match",
668 "the work tree to HEAD.",
3d95d92b
JH
669 "",
670 "You can set 'receive.denyCurrentBranch' configuration variable to",
acd2a45b
JH
671 "'ignore' or 'warn' in the remote repository to allow pushing into",
672 "its current branch; however, this is not recommended unless you",
673 "arranged to update its work tree to match what you pushed in some",
674 "other way.",
3d95d92b 675 "",
acd2a45b
JH
676 "To squelch this message and still keep the default behaviour, set",
677 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
3d95d92b
JH
678};
679
acd2a45b 680static void refuse_unconfigured_deny(void)
3d95d92b
JH
681{
682 int i;
acd2a45b 683 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
a886ba28 684 rp_error("%s", refuse_unconfigured_deny_msg[i]);
3d95d92b
JH
685}
686
375881fa
JH
687static char *refuse_unconfigured_deny_delete_current_msg[] = {
688 "By default, deleting the current branch is denied, because the next",
689 "'git clone' won't result in any file checked out, causing confusion.",
747ca245
JH
690 "",
691 "You can set 'receive.denyDeleteCurrent' configuration variable to",
375881fa
JH
692 "'warn' or 'ignore' in the remote repository to allow deleting the",
693 "current branch, with or without a warning message.",
747ca245 694 "",
375881fa 695 "To squelch this message, you can set it to 'refuse'."
747ca245
JH
696};
697
375881fa 698static void refuse_unconfigured_deny_delete_current(void)
747ca245
JH
699{
700 int i;
701 for (i = 0;
375881fa 702 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
747ca245 703 i++)
a886ba28 704 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
747ca245
JH
705}
706
0a1bc12b
NTND
707static int command_singleton_iterator(void *cb_data, unsigned char sha1[20]);
708static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
709{
710 static struct lock_file shallow_lock;
711 struct sha1_array extra = SHA1_ARRAY_INIT;
712 const char *alt_file;
713 uint32_t mask = 1 << (cmd->index % 32);
714 int i;
715
6aa30857 716 trace_printf_key(&trace_shallow,
0a1bc12b
NTND
717 "shallow: update_shallow_ref %s\n", cmd->ref_name);
718 for (i = 0; i < si->shallow->nr; i++)
719 if (si->used_shallow[i] &&
720 (si->used_shallow[i][cmd->index / 32] & mask) &&
721 !delayed_reachability_test(si, i))
722 sha1_array_append(&extra, si->shallow->sha1[i]);
723
724 setup_alternate_shallow(&shallow_lock, &alt_file, &extra);
725 if (check_shallow_connected(command_singleton_iterator,
726 0, cmd, alt_file)) {
727 rollback_lock_file(&shallow_lock);
728 sha1_array_clear(&extra);
729 return -1;
730 }
731
732 commit_lock_file(&shallow_lock);
733
734 /*
735 * Make sure setup_alternate_shallow() for the next ref does
736 * not lose these new roots..
737 */
738 for (i = 0; i < extra.nr; i++)
739 register_shallow(extra.sha1[i]);
740
741 si->shallow_ref[cmd->index] = 0;
742 sha1_array_clear(&extra);
743 return 0;
744}
745
1a51b524
JH
746/*
747 * NEEDSWORK: we should consolidate various implementions of "are we
748 * on an unborn branch?" test into one, and make the unified one more
749 * robust. !get_sha1() based check used here and elsewhere would not
750 * allow us to tell an unborn branch from corrupt ref, for example.
751 * For the purpose of fixing "deploy-to-update does not work when
752 * pushing into an empty repository" issue, this should suffice for
753 * now.
754 */
755static int head_has_history(void)
756{
757 unsigned char sha1[20];
758
759 return !get_sha1("HEAD", sha1);
760}
761
21b138d0
JH
762static const char *push_to_deploy(unsigned char *sha1,
763 struct argv_array *env,
764 const char *work_tree)
1404bcbb
JS
765{
766 const char *update_refresh[] = {
767 "update-index", "-q", "--ignore-submodules", "--refresh", NULL
768 };
769 const char *diff_files[] = {
770 "diff-files", "--quiet", "--ignore-submodules", "--", NULL
771 };
772 const char *diff_index[] = {
773 "diff-index", "--quiet", "--cached", "--ignore-submodules",
1a51b524 774 NULL, "--", NULL
1404bcbb
JS
775 };
776 const char *read_tree[] = {
777 "read-tree", "-u", "-m", NULL, NULL
778 };
1404bcbb
JS
779 struct child_process child = CHILD_PROCESS_INIT;
780
1404bcbb 781 child.argv = update_refresh;
21b138d0 782 child.env = env->argv;
1404bcbb
JS
783 child.dir = work_tree;
784 child.no_stdin = 1;
785 child.stdout_to_stderr = 1;
786 child.git_cmd = 1;
21b138d0 787 if (run_command(&child))
1404bcbb 788 return "Up-to-date check failed";
1404bcbb
JS
789
790 /* run_command() does not clean up completely; reinitialize */
791 child_process_init(&child);
792 child.argv = diff_files;
21b138d0 793 child.env = env->argv;
1404bcbb
JS
794 child.dir = work_tree;
795 child.no_stdin = 1;
796 child.stdout_to_stderr = 1;
797 child.git_cmd = 1;
21b138d0 798 if (run_command(&child))
1404bcbb 799 return "Working directory has unstaged changes";
1404bcbb 800
1a51b524
JH
801 /* diff-index with either HEAD or an empty tree */
802 diff_index[4] = head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX;
803
1404bcbb
JS
804 child_process_init(&child);
805 child.argv = diff_index;
21b138d0 806 child.env = env->argv;
1404bcbb
JS
807 child.no_stdin = 1;
808 child.no_stdout = 1;
809 child.stdout_to_stderr = 0;
810 child.git_cmd = 1;
21b138d0 811 if (run_command(&child))
1404bcbb 812 return "Working directory has staged changes";
1404bcbb
JS
813
814 read_tree[3] = sha1_to_hex(sha1);
815 child_process_init(&child);
816 child.argv = read_tree;
21b138d0 817 child.env = env->argv;
1404bcbb
JS
818 child.dir = work_tree;
819 child.no_stdin = 1;
820 child.no_stdout = 1;
821 child.stdout_to_stderr = 0;
822 child.git_cmd = 1;
21b138d0 823 if (run_command(&child))
1404bcbb 824 return "Could not update working tree to new HEAD";
1404bcbb 825
1404bcbb
JS
826 return NULL;
827}
828
08553319
JH
829static const char *push_to_checkout_hook = "push-to-checkout";
830
831static const char *push_to_checkout(unsigned char *sha1,
832 struct argv_array *env,
833 const char *work_tree)
834{
835 argv_array_pushf(env, "GIT_WORK_TREE=%s", absolute_path(work_tree));
836 if (run_hook_le(env->argv, push_to_checkout_hook,
837 sha1_to_hex(sha1), NULL))
838 return "push-to-checkout hook declined";
839 else
840 return NULL;
841}
842
21b138d0
JH
843static const char *update_worktree(unsigned char *sha1)
844{
845 const char *retval;
846 const char *work_tree = git_work_tree_cfg ? git_work_tree_cfg : "..";
847 struct argv_array env = ARGV_ARRAY_INIT;
848
849 if (is_bare_repository())
850 return "denyCurrentBranch = updateInstead needs a worktree";
851
852 argv_array_pushf(&env, "GIT_DIR=%s", absolute_path(get_git_dir()));
853
08553319
JH
854 if (!find_hook(push_to_checkout_hook))
855 retval = push_to_deploy(sha1, &env, work_tree);
856 else
857 retval = push_to_checkout(sha1, &env, work_tree);
21b138d0
JH
858
859 argv_array_clear(&env);
860 return retval;
861}
862
0a1bc12b 863static const char *update(struct command *cmd, struct shallow_info *si)
2eca23da 864{
cfee10a7 865 const char *name = cmd->ref_name;
6b01ecfe 866 struct strbuf namespaced_name_buf = STRBUF_INIT;
1404bcbb 867 const char *namespaced_name, *ret;
cfee10a7
JH
868 unsigned char *old_sha1 = cmd->old_sha1;
869 unsigned char *new_sha1 = cmd->new_sha1;
2eca23da 870
061d6b9a 871 /* only refs/... are allowed */
59556548 872 if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
466dbc42 873 rp_error("refusing to create funny ref '%s' remotely", name);
8aaf7d64 874 return "funny refname";
cfee10a7 875 }
d8a1deec 876
6b01ecfe
JT
877 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
878 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
879
880 if (is_ref_checked_out(namespaced_name)) {
3d95d92b
JH
881 switch (deny_current_branch) {
882 case DENY_IGNORE:
986e8239 883 break;
3d95d92b 884 case DENY_WARN:
466dbc42 885 rp_warning("updating the current branch");
986e8239 886 break;
3d95d92b 887 case DENY_REFUSE:
acd2a45b 888 case DENY_UNCONFIGURED:
466dbc42 889 rp_error("refusing to update checked out branch: %s", name);
acd2a45b
JH
890 if (deny_current_branch == DENY_UNCONFIGURED)
891 refuse_unconfigured_deny();
3d95d92b 892 return "branch is currently checked out";
1404bcbb
JS
893 case DENY_UPDATE_INSTEAD:
894 ret = update_worktree(new_sha1);
895 if (ret)
896 return ret;
897 break;
3d95d92b 898 }
986e8239
JK
899 }
900
d4f694ba 901 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
8aaf7d64
SP
902 error("unpack should have generated %s, "
903 "but I can't find it!", sha1_to_hex(new_sha1));
904 return "bad pack";
cfee10a7 905 }
747ca245
JH
906
907 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
59556548 908 if (deny_deletes && starts_with(name, "refs/heads/")) {
466dbc42 909 rp_error("denying ref deletion for %s", name);
747ca245
JH
910 return "deletion prohibited";
911 }
912
6b01ecfe 913 if (!strcmp(namespaced_name, head_name)) {
747ca245
JH
914 switch (deny_delete_current) {
915 case DENY_IGNORE:
916 break;
917 case DENY_WARN:
466dbc42 918 rp_warning("deleting the current branch");
747ca245
JH
919 break;
920 case DENY_REFUSE:
375881fa 921 case DENY_UNCONFIGURED:
1404bcbb 922 case DENY_UPDATE_INSTEAD:
375881fa
JH
923 if (deny_delete_current == DENY_UNCONFIGURED)
924 refuse_unconfigured_deny_delete_current();
466dbc42 925 rp_error("refusing to delete the current branch: %s", name);
747ca245 926 return "deletion of the current branch prohibited";
1404bcbb
JS
927 default:
928 return "Invalid denyDeleteCurrent setting";
747ca245
JH
929 }
930 }
a240de11 931 }
747ca245 932
d4f694ba 933 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
ba988a83 934 !is_null_sha1(old_sha1) &&
59556548 935 starts_with(name, "refs/heads/")) {
eab82707 936 struct object *old_object, *new_object;
11031d7e 937 struct commit *old_commit, *new_commit;
11031d7e 938
eab82707
MK
939 old_object = parse_object(old_sha1);
940 new_object = parse_object(new_sha1);
941
942 if (!old_object || !new_object ||
943 old_object->type != OBJ_COMMIT ||
944 new_object->type != OBJ_COMMIT) {
945 error("bad sha1 objects for %s", name);
946 return "bad ref";
947 }
948 old_commit = (struct commit *)old_object;
949 new_commit = (struct commit *)new_object;
5d55915c 950 if (!in_merge_bases(old_commit, new_commit)) {
466dbc42
SP
951 rp_error("denying non-fast-forward %s"
952 " (you should pull first)", name);
a75d7b54 953 return "non-fast-forward";
8aaf7d64 954 }
11031d7e 955 }
1d9e8b56 956 if (run_update_hook(cmd)) {
466dbc42 957 rp_error("hook declined to update %s", name);
8aaf7d64 958 return "hook declined";
b1bf95bb 959 }
3159c8dc 960
d4f694ba 961 if (is_null_sha1(new_sha1)) {
222368c6 962 struct strbuf err = STRBUF_INIT;
28391a80 963 if (!parse_object(old_sha1)) {
28391a80 964 old_sha1 = NULL;
160b81ed
PYH
965 if (ref_exists(name)) {
966 rp_warning("Allowing deletion of corrupt ref.");
967 } else {
968 rp_warning("Deleting a non-existent ref.");
969 cmd->did_not_exist = 1;
970 }
28391a80 971 }
222368c6
SB
972 if (ref_transaction_delete(transaction,
973 namespaced_name,
974 old_sha1,
fb5a6bb6 975 0, "push", &err)) {
222368c6
SB
976 rp_error("%s", err.buf);
977 strbuf_release(&err);
8aaf7d64 978 return "failed to delete";
d4f694ba 979 }
222368c6 980 strbuf_release(&err);
8aaf7d64 981 return NULL; /* good */
d4f694ba
JH
982 }
983 else {
6629ea2d 984 struct strbuf err = STRBUF_INIT;
0a1bc12b
NTND
985 if (shallow_update && si->shallow_ref[cmd->index] &&
986 update_shallow_ref(cmd, si))
987 return "shallow error";
988
222368c6
SB
989 if (ref_transaction_update(transaction,
990 namespaced_name,
991 new_sha1, old_sha1,
1d147bdf 992 0, "push",
222368c6 993 &err)) {
6629ea2d
RS
994 rp_error("%s", err.buf);
995 strbuf_release(&err);
222368c6 996
6629ea2d 997 return "failed to update ref";
ef203f08 998 }
6629ea2d 999 strbuf_release(&err);
222368c6 1000
8aaf7d64 1001 return NULL; /* good */
19614330 1002 }
2eca23da
LT
1003}
1004
5e1c71fd 1005static void run_update_post_hook(struct command *commands)
19614330 1006{
5e1c71fd 1007 struct command *cmd;
6d525d38 1008 int argc;
9201c707 1009 const char **argv;
d3180279 1010 struct child_process proc = CHILD_PROCESS_INIT;
dcf69262 1011 const char *hook;
19614330 1012
5a7da2dc 1013 hook = find_hook("post-update");
5e1c71fd 1014 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
160b81ed 1015 if (cmd->error_string || cmd->did_not_exist)
19614330
JH
1016 continue;
1017 argc++;
1018 }
5a7da2dc 1019 if (!argc || !hook)
3e6e152c 1020 return;
5a7da2dc 1021
3e6e152c 1022 argv = xmalloc(sizeof(*argv) * (2 + argc));
5a7da2dc 1023 argv[0] = hook;
19614330 1024
5e1c71fd 1025 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
160b81ed 1026 if (cmd->error_string || cmd->did_not_exist)
19614330 1027 continue;
95244ae3 1028 argv[argc] = xstrdup(cmd->ref_name);
19614330
JH
1029 argc++;
1030 }
1031 argv[argc] = NULL;
6d525d38 1032
6d525d38
SP
1033 proc.no_stdin = 1;
1034 proc.stdout_to_stderr = 1;
1035 proc.err = use_sideband ? -1 : 0;
1036 proc.argv = argv;
1037
1038 if (!start_command(&proc)) {
1039 if (use_sideband)
1040 copy_to_sideband(proc.err, -1, NULL);
1041 finish_command(&proc);
1042 }
19614330 1043}
2eca23da 1044
da3efdb1
JS
1045static void check_aliased_update(struct command *cmd, struct string_list *list)
1046{
6b01ecfe
JT
1047 struct strbuf buf = STRBUF_INIT;
1048 const char *dst_name;
da3efdb1
JS
1049 struct string_list_item *item;
1050 struct command *dst_cmd;
1051 unsigned char sha1[20];
1052 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
1053 int flag;
1054
6b01ecfe 1055 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
7695d118 1056 dst_name = resolve_ref_unsafe(buf.buf, 0, sha1, &flag);
6b01ecfe 1057 strbuf_release(&buf);
da3efdb1
JS
1058
1059 if (!(flag & REF_ISSYMREF))
1060 return;
1061
6b01ecfe
JT
1062 dst_name = strip_namespace(dst_name);
1063 if (!dst_name) {
1064 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
1065 cmd->skip_update = 1;
1066 cmd->error_string = "broken symref";
1067 return;
1068 }
1069
e8c8b713 1070 if ((item = string_list_lookup(list, dst_name)) == NULL)
da3efdb1
JS
1071 return;
1072
1073 cmd->skip_update = 1;
1074
1075 dst_cmd = (struct command *) item->util;
1076
1077 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
1078 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
1079 return;
1080
1081 dst_cmd->skip_update = 1;
1082
1083 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
0e71bc30 1084 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
da3efdb1 1085 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
0e71bc30 1086 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
da3efdb1
JS
1087 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
1088 " its target '%s' (%s..%s)",
1089 cmd->ref_name, cmd_oldh, cmd_newh,
1090 dst_cmd->ref_name, dst_oldh, dst_newh);
1091
1092 cmd->error_string = dst_cmd->error_string =
1093 "inconsistent aliased update";
1094}
1095
1096static void check_aliased_updates(struct command *commands)
1097{
1098 struct command *cmd;
183113a5 1099 struct string_list ref_list = STRING_LIST_INIT_NODUP;
da3efdb1
JS
1100
1101 for (cmd = commands; cmd; cmd = cmd->next) {
1102 struct string_list_item *item =
1d2f80fa 1103 string_list_append(&ref_list, cmd->ref_name);
da3efdb1
JS
1104 item->util = (void *)cmd;
1105 }
3383e199 1106 string_list_sort(&ref_list);
da3efdb1 1107
ef7e93d9
CB
1108 for (cmd = commands; cmd; cmd = cmd->next) {
1109 if (!cmd->error_string)
1110 check_aliased_update(cmd, &ref_list);
1111 }
da3efdb1
JS
1112
1113 string_list_clear(&ref_list, 0);
1114}
1115
52fed6e1
JH
1116static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
1117{
1118 struct command **cmd_list = cb_data;
1119 struct command *cmd = *cmd_list;
1120
ee6dfb2d 1121 if (!cmd || is_null_sha1(cmd->new_sha1))
52fed6e1
JH
1122 return -1; /* end of list */
1123 *cmd_list = NULL; /* this returns only one */
1124 hashcpy(sha1, cmd->new_sha1);
1125 return 0;
1126}
1127
0a1bc12b
NTND
1128static void set_connectivity_errors(struct command *commands,
1129 struct shallow_info *si)
52fed6e1
JH
1130{
1131 struct command *cmd;
1132
1133 for (cmd = commands; cmd; cmd = cmd->next) {
1134 struct command *singleton = cmd;
0a1bc12b
NTND
1135 if (shallow_update && si->shallow_ref[cmd->index])
1136 /* to be checked in update_shallow_ref() */
1137 continue;
52fed6e1
JH
1138 if (!check_everything_connected(command_singleton_iterator,
1139 0, &singleton))
1140 continue;
1141 cmd->error_string = "missing necessary objects";
1142 }
1143}
1144
0a1bc12b
NTND
1145struct iterate_data {
1146 struct command *cmds;
1147 struct shallow_info *si;
1148};
1149
52fed6e1
JH
1150static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
1151{
0a1bc12b
NTND
1152 struct iterate_data *data = cb_data;
1153 struct command **cmd_list = &data->cmds;
52fed6e1
JH
1154 struct command *cmd = *cmd_list;
1155
0a1bc12b
NTND
1156 for (; cmd; cmd = cmd->next) {
1157 if (shallow_update && data->si->shallow_ref[cmd->index])
1158 /* to be checked in update_shallow_ref() */
1159 continue;
5dbd7676 1160 if (!is_null_sha1(cmd->new_sha1) && !cmd->skip_update) {
ee6dfb2d
JH
1161 hashcpy(sha1, cmd->new_sha1);
1162 *cmd_list = cmd->next;
1163 return 0;
1164 }
ee6dfb2d
JH
1165 }
1166 *cmd_list = NULL;
1167 return -1; /* end of list */
52fed6e1
JH
1168}
1169
daebaa78
JH
1170static void reject_updates_to_hidden(struct command *commands)
1171{
1172 struct command *cmd;
1173
1174 for (cmd = commands; cmd; cmd = cmd->next) {
1175 if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
1176 continue;
1177 if (is_null_sha1(cmd->new_sha1))
1178 cmd->error_string = "deny deleting a hidden ref";
1179 else
1180 cmd->error_string = "deny updating a hidden ref";
1181 }
1182}
1183
a6a84319
SB
1184static int should_process_cmd(struct command *cmd)
1185{
1186 return !cmd->error_string && !cmd->skip_update;
1187}
1188
1189static void warn_if_skipped_connectivity_check(struct command *commands,
1190 struct shallow_info *si)
1191{
1192 struct command *cmd;
1193 int checked_connectivity = 1;
1194
1195 for (cmd = commands; cmd; cmd = cmd->next) {
1196 if (should_process_cmd(cmd) && si->shallow_ref[cmd->index]) {
1197 error("BUG: connectivity check has not been run on ref %s",
1198 cmd->ref_name);
1199 checked_connectivity = 0;
1200 }
1201 }
1202 if (!checked_connectivity)
b6a47885 1203 die("BUG: connectivity check skipped???");
a6a84319
SB
1204}
1205
a1a26145
SB
1206static void execute_commands_non_atomic(struct command *commands,
1207 struct shallow_info *si)
1208{
1209 struct command *cmd;
222368c6
SB
1210 struct strbuf err = STRBUF_INIT;
1211
a1a26145
SB
1212 for (cmd = commands; cmd; cmd = cmd->next) {
1213 if (!should_process_cmd(cmd))
1214 continue;
1215
222368c6
SB
1216 transaction = ref_transaction_begin(&err);
1217 if (!transaction) {
1218 rp_error("%s", err.buf);
1219 strbuf_reset(&err);
1220 cmd->error_string = "transaction failed to start";
1221 continue;
1222 }
1223
a1a26145 1224 cmd->error_string = update(cmd, si);
222368c6
SB
1225
1226 if (!cmd->error_string
1227 && ref_transaction_commit(transaction, &err)) {
1228 rp_error("%s", err.buf);
1229 strbuf_reset(&err);
1230 cmd->error_string = "failed to update ref";
1231 }
1232 ref_transaction_free(transaction);
a1a26145 1233 }
68deed29
SB
1234 strbuf_release(&err);
1235}
222368c6 1236
68deed29
SB
1237static void execute_commands_atomic(struct command *commands,
1238 struct shallow_info *si)
1239{
1240 struct command *cmd;
1241 struct strbuf err = STRBUF_INIT;
1242 const char *reported_error = "atomic push failure";
1243
1244 transaction = ref_transaction_begin(&err);
1245 if (!transaction) {
1246 rp_error("%s", err.buf);
1247 strbuf_reset(&err);
1248 reported_error = "transaction failed to start";
1249 goto failure;
1250 }
1251
1252 for (cmd = commands; cmd; cmd = cmd->next) {
1253 if (!should_process_cmd(cmd))
1254 continue;
1255
1256 cmd->error_string = update(cmd, si);
1257
1258 if (cmd->error_string)
1259 goto failure;
1260 }
1261
1262 if (ref_transaction_commit(transaction, &err)) {
1263 rp_error("%s", err.buf);
1264 reported_error = "atomic transaction failed";
1265 goto failure;
1266 }
1267 goto cleanup;
1268
1269failure:
1270 for (cmd = commands; cmd; cmd = cmd->next)
1271 if (!cmd->error_string)
1272 cmd->error_string = reported_error;
1273
1274cleanup:
1275 ref_transaction_free(transaction);
222368c6 1276 strbuf_release(&err);
a1a26145
SB
1277}
1278
0a1bc12b
NTND
1279static void execute_commands(struct command *commands,
1280 const char *unpacker_error,
1281 struct shallow_info *si)
575f4974 1282{
5e1c71fd 1283 struct command *cmd;
747ca245 1284 unsigned char sha1[20];
0a1bc12b 1285 struct iterate_data data;
8aaf7d64
SP
1286
1287 if (unpacker_error) {
5e1c71fd 1288 for (cmd = commands; cmd; cmd = cmd->next)
74eb32d3 1289 cmd->error_string = "unpacker error";
8aaf7d64
SP
1290 return;
1291 }
1292
0a1bc12b
NTND
1293 data.cmds = commands;
1294 data.si = si;
1295 if (check_everything_connected(iterate_receive_command_list, 0, &data))
1296 set_connectivity_errors(commands, si);
52fed6e1 1297
daebaa78
JH
1298 reject_updates_to_hidden(commands);
1299
5a7da2dc 1300 if (run_receive_hook(commands, "pre-receive", 0)) {
ef7e93d9
CB
1301 for (cmd = commands; cmd; cmd = cmd->next) {
1302 if (!cmd->error_string)
1303 cmd->error_string = "pre-receive hook declined";
1304 }
05ef58ec
SP
1305 return;
1306 }
1307
da3efdb1
JS
1308 check_aliased_updates(commands);
1309
96ec7b1e 1310 free(head_name_to_free);
7695d118 1311 head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL);
747ca245 1312
68deed29
SB
1313 if (use_atomic)
1314 execute_commands_atomic(commands, si);
1315 else
1316 execute_commands_non_atomic(commands, si);
0a1bc12b 1317
a6a84319
SB
1318 if (shallow_update)
1319 warn_if_skipped_connectivity_check(commands, si);
575f4974
LT
1320}
1321
39895c74
JH
1322static struct command **queue_command(struct command **tail,
1323 const char *line,
1324 int linelen)
1325{
1326 unsigned char old_sha1[20], new_sha1[20];
1327 struct command *cmd;
1328 const char *refname;
1329 int reflen;
1330
1331 if (linelen < 83 ||
1332 line[40] != ' ' ||
1333 line[81] != ' ' ||
1334 get_sha1_hex(line, old_sha1) ||
1335 get_sha1_hex(line + 41, new_sha1))
1336 die("protocol error: expected old/new/ref, got '%s'", line);
1337
1338 refname = line + 82;
1339 reflen = linelen - 82;
1340 cmd = xcalloc(1, sizeof(struct command) + reflen + 1);
1341 hashcpy(cmd->old_sha1, old_sha1);
1342 hashcpy(cmd->new_sha1, new_sha1);
1343 memcpy(cmd->ref_name, refname, reflen);
1344 cmd->ref_name[reflen] = '\0';
1345 *tail = cmd;
1346 return &cmd->next;
1347}
1348
4adf569d
JH
1349static void queue_commands_from_cert(struct command **tail,
1350 struct strbuf *push_cert)
1351{
1352 const char *boc, *eoc;
1353
1354 if (*tail)
1355 die("protocol error: got both push certificate and unsigned commands");
1356
1357 boc = strstr(push_cert->buf, "\n\n");
1358 if (!boc)
1359 die("malformed push certificate %.*s", 100, push_cert->buf);
1360 else
1361 boc += 2;
1362 eoc = push_cert->buf + parse_signature(push_cert->buf, push_cert->len);
1363
1364 while (boc < eoc) {
1365 const char *eol = memchr(boc, '\n', eoc - boc);
1366 tail = queue_command(tail, boc, eol ? eol - boc : eoc - eol);
1367 boc = eol ? eol + 1 : eoc;
1368 }
1369}
1370
5dbd7676 1371static struct command *read_head_info(struct sha1_array *shallow)
575f4974 1372{
5e1c71fd 1373 struct command *commands = NULL;
eb1af2df 1374 struct command **p = &commands;
575f4974 1375 for (;;) {
74543a04 1376 char *line;
39895c74 1377 int len, linelen;
eb1af2df 1378
74543a04
JK
1379 line = packet_read_line(0, &len);
1380 if (!line)
575f4974 1381 break;
5dbd7676 1382
92251b1b 1383 if (len == 48 && starts_with(line, "shallow ")) {
c09b71cc
JH
1384 unsigned char sha1[20];
1385 if (get_sha1_hex(line + 8, sha1))
1386 die("protocol error: expected shallow sha, got '%s'",
1387 line + 8);
1388 sha1_array_append(shallow, sha1);
5dbd7676
NTND
1389 continue;
1390 }
1391
0e3c339b
JH
1392 linelen = strlen(line);
1393 if (linelen < len) {
1394 const char *feature_list = line + linelen + 1;
f47182c8 1395 if (parse_feature_request(feature_list, "report-status"))
cfee10a7 1396 report_status = 1;
f47182c8 1397 if (parse_feature_request(feature_list, "side-band-64k"))
38a81b4e 1398 use_sideband = LARGE_PACKET_MAX;
c207e34f
CB
1399 if (parse_feature_request(feature_list, "quiet"))
1400 quiet = 1;
1b70fe5d
RS
1401 if (advertise_atomic_push
1402 && parse_feature_request(feature_list, "atomic"))
1403 use_atomic = 1;
cfee10a7 1404 }
0e3c339b 1405
a85b377d
JH
1406 if (!strcmp(line, "push-cert")) {
1407 int true_flush = 0;
1408 char certbuf[1024];
1409
1410 for (;;) {
1411 len = packet_read(0, NULL, NULL,
1412 certbuf, sizeof(certbuf), 0);
1413 if (!len) {
1414 true_flush = 1;
1415 break;
1416 }
1417 if (!strcmp(certbuf, "push-cert-end\n"))
1418 break; /* end of cert */
1419 strbuf_addstr(&push_cert, certbuf);
1420 }
1421
1422 if (true_flush)
1423 break;
1424 continue;
1425 }
1426
39895c74 1427 p = queue_command(p, line, linelen);
575f4974 1428 }
4adf569d
JH
1429
1430 if (push_cert.len)
1431 queue_commands_from_cert(p, &push_cert);
1432
5e1c71fd 1433 return commands;
575f4974
LT
1434}
1435
fc04c412
SP
1436static const char *parse_pack_header(struct pack_header *hdr)
1437{
a69e5429
JH
1438 switch (read_pack_header(0, hdr)) {
1439 case PH_ERROR_EOF:
1440 return "eof before pack header was fully read";
1441
1442 case PH_ERROR_PACK_SIGNATURE:
fc04c412 1443 return "protocol error (pack signature mismatch detected)";
a69e5429
JH
1444
1445 case PH_ERROR_PROTOCOL:
fc04c412 1446 return "protocol error (pack version unsupported)";
a69e5429
JH
1447
1448 default:
1449 return "unknown error in parse_pack_header";
1450
1451 case 0:
1452 return NULL;
1453 }
fc04c412
SP
1454}
1455
576162a4
NP
1456static const char *pack_lockfile;
1457
5dbd7676 1458static const char *unpack(int err_fd, struct shallow_info *si)
575f4974 1459{
fc04c412
SP
1460 struct pack_header hdr;
1461 const char *hdr_err;
31c42bff 1462 int status;
fc04c412 1463 char hdr_arg[38];
d3180279 1464 struct child_process child = CHILD_PROCESS_INIT;
dab76d3a
JH
1465 int fsck_objects = (receive_fsck_objects >= 0
1466 ? receive_fsck_objects
1467 : transfer_fsck_objects >= 0
1468 ? transfer_fsck_objects
1469 : 0);
fc04c412
SP
1470
1471 hdr_err = parse_pack_header(&hdr);
49ecfa13
JK
1472 if (hdr_err) {
1473 if (err_fd > 0)
1474 close(err_fd);
fc04c412 1475 return hdr_err;
49ecfa13 1476 }
6e1c2344
RJ
1477 snprintf(hdr_arg, sizeof(hdr_arg),
1478 "--pack_header=%"PRIu32",%"PRIu32,
fc04c412
SP
1479 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
1480
5dbd7676
NTND
1481 if (si->nr_ours || si->nr_theirs) {
1482 alt_shallow_file = setup_temporary_shallow(si->shallow);
64a7e92f
RS
1483 argv_array_push(&child.args, "--shallow-file");
1484 argv_array_push(&child.args, alt_shallow_file);
5dbd7676
NTND
1485 }
1486
fc04c412 1487 if (ntohl(hdr.hdr_entries) < unpack_limit) {
64a7e92f 1488 argv_array_pushl(&child.args, "unpack-objects", hdr_arg, NULL);
c207e34f 1489 if (quiet)
64a7e92f 1490 argv_array_push(&child.args, "-q");
dab76d3a 1491 if (fsck_objects)
64a7e92f 1492 argv_array_push(&child.args, "--strict");
59bfdfb8 1493 child.no_stdout = 1;
a22e6f85 1494 child.err = err_fd;
59bfdfb8 1495 child.git_cmd = 1;
31c42bff
NTND
1496 status = run_command(&child);
1497 if (status)
1498 return "unpack-objects abnormal exit";
576162a4 1499 } else {
31c42bff 1500 int s;
576162a4 1501 char keep_arg[256];
576162a4 1502
85e72830 1503 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
576162a4
NP
1504 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
1505 strcpy(keep_arg + s, "localhost");
1506
64a7e92f 1507 argv_array_pushl(&child.args, "index-pack",
31c42bff 1508 "--stdin", hdr_arg, keep_arg, NULL);
dab76d3a 1509 if (fsck_objects)
64a7e92f 1510 argv_array_push(&child.args, "--strict");
f7c815c3 1511 if (fix_thin)
64a7e92f 1512 argv_array_push(&child.args, "--fix-thin");
31c42bff
NTND
1513 child.out = -1;
1514 child.err = err_fd;
1515 child.git_cmd = 1;
1516 status = start_command(&child);
1517 if (status)
576162a4 1518 return "index-pack fork failed";
31c42bff
NTND
1519 pack_lockfile = index_pack_lockfile(child.out);
1520 close(child.out);
1521 status = finish_command(&child);
1522 if (status)
1523 return "index-pack abnormal exit";
1524 reprepare_packed_git();
cfee10a7 1525 }
31c42bff 1526 return NULL;
cfee10a7
JH
1527}
1528
5dbd7676 1529static const char *unpack_with_sideband(struct shallow_info *si)
a22e6f85
JK
1530{
1531 struct async muxer;
1532 const char *ret;
1533
1534 if (!use_sideband)
5dbd7676 1535 return unpack(0, si);
a22e6f85
JK
1536
1537 memset(&muxer, 0, sizeof(muxer));
1538 muxer.proc = copy_to_sideband;
1539 muxer.in = -1;
1540 if (start_async(&muxer))
1541 return NULL;
1542
5dbd7676 1543 ret = unpack(muxer.in, si);
a22e6f85
JK
1544
1545 finish_async(&muxer);
1546 return ret;
1547}
1548
0a1bc12b
NTND
1549static void prepare_shallow_update(struct command *commands,
1550 struct shallow_info *si)
1551{
1552 int i, j, k, bitmap_size = (si->ref->nr + 31) / 32;
1553
1554 si->used_shallow = xmalloc(sizeof(*si->used_shallow) *
1555 si->shallow->nr);
1556 assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
1557
1558 si->need_reachability_test =
1559 xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
1560 si->reachable =
1561 xcalloc(si->shallow->nr, sizeof(*si->reachable));
1562 si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
1563
1564 for (i = 0; i < si->nr_ours; i++)
1565 si->need_reachability_test[si->ours[i]] = 1;
1566
1567 for (i = 0; i < si->shallow->nr; i++) {
1568 if (!si->used_shallow[i])
1569 continue;
1570 for (j = 0; j < bitmap_size; j++) {
1571 if (!si->used_shallow[i][j])
1572 continue;
1573 si->need_reachability_test[i]++;
1574 for (k = 0; k < 32; k++)
1575 if (si->used_shallow[i][j] & (1 << k))
1576 si->shallow_ref[j * 32 + k]++;
1577 }
1578
1579 /*
1580 * true for those associated with some refs and belong
1581 * in "ours" list aka "step 7 not done yet"
1582 */
1583 si->need_reachability_test[i] =
1584 si->need_reachability_test[i] > 1;
1585 }
1586
1587 /*
1588 * keep hooks happy by forcing a temporary shallow file via
1589 * env variable because we can't add --shallow-file to every
1590 * command. check_everything_connected() will be done with
1591 * true .git/shallow though.
1592 */
1593 setenv(GIT_SHALLOW_FILE_ENVIRONMENT, alt_shallow_file, 1);
1594}
1595
5dbd7676
NTND
1596static void update_shallow_info(struct command *commands,
1597 struct shallow_info *si,
1598 struct sha1_array *ref)
1599{
1600 struct command *cmd;
1601 int *ref_status;
1602 remove_nonexistent_theirs_shallow(si);
0a1bc12b
NTND
1603 if (!si->nr_ours && !si->nr_theirs) {
1604 shallow_update = 0;
5dbd7676 1605 return;
0a1bc12b 1606 }
5dbd7676
NTND
1607
1608 for (cmd = commands; cmd; cmd = cmd->next) {
1609 if (is_null_sha1(cmd->new_sha1))
1610 continue;
1611 sha1_array_append(ref, cmd->new_sha1);
1612 cmd->index = ref->nr - 1;
1613 }
1614 si->ref = ref;
1615
0a1bc12b
NTND
1616 if (shallow_update) {
1617 prepare_shallow_update(commands, si);
1618 return;
1619 }
1620
5dbd7676
NTND
1621 ref_status = xmalloc(sizeof(*ref_status) * ref->nr);
1622 assign_shallow_commits_to_refs(si, NULL, ref_status);
1623 for (cmd = commands; cmd; cmd = cmd->next) {
1624 if (is_null_sha1(cmd->new_sha1))
1625 continue;
1626 if (ref_status[cmd->index]) {
1627 cmd->error_string = "shallow update not allowed";
1628 cmd->skip_update = 1;
1629 }
1630 }
5dbd7676
NTND
1631 free(ref_status);
1632}
1633
5e1c71fd 1634static void report(struct command *commands, const char *unpack_status)
cfee10a7
JH
1635{
1636 struct command *cmd;
38a81b4e
SP
1637 struct strbuf buf = STRBUF_INIT;
1638
1639 packet_buf_write(&buf, "unpack %s\n",
1640 unpack_status ? unpack_status : "ok");
cfee10a7
JH
1641 for (cmd = commands; cmd; cmd = cmd->next) {
1642 if (!cmd->error_string)
38a81b4e
SP
1643 packet_buf_write(&buf, "ok %s\n",
1644 cmd->ref_name);
cfee10a7 1645 else
38a81b4e
SP
1646 packet_buf_write(&buf, "ng %s %s\n",
1647 cmd->ref_name, cmd->error_string);
575f4974 1648 }
38a81b4e
SP
1649 packet_buf_flush(&buf);
1650
1651 if (use_sideband)
1652 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
1653 else
cdf4fb8e 1654 write_or_die(1, buf.buf, buf.len);
38a81b4e 1655 strbuf_release(&buf);
575f4974
LT
1656}
1657
5e1c71fd 1658static int delete_only(struct command *commands)
d4f694ba 1659{
5e1c71fd
JS
1660 struct command *cmd;
1661 for (cmd = commands; cmd; cmd = cmd->next) {
d4f694ba
JH
1662 if (!is_null_sha1(cmd->new_sha1))
1663 return 0;
d4f694ba
JH
1664 }
1665 return 1;
1666}
1667
be5908ae 1668int cmd_receive_pack(int argc, const char **argv, const char *prefix)
575f4974 1669{
42526b47 1670 int advertise_refs = 0;
d0efc8a7 1671 int i;
5e1c71fd 1672 struct command *commands;
5dbd7676
NTND
1673 struct sha1_array shallow = SHA1_ARRAY_INIT;
1674 struct sha1_array ref = SHA1_ARRAY_INIT;
1675 struct shallow_info si;
575f4974 1676
bbc30f99
JK
1677 packet_trace_identity("receive-pack");
1678
575f4974
LT
1679 argv++;
1680 for (i = 1; i < argc; i++) {
be5908ae 1681 const char *arg = *argv++;
575f4974
LT
1682
1683 if (*arg == '-') {
c207e34f
CB
1684 if (!strcmp(arg, "--quiet")) {
1685 quiet = 1;
1686 continue;
1687 }
1688
42526b47
SP
1689 if (!strcmp(arg, "--advertise-refs")) {
1690 advertise_refs = 1;
1691 continue;
1692 }
1693 if (!strcmp(arg, "--stateless-rpc")) {
1694 stateless_rpc = 1;
1695 continue;
1696 }
f7c815c3
NTND
1697 if (!strcmp(arg, "--reject-thin-pack-for-testing")) {
1698 fix_thin = 0;
1699 continue;
1700 }
42526b47 1701
575f4974
LT
1702 usage(receive_pack_usage);
1703 }
5732373d 1704 if (service_dir)
d0efc8a7 1705 usage(receive_pack_usage);
5732373d 1706 service_dir = arg;
575f4974 1707 }
5732373d 1708 if (!service_dir)
575f4974
LT
1709 usage(receive_pack_usage);
1710
e1464ca7 1711 setup_path();
5c09f321 1712
5732373d
JH
1713 if (!enter_repo(service_dir, 0))
1714 die("'%s' does not appear to be a git repository", service_dir);
575f4974 1715
ef90d6d4 1716 git_config(receive_pack_config, NULL);
b89363e4 1717 if (cert_nonce_seed)
5732373d 1718 push_cert_nonce = prepare_push_cert_nonce(service_dir, time(NULL));
6fb75bed 1719
e28714c5
JH
1720 if (0 <= transfer_unpack_limit)
1721 unpack_limit = transfer_unpack_limit;
1722 else if (0 <= receive_unpack_limit)
1723 unpack_limit = receive_unpack_limit;
1724
42526b47 1725 if (advertise_refs || !stateless_rpc) {
42526b47 1726 write_head_info();
42526b47
SP
1727 }
1728 if (advertise_refs)
1729 return 0;
575f4974 1730
5dbd7676 1731 if ((commands = read_head_info(&shallow)) != NULL) {
d4f694ba
JH
1732 const char *unpack_status = NULL;
1733
5dbd7676 1734 prepare_shallow_info(&si, &shallow);
0a1bc12b
NTND
1735 if (!si.nr_ours && !si.nr_theirs)
1736 shallow_update = 0;
5dbd7676
NTND
1737 if (!delete_only(commands)) {
1738 unpack_status = unpack_with_sideband(&si);
1739 update_shallow_info(commands, &si, &ref);
1740 }
0a1bc12b 1741 execute_commands(commands, unpack_status, &si);
576162a4 1742 if (pack_lockfile)
691f1a28 1743 unlink_or_warn(pack_lockfile);
cfee10a7 1744 if (report_status)
5e1c71fd 1745 report(commands, unpack_status);
5a7da2dc 1746 run_receive_hook(commands, "post-receive", 1);
8e663d9e 1747 run_update_post_hook(commands);
77e3efbf
JH
1748 if (auto_gc) {
1749 const char *argv_gc_auto[] = {
1750 "gc", "--auto", "--quiet", NULL,
1751 };
4b7f2fa4
JH
1752 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1753 run_command_v_opt(argv_gc_auto, opt);
77e3efbf
JH
1754 }
1755 if (auto_update_server_info)
1756 update_server_info(0);
5dbd7676 1757 clear_shallow_info(&si);
7f8e9828 1758 }
38a81b4e
SP
1759 if (use_sideband)
1760 packet_flush(1);
5dbd7676
NTND
1761 sha1_array_clear(&shallow);
1762 sha1_array_clear(&ref);
b89363e4 1763 free((void *)push_cert_nonce);
575f4974
LT
1764 return 0;
1765}