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:
Junio C Hamano 2016-04-14 18:57:46 -07:00
commit 237e6db5c0
13 changed files with 54 additions and 26 deletions

View file

@ -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) {

View file

@ -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;
}

View file

@ -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;

View file

@ -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
View file

@ -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";

View file

@ -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;
}

View file

@ -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
View file

@ -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;
}
/*

View file

@ -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.");

View file

@ -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 &&

View file

@ -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 &&
--

View file

@ -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))

View file

@ -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())