submodule: fix relative url parsing for scp-style origin
The function resolve_relative_url was not prepared to deal with an scp-style origin 'user@host:path' in the case where 'path' is only a single component. Fix this by extending the logic that strips one path component from the $remoteurl. Also add tests for both styles of URLs. Noticed-by: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com> Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
cb198b3b67
commit
ea640cc691
@ -36,12 +36,24 @@ resolve_relative_url ()
|
|||||||
die "remote ($remote) does not have a url defined in .git/config"
|
die "remote ($remote) does not have a url defined in .git/config"
|
||||||
url="$1"
|
url="$1"
|
||||||
remoteurl=${remoteurl%/}
|
remoteurl=${remoteurl%/}
|
||||||
|
sep=/
|
||||||
while test -n "$url"
|
while test -n "$url"
|
||||||
do
|
do
|
||||||
case "$url" in
|
case "$url" in
|
||||||
../*)
|
../*)
|
||||||
url="${url#../}"
|
url="${url#../}"
|
||||||
remoteurl="${remoteurl%/*}"
|
case "$remoteurl" in
|
||||||
|
*/*)
|
||||||
|
remoteurl="${remoteurl%/*}"
|
||||||
|
;;
|
||||||
|
*:*)
|
||||||
|
remoteurl="${remoteurl%:*}"
|
||||||
|
sep=:
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
die "cannot strip one component off url '$remoteurl'"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
;;
|
;;
|
||||||
./*)
|
./*)
|
||||||
url="${url#./}"
|
url="${url#./}"
|
||||||
@ -50,7 +62,7 @@ resolve_relative_url ()
|
|||||||
break;;
|
break;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
echo "$remoteurl/${url%/}"
|
echo "$remoteurl$sep${url%/}"
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -331,4 +331,42 @@ test_expect_success 'add submodules without specifying an explicit path' '
|
|||||||
git config -f .gitmodules submodule.bare.path bare
|
git config -f .gitmodules submodule.bare.path bare
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'set up for relative path tests' '
|
||||||
|
mkdir reltest &&
|
||||||
|
(
|
||||||
|
cd reltest &&
|
||||||
|
git init &&
|
||||||
|
mkdir sub &&
|
||||||
|
(
|
||||||
|
cd sub &&
|
||||||
|
git init &&
|
||||||
|
test_commit foo
|
||||||
|
) &&
|
||||||
|
git add sub &&
|
||||||
|
git config -f .gitmodules submodule.sub.path sub &&
|
||||||
|
git config -f .gitmodules submodule.sub.url ../subrepo &&
|
||||||
|
cp .git/config pristine-.git-config
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'relative path works with URL' '
|
||||||
|
(
|
||||||
|
cd reltest &&
|
||||||
|
cp pristine-.git-config .git/config &&
|
||||||
|
git config remote.origin.url ssh://hostname/repo &&
|
||||||
|
git submodule init &&
|
||||||
|
test "$(git config submodule.sub.url)" = ssh://hostname/subrepo
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'relative path works with user@host:path' '
|
||||||
|
(
|
||||||
|
cd reltest &&
|
||||||
|
cp pristine-.git-config .git/config &&
|
||||||
|
git config remote.origin.url user@host:repo &&
|
||||||
|
git submodule init &&
|
||||||
|
test "$(git config submodule.sub.url)" = user@host:subrepo
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Reference in New Issue
Block a user