upload-pack.c 19.9 KB
Newer Older
1 2 3
#include "cache.h"
#include "refs.h"
#include "pkt-line.h"
4
#include "sideband.h"
5 6
#include "tag.h"
#include "object.h"
7
#include "commit.h"
8
#include "exec_cmd.h"
9 10 11
#include "diff.h"
#include "revision.h"
#include "list-objects.h"
12
#include "run-command.h"
13
#include "sigchain.h"
14

15
static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<n>] <dir>";
16

17 18 19 20 21 22 23
/* bits #0..7 in revision.h, #8..10 in commit.c */
#define THEY_HAVE	(1u << 11)
#define OUR_REF		(1u << 12)
#define WANTED		(1u << 13)
#define COMMON_KNOWN	(1u << 14)
#define REACHABLE	(1u << 15)

24 25 26 27
#define SHALLOW		(1u << 16)
#define NOT_SHALLOW	(1u << 17)
#define CLIENT_SHALLOW	(1u << 18)

J
Junio C Hamano 已提交
28
static unsigned long oldest_have;
29

30
static int multi_ack, nr_our_refs;
J
Junio C Hamano 已提交
31
static int no_done;
32
static int use_thin_pack, use_ofs_delta, use_include_tag;
33
static int no_progress, daemon_mode;
34
static int shallow_nr;
35 36
static struct object_array have_obj;
static struct object_array want_obj;
37
static struct object_array extra_edge_obj;
38
static unsigned int timeout;
39 40 41
/* 0 for no sideband,
 * otherwise maximum packet size (up to 65520 bytes).
 */
42
static int use_sideband;
43
static int debug_fd;
44 45
static int advertise_refs;
static int stateless_rpc;
46 47 48 49 50

static void reset_timeout(void)
{
	alarm(timeout);
}
51

52 53 54 55 56 57 58
static int strip(char *line, int len)
{
	if (len && line[len-1] == '\n')
		line[--len] = 0;
	return len;
}

59 60
static ssize_t send_client_data(int fd, const char *data, ssize_t sz)
{
61
	if (use_sideband)
62
		return send_sideband(1, fd, data, sz, use_sideband);
63 64 65 66
	if (fd == 3)
		/* emergency quit */
		fd = 2;
	if (fd == 2) {
67
		/* XXX: are we happy to lose stuff here? */
68 69
		xwrite(fd, data, sz);
		return sz;
70
	}
71
	return safe_write(fd, data, sz);
72 73
}

J
Junio C Hamano 已提交
74
static FILE *pack_pipe = NULL;
75
static void show_commit(struct commit *commit, void *data)
76 77 78 79 80 81 82 83 84 85 86
{
	if (commit->object.flags & BOUNDARY)
		fputc('-', pack_pipe);
	if (fputs(sha1_to_hex(commit->object.sha1), pack_pipe) < 0)
		die("broken output pipe");
	fputc('\n', pack_pipe);
	fflush(pack_pipe);
	free(commit->buffer);
	commit->buffer = NULL;
}

87 88 89
static void show_object(struct object *obj,
			const struct name_path *path, const char *component,
			void *cb_data)
90
{
91
	show_object_with_name(pack_pipe, obj, path, component);
92 93 94 95 96 97 98
}

static void show_edge(struct commit *commit)
{
	fprintf(pack_pipe, "-%s\n", sha1_to_hex(commit->object.sha1));
}

