rev-parse: add option --resolve-git-dir <path>

Check if <path> is a valid git-dir or a valid git-file that points
to a valid git-dir.

We want tests to be independent from the fact that a git-dir may
be a git-file. Thus we changed tests to use this feature.

Signed-off-by: Fredrik Gustafsson <iveqy@iveqy.com>
Mentored-by: Jens Lehmann <Jens.Lehmann@web.de>
Mentored-by: Heiko Voigt <hvoigt@hvoigt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Fredrik Gustafsson 2011-08-15 23:17:46 +02:00 committed by Junio C Hamano
parent e7a85be3cf
commit abc06822af
7 changed files with 78 additions and 54 deletions

View File

@ -180,6 +180,10 @@ print a message to stderr and exit with nonzero status.
<args>...:: <args>...::
Flags and parameters to be parsed. Flags and parameters to be parsed.
--resolve-git-dir <path>::
Check if <path> is a valid git-dir or a git-file pointing to a valid
git-dir. If <path> is a valid git-dir the resolved path to git-dir will
be printed.
include::revisions.txt[] include::revisions.txt[]

View File

@ -468,6 +468,14 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
return 0; return 0;
} }
if (argc > 2 && !strcmp(argv[1], "--resolve-git-dir")) {
const char *gitdir = resolve_gitdir(argv[2]);
if (!gitdir)
die("not a gitdir '%s'", argv[2]);
puts(gitdir);
return 0;
}
if (argc > 1 && !strcmp("-h", argv[1])) if (argc > 1 && !strcmp("-h", argv[1]))
usage(builtin_rev_parse_usage); usage(builtin_rev_parse_usage);

View File

@ -436,6 +436,7 @@ extern char *get_graft_file(void);
extern int set_git_dir(const char *path); extern int set_git_dir(const char *path);
extern const char *get_git_work_tree(void); extern const char *get_git_work_tree(void);
extern const char *read_gitfile_gently(const char *path); extern const char *read_gitfile_gently(const char *path);
extern const char *resolve_gitdir(const char *suspect);
extern void set_git_work_tree(const char *tree); extern void set_git_work_tree(const char *tree);
#define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES" #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"

View File

@ -808,3 +808,10 @@ const char *setup_git_directory(void)
{ {
return setup_git_directory_gently(NULL); return setup_git_directory_gently(NULL);
} }
const char *resolve_gitdir(const char *suspect)
{
if (is_git_directory(suspect))
return suspect;
return read_gitfile_gently(suspect);
}

View File

@ -360,10 +360,10 @@ test_expect_success 'update --init' '
git submodule update init > update.out && git submodule update init > update.out &&
cat update.out && cat update.out &&
test_i18ngrep "not initialized" update.out && test_i18ngrep "not initialized" update.out &&
! test -d init/.git && test_must_fail git rev-parse --resolve-git-dir init/.git &&
git submodule update --init init && git submodule update --init init &&
test -d init/.git git rev-parse --resolve-git-dir init/.git
' '
test_expect_success 'do not add files from a submodule' ' test_expect_success 'do not add files from a submodule' '

View File

