send-pack.c 10.6 KB
Newer Older
1
#include "cache.h"
2
#include "commit.h"
3
#include "tag.h"
4
#include "refs.h"
5
#include "pkt-line.h"
6
#include "exec_cmd.h"
7

8
static const char send_pack_usage[] =
9 10
"git-send-pack [--all] [--exec=git-receive-pack] <remote> [<head>...]\n"
"  --all and explicit <head> specification are mutually exclusive.";
11
static const char *exec = "git-receive-pack";
12 13 14 15
static int verbose;
static int send_all;
static int force_update;
static int use_thin_pack;
16

17 18
static void exec_pack_objects(void)
{
J
Junio C Hamano 已提交
19
	static const char *args[] = {
20
		"pack-objects",
N
Nicolas Pitre 已提交
21
		"--all-progress",
22 23 24
		"--stdout",
		NULL
	};
25
	execv_git_cmd(args);
26 27 28 29 30
	die("git-pack-objects exec failed (%s)", strerror(errno));
}

static void exec_rev_list(struct ref *refs)
{
31 32
	static const char *args[4];
	int i = 0;
33

34
	args[i++] = "rev-list";	/* 0 */
35 36 37 38
	if (use_thin_pack)	/* 1 */
		args[i++] = "--objects-edge";
	else
		args[i++] = "--objects";
39

40
	args[i++] = "--stdin";
41

42
	args[i] = NULL;
43
	execv_git_cmd(args);
44 45 46
	die("git-rev-list exec failed (%s)", strerror(errno));
}

47 48 49
/*
 * Run "rev-list --stdin | pack-objects" pipe.
 */
J
Junio C Hamano 已提交
50
static void rev_list(struct ref *refs)
51 52 53 54 55 56 57 58
{
	int pipe_fd[2];
	pid_t pack_objects_pid;

	if (pipe(pipe_fd) < 0)
		die("rev-list setup: pipe failed");
	pack_objects_pid = fork();
	if (!pack_objects_pid) {
59 60 61
		/* The child becomes pack-objects; reads from pipe
		 * and writes to the original fd
		 */
62 63 64 65 66 67 68 69
		dup2(pipe_fd[0], 0);
		close(pipe_fd[0]);
		close(pipe_fd[1]);
		exec_pack_objects();
		die("pack-objects setup failed");
	}
	if (pack_objects_pid < 0)
		die("pack-objects fork failed");
70 71

	/* We become rev-list --stdin; output goes to pipe. */
72 73 74 75 76 77
	dup2(pipe_fd[1], 1);
	close(pipe_fd[0]);
	close(pipe_fd[1]);
	exec_rev_list(refs);
}

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
/*
 * Create "rev-list --stdin | pack-objects" pipe and feed
 * the refs into the pipeline.
 */
static void rev_list_generate(int fd, struct ref *refs)
{
	int pipe_fd[2];
	pid_t rev_list_generate_pid;

	if (pipe(pipe_fd) < 0)
		die("rev-list-generate setup: pipe failed");
	rev_list_generate_pid = fork();
	if (!rev_list_generate_pid) {
		/* The child becomes the "rev-list | pack-objects"
		 * pipeline.  It takes input from us, and its output
		 * goes to fd.
		 */
		dup2(pipe_fd[0], 0);
		dup2(fd, 1);
		close(pipe_fd[0]);
		close(pipe_fd[1]);
		close(fd);
J
Junio C Hamano 已提交
100
		rev_list(refs);
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
		die("rev-list setup failed");
	}
	if (rev_list_generate_pid < 0)
		die("rev-list-generate fork failed");

	/* We feed the rev parameters to them.  We do not write into
	 * fd nor read from the pipe.
	 */
	close(pipe_fd[0]);
	close(fd);
	while (refs) {
		char buf[42];

		if (!is_null_sha1(refs->old_sha1) &&
		    has_sha1_file(refs->old_sha1)) {
			memcpy(buf + 1, sha1_to_hex(refs->old_sha1), 40);
			buf[0] = '^';
			buf[41] = '\n';
			write(pipe_fd[1], buf, 42);
		}
		if (!is_null_sha1(refs->new_sha1)) {
			memcpy(buf, sha1_to_hex(refs->new_sha1), 40);
			buf[40] = '\n';
			write(pipe_fd[1], buf, 41);
		}
		refs = refs->next;
	}
	close(pipe_fd[1]);
	// waitpid(rev_list_generate_pid);
	exit(0);
}