99
static int do_rev_list(int in, int out, void *user_data)
100 101 102 103
{
	int i;
	struct rev_info revs;

104
	pack_pipe = xfdopen(out, "w");
105 106 107 108 109 110 111
	init_revisions(&revs, NULL);
	revs.tag_objects = 1;
	revs.tree_objects = 1;
	revs.blob_objects = 1;
	if (use_thin_pack)
		revs.edge_hint = 1;

112 113 114 115 116
	for (i = 0; i < want_obj.nr; i++) {
		struct object *o = want_obj.objects[i].item;
		/* why??? */
		o->flags &= ~UNINTERESTING;
		add_pending_object(&revs, o, NULL);
117
	}
118 119 120 121 122 123
	for (i = 0; i < have_obj.nr; i++) {
		struct object *o = have_obj.objects[i].item;
		o->flags |= UNINTERESTING;
		add_pending_object(&revs, o, NULL);
	}
	setup_revisions(0, NULL, &revs, NULL);
124 125
	if (prepare_revision_walk(&revs))
		die("revision walk setup failed");
126
	mark_edges_uninteresting(revs.commits, &revs, show_edge);
127 128 129 130
	if (use_thin_pack)
		for (i = 0; i < extra_edge_obj.nr; i++)
			fprintf(pack_pipe, "-%s\n", sha1_to_hex(
					extra_edge_obj.objects[i].item->sha1));
131
	traverse_commit_list(&revs, show_commit, show_object, NULL);
132 133
	fflush(pack_pipe);
	fclose(pack_pipe);
134
	return 0;
135 136
}

137 138
static void create_pack_file(void)
{
139
	struct async rev_list;
140
	struct child_process pack_objects;
141
	int create_full_pack = (nr_our_refs == want_obj.nr && !have_obj.nr);
142
	char data[8193], progress[128];
143 144
	char abort_msg[] = "aborting due to possible repository "
		"corruption on the remote side.";
145
	int buffered = -1;
J
Junio C Hamano 已提交
146
	ssize_t sz;
147 148
	const char *argv[10];
	int arg = 0;
149

150 151
	argv[arg++] = "pack-objects";
	if (!shallow_nr) {
152 153 154 155 156 157
		argv[arg++] = "--revs";
		if (create_full_pack)
			argv[arg++] = "--all";
		else if (use_thin_pack)
			argv[arg++] = "--thin";
	}
158

159 160 161 162 163
	argv[arg++] = "--stdout";
	if (!no_progress)
		argv[arg++] = "--progress";
	if (use_ofs_delta)
		argv[arg++] = "--delta-base-offset";
164 165
	if (use_include_tag)
		argv[arg++] = "--include-tag";
166 167 168
	argv[arg++] = NULL;

	memset(&pack_objects, 0, sizeof(pack_objects));
169
	pack_objects.in = -1;
170 171 172 173
	pack_objects.out = -1;
	pack_objects.err = -1;
	pack_objects.git_cmd = 1;
	pack_objects.argv = argv;
174

175
	if (start_command(&pack_objects))
176
		die("git upload-pack: unable to fork git-pack-objects");
177

178 179 180 181 182 183 184 185
	if (shallow_nr) {
		memset(&rev_list, 0, sizeof(rev_list));
		rev_list.proc = do_rev_list;
		rev_list.out = pack_objects.in;
		if (start_async(&rev_list))
			die("git upload-pack: unable to fork git-rev-list");
	}
	else {
186
		FILE *pipe_fd = xfdopen(pack_objects.in, "w");
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
		if (!create_full_pack) {
			int i;
			for (i = 0; i < want_obj.nr; i++)
				fprintf(pipe_fd, "%s\n", sha1_to_hex(want_obj.objects[i].item->sha1));
			fprintf(pipe_fd, "--not\n");
			for (i = 0; i < have_obj.nr; i++)
				fprintf(pipe_fd, "%s\n", sha1_to_hex(have_obj.objects[i].item->sha1));
		}

		fprintf(pipe_fd, "\n");
		fflush(pipe_fd);
		fclose(pipe_fd);
	}


202 203
	/* We read from pack_objects.err to capture stderr output for
	 * progress bar, and pack_objects.out to capture the pack data.
204 205 206 207
	 */

	while (1) {
		struct pollfd pfd[2];
208
		int pe, pu, pollsize;
209

210 211
		reset_timeout();

212
		pollsize = 0;
213
		pe = pu = -1;
214

215 216
		if (0 <= pack_objects.out) {
			pfd[pollsize].fd = pack_objects.out;
217 218 219 220
			pfd[pollsize].events = POLLIN;
			pu = pollsize;
			pollsize++;
		}
221 222
		if (0 <= pack_objects.err) {
			pfd[pollsize].fd = pack_objects.err;
223 224 225 226
			pfd[pollsize].events = POLLIN;
			pe = pollsize;
			pollsize++;
		}
227

228 229 230 231 232 233 234 235
		if (!pollsize)
			break;

		if (poll(pfd, pollsize, -1) < 0) {
			if (errno != EINTR) {
				error("poll failed, resuming: %s",
				      strerror(errno));
				sleep(1);
236
			}
237 238
			continue;
		}
N
Nicolas Pitre 已提交
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
		if (0 <= pe && (pfd[pe].revents & (POLLIN|POLLHUP))) {
			/* Status ready; we ship that in the side-band
			 * or dump to the standard error.
			 */
			sz = xread(pack_objects.err, progress,
				  sizeof(progress));
			if (0 < sz)
				send_client_data(2, progress, sz);
			else if (sz == 0) {
				close(pack_objects.err);
				pack_objects.err = -1;
			}
			else
				goto fail;
			/* give priority to status messages */
			continue;
		}
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
		if (0 <= pu && (pfd[pu].revents & (POLLIN|POLLHUP))) {
			/* Data ready; we keep the last byte to ourselves
			 * in case we detect broken rev-list, so that we
			 * can leave the stream corrupted.  This is
			 * unfortunate -- unpack-objects would happily
			 * accept a valid packdata with trailing garbage,
			 * so appending garbage after we pass all the
			 * pack data is not good enough to signal
			 * breakage to downstream.
			 */
			char *cp = data;
			ssize_t outsz = 0;
			if (0 <= buffered) {
				*cp++ = buffered;
				outsz++;
271
			}
272 273 274
			sz = xread(pack_objects.out, cp,
				  sizeof(data) - outsz);
			if (0 < sz)
J
Junio C Hamano 已提交
275
				;
276 277 278
			else if (sz == 0) {
				close(pack_objects.out);
				pack_objects.out = -1;
279
			}
280 281 282 283 284 285
			else
				goto fail;
			sz += outsz;
			if (1 < sz) {
				buffered = data[sz-1] & 0xFF;
				sz--;
286
			}
287 288 289 290
			else
				buffered = -1;
			sz = send_client_data(1, data, sz);
			if (sz < 0)
291
				goto fail;
292 293
		}
	}
294

295
	if (finish_command(&pack_objects)) {
296
		error("git upload-pack: git-pack-objects died with error.");
297 298
		goto fail;
	}
299
	if (shallow_nr && finish_async(&rev_list))
300
		goto fail;	/* error was already reported */
301

302 303 304 305 306 307 308
	/* flush the data */
	if (0 <= buffered) {
		data[0] = buffered;
		sz = send_client_data(1, data, 1);
		if (sz < 0)
			goto fail;
		fprintf(stderr, "flushed.\n");
309
	}
310 311 312 313
	if (use_sideband)
		packet_flush(1);
	return;

314
 fail:
315
	send_client_data(3, abort_msg, sizeof(abort_msg));
316
	die("git upload-pack: %s", abort_msg);
317 318
}

