setup: remember whether repository was found

As v1.7.2~16^2 (git --paginate: paginate external commands
again, 2010-07-14) explains, builtins (like git config) that
do not use RUN_SETUP are not finding GIT_DIR set correctly when
it is time to launch the pager from run_builtin().  If they
were to search for a repository sooner, then the outcome of such
early repository accesses would be more predictable and reliable.

The cmd_*() functions learn whether a repository was found through the
*nongit_ok return value from setup_git_directory_gently().  If
run_builtin() is to take care of the repository search itself, that
datum needs to be retrievable from somewhere else.  Use the
startup_info struct for this.

As a bonus, this information becomes available to functions such as
git_config() which might want to avoid trying to access a repository
when none is present.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2010-08-05 21:46:33 -05:00 committed by Junio C Hamano
parent e37c1329fa
commit a60645f9c5
2 changed files with 12 additions and 1 deletions

View File

@ -1099,6 +1099,7 @@ int split_cmdline(char *cmdline, const char ***argv);
/* git.c */
struct startup_info {
int have_repository;
};
extern struct startup_info *startup_info;

12
setup.c
View File

@ -317,7 +317,7 @@ const char *read_gitfile_gently(const char *path)
* We cannot decide in this function whether we are in the work tree or
* not, since the config can only be read _after_ this function was called.
*/
const char *setup_git_directory_gently(int *nongit_ok)
static const char *setup_git_directory_gently_1(int *nongit_ok)
{
const char *work_tree_env = getenv(GIT_WORK_TREE_ENVIRONMENT);
const char *env_ceiling_dirs = getenv(CEILING_DIRECTORIES_ENVIRONMENT);
@ -473,6 +473,16 @@ const char *setup_git_directory_gently(int *nongit_ok)
return cwd + offset;
}
const char *setup_git_directory_gently(int *nongit_ok)
{
const char *prefix;
prefix = setup_git_directory_gently_1(nongit_ok);
if (startup_info)
startup_info->have_repository = !nongit_ok || !*nongit_ok;
return prefix;
}
int git_config_perm(const char *var, const char *value)
{
int i;