From: Shreyansh Paliwal Date: Wed, 18 Feb 2026 17:53:39 GMT Subject: [PATCH v5 0/3] wt-status: reduce reliance on global state Message-ID: <20260218175654.66004-1-shreyanshpaliwalcmsmn@gmail.com> In-Reply-To: <20260131190106.389289-1-shreyanshpaliwalcmsmn@gmail.com> 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/20260213120529.15475-1-shreyanshpaliwalcmsmn@gmail.com/T/#mf664ad751faaf2eaca138302b1cc9d3856c9fec3 [2]- https://lore.kernel.org/git/5e56e1cc4172cfff9e917a068184e102aa70bf1d.1769256839.git.belkid98@gmail.com/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 @@ 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 @@ 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