Merge branch 'jk/rev-parse-local-env-vars' into maint
The "--local-env-vars" and "--resolve-git-dir" options of "git rev-parse" failed to work outside a repository when the command's option parsing was rewritten in 1.8.5 era. * jk/rev-parse-local-env-vars: rev-parse: let some options run outside repository t1515: add tests for rev-parse out-of-repo helpers
This commit is contained in:
commit
7488c2f65a
@ -505,6 +505,7 @@ N_("git rev-parse --parseopt [<options>] -- [<args>...]\n"
|
|||||||
int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int i, as_is = 0, verify = 0, quiet = 0, revs_count = 0, type = 0;
|
int i, as_is = 0, verify = 0, quiet = 0, revs_count = 0, type = 0;
|
||||||
|
int did_repo_setup = 0;
|
||||||
int has_dashdash = 0;
|
int has_dashdash = 0;
|
||||||
int output_prefix = 0;
|
int output_prefix = 0;
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
@ -528,11 +529,40 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
prefix = setup_git_directory();
|
/* No options; just report on whether we're in a git repo or not. */
|
||||||
git_config(git_default_config, NULL);
|
if (argc == 1) {
|
||||||
|
setup_git_directory();
|
||||||
|
git_config(git_default_config, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
const char *arg = argv[i];
|
const char *arg = argv[i];
|
||||||
|
|
||||||
|
if (!strcmp(arg, "--local-env-vars")) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; local_repo_env[i]; i++)
|
||||||
|
printf("%s\n", local_repo_env[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!strcmp(arg, "--resolve-git-dir")) {
|
||||||
|
const char *gitdir = argv[++i];
|
||||||
|
if (!gitdir)
|
||||||
|
die("--resolve-git-dir requires an argument");
|
||||||
|
gitdir = resolve_gitdir(gitdir);
|
||||||
|
if (!gitdir)
|
||||||
|
die("not a gitdir '%s'", argv[i]);
|
||||||
|
puts(gitdir);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The rest of the options require a git repository. */
|
||||||
|
if (!did_repo_setup) {
|
||||||
|
prefix = setup_git_directory();
|
||||||
|
git_config(git_default_config, NULL);
|
||||||
|
did_repo_setup = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!strcmp(arg, "--git-path")) {
|
if (!strcmp(arg, "--git-path")) {
|
||||||
if (!argv[i + 1])
|
if (!argv[i + 1])
|
||||||
die("--git-path requires an argument");
|
die("--git-path requires an argument");
|
||||||
@ -706,12 +736,6 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
|||||||
add_ref_exclusion(&ref_excludes, arg + 10);
|
add_ref_exclusion(&ref_excludes, arg + 10);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "--local-env-vars")) {
|
|
||||||
int i;
|
|
||||||
for (i = 0; local_repo_env[i]; i++)
|
|
||||||
printf("%s\n", local_repo_env[i]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "--show-toplevel")) {
|
if (!strcmp(arg, "--show-toplevel")) {
|
||||||
const char *work_tree = get_git_work_tree();
|
const char *work_tree = get_git_work_tree();
|
||||||
if (work_tree)
|
if (work_tree)
|
||||||
@ -767,16 +791,6 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
|||||||
puts(prefix_filename(pfx, strlen(pfx), get_git_common_dir()));
|
puts(prefix_filename(pfx, strlen(pfx), get_git_common_dir()));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "--resolve-git-dir")) {
|
|
||||||
const char *gitdir = argv[++i];
|
|
||||||
if (!gitdir)
|
|
||||||
die("--resolve-git-dir requires an argument");
|
|
||||||
gitdir = resolve_gitdir(gitdir);
|
|
||||||
if (!gitdir)
|
|
||||||
die("not a gitdir '%s'", argv[i]);
|
|
||||||
puts(gitdir);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "--is-inside-git-dir")) {
|
if (!strcmp(arg, "--is-inside-git-dir")) {
|
||||||
printf("%s\n", is_inside_git_dir() ? "true"
|
printf("%s\n", is_inside_git_dir() ? "true"
|
||||||
: "false");
|
: "false");
|
||||||
|
45
t/t1515-rev-parse-outside-repo.sh
Executable file
45
t/t1515-rev-parse-outside-repo.sh
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='check that certain rev-parse options work outside repo'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_expect_success 'set up non-repo directory' '
|
||||||
|
GIT_CEILING_DIRECTORIES=$(pwd) &&
|
||||||
|
export GIT_CEILING_DIRECTORIES &&
|
||||||
|
mkdir non-repo &&
|
||||||
|
cd non-repo &&
|
||||||
|
# confirm that git does not find a repo
|
||||||
|
test_must_fail git rev-parse --git-dir
|
||||||
|
'
|
||||||
|
|
||||||
|
# Rather than directly test the output of sq-quote directly,
|
||||||
|
# make sure the shell can read back a tricky case, since
|
||||||
|
# that's what we really care about anyway.
|
||||||
|
tricky="really tricky with \\ and \" and '"
|
||||||
|
dump_args () {
|
||||||
|
for i in "$@"; do
|
||||||
|
echo "arg: $i"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
test_expect_success 'rev-parse --sq-quote' '
|
||||||
|
dump_args "$tricky" easy >expect &&
|
||||||
|
eval "dump_args $(git rev-parse --sq-quote "$tricky" easy)" >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rev-parse --local-env-vars' '
|
||||||
|
git rev-parse --local-env-vars >actual &&
|
||||||
|
# we do not want to depend on the complete list here,
|
||||||
|
# so just look for something plausible
|
||||||
|
grep ^GIT_DIR actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rev-parse --resolve-git-dir' '
|
||||||
|
git init --separate-git-dir repo dir &&
|
||||||
|
test_must_fail git rev-parse --resolve-git-dir . &&
|
||||||
|
echo "$(pwd)/repo" >expect &&
|
||||||
|
git rev-parse --resolve-git-dir dir/.git >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
Loading…
Reference in New Issue
Block a user