fetch.c 24.6 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
	"git fetch [<options>] [<repository> [<refspec>...]]",
	"git fetch [<options>] <group>",
19
	"git fetch --multiple [<options>] [(<repository> | <group>)...]",
T
Tay Ray Chuan 已提交
20
	"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
		struct branch *branch = branch_get(NULL);
		int has_merge = branch_has_merge_config(branch);
149 150
		if (remote &&
		    (remote->fetch_refspec_nr ||
151
		     /* Note: has_merge implies non-NULL branch->remote_name */
152
		     (has_merge && !strcmp(branch->remote_name, remote->name)))) {
D
Daniel Barkalow 已提交
153
			for (i = 0; i < remote->fetch_refspec_nr; i++) {
154
				get_fetch_map(remote_refs, &remote->fetch[i], &tail, 0);
D
Daniel Barkalow 已提交
155 156 157
				if (remote->fetch[i].dst &&
				    remote->fetch[i].dst[0])
					*autotags = 1;
158
				if (!i && !has_merge && ref_map &&
159
				    !remote->fetch[0].pattern)
160
					ref_map->merge = 1;
D
Daniel Barkalow 已提交
161
			}
162 163 164 165
			/*
			 * 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.
166 167
			 *
			 * Note: has_merge implies non-NULL branch->remote_name
168
			 */
169 170
			if (has_merge &&
			    !strcmp(branch->remote_name, remote->name))
171
				add_merge_config(&ref_map, remote_refs, branch, &tail);
D
Daniel Barkalow 已提交
172 173
		} else {
			ref_map = get_remote_ref(remote_refs, "HEAD");
174 175
			if (!ref_map)
				die("Couldn't find remote ref HEAD");
D
Daniel Barkalow 已提交
176
			ref_map->merge = 1;
177
			tail = &ref_map->next;
D
Daniel Barkalow 已提交
178 179
		}
	}
180 181
	if (tags == TAGS_DEFAULT && *autotags)
		find_non_local_tags(transport, &ref_map, &tail);
182
	ref_remove_duplicates(ref_map);
D
Daniel Barkalow 已提交
183 184 185 186

	return ref_map;
}

187 188 189
#define STORE_REF_ERROR_OTHER 1
#define STORE_REF_ERROR_DF_CONFLICT 2

D
Daniel Barkalow 已提交
190 191 192 193 194 195 196 197
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 已提交
198 199
	if (dry_run)
		return 0;
D
Daniel Barkalow 已提交
200
	if (!rla)
201
		rla = default_rla.buf;
D
Daniel Barkalow 已提交
202 203 204 205
	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)
206 207
		return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
					  STORE_REF_ERROR_OTHER;
D
Daniel Barkalow 已提交
208
	if (write_ref_sha1(lock, ref->new_sha1, msg) < 0)
209 210
		return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
					  STORE_REF_ERROR_OTHER;
D
Daniel Barkalow 已提交
211 212 213
	return 0;
}

P
Pierre Habouzit 已提交
214
#define REFCOL_WIDTH  10
N
Nicolas Pitre 已提交
215

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

N
Nicolas Pitre 已提交
225
	*display = 0;
D
Daniel Barkalow 已提交
226 227 228 229 230
	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 已提交
231
		if (verbosity > 0)
232
			sprintf(display, "= %-*s %-*s -> %s", TRANSPORT_SUMMARY_WIDTH,
P
Pierre Habouzit 已提交
233 234
				"[up to date]", REFCOL_WIDTH, remote,
				pretty_ref);
D
Daniel Barkalow 已提交
235 236 237
		return 0;
	}

