Skip to content

Commit 6eafa6d

Browse files
jlehmanngitster
authored andcommitted
submodules: don't stumble over symbolic links when cloning recursively
Since 69c3051 (submodules: refactor computation of relative gitdir path) cloning a submodule recursively fails for nested submodules when a symbolic link is part of the path to the work tree of the superproject. This happens when module_clone() tries to find the relative paths between the work tree and the git dir. When a symbolic link in current $PWD points to a directory that is at a different level, then determining the number of "../" needed to traverse to the superproject's work tree leads to a wrong result. As there is no portable way to say "pwd -P", use cd_to_toplevel to remove the link from $PWD, which fixes this problem. A test for this issue has been added to t7406. Reported-by: Bob Halley <[email protected]> Signed-off-by: Jens Lehmann <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 785ee49 commit 6eafa6d

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

git-submodule.sh

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,10 @@ module_clone()
149149
die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"
150150
fi
151151

152-
a=$(cd "$gitdir" && pwd)/
153-
b=$(cd "$path" && pwd)/
152+
# We already are at the root of the work tree but cd_to_toplevel will
153+
# resolve any symlinks that might be present in $PWD
154+
a=$(cd_to_toplevel && cd "$gitdir" && pwd)/
155+
b=$(cd_to_toplevel && cd "$path" && pwd)/
154156
# normalize Windows-style absolute paths to POSIX-style absolute paths
155157
case $a in [a-zA-Z]:/*) a=/${a%%:*}${a#*:} ;; esac
156158
case $b in [a-zA-Z]:/*) b=/${b%%:*}${b#*:} ;; esac

t/t7406-submodule-update.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,4 +636,17 @@ test_expect_success 'submodule update properly revives a moved submodule' '
636636
)
637637
'
638638

639+
test_expect_success SYMLINKS 'submodule update can handle symbolic links in pwd' '
640+
mkdir -p linked/dir &&
641+
ln -s linked/dir linkto &&
642+
(
643+
cd linkto &&
644+
git clone "$TRASH_DIRECTORY"/super_update_r2 super &&
645+
(
646+
cd super &&
647+
git submodule update --init --recursive
648+
)
649+
)
650+
'
651+
639652
test_done

0 commit comments

Comments
 (0)