fetch.c 24.5 KB
Newer Older
D
Daniel Barkalow 已提交
1 2 3 4 5 6 7
/*
 * "git fetch"
 */
#include "cache.h"
#include "refs.h"
#include "commit.h"
#include "builtin.h"
8
#include "string-list.h"
D
Daniel Barkalow 已提交
9 10
#include "remote.h"
#include "transport.h"
11
#include "run-command.h"
12
#include "parse-options.h"
13
#include "sigchain.h"
14
#include "transport.h"
D
Daniel Barkalow 已提交
15

16
static const char * const builtin_fetch_usage[] = {
T
Tay Ray Chuan 已提交
17 18 19 20
	"git fetch [<options>] [<repository> [<refspec>...]]",
	"git fetch [<options>] <group>",
	"git fetch --multiple [<options>] [<repository> | <group>]...",
	"git fetch --all [<options>]",
21 22
	NULL
};
D
Daniel Barkalow 已提交
23

24 25 26 27 28 29
enum {
	TAGS_UNSET = 0,
	TAGS_DEFAULT = 1,
	TAGS_SET = 2
};

J
Jay Soffian 已提交
30
static int all, append, dry_run, force, keep, multiple, prune, update_head_ok, verbosity;
T
Tay Ray Chuan 已提交
31
static int progress;
32
static int tags = TAGS_DEFAULT;
33
static const char *depth;
34
static const char *upload_pack;
35
static struct strbuf default_rla = STRBUF_INIT;
36 37
static struct transport *transport;

38
static struct option builtin_fetch_options[] = {
T
Tuncer Ayaz 已提交
39
	OPT__VERBOSITY(&verbosity),
40 41
	OPT_BOOLEAN(0, "all", &all,
		    "fetch from all remotes"),
42 43 44 45 46 47
	OPT_BOOLEAN('a', "append", &append,
		    "append to .git/FETCH_HEAD instead of overwriting"),
	OPT_STRING(0, "upload-pack", &upload_pack, "PATH",
		   "path to upload pack on remote end"),
	OPT_BOOLEAN('f', "force", &force,
		    "force overwrite of local branch"),
48 49
	OPT_BOOLEAN('m', "multiple", &multiple,
		    "fetch from multiple remotes"),
50 51
	OPT_SET_INT('t', "tags", &tags,
		    "fetch all tags and associated objects", TAGS_SET),
52 53
	OPT_SET_INT('n', NULL, &tags,
		    "do not fetch all tags (--no-tags)", TAGS_UNSET),
J
Jay Soffian 已提交
54 55
	OPT_BOOLEAN('p', "prune", &prune,
		    "prune tracking branches no longer on remote"),
J
Jay Soffian 已提交
56 57
	OPT_BOOLEAN(0, "dry-run", &dry_run,
		    "dry run"),
58 59 60
	OPT_BOOLEAN('k', "keep", &keep, "keep downloaded pack"),
	OPT_BOOLEAN('u', "update-head-ok", &update_head_ok,
		    "allow updating of HEAD ref"),
T
Tay Ray Chuan 已提交
61
	OPT_BOOLEAN(0, "progress", &progress, "force progress reporting"),
62 63 64 65 66
	OPT_STRING(0, "depth", &depth, "DEPTH",
		   "deepen history of shallow clone"),
	OPT_END()
};

67 68 69 70 71 72 73 74 75
static void unlock_pack(void)
{
	if (transport)
		transport_unlock_pack(transport);
}

static void unlock_pack_on_signal(int signo)
{
	unlock_pack();
76
	sigchain_pop(signo);
77 78
	raise(signo);
}
D
Daniel Barkalow 已提交
79

80
static void add_merge_config(struct ref **head,
81
			   const struct ref *remote_refs,
82 83
		           struct branch *branch,
		           struct ref ***tail)
D
Daniel Barkalow 已提交
84
{
85
	int i;
D
Daniel Barkalow 已提交
86

87 88 89 90 91 92
	for (i = 0; i < branch->merge_nr; i++) {
		struct ref *rm, **old_tail = *tail;
		struct refspec refspec;

		for (rm = *head; rm; rm = rm->next) {
			if (branch_merge_matches(branch, i, rm->name)) {
D
Daniel Barkalow 已提交
93
				rm->merge = 1;
94 95
				break;
			}
D
Daniel Barkalow 已提交
96
		}
97 98 99
		if (rm)
			continue;

100 101
		/*
		 * Not fetched to a tracking branch?  We need to fetch
102
		 * it anyway to allow this branch's "branch.$name.merge"
103
		 * to be honored by 'git pull', but we do not have to
104 105
		 * fail if branch.$name.merge is misconfigured to point
		 * at a nonexisting branch.  If we were indeed called by
106
		 * 'git pull', it will notice the misconfiguration because
107 108
		 * there is no entry in the resulting FETCH_HEAD marked
		 * for merging.
109
		 */
110
		memset(&refspec, 0, sizeof(refspec));
111
		refspec.src = branch->merge[i]->src;
112
		get_fetch_map(remote_refs, &refspec, tail, 1);
113 114
		for (rm = *old_tail; rm; rm = rm->next)
			rm->merge = 1;
D
Daniel Barkalow 已提交
115 116 117
	}
}

