#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS

#include "git-compat-util.h"
#include "abspath.h"
#include "config.h"
#include "environment.h"
#include "gettext.h"
#include "hex.h"
#include "remote.h"
#include "url.h"
#include "urlmatch.h"
#include "refs.h"
#include "refspec.h"
#include "object-name.h"
#include "odb.h"
#include "path.h"
#include "commit.h"
#include "diff.h"
#include "revision.h"
#include "dir.h"
#include "setup.h"
#include "string-list.h"
#include "strvec.h"
#include "commit-reach.h"
#include "advice.h"
#include "connect.h"
#include "parse-options.h"
#include "transport.h"

enum map_direction { FROM_SRC, FROM_DST };

enum {
	ENABLE_ADVICE_PULL       = (1 << 0),
	ENABLE_ADVICE_PUSH       = (1 << 1),
	ENABLE_ADVICE_DIVERGENCE = (1 << 2),
};

struct counted_string {
	size_t len;
	const char *s;
};

static int valid_remote(const struct remote *remote)
{
	return !!remote->url.nr;
}

static char *alias_url(const char *url, struct rewrites *r)
{
	int i, j;
	struct counted_string *longest;
	int longest_i;

	longest = NULL;
	longest_i = -1;
	for (i = 0; i < r->rewrite_nr; i++) {
		if (!r->rewrite[i])
			continue;
		for (j = 0; j < r->rewrite[i]->instead_of_nr; j++) {
			if (starts_with(url, r->rewrite[i]->instead_of[j].s) &&
			    (!longest ||
			     longest->len < r->rewrite[i]->instead_of[j].len)) {
				longest = &(r->rewrite[i]->instead_of[j]);
				longest_i = i;
			}
		}
	}
	if (!longest)
		return NULL;

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

static void add_url(struct remote *remote, const char *url)
{
	if (*url)
		strvec_push(&remote->url, url);
	else
		strvec_clear(&remote->url);
}

static void add_pushurl(struct remote *remote, const char *pushurl)
{
	if (*pushurl)
		strvec_push(&remote->pushurl, pushurl);
	else
		strvec_clear(&remote->pushurl);
}

static void add_pushurl_alias(struct remote_state *remote_state,
			      struct remote *remote, const char *url)
{
	char *alias = alias_url(url, &remote_state->rewrites_push);
	if (alias)
		add_pushurl(remote, alias);
	free(alias);
}

static void add_url_alias(struct remote_state *remote_state,
			  struct remote *remote, const char *url)
{
	char *alias = alias_url(url, &remote_state->rewrites);
	add_url(remote, alias ? alias : url);
	add_pushurl_alias(remote_state, remote, url);
	free(alias);
}

struct remotes_hash_key {
	const char *str;
	int len;
};

static int remotes_hash_cmp(const void *cmp_data UNUSED,
			    const struct hashmap_entry *eptr,
			    const struct hashmap_entry *entry_or_key,
			    const void *keydata)
{
	const struct remote *a, *b;
	const struct remotes_hash_key *key = keydata;

	a = container_of(eptr, const struct remote, ent);
	b = container_of(entry_or_key, const struct remote, ent);

	if (key)
		return !!xstrncmpz(a->name, key->str, key->len);
	else
		return strcmp(a->name, b->name);
}

static struct remote *make_remote(struct remote_state *remote_state,
				  const char *name, int len)
{
	struct remote *ret;
	struct remotes_hash_key lookup;
	struct hashmap_entry lookup_entry, *e;

	if (!len)
		len = strlen(name);

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

	e = hashmap_get(&remote_state->remotes_hash, &lookup_entry, &lookup);
	if (e)
		return container_of(e, struct remote, ent);

	CALLOC_ARRAY(ret, 1);
	ret->prune = -1;  /* unspecified */
	ret->prune_tags = -1;  /* unspecified */
	ret->name = xstrndup(name, len);
	refspec_init_push(&ret->push, the_hash_algo);
	refspec_init_fetch(&ret->fetch, the_hash_algo);
	string_list_init_dup(&ret->server_options);
	string_list_init_dup(&ret->negotiation_restrict);
	string_list_init_dup(&ret->negotiation_include);

	ALLOC_GROW(remote_state->remotes, remote_state->remotes_nr + 1,
		   remote_state->remotes_alloc);
	remote_state->remotes[remote_state->remotes_nr++] = ret;

	hashmap_entry_init(&ret->ent, lookup_entry.hash);
	if (hashmap_put_entry(&remote_state->remotes_hash, ret, ent))
		BUG("hashmap_put overwrote entry after hashmap_get returned NULL");
	return ret;
}

static void remote_clear(struct remote *remote)
{
	free((char *)remote->name);
	free((char *)remote->foreign_vcs);

	strvec_clear(&remote->url);
	strvec_clear(&remote->pushurl);

	refspec_clear(&remote->push);
	refspec_clear(&remote->fetch);

	free((char *)remote->receivepack);
	free((char *)remote->uploadpack);
	FREE_AND_NULL(remote->http_proxy);
	FREE_AND_NULL(remote->http_proxy_authmethod);
	string_list_clear(&remote->server_options, 0);
	string_list_clear(&remote->negotiation_restrict, 0);
	string_list_clear(&remote->negotiation_include, 0);
}

static void add_merge(struct branch *branch, const char *name)
{
	struct refspec_item *merge;

	ALLOC_GROW(branch->merge, branch->merge_nr + 1,
		   branch->merge_alloc);

	merge = xcalloc(1, sizeof(*merge));
	merge->src = xstrdup(name);

	branch->merge[branch->merge_nr++] = merge;
}

struct branches_hash_key {
	const char *str;
	int len;
};

static int branches_hash_cmp(const void *cmp_data UNUSED,
			     const struct hashmap_entry *eptr,
			     const struct hashmap_entry *entry_or_key,
			     const void *keydata)
{
	const struct branch *a, *b;
	const struct branches_hash_key *key = keydata;

	a = container_of(eptr, const struct branch, ent);
	b = container_of(entry_or_key, const struct branch, ent);

	if (key)
		return !!xstrncmpz(a->name, key->str, key->len);
	else
		return strcmp(a->name, b->name);
}

static struct branch *find_branch(struct remote_state *remote_state,
				  const char *name, size_t len)
{
	struct branches_hash_key lookup;
	struct hashmap_entry lookup_entry, *e;

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

	e = hashmap_get(&remote_state->branches_hash, &lookup_entry, &lookup);
	if (e)
		return container_of(e, struct branch, ent);

	return NULL;
}

static void die_on_missing_branch(struct repository *repo,
				  struct branch *branch)
{
	/* branch == NULL is always valid because it represents detached HEAD. */
	if (branch &&
	    branch != find_branch(repo->remote_state, branch->name,
				  strlen(branch->name)))
		die("branch %s was not found in the repository", branch->name);
}

static struct branch *make_branch(struct remote_state *remote_state,
				  const char *name, size_t len)
{
	struct branch *ret;

	ret = find_branch(remote_state, name, len);
	if (ret)
		return ret;

	CALLOC_ARRAY(ret, 1);
	ret->name = xstrndup(name, len);
	ret->refname = xstrfmt("refs/heads/%s", ret->name);

	hashmap_entry_init(&ret->ent, memhash(name, len));
	if (hashmap_put_entry(&remote_state->branches_hash, ret, ent))
		BUG("hashmap_put overwrote entry after hashmap_get returned NULL");
	return ret;
}

static void merge_clear(struct branch *branch)
{
	for (int i = 0; i < branch->merge_nr; i++) {
		refspec_item_clear(branch->merge[i]);
		free(branch->merge[i]);
	}
	FREE_AND_NULL(branch->merge);
	branch->merge_nr = 0;
}

static void branch_release(struct branch *branch)
{
	free((char *)branch->name);
	free((char *)branch->refname);
	free(branch->remote_name);
	free(branch->pushremote_name);
	free(branch->push_tracking_ref);
	merge_clear(branch);
}

static struct rewrite *make_rewrite(struct rewrites *r,
				    const char *base, size_t len)
{
	struct rewrite *ret;
	int i;

	for (i = 0; i < r->rewrite_nr; i++) {
		if (len == r->rewrite[i]->baselen &&
		    !strncmp(base, r->rewrite[i]->base, len))
			return r->rewrite[i];
	}

	ALLOC_GROW(r->rewrite, r->rewrite_nr + 1, r->rewrite_alloc);
	CALLOC_ARRAY(ret, 1);
	r->rewrite[r->rewrite_nr++] = ret;
	ret->base = xstrndup(base, len);
	ret->baselen = len;
	return ret;
}

static void rewrites_release(struct rewrites *r)
{
	for (int i = 0; i < r->rewrite_nr; i++) {
		struct rewrite *rewrite = r->rewrite[i];

		free((char *)rewrite->base);
		for (int j = 0; j < rewrite->instead_of_nr; j++)
			free((char *)rewrite->instead_of[j].s);
		free(rewrite->instead_of);
		free(rewrite);
	}
	free(r->rewrite);
	memset(r, 0, sizeof(*r));
}

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);
	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++;
}

#ifndef WITH_BREAKING_CHANGES
static const char *skip_spaces(const char *s)
{
	while (isspace(*s))
		s++;
	return s;
}

static void warn_about_deprecated_remote_type(const char *type,
					      const struct remote *remote)
{
	warning(_("reading remote from \"%s/%s\", which is nominated for removal.\n"
		  "\n"
		  "If you still use the \"remotes/\" directory it is recommended to\n"
		  "migrate to config-based remotes:\n"
		  "\n"
		  "\tgit remote rename %s %s\n"
		  "\n"
		  "If you cannot, please let us know why you still need to use it by\n"
		  "sending an e-mail to <git@vger.kernel.org>."),
		type, remote->name, remote->name, remote->name);
}