@ -56,8 +56,9 @@ test_expect_success '"git submodule sync" should update submodule URLs' '
git pull --no-recurse-submodules && git pull --no-recurse-submodules &&
git submodule sync git submodule sync
) && ) &&
test -d "$(git config -f super-clone/submodule/.git/config \ test -d "$(cd super-clone/submodule &&
remote.origin.url)" && git config remote.origin.url
)" &&
(cd super-clone/submodule && (cd super-clone/submodule &&
git checkout master && git checkout master &&
git pull git pull

View File

@ -118,19 +118,19 @@ test_expect_success 'use "submodule foreach" to checkout 2nd level submodule' '
git clone super clone2 && git clone super clone2 &&
( (
cd clone2 && cd clone2 &&
test ! -d sub1/.git && test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
test ! -d sub2/.git && test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
test ! -d sub3/.git && test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
test ! -d nested1/.git && test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
git submodule update --init && git submodule update --init &&
test -d sub1/.git && git rev-parse --resolve-git-dir sub1/.git &&
test -d sub2/.git && git rev-parse --resolve-git-dir sub2/.git &&
test -d sub3/.git && git rev-parse --resolve-git-dir sub3/.git &&
test -d nested1/.git && git rev-parse --resolve-git-dir nested1/.git &&
test ! -d nested1/nested2/.git && test_must_fail git rev-parse --resolve-git-dir nested1/nested2/.git &&
git submodule foreach "git submodule update --init" && git submodule foreach "git submodule update --init" &&
test -d nested1/nested2/.git && git rev-parse --resolve-git-dir nested1/nested1/nested2/.git
test ! -d nested1/nested2/nested3/.git test_must_fail git rev-parse --resolve-git-dir nested1/nested2/nested3/.git
) )
' '
@ -138,8 +138,8 @@ test_expect_success 'use "foreach --recursive" to checkout all submodules' '
( (
cd clone2 && cd clone2 &&
git submodule foreach --recursive "git submodule update --init" && git submodule foreach --recursive "git submodule update --init" &&
test -d nested1/nested2/nested3/.git && git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
test -d nested1/nested2/nested3/submodule/.git git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
) )
' '
@ -183,18 +183,18 @@ test_expect_success 'use "update --recursive" to checkout all submodules' '
git clone super clone3 && git clone super clone3 &&
( (
cd clone3 && cd clone3 &&
test ! -d sub1/.git && test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
test ! -d sub2/.git && test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
test ! -d sub3/.git && test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
test ! -d nested1/.git && test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
git submodule update --init --recursive && git submodule update --init --recursive &&
test -d sub1/.git && git rev-parse --resolve-git-dir sub1/.git &&
test -d sub2/.git && git rev-parse --resolve-git-dir sub2/.git &&
test -d sub3/.git && git rev-parse --resolve-git-dir sub3/.git &&
test -d nested1/.git && git rev-parse --resolve-git-dir nested1/.git &&
test -d nested1/nested2/.git && git rev-parse --resolve-git-dir nested1/nested2/.git &&
test -d nested1/nested2/nested3/.git && git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
test -d nested1/nested2/nested3/submodule/.git git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
) )
' '
@ -247,14 +247,17 @@ test_expect_success 'ensure "status --cached --recursive" preserves the --cached
test_expect_success 'use "git clone --recursive" to checkout all submodules' ' test_expect_success 'use "git clone --recursive" to checkout all submodules' '
git clone --recursive super clone4 && git clone --recursive super clone4 &&
test -d clone4/.git && (
test -d clone4/sub1/.git && cd clone4 &&
test -d clone4/sub2/.git && git rev-parse --resolve-git-dir .git &&
test -d clone4/sub3/.git && git rev-parse --resolve-git-dir sub1/.git &&
test -d clone4/nested1/.git && git rev-parse --resolve-git-dir sub2/.git &&
test -d clone4/nested1/nested2/.git && git rev-parse --resolve-git-dir sub3/.git &&
test -d clone4/nested1/nested2/nested3/.git && git rev-parse --resolve-git-dir nested1/.git &&
test -d clone4/nested1/nested2/nested3/submodule/.git git rev-parse --resolve-git-dir nested1/nested2/.git &&
git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
)
' '
test_expect_success 'test "update --recursive" with a flag with spaces' ' test_expect_success 'test "update --recursive" with a flag with spaces' '
@ -262,14 +265,14 @@ test_expect_success 'test "update --recursive" with a flag with spaces' '
git clone super clone5 && git clone super clone5 &&
( (
cd clone5 && cd clone5 &&
test ! -d nested1/.git && test_must_fail git rev-parse --resolve-git-dir d nested1/.git &&
git submodule update --init --recursive --reference="$(dirname "$PWD")/common objects" && git submodule update --init --recursive --reference="$(dirname "$PWD")/common objects" &&
test -d nested1/.git && git rev-parse --resolve-git-dir nested1/.git &&
test -d nested1/nested2/.git && git rev-parse --resolve-git-dir nested1/nested2/.git &&
test -d nested1/nested2/nested3/.git && git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
test -f nested1/.git/objects/info/alternates && test -f .git/modules/nested1/objects/info/alternates &&
test -f nested1/nested2/.git/objects/info/alternates && test -f .git/modules/nested1/modules/nested2/objects/info/alternates &&
test -f nested1/nested2/nested3/.git/objects/info/alternates test -f .git/modules/nested1/modules/nested2/modules/nested3/objects/info/alternates
) )
' '
@ -277,18 +280,18 @@ test_expect_success 'use "update --recursive nested1" to checkout all submodules
git clone super clone6 && git clone super clone6 &&
( (
cd clone6 && cd clone6 &&
test ! -d sub1/.git && test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
test ! -d sub2/.git && test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
test ! -d sub3/.git && test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
test ! -d nested1/.git && test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
git submodule update --init --recursive -- nested1 && git submodule update --init --recursive -- nested1 &&
test ! -d sub1/.git && test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
test ! -d sub2/.git && test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
test ! -d sub3/.git && test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
test -d nested1/.git && git rev-parse --resolve-git-dir nested1/.git &&
test -d nested1/nested2/.git && git rev-parse --resolve-git-dir nested1/nested2/.git &&
test -d nested1/nested2/nested3/.git && git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
test -d nested1/nested2/nested3/submodule/.git git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
) )
' '