118 119 120 121
static void find_non_local_tags(struct transport *transport,
			struct ref **head,
			struct ref ***tail);

D
Daniel Barkalow 已提交
122 123 124 125 126 127 128 129 130
static struct ref *get_ref_map(struct transport *transport,
			       struct refspec *refs, int ref_count, int tags,
			       int *autotags)
{
	int i;
	struct ref *rm;
	struct ref *ref_map = NULL;
	struct ref **tail = &ref_map;

131
	const struct ref *remote_refs = transport_get_remote_refs(transport);
D
Daniel Barkalow 已提交
132

133
	if (ref_count || tags == TAGS_SET) {
D
Daniel Barkalow 已提交
134
		for (i = 0; i < ref_count; i++) {
135
			get_fetch_map(remote_refs, &refs[i], &tail, 0);
D
Daniel Barkalow 已提交
136 137 138 139 140 141
			if (refs[i].dst && refs[i].dst[0])
				*autotags = 1;
		}
		/* Merge everything on the command line, but not --tags */
		for (rm = ref_map; rm; rm = rm->next)
			rm->merge = 1;
142 143
		if (tags == TAGS_SET)
			get_fetch_map(remote_refs, tag_refspec, &tail, 0);
D
Daniel Barkalow 已提交
144 145 146
	} else {
		/* Use the defaults */
		struct remote *remote = transport->remote;
147 148 149
		struct branch *branch = branch_get(NULL);
		int has_merge = branch_has_merge_config(branch);
		if (remote && (remote->fetch_refspec_nr || has_merge)) {
D
Daniel Barkalow 已提交
150
			for (i = 0; i < remote->fetch_refspec_nr; i++) {
151
				get_fetch_map(remote_refs, &remote->fetch[i], &tail, 0);
D
Daniel Barkalow 已提交
152 153 154
				if (remote->fetch[i].dst &&
				    remote->fetch[i].dst[0])
					*autotags = 1;
155
				if (!i && !has_merge && ref_map &&
156
				    !remote->fetch[0].pattern)
157
					ref_map->merge = 1;
D
Daniel Barkalow 已提交
158
			}
159 160 161 162 163
			/*
			 * if the remote we're fetching from is the same
			 * as given in branch.<name>.remote, we add the
			 * ref given in branch.<name>.merge, too.
			 */
164 165
			if (has_merge &&
			    !strcmp(branch->remote_name, remote->name))
166
				add_merge_config(&ref_map, remote_refs, branch, &tail);
D
Daniel Barkalow 已提交
167 168
		} else {
			ref_map = get_remote_ref(remote_refs, "HEAD");
169 170
			if (!ref_map)
				die("Couldn't find remote ref HEAD");
D
Daniel Barkalow 已提交
171
			ref_map->merge = 1;
172
			tail = &ref_map->next;
D
Daniel Barkalow 已提交
173 174
		}
	}
175 176
	if (tags == TAGS_DEFAULT && *autotags)
		find_non_local_tags(transport, &ref_map, &tail);
177
	ref_remove_duplicates(ref_map);
D
Daniel Barkalow 已提交
178 179 180 181

	return ref_map;
}

182 183 184
#define STORE_REF_ERROR_OTHER 1
#define STORE_REF_ERROR_DF_CONFLICT 2

D
Daniel Barkalow 已提交
185 186 187 188 189 190 191 192
static int s_update_ref(const char *action,
			struct ref *ref,
			int check_old)
{
	char msg[1024];
	char *rla = getenv("GIT_REFLOG_ACTION");
	static struct ref_lock *lock;

J
Jay Soffian 已提交
193 194
	if (dry_run)
		return 0;
D
Daniel Barkalow 已提交
195
	if (!rla)
196
		rla = default_rla.buf;
D
Daniel Barkalow 已提交
197 198 199 200
	snprintf(msg, sizeof(msg), "%s: %s", rla, action);
	lock = lock_any_ref_for_update(ref->name,
				       check_old ? ref->old_sha1 : NULL, 0);
	if (!lock)
201 202
		return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
					  STORE_REF_ERROR_OTHER;
D
Daniel Barkalow 已提交
203
	if (write_ref_sha1(lock, ref->new_sha1, msg) < 0)
204 205
		return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
					  STORE_REF_ERROR_OTHER;
D
Daniel Barkalow 已提交
206 207 208
	return 0;
}

P
Pierre Habouzit 已提交
209
#define REFCOL_WIDTH  10
N
Nicolas Pitre 已提交
210