238 239
	if (current_branch &&
	    !strcmp(ref->name, current_branch->name) &&
D
Daniel Barkalow 已提交
240 241 242 243 244 245
	    !(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 已提交
246
		sprintf(display, "! %-*s %-*s -> %s  (can't fetch in current branch)",
247
			TRANSPORT_SUMMARY_WIDTH, "[rejected]", REFCOL_WIDTH, remote,
P
Pierre Habouzit 已提交
248
			pretty_ref);
D
Daniel Barkalow 已提交
249 250 251 252 253
		return 1;
	}

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

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

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

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

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

326 327 328
	fp = fopen(filename, "a");
	if (!fp)
		return error("cannot open %s: %s\n", filename, strerror(errno));
329

330 331 332 333
	if (raw_url)
		url = transport_anonymize_url(raw_url);
	else
		url = xstrdup("foreign");
D
Daniel Barkalow 已提交
334 335 336 337 338 339 340 341
	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);
342
			ref->force = rm->peer_ref->force;
D
Daniel Barkalow 已提交
343 344
		}

345
		commit = lookup_commit_reference_gently(rm->old_sha1, 1);
D
Daniel Barkalow 已提交
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 379 380 381 382 383
		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);
		}
384 385
		note[note_len] = '\0';
		fprintf(fp, "%s\t%s\t%s",
D
Daniel Barkalow 已提交
386 387 388 389
			sha1_to_hex(commit ? commit->object.sha1 :
				    rm->old_sha1),
			rm->merge ? "" : "not-for-merge",
			note);
390 391 392 393 394 395
		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 已提交
396

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

423 424
/*
 * We would want to bypass the object transfer altogether if
425
 * everything we are going to fetch already exists and is connected
426 427
 * locally.
 *
428
 * The refs we are going to fetch are in ref_map.  If running
429
 *
430
 *  $ git rev-list --objects --stdin --not --all
431
 *
432
 * (feeding all the refs in ref_map on its standard input)
433 434 435 436 437 438 439 440
 * 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;
441 442 443
	int err;
	const char *argv[] = {"rev-list",
		"--quiet", "--objects", "--stdin", "--not", "--all", NULL};
444 445 446 447 448 449 450 451 452 453 454

	/*
	 * 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;

455
	if (!ref_map)
456 457 458
		return 0;

	memset(&revlist, 0, sizeof(revlist));
459
	revlist.argv = argv;
460 461 462
	revlist.git_cmd = 1;
	revlist.no_stdout = 1;
	revlist.no_stderr = 1;
463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478
	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 ||
479
		    write_str_in_full(revlist.in, "\n") < 0) {
480 481 482 483 484 485 486 487 488 489 490 491 492
			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);
493

494
	return finish_command(&revlist) || err;
495 496
}

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

J
Jay Soffian 已提交
510 511 512 513 514 515 516 517 518 519 520 521 522
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",
523
				TRANSPORT_SUMMARY_WIDTH, "[deleted]",
J
Jay Soffian 已提交
524 525 526 527 528 529 530 531
				REFCOL_WIDTH, "(none)", prettify_refname(ref->name));
			warn_dangling_symref(stderr, dangling_msg, ref->name);
		}
	}
	free_refs(stale_refs);
	return result;
}

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

541 542 543 544 545 546 547 548 549 550 551
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;
}

552 553 554
static void find_non_local_tags(struct transport *transport,
			struct ref **head,
			struct ref ***tail)
D
Daniel Barkalow 已提交
555
{
556 557
	struct string_list existing_refs = STRING_LIST_INIT_NODUP;
	struct string_list remote_refs = STRING_LIST_INIT_NODUP;
558
	const struct ref *ref;
559
	struct string_list_item *item = NULL;
D
Daniel Barkalow 已提交
560 561 562 563 564 565

	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;

566 567 568 569 570 571
		/*
		 * 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.
		 */
572
		if (!suffixcmp(ref->name, "^{}")) {
573 574 575 576 577 578 579
			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 已提交
580 581
		}

582 583 584 585 586 587 588 589 590
		/*
		 * 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 已提交
591

592
		item = NULL;
D
Daniel Barkalow 已提交
593

594 595 596 597 598
		/* 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;

599
		item = string_list_insert(&remote_refs, ref->name);
600
		item->util = (void *)ref->old_sha1;
D
Daniel Barkalow 已提交
601
	}
602
	string_list_clear(&existing_refs, 0);
603 604 605 606 607 608 609 610 611 612

	/*
	 * 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;

	/*
613 614
	 * For all the tags in the remote_refs string list,
	 * add them to the list of refs to be fetched
615
	 */
616 617 618 619 620 621 622 623 624 625 626
	for_each_string_list_item(item, &remote_refs) {
		/* Unless we have already decided to ignore this item... */
		if (item->util)
		{
			struct ref *rm = alloc_ref(item->string);
			rm->peer_ref = alloc_ref(item->string);
			hashcpy(rm->old_sha1, item->util);
			**tail = rm;
			*tail = &rm->next;
		}
	}
627 628

	string_list_clear(&remote_refs, 0);
D
Daniel Barkalow 已提交
629 630
}

631 632 633 634 635 636 637 638 639 640
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))
641 642
			die("Refusing to fetch into current branch %s "
			    "of non-bare repository", current_branch->refname);
643 644
}

645 646 647 648 649 650 651 652 653 654 655
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 已提交
656 657 658
static int do_fetch(struct transport *transport,
		    struct refspec *refs, int ref_count)
{
659
	struct string_list existing_refs = STRING_LIST_INIT_NODUP;
660
	struct string_list_item *peer_item = NULL;
661
	struct ref *ref_map;
D
Daniel Barkalow 已提交
662 663
	struct ref *rm;
	int autotags = (transport->remote->fetch_tags == 1);
664 665 666

	for_each_ref(add_existing, &existing_refs);

667 668 669 670 671 672
	if (tags == TAGS_DEFAULT) {
		if (transport->remote->fetch_tags == 2)
			tags = TAGS_SET;
		if (transport->remote->fetch_tags == -1)
			tags = TAGS_UNSET;
	}
D
Daniel Barkalow 已提交
673

674
	if (!transport->get_refs_list || !transport->fetch)
D
Daniel Barkalow 已提交
675 676 677
		die("Don't know how to fetch from %s", transport->url);

	/* if not appending, truncate FETCH_HEAD */
J
Jay Soffian 已提交
678
	if (!append && !dry_run) {
679 680 681
		int errcode = truncate_fetch_head();
		if (errcode)
			return errcode;
682
	}
D
Daniel Barkalow 已提交
683 684

	ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags);
685 686
	if (!update_head_ok)
		check_not_current_branch(ref_map);
D
Daniel Barkalow 已提交
687 688

	for (rm = ref_map; rm; rm = rm->next) {
689
		if (rm->peer_ref) {
690 691
			peer_item = string_list_lookup(&existing_refs,
						       rm->peer_ref->name);
692 693 694 695
			if (peer_item)
				hashcpy(rm->peer_ref->old_sha1,
					peer_item->util);
		}
D
Daniel Barkalow 已提交
696 697
	}

698 699
	if (tags == TAGS_DEFAULT && autotags)
		transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
D
Daniel Barkalow 已提交
700 701 702 703
	if (fetch_refs(transport, ref_map)) {
		free_refs(ref_map);
		return 1;
	}
J
Jay Soffian 已提交
704 705
	if (prune)
		prune_refs(transport, ref_map);
706
	free_refs(ref_map);
D
Daniel Barkalow 已提交
707 708 709

	/* if neither --no-tags nor --tags was specified, do automated tag
	 * following ... */
710
	if (tags == TAGS_DEFAULT && autotags) {
711 712 713
		struct ref **tail = &ref_map;
		ref_map = NULL;
		find_non_local_tags(transport, &ref_map, &tail);
D
Daniel Barkalow 已提交
714
		if (ref_map) {
715
			transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, NULL);
D
Daniel Barkalow 已提交
716 717 718 719 720 721 722 723 724
			transport_set_option(transport, TRANS_OPT_DEPTH, "0");
			fetch_refs(transport, ref_map);
		}
		free_refs(ref_map);
	}

	return 0;
}

