Subject: [PATCH v3 0/3] Remove the_repository global for am, annotate, apply, archive builtins

From: "John Cai via GitGitGadget" <[email-masked]>
Date: Sat, 05 Oct 2024 03:30:40 +0000

Remove the_repository global variable for the annotate, apply, and archive
bulitins.

Changes since V1:

 * in patch 1, only pass in repo to the bulitin if the repo exists

Changes since V2:

 * drop patch 3, which is a bit more involved to dis-entangle the_repository
 * use a single variable in run_builtin() to keep track of whether or not we
   are operating in a repository

John Cai (3):
  git: pass in repo to builtin based on setup_git_directory_gently
  annotate: remove usage of the_repository global
  archive: remove the_repository global variable

 builtin/add.c      | 3 ++-
 builtin/annotate.c | 5 ++---
 builtin/archive.c  | 5 ++---
 git.c              | 7 ++++---
 4 files changed, 10 insertions(+), 10 deletions(-)

base-commit: 3857aae53f3633b7de63ad640737c657387ae0c6
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1788%2Fjohn-cai%2Fjc%2Fremove-global-repo-a-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1788/john-cai/jc/remove-global-repo-a-v3
Pull-Request: https://github.com/git/git/pull/1788

Range-diff vs v2:

 1:  5d72c31c6f3 ! 1:  8009fdb38b0 git: pass in repo for RUN_SETUP_GENTLY
     @@ Metadata
      Author: John Cai <[email-masked]>
      
       ## Commit message ##
     -    git: pass in repo for RUN_SETUP_GENTLY
     +    git: pass in repo to builtin based on setup_git_directory_gently
      
     -    commands that have RUN_SETUP_GENTLY potentially need a repository.
     -    Modify the logic in run_builtin() to pass the repository to the builtin
     -    if a builtin has the RUN_SETUP_GENTLY property.
     +    The current code in run_builtin() passes in a repository to the builtin
     +    based on whether cmd_struct's option flag has RUN_SETUP.
     +
     +    This is incorrect, however, since some builtins that only have
     +    RUN_SETUP_GENTLY can potentially take a repository.
     +    setup_git_directory_gently() tells us whether or not a command is being
     +    run inside of a repository.
     +
     +    Use the output of setup_git_directory_gently() to help determine whether
     +    or not there is a repository to pass to the builtin. If not, then we
     +    just pass NULL.
     +
     +    As part of this patch, we need to modify add to check for a NULL repo
     +    before calling repo_git_config(), since add -h can be run outside of a
     +    repository.
      
          Signed-off-by: John Cai <[email-masked]>
      
     + ## builtin/add.c ##
     +@@ builtin/add.c: int cmd_add(int argc,
     + 	char *ps_matched = NULL;
     + 	struct lock_file lock_file = LOCK_INIT;
     + 
     +-	repo_config(repo, add_config, NULL);
     ++	if (repo)
     ++		repo_config(repo, add_config, NULL);
     + 
     + 	argc = parse_options(argc, argv, prefix, builtin_add_options,
     + 			  builtin_add_usage, PARSE_OPT_KEEP_ARGV0);
     +
       ## git.c ##
      @@ git.c: static int handle_alias(int *argcp, const char ***argv)
     - 
       static int run_builtin(struct cmd_struct *p, int argc, const char **argv, struct repository *repo)
       {
     --	int status, help;
     -+	int status, help, repo_exists;
     + 	int status, help;
     ++	int no_repo = 1;
       	struct stat st;
       	const char *prefix;
       	int run_setup = (p->option & (RUN_SETUP | RUN_SETUP_GENTLY));
     @@ git.c: static int run_builtin(struct cmd_struct *p, int argc, const char **argv,
       
       	if (run_setup & RUN_SETUP) {
       		prefix = setup_git_directory();
     -+		repo_exists = 1;
     ++		no_repo = 0;
       	} else if (run_setup & RUN_SETUP_GENTLY) {
     - 		int nongit_ok;
     - 		prefix = setup_git_directory_gently(&nongit_ok);
     -+
     -+		if (!nongit_ok)
     -+			repo_exists = 1;
     +-		int nongit_ok;
     +-		prefix = setup_git_directory_gently(&nongit_ok);
     ++		prefix = setup_git_directory_gently(&no_repo);
       	} else {
       		prefix = NULL;
       	}
     @@ git.c: static int run_builtin(struct cmd_struct *p, int argc, const char **argv,
       
       	validate_cache_entries(repo->index);
      -	status = p->fn(argc, argv, prefix, (p->option & RUN_SETUP)? repo : NULL);
     -+	status = p->fn(argc,
     -+		       argv,
     -+		       prefix,
     -+		       repo_exists ? repo : NULL);
     ++	status = p->fn(argc, argv, prefix, no_repo ? NULL : repo);
       	validate_cache_entries(repo->index);
       
       	if (status)
 2:  2a29d113815 = 2:  1b82b5dc678 annotate: remove usage of the_repository global
 3:  d64955a2e27 < -:  ----------- apply: remove the_repository global variable
 4:  857291d7f7d = 3:  5d33a375f41 archive: remove the_repository global variable

-- 
gitgitgadget