/*
 * Make a pack stream and spit it out into file descriptor fd
 */
D
David Rientjes 已提交
136
static void pack_objects(int fd, struct ref *refs)
137 138 139 140 141
{
	pid_t rev_list_pid;

	rev_list_pid = fork();
	if (!rev_list_pid) {
142
		rev_list_generate(fd, refs);
143 144 145 146 147 148 149 150 151
		die("rev-list setup failed");
	}
	if (rev_list_pid < 0)
		die("rev-list fork failed");
	/*
	 * We don't wait for the rev-list pipeline in the parent:
	 * we end up waiting for the other end instead
	 */
}
152

J
Junio C Hamano 已提交
153 154 155 156 157 158 159 160 161 162
static void unmark_and_free(struct commit_list *list, unsigned int mark)
{
	while (list) {
		struct commit_list *temp = list;
		temp->item->object.flags &= ~mark;
		list = temp->next;
		free(temp);
	}
}

163 164
static int ref_newer(const unsigned char *new_sha1,
		     const unsigned char *old_sha1)
165
{
166 167
	struct object *o;
	struct commit *old, *new;
J
Junio C Hamano 已提交
168 169
	struct commit_list *list, *used;
	int found = 0;
170

171 172 173
	/* Both new and old must be commit-ish and new is descendant of
	 * old.  Otherwise we require --force.
	 */
174
	o = deref_tag(parse_object(old_sha1), NULL, 0);
175
	if (!o || o->type != OBJ_COMMIT)
176
		return 0;
177 178
	old = (struct commit *) o;

179
	o = deref_tag(parse_object(new_sha1), NULL, 0);
180
	if (!o || o->type != OBJ_COMMIT)
181
		return 0;
182 183
	new = (struct commit *) o;

184 185
	if (parse_commit(new) < 0)
		return 0;
J
Junio C Hamano 已提交
186 187

	used = list = NULL;
188
	commit_list_insert(new, &list);
L
Linus Torvalds 已提交
189 190
	while (list) {
		new = pop_most_recent_commit(&list, 1);
J
Junio C Hamano 已提交
191 192 193 194 195
		commit_list_insert(new, &used);
		if (new == old) {
			found = 1;
			break;
		}
196
	}
J
Junio C Hamano 已提交
197 198 199
	unmark_and_free(list, 1);
	unmark_and_free(used, 1);
	return found;
200 201
}

J
Junio C Hamano 已提交
202 203
static struct ref *local_refs, **local_tail;
static struct ref *remote_refs, **remote_tail;
204

205
static int one_local_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
206 207
{
	struct ref *ref;
J
Junio C Hamano 已提交
208 209
	int len = strlen(refname) + 1;
	ref = xcalloc(1, sizeof(*ref) + len);
210
	hashcpy(ref->new_sha1, sha1);
211
	memcpy(ref->name, refname, len);
J
Junio C Hamano 已提交
212 213
	*local_tail = ref;
	local_tail = &ref->next;
214 215 216
	return 0;
}

J
Junio C Hamano 已提交
217 218 219
static void get_local_heads(void)
{
	local_tail = &local_refs;
220
	for_each_ref(one_local_ref, NULL);
J
Junio C Hamano 已提交
221 222
}

223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
static int receive_status(int in)
{
	char line[1000];
	int ret = 0;
	int len = packet_read_line(in, line, sizeof(line));
	if (len < 10 || memcmp(line, "unpack ", 7)) {
		fprintf(stderr, "did not receive status back\n");
		return -1;
	}
	if (memcmp(line, "unpack ok\n", 10)) {
		fputs(line, stderr);
		ret = -1;
	}
	while (1) {
		len = packet_read_line(in, line, sizeof(line));
		if (!len)
			break;
		if (len < 3 ||
		    (memcmp(line, "ok", 2) && memcmp(line, "ng", 2))) {
			fprintf(stderr, "protocol error: %s\n", line);
			ret = -1;
			break;
		}
		if (!memcmp(line, "ok", 2))
			continue;
		fputs(line, stderr);
		ret = -1;
	}
	return ret;
}

J
Junio C Hamano 已提交
254
static int send_pack(int in, int out, int nr_refspec, char **refspec)
255
{
256
	struct ref *ref;
257
	int new_refs;
258
	int ret = 0;
259
	int ask_for_status_report = 0;
260
	int allow_deleting_refs = 0;
261
	int expect_status_report = 0;
262

J
Junio C Hamano 已提交
263
	/* No funny business with the matcher */
L
Linus Torvalds 已提交
264
	remote_tail = get_remote_heads(in, &remote_refs, 0, NULL, REF_NORMAL);
J
Junio C Hamano 已提交
265
	get_local_heads();
266

267 268 269
	/* Does the other end support the reporting? */
	if (server_supports("report-status"))
		ask_for_status_report = 1;
270 271
	if (server_supports("delete-refs"))
		allow_deleting_refs = 1;
272

J
Junio C Hamano 已提交
273 274 275 276 277 278
	/* match them up */
	if (!remote_tail)
		remote_tail = &remote_refs;
	if (match_refs(local_refs, remote_refs, &remote_tail,
		       nr_refspec, refspec, send_all))
		return -1;
D
Daniel Barkalow 已提交
279 280 281 282 283 284

	if (!remote_refs) {
		fprintf(stderr, "No refs in common and none specified; doing nothing.\n");
		return 0;
	}

285
	/*
J
Junio C Hamano 已提交
286
	 * Finally, tell the other end!
287
	 */
J
Junio C Hamano 已提交
288 289 290
	new_refs = 0;
	for (ref = remote_refs; ref; ref = ref->next) {
		char old_hex[60], *new_hex;
291 292
		int delete_ref;

J
Junio C Hamano 已提交
293
		if (!ref->peer_ref)
294
			continue;
295 296 297 298 299 300 301 302 303

		delete_ref = is_null_sha1(ref->peer_ref->new_sha1);
		if (delete_ref && !allow_deleting_refs) {
			error("remote does not support deleting refs");
			ret = -2;
			continue;
		}
		if (!delete_ref &&
		    !hashcmp(ref->old_sha1, ref->peer_ref->new_sha1)) {
304 305
			if (verbose)
				fprintf(stderr, "'%s': up-to-date\n", ref->name);
306 307 308 309 310 311
			continue;
		}

		/* This part determines what can overwrite what.
		 * The rules are:
		 *
312 313
		 * (0) you can always use --force or +A:B notation to
		 *     selectively force individual ref pairs.
314 315 316 317 318 319 320 321 322
		 *
		 * (1) if the old thing does not exist, it is OK.
		 *
		 * (2) if you do not have the old thing, you are not allowed
		 *     to overwrite it; you would not know what you are losing
		 *     otherwise.
		 *
		 * (3) if both new and old are commit-ish, and new is a
		 *     descendant of old, it is OK.
323 324 325
		 *
		 * (4) regardless of all of the above, removing :B is
		 *     always allowed.
326 327
		 */

328
		if (!force_update &&
329
		    !delete_ref &&
J
Junio C Hamano 已提交
330
		    !is_null_sha1(ref->old_sha1) &&
331
		    !ref->force) {
332 333
			if (!has_sha1_file(ref->old_sha1) ||
			    !ref_newer(ref->peer_ref->new_sha1,
J
Junio C Hamano 已提交
334
				       ref->old_sha1)) {
335 336 337 338 339 340 341 342 343 344 345 346
				/* We do not have the remote ref, or
				 * we know that the remote ref is not
				 * an ancestor of what we are trying to
				 * push.  Either way this can be losing
				 * commits at the remote end and likely
				 * we were not up to date to begin with.
				 */
				error("remote '%s' is not a strict "
				      "subset of local ref '%s'. "
				      "maybe you are not up-to-date and "
				      "need to pull first?",
				      ref->name,
J
Junio C Hamano 已提交
347
				      ref->peer_ref->name);
348
				ret = -2;
J
Junio C Hamano 已提交
349 350
				continue;
			}
351
		}
352
		hashcpy(ref->new_sha1, ref->peer_ref->new_sha1);
353 354
		if (!delete_ref)
			new_refs++;
355 356
		strcpy(old_hex, sha1_to_hex(ref->old_sha1));
		new_hex = sha1_to_hex(ref->new_sha1);
357 358 359 360 361 362 363 364 365 366 367

		if (ask_for_status_report) {
			packet_write(out, "%s %s %s%c%s",
				     old_hex, new_hex, ref->name, 0,
				     "report-status");
			ask_for_status_report = 0;
			expect_status_report = 1;
		}
		else
			packet_write(out, "%s %s %s",
				     old_hex, new_hex, ref->name);
368 369 370 371 372 373 374 375 376 377
		if (delete_ref)
			fprintf(stderr, "deleting '%s'\n", ref->name);
		else {
			fprintf(stderr, "updating '%s'", ref->name);
			if (strcmp(ref->name, ref->peer_ref->name))
				fprintf(stderr, " using '%s'",
					ref->peer_ref->name);
			fprintf(stderr, "\n  from %s\n  to   %s\n",
				old_hex, new_hex);
		}
378
	}
J
Junio C Hamano 已提交
379

380
	packet_flush(out);
381
	if (new_refs)
J
Junio C Hamano 已提交
382
		pack_objects(out, remote_refs);
383
	close(out);
384 385 386 387 388 389 390 391

	if (expect_status_report) {
		if (receive_status(in))
			ret = -4;
	}

	if (!new_refs && ret == 0)
		fprintf(stderr, "Everything up-to-date\n");
392
	return ret;
393 394
}