static void read_remotes_file(struct repository *repo, struct remote *remote)
{
	struct strbuf buf = STRBUF_INIT;
	FILE *f = fopen_or_warn(repo_git_path_append(repo, &buf,
						     "remotes/%s", remote->name), "r");

	if (!f)
		goto out;

	warn_about_deprecated_remote_type("remotes", remote);

	remote->configured_in_repo = 1;
	remote->origin = REMOTE_REMOTES;
	while (strbuf_getline(&buf, f) != EOF) {
		const char *v;

		strbuf_rtrim(&buf);

		if (skip_prefix(buf.buf, "URL:", &v))
			add_url_alias(repo->remote_state, remote,
				      skip_spaces(v));
		else if (skip_prefix(buf.buf, "Push:", &v))
			refspec_append(&remote->push, skip_spaces(v));
		else if (skip_prefix(buf.buf, "Pull:", &v))
			refspec_append(&remote->fetch, skip_spaces(v));
	}
	fclose(f);

out:
	strbuf_release(&buf);
}

static void read_branches_file(struct repository *repo, struct remote *remote)
{
	char *frag, *to_free = NULL;
	struct strbuf buf = STRBUF_INIT;
	FILE *f = fopen_or_warn(repo_git_path_append(repo, &buf,
						     "branches/%s", remote->name), "r");

	if (!f)
		goto out;

	warn_about_deprecated_remote_type("branches", remote);

	strbuf_getline_lf(&buf, f);
	fclose(f);
	strbuf_trim(&buf);
	if (!buf.len)
		goto out;

	remote->configured_in_repo = 1;
	remote->origin = REMOTE_BRANCHES;

	/*
	 * The branches file would have URL and optionally
	 * #branch specified.  The default (or specified) branch is
	 * fetched and stored in the local branch matching the
	 * remote name.
	 */
	frag = strchr(buf.buf, '#');
	if (frag)
		*(frag++) = '\0';
	else
		frag = to_free = repo_default_branch_name(repo, 0);

	add_url_alias(repo->remote_state, remote, buf.buf);
	refspec_appendf(&remote->fetch, "refs/heads/%s:refs/heads/%s",
			frag, remote->name);

	/*
	 * Cogito compatible push: push current HEAD to remote #branch
	 * (master if missing)
	 */
	refspec_appendf(&remote->push, "HEAD:refs/heads/%s", frag);
	remote->fetch_tags = 1; /* always auto-follow */

out:
	strbuf_release(&buf);
	free(to_free);
}
#endif /* WITH_BREAKING_CHANGES */

static int handle_config(const char *key, const char *value,
			 const struct config_context *ctx, void *cb)
{
	const char *name;
	size_t namelen;
	const char *subkey;
	struct remote *remote;
	struct branch *branch;
	struct remote_state *remote_state = cb;
	const struct key_value_info *kvi = ctx->kvi;

	if (parse_config_key(key, "branch", &name, &namelen, &subkey) >= 0) {
		/* There is no subsection. */
		if (!name)
			return 0;
		/* There is a subsection, but it is empty. */
		if (!namelen)
			return -1;
		branch = make_branch(remote_state, name, namelen);
		if (!strcmp(subkey, "remote")) {
			FREE_AND_NULL(branch->remote_name);
			return git_config_string(&branch->remote_name, key, value);
		} else if (!strcmp(subkey, "pushremote")) {
			FREE_AND_NULL(branch->pushremote_name);
			return git_config_string(&branch->pushremote_name, key, value);
		} else if (!strcmp(subkey, "merge")) {
			if (!value)
				return config_error_nonbool(key);
			add_merge(branch, value);
		}
		return 0;
	}
	if (parse_config_key(key, "url", &name, &namelen, &subkey) >= 0) {
		struct rewrite *rewrite;
		if (!name)
			return 0;
		if (!strcmp(subkey, "insteadof")) {
			if (!value)
				return config_error_nonbool(key);
			rewrite = make_rewrite(&remote_state->rewrites, name,
					       namelen);
			add_instead_of(rewrite, xstrdup(value));
		} else if (!strcmp(subkey, "pushinsteadof")) {
			if (!value)
				return config_error_nonbool(key);
			rewrite = make_rewrite(&remote_state->rewrites_push,
					       name, namelen);
			add_instead_of(rewrite, xstrdup(value));
		}
	}

	if (parse_config_key(key, "remote", &name, &namelen, &subkey) < 0)
		return 0;

	/* Handle remote.* variables */
	if (!name && !strcmp(subkey, "pushdefault")) {
		FREE_AND_NULL(remote_state->pushremote_name);
		return git_config_string(&remote_state->pushremote_name, key,
					 value);
	}

	if (!name)
		return 0;
	/* Handle remote.<name>.* variables */
	if (*name == '/') {
		warning(_("config remote shorthand cannot begin with '/': %s"),
			name);
		return 0;
	}
	remote = make_remote(remote_state, name, namelen);
	remote->origin = REMOTE_CONFIG;
	if (kvi->scope == CONFIG_SCOPE_LOCAL ||
	    kvi->scope == CONFIG_SCOPE_WORKTREE)
		remote->configured_in_repo = 1;
	if (!strcmp(subkey, "mirror"))
		remote->mirror = git_config_bool(key, value);
	else if (!strcmp(subkey, "skipdefaultupdate"))
		remote->skip_default_update = git_config_bool(key, value);
	else if (!strcmp(subkey, "skipfetchall"))
		remote->skip_default_update = git_config_bool(key, value);
	else if (!strcmp(subkey, "prune"))
		remote->prune = git_config_bool(key, value);
	else if (!strcmp(subkey, "prunetags"))
		remote->prune_tags = git_config_bool(key, value);
	else if (!strcmp(subkey, "url")) {
		if (!value)
			return config_error_nonbool(key);
		add_url(remote, value);
	} else if (!strcmp(subkey, "pushurl")) {
		if (!value)
			return config_error_nonbool(key);
		add_pushurl(remote, value);
	} else if (!strcmp(subkey, "push")) {
		char *v;
		if (git_config_string(&v, key, value))
			return -1;
		refspec_append(&remote->push, v);
		free(v);
	} else if (!strcmp(subkey, "fetch")) {
		char *v;
		if (git_config_string(&v, key, value))
			return -1;
		refspec_append(&remote->fetch, v);
		free(v);
	} else if (!strcmp(subkey, "receivepack")) {
		char *v;
		if (git_config_string(&v, key, value))
			return -1;
		if (!remote->receivepack)
			remote->receivepack = v;
		else
			error(_("more than one receivepack given, using the first"));
	} else if (!strcmp(subkey, "uploadpack")) {
		char *v;
		if (git_config_string(&v, key, value))
			return -1;
		if (!remote->uploadpack)
			remote->uploadpack = v;
		else
			error(_("more than one uploadpack given, using the first"));
	} else if (!strcmp(subkey, "tagopt")) {
		if (!strcmp(value, "--no-tags"))
			remote->fetch_tags = -1;
		else if (!strcmp(value, "--tags"))
			remote->fetch_tags = 2;
	} else if (!strcmp(subkey, "proxy")) {
		FREE_AND_NULL(remote->http_proxy);
		return git_config_string(&remote->http_proxy,
					 key, value);
	} else if (!strcmp(subkey, "proxyauthmethod")) {
		FREE_AND_NULL(remote->http_proxy_authmethod);
		return git_config_string(&remote->http_proxy_authmethod,
					 key, value);
	} else if (!strcmp(subkey, "vcs")) {
		FREE_AND_NULL(remote->foreign_vcs);
		return git_config_string(&remote->foreign_vcs, key, value);
	} else if (!strcmp(subkey, "serveroption")) {
		return parse_transport_option(key, value,
					      &remote->server_options);
	} else if (!strcmp(subkey, "negotiationrestrict")) {
		return parse_transport_option(key, value,
					      &remote->negotiation_restrict);
	} else if (!strcmp(subkey, "negotiationinclude")) {
		return parse_transport_option(key, value,
					      &remote->negotiation_include);
	} else if (!strcmp(subkey, "followremotehead")) {
		const char *no_warn_branch;
		if (!strcmp(value, "never"))
			remote->follow_remote_head = FOLLOW_REMOTE_NEVER;
		else if (!strcmp(value, "create"))
			remote->follow_remote_head = FOLLOW_REMOTE_CREATE;
		else if (!strcmp(value, "warn")) {
			remote->follow_remote_head = FOLLOW_REMOTE_WARN;
			remote->no_warn_branch = NULL;
		} else if (skip_prefix(value, "warn-if-not-", &no_warn_branch)) {
			remote->follow_remote_head = FOLLOW_REMOTE_WARN;
			remote->no_warn_branch = no_warn_branch;
		} else if (!strcmp(value, "always")) {
			remote->follow_remote_head = FOLLOW_REMOTE_ALWAYS;
		} else {
			warning(_("unrecognized followRemoteHEAD value '%s' ignored"),
				value);
		}
	}
	return 0;
}

static void alias_all_urls(struct remote_state *remote_state)
{
	int i, j;
	for (i = 0; i < remote_state->remotes_nr; i++) {
		int add_pushurl_aliases;
		if (!remote_state->remotes[i])
			continue;
		for (j = 0; j < remote_state->remotes[i]->pushurl.nr; j++) {
			char *alias = alias_url(remote_state->remotes[i]->pushurl.v[j],
						&remote_state->rewrites);
			if (alias)
				strvec_replace(&remote_state->remotes[i]->pushurl,
					       j, alias);
			free(alias);
		}
		add_pushurl_aliases = remote_state->remotes[i]->pushurl.nr == 0;
		for (j = 0; j < remote_state->remotes[i]->url.nr; j++) {
			char *alias;
			if (add_pushurl_aliases)
				add_pushurl_alias(
					remote_state, remote_state->remotes[i],
					remote_state->remotes[i]->url.v[j]);
			alias = alias_url(remote_state->remotes[i]->url.v[j],
					  &remote_state->rewrites);
			if (alias)
				strvec_replace(&remote_state->remotes[i]->url,
					       j, alias);
			free(alias);
		}
	}
}