319 320
static int got_sha1(char *hex, unsigned char *sha1)
{
321
	struct object *o;
322
	int we_knew_they_have = 0;
323

324
	if (get_sha1_hex(hex, sha1))
325
		die("git upload-pack: expected SHA1 object, got '%s'", hex);
326
	if (!has_sha1_file(sha1))
327
		return -1;
328 329 330 331 332 333

	o = lookup_object(sha1);
	if (!(o && o->parsed))
		o = parse_object(sha1);
	if (!o)
		die("oops (%s)", sha1_to_hex(sha1));
J
Junio C Hamano 已提交
334
	if (o->type == OBJ_COMMIT) {
335
		struct commit_list *parents;
336
		struct commit *commit = (struct commit *)o;
337
		if (o->flags & THEY_HAVE)
338 339 340 341 342 343
			we_knew_they_have = 1;
		else
			o->flags |= THEY_HAVE;
		if (!oldest_have || (commit->date < oldest_have))
			oldest_have = commit->date;
		for (parents = commit->parents;
344 345 346
		     parents;
		     parents = parents->next)
			parents->item->object.flags |= THEY_HAVE;
347
	}
348 349 350 351 352 353 354 355 356 357 358
	if (!we_knew_they_have) {
		add_object_array(o, NULL, &have_obj);
		return 1;
	}
	return 0;
}

