@@ -183,12 +183,13 @@ int read_branch_desc(struct strbuf *buf, const char *branch_name)
* Return 1 if the named branch already exists; return 0 otherwise.
* Fill ref with the full refname for the branch.
*/
-int validate_branchname(const char *name, struct strbuf *ref)
+int validate_branchname(struct repository *r, const char *name,
+ struct strbuf *ref)
{
if (strbuf_check_branch_ref(ref, name))
die(_("'%s' is not a valid branch name."), name);
- return ref_exists(ref->buf);
+ return ref_exists(r, ref->buf);
}
/*
@@ -197,11 +198,12 @@ int validate_branchname(const char *name, struct strbuf *ref)
* Return 1 if the named branch already exists; return 0 otherwise.
* Fill ref with the full refname for the branch.
*/
-int validate_new_branchname(const char *name, struct strbuf *ref, int force)
+int validate_new_branchname(struct repository *r, const char *name,
+ struct strbuf *ref, int force)
{
const char *head;
- if (!validate_branchname(name, ref))
+ if (!validate_branchname(r, name, ref))
return 0;
if (!force)
@@ -260,8 +262,8 @@ void create_branch(struct repository *r,
explicit_tracking = 1;
if ((track == BRANCH_TRACK_OVERRIDE || clobber_head_ok)
- ? validate_branchname(name, &ref)
- : validate_new_branchname(name, &ref, force)) {
+ ? validate_branchname(r, name, &ref)
+ : validate_new_branchname(r, name, &ref, force)) {
if (!force)
dont_change_ref = 1;
else
@@ -50,7 +50,8 @@ void create_branch(struct repository *r,
* Return 1 if the named branch already exists; return 0 otherwise.
* Fill ref with the full refname for the branch.
*/
-int validate_branchname(const char *name, struct strbuf *ref);
+int validate_branchname(struct repository *r, const char *name,
+ struct strbuf *ref);
/*
* Check if a branch 'name' can be created as a new branch; die otherwise.
@@ -58,7 +59,8 @@ int validate_branchname(const char *name, struct strbuf *ref);
* Return 1 if the named branch already exists; return 0 otherwise.
* Fill ref with the full refname for the branch.
*/
-int validate_new_branchname(const char *name, struct strbuf *ref, int force);
+int validate_new_branchname(struct repository *r, const char *name,
+ struct strbuf *ref, int force);
/*
* Remove information about the merge state on the current
@@ -336,7 +336,7 @@ static int bisect_next_check(const struct bisect_terms *terms,
char *bad_ref = xstrfmt("refs/bisect/%s", terms->term_bad);
char *good_glob = xstrfmt("%s-*", terms->term_good);
- if (ref_exists(bad_ref))
+ if (ref_exists(the_repository, bad_ref))
missing_bad = 0;
for_each_glob_ref_in(mark_good, good_glob, "refs/bisect/",
@@ -126,7 +126,8 @@ static int branch_merged(int kind, const char *name,
if (kind == FILTER_REFS_BRANCHES) {
struct branch *branch = branch_get(name);
- const char *upstream = branch_get_upstream(branch, NULL);
+ const char *upstream =
+ branch_get_upstream(the_repository, branch, NULL);
struct object_id oid;
if (upstream &&
@@ -428,12 +429,13 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
if (verify_ref_format(format))
die(_("unable to parse format string"));
- ref_array_sort(sorting, &array);
+ ref_array_sort(the_repository, sorting, &array);
for (i = 0; i < array.nr; i++) {
struct strbuf out = STRBUF_INIT;
struct strbuf err = STRBUF_INIT;
- if (format_ref_array_item(array.items[i], format, &out, &err))
+ if (format_ref_array_item(the_repository, array.items[i],
+ format, &out, &err))
die("%s", err.buf);
if (column_active(colopts)) {
assert(!filter->verbose && "--column and --verbose are incompatible");
@@ -509,7 +511,7 @@ static void copy_or_rename_branch(const char *oldname, const char *newname, int
* Bad name --- this could be an attempt to rename a
* ref that we used to allow to be created by accident.
*/
- if (ref_exists(oldref.buf))
+ if (ref_exists(the_repository, oldref.buf))
recovery = 1;
else
die(_("Invalid branch name: '%s'"), oldname);
@@ -520,9 +522,10 @@ static void copy_or_rename_branch(const char *oldname, const char *newname, int
* cause the worktree to become inconsistent with HEAD, so allow it.
*/
if (!strcmp(oldname, newname))
- validate_branchname(newname, &newref);
+ validate_branchname(the_repository, newname, &newref);
else
- validate_new_branchname(newname, &newref, force);
+ validate_new_branchname(the_repository, newname, &newref,
+ force);
reject_rebase_or_bisect_branch(oldref.buf);
@@ -756,7 +759,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
die(_("cannot edit description of more than one branch"));
strbuf_addf(&branch_ref, "refs/heads/%s", branch_name);
- if (!ref_exists(branch_ref.buf)) {
+ if (!ref_exists(the_repository, branch_ref.buf)) {
strbuf_release(&branch_ref);
if (!argc)
@@ -802,7 +805,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
die(_("no such branch '%s'"), argv[0]);
}
- if (!ref_exists(branch->refname))
+ if (!ref_exists(the_repository, branch->refname))
die(_("branch '%s' does not exist"), branch->name);
/*
@@ -832,7 +832,8 @@ static void report_tracking(struct branch_info *new_branch_info)
struct strbuf sb = STRBUF_INIT;
struct branch *branch = branch_get(new_branch_info->name);
- if (!format_tracking_info(branch, &sb, AHEAD_BEHIND_FULL))
+ if (!format_tracking_info(the_repository, branch, &sb,
+ AHEAD_BEHIND_FULL))
return;
fputs(sb.buf, stdout);
strbuf_release(&sb);
@@ -923,7 +924,9 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
}
}
if (old_branch_info->path && old_branch_info->name) {
- if (!ref_exists(old_branch_info->path) && reflog_exists(old_branch_info->path))
+ if (!ref_exists(the_repository,
+ old_branch_info->path) &&
+ reflog_exists(old_branch_info->path))
delete_reflog(old_branch_info->path);
}
}
@@ -1728,10 +1731,11 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
struct strbuf buf = STRBUF_INIT;
if (opts->new_branch_force)
- opts->branch_exists = validate_branchname(opts->new_branch, &buf);
+ opts->branch_exists = validate_branchname(
+ the_repository, opts->new_branch, &buf);
else
- opts->branch_exists =
- validate_new_branchname(opts->new_branch, &buf, 0);
+ opts->branch_exists = validate_new_branchname(
+ the_repository, opts->new_branch, &buf, 0);
strbuf_release(&buf);
}
@@ -538,7 +538,7 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int
s->ignore_submodule_arg = ignore_submodule_arg;
wt_status_collect(s);
- wt_status_print(s);
+ wt_status_print(the_repository, s);
wt_status_collect_free_buffers(s);
return s->committable;
@@ -1457,7 +1457,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
if (s.relative_paths)
s.prefix = prefix;
- wt_status_print(&s);
+ wt_status_print(the_repository, &s);
wt_status_collect_free_buffers(&s);
return 0;
@@ -76,12 +76,12 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
filter.name_patterns = argv;
filter.match_as_path = 1;
filter_refs(&array, &filter, FILTER_REFS_ALL | FILTER_REFS_INCLUDE_BROKEN);
- ref_array_sort(sorting, &array);
+ ref_array_sort(the_repository, sorting, &array);
if (!maxcount || array.nr < maxcount)
maxcount = array.nr;
for (i = 0; i < maxcount; i++)
- show_ref_array_item(array.items[i], &format);
+ show_ref_array_item(the_repository, array.items[i], &format);
ref_array_clear(&array);
return 0;
}
@@ -1445,7 +1445,8 @@ static struct commit *get_base_commit(const char *base_commit,
die(_("unknown commit %s"), base_commit);
} else if ((base_commit && !strcmp(base_commit, "auto"))) {
struct branch *curr_branch = branch_get(NULL);
- const char *upstream = branch_get_upstream(curr_branch, NULL);
+ const char *upstream =
+ branch_get_upstream(the_repository, curr_branch, NULL);
if (upstream) {
struct commit_list *base_list;
struct commit *commit;
@@ -2201,7 +2202,8 @@ int cmd_cherry(int argc, const char **argv, const char *prefix)
break;
default:
current_branch = branch_get(NULL);
- upstream = branch_get_upstream(current_branch, NULL);
+ upstream = branch_get_upstream(the_repository, current_branch,
+ NULL);
if (!upstream) {
fprintf(stderr, _("Could not find a tracked"
" remote branch, please"
@@ -136,7 +136,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
}
if (sorting)
- ref_array_sort(sorting, &ref_array);
+ ref_array_sort(the_repository, sorting, &ref_array);
for (i = 0; i < ref_array.nr; i++) {
const struct ref_array_item *ref = ref_array.items[i];
@@ -549,7 +549,7 @@ static void merge_name(const char *remote, struct strbuf *msg)
struct strbuf truname = STRBUF_INIT;
strbuf_addf(&truname, "refs/heads/%s", remote);
strbuf_setlen(&truname, truname.len - len);
- if (ref_exists(truname.buf)) {
+ if (ref_exists(the_repository, truname.buf)) {
strbuf_addf(msg,
"%s\t\tbranch '%s'%s of .\n",
oid_to_hex(&remote_head->object.oid),
@@ -736,7 +736,7 @@ static const char *get_upstream_branch(const char *remote)
if (strcmp(curr_branch_remote, rm->name))
return NULL;
- return branch_get_upstream(curr_branch, NULL);
+ return branch_get_upstream(the_repository, curr_branch, NULL);
}
/**
@@ -1800,8 +1800,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
struct branch *branch;
branch = branch_get(NULL);
- options.upstream_name = branch_get_upstream(branch,
- NULL);
+ options.upstream_name = branch_get_upstream(
+ the_repository, branch, NULL);
if (!options.upstream_name)
error_on_missing_default_upstream();
if (fork_point < 0)
@@ -1151,7 +1151,7 @@ static const char *update(struct command *cmd, struct shallow_info *si)
struct strbuf err = STRBUF_INIT;
if (!parse_object(the_repository, old_oid)) {
old_oid = NULL;
- if (ref_exists(name)) {
+ if (ref_exists(the_repository, name)) {
rp_warning("Allowing deletion of corrupt ref.");
} else {
rp_warning("Deleting a non-existent ref.");
@@ -358,7 +358,8 @@ static int get_ref_states(const struct ref *remote_refs, struct ref_states *stat
states->tracked.strdup_strings = 1;
states->stale.strdup_strings = 1;
for (ref = fetch_map; ref; ref = ref->next) {
- if (!ref->peer_ref || !ref_exists(ref->peer_ref->name))
+ if (!ref->peer_ref ||
+ !ref_exists(the_repository, ref->peer_ref->name))
string_list_append(&states->new_refs, abbrev_branch(ref->name));
else
string_list_append(&states->tracked, abbrev_branch(ref->name));
@@ -1353,7 +1354,7 @@ static int set_head(int argc, const char **argv)
if (head_name) {
strbuf_addf(&buf2, "refs/remotes/%s/%s", argv[0], head_name);
/* make sure it's valid */
- if (!ref_exists(buf2.buf))
+ if (!ref_exists(the_repository, buf2.buf))
result |= error(_("Not a valid ref: %s"), buf2.buf);
else if (create_symref(buf.buf, buf2.buf, "remote set-head"))
result |= error(_("Could not setup %s"), buf.buf);
@@ -157,7 +157,7 @@ static int get_stash_info(struct stash_info *info, int argc, const char **argv)
strbuf_init(&info->revision, 0);
if (!commit) {
- if (!ref_exists(ref_stash)) {
+ if (!ref_exists(the_repository, ref_stash)) {
free_stash_info(info);
fprintf_ln(stderr, _("No stash entries found."));
return -1;
@@ -688,7 +688,7 @@ static int list_stash(int argc, const char **argv, const char *prefix)
git_stash_list_usage,
PARSE_OPT_KEEP_UNKNOWN);
- if (!ref_exists(ref_stash))
+ if (!ref_exists(the_repository, ref_stash))
return 0;
cp.git_cmd = 1;
@@ -61,10 +61,10 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting,
die(_("unable to parse format string"));
filter->with_commit_tag_algo = 1;
filter_refs(&array, filter, FILTER_REFS_TAGS);
- ref_array_sort(sorting, &array);
+ ref_array_sort(the_repository, sorting, &array);
for (i = 0; i < array.nr; i++)
- show_ref_array_item(array.items[i], format);
+ show_ref_array_item(the_repository, array.items[i], format);
ref_array_clear(&array);
free(to_free);
@@ -121,7 +121,7 @@ static int verify_tag(const char *name, const char *ref,
return -1;
if (format->format)
- pretty_print_ref(name, oid, format);
+ pretty_print_ref(the_repository, name, oid, format);
return 0;
}
@@ -71,7 +71,7 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)
}
if (format.format)
- pretty_print_ref(name, &oid, &format);
+ pretty_print_ref(the_repository, name, &oid, &format);
}
return had_error;
}
@@ -273,7 +273,7 @@ static int add_worktree(const char *path, const char *refname,
/* is 'refname' a branch or commit? */
if (!opts->detach && !strbuf_check_branch_ref(&symref, refname) &&
- ref_exists(symref.buf)) {
+ ref_exists(the_repository, symref.buf)) {
is_branch = 1;
if (!opts->force)
die_if_checked_out(symref.buf, 0);
@@ -442,7 +442,7 @@ static void print_preparing_worktree_line(int detach,
} else {
struct strbuf s = STRBUF_INIT;
if (!detach && !strbuf_check_branch_ref(&s, branch) &&
- ref_exists(s.buf))
+ ref_exists(the_repository, s.buf))
printf_ln(_("Preparing worktree (checking out '%s')"),
branch);
else {
@@ -465,7 +465,7 @@ static const char *dwim_branch(const char *path, const char **new_branch)
UNLEAK(branchname);
if (!strbuf_check_branch_ref(&ref, branchname) &&
- ref_exists(ref.buf)) {
+ ref_exists(the_repository, ref.buf)) {
strbuf_release(&ref);
return branchname;
}
@@ -529,7 +529,7 @@ static int add(int ac, const char **av, const char *prefix)
if (!opts.force &&
!strbuf_check_branch_ref(&symref, new_branch) &&
- ref_exists(symref.buf))
+ ref_exists(the_repository, symref.buf))
die_if_checked_out(symref.buf, 0);
strbuf_release(&symref);
}
@@ -1412,14 +1412,15 @@ static const char *show_ref(struct refname_atom *atom, const char *refname)
return xstrdup(refname);
}
-static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
+static void fill_remote_ref_details(struct repository *r,
+ struct used_atom *atom, const char *refname,
struct branch *branch, const char **s)
{
int num_ours, num_theirs;
if (atom->u.remote_ref.option == RR_REF)
*s = show_ref(&atom->u.remote_ref.refname, refname);
else if (atom->u.remote_ref.option == RR_TRACK) {
- if (stat_tracking_info(branch, &num_ours, &num_theirs,
+ if (stat_tracking_info(r, branch, &num_ours, &num_theirs,
NULL, atom->u.remote_ref.push,
AHEAD_BEHIND_FULL) < 0) {
*s = xstrdup(msgs.gone);
@@ -1438,7 +1439,7 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
free((void *)to_free);
}
} else if (atom->u.remote_ref.option == RR_TRACKSHORT) {
- if (stat_tracking_info(branch, &num_ours, &num_theirs,
+ if (stat_tracking_info(r, branch, &num_ours, &num_theirs,
NULL, atom->u.remote_ref.push,
AHEAD_BEHIND_FULL) < 0) {
*s = xstrdup("");
@@ -1605,7 +1606,8 @@ static char *get_worktree_path(const struct used_atom *atom, const struct ref_ar
/*
* Parse the object referred by ref, and grab needed value.
*/
-static int populate_value(struct ref_array_item *ref, struct strbuf *err)
+static int populate_value(struct repository *r, struct ref_array_item *ref,
+ struct strbuf *err)
{
struct object *obj;
int i;
@@ -1658,9 +1660,10 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
}
branch = branch_get(branch_name);
- refname = branch_get_upstream(branch, NULL);
+ refname = branch_get_upstream(r, branch, NULL);
if (refname)
- fill_remote_ref_details(atom, refname, branch, &v->s);
+ fill_remote_ref_details(r, atom, refname,
+ branch, &v->s);
else
v->s = xstrdup("");
continue;
@@ -1675,13 +1678,14 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
if (atom->u.remote_ref.push_remote)
refname = NULL;
else {
- refname = branch_get_push(branch, NULL);
+ refname = branch_get_push(r, branch, NULL);
if (!refname)
continue;
}
/* We will definitely re-init v->s on the next line. */
free((char *)v->s);
- fill_remote_ref_details(atom, refname, branch, &v->s);
+ fill_remote_ref_details(r, atom, refname, branch,
+ &v->s);
continue;
} else if (starts_with(name, "color:")) {
v->s = xstrdup(atom->u.color);
@@ -1785,11 +1789,12 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
* Given a ref, return the value for the atom. This lazily gets value
* out of the object by calling populate value.
*/
-static int get_ref_atom_value(struct ref_array_item *ref, int atom,
- struct atom_value **v, struct strbuf *err)
+static int get_ref_atom_value(struct repository *r, struct ref_array_item *ref,
+ int atom, struct atom_value **v,
+ struct strbuf *err)
{
if (!ref->value) {
- if (populate_value(ref, err))
+ if (populate_value(r, ref, err))
return -1;
fill_missing_values(ref->value);
}
@@ -2273,7 +2278,8 @@ int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int
return ret;
}
-static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, struct ref_array_item *b)
+static int cmp_ref_sorting(struct repository *r, struct ref_sorting *s,
+ struct ref_array_item *a, struct ref_array_item *b)
{
struct atom_value *va, *vb;
int cmp;
@@ -2281,9 +2287,9 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru
int (*cmp_fn)(const char *, const char *);
struct strbuf err = STRBUF_INIT;
- if (get_ref_atom_value(a, s->atom, &va, &err))
+ if (get_ref_atom_value(r, a, s->atom, &va, &err))
die("%s", err.buf);
- if (get_ref_atom_value(b, s->atom, &vb, &err))
+ if (get_ref_atom_value(r, b, s->atom, &vb, &err))
die("%s", err.buf);
strbuf_release(&err);
cmp_fn = s->ignore_case ? strcasecmp : strcmp;
@@ -2303,18 +2309,25 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru
return (s->reverse) ? -cmp : cmp;
}
-static int compare_refs(const void *a_, const void *b_, void *ref_sorting)
+struct ref_sorting_internal {
+ struct repository *r;
+ struct ref_sorting *s;
+};
+
+static int compare_refs(const void *a_, const void *b_, void *data)
{
struct ref_array_item *a = *((struct ref_array_item **)a_);
struct ref_array_item *b = *((struct ref_array_item **)b_);
+ struct ref_sorting_internal *s_internal = data;
+ struct repository *r = s_internal->r;
struct ref_sorting *s;
- for (s = ref_sorting; s; s = s->next) {
- int cmp = cmp_ref_sorting(s, a, b);
+ for (s = s_internal->s; s; s = s->next) {
+ int cmp = cmp_ref_sorting(r, s, a, b);
if (cmp)
return cmp;
}
- s = ref_sorting;
+ s = s_internal->s;
return s && s->ignore_case ?
strcasecmp(a->refname, b->refname) :
strcmp(a->refname, b->refname);
@@ -2326,9 +2339,12 @@ void ref_sorting_icase_all(struct ref_sorting *sorting, int flag)
sorting->ignore_case = !!flag;
}
-void ref_array_sort(struct ref_sorting *sorting, struct ref_array *array)
+void ref_array_sort(struct repository *r, struct ref_sorting *sorting,
+ struct ref_array *array)
{
- QSORT_S(array->items, array->nr, compare_refs, sorting);
+ struct ref_sorting_internal data = { r, sorting };
+
+ QSORT_S(array->items, array->nr, compare_refs, &data);
}
static void append_literal(const char *cp, const char *ep, struct ref_formatting_state *state)
@@ -2353,10 +2369,10 @@ static void append_literal(const char *cp, const char *ep, struct ref_formatting
}
}
-int format_ref_array_item(struct ref_array_item *info,
- const struct ref_format *format,
- struct strbuf *final_buf,
- struct strbuf *error_buf)
+int format_ref_array_item(struct repository *r, struct ref_array_item *info,
+ const struct ref_format *format,
+ struct strbuf *final_buf,
+ struct strbuf *error_buf)
{
const char *cp, *sp, *ep;
struct ref_formatting_state state = REF_FORMATTING_STATE_INIT;
@@ -2372,7 +2388,8 @@ int format_ref_array_item(struct ref_array_item *info,
if (cp < sp)
append_literal(cp, sp, &state);
pos = parse_ref_filter_atom(format, sp + 2, ep, error_buf);
- if (pos < 0 || get_ref_atom_value(info, pos, &atomv, error_buf) ||
+ if (pos < 0 ||
+ get_ref_atom_value(r, info, pos, &atomv, error_buf) ||
atomv->handler(atomv, &state, error_buf)) {
pop_stack_element(&state.stack);
return -1;
@@ -2399,13 +2416,13 @@ int format_ref_array_item(struct ref_array_item *info,
return 0;
}
-void show_ref_array_item(struct ref_array_item *info,
+void show_ref_array_item(struct repository *r, struct ref_array_item *info,
const struct ref_format *format)
{
struct strbuf final_buf = STRBUF_INIT;
struct strbuf error_buf = STRBUF_INIT;
- if (format_ref_array_item(info, format, &final_buf, &error_buf))
+ if (format_ref_array_item(r, info, format, &final_buf, &error_buf))
die("%s", error_buf.buf);
fwrite(final_buf.buf, 1, final_buf.len, stdout);
strbuf_release(&error_buf);
@@ -2413,13 +2430,14 @@ void show_ref_array_item(struct ref_array_item *info,
putchar('\n');
}
-void pretty_print_ref(const char *name, const struct object_id *oid,
+void pretty_print_ref(struct repository *r, const char *name,
+ const struct object_id *oid,
const struct ref_format *format)
{
struct ref_array_item *ref_item;
ref_item = new_ref_array_item(name, oid);
ref_item->kind = ref_kind_from_refname(name);
- show_ref_array_item(ref_item, format);
+ show_ref_array_item(r, ref_item, format);
free_array_item(ref_item);
}
@@ -113,16 +113,18 @@ void ref_array_clear(struct ref_array *array);
/* Used to verify if the given format is correct and to parse out the used atoms */
int verify_ref_format(struct ref_format *format);
/* Sort the given ref_array as per the ref_sorting provided */
-void ref_array_sort(struct ref_sorting *sort, struct ref_array *array);
+void ref_array_sort(struct repository *r, struct ref_sorting *sort,
+ struct ref_array *array);
/* Set the ignore_case flag for all elements of a sorting list */
void ref_sorting_icase_all(struct ref_sorting *sorting, int flag);
/* Based on the given format and quote_style, fill the strbuf */
-int format_ref_array_item(struct ref_array_item *info,
+int format_ref_array_item(struct repository *r, struct ref_array_item *info,
const struct ref_format *format,
struct strbuf *final_buf,
struct strbuf *error_buf);
/* Print the ref using the given format and quote_style */
-void show_ref_array_item(struct ref_array_item *info, const struct ref_format *format);
+void show_ref_array_item(struct repository *r, struct ref_array_item *info,
+ const struct ref_format *format);
/* Parse a single sort specifier and add it to the list */
void parse_ref_sorting(struct ref_sorting **sorting_tail, const char *atom);
/* Callback function for parsing the sort option */
@@ -140,7 +142,8 @@ void setup_ref_filter_porcelain_msg(void);
* Print a single ref, outside of any ref-filter. Note that the
* name must be a fully qualified refname.
*/
-void pretty_print_ref(const char *name, const struct object_id *oid,
+void pretty_print_ref(struct repository *r, const char *name,
+ const struct object_id *oid,
const struct ref_format *format);
/*
@@ -316,9 +316,9 @@ static int refs_ref_exists(struct ref_store *refs, const char *refname)
return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING, NULL, NULL);
}
-int ref_exists(const char *refname)
+int ref_exists(struct repository *r, const char *refname)
{
- return refs_ref_exists(get_main_ref_store(the_repository), refname);
+ return refs_ref_exists(get_main_ref_store(r), refname);
}
static int filter_refs(const char *refname, const struct object_id *oid,
@@ -105,7 +105,7 @@ int refs_verify_refname_available(struct ref_store *refs,
const struct string_list *skip,
struct strbuf *err);
-int ref_exists(const char *refname);
+int ref_exists(struct repository *r, const char *refname);
int should_autocreate_reflog(const char *refname);
@@ -1604,7 +1604,8 @@ static const char *error_buf(struct strbuf *err, const char *fmt, ...)
return NULL;
}
-const char *branch_get_upstream(struct branch *branch, struct strbuf *err)
+const char *branch_get_upstream(struct repository *r, struct branch *branch,
+ struct strbuf *err)
{
if (!branch)
return error_buf(err, _("HEAD does not point to a branch"));
@@ -1615,7 +1616,7 @@ const char *branch_get_upstream(struct branch *branch, struct strbuf *err)
* or because it is not a real branch, and get_branch
* auto-vivified it?
*/
- if (!ref_exists(branch->refname))
+ if (!ref_exists(r, branch->refname))
return error_buf(err, _("no such branch: '%s'"),
branch->name);
return error_buf(err,
@@ -1645,7 +1646,8 @@ 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 repository *r,
+ struct branch *branch, struct strbuf *err)
{
struct remote *remote;
@@ -1682,14 +1684,14 @@ static const char *branch_get_push_1(struct branch *branch, struct strbuf *err)
return tracking_for_push_dest(remote, branch->refname, err);
case PUSH_DEFAULT_UPSTREAM:
- return branch_get_upstream(branch, err);
+ return branch_get_upstream(r, branch, err);
case PUSH_DEFAULT_UNSPECIFIED:
case PUSH_DEFAULT_SIMPLE:
{
const char *up, *cur;
- up = branch_get_upstream(branch, err);
+ up = branch_get_upstream(r, branch, err);
if (!up)
return NULL;
cur = tracking_for_push_dest(remote, branch->refname, err);
@@ -1705,13 +1707,14 @@ 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 repository *r, 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(r, branch, err);
return branch->push_tracking_ref;
}
@@ -1961,15 +1964,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,
+int stat_tracking_info(struct repository *r, 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);
+ base = for_push ? branch_get_push(r, branch, NULL) :
+ branch_get_upstream(r, branch, NULL);
if (tracking_name)
*tracking_name = base;
if (!base)
@@ -1981,15 +1985,15 @@ 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 repository *r, 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(r, branch, &ours, &theirs, &full_base, 0, abf);
if (sti < 0) {
if (!full_base)
return 0;
@@ -278,7 +278,8 @@ int branch_merge_matches(struct branch *, int n, const char *);
* message is recorded there (if the function does not return NULL, then
* `err` is not touched).
*/
-const char *branch_get_upstream(struct branch *branch, struct strbuf *err);
+const char *branch_get_upstream(struct repository *r, struct branch *branch,
+ struct strbuf *err);
/**
* Return the tracking branch that corresponds to the ref we would push to
@@ -286,7 +287,8 @@ const char *branch_get_upstream(struct branch *branch, struct strbuf *err);
*
* The return value and `err` conventions match those of `branch_get_upstream`.
*/
-const char *branch_get_push(struct branch *branch, struct strbuf *err);
+const char *branch_get_push(struct repository *r, struct branch *branch,
+ struct strbuf *err);
/* Flags to match_refs. */
enum match_refs_flags {
@@ -305,11 +307,12 @@ enum ahead_behind_flags {
};
/* Reporting of tracking info */
-int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
+int stat_tracking_info(struct repository *r, 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 format_tracking_info(struct repository *r, struct branch *branch,
+ struct strbuf *sb, enum ahead_behind_flags abf);
struct ref *get_local_heads(void);
/*
@@ -1469,7 +1469,8 @@ static int interpret_branch_mark(struct repository *r,
const char *name, int namelen,
int at, struct strbuf *buf,
int (*get_mark)(const char *, int),
- const char *(*get_data)(struct branch *,
+ const char *(*get_data)(struct repository *,
+ struct branch *,
struct strbuf *),
unsigned allowed)
{
@@ -1492,7 +1493,7 @@ static int interpret_branch_mark(struct repository *r,
} else
branch = branch_get(NULL);
- value = get_data(branch, &err);
+ value = get_data(r, branch, &err);
if (!value)
die("%s", err.buf);
@@ -1086,7 +1086,8 @@ static void wt_longstatus_print_verbose(struct wt_status *s)
}
}
-static void wt_longstatus_print_tracking(struct wt_status *s)
+static void wt_longstatus_print_tracking(struct repository *r,
+ struct wt_status *s)
{
struct strbuf sb = STRBUF_INIT;
const char *cp, *ep, *branch_name;
@@ -1102,7 +1103,7 @@ static void wt_longstatus_print_tracking(struct wt_status *s)
t_begin = getnanotime();
- if (!format_tracking_info(branch, &sb, s->ahead_behind_flags))
+ if (!format_tracking_info(r, branch, &sb, s->ahead_behind_flags))
return;
if (advice_status_ahead_behind_warning &&
@@ -1683,7 +1684,7 @@ static void wt_longstatus_print_state(struct wt_status *s)
show_bisect_in_progress(s, state_color);
}
-static void wt_longstatus_print(struct wt_status *s)
+static void wt_longstatus_print(struct repository *r, struct wt_status *s)
{
const char *branch_color = color(WT_STATUS_ONBRANCH, s);
const char *branch_status_color = color(WT_STATUS_HEADER, s);
@@ -1716,7 +1717,7 @@ static void wt_longstatus_print(struct wt_status *s)
status_printf_more(s, branch_status_color, "%s", on_what);
status_printf_more(s, branch_color, "%s\n", branch_name);
if (!s->is_initial)
- wt_longstatus_print_tracking(s);
+ wt_longstatus_print_tracking(r, s);
}
wt_longstatus_print_state(s);
@@ -1878,7 +1879,8 @@ static void wt_shortstatus_other(struct string_list_item *it,
}
}
-static void wt_shortstatus_print_tracking(struct wt_status *s)
+static void wt_shortstatus_print_tracking(struct repository *r,
+ struct wt_status *s)
{
struct branch *branch;
const char *header_color = color(WT_STATUS_HEADER, s);
@@ -1914,7 +1916,7 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
color_fprintf(s->fp, branch_color_local, "%s", branch_name);
- sti = stat_tracking_info(branch, &num_ours, &num_theirs, &base,
+ sti = stat_tracking_info(r, branch, &num_ours, &num_theirs, &base,
0, s->ahead_behind_flags);
if (sti < 0) {
if (!base)
@@ -1954,12 +1956,12 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
fputc(s->null_termination ? '\0' : '\n', s->fp);
}
-static void wt_shortstatus_print(struct wt_status *s)
+static void wt_shortstatus_print(struct repository *r, struct wt_status *s)
{
struct string_list_item *it;
if (s->show_branch)
- wt_shortstatus_print_tracking(s);
+ wt_shortstatus_print_tracking(r, s);
for_each_string_list_item(it, &s->change) {
struct wt_status_change_data *d = it->util;
@@ -1976,13 +1978,13 @@ static void wt_shortstatus_print(struct wt_status *s)
wt_shortstatus_other(it, s, "!!");
}
-static void wt_porcelain_print(struct wt_status *s)
+static void wt_porcelain_print(struct repository *r, struct wt_status *s)
{
s->use_color = 0;
s->relative_paths = 0;
s->prefix = NULL;
s->no_gettext = 1;
- wt_shortstatus_print(s);
+ wt_shortstatus_print(r, s);
}
/*
@@ -2018,7 +2020,8 @@ static void wt_porcelain_print(struct wt_status *s)
* upstream. When AHEAD_BEHIND_QUICK is requested and the branches
* are different, '?' will be substituted for the actual count.
*/
-static void wt_porcelain_v2_print_tracking(struct wt_status *s)
+static void wt_porcelain_v2_print_tracking(struct repository *r,
+ struct wt_status *s)
{
struct branch *branch;
const char *base;
@@ -2053,7 +2056,7 @@ static void wt_porcelain_v2_print_tracking(struct wt_status *s)
/* Lookup stats on the upstream tracking branch, if set. */
branch = branch_get(branch_name);
base = NULL;
- ab_info = stat_tracking_info(branch, &nr_ahead, &nr_behind,
+ ab_info = stat_tracking_info(r, branch, &nr_ahead, &nr_behind,
&base, 0, s->ahead_behind_flags);
if (base) {
base = shorten_unambiguous_ref(base, 0);
@@ -2328,14 +2331,14 @@ static void wt_porcelain_v2_print_other(
* [<v2_ignored_items>]*
*
*/
-static void wt_porcelain_v2_print(struct wt_status *s)
+static void wt_porcelain_v2_print(struct repository *r, struct wt_status *s)
{
struct wt_status_change_data *d;
struct string_list_item *it;
int i;
if (s->show_branch)
- wt_porcelain_v2_print_tracking(s);
+ wt_porcelain_v2_print_tracking(r, s);
for (i = 0; i < s->change.nr; i++) {
it = &(s->change.items[i]);
@@ -2362,7 +2365,7 @@ static void wt_porcelain_v2_print(struct wt_status *s)
}
}
-void wt_status_print(struct wt_status *s)
+void wt_status_print(struct repository *r, struct wt_status *s)
{
trace2_data_intmax("status", s->repo, "count/changed", s->change.nr);
trace2_data_intmax("status", s->repo, "count/untracked",
@@ -2373,20 +2376,20 @@ void wt_status_print(struct wt_status *s)
switch (s->status_format) {
case STATUS_FORMAT_SHORT:
- wt_shortstatus_print(s);
+ wt_shortstatus_print(r, s);
break;
case STATUS_FORMAT_PORCELAIN:
- wt_porcelain_print(s);
+ wt_porcelain_print(r, s);
break;
case STATUS_FORMAT_PORCELAIN_V2:
- wt_porcelain_v2_print(s);
+ wt_porcelain_v2_print(r, s);
break;
case STATUS_FORMAT_UNSPECIFIED:
BUG("finalize_deferred_config() should have been called");
break;
case STATUS_FORMAT_NONE:
case STATUS_FORMAT_LONG:
- wt_longstatus_print(s);
+ wt_longstatus_print(r, s);
break;
}
@@ -147,7 +147,7 @@ size_t wt_status_locate_end(const char *s, size_t len);
void wt_status_append_cut_line(struct strbuf *buf);
void wt_status_add_cut_line(FILE *fp);
void wt_status_prepare(struct repository *r, struct wt_status *s);
-void wt_status_print(struct wt_status *s);
+void wt_status_print(struct repository *r, struct wt_status *s);
void wt_status_collect(struct wt_status *s);
void wt_status_collect_free_buffers(struct wt_status *s);
void wt_status_get_state(struct repository *repo,