remote.c 58.5 KB
Newer Older
1
#include "cache.h"
2
#include "config.h"
3 4
#include "remote.h"
#include "refs.h"
5 6 7
#include "commit.h"
#include "diff.h"
#include "revision.h"
8
#include "dir.h"
9
#include "tag.h"
10
#include "string-list.h"
11
#include "mergesort.h"
12
#include "argv-array.h"
13

F
Felipe Contreras 已提交
14 15
enum map_direction { FROM_SRC, FROM_DST };

16 17 18
static struct refspec s_tag_refspec = {
	0,
	1,
J
Junio C Hamano 已提交
19
	0,
20
	0,
D
Daniel Barkalow 已提交
21 22
	"refs/tags/*",
	"refs/tags/*"
23 24 25 26
};

const struct refspec *tag_refspec = &s_tag_refspec;

27 28 29 30
struct counted_string {
	size_t len;
	const char *s;
};
31 32
struct rewrite {
	const char *base;
33 34
	size_t baselen;
	struct counted_string *instead_of;
35 36 37
	int instead_of_nr;
	int instead_of_alloc;
};
38 39 40 41 42
struct rewrites {
	struct rewrite **rewrite;
	int rewrite_alloc;
	int rewrite_nr;
};
43

44
static struct remote **remotes;
D
Daniel Barkalow 已提交
45 46
static int remotes_alloc;
static int remotes_nr;
47
static struct hashmap remotes_hash;
48

49
static struct branch **branches;
D
Daniel Barkalow 已提交
50 51
static int branches_alloc;
static int branches_nr;
52 53

static struct branch *current_branch;
54
static const char *pushremote_name;
55

56
static struct rewrites rewrites;
57
static struct rewrites rewrites_push;
58

59 60
static int valid_remote(const struct remote *remote)
{
61
	return (!!remote->url) || (!!remote->foreign_vcs);
62 63
}

64
static const char *alias_url(const char *url, struct rewrites *r)
65 66
{
	int i, j;
67 68 69 70 71
	struct counted_string *longest;
	int longest_i;

	longest = NULL;
	longest_i = -1;
72 73
	for (i = 0; i < r->rewrite_nr; i++) {
		if (!r->rewrite[i])
74
			continue;
75
		for (j = 0; j < r->rewrite[i]->instead_of_nr; j++) {
76
			if (starts_with(url, r->rewrite[i]->instead_of[j].s) &&
77
			    (!longest ||
78 79
			     longest->len < r->rewrite[i]->instead_of[j].len)) {
				longest = &(r->rewrite[i]->instead_of[j]);
80
				longest_i = i;
81 82 83
			}
		}
	}
84 85 86
	if (!longest)
		return url;

87
	return xstrfmt("%s%s", r->rewrite[longest_i]->base, url + longest->len);
88 89
}

90 91
static void add_push_refspec(struct remote *remote, const char *ref)
{
D
Daniel Barkalow 已提交
92 93 94 95
	ALLOC_GROW(remote->push_refspec,
		   remote->push_refspec_nr + 1,
		   remote->push_refspec_alloc);
	remote->push_refspec[remote->push_refspec_nr++] = ref;
96 97
}

98 99
static void add_fetch_refspec(struct remote *remote, const char *ref)
{
D
Daniel Barkalow 已提交
100 101 102 103
	ALLOC_GROW(remote->fetch_refspec,
		   remote->fetch_refspec_nr + 1,
		   remote->fetch_refspec_alloc);
	remote->fetch_refspec[remote->fetch_refspec_nr++] = ref;
104 105
}

106
static void add_url(struct remote *remote, const char *url)
107
{
D
Daniel Barkalow 已提交
108 109
	ALLOC_GROW(remote->url, remote->url_nr + 1, remote->url_alloc);
	remote->url[remote->url_nr++] = url;
110 111
}

112 113 114 115 116 117
static void add_pushurl(struct remote *remote, const char *pushurl)
{
	ALLOC_GROW(remote->pushurl, remote->pushurl_nr + 1, remote->pushurl_alloc);
	remote->pushurl[remote->pushurl_nr++] = pushurl;
}

118 119 120 121 122 123 124 125 126 127 128 129 130
static void add_pushurl_alias(struct remote *remote, const char *url)
{
	const char *pushurl = alias_url(url, &rewrites_push);
	if (pushurl != url)
		add_pushurl(remote, pushurl);
}

static void add_url_alias(struct remote *remote, const char *url)
{
	add_url(remote, alias_url(url, &rewrites));
	add_pushurl_alias(remote, url);
}

131 132 133 134 135
struct remotes_hash_key {
	const char *str;
	int len;
};

136 137 138 139
static int remotes_hash_cmp(const void *unused_cmp_data,
			    const struct remote *a,
			    const struct remote *b,
			    const struct remotes_hash_key *key)
140 141 142 143 144 145 146 147 148 149
{
	if (key)
		return strncmp(a->name, key->str, key->len) || a->name[key->len];
	else
		return strcmp(a->name, b->name);
}

static inline void init_remotes_hash(void)
{
	if (!remotes_hash.cmpfn)
150
		hashmap_init(&remotes_hash, (hashmap_cmp_fn)remotes_hash_cmp, NULL, 0);
151 152
}

153 154
static struct remote *make_remote(const char *name, int len)
{
155 156 157
	struct remote *ret, *replaced;
	struct remotes_hash_key lookup;
	struct hashmap_entry lookup_entry;
158

159 160 161 162 163 164 165 166 167 168
	if (!len)
		len = strlen(name);

	init_remotes_hash();
	lookup.str = name;
	lookup.len = len;
	hashmap_entry_init(&lookup_entry, memhash(name, len));

	if ((ret = hashmap_get(&remotes_hash, &lookup_entry, &lookup)) != NULL)
		return ret;
169

D
Daniel Barkalow 已提交
170
	ret = xcalloc(1, sizeof(struct remote));
171
	ret->prune = -1;  /* unspecified */
D
Daniel Barkalow 已提交
172 173
	ALLOC_GROW(remotes, remotes_nr + 1, remotes_alloc);
	remotes[remotes_nr++] = ret;
174 175 176 177 178
	ret->name = xstrndup(name, len);

	hashmap_entry_init(ret, lookup_entry.hash);
	replaced = hashmap_put(&remotes_hash, ret);
	assert(replaced == NULL);  /* no previous entry overwritten */
D
Daniel Barkalow 已提交
179
	return ret;
180 181
}

182 183
static void add_merge(struct branch *branch, const char *name)
{
D
Daniel Barkalow 已提交
184 185 186
	ALLOC_GROW(branch->merge_name, branch->merge_nr + 1,
		   branch->merge_alloc);
	branch->merge_name[branch->merge_nr++] = name;
187 188 189 190
}

static struct branch *make_branch(const char *name, int len)
{
D
Daniel Barkalow 已提交
191 192
	struct branch *ret;
	int i;
193

D
Daniel Barkalow 已提交
194 195 196 197 198
	for (i = 0; i < branches_nr; i++) {
		if (len ? (!strncmp(name, branches[i]->name, len) &&
			   !branches[i]->name[len]) :
		    !strcmp(name, branches[i]->name))
			return branches[i];
199 200
	}

D
Daniel Barkalow 已提交
201 202 203
	ALLOC_GROW(branches, branches_nr + 1, branches_alloc);
	ret = xcalloc(1, sizeof(struct branch));
	branches[branches_nr++] = ret;
204
	if (len)
D
Daniel Barkalow 已提交
205
		ret->name = xstrndup(name, len);
206
	else
D
Daniel Barkalow 已提交
207
		ret->name = xstrdup(name);
208
	ret->refname = xstrfmt("refs/heads/%s", ret->name);
209

D
Daniel Barkalow 已提交
210
	return ret;
211 212
}

213
static struct rewrite *make_rewrite(struct rewrites *r, const char *base, int len)
214 215 216 217
{
	struct rewrite *ret;
	int i;

218
	for (i = 0; i < r->rewrite_nr; i++) {
219
		if (len
220 221 222 223
		    ? (len == r->rewrite[i]->baselen &&
		       !strncmp(base, r->rewrite[i]->base, len))
		    : !strcmp(base, r->rewrite[i]->base))
			return r->rewrite[i];
224 225
	}

226
	ALLOC_GROW(r->rewrite, r->rewrite_nr + 1, r->rewrite_alloc);
227
	ret = xcalloc(1, sizeof(struct rewrite));
228
	r->rewrite[r->rewrite_nr++] = ret;
229
	if (len) {
230
		ret->base = xstrndup(base, len);
231 232 233
		ret->baselen = len;
	}
	else {
234
		ret->base = xstrdup(base);
235 236
		ret->baselen = strlen(base);
	}
237 238 239 240 241 242
	return ret;
}

static void add_instead_of(struct rewrite *rewrite, const char *instead_of)
{
	ALLOC_GROW(rewrite->instead_of, rewrite->instead_of_nr + 1, rewrite->instead_of_alloc);
243 244 245
	rewrite->instead_of[rewrite->instead_of_nr].s = instead_of;
	rewrite->instead_of[rewrite->instead_of_nr].len = strlen(instead_of);
	rewrite->instead_of_nr++;
246 247
}

248 249 250 251 252 253 254
static const char *skip_spaces(const char *s)
{
	while (isspace(*s))
		s++;
	return s;
}

255 256
static void read_remotes_file(struct remote *remote)
{
257
	struct strbuf buf = STRBUF_INIT;
258
	FILE *f = fopen_or_warn(git_path("remotes/%s", remote->name), "r");
259 260 261

	if (!f)
		return;
262
	remote->configured_in_repo = 1;
263
	remote->origin = REMOTE_REMOTES;
264
	while (strbuf_getline(&buf, f) != EOF) {
265
		const char *v;
266

267
		strbuf_rtrim(&buf);
268

269 270 271 272 273 274
		if (skip_prefix(buf.buf, "URL:", &v))
			add_url_alias(remote, xstrdup(skip_spaces(v)));
		else if (skip_prefix(buf.buf, "Push:", &v))
			add_push_refspec(remote, xstrdup(skip_spaces(v)));
		else if (skip_prefix(buf.buf, "Pull:", &v))
			add_fetch_refspec(remote, xstrdup(skip_spaces(v)));
275
	}
276
	strbuf_release(&buf);
277 278 279 280 281
	fclose(f);
}

