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>

Fredrik Gustafsson committed Aug 15, 2011 at 23:17 UTC abc06822af57347d35c0cd64b67e1faeb5b65c71
7 files changed +78 -54
Documentation/git-rev-parse.txt
+4
@@ -180,6 +180,10 @@ print a message to stderr and exit with nonzero status.
180 <args>...::
181 Flags and parameters to be parsed.
182
183 +--resolve-git-dir <path>::
184 + Check if <path> is a valid git-dir or a git-file pointing to a valid
185 + git-dir. If <path> is a valid git-dir the resolved path to git-dir will
186 + be printed.
187
188 include::revisions.txt[]
189
builtin/rev-parse.c
+8
@@ -468,6 +468,14 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
468 return 0;
469 }
470
471 + if (argc > 2 && !strcmp(argv[1], "--resolve-git-dir")) {
472 + const char *gitdir = resolve_gitdir(argv[2]);
473 + if (!gitdir)
474 + die("not a gitdir '%s'", argv[2]);
475 + puts(gitdir);
476 + return 0;
477 + }
478 +
479 if (argc > 1 && !strcmp("-h", argv[1]))
480 usage(builtin_rev_parse_usage);
481
cache.h
+1
@@ -436,6 +436,7 @@ extern char *get_graft_file(void);
436 extern int set_git_dir(const char *path);
437 extern const char *get_git_work_tree(void);
438 extern const char *read_gitfile_gently(const char *path);
439 +extern const char *resolve_gitdir(const char *suspect);
440 extern void set_git_work_tree(const char *tree);
441
442 #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
setup.c
+7
@@ -808,3 +808,10 @@ const char *setup_git_directory(void)
808 {
809 return setup_git_directory_gently(NULL);
810 }
811 +
812 +const char *resolve_gitdir(const char *suspect)
813 +{
814 + if (is_git_directory(suspect))
815 + return suspect;
816 + return read_gitfile_gently(suspect);
817 +}
t/t7400-submodule-basic.sh
+2 -2
@@ -360,10 +360,10 @@ test_expect_success 'update --init' '
360 git submodule update init > update.out &&
361 cat update.out &&
362 test_i18ngrep "not initialized" update.out &&
363 - ! test -d init/.git &&
363 + test_must_fail git rev-parse --resolve-git-dir init/.git &&
364
365 git submodule update --init init &&
366 - test -d init/.git
366 + git rev-parse --resolve-git-dir init/.git
367 '
368
369 test_expect_success 'do not add files from a submodule' '
t/t7403-submodule-sync.sh
+3 -2
@@ -56,8 +56,9 @@ test_expect_success '"git submodule sync" should update submodule URLs' '
56 git pull --no-recurse-submodules &&
57 git submodule sync
58 ) &&
59 - test -d "$(git config -f super-clone/submodule/.git/config \
60 - remote.origin.url)" &&
59 + test -d "$(cd super-clone/submodule &&
60 + git config remote.origin.url
61 + )" &&
62 (cd super-clone/submodule &&
63 git checkout master &&
64 git pull
t/t7407-submodule-foreach.sh
+53 -50
@@ -118,19 +118,19 @@ test_expect_success 'use "submodule foreach" to checkout 2nd level submodule' '
118 git clone super clone2 &&
119 (
120 cd clone2 &&
121 - test ! -d sub1/.git &&
122 - test ! -d sub2/.git &&
123 - test ! -d sub3/.git &&
124 - test ! -d nested1/.git &&
121 + test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
122 + test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
123 + test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
124 + test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
125 git submodule update --init &&
126 - test -d sub1/.git &&
127 - test -d sub2/.git &&
128 - test -d sub3/.git &&
129 - test -d nested1/.git &&
130 - test ! -d nested1/nested2/.git &&
126 + git rev-parse --resolve-git-dir sub1/.git &&
127 + git rev-parse --resolve-git-dir sub2/.git &&
128 + git rev-parse --resolve-git-dir sub3/.git &&
129 + git rev-parse --resolve-git-dir nested1/.git &&
130 + test_must_fail git rev-parse --resolve-git-dir nested1/nested2/.git &&
131 git submodule foreach "git submodule update --init" &&
132 - test -d nested1/nested2/.git &&
133 - test ! -d nested1/nested2/nested3/.git
132 + git rev-parse --resolve-git-dir nested1/nested1/nested2/.git
133 + test_must_fail git rev-parse --resolve-git-dir nested1/nested2/nested3/.git
134 )
135 '
136
@@ -138,8 +138,8 @@ test_expect_success 'use "foreach --recursive" to checkout all submodules' '
138 (
139 cd clone2 &&
140 git submodule foreach --recursive "git submodule update --init" &&
141 - test -d nested1/nested2/nested3/.git &&
142 - test -d nested1/nested2/nested3/submodule/.git
141 + git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
142 + git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
143 )
144 '
145
@@ -183,18 +183,18 @@ test_expect_success 'use "update --recursive" to checkout all submodules' '
183 git clone super clone3 &&
184 (
185 cd clone3 &&
186 - test ! -d sub1/.git &&
187 - test ! -d sub2/.git &&
188 - test ! -d sub3/.git &&
189 - test ! -d nested1/.git &&
186 + test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
187 + test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
188 + test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
189 + test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
190 git submodule update --init --recursive &&
191 - test -d sub1/.git &&
192 - test -d sub2/.git &&
193 - test -d sub3/.git &&
194 - test -d nested1/.git &&
195 - test -d nested1/nested2/.git &&
196 - test -d nested1/nested2/nested3/.git &&
197 - test -d nested1/nested2/nested3/submodule/.git
191 + git rev-parse --resolve-git-dir sub1/.git &&
192 + git rev-parse --resolve-git-dir sub2/.git &&
193 + git rev-parse --resolve-git-dir sub3/.git &&
194 + git rev-parse --resolve-git-dir nested1/.git &&
195 + git rev-parse --resolve-git-dir nested1/nested2/.git &&
196 + git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
197 + git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
198 )
199 '
200
@@ -247,14 +247,17 @@ test_expect_success 'ensure "status --cached --recursive" preserves the --cached
247
248 test_expect_success 'use "git clone --recursive" to checkout all submodules' '
249 git clone --recursive super clone4 &&
250 - test -d clone4/.git &&
251 - test -d clone4/sub1/.git &&
252 - test -d clone4/sub2/.git &&
253 - test -d clone4/sub3/.git &&
254 - test -d clone4/nested1/.git &&
255 - test -d clone4/nested1/nested2/.git &&
256 - test -d clone4/nested1/nested2/nested3/.git &&
257 - test -d clone4/nested1/nested2/nested3/submodule/.git
250 + (
251 + cd clone4 &&
252 + git rev-parse --resolve-git-dir .git &&
253 + git rev-parse --resolve-git-dir sub1/.git &&
254 + git rev-parse --resolve-git-dir sub2/.git &&
255 + git rev-parse --resolve-git-dir sub3/.git &&
256 + git rev-parse --resolve-git-dir nested1/.git &&
257 + git rev-parse --resolve-git-dir nested1/nested2/.git &&
258 + git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
259 + git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
260 + )
261 '
262
263 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' '
265 git clone super clone5 &&
266 (
267 cd clone5 &&
265 - test ! -d nested1/.git &&
268 + test_must_fail git rev-parse --resolve-git-dir d nested1/.git &&
269 git submodule update --init --recursive --reference="$(dirname "$PWD")/common objects" &&
267 - test -d nested1/.git &&
268 - test -d nested1/nested2/.git &&
269 - test -d nested1/nested2/nested3/.git &&
270 - test -f nested1/.git/objects/info/alternates &&
271 - test -f nested1/nested2/.git/objects/info/alternates &&
272 - test -f nested1/nested2/nested3/.git/objects/info/alternates
270 + git rev-parse --resolve-git-dir nested1/.git &&
271 + git rev-parse --resolve-git-dir nested1/nested2/.git &&
272 + git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
273 + test -f .git/modules/nested1/objects/info/alternates &&
274 + test -f .git/modules/nested1/modules/nested2/objects/info/alternates &&
275 + test -f .git/modules/nested1/modules/nested2/modules/nested3/objects/info/alternates
276 )
277 '
278
@@ -277,18 +280,18 @@ test_expect_success 'use "update --recursive nested1" to checkout all submodules
280 git clone super clone6 &&
281 (
282 cd clone6 &&
280 - test ! -d sub1/.git &&
281 - test ! -d sub2/.git &&
282 - test ! -d sub3/.git &&
283 - test ! -d nested1/.git &&
283 + test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
284 + test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
285 + test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
286 + test_must_fail git rev-parse --resolve-git-dir nested1/.git &&
287 git submodule update --init --recursive -- nested1 &&
285 - test ! -d sub1/.git &&
286 - test ! -d sub2/.git &&
287 - test ! -d sub3/.git &&
288 - test -d nested1/.git &&
289 - test -d nested1/nested2/.git &&
290 - test -d nested1/nested2/nested3/.git &&
291 - test -d nested1/nested2/nested3/submodule/.git
288 + test_must_fail git rev-parse --resolve-git-dir sub1/.git &&
289 + test_must_fail git rev-parse --resolve-git-dir sub2/.git &&
290 + test_must_fail git rev-parse --resolve-git-dir sub3/.git &&
291 + git rev-parse --resolve-git-dir nested1/.git &&
292 + git rev-parse --resolve-git-dir nested1/nested2/.git &&
293 + git rev-parse --resolve-git-dir nested1/nested2/nested3/.git &&
294 + git rev-parse --resolve-git-dir nested1/nested2/nested3/submodule/.git
295 )
296 '
297