static int reachable(struct commit *want)
{
	struct commit_list *work = NULL;

359
	commit_list_insert_by_date(want, &work);
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
	while (work) {
		struct commit_list *list = work->next;
		struct commit *commit = work->item;
		free(work);
		work = list;

		if (commit->object.flags & THEY_HAVE) {
			want->object.flags |= COMMON_KNOWN;
			break;
		}
		if (!commit->object.parsed)
			parse_object(commit->object.sha1);
		if (commit->object.flags & REACHABLE)
			continue;
		commit->object.flags |= REACHABLE;
		if (commit->date < oldest_have)
			continue;
		for (list = commit->parents; list; list = list->next) {
			struct commit *parent = list->item;
			if (!(parent->object.flags & REACHABLE))
380
				commit_list_insert_by_date(parent, &work);
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
		}
	}
	want->object.flags |= REACHABLE;
	clear_commit_marks(want, REACHABLE);
	free_commit_list(work);
	return (want->object.flags & COMMON_KNOWN);
}

static int ok_to_give_up(void)
{
	int i;

	if (!have_obj.nr)
		return 0;

	for (i = 0; i < want_obj.nr; i++) {
		struct object *want = want_obj.objects[i].item;

		if (want->flags & COMMON_KNOWN)
			continue;
		want = deref_tag(want, "a want line", 0);
		if (!want || want->type != OBJ_COMMIT) {
			/* no way to tell if this is reachable by
			 * looking at the ancestry chain alone, so
			 * leave a note to ourselves not to worry about
			 * this object anymore.
			 */
			want_obj.objects[i].item->flags |= COMMON_KNOWN;
			continue;
		}
		if (!reachable((struct commit *)want))
			return 0;
	}
414
	return 1;
415 416 417 418 419
}

static int get_common_commits(void)
{
	static char line[1000];
420
	unsigned char sha1[20];
421
	char last_hex[41];
422 423
	int got_common = 0;
	int got_other = 0;
J
Junio C Hamano 已提交
424
	int sent_ready = 0;
425

426 427
	save_commit_buffer = 0;

428
	for (;;) {
429
		int len = packet_read_line(0, line, sizeof(line));
430
		reset_timeout();
431 432

		if (!len) {
433
			if (multi_ack == 2 && got_common
J
Junio C Hamano 已提交
434 435
			    && !got_other && ok_to_give_up()) {
				sent_ready = 1;
436
				packet_write(1, "ACK %s ready\n", last_hex);
J
Junio C Hamano 已提交
437
			}
438
			if (have_obj.nr == 0 || multi_ack)
439
				packet_write(1, "NAK\n");
J
Junio C Hamano 已提交
440 441 442 443 444

			if (no_done && sent_ready) {
				packet_write(1, "ACK %s\n", last_hex);
				return 0;
			}
445 446
			if (stateless_rpc)
				exit(0);
447 448
			got_common = 0;
			got_other = 0;
449 450
			continue;
		}
451
		strip(line, len);
452
		if (!prefixcmp(line, "have ")) {
453 454
			switch (got_sha1(line+5, sha1)) {
			case -1: /* they have what we do not */
455
				got_other = 1;
456 457
				if (multi_ack && ok_to_give_up()) {
					const char *hex = sha1_to_hex(sha1);
J
Junio C Hamano 已提交
458 459
					if (multi_ack == 2) {
						sent_ready = 1;
460
						packet_write(1, "ACK %s ready\n", hex);
J
Junio C Hamano 已提交
461
					} else
462 463
						packet_write(1, "ACK %s continue\n", hex);
				}
464 465
				break;
			default:
466
				got_common = 1;
467 468 469 470 471
				memcpy(last_hex, sha1_to_hex(sha1), 41);
				if (multi_ack == 2)
					packet_write(1, "ACK %s common\n", last_hex);
				else if (multi_ack)
					packet_write(1, "ACK %s continue\n", last_hex);
472
				else if (have_obj.nr == 1)
473
					packet_write(1, "ACK %s\n", last_hex);
474
				break;
475
			}
476 477 478
			continue;
		}
		if (!strcmp(line, "done")) {
479
			if (have_obj.nr > 0) {
480
				if (multi_ack)
481
					packet_write(1, "ACK %s\n", last_hex);
482 483
				return 0;
			}
484 485 486
			packet_write(1, "NAK\n");
			return -1;
		}
487
		die("git upload-pack: expected SHA1 list, got '%s'", line);
488 489 490
	}
}