D
Daniel Barkalow 已提交
211
static int update_local_ref(struct ref *ref,
N
Nicolas Pitre 已提交
212 213
			    const char *remote,
			    char *display)
D
Daniel Barkalow 已提交
214 215 216 217
{
	struct commit *current = NULL, *updated;
	enum object_type type;
	struct branch *current_branch = branch_get(NULL);
218
	const char *pretty_ref = prettify_refname(ref->name);
D
Daniel Barkalow 已提交
219

N
Nicolas Pitre 已提交
220
	*display = 0;
D
Daniel Barkalow 已提交
221 222 223 224 225
	type = sha1_object_info(ref->new_sha1, NULL);
	if (type < 0)
		die("object %s not found", sha1_to_hex(ref->new_sha1));

	if (!hashcmp(ref->old_sha1, ref->new_sha1)) {
T
Tuncer Ayaz 已提交
226
		if (verbosity > 0)
227
			sprintf(display, "= %-*s %-*s -> %s", TRANSPORT_SUMMARY_WIDTH,
P
Pierre Habouzit 已提交
228 229
				"[up to date]", REFCOL_WIDTH, remote,
				pretty_ref);
D
Daniel Barkalow 已提交
230 231 232
		return 0;
	}

233 234
	if (current_branch &&
	    !strcmp(ref->name, current_branch->name) &&
D
Daniel Barkalow 已提交
235 236 237 238 239 240
	    !(update_head_ok || is_bare_repository()) &&
	    !is_null_sha1(ref->old_sha1)) {
		/*
		 * If this is the head, and it's not okay to update
		 * the head, and the old value of the head isn't empty...
		 */
P
Pierre Habouzit 已提交
241
		sprintf(display, "! %-*s %-*s -> %s  (can't fetch in current branch)",
242
			TRANSPORT_SUMMARY_WIDTH, "[rejected]", REFCOL_WIDTH, remote,
P
Pierre Habouzit 已提交
243
			pretty_ref);
D
Daniel Barkalow 已提交
244 245 246 247 248
		return 1;
	}

	if (!is_null_sha1(ref->old_sha1) &&
	    !prefixcmp(ref->name, "refs/tags/")) {
249 250 251
		int r;
		r = s_update_ref("updating tag", ref, 0);
		sprintf(display, "%c %-*s %-*s -> %s%s", r ? '!' : '-',
252
			TRANSPORT_SUMMARY_WIDTH, "[tag update]", REFCOL_WIDTH, remote,
253 254
			pretty_ref, r ? "  (unable to update local ref)" : "");
		return r;
D
Daniel Barkalow 已提交
255 256
	}

257 258
	current = lookup_commit_reference_gently(ref->old_sha1, 1);
	updated = lookup_commit_reference_gently(ref->new_sha1, 1);
D
Daniel Barkalow 已提交
259
	if (!current || !updated) {
N
Nicolas Pitre 已提交
260 261
		const char *msg;
		const char *what;
262
		int r;
N
Nicolas Pitre 已提交
263
		if (!strncmp(ref->name, "refs/tags/", 10)) {
D
Daniel Barkalow 已提交
264
			msg = "storing tag";
N
Nicolas Pitre 已提交
265 266 267
			what = "[new tag]";
		}
		else {
D
Daniel Barkalow 已提交
268
			msg = "storing head";
N
Nicolas Pitre 已提交
269 270 271
			what = "[new branch]";
		}

272 273
		r = s_update_ref(msg, ref, 0);
		sprintf(display, "%c %-*s %-*s -> %s%s", r ? '!' : '*',
274
			TRANSPORT_SUMMARY_WIDTH, what, REFCOL_WIDTH, remote, pretty_ref,
275 276
			r ? "  (unable to update local ref)" : "");
		return r;
D
Daniel Barkalow 已提交
277 278 279
	}

	if (in_merge_bases(current, &updated, 1)) {
N
Nicolas Pitre 已提交
280
		char quickref[83];
281
		int r;
N
Nicolas Pitre 已提交
282 283 284
		strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
		strcat(quickref, "..");
		strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
285
		r = s_update_ref("fast-forward", ref, 1);
286
		sprintf(display, "%c %-*s %-*s -> %s%s", r ? '!' : ' ',
287
			TRANSPORT_SUMMARY_WIDTH, quickref, REFCOL_WIDTH, remote,
288 289
			pretty_ref, r ? "  (unable to update local ref)" : "");
		return r;
N
Nicolas Pitre 已提交
290 291
	} else if (force || ref->force) {
		char quickref[84];
292
		int r;
N
Nicolas Pitre 已提交
293 294 295
		strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
		strcat(quickref, "...");
		strcat(quickref, find_unique_abbrev(ref->new_sha1, DEFAULT_ABBREV));
296 297
		r = s_update_ref("forced-update", ref, 1);
		sprintf(display, "%c %-*s %-*s -> %s  (%s)", r ? '!' : '+',
298
			TRANSPORT_SUMMARY_WIDTH, quickref, REFCOL_WIDTH, remote,
299 300 301
			pretty_ref,
			r ? "unable to update local ref" : "forced update");
		return r;
N
Nicolas Pitre 已提交
302
	} else {
303
		sprintf(display, "! %-*s %-*s -> %s  (non-fast-forward)",
304
			TRANSPORT_SUMMARY_WIDTH, "[rejected]", REFCOL_WIDTH, remote,
P
Pierre Habouzit 已提交
305
			pretty_ref);
D
Daniel Barkalow 已提交
306 307 308 309
		return 1;
	}
}

