File tree Expand file tree Collapse file tree 4 files changed +63
-2
lines changed Expand file tree Collapse file tree 4 files changed +63
-2
lines changed Original file line number Diff line number Diff line change @@ -301,7 +301,18 @@ impl ThreadSafeRepository {
301
301
| gix_config:: Source :: EnvOverride => wt_path,
302
302
_ => git_dir. join ( wt_path) . into ( ) ,
303
303
} ;
304
- worktree_dir = gix_path:: normalize ( wt_path, current_dir) . map ( Cow :: into_owned) ;
304
+
305
+ // the reason we use realpath instead of gix_path::normalize here is because there
306
+ // could be any intermediate symlinks (for example due to a symlinked .git
307
+ // directory)
308
+ worktree_dir = gix_path:: realpath ( & wt_path) . ok ( ) ;
309
+ // restore the relative path if possible after resolving the absolute path
310
+ if wt_path. is_relative ( ) {
311
+ if let Some ( rel_path) = worktree_dir. as_deref ( ) . and_then ( |p| p. strip_prefix ( current_dir) . ok ( ) ) {
312
+ worktree_dir = Some ( rel_path. to_path_buf ( ) ) ;
313
+ }
314
+ }
315
+
305
316
#[ allow( unused_variables) ]
306
317
if let Some ( worktree_path) = worktree_dir. as_deref ( ) . filter ( |wtd| !wtd. is_dir ( ) ) {
307
318
gix_trace:: warn!( "The configured worktree path '{}' is not a directory or doesn't exist - `core.worktree` may be misleading" , worktree_path. display( ) ) ;
Original file line number Diff line number Diff line change 8
8
/make_signatures_repo.tar
9
9
/make_diff_repos.tar
10
10
/make_submodule_with_worktree.tar
11
- /repo_with_untracked_files.tar
11
+ /repo_with_untracked_files.tar
12
+ /make_submodule_with_symlinked_git_dir.tar
Original file line number Diff line number Diff line change
1
+ #! /usr/bin/env bash
2
+ set -eu -o pipefail
3
+
4
+ git init -q module1
5
+ (cd module1
6
+ touch this
7
+ mkdir subdir
8
+ touch subdir/that
9
+ git add .
10
+ git commit -q -m c1
11
+ echo hello >> this
12
+ git commit -q -am c2
13
+ touch untracked
14
+ )
15
+
16
+ mkdir symlinked-git-dir
17
+ (cd symlinked-git-dir
18
+ git init -q r1
19
+ (cd r1
20
+ git commit -q --allow-empty -m " init"
21
+ )
22
+
23
+ git config -f r1/.git/config core.worktree " $( pwd) "
24
+ ln -s r1/.git .git
25
+
26
+ git -c protocol.file.allow=always submodule add ../module1 m1
27
+ git commit -m " add module 1"
28
+ )
Original file line number Diff line number Diff line change @@ -310,6 +310,27 @@ mod index_worktree {
310
310
) ;
311
311
}
312
312
313
+ #[ test]
314
+ fn submodule_in_symlinked_dir ( ) -> crate :: Result {
315
+ use crate :: util:: named_subrepo_opts;
316
+ let repo = named_subrepo_opts (
317
+ "make_submodule_with_symlinked_git_dir.sh" ,
318
+ "symlinked-git-dir" ,
319
+ gix:: open:: Options :: isolated ( ) ,
320
+ ) ?;
321
+ let status = repo
322
+ . status ( gix:: progress:: Discard ) ?
323
+ . index_worktree_options_mut ( |opts| {
324
+ opts. sorting =
325
+ Some ( gix:: status:: plumbing:: index_as_worktree_with_renames:: Sorting :: ByPathCaseSensitive ) ;
326
+ } )
327
+ . into_index_worktree_iter ( None ) ?;
328
+ for change in status {
329
+ change?;
330
+ }
331
+ Ok ( ( ) )
332
+ }
333
+
313
334
#[ test]
314
335
fn submodule_modification ( ) -> crate :: Result {
315
336
let repo = submodule_repo ( "modified-untracked-and-submodule-head-changed-and-modified" ) ?;
You can’t perform that action at this time.
0 commit comments