setup: make startup_info available everywhere

Commit a60645f (setup: remember whether repository was found, 2010-08-05) introduced the startup_info structure, which records some parts of the setup_git_directory() process (notably, whether we actually found a repository or not). One of the uses of this data is for functions to behave appropriately based on whether we are in a repo. But the startup_info struct is just a pointer to storage provided by the main program, and the only program that sets it up is the git.c wrapper. Thus builtins have access to startup_info, but externally linked programs do not. Worse, library code which is accessible from both has to be careful about accessing startup_info. This can be used to trigger a die("BUG") via get_sha1(): $ git fast-import <<-\EOF tag foo from HEAD:./whatever EOF fatal: BUG: startup_info struct is not initialized. Obviously that's fairly nonsensical input to feed to fast-import, but we should never hit a die("BUG"). And there may be other ways to trigger it if other non-builtins resolve sha1s. So let's point the storage for startup_info to a static variable in setup.c, making it available to all users of the library code. We _could_ turn startup_info into a regular extern struct, but doing so would mean tweaking all of the existing use sites. So let's leave the pointer indirection in place. We can, however, drop any checks for NULL, as they will always be false (and likewise, we can drop the test covering this case, which was a rather artificial situation using one of the test-* programs). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Mar 5, 2016 at 17:10 UTC 46c3cd44d7a1e8a33ad66c017ac9e3575cc88c00
6 files changed +7 -17
cache.h
+1 -1
@@ -1771,7 +1771,7 @@ int split_cmdline(char *cmdline, const char ***argv);
1771 /* Takes a negative value returned by split_cmdline */
1772 const char *split_cmdline_strerror(int cmdline_errno);
1773
1774 -/* git.c */
1774 +/* setup.c */
1775 struct startup_info {
1776 int have_repository;
1777 const char *prefix;
environment.c
-1
@@ -64,7 +64,6 @@ int grafts_replace_parents = 1;
64 int core_apply_sparse_checkout;
65 int merge_log_config = -1;
66 int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
67 -struct startup_info *startup_info;
67 unsigned long pack_size_limit_cfg;
68
69 #ifndef PROTECT_HFS_DEFAULT
git.c
-3
@@ -15,7 +15,6 @@ const char git_more_info_string[] =
15 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
16 "to read about a specific subcommand or concept.");
17
18 -static struct startup_info git_startup_info;
18 static int use_pager = -1;
19 static char *orig_cwd;
20 static const char *env_names[] = {
@@ -637,8 +636,6 @@ int main(int argc, char **av)
636 const char *cmd;
637 int done_help = 0;
638
640 - startup_info = &git_startup_info;
641 -
639 cmd = git_extract_argv0_path(argv[0]);
640 if (!cmd)
641 cmd = "git-help";
setup.c
+6 -4
@@ -7,6 +7,9 @@ static int inside_work_tree = -1;
7 static int work_tree_config_is_bogus;
8 static struct string_list unknown_extensions = STRING_LIST_INIT_DUP;
9
10 +static struct startup_info the_startup_info;
11 +struct startup_info *startup_info = &the_startup_info;
12 +
13 /*
14 * The input parameter must contain an absolute path, and it must already be
15 * normalized.
@@ -905,10 +908,9 @@ const char *setup_git_directory_gently(int *nongit_ok)
908 else
909 setenv(GIT_PREFIX_ENVIRONMENT, "", 1);
910
908 - if (startup_info) {
909 - startup_info->have_repository = !nongit_ok || !*nongit_ok;
910 - startup_info->prefix = prefix;
911 - }
911 + startup_info->have_repository = !nongit_ok || !*nongit_ok;
912 + startup_info->prefix = prefix;
913 +
914 return prefix;
915 }
916
sha1_name.c
-3
@@ -1353,9 +1353,6 @@ static char *resolve_relative_path(const char *rel)
1353 if (!starts_with(rel, "./") && !starts_with(rel, "../"))
1354 return NULL;
1355
1356 - if (!startup_info)
1357 - die("BUG: startup_info struct is not initialized.");
1358 -
1356 if (!is_inside_work_tree())
1357 die("relative path syntax can't be used outside working tree.");
1358
t/t1506-rev-parse-diagnosis.sh
-5
@@ -166,11 +166,6 @@ test_expect_success 'relative path when cwd is outside worktree' '
166 grep "relative path syntax can.t be used outside working tree." error
167 '
168
169 -test_expect_success 'relative path when startup_info is NULL' '
170 - test_must_fail test-match-trees HEAD:./file.txt HEAD:./file.txt 2>error &&
171 - grep "BUG: startup_info struct is not initialized." error
172 -'
173 -
169 test_expect_success '<commit>:file correctly diagnosed after a pathname' '
170 test_must_fail git rev-parse file.txt HEAD:file.txt 1>actual 2>error &&
171 test_i18ngrep ! "exists on disk" error &&