725 726 727 728
static void set_option(const char *name, const char *value)
{
	int r = transport_set_option(transport, name, value);
	if (r < 0)
729
		die("Option \"%s\" value \"%s\" is not valid for %s",
730 731 732 733 734 735
			name, value, transport->url);
	if (r > 0)
		warning("Option \"%s\" is ignored for %s\n",
			name, transport->url);
}

736 737 738
static int get_one_remote_for_fetch(struct remote *remote, void *priv)
{
	struct string_list *list = priv;
739
	if (!remote->skip_default_update)
740
		string_list_append(list, remote->name);
741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758
	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) {
759 760
				string_list_append(g->list,
						   xstrndup(value, space));
761 762 763 764 765 766 767 768 769 770 771 772
			}
			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;
773 774
	struct remote_group_data g;
	g.name = name; g.list = list;
775 776 777 778 779 780 781

	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);
782
		string_list_append(list, remote->name);
783 784 785 786 787 788 789
	}
	return 1;
}

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

J
Jay Soffian 已提交
793 794
	if (dry_run)
		argv[argc++] = "--dry-run";
J
Jay Soffian 已提交
795 796
	if (prune)
		argv[argc++] = "--prune";
797 798 799 800 801 802
	if (update_head_ok)
		argv[argc++] = "--update-head-ok";
	if (force)
		argv[argc++] = "--force";
	if (keep)
		argv[argc++] = "--keep";
803 804 805 806 807 808 809
	if (verbosity >= 2)
		argv[argc++] = "-v";
	if (verbosity >= 1)
		argv[argc++] = "-v";
	else if (verbosity < 0)
		argv[argc++] = "-q";

810 811 812 813 814 815
	if (!append && !dry_run) {
		int errcode = truncate_fetch_head();
		if (errcode)
			return errcode;
	}

816 817 818
	for (i = 0; i < list->nr; i++) {
		const char *name = list->items[i].string;
		argv[argc] = name;
819
		argv[argc + 1] = NULL;
820 821 822 823 824 825 826 827 828 829 830 831
		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 已提交
832
{
833
	int i;
D
Daniel Barkalow 已提交
834 835
	static const char **refs = NULL;
	int ref_nr = 0;
836
	int exit_code;
D
Daniel Barkalow 已提交
837

838
	if (!remote)
839 840
		die("No remote repository specified.  Please, specify either a URL or a\n"
		    "remote name from which new revisions should be fetched.");
841

842
	transport = transport_get(remote, NULL);
T
Tay Ray Chuan 已提交
843
	transport_set_verbosity(transport, verbosity, progress);
D
Daniel Barkalow 已提交
844
	if (upload_pack)
845
		set_option(TRANS_OPT_UPLOADPACK, upload_pack);
D
Daniel Barkalow 已提交
846
	if (keep)
847 848 849
		set_option(TRANS_OPT_KEEP, "yes");
	if (depth)
		set_option(TRANS_OPT_DEPTH, depth);
D
Daniel Barkalow 已提交
850

851
	if (argc > 0) {
D
Daniel Barkalow 已提交
852
		int j = 0;
853
		refs = xcalloc(argc + 1, sizeof(const char *));
854
		for (i = 0; i < argc; i++) {
D
Daniel Barkalow 已提交
855 856 857
			if (!strcmp(argv[i], "tag")) {
				char *ref;
				i++;
858 859
				if (i >= argc)
					die("You need to specify a tag name.");
D
Daniel Barkalow 已提交
860 861 862 863 864 865 866 867 868 869 870 871 872
				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;
	}

873
	sigchain_push_common(unlock_pack_on_signal);
874
	atexit(unlock_pack);
875
	exit_code = do_fetch(transport,
876
			parse_fetch_refspec(ref_nr, refs), ref_nr);
877 878 879
	transport_disconnect(transport);
	transport = NULL;
	return exit_code;
D
Daniel Barkalow 已提交
880
}
881 882 883 884

int cmd_fetch(int argc, const char **argv, const char *prefix)
{
	int i;
885
	struct string_list list = STRING_LIST_INIT_NODUP;
886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907
	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);
908 909 910 911 912 913
	} 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);
914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934
	} 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;
}