Skip to content

Commit

Permalink
Merge branch 'jk/startup-info'
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Junio C Hamano committed Apr 3, 2016
2 parents 7ce0bee + 11e6b3f commit 05bf1cd
Show file tree
Hide file tree
Showing 13 changed files with 54 additions and 26 deletions.
6 changes: 4 additions & 2 deletions builtin/grep.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions builtin/init-db.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 0 additions & 1 deletion environment.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 0 additions & 3 deletions git.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = {
Expand Down Expand Up @@ -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";
Expand Down
3 changes: 2 additions & 1 deletion mailmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
11 changes: 6 additions & 5 deletions remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -455,18 +455,19 @@ static void read_config(void)
{
static int loaded;
struct object_id oid;
const char *head_ref;
int flag;

if (loaded)
return;
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();
Expand Down
14 changes: 9 additions & 5 deletions setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}

/*
Expand Down
3 changes: 0 additions & 3 deletions sha1_name.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.");

Expand Down
5 changes: 0 additions & 5 deletions t/t1506-rev-parse-diagnosis.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 &&
Expand Down
27 changes: 27 additions & 0 deletions t/t7810-grep.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 &&
--
Expand Down
2 changes: 2 additions & 0 deletions test-match-trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
2 changes: 2 additions & 0 deletions test-revision-walking.c
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down

0 comments on commit 05bf1cd

Please sign in to comment.