static void read_branches_file(struct remote *remote)
{
282
	char *frag;
283
	struct strbuf buf = STRBUF_INIT;
284
	FILE *f = fopen_or_warn(git_path("branches/%s", remote->name), "r");
285 286 287

	if (!f)
		return;
288

289
	strbuf_getline_lf(&buf, f);
290
	fclose(f);
291 292 293
	strbuf_trim(&buf);
	if (!buf.len) {
		strbuf_release(&buf);
294
		return;
295 296
	}

297
	remote->configured_in_repo = 1;
298
	remote->origin = REMOTE_BRANCHES;
299 300

	/*
301
	 * The branches file would have URL and optionally
302
	 * #branch specified.  The "master" (or specified) branch is
303 304
	 * fetched and stored in the local branch matching the
	 * remote name.
305
	 */
306 307
	frag = strchr(buf.buf, '#');
	if (frag)
308
		*(frag++) = '\0';
309 310 311 312 313 314
	else
		frag = "master";

	add_url_alias(remote, strbuf_detach(&buf, NULL));
	add_fetch_refspec(remote, xstrfmt("refs/heads/%s:refs/heads/%s",
					  frag, remote->name));
315

316 317 318 319
	/*
	 * Cogito compatible push: push current HEAD to remote #branch
	 * (master if missing)
	 */
320
	add_push_refspec(remote, xstrfmt("HEAD:refs/heads/%s", frag));
321
	remote->fetch_tags = 1; /* always auto-follow */
322 323
}

324
static int handle_config(const char *key, const char *value, void *cb)
325 326
{
	const char *name;
T
Thomas Gummerer 已提交
327
	int namelen;
328 329
	const char *subkey;
	struct remote *remote;
330
	struct branch *branch;
T
Thomas Gummerer 已提交
331 332
	if (parse_config_key(key, "branch", &name, &namelen, &subkey) >= 0) {
		if (!name)
333
			return 0;
T
Thomas Gummerer 已提交
334 335
		branch = make_branch(name, namelen);
		if (!strcmp(subkey, "remote")) {
336
			return git_config_string(&branch->remote_name, key, value);
T
Thomas Gummerer 已提交
337
		} else if (!strcmp(subkey, "pushremote")) {
338
			return git_config_string(&branch->pushremote_name, key, value);
T
Thomas Gummerer 已提交
339
		} else if (!strcmp(subkey, "merge")) {
340 341
			if (!value)
				return config_error_nonbool(key);
342
			add_merge(branch, xstrdup(value));
343
		}
344
		return 0;
345
	}
T
Thomas Gummerer 已提交
346
	if (parse_config_key(key, "url", &name, &namelen, &subkey) >= 0) {
347
		struct rewrite *rewrite;
T
Thomas Gummerer 已提交
348
		if (!name)
349
			return 0;
T
Thomas Gummerer 已提交
350 351
		if (!strcmp(subkey, "insteadof")) {
			rewrite = make_rewrite(&rewrites, name, namelen);
352 353 354
			if (!value)
				return config_error_nonbool(key);
			add_instead_of(rewrite, xstrdup(value));
T
Thomas Gummerer 已提交
355 356
		} else if (!strcmp(subkey, "pushinsteadof")) {
			rewrite = make_rewrite(&rewrites_push, name, namelen);
357 358 359 360 361
			if (!value)
				return config_error_nonbool(key);
			add_instead_of(rewrite, xstrdup(value));
		}
	}
362

T
Thomas Gummerer 已提交
363
	if (parse_config_key(key, "remote", &name, &namelen, &subkey) < 0)
364
		return 0;
365 366

	/* Handle remote.* variables */
T
Thomas Gummerer 已提交
367
	if (!name && !strcmp(subkey, "pushdefault"))
368 369
		return git_config_string(&pushremote_name, key, value);

T
Thomas Gummerer 已提交
370 371
	if (!name)
		return 0;
372
	/* Handle remote.<name>.* variables */
373 374 375 376 377
	if (*name == '/') {
		warning("Config remote shorthand cannot begin with '/': %s",
			name);
		return 0;
	}
T
Thomas Gummerer 已提交
378
	remote = make_remote(name, namelen);
379
	remote->origin = REMOTE_CONFIG;
380 381
	if (current_config_scope() == CONFIG_SCOPE_REPO)
		remote->configured_in_repo = 1;
T
Thomas Gummerer 已提交
382
	if (!strcmp(subkey, "mirror"))
383
		remote->mirror = git_config_bool(key, value);
T
Thomas Gummerer 已提交
384
	else if (!strcmp(subkey, "skipdefaultupdate"))
385
		remote->skip_default_update = git_config_bool(key, value);
T
Thomas Gummerer 已提交
386
	else if (!strcmp(subkey, "skipfetchall"))
387
		remote->skip_default_update = git_config_bool(key, value);
T
Thomas Gummerer 已提交
388
	else if (!strcmp(subkey, "prune"))
389
		remote->prune = git_config_bool(key, value);
T
Thomas Gummerer 已提交
390
	else if (!strcmp(subkey, "url")) {
391 392 393 394
		const char *v;
		if (git_config_string(&v, key, value))
			return -1;
		add_url(remote, v);
T
Thomas Gummerer 已提交
395
	} else if (!strcmp(subkey, "pushurl")) {
396 397 398 399
		const char *v;
		if (git_config_string(&v, key, value))
			return -1;
		add_pushurl(remote, v);
T
Thomas Gummerer 已提交
400
	} else if (!strcmp(subkey, "push")) {
401 402 403 404
		const char *v;
		if (git_config_string(&v, key, value))
			return -1;
		add_push_refspec(remote, v);
T
Thomas Gummerer 已提交
405
	} else if (!strcmp(subkey, "fetch")) {
406 407 408 409
		const char *v;
		if (git_config_string(&v, key, value))
			return -1;
		add_fetch_refspec(remote, v);
T
Thomas Gummerer 已提交
410
	} else if (!strcmp(subkey, "receivepack")) {
411 412 413
		const char *v;
		if (git_config_string(&v, key, value))
			return -1;
414
		if (!remote->receivepack)
415
			remote->receivepack = v;
416 417
		else
			error("more than one receivepack given, using the first");
T
Thomas Gummerer 已提交
418
	} else if (!strcmp(subkey, "uploadpack")) {
419 420 421
		const char *v;
		if (git_config_string(&v, key, value))
			return -1;
422
		if (!remote->uploadpack)
423
			remote->uploadpack = v;
424 425
		else
			error("more than one uploadpack given, using the first");
T
Thomas Gummerer 已提交
426
	} else if (!strcmp(subkey, "tagopt")) {
427 428
		if (!strcmp(value, "--no-tags"))
			remote->fetch_tags = -1;
429 430
		else if (!strcmp(value, "--tags"))
			remote->fetch_tags = 2;
T
Thomas Gummerer 已提交
431
	} else if (!strcmp(subkey, "proxy")) {
432 433
		return git_config_string((const char **)&remote->http_proxy,
					 key, value);
T
Thomas Gummerer 已提交
434
	} else if (!strcmp(subkey, "proxyauthmethod")) {
435 436
		return git_config_string((const char **)&remote->http_proxy_authmethod,
					 key, value);
T
Thomas Gummerer 已提交
437
	} else if (!strcmp(subkey, "vcs")) {
438
		return git_config_string(&remote->foreign_vcs, key, value);
439
	}
440 441 442
	return 0;
}

443 444 445 446
static void alias_all_urls(void)
{
	int i, j;
	for (i = 0; i < remotes_nr; i++) {
447
		int add_pushurl_aliases;
448 449
		if (!remotes[i])
			continue;
450
		for (j = 0; j < remotes[i]->pushurl_nr; j++) {
451
			remotes[i]->pushurl[j] = alias_url(remotes[i]->pushurl[j], &rewrites);
452
		}
453 454 455 456 457 458
		add_pushurl_aliases = remotes[i]->pushurl_nr == 0;
		for (j = 0; j < remotes[i]->url_nr; j++) {
			if (add_pushurl_aliases)
				add_pushurl_alias(remotes[i], remotes[i]->url[j]);
			remotes[i]->url[j] = alias_url(remotes[i]->url[j], &rewrites);
		}
459 460 461
	}
}

462 463
static void read_config(void)
{
464
	static int loaded;
465
	struct object_id oid;
466
	int flag;
467 468

	if (loaded)
469
		return;
470 471
	loaded = 1;

472
	current_branch = NULL;
473 474 475 476 477 478
	if (startup_info->have_repository) {
		const char *head_ref = resolve_ref_unsafe("HEAD", 0, oid.hash, &flag);
		if (head_ref && (flag & REF_ISSYMREF) &&
		    skip_prefix(head_ref, "refs/heads/", &head_ref)) {
			current_branch = make_branch(head_ref, 0);
		}
479
	}
480
	git_config(handle_config, NULL);
481
	alias_all_urls();
482 483
}

484
static struct refspec *parse_refspec_internal(int nr_refspec, const char **refspec, int fetch, int verify)
485 486
{
	int i;
487
	struct refspec *rs = xcalloc(nr_refspec, sizeof(*rs));
488

489
	for (i = 0; i < nr_refspec; i++) {
490
		size_t llen;
491 492
		int is_glob;
		const char *lhs, *rhs;
493
		int flags;
494

B
Benjamin Kramer 已提交
495
		is_glob = 0;
496 497 498

		lhs = refspec[i];
		if (*lhs == '+') {
499
			rs[i].force = 1;
500
			lhs++;
501
		}
502 503

		rhs = strrchr(lhs, ':');
504 505 506

		/*
		 * Before going on, special case ":" (or "+:") as a refspec
507
		 * for pushing matching refs.
508 509 510 511 512 513
		 */
		if (!fetch && rhs == lhs && rhs[1] == '\0') {
			rs[i].matching = 1;
			continue;
		}

514
		if (rhs) {
515
			size_t rlen = strlen(++rhs);
516
			is_glob = (1 <= rlen && strchr(rhs, '*'));
D
Daniel Barkalow 已提交
517
			rs[i].dst = xstrndup(rhs, rlen);
518
		}
D
Daniel Barkalow 已提交
519

520
		llen = (rhs ? (rhs - lhs - 1) : strlen(lhs));
521
		if (1 <= llen && memchr(lhs, '*', llen)) {
522 523 524 525 526
			if ((rhs && !is_glob) || (!rhs && fetch))
				goto invalid;
			is_glob = 1;
		} else if (rhs && is_glob) {
			goto invalid;
D
Daniel Barkalow 已提交
527
		}
528

529 530
		rs[i].pattern = is_glob;
		rs[i].src = xstrndup(lhs, llen);
531
		flags = REFNAME_ALLOW_ONELEVEL | (is_glob ? REFNAME_REFSPEC_PATTERN : 0);
532 533

		if (fetch) {
534
			struct object_id unused;
535

536
			/* LHS */
537
			if (!*rs[i].src)
538
				; /* empty is ok; it means "HEAD" */
539
			else if (llen == GIT_SHA1_HEXSZ && !get_oid_hex(rs[i].src, &unused))
540
				rs[i].exact_sha1 = 1; /* ok */
541 542 543
			else if (!check_refname_format(rs[i].src, flags))
				; /* valid looking ref is ok */
			else
544
				goto invalid;
545
			/* RHS */
546
			if (!rs[i].dst)
547
				; /* missing is ok; it is the same as empty */
548
			else if (!*rs[i].dst)
549 550 551 552
				; /* empty is ok; it means "do not store" */
			else if (!check_refname_format(rs[i].dst, flags))
				; /* valid looking ref is ok */
			else
553
				goto invalid;
554 555 556 557 558 559 560 561 562 563 564
		} else {
			/*
			 * LHS
			 * - empty is allowed; it means delete.
			 * - when wildcarded, it must be a valid looking ref.
			 * - otherwise, it must be an extended SHA-1, but
			 *   there is no existing way to validate this.
			 */
			if (!*rs[i].src)
				; /* empty is ok */
			else if (is_glob) {
565
				if (check_refname_format(rs[i].src, flags))
566 567 568 569 570 571 572 573 574 575 576 577
					goto invalid;
			}
			else
				; /* anything goes, for now */
			/*
			 * RHS
			 * - missing is allowed, but LHS then must be a
			 *   valid looking ref.
			 * - empty is not allowed.
			 * - otherwise it must be a valid looking ref.
			 */
			if (!rs[i].dst) {
578
				if (check_refname_format(rs[i].src, flags))
579 580 581 582
					goto invalid;
			} else if (!*rs[i].dst) {
				goto invalid;
			} else {
583
				if (check_refname_format(rs[i].dst, flags))
584 585
					goto invalid;
			}
D
Daniel Barkalow 已提交
586
		}
587 588
	}
	return rs;
589 590

 invalid:
591
	if (verify) {
592 593 594 595 596
		/*
		 * nr_refspec must be greater than zero and i must be valid
		 * since it is only possible to reach this point from within
		 * the for loop above.
		 */
597
		free_refspec(i+1, rs);
598 599
		return NULL;
	}
600 601 602
	die("Invalid refspec '%s'", refspec[i]);
}