310
static int store_updated_refs(const char *raw_url, const char *remote_name,
311
		struct ref *ref_map)
D
Daniel Barkalow 已提交
312 313 314
{
	FILE *fp;
	struct commit *commit;
315
	int url_len, i, note_len, shown_url = 0, rc = 0;
D
Daniel Barkalow 已提交
316 317 318
	char note[1024];
	const char *what, *kind;
	struct ref *rm;
J
Jay Soffian 已提交
319
	char *url, *filename = dry_run ? "/dev/null" : git_path("FETCH_HEAD");
D
Daniel Barkalow 已提交
320

321 322 323
	fp = fopen(filename, "a");
	if (!fp)
		return error("cannot open %s: %s\n", filename, strerror(errno));
324

325 326 327 328
	if (raw_url)
		url = transport_anonymize_url(raw_url);
	else
		url = xstrdup("foreign");
D
Daniel Barkalow 已提交
329 330 331 332 333 334 335 336
	for (rm = ref_map; rm; rm = rm->next) {
		struct ref *ref = NULL;

		if (rm->peer_ref) {
			ref = xcalloc(1, sizeof(*ref) + strlen(rm->peer_ref->name) + 1);
			strcpy(ref->name, rm->peer_ref->name);
			hashcpy(ref->old_sha1, rm->peer_ref->old_sha1);
			hashcpy(ref->new_sha1, rm->old_sha1);
337
			ref->force = rm->peer_ref->force;
D
Daniel Barkalow 已提交
338 339
		}

340
		commit = lookup_commit_reference_gently(rm->old_sha1, 1);
D
Daniel Barkalow 已提交
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
		if (!commit)
			rm->merge = 0;

		if (!strcmp(rm->name, "HEAD")) {
			kind = "";
			what = "";
		}
		else if (!prefixcmp(rm->name, "refs/heads/")) {
			kind = "branch";
			what = rm->name + 11;
		}
		else if (!prefixcmp(rm->name, "refs/tags/")) {
			kind = "tag";
			what = rm->name + 10;
		}
		else if (!prefixcmp(rm->name, "refs/remotes/")) {
			kind = "remote branch";
			what = rm->name + 13;
		}
		else {
			kind = "";
			what = rm->name;
		}

		url_len = strlen(url);
		for (i = url_len - 1; url[i] == '/' && 0 <= i; i--)
			;
		url_len = i + 1;
		if (4 < i && !strncmp(".git", url + i - 3, 4))
			url_len = i - 3;

		note_len = 0;
		if (*what) {
			if (*kind)
				note_len += sprintf(note + note_len, "%s ",
						    kind);
			note_len += sprintf(note + note_len, "'%s' of ", what);
		}
379 380
		note[note_len] = '\0';
		fprintf(fp, "%s\t%s\t%s",
D
Daniel Barkalow 已提交
381 382 383 384
			sha1_to_hex(commit ? commit->object.sha1 :
				    rm->old_sha1),
			rm->merge ? "" : "not-for-merge",
			note);
385 386 387 388 389 390
		for (i = 0; i < url_len; ++i)
			if ('\n' == url[i])
				fputs("\\n", fp);
			else
				fputc(url[i], fp);
		fputc('\n', fp);
D
Daniel Barkalow 已提交
391

392
		if (ref) {
T
Tuncer Ayaz 已提交
393
			rc |= update_local_ref(ref, what, note);
394 395
			free(ref);
		} else
396
			sprintf(note, "* %-*s %-*s -> FETCH_HEAD",
397
				TRANSPORT_SUMMARY_WIDTH, *kind ? kind : "branch",
398 399
				 REFCOL_WIDTH, *what ? what : "HEAD");
		if (*note) {
T
Tuncer Ayaz 已提交
400
			if (verbosity >= 0 && !shown_url) {
401 402 403
				fprintf(stderr, "From %.*s\n",
						url_len, url);
				shown_url = 1;
N
Nicolas Pitre 已提交
404
			}
T
Tuncer Ayaz 已提交
405 406
			if (verbosity >= 0)
				fprintf(stderr, " %s\n", note);
N
Nicolas Pitre 已提交
407
		}
D
Daniel Barkalow 已提交
408
	}
409
	free(url);
D
Daniel Barkalow 已提交
410
	fclose(fp);
411
	if (rc & STORE_REF_ERROR_DF_CONFLICT)
412 413 414
		error("some local refs could not be updated; try running\n"
		      " 'git remote prune %s' to remove any old, conflicting "
		      "branches", remote_name);
415
	return rc;
D
Daniel Barkalow 已提交
416 417
}

