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 <johncai86@xxxxxxxxx> ## 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 <johncai86@xxxxxxxxx> + ## 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