603 604 605 606
int valid_fetch_refspec(const char *fetch_refspec_str)
{
	struct refspec *refspec;

607
	refspec = parse_refspec_internal(1, &fetch_refspec_str, 1, 1);
608
	free_refspec(1, refspec);
609 610 611
	return !!refspec;
}

612 613
struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec)
{
614
	return parse_refspec_internal(nr_refspec, refspec, 1, 0);
615 616
}

617
struct refspec *parse_push_refspec(int nr_refspec, const char **refspec)
618
{
619
	return parse_refspec_internal(nr_refspec, refspec, 0, 0);
620 621
}

622 623 624
void free_refspec(int nr_refspec, struct refspec *refspec)
{
	int i;
625 626 627 628

	if (!refspec)
		return;

629 630 631 632 633 634 635
	for (i = 0; i < nr_refspec; i++) {
		free(refspec[i].src);
		free(refspec[i].dst);
	}
	free(refspec);
}

636 637
static int valid_remote_nick(const char *name)
{
638
	if (!name[0] || is_dot_or_dotdot(name))
639
		return 0;
640 641 642 643 644 645

	/* remote nicknames cannot contain slashes */
	while (*name)
		if (is_dir_sep(*name++))
			return 0;
	return 1;
646 647
}

648 649 650 651 652 653 654 655 656 657 658 659
const char *remote_for_branch(struct branch *branch, int *explicit)
{
	if (branch && branch->remote_name) {
		if (explicit)
			*explicit = 1;
		return branch->remote_name;
	}
	if (explicit)
		*explicit = 0;
	return "origin";
}

660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
const char *pushremote_for_branch(struct branch *branch, int *explicit)
{
	if (branch && branch->pushremote_name) {
		if (explicit)
			*explicit = 1;
		return branch->pushremote_name;
	}
	if (pushremote_name) {
		if (explicit)
			*explicit = 1;
		return pushremote_name;
	}
	return remote_for_branch(branch, explicit);
}

static struct remote *remote_get_1(const char *name,
				   const char *(*get_default)(struct branch *, int *))
677 678
{
	struct remote *ret;
679
	int name_given = 0;
680

681 682
	read_config();

683 684
	if (name)
		name_given = 1;
685 686
	else
		name = get_default(current_branch, &name_given);
687

688
	ret = make_remote(name, 0);
689
	if (valid_remote_nick(name) && have_git_dir()) {
690
		if (!valid_remote(ret))
691
			read_remotes_file(ret);
692
		if (!valid_remote(ret))
693 694
			read_branches_file(ret);
	}
695
	if (name_given && !valid_remote(ret))
696
		add_url_alias(ret, name);
697
	if (!valid_remote(ret))
698
		return NULL;
699 700
	ret->fetch = parse_fetch_refspec(ret->fetch_refspec_nr, ret->fetch_refspec);
	ret->push = parse_push_refspec(ret->push_refspec_nr, ret->push_refspec);
701 702
	return ret;
}
703

704 705
struct remote *remote_get(const char *name)
{
706
	return remote_get_1(name, remote_for_branch);
707 708 709 710
}

struct remote *pushremote_get(const char *name)
{
711
	return remote_get_1(name, pushremote_for_branch);
712 713
}

714
int remote_is_configured(struct remote *remote, int in_repo)
715
{
716 717 718 719 720
	if (!remote)
		return 0;
	if (in_repo)
		return remote->configured_in_repo;
	return !!remote->origin;
721 722
}

723 724 725 726
int for_each_remote(each_remote_fn fn, void *priv)
{
	int i, result = 0;
	read_config();
D
Daniel Barkalow 已提交
727
	for (i = 0; i < remotes_nr && !result; i++) {
728 729 730 731
		struct remote *r = remotes[i];
		if (!r)
			continue;
		if (!r->fetch)
732 733
			r->fetch = parse_fetch_refspec(r->fetch_refspec_nr,
						       r->fetch_refspec);
734
		if (!r->push)
735 736
			r->push = parse_push_refspec(r->push_refspec_nr,
						     r->push_refspec);
737 738 739 740 741
		result = fn(r, priv);
	}
	return result;
}

742 743
static void handle_duplicate(struct ref *ref1, struct ref *ref2)
{
744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765
	if (strcmp(ref1->name, ref2->name)) {
		if (ref1->fetch_head_status != FETCH_HEAD_IGNORE &&
		    ref2->fetch_head_status != FETCH_HEAD_IGNORE) {
			die(_("Cannot fetch both %s and %s to %s"),
			    ref1->name, ref2->name, ref2->peer_ref->name);
		} else if (ref1->fetch_head_status != FETCH_HEAD_IGNORE &&
			   ref2->fetch_head_status == FETCH_HEAD_IGNORE) {
			warning(_("%s usually tracks %s, not %s"),
				ref2->peer_ref->name, ref2->name, ref1->name);
		} else if (ref1->fetch_head_status == FETCH_HEAD_IGNORE &&
			   ref2->fetch_head_status == FETCH_HEAD_IGNORE) {
			die(_("%s tracks both %s and %s"),
			    ref2->peer_ref->name, ref1->name, ref2->name);
		} else {
			/*
			 * This last possibility doesn't occur because
			 * FETCH_HEAD_IGNORE entries always appear at
			 * the end of the list.
			 */
			die(_("Internal error"));
		}
	}
766 767 768 769
	free(ref2->peer_ref);
	free(ref2);
}

770
struct ref *ref_remove_duplicates(struct ref *ref_map)
771
{
772
	struct string_list refs = STRING_LIST_INIT_NODUP;
773 774
	struct ref *retval = NULL;
	struct ref **p = &retval;
775

776 777 778 779 780
	while (ref_map) {
		struct ref *ref = ref_map;

		ref_map = ref_map->next;
		ref->next = NULL;
781

782 783 784
		if (!ref->peer_ref) {
			*p = ref;
			p = &ref->next;
785
		} else {
786 787 788 789 790
			struct string_list_item *item =
				string_list_insert(&refs, ref->peer_ref->name);

			if (item->util) {
				/* Entry already existed */
791
				handle_duplicate((struct ref *)item->util, ref);
792 793 794 795 796
			} else {
				*p = ref;
				p = &ref->next;
				item->util = ref;
			}
797 798
		}
	}
799

800
	string_list_clear(&refs, 0);
801
	return retval;
802 803
}

804
int remote_has_url(struct remote *remote, const char *url)
805 806
{
	int i;
807 808
	for (i = 0; i < remote->url_nr; i++) {
		if (!strcmp(remote->url[i], url))
809 810 811 812 813
			return 1;
	}
	return 0;
}

814 815
static int match_name_with_pattern(const char *key, const char *name,
				   const char *value, char **result)
816
{
D
Daniel Barkalow 已提交
817 818
	const char *kstar = strchr(key, '*');
	size_t klen;
819 820
	size_t ksuffixlen;
	size_t namelen;
D
Daniel Barkalow 已提交
821 822 823 824
	int ret;
	if (!kstar)
		die("Key '%s' of pattern had no '*'", key);
	klen = kstar - key;
825 826 827 828
	ksuffixlen = strlen(kstar + 1);
	namelen = strlen(name);
	ret = !strncmp(name, key, klen) && namelen >= klen + ksuffixlen &&
		!memcmp(name + namelen - ksuffixlen, kstar + 1, ksuffixlen);
829
	if (ret && value) {
830
		struct strbuf sb = STRBUF_INIT;
D
Daniel Barkalow 已提交
831 832 833
		const char *vstar = strchr(value, '*');
		if (!vstar)
			die("Value '%s' of pattern has no '*'", value);
834 835 836 837
		strbuf_add(&sb, value, vstar - value);
		strbuf_add(&sb, name + klen, namelen - klen - ksuffixlen);
		strbuf_addstr(&sb, vstar + 1);
		*result = strbuf_detach(&sb, NULL);
838
	}
839 840 841
	return ret;
}

842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867
static void query_refspecs_multiple(struct refspec *refs, int ref_count, struct refspec *query, struct string_list *results)
{
	int i;
	int find_src = !query->src;

	if (find_src && !query->dst)
		error("query_refspecs_multiple: need either src or dst");

	for (i = 0; i < ref_count; i++) {
		struct refspec *refspec = &refs[i];
		const char *key = find_src ? refspec->dst : refspec->src;
		const char *value = find_src ? refspec->src : refspec->dst;
		const char *needle = find_src ? query->dst : query->src;
		char **result = find_src ? &query->src : &query->dst;

		if (!refspec->dst)
			continue;
		if (refspec->pattern) {
			if (match_name_with_pattern(key, needle, value, result))
				string_list_append_nodup(results, *result);
		} else if (!strcmp(needle, key)) {
			string_list_append(results, value);
		}
	}
}

