Skip to content

Commit

Permalink
remote: add struct repository parameter to external functions
Browse files Browse the repository at this point in the history
Finish plumbing remote_state by adding a struct repository
parameter to repo_* functions. While this removes all references to
the_repository->remote_state, certain functions still use the_repository
to parse oids.

Signed-off-by: Glen Choo <chooglen@google.com>
  • Loading branch information
chooglen committed Oct 18, 2021
1 parent 44551fe commit 9527d91
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 44 deletions.
74 changes: 40 additions & 34 deletions remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -528,9 +528,11 @@ const char *remote_ref_for_branch(struct branch *branch, int for_push)
return branch->merge_name[0];
}
} else {
const char *dst, *remote_name =
pushremote_for_branch(branch, NULL);
struct remote *remote = remote_get(remote_name);
const char *dst,
*remote_name = pushremote_for_branch(
branch, NULL);
struct remote *remote =
repo_remote_get(branch->repo, remote_name);

if (remote && remote->push.nr &&
(dst = apply_refspecs(&remote->push,
Expand All @@ -542,21 +544,21 @@ const char *remote_ref_for_branch(struct branch *branch, int for_push)
return NULL;
}

static struct remote *remote_get_1(const char *name,
static struct remote *repo_remote_get_1(struct repository *repo, const char *name,
const char *(*get_default)(struct branch *, int *))
{
struct remote *ret;
int name_given = 0;

read_config(the_repository);
read_config(repo);

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

ret = make_remote(the_repository, name, 0);
ret = make_remote(repo, name, 0);
if (valid_remote_nick(name) && have_git_dir()) {
if (!valid_remote(ret))
read_remotes_file(ret);
Expand All @@ -570,14 +572,14 @@ static struct remote *remote_get_1(const char *name,
return ret;
}

struct remote *remote_get(const char *name)
struct remote *repo_remote_get(struct repository *repo, const char *name)
{
return remote_get_1(name, remote_for_branch);
return repo_remote_get_1(repo, name, remote_for_branch);
}

struct remote *pushremote_get(const char *name)
struct remote *repo_pushremote_get(struct repository *repo, const char *name)
{
return remote_get_1(name, pushremote_for_branch);
return repo_remote_get_1(repo, name, pushremote_for_branch);
}

int remote_is_configured(struct remote *remote, int in_repo)
Expand All @@ -589,14 +591,14 @@ int remote_is_configured(struct remote *remote, int in_repo)
return !!remote->origin;
}

int for_each_remote(each_remote_fn fn, void *priv)
int repo_for_each_remote(struct repository *repo, each_remote_fn fn, void *priv)
{
int i, result = 0;
read_config(the_repository);
for (i = 0; i < the_repository->remote_state->remotes_nr && !result;
read_config(repo);
for (i = 0; i < repo->remote_state->remotes_nr && !result;
i++) {
struct remote *remote =
the_repository->remote_state->remotes[i];
repo->remote_state->remotes[i];
if (!remote)
continue;
result = fn(remote, priv);
Expand Down Expand Up @@ -1664,7 +1666,7 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
}
}

static void set_merge(struct branch *ret)
static void set_merge(struct repository *repository, struct branch *ret)
{
struct remote *remote;
char *ref;
Expand All @@ -1684,7 +1686,7 @@ static void set_merge(struct branch *ret)
return;
}

remote = remote_get(ret->remote_name);
remote = repo_remote_get(repository, ret->remote_name);

CALLOC_ARRAY(ret->merge, ret->merge_nr);
for (i = 0; i < ret->merge_nr; i++) {
Expand All @@ -1701,17 +1703,16 @@ static void set_merge(struct branch *ret)
}
}

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

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

Expand Down Expand Up @@ -1782,11 +1783,12 @@ static const char *tracking_for_push_dest(struct remote *remote,
return ret;
}

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

remote = remote_get(pushremote_for_branch(branch, NULL));
remote = repo_remote_get(branch->repo, pushremote_for_branch(branch, NULL));
if (!remote)
return error_buf(err,
_("branch '%s' has no remote for pushing"),
Expand Down Expand Up @@ -1842,13 +1844,15 @@ static const char *branch_get_push_1(struct branch *branch, struct strbuf *err)
BUG("unhandled push situation");
}

const char *branch_get_push(struct branch *branch, struct strbuf *err)
const char *branch_get_push(struct branch *branch,
struct strbuf *err)
{
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(branch, err);
branch->push_tracking_ref =
branch_get_push_1(branch, err);
return branch->push_tracking_ref;
}

Expand Down Expand Up @@ -2101,15 +2105,16 @@ static int stat_branch_pair(const char *branch_name, const char *base,
* 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)
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);
branch_get_upstream(branch, NULL);
if (tracking_name)
*tracking_name = base;
if (!base)
Expand All @@ -2121,15 +2126,16 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
/*
* 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 format_tracking_info(struct branch *branch,
struct strbuf *sb, enum ahead_behind_flags abf)
{
int ours, theirs, sti;
const char *full_base;
char *base;
int upstream_is_gone = 0;

sti = stat_tracking_info(branch, &ours, &theirs, &full_base, 0, abf);
sti = stat_tracking_info(branch, &ours, &theirs, &full_base,
0, abf);
if (sti < 0) {
if (!full_base)
return 0;
Expand Down
40 changes: 30 additions & 10 deletions remote.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,15 +122,28 @@ struct remote {
* remote_get(NULL) will return the default remote, given the current branch
* and configuration.
*/
struct remote *remote_get(const char *name);

struct remote *pushremote_get(const char *name);
struct remote *repo_remote_get(struct repository *repo, const char *name);
static inline struct remote *remote_get(const char *name)
{
return repo_remote_get(the_repository, name);
}

struct remote *repo_pushremote_get(struct repository *repo, const char *name);
static inline struct remote *pushremote_get(const char *name)
{
return repo_pushremote_get(the_repository, name);
}
int remote_is_configured(struct remote *remote, int in_repo);

typedef int each_remote_fn(struct remote *remote, void *priv);

/* iterate through struct remotes */
int for_each_remote(each_remote_fn fn, void *priv);
int repo_for_each_remote(struct repository *repo, each_remote_fn fn,
void *priv);
static inline int for_each_remote(each_remote_fn fn, void *priv)
{
return repo_for_each_remote(the_repository, fn, priv);
}

int remote_has_url(struct remote *remote, const char *url);

Expand Down Expand Up @@ -328,9 +341,15 @@ struct branch {
struct repository *repo;
};

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

const char *remote_for_branch(struct branch *branch, int *explicit);
const char *pushremote_for_branch(struct branch *branch, int *explicit);

const char *remote_ref_for_branch(struct branch *branch, int for_push);

/* returns true if the given branch has merge configuration given. */
Expand Down Expand Up @@ -374,11 +393,12 @@ enum ahead_behind_flags {
};

/* Reporting of tracking info */
int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
const char **upstream_name, int for_push,
enum ahead_behind_flags abf);
int format_tracking_info(struct branch *branch, struct strbuf *sb,
enum ahead_behind_flags abf);
int stat_tracking_info(struct branch *branch,
int *num_ours, int *num_theirs,
const char **upstream_name, int for_push,
enum ahead_behind_flags abf);

int format_tracking_info(struct branch *branch, struct strbuf *sb, enum ahead_behind_flags abf);

struct ref *get_local_heads(void);
/*
Expand Down

0 comments on commit 9527d91

Please sign in to comment.