418 419
/*
 * We would want to bypass the object transfer altogether if
420
 * everything we are going to fetch already exists and is connected
421 422
 * locally.
 *
423
 * The refs we are going to fetch are in ref_map.  If running
424
 *
425
 *  $ git rev-list --objects --stdin --not --all
426
 *
427
 * (feeding all the refs in ref_map on its standard input)
428 429 430 431 432 433 434 435
 * does not error out, that means everything reachable from the
 * refs we are going to fetch exists and is connected to some of
 * our existing refs.
 */
static int quickfetch(struct ref *ref_map)
{
	struct child_process revlist;
	struct ref *ref;
436 437 438
	int err;
	const char *argv[] = {"rev-list",
		"--quiet", "--objects", "--stdin", "--not", "--all", NULL};
439 440 441 442 443 444 445 446 447 448 449

	/*
	 * If we are deepening a shallow clone we already have these
	 * objects reachable.  Running rev-list here will return with
	 * a good (0) exit status and we'll bypass the fetch that we
	 * really need to perform.  Claiming failure now will ensure
	 * we perform the network exchange to deepen our history.
	 */
	if (depth)
		return -1;

450
	if (!ref_map)
451 452 453
		return 0;

	memset(&revlist, 0, sizeof(revlist));
454
	revlist.argv = argv;
455 456 457
	revlist.git_cmd = 1;
	revlist.no_stdout = 1;
	revlist.no_stderr = 1;
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
	revlist.in = -1;

	err = start_command(&revlist);
	if (err) {
		error("could not run rev-list");
		return err;
	}

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

	for (ref = ref_map; ref; ref = ref->next) {
		if (write_in_full(revlist.in, sha1_to_hex(ref->old_sha1), 40) < 0 ||
474
		    write_str_in_full(revlist.in, "\n") < 0) {
475 476 477 478 479 480 481 482 483 484 485 486 487
			if (errno != EPIPE && errno != EINVAL)
				error("failed write to rev-list: %s", strerror(errno));
			err = -1;
			break;
		}
	}

	if (close(revlist.in)) {
		error("failed to close rev-list's stdin: %s", strerror(errno));
		err = -1;
	}

	sigchain_pop(SIGPIPE);
488

489
	return finish_command(&revlist) || err;
490 491
}

D
Daniel Barkalow 已提交
492 493
static int fetch_refs(struct transport *transport, struct ref *ref_map)
{
494 495 496
	int ret = quickfetch(ref_map);
	if (ret)
		ret = transport_fetch_refs(transport, ref_map);
D
Daniel Barkalow 已提交
497
	if (!ret)
498 499 500
		ret |= store_updated_refs(transport->url,
				transport->remote->name,
				ref_map);
501
	transport_unlock_pack(transport);
D
Daniel Barkalow 已提交
502 503 504
	return ret;
}

J
Jay Soffian 已提交
505 506 507 508 509 510 511 512 513 514 515 516 517
static int prune_refs(struct transport *transport, struct ref *ref_map)
{
	int result = 0;
	struct ref *ref, *stale_refs = get_stale_heads(transport->remote, ref_map);
	const char *dangling_msg = dry_run
		? "   (%s will become dangling)\n"
		: "   (%s has become dangling)\n";

	for (ref = stale_refs; ref; ref = ref->next) {
		if (!dry_run)
			result |= delete_ref(ref->name, NULL, 0);
		if (verbosity >= 0) {
			fprintf(stderr, " x %-*s %-*s -> %s\n",
518
				TRANSPORT_SUMMARY_WIDTH, "[deleted]",
J
Jay Soffian 已提交
519 520 521 522 523 524 525 526
				REFCOL_WIDTH, "(none)", prettify_refname(ref->name));
			warn_dangling_symref(stderr, dangling_msg, ref->name);
		}
	}
	free_refs(stale_refs);
	return result;
}

D
Daniel Barkalow 已提交
527 528 529
static int add_existing(const char *refname, const unsigned char *sha1,
			int flag, void *cbdata)
{
530
	struct string_list *list = (struct string_list *)cbdata;
531
	struct string_list_item *item = string_list_insert(list, refname);
532
	item->util = (void *)sha1;
D
Daniel Barkalow 已提交
533 534 535
	return 0;
}