868
int query_refspecs(struct refspec *refs, int ref_count, struct refspec *query)
869 870
{
	int i;
871
	int find_src = !query->src;
872 873
	const char *needle = find_src ? query->dst : query->src;
	char **result = find_src ? &query->src : &query->dst;
874

875 876
	if (find_src && !query->dst)
		return error("query_refspecs: need either src or dst");
877

878 879 880 881
	for (i = 0; i < ref_count; i++) {
		struct refspec *refspec = &refs[i];
		const char *key = find_src ? refspec->dst : refspec->src;
		const char *value = find_src ? refspec->src : refspec->dst;
882

883
		if (!refspec->dst)
884
			continue;
885
		if (refspec->pattern) {
886
			if (match_name_with_pattern(key, needle, value, result)) {
887
				query->force = refspec->force;
888 889
				return 0;
			}
890 891
		} else if (!strcmp(needle, key)) {
			*result = xstrdup(value);
892
			query->force = refspec->force;
893
			return 0;
894 895 896 897 898
		}
	}
	return -1;
}

899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917
char *apply_refspecs(struct refspec *refspecs, int nr_refspec,
		     const char *name)
{
	struct refspec query;

	memset(&query, 0, sizeof(struct refspec));
	query.src = (char *)name;

	if (query_refspecs(refspecs, nr_refspec, &query))
		return NULL;

	return query.dst;
}

int remote_find_tracking(struct remote *remote, struct refspec *refspec)
{
	return query_refspecs(remote->fetch, remote->fetch_refspec_nr, refspec);
}

R
René Scharfe 已提交
918 919 920 921
static struct ref *alloc_ref_with_prefix(const char *prefix, size_t prefixlen,
		const char *name)
{
	size_t len = strlen(name);
922
	struct ref *ref = xcalloc(1, st_add4(sizeof(*ref), prefixlen, len, 1));
R
René Scharfe 已提交
923 924 925 926 927
	memcpy(ref->name, prefix, prefixlen);
	memcpy(ref->name + prefixlen, name, len);
	return ref;
}

928
struct ref *alloc_ref(const char *name)
929
{
930
	return alloc_ref_with_prefix("", 0, name);
931 932
}

J
Jeff King 已提交
933
struct ref *copy_ref(const struct ref *ref)
934
{
935 936 937 938
	struct ref *cpy;
	size_t len;
	if (!ref)
		return NULL;
939 940 941
	len = st_add3(sizeof(struct ref), strlen(ref->name), 1);
	cpy = xmalloc(len);
	memcpy(cpy, ref, len);
942
	cpy->next = NULL;
943 944
	cpy->symref = xstrdup_or_null(ref->symref);
	cpy->remote_status = xstrdup_or_null(ref->remote_status);
945 946
	cpy->peer_ref = copy_ref(ref->peer_ref);
	return cpy;
947 948
}

949 950 951 952 953 954 955 956 957 958 959 960
struct ref *copy_ref_list(const struct ref *ref)
{
	struct ref *ret = NULL;
	struct ref **tail = &ret;
	while (ref) {
		*tail = copy_ref(ref);
		ref = ref->next;
		tail = &((*tail)->next);
	}
	return ret;
}

961
static void free_ref(struct ref *ref)
962 963 964
{
	if (!ref)
		return;
965
	free_ref(ref->peer_ref);
966 967 968 969 970
	free(ref->remote_status);
	free(ref->symref);
	free(ref);
}

971 972 973 974 975
void free_refs(struct ref *ref)
{
	struct ref *next;
	while (ref) {
		next = ref->next;
976
		free_ref(ref);
977 978 979 980
		ref = next;
	}
}

981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001
int ref_compare_name(const void *va, const void *vb)
{
	const struct ref *a = va, *b = vb;
	return strcmp(a->name, b->name);
}

static void *ref_list_get_next(const void *a)
{
	return ((const struct ref *)a)->next;
}

static void ref_list_set_next(void *a, void *next)
{
	((struct ref *)a)->next = next;
}

void sort_ref_list(struct ref **l, int (*cmp)(const void *, const void *))
{
	*l = llist_mergesort(*l, ref_list_get_next, ref_list_set_next, cmp);
}

1002 1003 1004
int count_refspec_match(const char *pattern,
			struct ref *refs,
			struct ref **matched_ref)
1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
{
	int patlen = strlen(pattern);
	struct ref *matched_weak = NULL;
	struct ref *matched = NULL;
	int weak_match = 0;
	int match = 0;

	for (weak_match = match = 0; refs; refs = refs->next) {
		char *name = refs->name;
		int namelen = strlen(name);

1016
		if (!refname_match(pattern, name))
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
			continue;

		/* A match is "weak" if it is with refs outside
		 * heads or tags, and did not specify the pattern
		 * in full (e.g. "refs/remotes/origin/master") or at
		 * least from the toplevel (e.g. "remotes/origin/master");
		 * otherwise "git push $URL master" would result in
		 * ambiguity between remotes/origin/master and heads/master
		 * at the remote site.
		 */
		if (namelen != patlen &&
		    patlen != namelen - 5 &&
1029 1030
		    !starts_with(name, "refs/heads/") &&
		    !starts_with(name, "refs/tags/")) {
1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046
			/* We want to catch the case where only weak
			 * matches are found and there are multiple
			 * matches, and where more than one strong
			 * matches are found, as ambiguous.  One
			 * strong match with zero or more weak matches
			 * are acceptable as a unique match.
			 */
			matched_weak = refs;
			weak_match++;
		}
		else {
			matched = refs;
			match++;
		}
	}
	if (!matched) {
1047 1048
		if (matched_ref)
			*matched_ref = matched_weak;
1049 1050 1051
		return weak_match;
	}
	else {
1052 1053
		if (matched_ref)
			*matched_ref = matched;
1054 1055 1056 1057
		return match;
	}
}

1058
static void tail_link_ref(struct ref *ref, struct ref ***tail)
1059 1060
{
	**tail = ref;
1061 1062
	while (ref->next)
		ref = ref->next;
1063 1064 1065
	*tail = &ref->next;
}

1066 1067 1068
static struct ref *alloc_delete_ref(void)
{
	struct ref *ref = alloc_ref("(delete)");
1069
	oidclr(&ref->new_oid);
1070 1071 1072
	return ref;
}

1073 1074
static int try_explicit_object_name(const char *name,
				    struct ref **match)
1075
{
1076
	struct object_id oid;
1077

1078 1079 1080 1081 1082 1083
	if (!*name) {
		if (match)
			*match = alloc_delete_ref();
		return 0;
	}

1084
	if (get_sha1(name, oid.hash))
1085 1086 1087 1088
		return -1;

	if (match) {
		*match = alloc_ref(name);
1089
		oidcpy(&(*match)->new_oid, &oid);
1090 1091
	}
	return 0;
1092 1093
}

1094
static struct ref *make_linked_ref(const char *name, struct ref ***tail)
1095
{
1096
	struct ref *ret = alloc_ref(name);
1097 1098
	tail_link_ref(ret, tail);
	return ret;
1099
}
1100

1101 1102 1103
static char *guess_ref(const char *name, struct ref *peer)
{
	struct strbuf buf = STRBUF_INIT;
1104
	struct object_id oid;
1105

1106
	const char *r = resolve_ref_unsafe(peer->name, RESOLVE_REF_READING,
1107
					   oid.hash, NULL);
1108 1109 1110
	if (!r)
		return NULL;

1111
	if (starts_with(r, "refs/heads/"))
1112
		strbuf_addstr(&buf, "refs/heads/");
1113
	else if (starts_with(r, "refs/tags/"))
1114 1115 1116 1117 1118 1119 1120 1121
		strbuf_addstr(&buf, "refs/tags/");
	else
		return NULL;

	strbuf_addstr(&buf, name);
	return strbuf_detach(&buf, NULL);
}

1122 1123 1124 1125 1126 1127 1128
static int match_explicit_lhs(struct ref *src,
			      struct refspec *rs,
			      struct ref **match,
			      int *allocated_match)
{
	switch (count_refspec_match(rs->src, src, match)) {
	case 1:
1129 1130
		if (allocated_match)
			*allocated_match = 0;
1131 1132 1133 1134 1135 1136
		return 0;
	case 0:
		/* The source could be in the get_sha1() format
		 * not a reference name.  :refs/other is a
		 * way to delete 'other' ref at the remote end.
		 */
1137
		if (try_explicit_object_name(rs->src, match) < 0)
1138
			return error("src refspec %s does not match any.", rs->src);
1139 1140
		if (allocated_match)
			*allocated_match = 1;
1141 1142 1143 1144 1145 1146
		return 0;
	default:
		return error("src refspec %s matches more than one.", rs->src);
	}
}

1147 1148
static int match_explicit(struct ref *src, struct ref *dst,
			  struct ref ***dst_tail,
1149
			  struct refspec *rs)
1150
{
1151
	struct ref *matched_src, *matched_dst;
1152
	int allocated_src;
1153

1154
	const char *dst_value = rs->dst;
1155
	char *dst_guess;
1156

1157
	if (rs->pattern || rs->matching)
1158
		return 0;
1159

1160
	matched_src = matched_dst = NULL;
1161 1162
	if (match_explicit_lhs(src, rs, &matched_src, &allocated_src) < 0)
		return -1;
1163

1164
	if (!dst_value) {
1165
		struct object_id oid;
1166 1167
		int flag;

1168 1169
		dst_value = resolve_ref_unsafe(matched_src->name,
					       RESOLVE_REF_READING,
1170
					       oid.hash, &flag);
1171 1172
		if (!dst_value ||
		    ((flag & REF_ISSYMREF) &&
1173
		     !starts_with(dst_value, "refs/heads/")))
1174 1175
			die("%s cannot be resolved to branch.",
			    matched_src->name);
1176
	}
1177

1178 1179 1180 1181
	switch (count_refspec_match(dst_value, dst, &matched_dst)) {
	case 1:
		break;
	case 0:
1182
		if (starts_with(dst_value, "refs/"))
1183
			matched_dst = make_linked_ref(dst_value, dst_tail);
1184
		else if (is_null_oid(&matched_src->new_oid))
1185 1186
			error("unable to delete '%s': remote ref does not exist",
			      dst_value);
1187
		else if ((dst_guess = guess_ref(dst_value, matched_src))) {
1188
			matched_dst = make_linked_ref(dst_guess, dst_tail);
1189 1190
			free(dst_guess);
		} else
1191 1192 1193 1194 1195 1196
			error("unable to push to unqualified destination: %s\n"
			      "The destination refspec neither matches an "
			      "existing ref on the remote nor\n"
			      "begins with refs/, and we are unable to "
			      "guess a prefix based on the source ref.",
			      dst_value);
1197 1198
		break;
	default:
1199
		matched_dst = NULL;
1200 1201 1202 1203
		error("dst refspec %s matches more than one.",
		      dst_value);
		break;
	}
1204 1205 1206 1207
	if (!matched_dst)
		return -1;
	if (matched_dst->peer_ref)
		return error("dst ref %s receives from more than one src.",
1208 1209
		      matched_dst->name);
	else {
1210 1211 1212
		matched_dst->peer_ref = allocated_src ?
					matched_src :
					copy_ref(matched_src);
1213
		matched_dst->force = rs->force;
1214
	}
1215
	return 0;
1216 1217 1218 1219 1220 1221 1222 1223
}