491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524
static void check_non_tip(void)
{
	static const char *argv[] = {
		"rev-list", "--stdin", NULL,
	};
	static struct child_process cmd;
	struct object *o;
	char namebuf[42]; /* ^ + SHA-1 + LF */
	int i;

	/* In the normal in-process case non-tip request can never happen */
	if (!stateless_rpc)
		goto error;

	cmd.argv = argv;
	cmd.git_cmd = 1;
	cmd.no_stderr = 1;
	cmd.in = -1;
	cmd.out = -1;

	if (start_command(&cmd))
		goto error;

	/*
	 * If rev-list --stdin encounters an unknown commit, it
	 * terminates, which will cause SIGPIPE in the write loop
	 * below.
	 */
	sigchain_push(SIGPIPE, SIG_IGN);

	namebuf[0] = '^';
	namebuf[41] = '\n';
	for (i = get_max_object_index(); 0 < i; ) {
		o = get_indexed_object(--i);
525 526
		if (!o)
			continue;
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
		if (!(o->flags & OUR_REF))
			continue;
		memcpy(namebuf + 1, sha1_to_hex(o->sha1), 40);
		if (write_in_full(cmd.in, namebuf, 42) < 0)
			goto error;
	}
	namebuf[40] = '\n';
	for (i = 0; i < want_obj.nr; i++) {
		o = want_obj.objects[i].item;
		if (o->flags & OUR_REF)
			continue;
		memcpy(namebuf, sha1_to_hex(o->sha1), 40);
		if (write_in_full(cmd.in, namebuf, 41) < 0)
			goto error;
	}
	close(cmd.in);

	sigchain_pop(SIGPIPE);

	/*
	 * The commits out of the rev-list are not ancestors of
	 * our ref.
	 */
	i = read_in_full(cmd.out, namebuf, 1);
	if (i)
		goto error;
	close(cmd.out);

	/*
	 * rev-list may have died by encountering a bad commit
	 * in the history, in which case we do want to bail out
	 * even when it showed no commit.
	 */
	if (finish_command(&cmd))
		goto error;

	/* All the non-tip ones are ancestors of what we advertised */
	return;

error:
	/* Pick one of them (we know there at least is one) */
	for (i = 0; i < want_obj.nr; i++) {
		o = want_obj.objects[i].item;
		if (!(o->flags & OUR_REF))
			die("git upload-pack: not our ref %s",
			    sha1_to_hex(o->sha1));
	}
}