536 537 538 539 540 541 542 543 544 545 546
static int will_fetch(struct ref **head, const unsigned char *sha1)
{
	struct ref *rm = *head;
	while (rm) {
		if (!hashcmp(rm->old_sha1, sha1))
			return 1;
		rm = rm->next;
	}
	return 0;
}

547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
struct tag_data {
	struct ref **head;
	struct ref ***tail;
};

static int add_to_tail(struct string_list_item *item, void *cb_data)
{
	struct tag_data *data = (struct tag_data *)cb_data;
	struct ref *rm = NULL;

	/* We have already decided to ignore this item */
	if (!item->util)
		return 0;

	rm = alloc_ref(item->string);
	rm->peer_ref = alloc_ref(item->string);
	hashcpy(rm->old_sha1, item->util);

	**data->tail = rm;
	*data->tail = &rm->next;

	return 0;
}

571 572 573
static void find_non_local_tags(struct transport *transport,
			struct ref **head,
			struct ref ***tail)
D
Daniel Barkalow 已提交
574
{
575
	struct string_list existing_refs = { NULL, 0, 0, 0 };
576 577
	struct string_list remote_refs = { NULL, 0, 0, 0 };
	struct tag_data data = {head, tail};
578
	const struct ref *ref;
579
	struct string_list_item *item = NULL;
D
Daniel Barkalow 已提交
580 581 582 583 584 585

	for_each_ref(add_existing, &existing_refs);
	for (ref = transport_get_remote_refs(transport); ref; ref = ref->next) {
		if (prefixcmp(ref->name, "refs/tags"))
			continue;

586 587 588 589 590 591
		/*
		 * The peeled ref always follows the matching base
		 * ref, so if we see a peeled ref that we don't want
		 * to fetch then we can mark the ref entry in the list
		 * as one to ignore by setting util to NULL.
		 */
592
		if (!suffixcmp(ref->name, "^{}")) {
593 594 595 596 597 598 599
			if (item && !has_sha1_file(ref->old_sha1) &&
			    !will_fetch(head, ref->old_sha1) &&
			    !has_sha1_file(item->util) &&
			    !will_fetch(head, item->util))
				item->util = NULL;
			item = NULL;
			continue;
D
Daniel Barkalow 已提交
600 601
		}

602 603 604 605 606 607 608 609 610
		/*
		 * If item is non-NULL here, then we previously saw a
		 * ref not followed by a peeled reference, so we need
		 * to check if it is a lightweight tag that we want to
		 * fetch.
		 */
		if (item && !has_sha1_file(item->util) &&
		    !will_fetch(head, item->util))
			item->util = NULL;
D
Daniel Barkalow 已提交
611

612
		item = NULL;
D
Daniel Barkalow 已提交
613

614 615 616 617 618
		/* skip duplicates and refs that we already have */
		if (string_list_has_string(&remote_refs, ref->name) ||
		    string_list_has_string(&existing_refs, ref->name))
			continue;

619
		item = string_list_insert(&remote_refs, ref->name);
620
		item->util = (void *)ref->old_sha1;
D
Daniel Barkalow 已提交
621
	}
622
	string_list_clear(&existing_refs, 0);
623 624 625 626 627 628 629 630 631 632 633 634 635

	/*
	 * We may have a final lightweight tag that needs to be
	 * checked to see if it needs fetching.
	 */
	if (item && !has_sha1_file(item->util) &&
	    !will_fetch(head, item->util))
		item->util = NULL;

	/*
	 * For all the tags in the remote_refs string list, call
	 * add_to_tail to add them to the list of refs to be fetched
	 */
636
	for_each_string_list(&remote_refs, add_to_tail, &data);
637 638

	string_list_clear(&remote_refs, 0);
D
Daniel Barkalow 已提交
639 640
}

641 642 643 644 645 646 647 648 649 650
static void check_not_current_branch(struct ref *ref_map)
{
	struct branch *current_branch = branch_get(NULL);

	if (is_bare_repository() || !current_branch)
		return;

	for (; ref_map; ref_map = ref_map->next)
		if (ref_map->peer_ref && !strcmp(current_branch->refname,
					ref_map->peer_ref->name))
651 652
			die("Refusing to fetch into current branch %s "
			    "of non-bare repository", current_branch->refname);
653 654
}

655 656 657 658 659 660 661 662 663 664 665
static int truncate_fetch_head(void)
{
	char *filename = git_path("FETCH_HEAD");
	FILE *fp = fopen(filename, "w");

	if (!fp)
		return error("cannot open %s: %s\n", filename, strerror(errno));
	fclose(fp);
	return 0;
}

D
Daniel Barkalow 已提交
666 667 668
static int do_fetch(struct transport *transport,
		    struct refspec *refs, int ref_count)
{
669 670
	struct string_list existing_refs = { NULL, 0, 0, 0 };
	struct string_list_item *peer_item = NULL;
671
	struct ref *ref_map;
D
Daniel Barkalow 已提交
672 673
	struct ref *rm;
	int autotags = (transport->remote->fetch_tags == 1);
674 675 676