static int match_explicit_refs(struct ref *src, struct ref *dst,
			       struct ref ***dst_tail, struct refspec *rs,
			       int rs_nr)
{
	int i, errs;
	for (i = errs = 0; i < rs_nr; i++)
1224 1225
		errs += match_explicit(src, dst, dst_tail, &rs[i]);
	return errs;
1226 1227
}

1228
static char *get_ref_match(const struct refspec *rs, int rs_nr, const struct ref *ref,
F
Felipe Contreras 已提交
1229
		int send_mirror, int direction, const struct refspec **ret_pat)
1230
{
1231 1232
	const struct refspec *pat;
	char *name;
1233
	int i;
1234
	int matching_refs = -1;
1235
	for (i = 0; i < rs_nr; i++) {
1236 1237 1238 1239 1240 1241
		if (rs[i].matching &&
		    (matching_refs == -1 || rs[i].force)) {
			matching_refs = i;
			continue;
		}

1242 1243
		if (rs[i].pattern) {
			const char *dst_side = rs[i].dst ? rs[i].dst : rs[i].src;
F
Felipe Contreras 已提交
1244 1245 1246 1247 1248 1249
			int match;
			if (direction == FROM_SRC)
				match = match_name_with_pattern(rs[i].src, ref->name, dst_side, &name);
			else
				match = match_name_with_pattern(dst_side, ref->name, rs[i].src, &name);
			if (match) {
1250 1251 1252 1253
				matching_refs = i;
				break;
			}
		}
1254
	}
1255
	if (matching_refs == -1)
1256
		return NULL;
1257 1258 1259 1260 1261 1262 1263 1264

	pat = rs + matching_refs;
	if (pat->matching) {
		/*
		 * "matching refs"; traditionally we pushed everything
		 * including refs outside refs/heads/ hierarchy, but
		 * that does not make much sense these days.
		 */
1265
		if (!send_mirror && !starts_with(ref->name, "refs/heads/"))
1266 1267 1268 1269 1270 1271
			return NULL;
		name = xstrdup(ref->name);
	}
	if (ret_pat)
		*ret_pat = pat;
	return name;
1272 1273
}

1274 1275 1276 1277 1278 1279 1280 1281
static struct ref **tail_ref(struct ref **head)
{
	struct ref **tail = head;
	while (*tail)
		tail = &((*tail)->next);
	return tail;
}

J
Junio C Hamano 已提交
1282 1283 1284 1285 1286
struct tips {
	struct commit **tip;
	int nr, alloc;
};

1287
static void add_to_tips(struct tips *tips, const struct object_id *oid)
J
Junio C Hamano 已提交
1288 1289 1290
{
	struct commit *commit;

1291
	if (is_null_oid(oid))
J
Junio C Hamano 已提交
1292
		return;
1293
	commit = lookup_commit_reference_gently(oid, 1);
J
Junio C Hamano 已提交
1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315
	if (!commit || (commit->object.flags & TMP_MARK))
		return;
	commit->object.flags |= TMP_MARK;
	ALLOC_GROW(tips->tip, tips->nr + 1, tips->alloc);
	tips->tip[tips->nr++] = commit;
}

static void add_missing_tags(struct ref *src, struct ref **dst, struct ref ***dst_tail)
{
	struct string_list dst_tag = STRING_LIST_INIT_NODUP;
	struct string_list src_tag = STRING_LIST_INIT_NODUP;
	struct string_list_item *item;
	struct ref *ref;
	struct tips sent_tips;

	/*
	 * Collect everything we know they would have at the end of
	 * this push, and collect all tags they have.
	 */
	memset(&sent_tips, 0, sizeof(sent_tips));
	for (ref = *dst; ref; ref = ref->next) {
		if (ref->peer_ref &&
1316
		    !is_null_oid(&ref->peer_ref->new_oid))
1317
			add_to_tips(&sent_tips, &ref->peer_ref->new_oid);
J
Junio C Hamano 已提交
1318
		else
1319
			add_to_tips(&sent_tips, &ref->old_oid);
1320
		if (starts_with(ref->name, "refs/tags/"))
J
Junio C Hamano 已提交
1321 1322 1323 1324
			string_list_append(&dst_tag, ref->name);
	}
	clear_commit_marks_many(sent_tips.nr, sent_tips.tip, TMP_MARK);

1325
	string_list_sort(&dst_tag);
J
Junio C Hamano 已提交
1326 1327 1328

	/* Collect tags they do not have. */
	for (ref = src; ref; ref = ref->next) {
1329
		if (!starts_with(ref->name, "refs/tags/"))
J
Junio C Hamano 已提交
1330 1331 1332
			continue; /* not a tag */
		if (string_list_has_string(&dst_tag, ref->name))
			continue; /* they already have it */
1333
		if (sha1_object_info(ref->new_oid.hash, NULL) != OBJ_TAG)
J
Junio C Hamano 已提交
1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352
			continue; /* be conservative */
		item = string_list_append(&src_tag, ref->name);
		item->util = ref;
	}
	string_list_clear(&dst_tag, 0);

	/*
	 * At this point, src_tag lists tags that are missing from
	 * dst, and sent_tips lists the tips we are pushing or those
	 * that we know they already have. An element in the src_tag
	 * that is an ancestor of any of the sent_tips needs to be
	 * sent to the other side.
	 */
	if (sent_tips.nr) {
		for_each_string_list_item(item, &src_tag) {
			struct ref *ref = item->util;
			struct ref *dst_ref;
			struct commit *commit;

1353
			if (is_null_oid(&ref->new_oid))
J
Junio C Hamano 已提交
1354
				continue;
1355 1356
			commit = lookup_commit_reference_gently(&ref->new_oid,
								1);
J
Junio C Hamano 已提交
1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369
			if (!commit)
				/* not pushing a commit, which is not an error */
				continue;

			/*
			 * Is this tag, which they do not have, reachable from
			 * any of the commits we are sending?
			 */
			if (!in_merge_bases_many(commit, sent_tips.nr, sent_tips.tip))
				continue;

			/* Add it in */
			dst_ref = make_linked_ref(ref->name, dst_tail);
1370
			oidcpy(&dst_ref->new_oid, &ref->new_oid);
J
Junio C Hamano 已提交
1371 1372 1373 1374 1375 1376 1377
			dst_ref->peer_ref = copy_ref(ref);
		}
	}
	string_list_clear(&src_tag, 0);
	free(sent_tips.tip);
}

1378 1379 1380 1381 1382 1383 1384 1385
struct ref *find_ref_by_name(const struct ref *list, const char *name)
{
	for ( ; list; list = list->next)
		if (!strcmp(list->name, name))
			return (struct ref *)list;
	return NULL;
}

1386 1387 1388 1389 1390
static void prepare_ref_index(struct string_list *ref_index, struct ref *ref)
{
	for ( ; ref; ref = ref->next)
		string_list_append_nodup(ref_index, ref->name)->util = ref;

1391
	string_list_sort(ref_index);
1392 1393
}

1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418
/*
 * Given only the set of local refs, sanity-check the set of push
 * refspecs. We can't catch all errors that match_push_refs would,
 * but we can catch some errors early before even talking to the
 * remote side.
 */
int check_push_refs(struct ref *src, int nr_refspec, const char **refspec_names)
{
	struct refspec *refspec = parse_push_refspec(nr_refspec, refspec_names);
	int ret = 0;
	int i;

	for (i = 0; i < nr_refspec; i++) {
		struct refspec *rs = refspec + i;

		if (rs->pattern || rs->matching)
			continue;

		ret |= match_explicit_lhs(src, rs, NULL, NULL);
	}

	free_refspec(nr_refspec, refspec);
	return ret;
}

1419
/*
1420 1421 1422 1423 1424 1425
 * Given the set of refs the local repository has, the set of refs the
 * remote repository has, and the refspec used for push, determine
 * what remote refs we will update and with what value by setting
 * peer_ref (which object is being pushed) and force (if the push is
 * forced) in elements of "dst". The function may add new elements to
 * dst (e.g. pushing to a new branch, done in match_explicit_refs).
1426
 */
1427 1428
int match_push_refs(struct ref *src, struct ref **dst,
		    int nr_refspec, const char **refspec, int flags)
1429
{
1430
	struct refspec *rs;
A
Andy Whitcroft 已提交
1431 1432
	int send_all = flags & MATCH_REFS_ALL;
	int send_mirror = flags & MATCH_REFS_MIRROR;
F
Felipe Contreras 已提交
1433
	int send_prune = flags & MATCH_REFS_PRUNE;
1434
	int errs;
1435
	static const char *default_refspec[] = { ":", NULL };
1436
	struct ref *ref, **dst_tail = tail_ref(dst);
1437
	struct string_list dst_ref_index = STRING_LIST_INIT_NODUP;
1438

1439 1440 1441 1442 1443
	if (!nr_refspec) {
		nr_refspec = 1;
		refspec = default_refspec;
	}
	rs = parse_push_refspec(nr_refspec, (const char **) refspec);
1444
	errs = match_explicit_refs(src, *dst, &dst_tail, rs, nr_refspec);
1445 1446

	/* pick the remainder */
1447
	for (ref = src; ref; ref = ref->next) {
1448
		struct string_list_item *dst_item;
1449
		struct ref *dst_peer;
1450 1451
		const struct refspec *pat = NULL;
		char *dst_name;
1452

F
Felipe Contreras 已提交
1453
		dst_name = get_ref_match(rs, nr_refspec, ref, send_mirror, FROM_SRC, &pat);
1454
		if (!dst_name)
1455 1456
			continue;

1457 1458 1459 1460 1461
		if (!dst_ref_index.nr)
			prepare_ref_index(&dst_ref_index, *dst);

		dst_item = string_list_lookup(&dst_ref_index, dst_name);
		dst_peer = dst_item ? dst_item->util : NULL;
1462 1463 1464 1465 1466 1467 1468 1469 1470
		if (dst_peer) {
			if (dst_peer->peer_ref)
				/* We're already sending something to this ref. */
				goto free_name;
		} else {
			if (pat->matching && !(send_all || send_mirror))
				/*
				 * Remote doesn't have it, and we have no
				 * explicit pattern, and we don't have
J
Justin Lebar 已提交
1471
				 * --all or --mirror.
1472 1473
				 */
				goto free_name;
A
Andy Whitcroft 已提交
1474

1475
			/* Create a new one and link it */
1476
			dst_peer = make_linked_ref(dst_name, &dst_tail);
1477
			oidcpy(&dst_peer->new_oid, &ref->new_oid);
1478 1479
			string_list_insert(&dst_ref_index,
				dst_peer->name)->util = dst_peer;
1480
		}
1481
		dst_peer->peer_ref = copy_ref(ref);
1482
		dst_peer->force = pat->force;
1483 1484
	free_name:
		free(dst_name);
1485
	}
J
Junio C Hamano 已提交
1486

1487 1488
	string_list_clear(&dst_ref_index, 0);

J
Junio C Hamano 已提交
1489 1490 1491
	if (flags & MATCH_REFS_FOLLOW_TAGS)
		add_missing_tags(src, dst, &dst_tail);

F
Felipe Contreras 已提交
1492
	if (send_prune) {
1493
		struct string_list src_ref_index = STRING_LIST_INIT_NODUP;
F
Felipe Contreras 已提交
1494 1495 1496 1497 1498 1499 1500 1501 1502 1503
		/* check for missing refs on the remote */
		for (ref = *dst; ref; ref = ref->next) {
			char *src_name;

			if (ref->peer_ref)
				/* We're already sending something to this ref. */
				continue;

			src_name = get_ref_match(rs, nr_refspec, ref, send_mirror, FROM_DST, NULL);
			if (src_name) {
1504 1505 1506 1507
				if (!src_ref_index.nr)
					prepare_ref_index(&src_ref_index, src);
				if (!string_list_has_string(&src_ref_index,
					    src_name))
F
Felipe Contreras 已提交
1508 1509 1510 1511
					ref->peer_ref = alloc_delete_ref();
				free(src_name);
			}
		}
1512
		string_list_clear(&src_ref_index, 0);
F
Felipe Contreras 已提交
1513
	}
1514 1515
	if (errs)
		return -1;
1516 1517
	return 0;
}
1518

