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