395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
static void verify_remote_names(int nr_heads, char **heads)
{
	int i;

	for (i = 0; i < nr_heads; i++) {
		const char *remote = strchr(heads[i], ':');

		remote = remote ? (remote + 1) : heads[i];
		switch (check_ref_format(remote)) {
		case 0: /* ok */
		case -2: /* ok but a single level -- that is fine for
			  * a match pattern.
			  */
			continue;
		}
		die("remote part of refspec is not a valid name in %s",
		    heads[i]);
	}
}
J
Junio C Hamano 已提交
414

415 416 417 418 419
int main(int argc, char **argv)
{
	int i, nr_heads = 0;
	char *dest = NULL;
	char **heads = NULL;
420 421
	int fd[2], ret;
	pid_t pid;
422

423
	setup_git_directory();
424 425
	git_config(git_default_config);

426
	argv++;
427 428
	for (i = 1; i < argc; i++, argv++) {
		char *arg = *argv;
429 430 431 432 433 434

		if (*arg == '-') {
			if (!strncmp(arg, "--exec=", 7)) {
				exec = arg + 7;
				continue;
			}
435 436 437 438
			if (!strcmp(arg, "--all")) {
				send_all = 1;
				continue;
			}
439 440 441 442
			if (!strcmp(arg, "--force")) {
				force_update = 1;
				continue;
			}
443 444 445 446
			if (!strcmp(arg, "--verbose")) {
				verbose = 1;
				continue;
			}
447 448 449 450
			if (!strcmp(arg, "--thin")) {
				use_thin_pack = 1;
				continue;
			}
451 452
			usage(send_pack_usage);
		}
453 454 455 456
		if (!dest) {
			dest = arg;
			continue;
		}
457
		heads = argv;
458
		nr_heads = argc - i;
459 460 461 462
		break;
	}
	if (!dest)
		usage(send_pack_usage);
463 464
	if (heads && send_all)
		usage(send_pack_usage);
465 466
	verify_remote_names(nr_heads, heads);

467
	pid = git_connect(fd, dest, exec);
468
	if (pid < 0)
469
		return 1;
470
	ret = send_pack(fd[0], fd[1], nr_heads, heads);
471 472
	close(fd[0]);
	close(fd[1]);
473 474
	ret |= finish_connect(pid);
	return !!ret;
475
}