1519
void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
1520
			     int force_update)
1521 1522 1523 1524
{
	struct ref *ref;

	for (ref = remote_refs; ref; ref = ref->next) {
1525
		int force_ref_update = ref->force || force_update;
1526
		int reject_reason = 0;
1527

1528
		if (ref->peer_ref)
1529
			oidcpy(&ref->new_oid, &ref->peer_ref->new_oid);
1530 1531 1532
		else if (!send_mirror)
			continue;

1533
		ref->deletion = is_null_oid(&ref->new_oid);
1534
		if (!ref->deletion &&
1535
			!oidcmp(&ref->old_oid, &ref->new_oid)) {
1536 1537 1538 1539
			ref->status = REF_STATUS_UPTODATE;
			continue;
		}

C
Chris Rorvick 已提交
1540
		/*
1541 1542
		 * If the remote ref has moved and is now different
		 * from what we expect, reject any push.
1543 1544 1545 1546 1547 1548 1549
		 *
		 * It also is an error if the user told us to check
		 * with the remote-tracking branch to find the value
		 * to expect, but we did not have such a tracking
		 * branch.
		 */
		if (ref->expect_old_sha1) {
1550
			if (oidcmp(&ref->old_oid, &ref->old_oid_expect))
1551
				reject_reason = REF_STATUS_REJECT_STALE;
1552 1553 1554
			else
				/* If the ref isn't stale then force the update. */
				force_ref_update = 1;
1555 1556 1557
		}

		/*
1558 1559
		 * If the update isn't already rejected then check
		 * the usual "must fast-forward" rules.
1560
		 *
1561 1562 1563
		 * Decide whether an individual refspec A:B can be
		 * pushed.  The push will succeed if any of the
		 * following are true:
1564
		 *
C
Chris Rorvick 已提交
1565
		 * (1) the remote reference B does not exist
1566
		 *
C
Chris Rorvick 已提交
1567 1568
		 * (2) the remote reference B is being removed (i.e.,
		 *     pushing :B where no source is specified)
1569
		 *
1570 1571 1572
		 * (3) the destination is not under refs/tags/, and
		 *     if the old and new value is a commit, the new
		 *     is a descendant of the old.
1573
		 *
C
Chris Rorvick 已提交
1574 1575
		 * (4) it is forced using the +A:B notation, or by
		 *     passing the --force argument
1576 1577
		 */

1578
		if (!reject_reason && !ref->deletion && !is_null_oid(&ref->old_oid)) {
1579
			if (starts_with(ref->name, "refs/tags/"))
1580
				reject_reason = REF_STATUS_REJECT_ALREADY_EXISTS;
1581
			else if (!has_object_file(&ref->old_oid))
1582
				reject_reason = REF_STATUS_REJECT_FETCH_FIRST;
1583 1584
			else if (!lookup_commit_reference_gently(&ref->old_oid, 1) ||
				 !lookup_commit_reference_gently(&ref->new_oid, 1))
1585
				reject_reason = REF_STATUS_REJECT_NEEDS_FORCE;
1586
			else if (!ref_newer(&ref->new_oid, &ref->old_oid))
1587
				reject_reason = REF_STATUS_REJECT_NONFASTFORWARD;
1588
		}
1589 1590 1591 1592 1593 1594 1595 1596 1597

		/*
		 * "--force" will defeat any rejection implemented
		 * by the rules above.
		 */
		if (!force_ref_update)
			ref->status = reject_reason;
		else if (reject_reason)
			ref->forced_update = 1;
1598 1599 1600
	}
}

1601 1602
static void set_merge(struct branch *ret)
{
1603
	struct remote *remote;
1604
	char *ref;
1605
	struct object_id oid;
1606 1607
	int i;

1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620
	if (!ret)
		return; /* no branch */
	if (ret->merge)
		return; /* already run */
	if (!ret->remote_name || !ret->merge_nr) {
		/*
		 * no merge config; let's make sure we don't confuse callers
		 * with a non-zero merge_nr but a NULL merge
		 */
		ret->merge_nr = 0;
		return;
	}

1621 1622
	remote = remote_get(ret->remote_name);

1623 1624 1625 1626
	ret->merge = xcalloc(ret->merge_nr, sizeof(*ret->merge));
	for (i = 0; i < ret->merge_nr; i++) {
		ret->merge[i] = xcalloc(1, sizeof(**ret->merge));
		ret->merge[i]->src = xstrdup(ret->merge_name[i]);
1627
		if (!remote_find_tracking(remote, ret->merge[i]) ||
1628 1629 1630
		    strcmp(ret->remote_name, "."))
			continue;
		if (dwim_ref(ret->merge_name[i], strlen(ret->merge_name[i]),
1631
			     oid.hash, &ref) == 1)
1632 1633 1634 1635 1636 1637
			ret->merge[i]->dst = ref;
		else
			ret->merge[i]->dst = xstrdup(ret->merge_name[i]);
	}
}

1638 1639 1640 1641 1642 1643 1644 1645 1646
struct branch *branch_get(const char *name)
{
	struct branch *ret;

	read_config();
	if (!name || !*name || !strcmp(name, "HEAD"))
		ret = current_branch;
	else
		ret = make_branch(name, 0);
1647
	set_merge(ret);
1648 1649 1650 1651 1652 1653 1654 1655
	return ret;
}

int branch_has_merge_config(struct branch *branch)
{
	return branch && !!branch->merge;
}

1656 1657 1658
int branch_merge_matches(struct branch *branch,
		                 int i,
		                 const char *refname)
1659
{
1660
	if (!branch || i < 0 || i >= branch->merge_nr)
1661
		return 0;
1662
	return refname_match(branch->merge[i]->src, refname);
1663
}
1664

1665
__attribute__((format (printf,2,3)))
1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680
static const char *error_buf(struct strbuf *err, const char *fmt, ...)
{
	if (err) {
		va_list ap;
		va_start(ap, fmt);
		strbuf_vaddf(err, fmt, ap);
		va_end(ap);
	}
	return NULL;
}

const char *branch_get_upstream(struct branch *branch, struct strbuf *err)
{
	if (!branch)
		return error_buf(err, _("HEAD does not point to a branch"));
1681 1682 1683 1684 1685 1686 1687

	if (!branch->merge || !branch->merge[0]) {
		/*
		 * no merge config; is it because the user didn't define any,
		 * or because it is not a real branch, and get_branch
		 * auto-vivified it?
		 */
1688 1689 1690
		if (!ref_exists(branch->refname))
			return error_buf(err, _("no such branch: '%s'"),
					 branch->name);
1691 1692 1693 1694 1695 1696
		return error_buf(err,
				 _("no upstream configured for branch '%s'"),
				 branch->name);
	}

	if (!branch->merge[0]->dst)
1697 1698 1699 1700
		return error_buf(err,
				 _("upstream branch '%s' not stored as a remote-tracking branch"),
				 branch->merge[0]->src);

1701 1702 1703
	return branch->merge[0]->dst;
}

J
Jeff King 已提交
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
static const char *tracking_for_push_dest(struct remote *remote,
					  const char *refname,
					  struct strbuf *err)
{
	char *ret;

	ret = apply_refspecs(remote->fetch, remote->fetch_refspec_nr, refname);
	if (!ret)
		return error_buf(err,
				 _("push destination '%s' on remote '%s' has no local tracking branch"),
				 refname, remote->name);
	return ret;
}

static const char *branch_get_push_1(struct branch *branch, struct strbuf *err)
{
	struct remote *remote;

	remote = remote_get(pushremote_for_branch(branch, NULL));
	if (!remote)
		return error_buf(err,
				 _("branch '%s' has no remote for pushing"),
				 branch->name);

	if (remote->push_refspec_nr) {
		char *dst;
		const char *ret;

		dst = apply_refspecs(remote->push, remote->push_refspec_nr,
				     branch->refname);
		if (!dst)
			return error_buf(err,
					 _("push refspecs for '%s' do not include '%s'"),
					 remote->name, branch->name);

		ret = tracking_for_push_dest(remote, dst, err);
		free(dst);
		return ret;
	}

	if (remote->mirror)
		return tracking_for_push_dest(remote, branch->refname, err);

	switch (push_default) {
	case PUSH_DEFAULT_NOTHING:
		return error_buf(err, _("push has no destination (push.default is 'nothing')"));

	case PUSH_DEFAULT_MATCHING:
	case PUSH_DEFAULT_CURRENT:
		return tracking_for_push_dest(remote, branch->refname, err);

	case PUSH_DEFAULT_UPSTREAM:
		return branch_get_upstream(branch, err);

	case PUSH_DEFAULT_UNSPECIFIED:
	case PUSH_DEFAULT_SIMPLE:
		{
			const char *up, *cur;

			up = branch_get_upstream(branch, err);
			if (!up)
				return NULL;
			cur = tracking_for_push_dest(remote, branch->refname, err);
			if (!cur)
				return NULL;
			if (strcmp(cur, up))
				return error_buf(err,
						 _("cannot resolve 'simple' push to a single destination"));
			return cur;
		}
	}

	die("BUG: unhandled push situation");
}