static void read_config(struct repository *repo, int early)
{
	int flag;

	if (repo->remote_state->initialized)
		return;
	repo->remote_state->initialized = 1;

	repo->remote_state->current_branch = NULL;
	if (startup_info->have_repository && !early) {
		const char *head_ref = refs_resolve_ref_unsafe(
			get_main_ref_store(repo), "HEAD", 0, NULL, &flag);
		if (head_ref && (flag & REF_ISSYMREF) &&
		    skip_prefix(head_ref, "refs/heads/", &head_ref)) {
			repo->remote_state->current_branch = make_branch(
				repo->remote_state, head_ref, strlen(head_ref));
		}
	}
	repo_config(repo, handle_config, repo->remote_state);
	alias_all_urls(repo->remote_state);
}

#ifndef WITH_BREAKING_CHANGES
static int valid_remote_nick(const char *name)
{
	if (!name[0] || is_dot_or_dotdot(name))
		return 0;

	/* remote nicknames cannot contain slashes */
	while (*name)
		if (is_dir_sep(*name++))
			return 0;
	return 1;
}
#endif /* WITH_BREAKING_CHANGES */

static const char *remotes_remote_for_branch(struct remote_state *remote_state,
					     struct branch *branch,
					     int *explicit)
{
	if (branch && branch->remote_name) {
		if (explicit)
			*explicit = 1;
		return branch->remote_name;
	}
	if (explicit)
		*explicit = 0;
	if (remote_state->remotes_nr == 1)
		return remote_state->remotes[0]->name;
	return "origin";
}

const char *remote_for_branch(struct branch *branch, int *explicit)
{
	read_config(the_repository, 0);
	die_on_missing_branch(the_repository, branch);

	return remotes_remote_for_branch(the_repository->remote_state, branch,
					 explicit);
}

static const char *
remotes_pushremote_for_branch(struct remote_state *remote_state,
			      struct branch *branch, int *explicit)
{
	if (branch && branch->pushremote_name) {
		if (explicit)
			*explicit = 1;
		return branch->pushremote_name;
	}
	if (remote_state->pushremote_name) {
		if (explicit)
			*explicit = 1;
		return remote_state->pushremote_name;
	}
	return remotes_remote_for_branch(remote_state, branch, explicit);
}

const char *pushremote_for_branch(struct branch *branch, int *explicit)
{
	read_config(the_repository, 0);
	die_on_missing_branch(the_repository, branch);

	return remotes_pushremote_for_branch(the_repository->remote_state,
					     branch, explicit);
}

static struct remote *remotes_remote_get(struct repository *repo,
					 const char *name);

char *remote_ref_for_branch(struct branch *branch, int for_push)
{
	read_config(the_repository, 0);
	die_on_missing_branch(the_repository, branch);

	if (branch) {
		if (!for_push) {
			if (branch->merge_nr) {
				return xstrdup(branch->merge[0]->src);
			}
		} else {
			char *dst;
			const char *remote_name = remotes_pushremote_for_branch(
					the_repository->remote_state, branch,
					NULL);
			struct remote *remote = remotes_remote_get(
				the_repository, remote_name);

			if (remote && remote->push.nr &&
			    (dst = apply_refspecs(&remote->push,
						  branch->refname))) {
				return dst;
			}
		}
	}
	return NULL;
}

static void validate_remote_url(struct remote *remote)
{
	int i;
	const char *value;
	struct strbuf redacted = STRBUF_INIT;
	int warn_not_die;

	if (repo_config_get_string_tmp(the_repository, "transfer.credentialsinurl", &value))
		return;

	if (!strcmp("warn", value))
		warn_not_die = 1;
	else if (!strcmp("die", value))
		warn_not_die = 0;
	else if (!strcmp("allow", value))
		return;
	else
		die(_("unrecognized value transfer.credentialsInUrl: '%s'"), value);

	for (i = 0; i < remote->url.nr; i++) {
		struct url_info url_info = { 0 };

		if (!url_normalize(remote->url.v[i], &url_info) ||
		    !url_info.passwd_off)
			goto loop_cleanup;

		strbuf_reset(&redacted);
		strbuf_add(&redacted, url_info.url, url_info.passwd_off);
		strbuf_addstr(&redacted, "<redacted>");
		strbuf_addstr(&redacted,
			      url_info.url + url_info.passwd_off + url_info.passwd_len);

		if (warn_not_die)
			warning(_("URL '%s' uses plaintext credentials"), redacted.buf);
		else
			die(_("URL '%s' uses plaintext credentials"), redacted.buf);

loop_cleanup:
		free(url_info.url);
	}

	strbuf_release(&redacted);
}

static struct remote *
remotes_remote_get_1(struct repository *repo, const char *name,
		     const char *(*get_default)(struct remote_state *,
						struct branch *, int *))
{
	struct remote_state *remote_state = repo->remote_state;
	struct remote *ret;
	int name_given = 0;

	if (name)
		name_given = 1;
	else
		name = get_default(remote_state, remote_state->current_branch,
				   &name_given);

	ret = make_remote(remote_state, name, 0);
#ifndef WITH_BREAKING_CHANGES
	if (valid_remote_nick(name) && have_git_dir()) {
		if (!valid_remote(ret))
			read_remotes_file(repo, ret);
		if (!valid_remote(ret))
			read_branches_file(repo, ret);
	}
#endif /* WITH_BREAKING_CHANGES */
	if (name_given && !valid_remote(ret))
		add_url_alias(remote_state, ret, name);
	if (!valid_remote(ret))
		return NULL;

	validate_remote_url(ret);

	return ret;
}

static inline struct remote *
remotes_remote_get(struct repository *repo, const char *name)
{
	return remotes_remote_get_1(repo, name, remotes_remote_for_branch);
}

struct remote *remote_get(const char *name)
{
	read_config(the_repository, 0);
	return remotes_remote_get(the_repository, name);
}

struct remote *remote_get_early(const char *name)
{
	read_config(the_repository, 1);
	return remotes_remote_get(the_repository, name);
}

static inline struct remote *
remotes_pushremote_get(struct repository *repo, const char *name)
{
	return remotes_remote_get_1(repo, name, remotes_pushremote_for_branch);
}

struct remote *pushremote_get(const char *name)
{
	read_config(the_repository, 0);
	return remotes_pushremote_get(the_repository, name);
}

int remote_is_configured(struct remote *remote, int in_repo)
{
	if (!remote)
		return 0;
	if (in_repo)
		return remote->configured_in_repo;
	return !!remote->origin;
}

int for_each_remote(each_remote_fn fn, void *priv)
{
	int i, result = 0;
	read_config(the_repository, 0);
	for (i = 0; i < the_repository->remote_state->remotes_nr && !result;
	     i++) {
		struct remote *remote =
			the_repository->remote_state->remotes[i];
		if (!remote)
			continue;
		result = fn(remote, priv);
	}
	return result;
}

static void handle_duplicate(struct ref *ref1, struct ref *ref2)
{
	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.
			 */
			BUG("Internal error");
		}
	}
	free(ref2->peer_ref);
	free(ref2);
}

struct ref *ref_remove_duplicates(struct ref *ref_map)
{
	struct string_list refs = STRING_LIST_INIT_NODUP;
	struct ref *retval = NULL;
	struct ref **p = &retval;

	while (ref_map) {
		struct ref *ref = ref_map;

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

		if (!ref->peer_ref) {
			*p = ref;
			p = &ref->next;
		} else {
			struct string_list_item *item =
				string_list_insert(&refs, ref->peer_ref->name);

			if (item->util) {
				/* Entry already existed */
				handle_duplicate((struct ref *)item->util, ref);
			} else {
				*p = ref;
				p = &ref->next;
				item->util = ref;
			}
		}
	}

	string_list_clear(&refs, 0);
	return retval;
}

int remote_has_url(struct remote *remote, const char *url)
{
	int i;
	for (i = 0; i < remote->url.nr; i++) {
		if (!strcmp(remote->url.v[i], url))
			return 1;
	}
	return 0;
}

struct strvec *push_url_of_remote(struct remote *remote)
{
	return remote->pushurl.nr ? &remote->pushurl : &remote->url;
}

static bool remote_has_push_url(struct remote *remote, const char *url)
{
	const struct strvec *push_urls = push_url_of_remote(remote);

	for (size_t i = 0; i < push_urls->nr; i++) {
		if (!strcmp(push_urls->v[i], url))
			return true;
	}
	return false;
}

void ref_push_report_free(struct ref_push_report *report)
{
	while (report) {
		struct ref_push_report *next = report->next;

		free(report->ref_name);
		free(report->old_oid);
		free(report->new_oid);
		free(report);

		report = next;
	}
}

int remote_find_tracking(struct remote *remote, struct refspec_item *refspec)
{
	return refspec_find_match(&remote->fetch, refspec);
}

static struct ref *alloc_ref_with_prefix(const char *prefix, size_t prefixlen,
		const char *name)
{
	size_t len = strlen(name);
	struct ref *ref = xcalloc(1, st_add4(sizeof(*ref), prefixlen, len, 1));
	memcpy(ref->name, prefix, prefixlen);
	memcpy(ref->name + prefixlen, name, len);
	return ref;
}

struct ref *alloc_ref(const char *name)
{
	return alloc_ref_with_prefix("", 0, name);
}

struct ref *copy_ref(const struct ref *ref)
{
	struct ref *cpy;
	size_t len;
	if (!ref)
		return NULL;
	len = st_add3(sizeof(struct ref), strlen(ref->name), 1);
	cpy = xmalloc(len);
	memcpy(cpy, ref, len);
	cpy->next = NULL;
	cpy->symref = xstrdup_or_null(ref->symref);
	cpy->remote_status = xstrdup_or_null(ref->remote_status);
	cpy->peer_ref = copy_ref(ref->peer_ref);
	return cpy;
}

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;
}

