]> git.ipfire.org Git - thirdparty/git.git/blame - builtin/receive-pack.c
pkt-line: move LARGE_PACKET_MAX definition from sideband
[thirdparty/git.git] / builtin / receive-pack.c
CommitLineData
1e4cd68c 1#include "builtin.h"
fc04c412 2#include "pack.h"
8a65ff76 3#include "refs.h"
f3a3214e 4#include "pkt-line.h"
38a81b4e 5#include "sideband.h"
b1bf95bb 6#include "run-command.h"
576162a4 7#include "exec_cmd.h"
11031d7e
JS
8#include "commit.h"
9#include "object.h"
d79796bc
JH
10#include "remote.h"
11#include "transport.h"
da3efdb1 12#include "string-list.h"
cff38a5e 13#include "sha1-array.h"
52fed6e1 14#include "connected.h"
ff5effdf 15#include "version.h"
575f4974 16
34263de0 17static const char receive_pack_usage[] = "git receive-pack <git-dir>";
575f4974 18
986e8239 19enum deny_action {
3d95d92b 20 DENY_UNCONFIGURED,
986e8239
JK
21 DENY_IGNORE,
22 DENY_WARN,
4b05548f 23 DENY_REFUSE
986e8239
JK
24};
25
1b53a076
JH
26static int deny_deletes;
27static int deny_non_fast_forwards;
3d95d92b 28static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
747ca245 29static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
dab76d3a
JH
30static int receive_fsck_objects = -1;
31static int transfer_fsck_objects = -1;
e28714c5
JH
32static int receive_unpack_limit = -1;
33static int transfer_unpack_limit = -1;
46732fae 34static int unpack_limit = 100;
96f1e58f 35static int report_status;
38a81b4e 36static int use_sideband;
c207e34f 37static int quiet;
b74fce16 38static int prefer_ofs_delta = 1;
77e3efbf
JH
39static int auto_update_server_info;
40static int auto_gc = 1;
747ca245 41static const char *head_name;
96ec7b1e 42static void *head_name_to_free;
185c04e0 43static int sent_capabilities;
cfee10a7 44
986e8239
JK
45static enum deny_action parse_deny_action(const char *var, const char *value)
46{
47 if (value) {
48 if (!strcasecmp(value, "ignore"))
49 return DENY_IGNORE;
50 if (!strcasecmp(value, "warn"))
51 return DENY_WARN;
52 if (!strcasecmp(value, "refuse"))
53 return DENY_REFUSE;
54 }
55 if (git_config_bool(var, value))
56 return DENY_REFUSE;
57 return DENY_IGNORE;
58}
59
ef90d6d4 60static int receive_pack_config(const char *var, const char *value, void *cb)
6fb75bed 61{
daebaa78
JH
62 int status = parse_hide_refs_config(var, value, "receive");
63
64 if (status)
65 return status;
66
a240de11
JK
67 if (strcmp(var, "receive.denydeletes") == 0) {
68 deny_deletes = git_config_bool(var, value);
69 return 0;
70 }
71
e28714c5 72 if (strcmp(var, "receive.denynonfastforwards") == 0) {
6fb75bed
SP
73 deny_non_fast_forwards = git_config_bool(var, value);
74 return 0;
75 }
76
e28714c5
JH
77 if (strcmp(var, "receive.unpacklimit") == 0) {
78 receive_unpack_limit = git_config_int(var, value);
fc04c412
SP
79 return 0;
80 }
81
e28714c5
JH
82 if (strcmp(var, "transfer.unpacklimit") == 0) {
83 transfer_unpack_limit = git_config_int(var, value);
84 return 0;
85 }
86
20dc0016
MK
87 if (strcmp(var, "receive.fsckobjects") == 0) {
88 receive_fsck_objects = git_config_bool(var, value);
89 return 0;
90 }
91
dab76d3a
JH
92 if (strcmp(var, "transfer.fsckobjects") == 0) {
93 transfer_fsck_objects = git_config_bool(var, value);
94 return 0;
95 }
96
986e8239
JK
97 if (!strcmp(var, "receive.denycurrentbranch")) {
98 deny_current_branch = parse_deny_action(var, value);
99 return 0;
100 }
101
747ca245
JH
102 if (strcmp(var, "receive.denydeletecurrent") == 0) {
103 deny_delete_current = parse_deny_action(var, value);
104 return 0;
105 }
106
b74fce16
NP
107 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
108 prefer_ofs_delta = git_config_bool(var, value);
109 return 0;
110 }
111
77e3efbf
JH
112 if (strcmp(var, "receive.updateserverinfo") == 0) {
113 auto_update_server_info = git_config_bool(var, value);
114 return 0;
115 }
116
117 if (strcmp(var, "receive.autogc") == 0) {
118 auto_gc = git_config_bool(var, value);
119 return 0;
120 }
121
ef90d6d4 122 return git_default_config(var, value, cb);
6fb75bed
SP
123}
124
bc98201d 125static void show_ref(const char *path, const unsigned char *sha1)
575f4974 126{
daebaa78
JH
127 if (ref_is_hidden(path))
128 return;
129
185c04e0 130 if (sent_capabilities)
cfee10a7
JH
131 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
132 else
ff5effdf 133 packet_write(1, "%s %s%c%s%s agent=%s\n",
185c04e0 134 sha1_to_hex(sha1), path, 0,
c207e34f 135 " report-status delete-refs side-band-64k quiet",
ff5effdf
JK
136 prefer_ofs_delta ? " ofs-delta" : "",
137 git_user_agent_sanitized());
185c04e0 138 sent_capabilities = 1;
575f4974
LT
139}
140
bc98201d 141static int show_ref_cb(const char *path, const unsigned char *sha1, int flag, void *unused)
6b01ecfe
JT
142{
143 path = strip_namespace(path);
144 /*
145 * Advertise refs outside our current namespace as ".have"
146 * refs, so that the client can use them to minimize data
147 * transfer but will otherwise ignore them. This happens to
148 * cover ".have" that are thrown in by add_one_alternate_ref()
149 * to mark histories that are complete in our alternates as
150 * well.
151 */
152 if (!path)
153 path = ".have";
bc98201d
MH
154 show_ref(path, sha1);
155 return 0;
6b01ecfe
JT
156}
157
85f25104 158static void show_one_alternate_sha1(const unsigned char sha1[20], void *unused)
b7a025d9 159{
85f25104 160 show_ref(".have", sha1);
b7a025d9
MH
161}
162
163static void collect_one_alternate_ref(const struct ref *ref, void *data)
164{
165 struct sha1_array *sa = data;
166 sha1_array_append(sa, ref->old_sha1);
6b01ecfe
JT
167}
168
8a65ff76 169static void write_head_info(void)
575f4974 170{
b7a025d9
MH
171 struct sha1_array sa = SHA1_ARRAY_INIT;
172 for_each_alternate_ref(collect_one_alternate_ref, &sa);
85f25104 173 sha1_array_for_each_unique(&sa, show_one_alternate_sha1, NULL);
b7a025d9 174 sha1_array_clear(&sa);
6b01ecfe 175 for_each_ref(show_ref_cb, NULL);
185c04e0 176 if (!sent_capabilities)
bc98201d 177 show_ref("capabilities^{}", null_sha1);
cfee10a7 178
b7a025d9
MH
179 /* EOF */
180 packet_flush(1);
575f4974
LT
181}
182
eb1af2df
LT
183struct command {
184 struct command *next;
cfee10a7 185 const char *error_string;
160b81ed
PYH
186 unsigned int skip_update:1,
187 did_not_exist:1;
eb1af2df
LT
188 unsigned char old_sha1[20];
189 unsigned char new_sha1[20];
8f1d2e6f 190 char ref_name[FLEX_ARRAY]; /* more */
575f4974
LT
191};
192
466dbc42
SP
193static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
194static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
195
196static void report_message(const char *prefix, const char *err, va_list params)
197{
198 int sz = strlen(prefix);
199 char msg[4096];
200
201 strncpy(msg, prefix, sz);
202 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
203 if (sz > (sizeof(msg) - 1))
204 sz = sizeof(msg) - 1;
205 msg[sz++] = '\n';
206
207 if (use_sideband)
208 send_sideband(1, 2, msg, sz, use_sideband);
209 else
210 xwrite(2, msg, sz);
211}
212
213static void rp_warning(const char *err, ...)
214{
215 va_list params;
216 va_start(params, err);
217 report_message("warning: ", err, params);
218 va_end(params);
219}
220
221static void rp_error(const char *err, ...)
222{
223 va_list params;
224 va_start(params, err);
225 report_message("error: ", err, params);
226 va_end(params);
227}
228
6d525d38
SP
229static int copy_to_sideband(int in, int out, void *arg)
230{
231 char data[128];
232 while (1) {
233 ssize_t sz = xread(in, data, sizeof(data));
234 if (sz <= 0)
235 break;
236 send_sideband(1, 2, data, sz, use_sideband);
237 }
238 close(in);
239 return 0;
240}
241
9684e44a
JH
242typedef int (*feed_fn)(void *, const char **, size_t *);
243static int run_and_feed_hook(const char *hook_name, feed_fn feed, void *feed_state)
b1bf95bb 244{
f43cd49f 245 struct child_process proc;
6d525d38 246 struct async muxer;
f43cd49f 247 const char *argv[2];
9684e44a 248 int code;
b1bf95bb 249
5a7da2dc
AS
250 argv[0] = find_hook(hook_name);
251 if (!argv[0])
b1bf95bb 252 return 0;
c8dd2771 253
f43cd49f
SP
254 argv[1] = NULL;
255
256 memset(&proc, 0, sizeof(proc));
257 proc.argv = argv;
258 proc.in = -1;
259 proc.stdout_to_stderr = 1;
260
6d525d38
SP
261 if (use_sideband) {
262 memset(&muxer, 0, sizeof(muxer));
263 muxer.proc = copy_to_sideband;
264 muxer.in = -1;
265 code = start_async(&muxer);
266 if (code)
267 return code;
268 proc.err = muxer.in;
269 }
270
f43cd49f 271 code = start_command(&proc);
6d525d38
SP
272 if (code) {
273 if (use_sideband)
274 finish_async(&muxer);
90e41a89 275 return code;
6d525d38
SP
276 }
277
9684e44a
JH
278 while (1) {
279 const char *buf;
280 size_t n;
281 if (feed(feed_state, &buf, &n))
282 break;
283 if (write_in_full(proc.in, buf, n) != n)
284 break;
c8dd2771 285 }
e72ae288 286 close(proc.in);
6d525d38
SP
287 if (use_sideband)
288 finish_async(&muxer);
90e41a89 289 return finish_command(&proc);
b1bf95bb
JW
290}
291
9684e44a
JH
292struct receive_hook_feed_state {
293 struct command *cmd;
cdc2b2f3 294 int skip_broken;
9684e44a
JH
295 struct strbuf buf;
296};
297
298static int feed_receive_hook(void *state_, const char **bufp, size_t *sizep)
299{
300 struct receive_hook_feed_state *state = state_;
301 struct command *cmd = state->cmd;
302
cdc2b2f3
JH
303 while (cmd &&
304 state->skip_broken && (cmd->error_string || cmd->did_not_exist))
9684e44a
JH
305 cmd = cmd->next;
306 if (!cmd)
307 return -1; /* EOF */
308 strbuf_reset(&state->buf);
309 strbuf_addf(&state->buf, "%s %s %s\n",
310 sha1_to_hex(cmd->old_sha1), sha1_to_hex(cmd->new_sha1),
311 cmd->ref_name);
312 state->cmd = cmd->next;
313 if (bufp) {
314 *bufp = state->buf.buf;
315 *sizep = state->buf.len;
316 }
317 return 0;
318}
319
cdc2b2f3
JH
320static int run_receive_hook(struct command *commands, const char *hook_name,
321 int skip_broken)
9684e44a
JH
322{
323 struct receive_hook_feed_state state;
324 int status;
325
326 strbuf_init(&state.buf, 0);
327 state.cmd = commands;
cdc2b2f3 328 state.skip_broken = skip_broken;
9684e44a
JH
329 if (feed_receive_hook(&state, NULL, NULL))
330 return 0;
331 state.cmd = commands;
332 status = run_and_feed_hook(hook_name, feed_receive_hook, &state);
333 strbuf_release(&state.buf);
334 return status;
335}
336
1d9e8b56
SP
337static int run_update_hook(struct command *cmd)
338{
1d9e8b56 339 const char *argv[5];
6d525d38
SP
340 struct child_process proc;
341 int code;
1d9e8b56 342
5a7da2dc
AS
343 argv[0] = find_hook("update");
344 if (!argv[0])
1d9e8b56
SP
345 return 0;
346
1d9e8b56
SP
347 argv[1] = cmd->ref_name;
348 argv[2] = sha1_to_hex(cmd->old_sha1);
349 argv[3] = sha1_to_hex(cmd->new_sha1);
350 argv[4] = NULL;
351
6d525d38
SP
352 memset(&proc, 0, sizeof(proc));
353 proc.no_stdin = 1;
354 proc.stdout_to_stderr = 1;
355 proc.err = use_sideband ? -1 : 0;
356 proc.argv = argv;
357
358 code = start_command(&proc);
359 if (code)
360 return code;
361 if (use_sideband)
362 copy_to_sideband(proc.err, -1, NULL);
363 return finish_command(&proc);
1d9e8b56
SP
364}
365
986e8239
JK
366static int is_ref_checked_out(const char *ref)
367{
986e8239
JK
368 if (is_bare_repository())
369 return 0;
370
747ca245 371 if (!head_name)
986e8239 372 return 0;
747ca245 373 return !strcmp(head_name, ref);
986e8239
JK
374}
375
acd2a45b
JH
376static char *refuse_unconfigured_deny_msg[] = {
377 "By default, updating the current branch in a non-bare repository",
378 "is denied, because it will make the index and work tree inconsistent",
379 "with what you pushed, and will require 'git reset --hard' to match",
380 "the work tree to HEAD.",
3d95d92b
JH
381 "",
382 "You can set 'receive.denyCurrentBranch' configuration variable to",
acd2a45b
JH
383 "'ignore' or 'warn' in the remote repository to allow pushing into",
384 "its current branch; however, this is not recommended unless you",
385 "arranged to update its work tree to match what you pushed in some",
386 "other way.",
3d95d92b 387 "",
acd2a45b
JH
388 "To squelch this message and still keep the default behaviour, set",
389 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
3d95d92b
JH
390};
391
acd2a45b 392static void refuse_unconfigured_deny(void)
3d95d92b
JH
393{
394 int i;
acd2a45b 395 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
a886ba28 396 rp_error("%s", refuse_unconfigured_deny_msg[i]);
3d95d92b
JH
397}
398
375881fa
JH
399static char *refuse_unconfigured_deny_delete_current_msg[] = {
400 "By default, deleting the current branch is denied, because the next",
401 "'git clone' won't result in any file checked out, causing confusion.",
747ca245
JH
402 "",
403 "You can set 'receive.denyDeleteCurrent' configuration variable to",
375881fa
JH
404 "'warn' or 'ignore' in the remote repository to allow deleting the",
405 "current branch, with or without a warning message.",
747ca245 406 "",
375881fa 407 "To squelch this message, you can set it to 'refuse'."
747ca245
JH
408};
409
375881fa 410static void refuse_unconfigured_deny_delete_current(void)
747ca245
JH
411{
412 int i;
413 for (i = 0;
375881fa 414 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
747ca245 415 i++)
a886ba28 416 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
747ca245
JH
417}
418
8aaf7d64 419static const char *update(struct command *cmd)
2eca23da 420{
cfee10a7 421 const char *name = cmd->ref_name;
6b01ecfe
JT
422 struct strbuf namespaced_name_buf = STRBUF_INIT;
423 const char *namespaced_name;
cfee10a7
JH
424 unsigned char *old_sha1 = cmd->old_sha1;
425 unsigned char *new_sha1 = cmd->new_sha1;
3159c8dc 426 struct ref_lock *lock;
2eca23da 427
061d6b9a 428 /* only refs/... are allowed */
8d9c5010 429 if (prefixcmp(name, "refs/") || check_refname_format(name + 5, 0)) {
466dbc42 430 rp_error("refusing to create funny ref '%s' remotely", name);
8aaf7d64 431 return "funny refname";
cfee10a7 432 }
d8a1deec 433
6b01ecfe
JT
434 strbuf_addf(&namespaced_name_buf, "%s%s", get_git_namespace(), name);
435 namespaced_name = strbuf_detach(&namespaced_name_buf, NULL);
436
437 if (is_ref_checked_out(namespaced_name)) {
3d95d92b
JH
438 switch (deny_current_branch) {
439 case DENY_IGNORE:
986e8239 440 break;
3d95d92b 441 case DENY_WARN:
466dbc42 442 rp_warning("updating the current branch");
986e8239 443 break;
3d95d92b 444 case DENY_REFUSE:
acd2a45b 445 case DENY_UNCONFIGURED:
466dbc42 446 rp_error("refusing to update checked out branch: %s", name);
acd2a45b
JH
447 if (deny_current_branch == DENY_UNCONFIGURED)
448 refuse_unconfigured_deny();
3d95d92b
JH
449 return "branch is currently checked out";
450 }
986e8239
JK
451 }
452
d4f694ba 453 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
8aaf7d64
SP
454 error("unpack should have generated %s, "
455 "but I can't find it!", sha1_to_hex(new_sha1));
456 return "bad pack";
cfee10a7 457 }
747ca245
JH
458
459 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
460 if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
466dbc42 461 rp_error("denying ref deletion for %s", name);
747ca245
JH
462 return "deletion prohibited";
463 }
464
6b01ecfe 465 if (!strcmp(namespaced_name, head_name)) {
747ca245
JH
466 switch (deny_delete_current) {
467 case DENY_IGNORE:
468 break;
469 case DENY_WARN:
466dbc42 470 rp_warning("deleting the current branch");
747ca245
JH
471 break;
472 case DENY_REFUSE:
375881fa
JH
473 case DENY_UNCONFIGURED:
474 if (deny_delete_current == DENY_UNCONFIGURED)
475 refuse_unconfigured_deny_delete_current();
466dbc42 476 rp_error("refusing to delete the current branch: %s", name);
747ca245
JH
477 return "deletion of the current branch prohibited";
478 }
479 }
a240de11 480 }
747ca245 481
d4f694ba 482 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
ba988a83 483 !is_null_sha1(old_sha1) &&
cc44c765 484 !prefixcmp(name, "refs/heads/")) {
eab82707 485 struct object *old_object, *new_object;
11031d7e 486 struct commit *old_commit, *new_commit;
11031d7e 487
eab82707
MK
488 old_object = parse_object(old_sha1);
489 new_object = parse_object(new_sha1);
490
491 if (!old_object || !new_object ||
492 old_object->type != OBJ_COMMIT ||
493 new_object->type != OBJ_COMMIT) {
494 error("bad sha1 objects for %s", name);
495 return "bad ref";
496 }
497 old_commit = (struct commit *)old_object;
498 new_commit = (struct commit *)new_object;
5d55915c 499 if (!in_merge_bases(old_commit, new_commit)) {
466dbc42
SP
500 rp_error("denying non-fast-forward %s"
501 " (you should pull first)", name);
a75d7b54 502 return "non-fast-forward";
8aaf7d64 503 }
11031d7e 504 }
1d9e8b56 505 if (run_update_hook(cmd)) {
466dbc42 506 rp_error("hook declined to update %s", name);
8aaf7d64 507 return "hook declined";
b1bf95bb 508 }
3159c8dc 509
d4f694ba 510 if (is_null_sha1(new_sha1)) {
28391a80 511 if (!parse_object(old_sha1)) {
28391a80 512 old_sha1 = NULL;
160b81ed
PYH
513 if (ref_exists(name)) {
514 rp_warning("Allowing deletion of corrupt ref.");
515 } else {
516 rp_warning("Deleting a non-existent ref.");
517 cmd->did_not_exist = 1;
518 }
28391a80 519 }
6b01ecfe 520 if (delete_ref(namespaced_name, old_sha1, 0)) {
466dbc42 521 rp_error("failed to delete %s", name);
8aaf7d64 522 return "failed to delete";
d4f694ba 523 }
8aaf7d64 524 return NULL; /* good */
d4f694ba
JH
525 }
526 else {
6b01ecfe 527 lock = lock_any_ref_for_update(namespaced_name, old_sha1, 0);
d4f694ba 528 if (!lock) {
466dbc42 529 rp_error("failed to lock %s", name);
8aaf7d64 530 return "failed to lock";
d4f694ba 531 }
ef203f08 532 if (write_ref_sha1(lock, new_sha1, "push")) {
8aaf7d64 533 return "failed to write"; /* error() already called */
ef203f08 534 }
8aaf7d64 535 return NULL; /* good */
19614330 536 }
2eca23da
LT
537}
538
5e1c71fd 539static void run_update_post_hook(struct command *commands)
19614330 540{
5e1c71fd 541 struct command *cmd;
6d525d38 542 int argc;
9201c707 543 const char **argv;
6d525d38 544 struct child_process proc;
5a7da2dc 545 char *hook;
19614330 546
5a7da2dc 547 hook = find_hook("post-update");
5e1c71fd 548 for (argc = 0, cmd = commands; cmd; cmd = cmd->next) {
160b81ed 549 if (cmd->error_string || cmd->did_not_exist)
19614330
JH
550 continue;
551 argc++;
552 }
5a7da2dc 553 if (!argc || !hook)
3e6e152c 554 return;
5a7da2dc 555
3e6e152c 556 argv = xmalloc(sizeof(*argv) * (2 + argc));
5a7da2dc 557 argv[0] = hook;
19614330 558
5e1c71fd 559 for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
9201c707 560 char *p;
160b81ed 561 if (cmd->error_string || cmd->did_not_exist)
19614330 562 continue;
5e1c71fd
JS
563 p = xmalloc(strlen(cmd->ref_name) + 1);
564 strcpy(p, cmd->ref_name);
9201c707 565 argv[argc] = p;
19614330
JH
566 argc++;
567 }
568 argv[argc] = NULL;
6d525d38
SP
569
570 memset(&proc, 0, sizeof(proc));
571 proc.no_stdin = 1;
572 proc.stdout_to_stderr = 1;
573 proc.err = use_sideband ? -1 : 0;
574 proc.argv = argv;
575
576 if (!start_command(&proc)) {
577 if (use_sideband)
578 copy_to_sideband(proc.err, -1, NULL);
579 finish_command(&proc);
580 }
19614330 581}
2eca23da 582
da3efdb1
JS
583static void check_aliased_update(struct command *cmd, struct string_list *list)
584{
6b01ecfe
JT
585 struct strbuf buf = STRBUF_INIT;
586 const char *dst_name;
da3efdb1
JS
587 struct string_list_item *item;
588 struct command *dst_cmd;
589 unsigned char sha1[20];
590 char cmd_oldh[41], cmd_newh[41], dst_oldh[41], dst_newh[41];
591 int flag;
592
6b01ecfe 593 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
8cad4744 594 dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
6b01ecfe 595 strbuf_release(&buf);
da3efdb1
JS
596
597 if (!(flag & REF_ISSYMREF))
598 return;
599
6b01ecfe
JT
600 dst_name = strip_namespace(dst_name);
601 if (!dst_name) {
602 rp_error("refusing update to broken symref '%s'", cmd->ref_name);
603 cmd->skip_update = 1;
604 cmd->error_string = "broken symref";
605 return;
606 }
607
e8c8b713 608 if ((item = string_list_lookup(list, dst_name)) == NULL)
da3efdb1
JS
609 return;
610
611 cmd->skip_update = 1;
612
613 dst_cmd = (struct command *) item->util;
614
615 if (!hashcmp(cmd->old_sha1, dst_cmd->old_sha1) &&
616 !hashcmp(cmd->new_sha1, dst_cmd->new_sha1))
617 return;
618
619 dst_cmd->skip_update = 1;
620
621 strcpy(cmd_oldh, find_unique_abbrev(cmd->old_sha1, DEFAULT_ABBREV));
0e71bc30 622 strcpy(cmd_newh, find_unique_abbrev(cmd->new_sha1, DEFAULT_ABBREV));
da3efdb1 623 strcpy(dst_oldh, find_unique_abbrev(dst_cmd->old_sha1, DEFAULT_ABBREV));
0e71bc30 624 strcpy(dst_newh, find_unique_abbrev(dst_cmd->new_sha1, DEFAULT_ABBREV));
da3efdb1
JS
625 rp_error("refusing inconsistent update between symref '%s' (%s..%s) and"
626 " its target '%s' (%s..%s)",
627 cmd->ref_name, cmd_oldh, cmd_newh,
628 dst_cmd->ref_name, dst_oldh, dst_newh);
629
630 cmd->error_string = dst_cmd->error_string =
631 "inconsistent aliased update";
632}
633
634static void check_aliased_updates(struct command *commands)
635{
636 struct command *cmd;
183113a5 637 struct string_list ref_list = STRING_LIST_INIT_NODUP;
da3efdb1
JS
638
639 for (cmd = commands; cmd; cmd = cmd->next) {
640 struct string_list_item *item =
1d2f80fa 641 string_list_append(&ref_list, cmd->ref_name);
da3efdb1
JS
642 item->util = (void *)cmd;
643 }
644 sort_string_list(&ref_list);
645
ef7e93d9
CB
646 for (cmd = commands; cmd; cmd = cmd->next) {
647 if (!cmd->error_string)
648 check_aliased_update(cmd, &ref_list);
649 }
da3efdb1
JS
650
651 string_list_clear(&ref_list, 0);
652}
653
52fed6e1
JH
654static int command_singleton_iterator(void *cb_data, unsigned char sha1[20])
655{
656 struct command **cmd_list = cb_data;
657 struct command *cmd = *cmd_list;
658
ee6dfb2d 659 if (!cmd || is_null_sha1(cmd->new_sha1))
52fed6e1
JH
660 return -1; /* end of list */
661 *cmd_list = NULL; /* this returns only one */
662 hashcpy(sha1, cmd->new_sha1);
663 return 0;
664}
665
666static void set_connectivity_errors(struct command *commands)
667{
668 struct command *cmd;
669
670 for (cmd = commands; cmd; cmd = cmd->next) {
671 struct command *singleton = cmd;
672 if (!check_everything_connected(command_singleton_iterator,
673 0, &singleton))
674 continue;
675 cmd->error_string = "missing necessary objects";
676 }
677}
678
679static int iterate_receive_command_list(void *cb_data, unsigned char sha1[20])
680{
681 struct command **cmd_list = cb_data;
682 struct command *cmd = *cmd_list;
683
ee6dfb2d
JH
684 while (cmd) {
685 if (!is_null_sha1(cmd->new_sha1)) {
686 hashcpy(sha1, cmd->new_sha1);
687 *cmd_list = cmd->next;
688 return 0;
689 }
690 cmd = cmd->next;
691 }
692 *cmd_list = NULL;
693 return -1; /* end of list */
52fed6e1
JH
694}
695
daebaa78
JH
696static void reject_updates_to_hidden(struct command *commands)
697{
698 struct command *cmd;
699
700 for (cmd = commands; cmd; cmd = cmd->next) {
701 if (cmd->error_string || !ref_is_hidden(cmd->ref_name))
702 continue;
703 if (is_null_sha1(cmd->new_sha1))
704 cmd->error_string = "deny deleting a hidden ref";
705 else
706 cmd->error_string = "deny updating a hidden ref";
707 }
708}
709
5e1c71fd 710static void execute_commands(struct command *commands, const char *unpacker_error)
575f4974 711{
5e1c71fd 712 struct command *cmd;
747ca245 713 unsigned char sha1[20];
8aaf7d64
SP
714
715 if (unpacker_error) {
5e1c71fd 716 for (cmd = commands; cmd; cmd = cmd->next)
74eb32d3 717 cmd->error_string = "unpacker error";
8aaf7d64
SP
718 return;
719 }
720
52fed6e1
JH
721 cmd = commands;
722 if (check_everything_connected(iterate_receive_command_list,
723 0, &cmd))
724 set_connectivity_errors(commands);
725
daebaa78
JH
726 reject_updates_to_hidden(commands);
727
5a7da2dc 728 if (run_receive_hook(commands, "pre-receive", 0)) {
ef7e93d9
CB
729 for (cmd = commands; cmd; cmd = cmd->next) {
730 if (!cmd->error_string)
731 cmd->error_string = "pre-receive hook declined";
732 }
05ef58ec
SP
733 return;
734 }
735
da3efdb1
JS
736 check_aliased_updates(commands);
737
96ec7b1e
NTND
738 free(head_name_to_free);
739 head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
747ca245 740
ef7e93d9
CB
741 for (cmd = commands; cmd; cmd = cmd->next) {
742 if (cmd->error_string)
743 continue;
744
745 if (cmd->skip_update)
746 continue;
747
748 cmd->error_string = update(cmd);
749 }
575f4974
LT
750}
751
5e1c71fd 752static struct command *read_head_info(void)
575f4974 753{
5e1c71fd 754 struct command *commands = NULL;
eb1af2df 755 struct command **p = &commands;
575f4974
LT
756 for (;;) {
757 static char line[1000];
eb1af2df
LT
758 unsigned char old_sha1[20], new_sha1[20];
759 struct command *cmd;
cfee10a7
JH
760 char *refname;
761 int len, reflen;
eb1af2df
LT
762
763 len = packet_read_line(0, line, sizeof(line));
575f4974
LT
764 if (!len)
765 break;
eb1af2df
LT
766 if (len < 83 ||
767 line[40] != ' ' ||
768 line[81] != ' ' ||
769 get_sha1_hex(line, old_sha1) ||
770 get_sha1_hex(line + 41, new_sha1))
cfee10a7
JH
771 die("protocol error: expected old/new/ref, got '%s'",
772 line);
773
774 refname = line + 82;
775 reflen = strlen(refname);
776 if (reflen + 82 < len) {
f47182c8
JH
777 const char *feature_list = refname + reflen + 1;
778 if (parse_feature_request(feature_list, "report-status"))
cfee10a7 779 report_status = 1;
f47182c8 780 if (parse_feature_request(feature_list, "side-band-64k"))
38a81b4e 781 use_sideband = LARGE_PACKET_MAX;
c207e34f
CB
782 if (parse_feature_request(feature_list, "quiet"))
783 quiet = 1;
cfee10a7 784 }
da3efdb1 785 cmd = xcalloc(1, sizeof(struct command) + len - 80);
e702496e
SP
786 hashcpy(cmd->old_sha1, old_sha1);
787 hashcpy(cmd->new_sha1, new_sha1);
eb1af2df 788 memcpy(cmd->ref_name, line + 82, len - 81);
eb1af2df
LT
789 *p = cmd;
790 p = &cmd->next;
575f4974 791 }
5e1c71fd 792 return commands;
575f4974
LT
793}
794
fc04c412
SP
795static const char *parse_pack_header(struct pack_header *hdr)
796{
a69e5429
JH
797 switch (read_pack_header(0, hdr)) {
798 case PH_ERROR_EOF:
799 return "eof before pack header was fully read";
800
801 case PH_ERROR_PACK_SIGNATURE:
fc04c412 802 return "protocol error (pack signature mismatch detected)";
a69e5429
JH
803
804 case PH_ERROR_PROTOCOL:
fc04c412 805 return "protocol error (pack version unsupported)";
a69e5429
JH
806
807 default:
808 return "unknown error in parse_pack_header";
809
810 case 0:
811 return NULL;
812 }
fc04c412
SP
813}
814
576162a4
NP
815static const char *pack_lockfile;
816
a22e6f85 817static const char *unpack(int err_fd)
575f4974 818{
fc04c412
SP
819 struct pack_header hdr;
820 const char *hdr_err;
821 char hdr_arg[38];
dab76d3a
JH
822 int fsck_objects = (receive_fsck_objects >= 0
823 ? receive_fsck_objects
824 : transfer_fsck_objects >= 0
825 ? transfer_fsck_objects
826 : 0);
fc04c412
SP
827
828 hdr_err = parse_pack_header(&hdr);
829 if (hdr_err)
830 return hdr_err;
6e1c2344
RJ
831 snprintf(hdr_arg, sizeof(hdr_arg),
832 "--pack_header=%"PRIu32",%"PRIu32,
fc04c412
SP
833 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
834
835 if (ntohl(hdr.hdr_entries) < unpack_limit) {
20dc0016 836 int code, i = 0;
59bfdfb8 837 struct child_process child;
c207e34f 838 const char *unpacker[5];
20dc0016 839 unpacker[i++] = "unpack-objects";
c207e34f
CB
840 if (quiet)
841 unpacker[i++] = "-q";
dab76d3a 842 if (fsck_objects)
20dc0016
MK
843 unpacker[i++] = "--strict";
844 unpacker[i++] = hdr_arg;
845 unpacker[i++] = NULL;
59bfdfb8
JK
846 memset(&child, 0, sizeof(child));
847 child.argv = unpacker;
848 child.no_stdout = 1;
a22e6f85 849 child.err = err_fd;
59bfdfb8
JK
850 child.git_cmd = 1;
851 code = run_command(&child);
2ff4d1ab 852 if (!code)
fc04c412 853 return NULL;
2ff4d1ab 854 return "unpack-objects abnormal exit";
576162a4 855 } else {
20dc0016
MK
856 const char *keeper[7];
857 int s, status, i = 0;
576162a4 858 char keep_arg[256];
e8016abf 859 struct child_process ip;
576162a4 860
85e72830 861 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
576162a4
NP
862 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
863 strcpy(keep_arg + s, "localhost");
864
20dc0016
MK
865 keeper[i++] = "index-pack";
866 keeper[i++] = "--stdin";
dab76d3a 867 if (fsck_objects)
20dc0016
MK
868 keeper[i++] = "--strict";
869 keeper[i++] = "--fix-thin";
870 keeper[i++] = hdr_arg;
871 keeper[i++] = keep_arg;
872 keeper[i++] = NULL;
e8016abf
SP
873 memset(&ip, 0, sizeof(ip));
874 ip.argv = keeper;
875 ip.out = -1;
a22e6f85 876 ip.err = err_fd;
e8016abf 877 ip.git_cmd = 1;
2ff4d1ab
JS
878 status = start_command(&ip);
879 if (status) {
576162a4 880 return "index-pack fork failed";
2ff4d1ab 881 }
106764e6 882 pack_lockfile = index_pack_lockfile(ip.out);
e72ae288 883 close(ip.out);
e8016abf
SP
884 status = finish_command(&ip);
885 if (!status) {
576162a4
NP
886 reprepare_packed_git();
887 return NULL;
888 }
889 return "index-pack abnormal exit";
cfee10a7
JH
890 }
891}
892
a22e6f85
JK
893static const char *unpack_with_sideband(void)
894{
895 struct async muxer;
896 const char *ret;
897
898 if (!use_sideband)
899 return unpack(0);
900
901 memset(&muxer, 0, sizeof(muxer));
902 muxer.proc = copy_to_sideband;
903 muxer.in = -1;
904 if (start_async(&muxer))
905 return NULL;
906
907 ret = unpack(muxer.in);
908
909 finish_async(&muxer);
910 return ret;
911}
912
5e1c71fd 913static void report(struct command *commands, const char *unpack_status)
cfee10a7
JH
914{
915 struct command *cmd;
38a81b4e
SP
916 struct strbuf buf = STRBUF_INIT;
917
918 packet_buf_write(&buf, "unpack %s\n",
919 unpack_status ? unpack_status : "ok");
cfee10a7
JH
920 for (cmd = commands; cmd; cmd = cmd->next) {
921 if (!cmd->error_string)
38a81b4e
SP
922 packet_buf_write(&buf, "ok %s\n",
923 cmd->ref_name);
cfee10a7 924 else
38a81b4e
SP
925 packet_buf_write(&buf, "ng %s %s\n",
926 cmd->ref_name, cmd->error_string);
575f4974 927 }
38a81b4e
SP
928 packet_buf_flush(&buf);
929
930 if (use_sideband)
931 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
932 else
cdf4fb8e 933 write_or_die(1, buf.buf, buf.len);
38a81b4e 934 strbuf_release(&buf);
575f4974
LT
935}
936
5e1c71fd 937static int delete_only(struct command *commands)
d4f694ba 938{
5e1c71fd
JS
939 struct command *cmd;
940 for (cmd = commands; cmd; cmd = cmd->next) {
d4f694ba
JH
941 if (!is_null_sha1(cmd->new_sha1))
942 return 0;
d4f694ba
JH
943 }
944 return 1;
945}
946
be5908ae 947int cmd_receive_pack(int argc, const char **argv, const char *prefix)
575f4974 948{
42526b47
SP
949 int advertise_refs = 0;
950 int stateless_rpc = 0;
d0efc8a7 951 int i;
8d630132 952 char *dir = NULL;
5e1c71fd 953 struct command *commands;
575f4974 954
bbc30f99
JK
955 packet_trace_identity("receive-pack");
956
575f4974
LT
957 argv++;
958 for (i = 1; i < argc; i++) {
be5908ae 959 const char *arg = *argv++;
575f4974
LT
960
961 if (*arg == '-') {
c207e34f
CB
962 if (!strcmp(arg, "--quiet")) {
963 quiet = 1;
964 continue;
965 }
966
42526b47
SP
967 if (!strcmp(arg, "--advertise-refs")) {
968 advertise_refs = 1;
969 continue;
970 }
971 if (!strcmp(arg, "--stateless-rpc")) {
972 stateless_rpc = 1;
973 continue;
974 }
975
575f4974
LT
976 usage(receive_pack_usage);
977 }
d0efc8a7
LT
978 if (dir)
979 usage(receive_pack_usage);
be5908ae 980 dir = xstrdup(arg);
575f4974
LT
981 }
982 if (!dir)
983 usage(receive_pack_usage);
984
e1464ca7 985 setup_path();
5c09f321 986
3159c8dc 987 if (!enter_repo(dir, 0))
05ac6b34 988 die("'%s' does not appear to be a git repository", dir);
575f4974 989
a0022eeb
JH
990 if (is_repository_shallow())
991 die("attempt to push into a shallow repository");
992
ef90d6d4 993 git_config(receive_pack_config, NULL);
6fb75bed 994
e28714c5
JH
995 if (0 <= transfer_unpack_limit)
996 unpack_limit = transfer_unpack_limit;
997 else if (0 <= receive_unpack_limit)
998 unpack_limit = receive_unpack_limit;
999
42526b47 1000 if (advertise_refs || !stateless_rpc) {
42526b47 1001 write_head_info();
42526b47
SP
1002 }
1003 if (advertise_refs)
1004 return 0;
575f4974 1005
5e1c71fd 1006 if ((commands = read_head_info()) != NULL) {
d4f694ba
JH
1007 const char *unpack_status = NULL;
1008
1009 if (!delete_only(commands))
a22e6f85 1010 unpack_status = unpack_with_sideband();
5e1c71fd 1011 execute_commands(commands, unpack_status);
576162a4 1012 if (pack_lockfile)
691f1a28 1013 unlink_or_warn(pack_lockfile);
cfee10a7 1014 if (report_status)
5e1c71fd 1015 report(commands, unpack_status);
5a7da2dc 1016 run_receive_hook(commands, "post-receive", 1);
8e663d9e 1017 run_update_post_hook(commands);
77e3efbf
JH
1018 if (auto_gc) {
1019 const char *argv_gc_auto[] = {
1020 "gc", "--auto", "--quiet", NULL,
1021 };
4b7f2fa4
JH
1022 int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
1023 run_command_v_opt(argv_gc_auto, opt);
77e3efbf
JH
1024 }
1025 if (auto_update_server_info)
1026 update_server_info(0);
7f8e9828 1027 }
38a81b4e
SP
1028 if (use_sideband)
1029 packet_flush(1);
575f4974
LT
1030 return 0;
1031}