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 <halley@play-bow.org> Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jens Lehmann committed Jul 12, 2012 at 19:45 UTC 6eafa6d096ce6b0ae20e4c0fbb248958559daf64
2 files changed +17 -2
git-submodule.sh
+4 -2
@@ -149,8 +149,10 @@ module_clone()
149 die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"
150 fi
151
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)/
156 # normalize Windows-style absolute paths to POSIX-style absolute paths
157 case $a in [a-zA-Z]:/*) a=/${a%%:*}${a#*:} ;; esac
158 case $b in [a-zA-Z]:/*) b=/${b%%:*}${b#*:} ;; esac
t/t7406-submodule-update.sh
+13
@@ -636,4 +636,17 @@ test_expect_success 'submodule update properly revives a moved submodule' '
636 )
637 '
638
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 +
652 test_done