void free_one_ref(struct ref *ref)
{
	if (!ref)
		return;
	free_one_ref(ref->peer_ref);
	ref_push_report_free(ref->report);
	free(ref->remote_status);
	free(ref->tracking_ref);
	free(ref->symref);
	free(ref);
}

void free_refs(struct ref *ref)
{
	struct ref *next;
	while (ref) {
		next = ref->next;
		free_one_ref(ref);
		ref = next;
	}
}

int count_refspec_match(const char *pattern,
			struct ref *refs,
			struct ref **matched_ref)
{
	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);

		if (!refname_match(pattern, name))
			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 &&
		    !starts_with(name, "refs/heads/") &&
		    !starts_with(name, "refs/tags/")) {
			/* 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) {
		if (matched_ref)
			*matched_ref = matched_weak;
		return weak_match;
	}
	else {
		if (matched_ref)
			*matched_ref = matched;
		return match;
	}
}

void tail_link_ref(struct ref *ref, struct ref ***tail)
{
	**tail = ref;
	while (ref->next)
		ref = ref->next;
	*tail = &ref->next;
}

static struct ref *alloc_delete_ref(void)
{
	struct ref *ref = alloc_ref("(delete)");
	oidclr(&ref->new_oid, the_repository->hash_algo);
	return ref;
}

static int try_explicit_object_name(const char *name,
				    struct ref **match)
{
	struct object_id oid;

	if (!*name) {
		if (match)
			*match = alloc_delete_ref();
		return 0;
	}

	if (repo_get_oid(the_repository, name, &oid))
		return -1;

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

static struct ref *make_linked_ref(const char *name, struct ref ***tail)
{
	struct ref *ret = alloc_ref(name);
	tail_link_ref(ret, tail);
	return ret;
}

static char *guess_ref(const char *name, struct ref *peer)
{
	struct strbuf buf = STRBUF_INIT;

	const char *r = refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
						peer->name,
						RESOLVE_REF_READING,
						NULL, NULL);
	if (!r)
		return NULL;

	if (starts_with(r, "refs/heads/")) {
		strbuf_addstr(&buf, "refs/heads/");
	} else if (starts_with(r, "refs/tags/")) {
		strbuf_addstr(&buf, "refs/tags/");
	} else {
		return NULL;
	}

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

static int match_explicit_lhs(struct ref *src,
			      struct refspec_item *rs,
			      struct ref **match,
			      int *allocated_match)
{
	switch (count_refspec_match(rs->src, src, match)) {
	case 1:
		if (allocated_match)
			*allocated_match = 0;
		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.
		 */
		if (try_explicit_object_name(rs->src, match) < 0)
			return error(_("src refspec %s does not match any"), rs->src);
		if (allocated_match)
			*allocated_match = 1;
		return 0;
	default:
		return error(_("src refspec %s matches more than one"), rs->src);
	}
}

static void show_push_unqualified_ref_name_error(const char *dst_value,
						 const char *matched_src_name)
{
	struct object_id oid;

	/*
	 * TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
	 * <remote> <src>:<dst>" push, and "being pushed ('%s')" is
	 * the <src>.
	 */
	error(_("The destination you provided is not a full refname (i.e.,\n"
		"starting with \"refs/\"). We tried to guess what you meant by:\n"
		"\n"
		"- Looking for a ref that matches '%s' on the remote side.\n"
		"- Checking if the <src> being pushed ('%s')\n"
		"  is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
		"  refs/{heads,tags}/ prefix on the remote side.\n"
		"\n"
		"Neither worked, so we gave up. You must fully qualify the ref."),
	      dst_value, matched_src_name);

	if (!advice_enabled(ADVICE_PUSH_UNQUALIFIED_REF_NAME))
		return;

	if (repo_get_oid(the_repository, matched_src_name, &oid))
		BUG("'%s' is not a valid object, "
		    "match_explicit_lhs() should catch this!",
		    matched_src_name);

	switch (odb_read_object_info(the_repository->objects, &oid, NULL)) {
	case OBJ_COMMIT:
		advise(_("The <src> part of the refspec is a commit object.\n"
			 "Did you mean to create a new branch by pushing to\n"
			 "'%s:refs/heads/%s'?"),
		       matched_src_name, dst_value);
		break;
	case OBJ_TAG:
		advise(_("The <src> part of the refspec is a tag object.\n"
			 "Did you mean to create a new tag by pushing to\n"
			 "'%s:refs/tags/%s'?"),
		       matched_src_name, dst_value);
		break;
	case OBJ_TREE:
		advise(_("The <src> part of the refspec is a tree object.\n"
			 "Did you mean to tag a new tree by pushing to\n"
			 "'%s:refs/tags/%s'?"),
		       matched_src_name, dst_value);
		break;
	case OBJ_BLOB:
		advise(_("The <src> part of the refspec is a blob object.\n"
			 "Did you mean to tag a new blob by pushing to\n"
			 "'%s:refs/tags/%s'?"),
		       matched_src_name, dst_value);
		break;
	default:
		advise(_("The <src> part of the refspec ('%s') "
			 "is an object ID that doesn't exist.\n"),
		       matched_src_name);
		break;
	}
}

static int match_explicit(struct ref *src, struct ref *dst,
			  struct ref ***dst_tail,
			  struct refspec_item *rs)
{
	struct ref *matched_src = NULL, *matched_dst = NULL;
	int allocated_src = 0, ret;

	const char *dst_value = rs->dst;
	char *dst_guess;

	if (rs->pattern || rs->matching || rs->negative) {
		ret = 0;
		goto out;
	}

	if (match_explicit_lhs(src, rs, &matched_src, &allocated_src) < 0) {
		ret = -1;
		goto out;
	}

	if (!dst_value) {
		int flag;

		dst_value = refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
						    matched_src->name,
						    RESOLVE_REF_READING,
						    NULL, &flag);
		if (!dst_value ||
		    ((flag & REF_ISSYMREF) &&
		     !starts_with(dst_value, "refs/heads/")))
			die(_("%s cannot be resolved to branch"),
			    matched_src->name);
	}

	switch (count_refspec_match(dst_value, dst, &matched_dst)) {
	case 1:
		break;
	case 0:
		if (starts_with(dst_value, "refs/")) {
			matched_dst = make_linked_ref(dst_value, dst_tail);
		} else if (is_null_oid(&matched_src->new_oid)) {
			error(_("unable to delete '%s': remote ref does not exist"),
			      dst_value);
		} else if ((dst_guess = guess_ref(dst_value, matched_src))) {
			matched_dst = make_linked_ref(dst_guess, dst_tail);
			free(dst_guess);
		} else {
			show_push_unqualified_ref_name_error(dst_value,
							     matched_src->name);
		}
		break;
	default:
		matched_dst = NULL;
		error(_("dst refspec %s matches more than one"),
		      dst_value);
		break;
	}

	if (!matched_dst) {
		ret = -1;
		goto out;
	}

	if (matched_dst->peer_ref) {
		ret = error(_("dst ref %s receives from more than one src"),
			    matched_dst->name);
		goto out;
	} else {
		matched_dst->peer_ref = allocated_src ?
					matched_src :
					copy_ref(matched_src);
		matched_dst->force = rs->force;
		matched_src = NULL;
	}

	ret = 0;

out:
	if (allocated_src)
		free_one_ref(matched_src);
	return ret;
}

static int match_explicit_refs(struct ref *src, struct ref *dst,
			       struct ref ***dst_tail, struct refspec *rs)
{
	int i, errs;
	for (i = errs = 0; i < rs->nr; i++)
		errs += match_explicit(src, dst, dst_tail, &rs->items[i]);
	return errs;
}

static char *get_ref_match(const struct refspec *rs, const struct ref *ref,
			   int send_mirror, int direction,
			   const struct refspec_item **ret_pat)
{
	const struct refspec_item *pat;
	char *name;
	int i;
	int matching_refs = -1;
	for (i = 0; i < rs->nr; i++) {
		const struct refspec_item *item = &rs->items[i];

		if (item->negative)
			continue;

		if (item->matching &&
		    (matching_refs == -1 || item->force)) {
			matching_refs = i;
			continue;
		}

		if (item->pattern) {
			const char *dst_side = item->dst ? item->dst : item->src;
			int match;
			if (direction == FROM_SRC)
				match = match_refname_with_pattern(item->src, ref->name, dst_side, &name);
			else
				match = match_refname_with_pattern(dst_side, ref->name, item->src, &name);
			if (match) {
				matching_refs = i;
				break;
			}
		}
	}
	if (matching_refs == -1)
		return NULL;

	pat = &rs->items[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.
		 */
		if (!send_mirror && !starts_with(ref->name, "refs/heads/"))
			return NULL;
		name = xstrdup(ref->name);
	}
	if (ret_pat)
		*ret_pat = pat;
	return name;
}

static struct ref **tail_ref(struct ref **head)
{
	struct ref **tail = head;
	while (*tail)
		tail = &((*tail)->next);
	return tail;
}

