public inbox for git@vger.kernel.org 
 help / color / mirror / Atom feed
From: Shreyansh Paliwal <shreyanshpaliwalcmsmn@gmail•com>
To: git@vger•kernel.org
Cc: phillip.wood123@gmail•com, gitster@pobox•com,
	karthik.188@gmail•com,
	Shreyansh Paliwal <shreyanshpaliwalcmsmn@gmail•com>
Subject: [PATCH v5 0/3] wt-status: reduce reliance on global state
Date: Wed, 18 Feb 2026 23:23:39 +0530	[thread overview]
Message-ID: <20260218175654.66004-1-shreyanshpaliwalcmsmn@gmail.com> (raw)
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 <shreyanshpaliwalcmsmn@gmail•com>

    @@ 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 <shreyanshpaliwalcmsmn@gmail•com>

    @@ 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


  parent reply	other threads:[~2026-02-18 17:57 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-31 18:57 [PATCH 0/3] wt-status: reduce reliance on global state Shreyansh Paliwal
2026-01-31 18:57 ` [PATCH 1/3] wt-status: replace uses of the_repository with local repository instances Shreyansh Paliwal
2026-02-02 10:02   ` Karthik Nayak
2026-02-02 18:42     ` Junio C Hamano
2026-02-02 18:57     ` Shreyansh Paliwal
2026-02-02 22:41       ` Junio C Hamano
2026-02-02 23:03         ` Junio C Hamano
2026-02-03  9:53           ` Shreyansh Paliwal
2026-02-03 11:06             ` Phillip Wood
2026-02-03 15:20               ` Shreyansh Paliwal
2026-02-03 10:58       ` Phillip Wood
2026-02-03 15:15         ` Shreyansh Paliwal
2026-01-31 18:57 ` [PATCH 2/3] wt-status: pass struct repository and wt_status through function parameters Shreyansh Paliwal
2026-01-31 18:57 ` [PATCH 3/3] wt-status: use hash_algo from local repository instead of global the_hash_algo Shreyansh Paliwal
2026-02-02 10:03   ` Karthik Nayak
2026-02-02 19:03     ` Shreyansh Paliwal
2026-02-04 10:18       ` Karthik Nayak
2026-02-04 11:22         ` Shreyansh Paliwal
2026-02-05 10:13 ` [PATCH V2 0/3] wt-status: reduce reliance on global state Shreyansh Paliwal
2026-02-05 10:13   ` [PATCH V2 1/3] wt-status: replace uses of the_repository with local repository instances Shreyansh Paliwal
2026-02-05 10:59     ` Karthik Nayak
2026-02-05 11:11       ` Karthik Nayak
2026-02-05 12:18         ` Shreyansh Paliwal
2026-02-05 16:08           ` Phillip Wood
2026-02-05 17:41             ` Shreyansh Paliwal
2026-02-05 10:13   ` [PATCH V2 2/3] wt-status: pass struct repository and wt_status through function parameters Shreyansh Paliwal
2026-02-05 11:09     ` Karthik Nayak
2026-02-05 12:04       ` Shreyansh Paliwal
2026-02-06  9:24         ` Karthik Nayak
2026-02-06  9:32           ` Shreyansh Paliwal
2026-02-06 12:57             ` Shreyansh Paliwal
2026-02-06 14:54               ` Phillip Wood
2026-02-06 17:06                 ` Shreyansh Paliwal
2026-02-05 15:58       ` Phillip Wood
2026-02-05 10:13   ` [PATCH V2 3/3] wt-status: use hash_algo from local repository instead of global the_hash_algo Shreyansh Paliwal
2026-02-05 10:27   ` [PATCH V2 0/3] wt-status: reduce reliance on global state Shreyansh Paliwal
2026-02-05 15:53     ` Phillip Wood
2026-02-05 17:39       ` Shreyansh Paliwal
2026-02-05 18:02         ` Kristoffer Haugsbakk
2026-02-05 18:18           ` Shreyansh Paliwal
2026-02-07 10:00   ` [PATCH v3 " Shreyansh Paliwal
2026-02-07 10:00     ` [PATCH v3 1/3] wt-status: pass struct repository through function parameters Shreyansh Paliwal
2026-02-08  1:14       ` Junio C Hamano
2026-02-08  4:55         ` [PATCH V2 2/3] wt-status: pass struct repository and wt_status " Shreyansh Paliwal
2026-02-09  8:36         ` [PATCH v3 1/3] wt-status: pass struct repository " Karthik Nayak
2026-02-08  1:21       ` Junio C Hamano
2026-02-08  4:44         ` [PATCH V2 2/3] wt-status: pass struct repository and wt_status " Shreyansh Paliwal
2026-02-08  6:08           ` Junio C Hamano
2026-02-08 15:25             ` Shreyansh Paliwal
2026-02-09  9:02               ` Karthik Nayak
2026-02-09 13:43                 ` Shreyansh Paliwal
2026-02-09 16:13                 ` Junio C Hamano
2026-02-10  9:50                   ` Karthik Nayak
2026-02-07 10:00     ` [PATCH v3 2/3] wt-status: replace uses of the_repository with local repository instances Shreyansh Paliwal
2026-02-07 10:00     ` [PATCH v3 3/3] wt-status: use hash_algo from local repository instead of global the_hash_algo Shreyansh Paliwal
2026-02-17 17:29 ` [PATCH v4 0/3] wt-status: reduce reliance on global state Shreyansh Paliwal
2026-02-17 17:29   ` [PATCH v4 1/3] wt-status: pass struct repository through function parameters Shreyansh Paliwal
2026-02-17 17:29   ` [PATCH v4 2/3] wt-status: replace uses of the_repository with local repository instances Shreyansh Paliwal
2026-02-17 17:29   ` [PATCH v4 3/3] wt-status: use hash_algo from local repository instead of global the_hash_algo Shreyansh Paliwal
2026-02-18 16:13   ` [PATCH v4 0/3] wt-status: reduce reliance on global state Phillip Wood
2026-02-18 16:48     ` Shreyansh Paliwal
2026-02-18 17:53 ` Shreyansh Paliwal [this message]
2026-02-18 17:53   ` [PATCH v5 1/3] wt-status: pass struct repository through function parameters Shreyansh Paliwal
2026-02-18 17:53   ` [PATCH v5 2/3] wt-status: replace uses of the_repository with local repository instances Shreyansh Paliwal
2026-02-18 17:53   ` [PATCH v5 3/3] wt-status: use hash_algo from local repository instead of global the_hash_algo Shreyansh Paliwal
2026-03-06 22:31   ` [PATCH v5 0/3] wt-status: reduce reliance on global state Junio C Hamano
2026-03-09 10:32     ` Karthik Nayak
2026-03-09 18:30       ` Junio C Hamano
2026-03-09 10:35     ` Phillip Wood

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260218175654.66004-1-shreyanshpaliwalcmsmn@gmail.com \
    --to=shreyanshpaliwalcmsmn@gmail$(echo .)com \
    --cc=git@vger$(echo .)kernel.org \
    --cc=gitster@pobox$(echo .)com \
    --cc=karthik.188@gmail$(echo .)com \
    --cc=phillip.wood123@gmail$(echo .)com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox