Subject: [PATCH v5 0/3] wt-status: reduce reliance on global state

From: Shreyansh Paliwal <[email-masked]>
Date: Wed, 18 Feb 2026 23:23:39 +0530

In wt-status.c code still relies on some global variables, including
the_repository and the_hash_algo, even in cases where a repository instance
is already available via struct wt_status or struct repository.

In patch 1/3, update function parameters and callers to pass and use struct
repository instead of the_repository where no local repository access was
available.

In patch 2/3, replace direct uses of the_repository with repository
instances already available in local structs.

In patch 3/3, replace remaining uses of the global the_hash_algo with the
hash algorithm stored in the respective repository instance.

These changes remove uses of the_repository and the_hash_algo from
wt-status.c and reduce its dependence on global state.

The 'USE_THE_REPOSITORY_VARIABLE' macro cannot yet be removed, since these
patches only eliminate some uses of the_repository and the_hash_algo, while
some global variables are still referenced.

In particular wt-status.c still relies on the following globals,

* the_repository, this is still used in functions like worktree_git_path()
  and wt_status_check_bisect/rebase() which are dependant on the worktree
  API and they are being handled in a seperate patch series[1].

* core_apply_sparse_checkout, this is already being addressed in an ongoing
  patch series [2].

* comment_line_str and DEFAULT_ABBREV, these both still are used in
  wt-status.c but they dont have any equivalent local instances.

[1]- https://lore.kernel.org/git/[email-masked]/T/#mf664ad751faaf2eaca138302b1cc9d3856c9fec3
[2]- https://lore.kernel.org/git/[email-masked]/t/#u

Shreyansh Paliwal (3):
  wt-status: pass struct repository through function parameters
  wt-status: replace uses of the_repository with local repository
    instances
  wt-status: use hash_algo from local repository instead of global
    the_hash_algo

 wt-status.c | 62 ++++++++++++++++++++++++++---------------------------
 1 file changed, 31 insertions(+), 31 deletions(-)

---
Changes in v5:
 - Added the usage of struct repository *r in addition to adding it as a parameter to the functions,
    in patch 1/3 instead of doing that in 2/3.