static void add_to_tips(struct commit_stack *tips, const struct object_id *oid)
{
	struct commit *commit;

	if (is_null_oid(oid))
		return;
	commit = lookup_commit_reference_gently(the_repository, oid, 1);
	if (!commit || (commit->object.flags & TMP_MARK))
		return;
	commit->object.flags |= TMP_MARK;
	commit_stack_push(tips, 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 commit_stack sent_tips = COMMIT_STACK_INIT;

	/*
	 * Collect everything we know they would have at the end of
	 * this push, and collect all tags they have.
	 */
	for (ref = *dst; ref; ref = ref->next) {
		if (ref->peer_ref &&
		    !is_null_oid(&ref->peer_ref->new_oid))
			add_to_tips(&sent_tips, &ref->peer_ref->new_oid);
		else
			add_to_tips(&sent_tips, &ref->old_oid);
		if (starts_with(ref->name, "refs/tags/"))
			string_list_append(&dst_tag, ref->name);
	}
	clear_commit_marks_many(sent_tips.nr, sent_tips.items, TMP_MARK);

	string_list_sort(&dst_tag);

	/* Collect tags they do not have. */
	for (ref = src; ref; ref = ref->next) {
		if (!starts_with(ref->name, "refs/tags/"))
			continue; /* not a tag */
		if (string_list_has_string(&dst_tag, ref->name))
			continue; /* they already have it */
		if (odb_read_object_info(the_repository->objects,
					 &ref->new_oid, NULL) != OBJ_TAG)
			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) {
		const int reachable_flag = 1;
		struct commit_list *found_commits;
		struct commit_stack src_commits = COMMIT_STACK_INIT;

		for_each_string_list_item(item, &src_tag) {
			struct ref *ref = item->util;
			struct commit *commit;

			if (is_null_oid(&ref->new_oid))
				continue;
			commit = lookup_commit_reference_gently(the_repository,
								&ref->new_oid,
								1);
			if (!commit)
				/* not pushing a commit, which is not an error */
				continue;

			commit_stack_push(&src_commits, commit);
		}

		found_commits = get_reachable_subset(sent_tips.items,
						     sent_tips.nr,
						     src_commits.items,
						     src_commits.nr,
						     reachable_flag);

		for_each_string_list_item(item, &src_tag) {
			struct ref *dst_ref;
			struct ref *ref = item->util;
			struct commit *commit;

			if (is_null_oid(&ref->new_oid))
				continue;
			commit = lookup_commit_reference_gently(the_repository,
								&ref->new_oid,
								1);
			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 (!(commit->object.flags & reachable_flag))
				continue;

			/* Add it in */
			dst_ref = make_linked_ref(ref->name, dst_tail);
			oidcpy(&dst_ref->new_oid, &ref->new_oid);
			dst_ref->peer_ref = copy_ref(ref);
		}

		clear_commit_marks_many(src_commits.nr, src_commits.items,
					reachable_flag);
		commit_stack_clear(&src_commits);
		commit_list_free(found_commits);
	}

	string_list_clear(&src_tag, 0);
	commit_stack_clear(&sent_tips);
}

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;
}

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;

	string_list_sort(ref_index);
}

/*
 * 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, struct refspec *rs)
{
	int ret = 0;
	int i;

	for (i = 0; i < rs->nr; i++) {
		struct refspec_item *item = &rs->items[i];

		if (item->pattern || item->matching || item->negative)
			continue;

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

	return ret;
}

/*
 * 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).
 */
int match_push_refs(struct ref *src, struct ref **dst,
		    struct refspec *rs, int flags)
{
	int send_all = flags & MATCH_REFS_ALL;
	int send_mirror = flags & MATCH_REFS_MIRROR;
	int send_prune = flags & MATCH_REFS_PRUNE;
	int errs;
	struct ref *ref, **dst_tail = tail_ref(dst);
	struct string_list dst_ref_index = STRING_LIST_INIT_NODUP;

	/* If no refspec is provided, use the default ":" */
	if (!rs->nr)
		refspec_append(rs, ":");

	errs = match_explicit_refs(src, *dst, &dst_tail, rs);

	/* pick the remainder */
	for (ref = src; ref; ref = ref->next) {
		struct string_list_item *dst_item;
		struct ref *dst_peer;
		const struct refspec_item *pat = NULL;
		char *dst_name;

		dst_name = get_ref_match(rs, ref, send_mirror, FROM_SRC, &pat);
		if (!dst_name)
			continue;

		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;
		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
				 * --all or --mirror.
				 */
				goto free_name;

			/* Create a new one and link it */
			dst_peer = make_linked_ref(dst_name, &dst_tail);
			oidcpy(&dst_peer->new_oid, &ref->new_oid);
			string_list_insert(&dst_ref_index,
				dst_peer->name)->util = dst_peer;
		}
		dst_peer->peer_ref = copy_ref(ref);
		dst_peer->force = pat->force;
	free_name:
		free(dst_name);
	}

	string_list_clear(&dst_ref_index, 0);

	if (flags & MATCH_REFS_FOLLOW_TAGS)
		add_missing_tags(src, dst, &dst_tail);

	if (send_prune) {
		struct string_list src_ref_index = STRING_LIST_INIT_NODUP;
		/* 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, ref, send_mirror, FROM_DST, NULL);
			if (src_name) {
				if (!src_ref_index.nr)
					prepare_ref_index(&src_ref_index, src);
				if (!string_list_has_string(&src_ref_index,
					    src_name))
					ref->peer_ref = alloc_delete_ref();
				free(src_name);
			}
		}
		string_list_clear(&src_ref_index, 0);
	}

	*dst = apply_negative_refspecs(*dst, rs);

	if (errs)
		return -1;
	return 0;
}

void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
			     int force_update)
{
	struct ref *ref;

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

		if (ref->peer_ref)
			oidcpy(&ref->new_oid, &ref->peer_ref->new_oid);
		else if (!send_mirror)
			continue;

		ref->deletion = is_null_oid(&ref->new_oid);
		if (!ref->deletion &&
			oideq(&ref->old_oid, &ref->new_oid)) {
			ref->status = REF_STATUS_UPTODATE;
			continue;
		}

		/*
		 * If the remote ref has moved and is now different
		 * from what we expect, reject any push.
		 *
		 * 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 the tip of the remote-tracking ref is unreachable
		 * from any reflog entry of its local ref indicating a
		 * possible update since checkout; reject the push.
		 */
		if (ref->expect_old_sha1) {
			if (!oideq(&ref->old_oid, &ref->old_oid_expect))
				reject_reason = REF_STATUS_REJECT_STALE;
			else if (ref->check_reachable && ref->unreachable)
				reject_reason =
					REF_STATUS_REJECT_REMOTE_UPDATED;
			else
				/*
				 * If the ref isn't stale, and is reachable
				 * from one of the reflog entries of
				 * the local branch, force the update.
				 */
				force_ref_update = 1;
		}

		/*
		 * If the update isn't already rejected then check
		 * the usual "must fast-forward" rules.
		 *
		 * Decide whether an individual refspec A:B can be
		 * pushed.  The push will succeed if any of the
		 * following are true:
		 *
		 * (1) the remote reference B does not exist
		 *
		 * (2) the remote reference B is being removed (i.e.,
		 *     pushing :B where no source is specified)
		 *
		 * (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.
		 *
		 * (4) it is forced using the +A:B notation, or by
		 *     passing the --force argument
		 */

		if (!reject_reason && !ref->deletion && !is_null_oid(&ref->old_oid)) {
			if (starts_with(ref->name, "refs/tags/"))
				reject_reason = REF_STATUS_REJECT_ALREADY_EXISTS;
			else if (!odb_has_object(the_repository->objects, &ref->old_oid, ODB_HAS_OBJECT_RECHECK_PACKED))
				reject_reason = REF_STATUS_REJECT_FETCH_FIRST;
			else if (!lookup_commit_reference_gently(the_repository, &ref->old_oid, 1) ||
				 !lookup_commit_reference_gently(the_repository, &ref->new_oid, 1))
				reject_reason = REF_STATUS_REJECT_NEEDS_FORCE;
			else if (!ref_newer(&ref->new_oid, &ref->old_oid))
				reject_reason = REF_STATUS_REJECT_NONFASTFORWARD;
		}

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

static void set_merge(struct repository *repo, struct branch *ret)
{
	struct remote *remote;
	char *ref;
	struct object_id oid;
	int i;

	if (!ret)
		return; /* no branch */
	if (ret->set_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
		 */
		merge_clear(ret);
		return;
	}
	ret->set_merge = 1;

	remote = remotes_remote_get(repo, ret->remote_name);

	for (i = 0; i < ret->merge_nr; i++) {
		if (!remote_find_tracking(remote, ret->merge[i]) ||
		    strcmp(ret->remote_name, "."))
			continue;
		if (repo_dwim_ref(repo, ret->merge[i]->src,
				  strlen(ret->merge[i]->src), &oid, &ref,
				  0) == 1)
			ret->merge[i]->dst = ref;
		else
			ret->merge[i]->dst = xstrdup(ret->merge[i]->src);
	}
}

static struct branch *repo_branch_get(struct repository *repo, const char *name)
{
	struct branch *ret;

	read_config(repo, 0);
	if (!name || !*name || !strcmp(name, "HEAD"))
		ret = repo->remote_state->current_branch;
	else
		ret = make_branch(repo->remote_state, name,
				  strlen(name));
	set_merge(repo, ret);
	return ret;
}

struct branch *branch_get(const char *name)
{
	return repo_branch_get(the_repository, name);
}

const char *repo_default_remote(struct repository *repo)
{
	struct branch *branch;

	read_config(repo, 0);
	branch = repo_branch_get(repo, "HEAD");

	return remotes_remote_for_branch(repo->remote_state, branch, NULL);
}

const char *repo_remote_from_url(struct repository *repo, const char *url)
{
	char *rewritten_url;
	const char *remote_name = NULL;

	read_config(repo, 0);
	if ((rewritten_url = alias_url(url, &repo->remote_state->rewrites)))
		url = rewritten_url;

	for (int i = 0; i < repo->remote_state->remotes_nr; i++) {
		struct remote *remote = repo->remote_state->remotes[i];
		if (!remote)
			continue;

		if (remote_has_url(remote, url)) {
			remote_name = remote->name;
			break;
		}
	}
	free(rewritten_url);
	return remote_name;
}

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

int branch_merge_matches(struct branch *branch,
		                 int i,
		                 const char *refname)
{
	if (!branch || i < 0 || i >= branch->merge_nr)
		return 0;
	return refname_match(branch->merge[i]->src, refname);
}

__attribute__((format (printf,2,3)))
static 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"));

	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?
		 */
		if (!refs_ref_exists(get_main_ref_store(the_repository), branch->refname))
			return error_buf(err, _("no such branch: '%s'"),
					 branch->name);
		return error_buf(err,
				 _("no upstream configured for branch '%s'"),
				 branch->name);
	}

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

	return branch->merge[0]->dst;
}

