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