const char *branch_get_push(struct branch *branch, struct strbuf *err)
{
1781 1782 1783
	if (!branch)
		return error_buf(err, _("HEAD does not point to a branch"));

J
Jeff King 已提交
1784 1785 1786 1787 1788
	if (!branch->push_tracking_ref)
		branch->push_tracking_ref = branch_get_push_1(branch, err);
	return branch->push_tracking_ref;
}

1789 1790
static int ignore_symref_update(const char *refname)
{
1791
	struct object_id oid;
1792 1793
	int flag;

1794
	if (!resolve_ref_unsafe(refname, 0, oid.hash, &flag))
1795 1796 1797 1798
		return 0; /* non-existing refs are OK */
	return (flag & REF_ISSYMREF);
}

1799 1800 1801 1802 1803 1804 1805
/*
 * Create and return a list of (struct ref) consisting of copies of
 * each remote_ref that matches refspec.  refspec must be a pattern.
 * Fill in the copies' peer_ref to describe the local tracking refs to
 * which they map.  Omit any references that would map to an existing
 * local symbolic ref.
 */
1806
static struct ref *get_expanded_map(const struct ref *remote_refs,
1807 1808
				    const struct refspec *refspec)
{
1809
	const struct ref *ref;
1810 1811 1812 1813
	struct ref *ret = NULL;
	struct ref **tail = &ret;

	for (ref = remote_refs; ref; ref = ref->next) {
1814 1815
		char *expn_name = NULL;

1816 1817
		if (strchr(ref->name, '^'))
			continue; /* a dereference item */
1818
		if (match_name_with_pattern(refspec->src, ref->name,
1819 1820
					    refspec->dst, &expn_name) &&
		    !ignore_symref_update(expn_name)) {
1821 1822
			struct ref *cpy = copy_ref(ref);

1823
			cpy->peer_ref = alloc_ref(expn_name);
1824 1825 1826 1827 1828
			if (refspec->force)
				cpy->peer_ref->force = 1;
			*tail = cpy;
			tail = &cpy->next;
		}
1829
		free(expn_name);
1830 1831 1832 1833 1834
	}

	return ret;
}

1835
static const struct ref *find_ref_by_name_abbrev(const struct ref *refs, const char *name)
1836
{
1837
	const struct ref *ref;
1838
	for (ref = refs; ref; ref = ref->next) {
1839
		if (refname_match(name, ref->name))
1840 1841 1842 1843 1844
			return ref;
	}
	return NULL;
}

1845
struct ref *get_remote_ref(const struct ref *remote_refs, const char *name)
1846
{
1847
	const struct ref *ref = find_ref_by_name_abbrev(remote_refs, name);
1848 1849

	if (!ref)
1850
		return NULL;
1851 1852 1853 1854 1855 1856

	return copy_ref(ref);
}

static struct ref *get_local_ref(const char *name)
{
1857
	if (!name || name[0] == '\0')
1858 1859
		return NULL;

1860
	if (starts_with(name, "refs/"))
1861
		return alloc_ref(name);
1862

1863 1864 1865
	if (starts_with(name, "heads/") ||
	    starts_with(name, "tags/") ||
	    starts_with(name, "remotes/"))
R
René Scharfe 已提交
1866
		return alloc_ref_with_prefix("refs/", 5, name);
1867

R
René Scharfe 已提交
1868
	return alloc_ref_with_prefix("refs/heads/", 11, name);
1869 1870
}

1871
int get_fetch_map(const struct ref *remote_refs,
1872
		  const struct refspec *refspec,
1873 1874
		  struct ref ***tail,
		  int missing_ok)
1875
{
D
Daniel Barkalow 已提交
1876
	struct ref *ref_map, **rmp;
1877 1878 1879 1880

	if (refspec->pattern) {
		ref_map = get_expanded_map(remote_refs, refspec);
	} else {
1881 1882
		const char *name = refspec->src[0] ? refspec->src : "HEAD";

1883 1884
		if (refspec->exact_sha1) {
			ref_map = alloc_ref(name);
1885
			get_oid_hex(name, &ref_map->old_oid);
1886 1887 1888
		} else {
			ref_map = get_remote_ref(remote_refs, name);
		}
1889 1890 1891 1892 1893 1894 1895
		if (!missing_ok && !ref_map)
			die("Couldn't find remote ref %s", name);
		if (ref_map) {
			ref_map->peer_ref = get_local_ref(refspec->dst);
			if (ref_map->peer_ref && refspec->force)
				ref_map->peer_ref->force = 1;
		}
1896 1897
	}

D
Daniel Barkalow 已提交
1898 1899
	for (rmp = &ref_map; *rmp; ) {
		if ((*rmp)->peer_ref) {
1900
			if (!starts_with((*rmp)->peer_ref->name, "refs/") ||
1901
			    check_refname_format((*rmp)->peer_ref->name, 0)) {
D
Daniel Barkalow 已提交
1902 1903 1904 1905 1906 1907 1908 1909 1910 1911
				struct ref *ignore = *rmp;
				error("* Ignoring funny ref '%s' locally",
				      (*rmp)->peer_ref->name);
				*rmp = (*rmp)->next;
				free(ignore->peer_ref);
				free(ignore);
				continue;
			}
		}
		rmp = &((*rmp)->next);
1912 1913
	}

1914 1915
	if (ref_map)
		tail_link_ref(ref_map, tail);
1916 1917 1918

	return 0;
}
1919 1920 1921 1922 1923 1924 1925

int resolve_remote_symref(struct ref *ref, struct ref *list)
{
	if (!ref->symref)
		return 0;
	for (; list; list = list->next)
		if (!strcmp(ref->symref, list->name)) {
1926
			oidcpy(&ref->old_oid, &list->old_oid);
1927 1928 1929 1930
			return 0;
		}
	return 1;
}
1931

1932 1933 1934
static void unmark_and_free(struct commit_list *list, unsigned int mark)
{
	while (list) {
1935 1936
		struct commit *commit = pop_commit(&list);
		commit->object.flags &= ~mark;
1937 1938 1939
	}
}

1940
int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid)
1941 1942 1943 1944 1945 1946
{
	struct object *o;
	struct commit *old, *new;
	struct commit_list *list, *used;
	int found = 0;

1947 1948
	/*
	 * Both new and old must be commit-ish and new is descendant of
1949 1950
	 * old.  Otherwise we require --force.
	 */
1951
	o = deref_tag(parse_object(old_oid), NULL, 0);
1952 1953 1954 1955
	if (!o || o->type != OBJ_COMMIT)
		return 0;
	old = (struct commit *) o;

1956
	o = deref_tag(parse_object(new_oid), NULL, 0);
1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978
	if (!o || o->type != OBJ_COMMIT)
		return 0;
	new = (struct commit *) o;

	if (parse_commit(new) < 0)
		return 0;

	used = list = NULL;
	commit_list_insert(new, &list);
	while (list) {
		new = pop_most_recent_commit(&list, TMP_MARK);
		commit_list_insert(new, &used);
		if (new == old) {
			found = 1;
			break;
		}
	}
	unmark_and_free(list, TMP_MARK);
	unmark_and_free(used, TMP_MARK);
	return found;
}

1979
/*
1980
 * Compare a branch with its upstream, and save their differences (number
1981 1982 1983
 * of commits) in *num_ours and *num_theirs. The name of the upstream branch
 * (or NULL if no upstream is defined) is returned via *upstream_name, if it
 * is not itself NULL.
1984
 *
1985 1986
 * Returns -1 if num_ours and num_theirs could not be filled in (e.g., no
 * upstream defined, or ref does not exist), 0 otherwise.
1987
 */
1988 1989
int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
		       const char **upstream_name)
1990
{
1991
	struct object_id oid;
1992 1993
	struct commit *ours, *theirs;
	struct rev_info revs;
1994 1995
	const char *base;
	struct argv_array argv = ARGV_ARRAY_INIT;
1996

1997
	/* Cannot stat unless we are marked to build on top of somebody else. */
1998
	base = branch_get_upstream(branch, NULL);
1999 2000
	if (upstream_name)
		*upstream_name = base;
2001
	if (!base)
2002
		return -1;
2003

2004
	/* Cannot stat if what we used to build on no longer exists */
2005
	if (read_ref(base, oid.hash))
2006
		return -1;
2007
	theirs = lookup_commit_reference(&oid);
2008
	if (!theirs)
2009
		return -1;
2010

2011
	if (read_ref(branch->refname, oid.hash))
2012
		return -1;
2013
	ours = lookup_commit_reference(&oid);
2014
	if (!ours)
2015
		return -1;
2016 2017

	/* are we the same? */
2018 2019
	if (theirs == ours) {
		*num_theirs = *num_ours = 0;
2020
		return 0;
2021
	}
2022

2023
	/* Run "rev-list --left-right ours...theirs" internally... */
2024 2025 2026
	argv_array_push(&argv, ""); /* ignored */
	argv_array_push(&argv, "--left-right");
	argv_array_pushf(&argv, "%s...%s",
2027 2028
			 oid_to_hex(&ours->object.oid),
			 oid_to_hex(&theirs->object.oid));
2029
	argv_array_push(&argv, "--");
2030 2031

	init_revisions(&revs, NULL);
2032
	setup_revisions(argv.argc, argv.argv, &revs, NULL);
2033 2034
	if (prepare_revision_walk(&revs))
		die("revision walk setup failed");
2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047

	/* ... and count the commits on each side. */
	*num_ours = 0;
	*num_theirs = 0;
	while (1) {
		struct commit *c = get_revision(&revs);
		if (!c)
			break;
		if (c->object.flags & SYMMETRIC_LEFT)
			(*num_ours)++;
		else
			(*num_theirs)++;
	}
2048 2049 2050 2051

	/* clear object flags smudged by the above traversal */
	clear_commit_marks(ours, ALL_REV_FLAGS);
	clear_commit_marks(theirs, ALL_REV_FLAGS);
2052 2053

	argv_array_clear(&argv);
2054
	return 0;
2055 2056 2057 2058 2059 2060 2061
}

/*
 * Return true when there is anything to report, otherwise false.
 */
