From f89b08edaa44f89a534dcb4fc17344ea49c5dadb Mon Sep 17 00:00:00 2001 From: Ping Yin Date: Thu, 13 Mar 2008 00:09:57 +0800 Subject: [PATCH 2/7] git-submodule: Fix inconsistent handling of relative urls with './' prefix There is a little inconsistence in current handling of relative url with "./" - "git submodule add ./foo" will clone the submodule with url "${remote.origin.url}/foo" and init an entry 'submodule.foo.url=./foo" in .gitmodules - "git submodule init" will init an entry in $GIT_DIR/config as "submodule.foo.url=${remote.origin.url}/foo" - However, if there is an entry "submodule.foo.url=./foo" in $GIT_DIR/config, "git submodule update" will not expand "./foo" with remote.origin.url This patch unifies the behaviour of handling relative urls with './' prefix. Now "git submodule init" copies urls from .gitmodules to $GIT_DIR/config as is without expanding. And the url expanding happens only at runtime, say when "git submodule add" or "git submodule update". absolute_url is extracted to remove code redundance and fix inconsistence in cmd_init and cmd_add when resolving relative url/path to absolute one. Also move resolving absolute url logic from cmd_add to module_clone which results in the expected behaviour change: cmd_update will resolve url './foo' in $GIT_DIR/config as "${remote.origin.url}/foo" instead of "$(pwd)/foo". This behaviour change breaks t7400 which uses relative url './.subrepo'. However, this test originally doesn't mean to test relative url with './' prefix, so fix the url as '.subrepo'. Signed-off-by: Ping Yin --- git-submodule.sh | 41 ++++++++++++++++++----------------------- t/t7400-submodule-basic.sh | 2 +- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index e71e1f0..198ea44 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -65,6 +65,21 @@ resolve_relative_url () echo "$remoteurl/$url" } +# Resolve relative url/path to absolute one +absolute_url () { + case "$1" in + ./*|../*) + # dereference source url relative to parent's url + url="$(resolve_relative_url $1)" ;; + *) + # Turn the source into an absolute path if it is local + url=$(get_repo_base "$1") || + url=$1 + ;; + esac + echo "$url" +} + # # Map submodule path to submodule name # @@ -112,7 +127,7 @@ module_info() { module_clone() { path=$1 - url=$2 + url=$(absolute_url "$2") # If there already is a directory at the submodule path, # expect it to be empty (since that is the default checkout @@ -195,21 +210,7 @@ cmd_add() die "'$path' already exists and is not a valid git repo" fi else - case "$repo" in - ./*|../*) - # dereference source url relative to parent's url - realrepo="$(resolve_relative_url $repo)" ;; - *) - # Turn the source into an absolute path if - # it is local - if base=$(get_repo_base "$repo"); then - repo="$base" - fi - realrepo=$repo - ;; - esac - - module_clone "$path" "$realrepo" || exit + module_clone "$path" "$repo" || exit (unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) || die "Unable to checkout submodule '$path'" fi @@ -262,13 +263,7 @@ cmd_init() test -z "$url" && die "No url found for submodule path '$path' in .gitmodules" - # Possibly a url relative to parent - case "$url" in - ./*|../*) - url="$(resolve_relative_url "$url")" - ;; - esac - + url=$(absolute_url "$url") git config submodule."$name".url "$url" || die "Failed to register url for submodule path '$path'" diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index 2ef85a8..e5d59b8 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -75,7 +75,7 @@ test_expect_success 'init should register submodule url in .git/config' ' then echo "[OOPS] init succeeded but submodule url is wrong" false - elif ! git config submodule.example.url ./.subrepo + elif ! git config submodule.example.url .subrepo then echo "[OOPS] init succeeded but update of url failed" false -- 1.5.5.70.gd68a