mirror of
https://github.com/git/git.git
synced 2024-11-15 15:03:47 +01:00
Merge branch 'jk/startup-info' into maint
The startup_info data, which records if we are working inside a repository (among other things), are now uniformly available to Git subcommand implementations, and Git avoids attempting to touch references when we are not in a repository. * jk/startup-info: use setup_git_directory() in test-* programs grep: turn off gitlink detection for --no-index mailmap: do not resolve blobs in a non-repository remote: don't resolve HEAD in non-repository setup: set startup_info->have_repository more reliably setup: make startup_info available everywhere
This commit is contained in:
commit
237e6db5c0
@ -522,12 +522,14 @@ static int grep_objects(struct grep_opt *opt, const struct pathspec *pathspec,
|
||||
}
|
||||
|
||||
static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec,
|
||||
int exc_std)
|
||||
int exc_std, int use_index)
|
||||
{
|
||||
struct dir_struct dir;
|
||||
int i, hit = 0;
|
||||
|
||||
memset(&dir, 0, sizeof(dir));
|
||||
if (!use_index)
|
||||
dir.flags |= DIR_NO_GITLINKS;
|
||||
if (exc_std)
|
||||
setup_standard_excludes(&dir);
|
||||
|
||||
@ -902,7 +904,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
||||
int use_exclude = (opt_exclude < 0) ? use_index : !!opt_exclude;
|
||||
if (list.nr)
|
||||
die(_("--no-index or --untracked cannot be used with revs."));
|
||||
hit = grep_directory(&opt, &pathspec, use_exclude);
|
||||
hit = grep_directory(&opt, &pathspec, use_exclude, use_index);
|
||||
} else if (0 <= opt_exclude) {
|
||||
die(_("--[no-]exclude-standard cannot be used for tracked contents."));
|
||||
} else if (!list.nr) {
|
||||
|
@ -322,6 +322,7 @@ int set_git_dir_init(const char *git_dir, const char *real_git_dir,
|
||||
set_git_dir(real_path(git_dir));
|
||||
git_link = NULL;
|
||||
}
|
||||
startup_info->have_repository = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
2
cache.h
2
cache.h
@ -1771,7 +1771,7 @@ int split_cmdline(char *cmdline, const char ***argv);
|
||||
/* Takes a negative value returned by split_cmdline */
|
||||
const char *split_cmdline_strerror(int cmdline_errno);
|
||||
|
||||
/* git.c */
|
||||
/* setup.c */
|
||||
struct startup_info {
|
||||
int have_repository;
|
||||
const char *prefix;
|
||||
|
@ -64,7 +64,6 @@ int grafts_replace_parents = 1;
|
||||
int core_apply_sparse_checkout;
|
||||
int merge_log_config = -1;
|
||||
int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
|
||||
struct startup_info *startup_info;
|
||||
unsigned long pack_size_limit_cfg;
|
||||
|
||||
#ifndef PROTECT_HFS_DEFAULT
|
||||
|
3
git.c
3
git.c
@ -15,7 +15,6 @@ const char git_more_info_string[] =
|
||||
"concept guides. See 'git help <command>' or 'git help <concept>'\n"
|
||||
"to read about a specific subcommand or concept.");
|
||||
|
||||
static struct startup_info git_startup_info;
|
||||
static int use_pager = -1;
|
||||
static char *orig_cwd;
|
||||
static const char *env_names[] = {
|
||||
@ -637,8 +636,6 @@ int main(int argc, char **av)
|
||||
const char *cmd;
|
||||
int done_help = 0;
|
||||
|
||||
startup_info = &git_startup_info;
|
||||
|
||||
cmd = git_extract_argv0_path(argv[0]);
|
||||
if (!cmd)
|
||||
cmd = "git-help";
|
||||
|
@ -250,7 +250,8 @@ int read_mailmap(struct string_list *map, char **repo_abbrev)
|
||||
git_mailmap_blob = "HEAD:.mailmap";
|
||||
|
||||
err |= read_mailmap_file(map, ".mailmap", repo_abbrev);
|
||||
err |= read_mailmap_blob(map, git_mailmap_blob, repo_abbrev);
|
||||
if (startup_info->have_repository)
|
||||
err |= read_mailmap_blob(map, git_mailmap_blob, repo_abbrev);
|
||||
err |= read_mailmap_file(map, git_mailmap_file, repo_abbrev);
|
||||
return err;
|
||||
}
|
||||
|
11
remote.c
11
remote.c
@ -455,7 +455,6 @@ static void read_config(void)
|
||||
{
|
||||
static int loaded;
|
||||
struct object_id oid;
|
||||
const char *head_ref;
|
||||
int flag;
|
||||
|
||||
if (loaded)
|
||||
@ -463,10 +462,12 @@ static void read_config(void)
|
||||
loaded = 1;
|
||||
|
||||
current_branch = NULL;
|
||||
head_ref = resolve_ref_unsafe("HEAD", 0, oid.hash, &flag);
|
||||
if (head_ref && (flag & REF_ISSYMREF) &&
|
||||
skip_prefix(head_ref, "refs/heads/", &head_ref)) {
|
||||
current_branch = make_branch(head_ref, 0);
|
||||
if (startup_info->have_repository) {
|
||||
const char *head_ref = resolve_ref_unsafe("HEAD", 0, oid.hash, &flag);
|
||||
if (head_ref && (flag & REF_ISSYMREF) &&
|
||||
skip_prefix(head_ref, "refs/heads/", &head_ref)) {
|
||||
current_branch = make_branch(head_ref, 0);
|
||||
}
|
||||
}
|
||||
git_config(handle_config, NULL);
|
||||
alias_all_urls();
|
||||
|
14
setup.c
14
setup.c
@ -7,6 +7,9 @@ static int inside_work_tree = -1;
|
||||
static int work_tree_config_is_bogus;
|
||||
static struct string_list unknown_extensions = STRING_LIST_INIT_DUP;
|
||||
|
||||
static struct startup_info the_startup_info;
|
||||
struct startup_info *startup_info = &the_startup_info;
|
||||
|
||||
/*
|
||||
* The input parameter must contain an absolute path, and it must already be
|
||||
* normalized.
|
||||
@ -905,10 +908,9 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
||||
else
|
||||
setenv(GIT_PREFIX_ENVIRONMENT, "", 1);
|
||||
|
||||
if (startup_info) {
|
||||
startup_info->have_repository = !nongit_ok || !*nongit_ok;
|
||||
startup_info->prefix = prefix;
|
||||
}
|
||||
startup_info->have_repository = !nongit_ok || !*nongit_ok;
|
||||
startup_info->prefix = prefix;
|
||||
|
||||
return prefix;
|
||||
}
|
||||
|
||||
@ -984,7 +986,9 @@ int check_repository_format_version(const char *var, const char *value, void *cb
|
||||
|
||||
int check_repository_format(void)
|
||||
{
|
||||
return check_repository_format_gently(get_git_dir(), NULL);
|
||||
check_repository_format_gently(get_git_dir(), NULL);
|
||||
startup_info->have_repository = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1353,9 +1353,6 @@ static char *resolve_relative_path(const char *rel)
|
||||
if (!starts_with(rel, "./") && !starts_with(rel, "../"))
|
||||
return NULL;
|
||||
|
||||
if (!startup_info)
|
||||
die("BUG: startup_info struct is not initialized.");
|
||||
|
||||
if (!is_inside_work_tree())
|
||||
die("relative path syntax can't be used outside working tree.");
|
||||
|
||||
|
@ -166,11 +166,6 @@ test_expect_success 'relative path when cwd is outside worktree' '
|
||||
grep "relative path syntax can.t be used outside working tree." error
|
||||
'
|
||||
|
||||
test_expect_success 'relative path when startup_info is NULL' '
|
||||
test_must_fail test-match-trees HEAD:./file.txt HEAD:./file.txt 2>error &&
|
||||
grep "BUG: startup_info struct is not initialized." error
|
||||
'
|
||||
|
||||
test_expect_success '<commit>:file correctly diagnosed after a pathname' '
|
||||
test_must_fail git rev-parse file.txt HEAD:file.txt 1>actual 2>error &&
|
||||
test_i18ngrep ! "exists on disk" error &&
|
||||
|
@ -905,6 +905,33 @@ test_expect_success 'inside git repository but with --no-index' '
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'grep --no-index descends into repos, but not .git' '
|
||||
rm -fr non &&
|
||||
mkdir -p non/git &&
|
||||
(
|
||||
GIT_CEILING_DIRECTORIES="$(pwd)/non" &&
|
||||
export GIT_CEILING_DIRECTORIES &&
|
||||
cd non/git &&
|
||||
|
||||
echo magic >file &&
|
||||
git init repo &&
|
||||
(
|
||||
cd repo &&
|
||||
echo magic >file &&
|
||||
git add file &&
|
||||
git commit -m foo &&
|
||||
echo magic >.git/file
|
||||
) &&
|
||||
|
||||
cat >expect <<-\EOF &&
|
||||
file
|
||||
repo/file
|
||||
EOF
|
||||
git grep -l --no-index magic >actual &&
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'setup double-dash tests' '
|
||||
cat >double-dash <<EOF &&
|
||||
--
|
||||
|
@ -6,6 +6,8 @@ int main(int ac, char **av)
|
||||
unsigned char hash1[20], hash2[20], shifted[20];
|
||||
struct tree *one, *two;
|
||||
|
||||
setup_git_directory();
|
||||
|
||||
if (get_sha1(av[1], hash1))
|
||||
die("cannot parse %s as an object name", av[1]);
|
||||
if (get_sha1(av[2], hash2))
|
||||
|
@ -50,6 +50,8 @@ int main(int argc, char **argv)
|
||||
if (argc < 2)
|
||||
return 1;
|
||||
|
||||
setup_git_directory();
|
||||
|
||||
if (!strcmp(argv[1], "run-twice")) {
|
||||
printf("1st\n");
|
||||
if (!run_revision_walk())
|
||||
|
Loading…
Reference in New Issue
Block a user