int format_tracking_info(struct branch *branch, struct strbuf *sb)
{
2062
	int ours, theirs;
2063
	const char *full_base;
2064
	char *base;
2065
	int upstream_is_gone = 0;
2066

2067 2068 2069
	if (stat_tracking_info(branch, &ours, &theirs, &full_base) < 0) {
		if (!full_base)
			return 0;
2070 2071
		upstream_is_gone = 1;
	}
2072

2073
	base = shorten_unambiguous_ref(full_base, 0);
2074 2075 2076 2077 2078
	if (upstream_is_gone) {
		strbuf_addf(sb,
			_("Your branch is based on '%s', but the upstream is gone.\n"),
			base);
		if (advice_status_hints)
2079
			strbuf_addstr(sb,
2080
				_("  (use \"git branch --unset-upstream\" to fixup)\n"));
2081 2082 2083 2084
	} else if (!ours && !theirs) {
		strbuf_addf(sb,
			_("Your branch is up-to-date with '%s'.\n"),
			base);
2085
	} else if (!theirs) {
2086 2087 2088
		strbuf_addf(sb,
			Q_("Your branch is ahead of '%s' by %d commit.\n",
			   "Your branch is ahead of '%s' by %d commits.\n",
2089 2090
			   ours),
			base, ours);
2091
		if (advice_status_hints)
2092
			strbuf_addstr(sb,
2093
				_("  (use \"git push\" to publish your local commits)\n"));
2094
	} else if (!ours) {
2095 2096 2097 2098 2099
		strbuf_addf(sb,
			Q_("Your branch is behind '%s' by %d commit, "
			       "and can be fast-forwarded.\n",
			   "Your branch is behind '%s' by %d commits, "
			       "and can be fast-forwarded.\n",
2100 2101
			   theirs),
			base, theirs);
2102
		if (advice_status_hints)
2103
			strbuf_addstr(sb,
2104
				_("  (use \"git pull\" to update your local branch)\n"));
2105
	} else {
2106 2107 2108 2109 2110 2111 2112
		strbuf_addf(sb,
			Q_("Your branch and '%s' have diverged,\n"
			       "and have %d and %d different commit each, "
			       "respectively.\n",
			   "Your branch and '%s' have diverged,\n"
			       "and have %d and %d different commits each, "
			       "respectively.\n",
2113
			   ours + theirs),
2114
			base, ours, theirs);
2115
		if (advice_status_hints)
2116
			strbuf_addstr(sb,
2117
				_("  (use \"git pull\" to merge the remote branch into yours)\n"));
2118
	}
2119
	free(base);
2120 2121
	return 1;
}
2122

2123 2124
static int one_local_ref(const char *refname, const struct object_id *oid,
			 int flag, void *cb_data)
2125 2126 2127 2128 2129
{
	struct ref ***local_tail = cb_data;
	struct ref *ref;

	/* we already know it starts with refs/ to get here */
2130
	if (check_refname_format(refname + 5, 0))
2131 2132
		return 0;

2133
	ref = alloc_ref(refname);
2134
	oidcpy(&ref->new_oid, oid);
2135 2136 2137 2138 2139 2140 2141
	**local_tail = ref;
	*local_tail = &ref->next;
	return 0;
}

struct ref *get_local_heads(void)
{
2142
	struct ref *local_refs = NULL, **local_tail = &local_refs;
2143

2144 2145 2146
	for_each_ref(one_local_ref, &local_tail);
	return local_refs;
}
J
Jay Soffian 已提交
2147

2148 2149 2150
struct ref *guess_remote_head(const struct ref *head,
			      const struct ref *refs,
			      int all)
J
Jay Soffian 已提交
2151 2152
{
	const struct ref *r;
2153 2154
	struct ref *list = NULL;
	struct ref **tail = &list;
J
Jay Soffian 已提交
2155

2156
	if (!head)
J
Jay Soffian 已提交
2157 2158
		return NULL;

2159 2160 2161 2162 2163 2164 2165 2166
	/*
	 * Some transports support directly peeking at
	 * where HEAD points; if that is the case, then
	 * we don't have to guess.
	 */
	if (head->symref)
		return copy_ref(find_ref_by_name(refs, head->symref));

J
Jay Soffian 已提交
2167
	/* If refs/heads/master could be right, it is. */
2168 2169
	if (!all) {
		r = find_ref_by_name(refs, "refs/heads/master");
2170
		if (r && !oidcmp(&r->old_oid, &head->old_oid))
2171 2172
			return copy_ref(r);
	}
J
Jay Soffian 已提交
2173 2174

	/* Look for another ref that points there */
2175
	for (r = refs; r; r = r->next) {
2176
		if (r != head &&
2177
		    starts_with(r->name, "refs/heads/") &&
2178
		    !oidcmp(&r->old_oid, &head->old_oid)) {
2179 2180 2181 2182 2183 2184
			*tail = copy_ref(r);
			tail = &((*tail)->next);
			if (!all)
				break;
		}
	}
J
Jay Soffian 已提交
2185

2186
	return list;
J
Jay Soffian 已提交
2187
}
2188 2189 2190 2191

struct stale_heads_info {
	struct string_list *ref_names;
	struct ref **stale_refs_tail;
2192 2193
	struct refspec *refs;
	int ref_count;
2194 2195
};

2196 2197
static int get_stale_heads_cb(const char *refname, const struct object_id *oid,
			      int flags, void *cb_data)
2198 2199
{
	struct stale_heads_info *info = cb_data;
2200
	struct string_list matches = STRING_LIST_INIT_DUP;
2201
	struct refspec query;
2202
	int i, stale = 1;
2203 2204 2205
	memset(&query, 0, sizeof(struct refspec));
	query.dst = (char *)refname;

2206 2207 2208
	query_refspecs_multiple(info->refs, info->ref_count, &query, &matches);
	if (matches.nr == 0)
		goto clean_exit; /* No matches */
2209 2210 2211 2212

	/*
	 * If we did find a suitable refspec and it's not a symref and
	 * it's not in the list of refs that currently exist in that
2213 2214 2215
	 * remote, we consider it to be stale. In order to deal with
	 * overlapping refspecs, we need to go over all of the
	 * matching refs.
2216
	 */
2217 2218 2219 2220 2221 2222 2223 2224
	if (flags & REF_ISSYMREF)
		goto clean_exit;

	for (i = 0; stale && i < matches.nr; i++)
		if (string_list_has_string(info->ref_names, matches.items[i].string))
			stale = 0;

	if (stale) {
2225
		struct ref *ref = make_linked_ref(refname, &info->stale_refs_tail);
2226
		oidcpy(&ref->new_oid, oid);
2227
	}
2228

2229 2230
clean_exit:
	string_list_clear(&matches, 0);
2231 2232 2233
	return 0;
}

2234
struct ref *get_stale_heads(struct refspec *refs, int ref_count, struct ref *fetch_map)
2235 2236
{
	struct ref *ref, *stale_refs = NULL;
2237
	struct string_list ref_names = STRING_LIST_INIT_NODUP;
2238
	struct stale_heads_info info;
2239

2240 2241
	info.ref_names = &ref_names;
	info.stale_refs_tail = &stale_refs;
2242 2243
	info.refs = refs;
	info.ref_count = ref_count;
2244
	for (ref = fetch_map; ref; ref = ref->next)
2245
		string_list_append(&ref_names, ref->name);
2246
	string_list_sort(&ref_names);
2247 2248 2249 2250
	for_each_ref(get_stale_heads_cb, &info);
	string_list_clear(&ref_names, 0);
	return stale_refs;
}
2251 2252 2253 2254

/*
 * Compare-and-swap
 */
2255
static void clear_cas_option(struct push_cas_option *cas)
2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276
{
	int i;

	for (i = 0; i < cas->nr; i++)
		free(cas->entry[i].refname);
	free(cas->entry);
	memset(cas, 0, sizeof(*cas));
}

static struct push_cas *add_cas_entry(struct push_cas_option *cas,
				      const char *refname,
				      size_t refnamelen)
{
	struct push_cas *entry;
	ALLOC_GROW(cas->entry, cas->nr + 1, cas->alloc);
	entry = &cas->entry[cas->nr++];
	memset(entry, 0, sizeof(*entry));
	entry->refname = xmemdupz(refname, refnamelen);
	return entry;
}

2277
static int parse_push_cas_option(struct push_cas_option *cas, const char *arg, int unset)
2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298
{
	const char *colon;
	struct push_cas *entry;

	if (unset) {
		/* "--no-<option>" */
		clear_cas_option(cas);
		return 0;
	}

	if (!arg) {
		/* just "--<option>" */
		cas->use_tracking_for_rest = 1;
		return 0;
	}

	/* "--<option>=refname" or "--<option>=refname:value" */
	colon = strchrnul(arg, ':');
	entry = add_cas_entry(cas, arg, colon - arg);
	if (!*colon)
		entry->use_tracking = 1;
2299 2300
	else if (!colon[1])
		hashclr(entry->expect);
2301 2302 2303 2304 2305 2306 2307 2308 2309
	else if (get_sha1(colon + 1, entry->expect))
		return error("cannot parse expected object name '%s'", colon + 1);
	return 0;
}

int parseopt_push_cas_option(const struct option *opt, const char *arg, int unset)
{
	return parse_push_cas_option(opt->value, arg, unset);
}
2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322

int is_empty_cas(const struct push_cas_option *cas)
{
	return !cas->use_tracking_for_rest && !cas->nr;
}

/*
 * Look at remote.fetch refspec and see if we have a remote
 * tracking branch for the refname there.  Fill its current
 * value in sha1[].
 * If we cannot do so, return negative to signal an error.
 */
static int remote_tracking(struct remote *remote, const char *refname,
2323
			   struct object_id *oid)
2324 2325 2326 2327 2328 2329
{
	char *dst;

	dst = apply_refspecs(remote->fetch, remote->fetch_refspec_nr, refname);
	if (!dst)
		return -1; /* no tracking ref for refname at remote */
2330
	if (read_ref(dst, oid->hash))
2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343
		return -1; /* we know what the tracking ref is but we cannot read it */
	return 0;
}

static void apply_cas(struct push_cas_option *cas,
		      struct remote *remote,
		      struct ref *ref)
{
	int i;

	/* Find an explicit --<option>=<name>[:<value>] entry */
	for (i = 0; i < cas->nr; i++) {
		struct push_cas *entry = &cas->entry[i];
2344
		if (!refname_match(entry->refname, ref->name))
2345 2346 2347
			continue;
		ref->expect_old_sha1 = 1;
		if (!entry->use_tracking)
2348
			hashcpy(ref->old_oid_expect.hash, cas->entry[i].expect);
2349
		else if (remote_tracking(remote, ref->name, &ref->old_oid_expect))
2350
			oidclr(&ref->old_oid_expect);
2351 2352 2353 2354 2355 2356 2357 2358
		return;
	}

	/* Are we using "--<option>" to cover all? */
	if (!cas->use_tracking_for_rest)
		return;

	ref->expect_old_sha1 = 1;
2359
	if (remote_tracking(remote, ref->name, &ref->old_oid_expect))
2360
		oidclr(&ref->old_oid_expect);
2361 2362 2363 2364 2365 2366 2367 2368 2369 2370
}

void apply_push_cas(struct push_cas_option *cas,
		    struct remote *remote,
		    struct ref *remote_refs)
{
	struct ref *ref;
	for (ref = remote_refs; ref; ref = ref->next)
		apply_cas(cas, remote, ref);
}