	for_each_ref(add_existing, &existing_refs);

677 678
	if (transport->remote->fetch_tags == 2 && tags != TAGS_UNSET)
		tags = TAGS_SET;
D
Daniel Barkalow 已提交
679
	if (transport->remote->fetch_tags == -1)
680
		tags = TAGS_UNSET;
D
Daniel Barkalow 已提交
681

682
	if (!transport->get_refs_list || !transport->fetch)
D
Daniel Barkalow 已提交
683 684 685
		die("Don't know how to fetch from %s", transport->url);

	/* if not appending, truncate FETCH_HEAD */
J
Jay Soffian 已提交
686
	if (!append && !dry_run) {
687 688 689
		int errcode = truncate_fetch_head();
		if (errcode)
			return errcode;
690
	}
D
Daniel Barkalow 已提交
691 692

	ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags);
693 694
	if (!update_head_ok)
		check_not_current_branch(ref_map);
D
Daniel Barkalow 已提交
695 696

	for (rm = ref_map; rm; rm = rm->next) {
697 698 699 700 701 702 703
		if (rm->peer_ref) {
			peer_item = string_list_lookup(rm->peer_ref->name,
						       &existing_refs);
			if (peer_item)
				hashcpy(rm->peer_ref->old_sha1,
					peer_item->util);
		}
D
Daniel Barkalow 已提交
704 705
	}

706 707
	if (tags == TAGS_DEFAULT && autotags)
		transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
D
Daniel Barkalow 已提交
708 709 710 711
	if (fetch_refs(transport, ref_map)) {
		free_refs(ref_map);
		return 1;
	}
J
Jay Soffian 已提交
712 713
	if (prune)
		prune_refs(transport, ref_map);
714
	free_refs(ref_map);
D
Daniel Barkalow 已提交
715 716 717

	/* if neither --no-tags nor --tags was specified, do automated tag
	 * following ... */
718
	if (tags == TAGS_DEFAULT && autotags) {
719 720 721
		struct ref **tail = &ref_map;
		ref_map = NULL;
		find_non_local_tags(transport, &ref_map, &tail);
D
Daniel Barkalow 已提交
722
		if (ref_map) {
723
			transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, NULL);
D
Daniel Barkalow 已提交
724 725 726 727 728 729 730 731 732
			transport_set_option(transport, TRANS_OPT_DEPTH, "0");
			fetch_refs(transport, ref_map);
		}
		free_refs(ref_map);
	}

	return 0;
}

733 734 735 736
static void set_option(const char *name, const char *value)
{
	int r = transport_set_option(transport, name, value);
	if (r < 0)
737
		die("Option \"%s\" value \"%s\" is not valid for %s",
738 739 740 741 742 743
			name, value, transport->url);
	if (r > 0)
		warning("Option \"%s\" is ignored for %s\n",
			name, transport->url);
}

744 745 746
static int get_one_remote_for_fetch(struct remote *remote, void *priv)
{
	struct string_list *list = priv;
747 748
	if (!remote->skip_default_update)
		string_list_append(remote->name, list);
749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796
	return 0;
}

struct remote_group_data {
	const char *name;
	struct string_list *list;
};

static int get_remote_group(const char *key, const char *value, void *priv)
{
	struct remote_group_data *g = priv;

	if (!prefixcmp(key, "remotes.") &&
			!strcmp(key + 8, g->name)) {
		/* split list by white space */
		int space = strcspn(value, " \t\n");
		while (*value) {
			if (space > 1) {
				string_list_append(xstrndup(value, space),
						   g->list);
			}
			value += space + (value[space] != '\0');
			space = strcspn(value, " \t\n");
		}
	}

	return 0;
}

static int add_remote_or_group(const char *name, struct string_list *list)
{
	int prev_nr = list->nr;
	struct remote_group_data g = { name, list };

	git_config(get_remote_group, &g);
	if (list->nr == prev_nr) {
		struct remote *remote;
		if (!remote_is_configured(name))
			return 0;
		remote = remote_get(name);
		string_list_append(remote->name, list);
	}
	return 1;
}