576
static void receive_needs(void)
577
{
578
	struct object_array shallows = OBJECT_ARRAY_INIT;
579
	static char line[1000];
580
	int len, depth = 0;
581
	int has_non_tip = 0;
582

583
	shallow_nr = 0;
584
	if (debug_fd)
585
		write_str_in_full(debug_fd, "#S\n");
586
	for (;;) {
587
		struct object *o;
588
		const char *features;
589
		unsigned char sha1_buf[20];
590
		len = packet_read_line(0, line, sizeof(line));
591
		reset_timeout();
592
		if (!len)
593
			break;
594 595
		if (debug_fd)
			write_in_full(debug_fd, line, len);
596

597
		if (!prefixcmp(line, "shallow ")) {
598 599 600 601 602 603 604
			unsigned char sha1[20];
			struct object *object;
			if (get_sha1(line + 8, sha1))
				die("invalid shallow line: %s", line);
			object = parse_object(sha1);
			if (!object)
				die("did not find object for %s", line);
605
			object->flags |= CLIENT_SHALLOW;
606 607 608
			add_object_array(object, NULL, &shallows);
			continue;
		}
609
		if (!prefixcmp(line, "deepen ")) {
610 611 612 613 614 615
			char *end;
			depth = strtol(line + 7, &end, 0);
			if (end == line + 7 || depth <= 0)
				die("Invalid deepen: %s", line);
			continue;
		}
616
		if (prefixcmp(line, "want ") ||
617
		    get_sha1_hex(line+5, sha1_buf))
618
			die("git upload-pack: protocol error, "
619
			    "expected to get sha, not '%s'", line);
620 621 622 623

		features = line + 45;

		if (parse_feature_request(features, "multi_ack_detailed"))
624
			multi_ack = 2;
625
		else if (parse_feature_request(features, "multi_ack"))
626
			multi_ack = 1;
627
		if (parse_feature_request(features, "no-done"))
J
Junio C Hamano 已提交
628
			no_done = 1;
629
		if (parse_feature_request(features, "thin-pack"))
630
			use_thin_pack = 1;
631
		if (parse_feature_request(features, "ofs-delta"))
632
			use_ofs_delta = 1;
633
		if (parse_feature_request(features, "side-band-64k"))
634
			use_sideband = LARGE_PACKET_MAX;
635
		else if (parse_feature_request(features, "side-band"))
636
			use_sideband = DEFAULT_PACKET_MAX;
637
		if (parse_feature_request(features, "no-progress"))
638
			no_progress = 1;
639
		if (parse_feature_request(features, "include-tag"))
640
			use_include_tag = 1;
641 642

		o = lookup_object(sha1_buf);
643
		if (!o)
644 645
			die("git upload-pack: not our ref %s",
			    sha1_to_hex(sha1_buf));
646 647
		if (!(o->flags & WANTED)) {
			o->flags |= WANTED;
648 649
			if (!(o->flags & OUR_REF))
				has_non_tip = 1;
650
			add_object_array(o, NULL, &want_obj);
651
		}
652
	}
653
	if (debug_fd)
654
		write_str_in_full(debug_fd, "#E\n");
655

656 657 658 659 660 661 662 663 664 665
	/*
	 * We have sent all our refs already, and the other end
	 * should have chosen out of them. When we are operating
	 * in the stateless RPC mode, however, their choice may
	 * have been based on the set of older refs advertised
	 * by another process that handled the initial request.
	 */
	if (has_non_tip)
		check_non_tip();

666 667 668
	if (!use_sideband && daemon_mode)
		no_progress = 1;

669 670
	if (depth == 0 && shallows.nr == 0)
		return;
671 672
	if (depth > 0) {
		struct commit_list *result, *backup;
673 674 675
		int i;
		backup = result = get_shallow_commits(&want_obj, depth,
			SHALLOW, NOT_SHALLOW);
676
		while (result) {
677
			struct object *object = &result->item->object;
678
			if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) {
679 680 681
				packet_write(1, "shallow %s",
						sha1_to_hex(object->sha1));
				register_shallow(object->sha1);
682
				shallow_nr++;
683
			}
684 685 686
			result = result->next;
		}
		free_commit_list(backup);
687 688 689 690 691 692 693 694 695
		for (i = 0; i < shallows.nr; i++) {
			struct object *object = shallows.objects[i].item;
			if (object->flags & NOT_SHALLOW) {
				struct commit_list *parents;
				packet_write(1, "unshallow %s",
					sha1_to_hex(object->sha1));
				object->flags &= ~CLIENT_SHALLOW;
				/* make sure the real parents are parsed */
				unregister_shallow(object->sha1);
696
				object->parsed = 0;
697 698
				if (parse_commit((struct commit *)object))
					die("invalid commit");
699 700 701 702 703 704
				parents = ((struct commit *)object)->parents;
				while (parents) {
					add_object_array(&parents->item->object,
							NULL, &want_obj);
					parents = parents->next;
				}
705
				add_object_array(object, NULL, &extra_edge_obj);
706 707 708 709 710 711 712 713 714 715 716
			}
			/* make sure commit traversal conforms to client */
			register_shallow(object->sha1);
		}
		packet_flush(1);
	} else
		if (shallows.nr > 0) {
			int i;
			for (i = 0; i < shallows.nr; i++)
				register_shallow(shallows.objects[i].item->sha1);
		}
717 718

	shallow_nr += shallows.nr;
719
	free(shallows.objects);
720 721
}