struct remote *repo_remote_for_push_tracking(struct repository *repo,
					     struct remote *remote)
{
	const struct strvec *push_urls;
	struct remote *first_match = NULL;
	struct remote_state *remote_state = repo->remote_state;
	const char *check_url;

	if (remote->origin != REMOTE_UNCONFIGURED)
		return remote;

	push_urls = push_url_of_remote(remote);
	if (push_urls->nr != 1)
		return remote;
	check_url = push_urls->v[0];

	for (int i = 0; i < remote_state->remotes_nr; i++) {
		struct remote *candidate = remote_state->remotes[i];

		if (!candidate || candidate == remote ||
		    !remote_is_configured(candidate, 0) ||
		    !remote_has_push_url(candidate, check_url))
			continue;
		if (first_match)
			return remote;
		first_match = candidate;
	}

	return first_match ? first_match : remote;
}

static char *tracking_for_push_dest(struct repository *repo,
				    struct remote *remote,
				    const char *refname,
				    struct strbuf *err)
{
	char *ret;

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

static char *branch_get_push_1(struct repository *repo,
			       struct branch *branch, struct strbuf *err)
{
	struct remote_state *remote_state = repo->remote_state;
	struct remote *remote;

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

	if (remote->push.nr) {
		char *dst;
		char *ret;

		dst = apply_refspecs(&remote->push, 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(repo, remote, dst, err);
		free(dst);
		return ret;
	}

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

	switch (repo_config_values(repo)->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(repo, remote, branch->refname, err);

	case PUSH_DEFAULT_UPSTREAM:
		return xstrdup_or_null(branch_get_upstream(branch, err));

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

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

	BUG("unhandled push situation");
}

const char *branch_get_push(struct branch *branch, struct strbuf *err)
{
	read_config(the_repository, 0);
	die_on_missing_branch(the_repository, branch);

	if (!branch)
		return error_buf(err, _("HEAD does not point to a branch"));

	if (!branch->push_tracking_ref)
		branch->push_tracking_ref = branch_get_push_1(
			the_repository, branch, err);
	return branch->push_tracking_ref;
}

static int ignore_symref_update(const char *refname, struct strbuf *scratch)
{
	return !refs_read_symbolic_ref(get_main_ref_store(the_repository), refname, scratch);
}

/*
 * 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.
 */
static struct ref *get_expanded_map(const struct ref *remote_refs,
				    const struct refspec_item *refspec)
{
	struct strbuf scratch = STRBUF_INIT;
	const struct ref *ref;
	struct ref *ret = NULL;
	struct ref **tail = &ret;

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

		strbuf_reset(&scratch);

		if (strchr(ref->name, '^'))
			continue; /* a dereference item */
		if (match_refname_with_pattern(refspec->src, ref->name,
					    refspec->dst, &expn_name) &&
		    !ignore_symref_update(expn_name, &scratch)) {
			struct ref *cpy = copy_ref(ref);

			if (cpy->peer_ref)
				free_one_ref(cpy->peer_ref);
			cpy->peer_ref = alloc_ref(expn_name);
			if (refspec->force)
				cpy->peer_ref->force = 1;
			*tail = cpy;
			tail = &cpy->next;
		}
		free(expn_name);
	}

	strbuf_release(&scratch);
	return ret;
}

static const struct ref *find_ref_by_name_abbrev(const struct ref *refs, const char *name)
{
	const struct ref *ref;
	const struct ref *best_match = NULL;
	int best_score = 0;

	for (ref = refs; ref; ref = ref->next) {
		int score = refname_match(name, ref->name);

		if (best_score < score) {
			best_match = ref;
			best_score = score;
		}
	}
	return best_match;
}

struct ref *get_remote_ref(const struct ref *remote_refs, const char *name)
{
	const struct ref *ref = find_ref_by_name_abbrev(remote_refs, name);

	if (!ref)
		return NULL;

	return copy_ref(ref);
}

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

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

	if (starts_with(name, "heads/") ||
	    starts_with(name, "tags/") ||
	    starts_with(name, "remotes/"))
		return alloc_ref_with_prefix("refs/", 5, name);

	return alloc_ref_with_prefix("refs/heads/", 11, name);
}

int get_fetch_map(const struct ref *remote_refs,
		  const struct refspec_item *refspec,
		  struct ref ***tail,
		  int missing_ok)
{
	struct ref *ref_map, **rmp;

	if (refspec->negative)
		return 0;

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

		if (refspec->exact_sha1) {
			ref_map = alloc_ref(name);
			get_oid_hex(name, &ref_map->old_oid);
			ref_map->exact_oid = 1;
		} else {
			ref_map = get_remote_ref(remote_refs, name);
		}
		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;
		}
	}

	for (rmp = &ref_map; *rmp; ) {
		if ((*rmp)->peer_ref) {
			if (!starts_with((*rmp)->peer_ref->name, "refs/") ||
			    check_refname_format((*rmp)->peer_ref->name, 0)) {
				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);
	}

	if (ref_map)
		tail_link_ref(ref_map, tail);

	return 0;
}

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

	if (skip_prefix(key, "remotes.", &key) && !strcmp(key, g->name)) {
		/* split list by white space */
		while (*value) {
			size_t wordlen = strcspn(value, " \t\n");

			if (wordlen >= 1)
				string_list_append_nodup(g->list,
						   xstrndup(value, wordlen));
			value += wordlen + (value[wordlen] != '\0');
		}
	}

	return 0;
}

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

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

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)) {
			oidcpy(&ref->old_oid, &list->old_oid);
			return 0;
		}
	return 1;
}

/*
 * Compute the commit ahead/behind values for the pair branch_name, base.
 *
 * If abf is AHEAD_BEHIND_FULL, compute the full ahead/behind and return the
 * counts in *num_ours and *num_theirs.  If abf is AHEAD_BEHIND_QUICK, skip
 * the (potentially expensive) a/b computation (*num_ours and *num_theirs are
 * set to zero).
 *
 * Returns -1 if num_ours and num_theirs could not be filled in (e.g., ref
 * does not exist).  Returns 0 if the commits are identical.  Returns 1 if
 * commits are different.
 */

static int stat_branch_pair(const char *branch_name, const char *base,
			     int *num_ours, int *num_theirs,
			     enum ahead_behind_flags abf)
{
	struct object_id oid;
	struct commit *ours, *theirs;
	struct rev_info revs;
	struct strvec argv = STRVEC_INIT;

	/* Cannot stat if what we used to build on no longer exists */
	if (refs_read_ref(get_main_ref_store(the_repository), base, &oid))
		return -1;
	theirs = lookup_commit_reference(the_repository, &oid);
	if (!theirs)
		return -1;

	if (refs_read_ref(get_main_ref_store(the_repository), branch_name, &oid))
		return -1;
	ours = lookup_commit_reference(the_repository, &oid);
	if (!ours)
		return -1;

	*num_theirs = *num_ours = 0;

	/* are we the same? */
	if (theirs == ours)
		return 0;
	if (abf == AHEAD_BEHIND_QUICK)
		return 1;
	if (abf != AHEAD_BEHIND_FULL)
		BUG("stat_branch_pair: invalid abf '%d'", abf);

	/* Run "rev-list --left-right ours...theirs" internally... */
	strvec_push(&argv, ""); /* ignored */
	strvec_push(&argv, "--left-right");
	strvec_pushf(&argv, "%s...%s",
		     oid_to_hex(&ours->object.oid),
		     oid_to_hex(&theirs->object.oid));
	strvec_push(&argv, "--");

	repo_init_revisions(the_repository, &revs, NULL);
	setup_revisions_from_strvec(&argv, &revs, NULL);
	if (prepare_revision_walk(&revs))
		die(_("revision walk setup failed"));

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

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

	strvec_clear(&argv);
	release_revisions(&revs);
	return 1;
}

/*
 * Lookup the tracking branch for the given branch and if present, optionally
 * compute the commit ahead/behind values for the pair.
 *
 * If for_push is true, the tracking branch refers to the push branch,
 * otherwise it refers to the upstream branch.
 *
 * The name of the tracking branch (or NULL if it is not defined) is
 * returned via *tracking_name, if it is not itself NULL.
 *
 * If abf is AHEAD_BEHIND_FULL, compute the full ahead/behind and return the
 * counts in *num_ours and *num_theirs.  If abf is AHEAD_BEHIND_QUICK, skip
 * the (potentially expensive) a/b computation (*num_ours and *num_theirs are
 * set to zero).
 *
 * Returns -1 if num_ours and num_theirs could not be filled in (e.g., no
 * upstream defined, or ref does not exist).  Returns 0 if the commits are
 * identical.  Returns 1 if commits are different.
 */
int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
		       const char **tracking_name, int for_push,
		       enum ahead_behind_flags abf)
{
	const char *base;

	/* Cannot stat unless we are marked to build on top of somebody else. */
	base = for_push ? branch_get_push(branch, NULL) :
		branch_get_upstream(branch, NULL);
	if (tracking_name)
		*tracking_name = base;
	if (!base)
		return -1;

	return stat_branch_pair(branch->refname, base, num_ours, num_theirs, abf);
}

static char *resolve_compare_branch(struct branch *branch, const char *name)
{
	const char *resolved = NULL;

	if (!branch || !name)
		return NULL;

	if (!strcasecmp(name, "@{upstream}")) {
		resolved = branch_get_upstream(branch, NULL);
	} else if (!strcasecmp(name, "@{push}")) {
		resolved = branch_get_push(branch, NULL);
	} else {
		warning(_("ignoring value '%s' for status.compareBranches, "
			  "only @{upstream} and @{push} are supported"),
			name);
		return NULL;
	}

	if (resolved)
		return xstrdup(resolved);
	return NULL;
}