static int fetch_multiple(struct string_list *list)
{
	int i, result = 0;
797 798
	const char *argv[11] = { "fetch", "--append" };
	int argc = 2;
799

J
Jay Soffian 已提交
800 801
	if (dry_run)
		argv[argc++] = "--dry-run";
J
Jay Soffian 已提交
802 803
	if (prune)
		argv[argc++] = "--prune";
804 805 806 807 808 809
	if (update_head_ok)
		argv[argc++] = "--update-head-ok";
	if (force)
		argv[argc++] = "--force";
	if (keep)
		argv[argc++] = "--keep";
810 811 812 813 814 815 816
	if (verbosity >= 2)
		argv[argc++] = "-v";
	if (verbosity >= 1)
		argv[argc++] = "-v";
	else if (verbosity < 0)
		argv[argc++] = "-q";

817 818 819 820 821 822
	if (!append && !dry_run) {
		int errcode = truncate_fetch_head();
		if (errcode)
			return errcode;
	}

823 824 825
	for (i = 0; i < list->nr; i++) {
		const char *name = list->items[i].string;
		argv[argc] = name;
826
		argv[argc + 1] = NULL;
827 828 829 830 831 832 833 834 835 836 837 838
		if (verbosity >= 0)
			printf("Fetching %s\n", name);
		if (run_command_v_opt(argv, RUN_GIT_CMD)) {
			error("Could not fetch %s", name);
			result = 1;
		}
	}

	return result;
}

static int fetch_one(struct remote *remote, int argc, const char **argv)
D
Daniel Barkalow 已提交
839
{
840
	int i;
D
Daniel Barkalow 已提交
841 842
	static const char **refs = NULL;
	int ref_nr = 0;
843
	int exit_code;
D
Daniel Barkalow 已提交
844

845 846 847
	if (!remote)
		die("Where do you want to fetch from today?");

848
	transport = transport_get(remote, NULL);
T
Tay Ray Chuan 已提交
849
	transport_set_verbosity(transport, verbosity, progress);
D
Daniel Barkalow 已提交
850
	if (upload_pack)
851
		set_option(TRANS_OPT_UPLOADPACK, upload_pack);
D
Daniel Barkalow 已提交
852
	if (keep)
853 854 855
		set_option(TRANS_OPT_KEEP, "yes");
	if (depth)
		set_option(TRANS_OPT_DEPTH, depth);
D
Daniel Barkalow 已提交
856

857
	if (argc > 0) {
D
Daniel Barkalow 已提交
858
		int j = 0;
859
		refs = xcalloc(argc + 1, sizeof(const char *));
860
		for (i = 0; i < argc; i++) {
D
Daniel Barkalow 已提交
861 862 863
			if (!strcmp(argv[i], "tag")) {
				char *ref;
				i++;
864 865
				if (i >= argc)
					die("You need to specify a tag name.");
D
Daniel Barkalow 已提交
866 867 868 869 870 871 872 873 874 875 876 877 878
				ref = xmalloc(strlen(argv[i]) * 2 + 22);
				strcpy(ref, "refs/tags/");
				strcat(ref, argv[i]);
				strcat(ref, ":refs/tags/");
				strcat(ref, argv[i]);
				refs[j++] = ref;
			} else
				refs[j++] = argv[i];
		}
		refs[j] = NULL;
		ref_nr = j;
	}

879
	sigchain_push_common(unlock_pack_on_signal);
880
	atexit(unlock_pack);
881
	exit_code = do_fetch(transport,
882
			parse_fetch_refspec(ref_nr, refs), ref_nr);
883 884 885
	transport_disconnect(transport);
	transport = NULL;
	return exit_code;
D
Daniel Barkalow 已提交
886
}
887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913

int cmd_fetch(int argc, const char **argv, const char *prefix)
{
	int i;
	struct string_list list = { NULL, 0, 0, 0 };
	struct remote *remote;
	int result = 0;

	/* Record the command line for the reflog */
	strbuf_addstr(&default_rla, "fetch");
	for (i = 1; i < argc; i++)
		strbuf_addf(&default_rla, " %s", argv[i]);

	argc = parse_options(argc, argv, prefix,
			     builtin_fetch_options, builtin_fetch_usage, 0);

	if (all) {
		if (argc == 1)
			die("fetch --all does not take a repository argument");
		else if (argc > 1)
			die("fetch --all does not make sense with refspecs");
		(void) for_each_remote(get_one_remote_for_fetch, &list);
		result = fetch_multiple(&list);
	} else if (argc == 0) {
		/* No arguments -- use default remote */
		remote = remote_get(NULL);
		result = fetch_one(remote, argc, argv);
914 915 916 917 918 919
	} else if (multiple) {
		/* All arguments are assumed to be remotes or groups */
		for (i = 0; i < argc; i++)
			if (!add_remote_or_group(argv[i], &list))
				die("No such remote or remote group: %s", argv[i]);
		result = fetch_multiple(&list);
920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
	} else {
		/* Single remote or group */
		(void) add_remote_or_group(argv[0], &list);
		if (list.nr > 1) {
			/* More than one remote */
			if (argc > 1)
				die("Fetching a group and specifying refspecs does not make sense");
			result = fetch_multiple(&list);
		} else {
			/* Zero or one remotes */
			remote = remote_get(argv[0]);
			result = fetch_one(remote, argc-1, argv+1);
		}
	}

	/* All names were strdup()ed or strndup()ed */
	list.strdup_strings = 1;
	string_list_clear(&list, 0);

	return result;
}