722
static int send_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
723
{
724
	static const char *capabilities = "multi_ack thin-pack side-band"
725
		" side-band-64k ofs-delta shallow no-progress"
726
		" include-tag multi_ack_detailed";
727
	struct object *o = lookup_unknown_object(sha1);
728
	const char *refname_nons = strip_namespace(refname);
729

730 731 732 733 734
	if (o->type == OBJ_NONE) {
		o->type = sha1_object_info(sha1, NULL);
		if (o->type < 0)
		    die("git upload-pack: cannot find object %s:", sha1_to_hex(sha1));
	}
735

J
Johannes Schindelin 已提交
736
	if (capabilities)
737
		packet_write(1, "%s %s%c%s%s\n", sha1_to_hex(sha1), refname_nons,
738 739
			     0, capabilities,
			     stateless_rpc ? " no-done" : "");
J
Johannes Schindelin 已提交
740
	else
741
		packet_write(1, "%s %s\n", sha1_to_hex(sha1), refname_nons);
J
Johannes Schindelin 已提交
742
	capabilities = NULL;
743 744 745 746
	if (!(o->flags & OUR_REF)) {
		o->flags |= OUR_REF;
		nr_our_refs++;
	}
747
	if (o->type == OBJ_TAG) {
748
		o = deref_tag_noverify(o);
749
		if (o)
750
			packet_write(1, "%s %s^{}\n", sha1_to_hex(o->sha1), refname_nons);
751
	}
752 753 754
	return 0;
}

755 756 757 758 759 760 761 762 763 764 765 766
static int mark_our_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
{
	struct object *o = parse_object(sha1);
	if (!o)
		die("git upload-pack: cannot find object %s:", sha1_to_hex(sha1));
	if (!(o->flags & OUR_REF)) {
		o->flags |= OUR_REF;
		nr_our_refs++;
	}
	return 0;
}

767
static void upload_pack(void)
768
{
769 770
	if (advertise_refs || !stateless_rpc) {
		reset_timeout();
771 772
		head_ref_namespaced(send_ref, NULL);
		for_each_namespaced_ref(send_ref, NULL);
773 774
		packet_flush(1);
	} else {
775 776
		head_ref_namespaced(mark_our_ref, NULL);
		for_each_namespaced_ref(mark_our_ref, NULL);
777 778 779 780
	}
	if (advertise_refs)
		return;

781
	receive_needs();
782 783 784 785
	if (want_obj.nr) {
		get_common_commits();
		create_pack_file();
	}
786 787 788 789
}

int main(int argc, char **argv)
{
790
	char *dir;
791 792 793
	int i;
	int strict = 0;

794 795
	git_setup_gettext();

J
Jeff King 已提交
796
	packet_trace_identity("upload-pack");
797
	git_extract_argv0_path(argv[0]);
798
	read_replace_refs = 0;
799

800 801 802 803 804
	for (i = 1; i < argc; i++) {
		char *arg = argv[i];

		if (arg[0] != '-')
			break;
805 806 807 808 809 810 811 812
		if (!strcmp(arg, "--advertise-refs")) {
			advertise_refs = 1;
			continue;
		}
		if (!strcmp(arg, "--stateless-rpc")) {
			stateless_rpc = 1;
			continue;
		}
813 814 815 816
		if (!strcmp(arg, "--strict")) {
			strict = 1;
			continue;
		}
817
		if (!prefixcmp(arg, "--timeout=")) {
818
			timeout = atoi(arg+10);
819
			daemon_mode = 1;
820 821 822 823 824 825 826
			continue;
		}
		if (!strcmp(arg, "--")) {
			i++;
			break;
		}
	}
J
Junio C Hamano 已提交
827

828
	if (i != argc-1)
829
		usage(upload_pack_usage);
830

831
	setup_path();
832

833
	dir = argv[i];
834

835
	if (!enter_repo(dir, strict))
836
		die("'%s' does not appear to be a git repository", dir);
837 838
	if (is_repository_shallow())
		die("attempt to fetch/clone from a shallow repository");
839 840
	if (getenv("GIT_DEBUG_SEND_PACK"))
		debug_fd = atoi(getenv("GIT_DEBUG_SEND_PACK"));
841 842 843
	upload_pack();
	return 0;
}