static void format_branch_comparison(struct strbuf *sb,
				     bool up_to_date,
				     int ours, int theirs,
				     const char *branch_name,
				     const char *push_remote_name,
				     const char *push_branch_name,
				     enum ahead_behind_flags abf,
				     unsigned flags)
{
	bool use_push_advice = (flags & ENABLE_ADVICE_PUSH);
	bool use_pull_advice = (flags & ENABLE_ADVICE_PULL);
	bool use_divergence_advice = (flags & ENABLE_ADVICE_DIVERGENCE);

	if (up_to_date) {
		strbuf_addf(sb,
			_("Your branch is up to date with '%s'.\n"),
			branch_name);
	} else if (abf == AHEAD_BEHIND_QUICK) {
		strbuf_addf(sb,
			    _("Your branch and '%s' refer to different commits.\n"),
			    branch_name);
		if (use_push_advice && advice_enabled(ADVICE_STATUS_HINTS))
			strbuf_addf(sb, _("  (use \"%s\" for details)\n"),
				    "git status --ahead-behind");
	} else if (!theirs) {
		strbuf_addf(sb,
			Q_("Your branch is ahead of '%s' by %d commit.\n",
			   "Your branch is ahead of '%s' by %d commits.\n",
			   ours),
			branch_name, ours);
		if (use_push_advice && advice_enabled(ADVICE_STATUS_HINTS))
			strbuf_addstr(sb,
				_("  (use \"git push\" to publish your local commits)\n"));
	} else if (!ours) {
		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",
			   theirs),
			branch_name, theirs);
		if (use_pull_advice && advice_enabled(ADVICE_STATUS_HINTS)) {
			if (push_remote_name && push_branch_name)
				strbuf_addf(sb,
					_("  (use \"git pull %s %s\" to update your local branch)\n"),
					push_remote_name, push_branch_name);
			else
				strbuf_addstr(sb,
					_("  (use \"git pull\" to update your local branch)\n"));
		}
	} else {
		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",
			   ours + theirs),
			branch_name, ours, theirs);
		if (use_divergence_advice && advice_enabled(ADVICE_STATUS_HINTS)) {
			if (push_remote_name && push_branch_name)
				strbuf_addf(sb,
					_("  (use \"git pull %s %s\" if you want to integrate the remote branch with yours)\n"),
					push_remote_name, push_branch_name);
			else
				strbuf_addstr(sb,
					_("  (use \"git pull\" if you want to integrate the remote branch with yours)\n"));
		}
	}
}

/*
 * Return true when there is anything to report, otherwise false.
 */
int format_tracking_info(struct branch *branch, struct strbuf *sb,
			 enum ahead_behind_flags abf,
			 int show_divergence_advice)
{
	char *compare_branches = NULL;
	struct string_list branches = STRING_LIST_INIT_DUP;
	struct strset processed_refs = STRSET_INIT;
	int reported = 0;
	size_t i;
	const char *upstream_ref;
	const char *push_ref;

	repo_config_get_string(the_repository, "status.comparebranches",
			       &compare_branches);

	if (compare_branches) {
		string_list_split(&branches, compare_branches, " ", -1);
		string_list_remove_empty_items(&branches, 0);
	} else {
		string_list_append(&branches, "@{upstream}");
	}

	upstream_ref = branch_get_upstream(branch, NULL);
	push_ref = branch_get_push(branch, NULL);

	for (i = 0; i < branches.nr; i++) {
		char *full_ref;
		char *short_ref;
		int ours, theirs, cmp;
		int is_upstream, is_push;
		unsigned flags = 0;
		const char *push_remote_name = NULL;
		const char *push_branch_name = NULL;

		full_ref = resolve_compare_branch(branch,
						  branches.items[i].string);
		if (!full_ref)
			continue;

		if (!strset_add(&processed_refs, full_ref)) {
			free(full_ref);
			continue;
		}

		short_ref = refs_shorten_unambiguous_ref(
			get_main_ref_store(the_repository), full_ref, 0);

		is_upstream = upstream_ref && !strcmp(full_ref, upstream_ref);
		is_push = push_ref && !strcmp(full_ref, push_ref);

		if (is_upstream && (!push_ref || !strcmp(upstream_ref, push_ref)))
			is_push = 1;

		cmp = stat_branch_pair(branch->refname, full_ref,
				       &ours, &theirs, abf);

		if (cmp < 0) {
			if (is_upstream) {
				strbuf_addf(sb,
					_("Your branch is based on '%s', but the upstream is gone.\n"),
					short_ref);
				if (advice_enabled(ADVICE_STATUS_HINTS))
					strbuf_addstr(sb,
						_("  (use \"git branch --unset-upstream\" to fixup)\n"));
				reported = 1;
			}
			free(full_ref);
			free(short_ref);
			continue;
		}

		if (reported)
			strbuf_addstr(sb, "\n");

		if (is_upstream)
			flags |= ENABLE_ADVICE_PULL;
		if (show_divergence_advice && is_upstream)
			flags |= ENABLE_ADVICE_DIVERGENCE;
		if (is_push) {
			flags |= ENABLE_ADVICE_PUSH;
			if (!upstream_ref || strcmp(upstream_ref, full_ref)) {
				push_remote_name = pushremote_for_branch(branch, NULL);
				if (push_remote_name &&
				    skip_prefix(full_ref, "refs/remotes/", &push_branch_name) &&
				    skip_prefix(push_branch_name, push_remote_name, &push_branch_name) &&
				    *push_branch_name == '/') {
					push_branch_name++;
					flags |= ENABLE_ADVICE_PULL;
				} else {
					push_remote_name = NULL;
				}
			} else {
				flags |= ENABLE_ADVICE_PULL;
			}
		}
		format_branch_comparison(sb, !cmp, ours, theirs, short_ref,
					 push_remote_name, push_branch_name,
					 abf, flags);
		reported = 1;

		free(full_ref);
		free(short_ref);
	}

	string_list_clear(&branches, 0);
	strset_clear(&processed_refs);
	free(compare_branches);
	return reported;
}

static int one_local_ref(const struct reference *ref, void *cb_data)
{
	struct ref ***local_tail = cb_data;
	struct ref *local_ref;

	/* we already know it starts with refs/ to get here */
	if (check_refname_format(ref->name + 5, 0))
		return 0;

	local_ref = alloc_ref(ref->name);
	oidcpy(&local_ref->new_oid, ref->oid);
	**local_tail = local_ref;
	*local_tail = &local_ref->next;
	return 0;
}

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

	refs_for_each_ref(get_main_ref_store(the_repository), one_local_ref,
			  &local_tail);
	return local_refs;
}

struct ref *guess_remote_head(const struct ref *head,
			      const struct ref *refs,
			      unsigned flags)
{
	const struct ref *r;
	struct ref *list = NULL;
	struct ref **tail = &list;

	if (!head)
		return NULL;

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

	/* If a remote branch exists with the default branch name, let's use it. */
	if (!(flags & REMOTE_GUESS_HEAD_ALL)) {
		char *default_branch =
			repo_default_branch_name(the_repository,
						 flags & REMOTE_GUESS_HEAD_QUIET);
		char *ref = xstrfmt("refs/heads/%s", default_branch);

		r = find_ref_by_name(refs, ref);
		free(ref);
		free(default_branch);

		if (r && oideq(&r->old_oid, &head->old_oid))
			return copy_ref(r);

		/* Fall back to the hard-coded historical default */
		r = find_ref_by_name(refs, "refs/heads/master");
		if (r && oideq(&r->old_oid, &head->old_oid))
			return copy_ref(r);
	}

	/* Look for another ref that points there */
	for (r = refs; r; r = r->next) {
		if (r != head &&
		    starts_with(r->name, "refs/heads/") &&
		    oideq(&r->old_oid, &head->old_oid)) {
			*tail = copy_ref(r);
			tail = &((*tail)->next);
			if (!(flags & REMOTE_GUESS_HEAD_ALL))
				break;
		}
	}

	return list;
}

struct stale_heads_info {
	struct string_list *ref_names;
	struct ref **stale_refs_tail;
	struct refspec *rs;
};

static int get_stale_heads_cb(const struct reference *ref, void *cb_data)
{
	struct stale_heads_info *info = cb_data;
	struct string_list matches = STRING_LIST_INIT_DUP;
	struct refspec_item query;
	int i, stale = 1;
	memset(&query, 0, sizeof(struct refspec_item));
	query.dst = (char *)ref->name;

	refspec_find_all_matches(info->rs, &query, &matches);
	if (matches.nr == 0)
		goto clean_exit; /* No matches */

	/*
	 * 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
	 * remote, we consider it to be stale. In order to deal with
	 * overlapping refspecs, we need to go over all of the
	 * matching refs.
	 */
	if (ref->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) {
		struct ref *linked_ref = make_linked_ref(ref->name, &info->stale_refs_tail);
		oidcpy(&linked_ref->new_oid, ref->oid);
	}

clean_exit:
	string_list_clear(&matches, 0);
	return 0;
}

struct ref *get_stale_heads(struct refspec *rs, struct ref *fetch_map)
{
	struct ref *ref, *stale_refs = NULL;
	struct string_list ref_names = STRING_LIST_INIT_NODUP;
	struct stale_heads_info info;

	info.ref_names = &ref_names;
	info.stale_refs_tail = &stale_refs;
	info.rs = rs;
	for (ref = fetch_map; ref; ref = ref->next)
		string_list_append(&ref_names, ref->name);
	string_list_sort(&ref_names);
	refs_for_each_ref(get_main_ref_store(the_repository),
			  get_stale_heads_cb, &info);
	string_list_clear(&ref_names, 0);
	return stale_refs;
}

/*
 * Compare-and-swap
 */
void clear_cas_option(struct push_cas_option *cas)
{
	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;
}