Range-diff against v4:
1:  a3683a5e17 ! 1:  620cf8832b wt-status: pass struct repository through function parameters
    @@ Commit message
         wt-status: pass struct repository through function parameters

         Some functions in wt-status.c (count_stash_entries(),
    -    read_line_from_git_path(), abbrev_oid_in_line(), read_rebase_todolist())
    -    do not have access to a local repository instance and rely on the_repository.
    +    read_line_from_git_path(), abbrev_oid_in_line(), and
    +    read_rebase_todolist()) rely on the_repository as they do not have access
    +    to a local repository instance.

    -    Add a struct repository *r parameter to these functions, and pass the local
    -    repository through the callers where already they can access a local repository
    -    instance either directly by struct repository *r or
    -    by struct wt_state *s (s->repo).
    +    Add a struct repository *r parameter to these functions and pass the local
    +    repository instance through the callers, which already have access to it
    +    either directly by struct repository *r or indirectly by struct wt_state
    +    *s (s->repo).
    +
    +    Replace uses of the_repository in these functions with the passed parameter.

         Signed-off-by: Shreyansh Paliwal <[email-masked]>

    @@ wt-status.c: static int stash_count_refs(const char *refname UNUSED,
     +static int count_stash_entries(struct repository *r)
      {
      	int n = 0;
    - 	refs_for_each_reflog_ent(get_main_ref_store(the_repository),
    -@@ wt-status.c: static int count_stash_entries(void)
    +-	refs_for_each_reflog_ent(get_main_ref_store(the_repository),
    ++	refs_for_each_reflog_ent(get_main_ref_store(r),
    + 				 "refs/stash", stash_count_refs, &n);
    + 	return n;
    + }

      static void wt_longstatus_print_stash_summary(struct wt_status *s)
      {
    @@ wt-status.c: static void show_am_in_progress(struct wt_status *s,
     +static char *read_line_from_git_path(struct repository *r, const char *filename)
      {
      	struct strbuf buf = STRBUF_INIT;
    - 	FILE *fp = fopen_or_warn(repo_git_path_append(the_repository, &buf,
    +-	FILE *fp = fopen_or_warn(repo_git_path_append(the_repository, &buf,
    ++	FILE *fp = fopen_or_warn(repo_git_path_append(r, &buf,
    + 						      "%s", filename), "r");
    +
    + 	if (!fp) {
     @@ wt-status.c: static int split_commit_in_progress(struct wt_status *s)
      	if (head_flags & REF_ISSYMREF || orig_head_flags & REF_ISSYMREF)
      		return 0;
    @@ wt-status.c: static int split_commit_in_progress(struct wt_status *s)
      {
      	struct string_list split = STRING_LIST_INIT_DUP;
      	struct object_id oid;
    +@@ wt-status.c: static void abbrev_oid_in_line(struct strbuf *line)
    + 		return;
    +
    + 	if ((2 <= string_list_split(&split, line->buf, " ", 2)) &&
    +-	    !repo_get_oid(the_repository, split.items[1].string, &oid)) {
    ++	    !repo_get_oid(r, split.items[1].string, &oid)) {
    + 		strbuf_reset(line);
    + 		strbuf_addf(line, "%s ", split.items[0].string);
    + 		strbuf_add_unique_abbrev(line, &oid, DEFAULT_ABBREV);
     @@ wt-status.c: static void abbrev_oid_in_line(struct strbuf *line)
      	string_list_clear(&split, 0);
      }
    @@ wt-status.c: static void abbrev_oid_in_line(struct strbuf *line)
     +static int read_rebase_todolist(struct repository *r, const char *fname, struct string_list *lines)
      {
      	struct strbuf buf = STRBUF_INIT;
    - 	FILE *f = fopen(repo_git_path_append(the_repository, &buf, "%s", fname), "r");
    +-	FILE *f = fopen(repo_git_path_append(the_repository, &buf, "%s", fname), "r");
    ++	FILE *f = fopen(repo_git_path_append(r, &buf, "%s", fname), "r");
    + 	int ret;
    +
    + 	if (!f) {
    +@@ wt-status.c: static int read_rebase_todolist(const char *fname, struct string_list *lines)
    + 			goto out;
    + 		}
    + 		die_errno("Could not open file %s for reading",
    +-			  repo_git_path_replace(the_repository, &buf, "%s", fname));
    ++			  repo_git_path_replace(r, &buf, "%s", fname));
    + 	}
    + 	while (!strbuf_getline_lf(&buf, f)) {
    + 		if (starts_with(buf.buf, comment_line_str))
     @@ wt-status.c: static int read_rebase_todolist(const char *fname, struct string_list *lines)
      		strbuf_trim(&buf);
      		if (!buf.len)
2:  f3b4c3e972 ! 2:  13e0c5bcd7 wt-status: replace uses of the_repository with local repository instances
    @@ Metadata
      ## Commit message ##
         wt-status: replace uses of the_repository with local repository instances

    -    wt-status.c uses the global the_repository in several places even when
    -    a repository instance is already available via struct wt_status *s or
    -    struct repository *r.
    +    wt-status.c uses the global the_repository in several places even when a
    +    repository instance is already available via struct wt_status *s or struct
    +    repository *r.

    -    Replace these uses of the_repository with the repository available
    -    in the local context (i.e. s->repo or r).
    +    Replace these uses of the_repository with the repository available in the
    +    local context (i.e. s->repo or r).

    -    The replacements of all the_repository with s->repo are mostly
    -    to cases where a repository instance is already available via
    -    struct wt_status *s and struct repository *r, all functions operating on
    -    struct wt_status *s are only used after s is initialized by wt_status_prepare(),
    -    which sets s->repo from the repository provided by the caller.
    -    As a result, s->repo is guaranteed to be available and consistent whenever
    -    these functions are invoked.
    +    The replacements of all the_repository with s->repo are mostly to cases
    +    where a repository instance is already available via struct wt_status *s
    +    and struct repository *r, all functions operating on struct wt_status *s
    +    are only used after s is initialized by wt_status_prepare(), which sets
    +    s->repo from the repository provided by the caller. As a result, s->repo is
    +    guaranteed to be available and consistent whenever these functions are
    +    invoked.

         This reduces reliance on global state and keeps wt-status consistent,
    -    though many functions operating on struct wt_status *s
    -    are called via commit.c and it still relies on the_repository,
    -    but within wt-status.c the local repository pointer
    -    refers to the same underlying repository object.
    +    though many functions operating on struct wt_status *s are called via
    +    commit.c and it still relies on the_repository, but within wt-status.c the
    +    local repository pointer refers to the same underlying repository object.

         Signed-off-by: Shreyansh Paliwal <[email-masked]>

    @@ wt-status.c: static void wt_status_collect_changes_index(struct wt_status *s)
      	setup_revisions(0, NULL, &rev, &opt);

      	rev.diffopt.flags.override_submodule_config = 1;
    -@@ wt-status.c: static int stash_count_refs(const char *refname UNUSED,
    - static int count_stash_entries(struct repository *r)
    - {
    - 	int n = 0;
    --	refs_for_each_reflog_ent(get_main_ref_store(the_repository),
    -+	refs_for_each_reflog_ent(get_main_ref_store(r),
    - 				 "refs/stash", stash_count_refs, &n);
    - 	return n;
    - }
     @@ wt-status.c: static void wt_longstatus_print_verbose(struct wt_status *s)
      	rev.diffopt.ita_invisible_in_index = 1;

    @@ wt-status.c: static void wt_longstatus_print_verbose(struct wt_status *s)
      	setup_revisions(0, NULL, &rev, &opt);

      	rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
    -@@ wt-status.c: static void show_am_in_progress(struct wt_status *s,
    - static char *read_line_from_git_path(struct repository *r, const char *filename)
    - {
    - 	struct strbuf buf = STRBUF_INIT;
    --	FILE *fp = fopen_or_warn(repo_git_path_append(the_repository, &buf,
    -+	FILE *fp = fopen_or_warn(repo_git_path_append(r, &buf,
    - 						      "%s", filename), "r");
    -
    - 	if (!fp) {
     @@ wt-status.c: static int split_commit_in_progress(struct wt_status *s)
      	    !s->branch || strcmp(s->branch, "HEAD"))
      		return 0;
    @@ wt-status.c: static int split_commit_in_progress(struct wt_status *s)
      			       &orig_head_oid, &orig_head_flags))
      		return 0;
      	if (head_flags & REF_ISSYMREF || orig_head_flags & REF_ISSYMREF)
    -@@ wt-status.c: static void abbrev_oid_in_line(struct repository *r, struct strbuf *line)
    - 		return;
    -
    - 	if ((2 <= string_list_split(&split, line->buf, " ", 2)) &&
    --	    !repo_get_oid(the_repository, split.items[1].string, &oid)) {
    -+	    !repo_get_oid(r, split.items[1].string, &oid)) {
    - 		strbuf_reset(line);
    - 		strbuf_addf(line, "%s ", split.items[0].string);
    - 		strbuf_add_unique_abbrev(line, &oid, DEFAULT_ABBREV);
    -@@ wt-status.c: static void abbrev_oid_in_line(struct repository *r, struct strbuf *line)
    - static int read_rebase_todolist(struct repository *r, const char *fname, struct string_list *lines)
    - {
    - 	struct strbuf buf = STRBUF_INIT;
    --	FILE *f = fopen(repo_git_path_append(the_repository, &buf, "%s", fname), "r");
    -+	FILE *f = fopen(repo_git_path_append(r, &buf, "%s", fname), "r");
    - 	int ret;
    -
    - 	if (!f) {
    -@@ wt-status.c: static int read_rebase_todolist(struct repository *r, const char *fname, struct
    - 			goto out;
    - 		}
    - 		die_errno("Could not open file %s for reading",
    --			  repo_git_path_replace(the_repository, &buf, "%s", fname));
    -+			  repo_git_path_replace(r, &buf, "%s", fname));
    - 	}
    - 	while (!strbuf_getline_lf(&buf, f)) {
    - 		if (starts_with(buf.buf, comment_line_str))
     @@ wt-status.c: static void show_rebase_information(struct wt_status *s,
      				i++)
      				status_printf_ln(s, color, "   %s", have_done.items[i].string);
3:  7efaf6b3fb = 3:  2bf22dd925 wt-status: use hash_algo from local repository instead of global the_hash_algo
--
2.53.0