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