]> git.ipfire.org Git - thirdparty/git.git/blame - builtin-receive-pack.c
fast-import: clarify documentation of "feature" command
[thirdparty/git.git] / builtin-receive-pack.c
CommitLineData
575f4974 1#include "cache.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"
575f4974 12
34263de0 13static const char receive_pack_usage[] = "git receive-pack <git-dir>";
575f4974 14
986e8239 15enum deny_action {
3d95d92b 16 DENY_UNCONFIGURED,
986e8239
JK
17 DENY_IGNORE,
18 DENY_WARN,
19 DENY_REFUSE,
20};
21
1b53a076
JH
22static int deny_deletes;
23static int deny_non_fast_forwards;
3d95d92b 24static enum deny_action deny_current_branch = DENY_UNCONFIGURED;
747ca245 25static enum deny_action deny_delete_current = DENY_UNCONFIGURED;
20dc0016 26static int receive_fsck_objects;
e28714c5
JH
27static int receive_unpack_limit = -1;
28static int transfer_unpack_limit = -1;
46732fae 29static int unpack_limit = 100;
96f1e58f 30static int report_status;
38a81b4e 31static int use_sideband;
b74fce16 32static int prefer_ofs_delta = 1;
77e3efbf
JH
33static int auto_update_server_info;
34static int auto_gc = 1;
747ca245 35static const char *head_name;
185c04e0 36static int sent_capabilities;
cfee10a7 37
986e8239
JK
38static enum deny_action parse_deny_action(const char *var, const char *value)
39{
40 if (value) {
41 if (!strcasecmp(value, "ignore"))
42 return DENY_IGNORE;
43 if (!strcasecmp(value, "warn"))
44 return DENY_WARN;
45 if (!strcasecmp(value, "refuse"))
46 return DENY_REFUSE;
47 }
48 if (git_config_bool(var, value))
49 return DENY_REFUSE;
50 return DENY_IGNORE;
51}
52
ef90d6d4 53static int receive_pack_config(const char *var, const char *value, void *cb)
6fb75bed 54{
a240de11
JK
55 if (strcmp(var, "receive.denydeletes") == 0) {
56 deny_deletes = git_config_bool(var, value);
57 return 0;
58 }
59
e28714c5 60 if (strcmp(var, "receive.denynonfastforwards") == 0) {
6fb75bed
SP
61 deny_non_fast_forwards = git_config_bool(var, value);
62 return 0;
63 }
64
e28714c5
JH
65 if (strcmp(var, "receive.unpacklimit") == 0) {
66 receive_unpack_limit = git_config_int(var, value);
fc04c412
SP
67 return 0;
68 }
69
e28714c5
JH
70 if (strcmp(var, "transfer.unpacklimit") == 0) {
71 transfer_unpack_limit = git_config_int(var, value);
72 return 0;
73 }
74
20dc0016
MK
75 if (strcmp(var, "receive.fsckobjects") == 0) {
76 receive_fsck_objects = git_config_bool(var, value);
77 return 0;
78 }
79
986e8239
JK
80 if (!strcmp(var, "receive.denycurrentbranch")) {
81 deny_current_branch = parse_deny_action(var, value);
82 return 0;
83 }
84
747ca245
JH
85 if (strcmp(var, "receive.denydeletecurrent") == 0) {
86 deny_delete_current = parse_deny_action(var, value);
87 return 0;
88 }
89
b74fce16
NP
90 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
91 prefer_ofs_delta = git_config_bool(var, value);
92 return 0;
93 }
94
77e3efbf
JH
95 if (strcmp(var, "receive.updateserverinfo") == 0) {
96 auto_update_server_info = git_config_bool(var, value);
97 return 0;
98 }
99
100 if (strcmp(var, "receive.autogc") == 0) {
101 auto_gc = git_config_bool(var, value);
102 return 0;
103 }
104
ef90d6d4 105 return git_default_config(var, value, cb);
6fb75bed
SP
106}
107
8da19775 108static int show_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
575f4974 109{
185c04e0 110 if (sent_capabilities)
cfee10a7
JH
111 packet_write(1, "%s %s\n", sha1_to_hex(sha1), path);
112 else
185c04e0
SP
113 packet_write(1, "%s %s%c%s%s\n",
114 sha1_to_hex(sha1), path, 0,
38a81b4e 115 " report-status delete-refs side-band-64k",
185c04e0
SP
116 prefer_ofs_delta ? " ofs-delta" : "");
117 sent_capabilities = 1;
8a65ff76 118 return 0;
575f4974
LT
119}
120
8a65ff76 121static void write_head_info(void)
575f4974 122{
cb5d709f 123 for_each_ref(show_ref, NULL);
185c04e0 124 if (!sent_capabilities)
8da19775 125 show_ref("capabilities^{}", null_sha1, 0, NULL);
cfee10a7 126
575f4974
LT
127}
128
eb1af2df
LT
129struct command {
130 struct command *next;
cfee10a7 131 const char *error_string;
eb1af2df
LT
132 unsigned char old_sha1[20];
133 unsigned char new_sha1[20];
8f1d2e6f 134 char ref_name[FLEX_ARRAY]; /* more */
575f4974
LT
135};
136
96f1e58f 137static struct command *commands;
575f4974 138
05ef58ec
SP
139static const char pre_receive_hook[] = "hooks/pre-receive";
140static const char post_receive_hook[] = "hooks/post-receive";
b1bf95bb 141
466dbc42
SP
142static void rp_error(const char *err, ...) __attribute__((format (printf, 1, 2)));
143static void rp_warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
144
145static void report_message(const char *prefix, const char *err, va_list params)
146{
147 int sz = strlen(prefix);
148 char msg[4096];
149
150 strncpy(msg, prefix, sz);
151 sz += vsnprintf(msg + sz, sizeof(msg) - sz, err, params);
152 if (sz > (sizeof(msg) - 1))
153 sz = sizeof(msg) - 1;
154 msg[sz++] = '\n';
155
156 if (use_sideband)
157 send_sideband(1, 2, msg, sz, use_sideband);
158 else
159 xwrite(2, msg, sz);
160}
161
162static void rp_warning(const char *err, ...)
163{
164 va_list params;
165 va_start(params, err);
166 report_message("warning: ", err, params);
167 va_end(params);
168}
169
170static void rp_error(const char *err, ...)
171{
172 va_list params;
173 va_start(params, err);
174 report_message("error: ", err, params);
175 va_end(params);
176}
177
6d525d38
SP
178static int copy_to_sideband(int in, int out, void *arg)
179{
180 char data[128];
181 while (1) {
182 ssize_t sz = xread(in, data, sizeof(data));
183 if (sz <= 0)
184 break;
185 send_sideband(1, 2, data, sz, use_sideband);
186 }
187 close(in);
188 return 0;
189}
190
ae98a008 191static int run_receive_hook(const char *hook_name)
b1bf95bb 192{
f43cd49f 193 static char buf[sizeof(commands->old_sha1) * 2 + PATH_MAX + 4];
c8dd2771 194 struct command *cmd;
f43cd49f 195 struct child_process proc;
6d525d38 196 struct async muxer;
f43cd49f
SP
197 const char *argv[2];
198 int have_input = 0, code;
c8dd2771 199
f43cd49f 200 for (cmd = commands; !have_input && cmd; cmd = cmd->next) {
c8dd2771 201 if (!cmd->error_string)
f43cd49f 202 have_input = 1;
c8dd2771 203 }
b1bf95bb 204
f43cd49f 205 if (!have_input || access(hook_name, X_OK) < 0)
b1bf95bb 206 return 0;
c8dd2771 207
c8dd2771 208 argv[0] = hook_name;
f43cd49f
SP
209 argv[1] = NULL;
210
211 memset(&proc, 0, sizeof(proc));
212 proc.argv = argv;
213 proc.in = -1;
214 proc.stdout_to_stderr = 1;
215
6d525d38
SP
216 if (use_sideband) {
217 memset(&muxer, 0, sizeof(muxer));
218 muxer.proc = copy_to_sideband;
219 muxer.in = -1;
220 code = start_async(&muxer);
221 if (code)
222 return code;
223 proc.err = muxer.in;
224 }
225
f43cd49f 226 code = start_command(&proc);
6d525d38
SP
227 if (code) {
228 if (use_sideband)
229 finish_async(&muxer);
90e41a89 230 return code;
6d525d38
SP
231 }
232
f43cd49f 233 for (cmd = commands; cmd; cmd = cmd->next) {
c8dd2771 234 if (!cmd->error_string) {
f43cd49f
SP
235 size_t n = snprintf(buf, sizeof(buf), "%s %s %s\n",
236 sha1_to_hex(cmd->old_sha1),
237 sha1_to_hex(cmd->new_sha1),
238 cmd->ref_name);
239 if (write_in_full(proc.in, buf, n) != n)
240 break;
c8dd2771 241 }
c8dd2771 242 }
e72ae288 243 close(proc.in);
6d525d38
SP
244 if (use_sideband)
245 finish_async(&muxer);
90e41a89 246 return finish_command(&proc);
b1bf95bb
JW
247}
248
1d9e8b56
SP
249static int run_update_hook(struct command *cmd)
250{
251 static const char update_hook[] = "hooks/update";
1d9e8b56 252 const char *argv[5];
6d525d38
SP
253 struct child_process proc;
254 int code;
1d9e8b56
SP
255
256 if (access(update_hook, X_OK) < 0)
257 return 0;
258
259 argv[0] = update_hook;
260 argv[1] = cmd->ref_name;
261 argv[2] = sha1_to_hex(cmd->old_sha1);
262 argv[3] = sha1_to_hex(cmd->new_sha1);
263 argv[4] = NULL;
264
6d525d38
SP
265 memset(&proc, 0, sizeof(proc));
266 proc.no_stdin = 1;
267 proc.stdout_to_stderr = 1;
268 proc.err = use_sideband ? -1 : 0;
269 proc.argv = argv;
270
271 code = start_command(&proc);
272 if (code)
273 return code;
274 if (use_sideband)
275 copy_to_sideband(proc.err, -1, NULL);
276 return finish_command(&proc);
1d9e8b56
SP
277}
278
986e8239
JK
279static int is_ref_checked_out(const char *ref)
280{
986e8239
JK
281 if (is_bare_repository())
282 return 0;
283
747ca245 284 if (!head_name)
986e8239 285 return 0;
747ca245 286 return !strcmp(head_name, ref);
986e8239
JK
287}
288
acd2a45b
JH
289static char *refuse_unconfigured_deny_msg[] = {
290 "By default, updating the current branch in a non-bare repository",
291 "is denied, because it will make the index and work tree inconsistent",
292 "with what you pushed, and will require 'git reset --hard' to match",
293 "the work tree to HEAD.",
3d95d92b
JH
294 "",
295 "You can set 'receive.denyCurrentBranch' configuration variable to",
acd2a45b
JH
296 "'ignore' or 'warn' in the remote repository to allow pushing into",
297 "its current branch; however, this is not recommended unless you",
298 "arranged to update its work tree to match what you pushed in some",
299 "other way.",
3d95d92b 300 "",
acd2a45b
JH
301 "To squelch this message and still keep the default behaviour, set",
302 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
3d95d92b
JH
303};
304
acd2a45b 305static void refuse_unconfigured_deny(void)
3d95d92b
JH
306{
307 int i;
acd2a45b 308 for (i = 0; i < ARRAY_SIZE(refuse_unconfigured_deny_msg); i++)
a886ba28 309 rp_error("%s", refuse_unconfigured_deny_msg[i]);
3d95d92b
JH
310}
311
375881fa
JH
312static char *refuse_unconfigured_deny_delete_current_msg[] = {
313 "By default, deleting the current branch is denied, because the next",
314 "'git clone' won't result in any file checked out, causing confusion.",
747ca245
JH
315 "",
316 "You can set 'receive.denyDeleteCurrent' configuration variable to",
375881fa
JH
317 "'warn' or 'ignore' in the remote repository to allow deleting the",
318 "current branch, with or without a warning message.",
747ca245 319 "",
375881fa 320 "To squelch this message, you can set it to 'refuse'."
747ca245
JH
321};
322
375881fa 323static void refuse_unconfigured_deny_delete_current(void)
747ca245
JH
324{
325 int i;
326 for (i = 0;
375881fa 327 i < ARRAY_SIZE(refuse_unconfigured_deny_delete_current_msg);
747ca245 328 i++)
a886ba28 329 rp_error("%s", refuse_unconfigured_deny_delete_current_msg[i]);
747ca245
JH
330}
331
8aaf7d64 332static const char *update(struct command *cmd)
2eca23da 333{
cfee10a7
JH
334 const char *name = cmd->ref_name;
335 unsigned char *old_sha1 = cmd->old_sha1;
336 unsigned char *new_sha1 = cmd->new_sha1;
3159c8dc 337 struct ref_lock *lock;
2eca23da 338
061d6b9a
MK
339 /* only refs/... are allowed */
340 if (prefixcmp(name, "refs/") || check_ref_format(name + 5)) {
466dbc42 341 rp_error("refusing to create funny ref '%s' remotely", name);
8aaf7d64 342 return "funny refname";
cfee10a7 343 }
d8a1deec 344
3d95d92b
JH
345 if (is_ref_checked_out(name)) {
346 switch (deny_current_branch) {
347 case DENY_IGNORE:
986e8239 348 break;
3d95d92b 349 case DENY_WARN:
466dbc42 350 rp_warning("updating the current branch");
986e8239 351 break;
3d95d92b 352 case DENY_REFUSE:
acd2a45b 353 case DENY_UNCONFIGURED:
466dbc42 354 rp_error("refusing to update checked out branch: %s", name);
acd2a45b
JH
355 if (deny_current_branch == DENY_UNCONFIGURED)
356 refuse_unconfigured_deny();
3d95d92b
JH
357 return "branch is currently checked out";
358 }
986e8239
JK
359 }
360
d4f694ba 361 if (!is_null_sha1(new_sha1) && !has_sha1_file(new_sha1)) {
8aaf7d64
SP
362 error("unpack should have generated %s, "
363 "but I can't find it!", sha1_to_hex(new_sha1));
364 return "bad pack";
cfee10a7 365 }
747ca245
JH
366
367 if (!is_null_sha1(old_sha1) && is_null_sha1(new_sha1)) {
368 if (deny_deletes && !prefixcmp(name, "refs/heads/")) {
466dbc42 369 rp_error("denying ref deletion for %s", name);
747ca245
JH
370 return "deletion prohibited";
371 }
372
373 if (!strcmp(name, head_name)) {
374 switch (deny_delete_current) {
375 case DENY_IGNORE:
376 break;
377 case DENY_WARN:
466dbc42 378 rp_warning("deleting the current branch");
747ca245
JH
379 break;
380 case DENY_REFUSE:
375881fa
JH
381 case DENY_UNCONFIGURED:
382 if (deny_delete_current == DENY_UNCONFIGURED)
383 refuse_unconfigured_deny_delete_current();
466dbc42 384 rp_error("refusing to delete the current branch: %s", name);
747ca245
JH
385 return "deletion of the current branch prohibited";
386 }
387 }
a240de11 388 }
747ca245 389
d4f694ba 390 if (deny_non_fast_forwards && !is_null_sha1(new_sha1) &&
ba988a83 391 !is_null_sha1(old_sha1) &&
cc44c765 392 !prefixcmp(name, "refs/heads/")) {
eab82707 393 struct object *old_object, *new_object;
11031d7e 394 struct commit *old_commit, *new_commit;
9edd7e46 395 struct commit_list *bases, *ent;
11031d7e 396
eab82707
MK
397 old_object = parse_object(old_sha1);
398 new_object = parse_object(new_sha1);
399
400 if (!old_object || !new_object ||
401 old_object->type != OBJ_COMMIT ||
402 new_object->type != OBJ_COMMIT) {
403 error("bad sha1 objects for %s", name);
404 return "bad ref";
405 }
406 old_commit = (struct commit *)old_object;
407 new_commit = (struct commit *)new_object;
9edd7e46
JS
408 bases = get_merge_bases(old_commit, new_commit, 1);
409 for (ent = bases; ent; ent = ent->next)
410 if (!hashcmp(old_sha1, ent->item->object.sha1))
11031d7e 411 break;
9edd7e46 412 free_commit_list(bases);
8aaf7d64 413 if (!ent) {
466dbc42
SP
414 rp_error("denying non-fast-forward %s"
415 " (you should pull first)", name);
a75d7b54 416 return "non-fast-forward";
8aaf7d64 417 }
11031d7e 418 }
1d9e8b56 419 if (run_update_hook(cmd)) {
466dbc42 420 rp_error("hook declined to update %s", name);
8aaf7d64 421 return "hook declined";
b1bf95bb 422 }
3159c8dc 423
d4f694ba 424 if (is_null_sha1(new_sha1)) {
28391a80 425 if (!parse_object(old_sha1)) {
466dbc42 426 rp_warning("Allowing deletion of corrupt ref.");
28391a80
JS
427 old_sha1 = NULL;
428 }
eca35a25 429 if (delete_ref(name, old_sha1, 0)) {
466dbc42 430 rp_error("failed to delete %s", name);
8aaf7d64 431 return "failed to delete";
d4f694ba 432 }
8aaf7d64 433 return NULL; /* good */
d4f694ba
JH
434 }
435 else {
68db31cc 436 lock = lock_any_ref_for_update(name, old_sha1, 0);
d4f694ba 437 if (!lock) {
466dbc42 438 rp_error("failed to lock %s", name);
8aaf7d64 439 return "failed to lock";
d4f694ba 440 }
ef203f08 441 if (write_ref_sha1(lock, new_sha1, "push")) {
8aaf7d64 442 return "failed to write"; /* error() already called */
ef203f08 443 }
8aaf7d64 444 return NULL; /* good */
19614330 445 }
2eca23da
LT
446}
447
19614330
JH
448static char update_post_hook[] = "hooks/post-update";
449
450static void run_update_post_hook(struct command *cmd)
451{
452 struct command *cmd_p;
6d525d38 453 int argc;
9201c707 454 const char **argv;
6d525d38 455 struct child_process proc;
19614330 456
3e6e152c 457 for (argc = 0, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
cfee10a7 458 if (cmd_p->error_string)
19614330
JH
459 continue;
460 argc++;
461 }
3e6e152c
SP
462 if (!argc || access(update_post_hook, X_OK) < 0)
463 return;
464 argv = xmalloc(sizeof(*argv) * (2 + argc));
19614330
JH
465 argv[0] = update_post_hook;
466
467 for (argc = 1, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
9201c707 468 char *p;
cfee10a7 469 if (cmd_p->error_string)
19614330 470 continue;
9201c707
JH
471 p = xmalloc(strlen(cmd_p->ref_name) + 1);
472 strcpy(p, cmd_p->ref_name);
473 argv[argc] = p;
19614330
JH
474 argc++;
475 }
476 argv[argc] = NULL;
6d525d38
SP
477
478 memset(&proc, 0, sizeof(proc));
479 proc.no_stdin = 1;
480 proc.stdout_to_stderr = 1;
481 proc.err = use_sideband ? -1 : 0;
482 proc.argv = argv;
483
484 if (!start_command(&proc)) {
485 if (use_sideband)
486 copy_to_sideband(proc.err, -1, NULL);
487 finish_command(&proc);
488 }
19614330 489}
2eca23da 490
8aaf7d64 491static void execute_commands(const char *unpacker_error)
575f4974 492{
eb1af2df 493 struct command *cmd = commands;
747ca245 494 unsigned char sha1[20];
8aaf7d64
SP
495
496 if (unpacker_error) {
497 while (cmd) {
498 cmd->error_string = "n/a (unpacker error)";
499 cmd = cmd->next;
500 }
501 return;
502 }
503
ae98a008 504 if (run_receive_hook(pre_receive_hook)) {
05ef58ec
SP
505 while (cmd) {
506 cmd->error_string = "pre-receive hook declined";
507 cmd = cmd->next;
508 }
509 return;
510 }
511
747ca245
JH
512 head_name = resolve_ref("HEAD", sha1, 0, NULL);
513
eb1af2df 514 while (cmd) {
8aaf7d64 515 cmd->error_string = update(cmd);
eb1af2df 516 cmd = cmd->next;
575f4974
LT
517 }
518}
519
520static void read_head_info(void)
521{
eb1af2df 522 struct command **p = &commands;
575f4974
LT
523 for (;;) {
524 static char line[1000];
eb1af2df
LT
525 unsigned char old_sha1[20], new_sha1[20];
526 struct command *cmd;
cfee10a7
JH
527 char *refname;
528 int len, reflen;
eb1af2df
LT
529
530 len = packet_read_line(0, line, sizeof(line));
575f4974
LT
531 if (!len)
532 break;
eb1af2df
LT
533 if (line[len-1] == '\n')
534 line[--len] = 0;
535 if (len < 83 ||
536 line[40] != ' ' ||
537 line[81] != ' ' ||
538 get_sha1_hex(line, old_sha1) ||
539 get_sha1_hex(line + 41, new_sha1))
cfee10a7
JH
540 die("protocol error: expected old/new/ref, got '%s'",
541 line);
542
543 refname = line + 82;
544 reflen = strlen(refname);
545 if (reflen + 82 < len) {
546 if (strstr(refname + reflen + 1, "report-status"))
547 report_status = 1;
38a81b4e
SP
548 if (strstr(refname + reflen + 1, "side-band-64k"))
549 use_sideband = LARGE_PACKET_MAX;
cfee10a7 550 }
eb1af2df 551 cmd = xmalloc(sizeof(struct command) + len - 80);
e702496e
SP
552 hashcpy(cmd->old_sha1, old_sha1);
553 hashcpy(cmd->new_sha1, new_sha1);
eb1af2df 554 memcpy(cmd->ref_name, line + 82, len - 81);
8aaf7d64 555 cmd->error_string = NULL;
eb1af2df
LT
556 cmd->next = NULL;
557 *p = cmd;
558 p = &cmd->next;
575f4974
LT
559 }
560}
561
fc04c412
SP
562static const char *parse_pack_header(struct pack_header *hdr)
563{
a69e5429
JH
564 switch (read_pack_header(0, hdr)) {
565 case PH_ERROR_EOF:
566 return "eof before pack header was fully read";
567
568 case PH_ERROR_PACK_SIGNATURE:
fc04c412 569 return "protocol error (pack signature mismatch detected)";
a69e5429
JH
570
571 case PH_ERROR_PROTOCOL:
fc04c412 572 return "protocol error (pack version unsupported)";
a69e5429
JH
573
574 default:
575 return "unknown error in parse_pack_header";
576
577 case 0:
578 return NULL;
579 }
fc04c412
SP
580}
581
576162a4
NP
582static const char *pack_lockfile;
583
861ed121 584static const char *unpack(void)
575f4974 585{
fc04c412
SP
586 struct pack_header hdr;
587 const char *hdr_err;
588 char hdr_arg[38];
fc04c412
SP
589
590 hdr_err = parse_pack_header(&hdr);
591 if (hdr_err)
592 return hdr_err;
6e1c2344
RJ
593 snprintf(hdr_arg, sizeof(hdr_arg),
594 "--pack_header=%"PRIu32",%"PRIu32,
fc04c412
SP
595 ntohl(hdr.hdr_version), ntohl(hdr.hdr_entries));
596
597 if (ntohl(hdr.hdr_entries) < unpack_limit) {
20dc0016
MK
598 int code, i = 0;
599 const char *unpacker[4];
600 unpacker[i++] = "unpack-objects";
601 if (receive_fsck_objects)
602 unpacker[i++] = "--strict";
603 unpacker[i++] = hdr_arg;
604 unpacker[i++] = NULL;
9b0b5093 605 code = run_command_v_opt(unpacker, RUN_GIT_CMD);
2ff4d1ab 606 if (!code)
fc04c412 607 return NULL;
2ff4d1ab 608 return "unpack-objects abnormal exit";
576162a4 609 } else {
20dc0016
MK
610 const char *keeper[7];
611 int s, status, i = 0;
576162a4 612 char keep_arg[256];
e8016abf 613 struct child_process ip;
576162a4 614
85e72830 615 s = sprintf(keep_arg, "--keep=receive-pack %"PRIuMAX" on ", (uintmax_t) getpid());
576162a4
NP
616 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
617 strcpy(keep_arg + s, "localhost");
618
20dc0016
MK
619 keeper[i++] = "index-pack";
620 keeper[i++] = "--stdin";
621 if (receive_fsck_objects)
622 keeper[i++] = "--strict";
623 keeper[i++] = "--fix-thin";
624 keeper[i++] = hdr_arg;
625 keeper[i++] = keep_arg;
626 keeper[i++] = NULL;
e8016abf
SP
627 memset(&ip, 0, sizeof(ip));
628 ip.argv = keeper;
629 ip.out = -1;
630 ip.git_cmd = 1;
2ff4d1ab
JS
631 status = start_command(&ip);
632 if (status) {
576162a4 633 return "index-pack fork failed";
2ff4d1ab 634 }
106764e6 635 pack_lockfile = index_pack_lockfile(ip.out);
e72ae288 636 close(ip.out);
e8016abf
SP
637 status = finish_command(&ip);
638 if (!status) {
576162a4
NP
639 reprepare_packed_git();
640 return NULL;
641 }
642 return "index-pack abnormal exit";
cfee10a7
JH
643 }
644}
645
646static void report(const char *unpack_status)
647{
648 struct command *cmd;
38a81b4e
SP
649 struct strbuf buf = STRBUF_INIT;
650
651 packet_buf_write(&buf, "unpack %s\n",
652 unpack_status ? unpack_status : "ok");
cfee10a7
JH
653 for (cmd = commands; cmd; cmd = cmd->next) {
654 if (!cmd->error_string)
38a81b4e
SP
655 packet_buf_write(&buf, "ok %s\n",
656 cmd->ref_name);
cfee10a7 657 else
38a81b4e
SP
658 packet_buf_write(&buf, "ng %s %s\n",
659 cmd->ref_name, cmd->error_string);
575f4974 660 }
38a81b4e
SP
661 packet_buf_flush(&buf);
662
663 if (use_sideband)
664 send_sideband(1, 1, buf.buf, buf.len, use_sideband);
665 else
666 safe_write(1, buf.buf, buf.len);
667 strbuf_release(&buf);
575f4974
LT
668}
669
d4f694ba
JH
670static int delete_only(struct command *cmd)
671{
672 while (cmd) {
673 if (!is_null_sha1(cmd->new_sha1))
674 return 0;
675 cmd = cmd->next;
676 }
677 return 1;
678}
679
d79796bc
JH
680static int add_refs_from_alternate(struct alternate_object_database *e, void *unused)
681{
b8492539
JH
682 char *other;
683 size_t len;
d79796bc
JH
684 struct remote *remote;
685 struct transport *transport;
686 const struct ref *extra;
687
b8492539
JH
688 e->name[-1] = '\0';
689 other = xstrdup(make_absolute_path(e->base));
690 e->name[-1] = '/';
691 len = strlen(other);
692
d79796bc
JH
693 while (other[len-1] == '/')
694 other[--len] = '\0';
695 if (len < 8 || memcmp(other + len - 8, "/objects", 8))
696 return 0;
697 /* Is this a git repository with refs? */
698 memcpy(other + len - 8, "/refs", 6);
699 if (!is_directory(other))
700 return 0;
701 other[len - 8] = '\0';
702 remote = remote_get(other);
703 transport = transport_get(remote, other);
704 for (extra = transport_get_remote_refs(transport);
705 extra;
706 extra = extra->next) {
707 add_extra_ref(".have", extra->old_sha1, 0);
708 }
709 transport_disconnect(transport);
710 free(other);
711 return 0;
712}
713
714static void add_alternate_refs(void)
715{
716 foreach_alt_odb(add_refs_from_alternate, NULL);
717}
718
be5908ae 719int cmd_receive_pack(int argc, const char **argv, const char *prefix)
575f4974 720{
42526b47
SP
721 int advertise_refs = 0;
722 int stateless_rpc = 0;
d0efc8a7 723 int i;
8d630132 724 char *dir = NULL;
575f4974
LT
725
726 argv++;
727 for (i = 1; i < argc; i++) {
be5908ae 728 const char *arg = *argv++;
575f4974
LT
729
730 if (*arg == '-') {
42526b47
SP
731 if (!strcmp(arg, "--advertise-refs")) {
732 advertise_refs = 1;
733 continue;
734 }
735 if (!strcmp(arg, "--stateless-rpc")) {
736 stateless_rpc = 1;
737 continue;
738 }
739
575f4974
LT
740 usage(receive_pack_usage);
741 }
d0efc8a7
LT
742 if (dir)
743 usage(receive_pack_usage);
be5908ae 744 dir = xstrdup(arg);
575f4974
LT
745 }
746 if (!dir)
747 usage(receive_pack_usage);
748
e1464ca7 749 setup_path();
5c09f321 750
3159c8dc 751 if (!enter_repo(dir, 0))
05ac6b34 752 die("'%s' does not appear to be a git repository", dir);
575f4974 753
a0022eeb
JH
754 if (is_repository_shallow())
755 die("attempt to push into a shallow repository");
756
ef90d6d4 757 git_config(receive_pack_config, NULL);
6fb75bed 758
e28714c5
JH
759 if (0 <= transfer_unpack_limit)
760 unpack_limit = transfer_unpack_limit;
761 else if (0 <= receive_unpack_limit)
762 unpack_limit = receive_unpack_limit;
763
42526b47
SP
764 if (advertise_refs || !stateless_rpc) {
765 add_alternate_refs();
766 write_head_info();
767 clear_extra_refs();
575f4974 768
42526b47
SP
769 /* EOF */
770 packet_flush(1);
771 }
772 if (advertise_refs)
773 return 0;
575f4974
LT
774
775 read_head_info();
7f8e9828 776 if (commands) {
d4f694ba
JH
777 const char *unpack_status = NULL;
778
779 if (!delete_only(commands))
780 unpack_status = unpack();
8aaf7d64 781 execute_commands(unpack_status);
576162a4 782 if (pack_lockfile)
691f1a28 783 unlink_or_warn(pack_lockfile);
cfee10a7
JH
784 if (report_status)
785 report(unpack_status);
ae98a008 786 run_receive_hook(post_receive_hook);
8e663d9e 787 run_update_post_hook(commands);
77e3efbf
JH
788 if (auto_gc) {
789 const char *argv_gc_auto[] = {
790 "gc", "--auto", "--quiet", NULL,
791 };
792 run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
793 }
794 if (auto_update_server_info)
795 update_server_info(0);
7f8e9828 796 }
38a81b4e
SP
797 if (use_sideband)
798 packet_flush(1);
575f4974
LT
799 return 0;
800}