static int parse_push_cas_option(struct push_cas_option *cas, const char *arg, int unset)
{
	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;
	else if (!colon[1])
		oidclr(&entry->expect, the_repository->hash_algo);
	else if (repo_get_oid(the_repository, 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);
}

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 the name of
 * the remote-tracking branch in *dst_refname, and the name
 * of the commit object at its tip in oid[].
 * If we cannot do so, return negative to signal an error.
 */
static int remote_tracking(struct remote *remote, const char *refname,
			   struct object_id *oid, char **dst_refname)
{
	char *dst;

	if (!remote)
		BUG("remote_tracking() called with NULL remote");
	dst = apply_refspecs(&remote->fetch, refname);
	if (!dst)
		return -1; /* no tracking ref for refname at remote */
	if (refs_read_ref(get_main_ref_store(the_repository), dst, oid)) {
		free(dst);
		return -1; /* we know what the tracking ref is but we cannot read it */
	}

	*dst_refname = dst;
	return 0;
}

struct check_and_collect_until_cb_data {
	struct commit *remote_commit;
	struct commit_stack *local_commits;
	timestamp_t remote_reflog_timestamp;
};

/* Get the timestamp of the latest entry. */
static int peek_reflog(const char *refname UNUSED,
		       struct object_id *o_oid UNUSED,
		       struct object_id *n_oid UNUSED,
		       const char *ident UNUSED,
		       timestamp_t timestamp, int tz UNUSED,
		       const char *message UNUSED, void *cb_data)
{
	timestamp_t *ts = cb_data;
	*ts = timestamp;
	return 1;
}

static int check_and_collect_until(const char *refname UNUSED,
				   struct object_id *o_oid UNUSED,
				   struct object_id *n_oid,
				   const char *ident UNUSED,
				   timestamp_t timestamp, int tz UNUSED,
				   const char *message UNUSED, void *cb_data)
{
	struct commit *commit;
	struct check_and_collect_until_cb_data *cb = cb_data;

	/* An entry was found. */
	if (oideq(n_oid, &cb->remote_commit->object.oid))
		return 1;

	if ((commit = lookup_commit_reference(the_repository, n_oid)))
		commit_stack_push(cb->local_commits, commit);

	/*
	 * If the reflog entry timestamp is older than the remote ref's
	 * latest reflog entry, there is no need to check or collect
	 * entries older than this one.
	 */
	if (timestamp < cb->remote_reflog_timestamp)
		return -1;

	return 0;
}

#define MERGE_BASES_BATCH_SIZE 8

/*
 * Iterate through the reflog of the local ref to check if there is an entry
 * for the given remote-tracking ref; runs until the timestamp of an entry is
 * older than latest timestamp of remote-tracking ref's reflog. Any commits
 * are that seen along the way are collected into an array to check if the
 * remote-tracking ref is reachable from any of them.
 */
static int is_reachable_in_reflog(const char *local, const struct ref *remote)
{
	timestamp_t date;
	struct commit *commit;
	struct commit **chunk;
	struct check_and_collect_until_cb_data cb;
	struct commit_stack arr = COMMIT_STACK_INIT;
	size_t size = 0;
	int ret = 0;

	commit = lookup_commit_reference(the_repository, &remote->old_oid);
	if (!commit)
		goto cleanup_return;

	/*
	 * Get the timestamp from the latest entry
	 * of the remote-tracking ref's reflog.
	 */
	refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
					 remote->tracking_ref, peek_reflog,
					 &date);

	cb.remote_commit = commit;
	cb.local_commits = &arr;
	cb.remote_reflog_timestamp = date;
	ret = refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
					       local, check_and_collect_until,
					       &cb);

	/* We found an entry in the reflog. */
	if (ret > 0)
		goto cleanup_return;

	/*
	 * Check if the remote commit is reachable from any
	 * of the commits in the collected array, in batches.
	 */
	for (chunk = arr.items; chunk < arr.items + arr.nr; chunk += size) {
		size = arr.items + arr.nr - chunk;
		if (MERGE_BASES_BATCH_SIZE < size)
			size = MERGE_BASES_BATCH_SIZE;

		if ((ret = repo_in_merge_bases_many(the_repository, commit, size, chunk, 0)))
			break;
	}

cleanup_return:
	commit_stack_clear(&arr);
	return ret;
}

/*
 * Check for reachability of a remote-tracking
 * ref in the reflog entries of its local ref.
 */
static void check_if_includes_upstream(struct ref *remote)
{
	struct ref *local = get_local_ref(remote->name);
	if (!local)
		return;

	if (is_reachable_in_reflog(local->name, remote) <= 0)
		remote->unreachable = 1;
	free_one_ref(local);
}

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];
		if (!refname_match(entry->refname, ref->name))
			continue;
		ref->expect_old_sha1 = 1;
		if (!entry->use_tracking)
			oidcpy(&ref->old_oid_expect, &entry->expect);
		else if (remote_tracking(remote, ref->name,
					 &ref->old_oid_expect,
					 &ref->tracking_ref))
			oidclr(&ref->old_oid_expect, the_repository->hash_algo);
		else
			ref->check_reachable = cas->use_force_if_includes;
		return;
	}

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

	ref->expect_old_sha1 = 1;
	if (remote_tracking(remote, ref->name,
			    &ref->old_oid_expect,
			    &ref->tracking_ref))
		oidclr(&ref->old_oid_expect, the_repository->hash_algo);
	else
		ref->check_reachable = cas->use_force_if_includes;
}

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);

		/*
		 * If "compare-and-swap" is in "use_tracking[_for_rest]"
		 * mode, and if "--force-if-includes" was specified, run
		 * the check.
		 */
		if (ref->check_reachable)
			check_if_includes_upstream(ref);
	}
}

struct remote_state *remote_state_new(void)
{
	struct remote_state *r;

	CALLOC_ARRAY(r, 1);

	hashmap_init(&r->remotes_hash, remotes_hash_cmp, NULL, 0);
	hashmap_init(&r->branches_hash, branches_hash_cmp, NULL, 0);
	return r;
}

void remote_state_clear(struct remote_state *remote_state)
{
	struct hashmap_iter iter;
	struct branch *b;
	int i;

	for (i = 0; i < remote_state->remotes_nr; i++)
		remote_clear(remote_state->remotes[i]);
	FREE_AND_NULL(remote_state->remotes);
	FREE_AND_NULL(remote_state->pushremote_name);
	remote_state->remotes_alloc = 0;
	remote_state->remotes_nr = 0;

	rewrites_release(&remote_state->rewrites);
	rewrites_release(&remote_state->rewrites_push);

	hashmap_clear_and_free(&remote_state->remotes_hash, struct remote, ent);
	hashmap_for_each_entry(&remote_state->branches_hash, &iter, b, ent) {
		branch_release(b);
		free(b);
	}
	hashmap_clear(&remote_state->branches_hash);
}

/*
 * Returns 1 if it was the last chop before ':'.
 */
static int chop_last_dir(char **remoteurl, int is_relative)
{
	char *rfind = find_last_dir_sep(*remoteurl);
	if (rfind) {
		*rfind = '\0';
		return 0;
	}

	rfind = strrchr(*remoteurl, ':');
	if (rfind) {
		*rfind = '\0';
		return 1;
	}

	if (is_relative || !strcmp(".", *remoteurl))
		die(_("cannot strip one component off url '%s'"),
			*remoteurl);

	free(*remoteurl);
	*remoteurl = xstrdup(".");
	return 0;
}

char *relative_url(const char *remote_url, const char *url,
		   const char *up_path)
{
	int is_relative = 0;
	int colonsep = 0;
	char *out;
	char *remoteurl;
	struct strbuf sb = STRBUF_INIT;
	size_t len;

	if (!url_is_local_not_ssh(url) || is_absolute_path(url))
		return xstrdup(url);

	len = strlen(remote_url);
	if (!len)
		BUG("invalid empty remote_url");

	remoteurl = xstrdup(remote_url);
	if (is_dir_sep(remoteurl[len-1]))
		remoteurl[len-1] = '\0';

	if (!url_is_local_not_ssh(remoteurl) || is_absolute_path(remoteurl))
		is_relative = 0;
	else {
		is_relative = 1;
		/*
		 * Prepend a './' to ensure all relative
		 * remoteurls start with './' or '../'
		 */
		if (!starts_with_dot_slash_native(remoteurl) &&
		    !starts_with_dot_dot_slash_native(remoteurl)) {
			strbuf_reset(&sb);
			strbuf_addf(&sb, "./%s", remoteurl);
			free(remoteurl);
			remoteurl = strbuf_detach(&sb, NULL);
		}
	}
	/*
	 * When the url starts with '../', remove that and the
	 * last directory in remoteurl.
	 */
	while (*url) {
		if (starts_with_dot_dot_slash_native(url)) {
			url += 3;
			colonsep |= chop_last_dir(&remoteurl, is_relative);
		} else if (starts_with_dot_slash_native(url))
			url += 2;
		else
			break;
	}
	strbuf_reset(&sb);
	strbuf_addf(&sb, "%s%s%s", remoteurl, colonsep ? ":" : "/", url);
	if (ends_with(url, "/"))
		strbuf_setlen(&sb, sb.len - 1);
	free(remoteurl);

	if (starts_with_dot_slash_native(sb.buf))
		out = xstrdup(sb.buf + 2);
	else
		out = xstrdup(sb.buf);

	if (!up_path || !is_relative) {
		strbuf_release(&sb);
		return out;
	}

	strbuf_reset(&sb);
	strbuf_addf(&sb, "%s%s", up_path, out);
	free(out);
	return strbuf_detach(&sb, NULL);
}

int valid_remote_name(const char *name)
{
	int result;
	struct strbuf refspec = STRBUF_INIT;
	strbuf_addf(&refspec, "refs/heads/test:refs/remotes/%s/test", name);
	result = valid_fetch_refspec(refspec.buf, the_hash_algo);
	strbuf_release(&refspec);
	return result;
}
