X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=git-submodule.sh;h=4aaaaab0d8450094efb8d2f8e82cc63383b91b48;hb=9d3014566302ad0d3d378b0a1653959b3118066d;hp=1f0cb99dcb09cd0db0f34ed9f70467cee0fe922b;hpb=11a264050f61bb15c413cced058db2ac96fd96f9;p=git.git diff --git a/git-submodule.sh b/git-submodule.sh index 1f0cb99dc..4aaaaab0d 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -39,6 +39,32 @@ get_repo_base() { ) 2>/dev/null } +# Resolve relative url by appending to parent's url +resolve_relative_url () +{ + branch="$(git symbolic-ref HEAD 2>/dev/null)" + remote="$(git config branch.${branch#refs/heads/}.remote)" + remote="${remote:-origin}" + remoteurl="$(git config remote.$remote.url)" || + die "remote ($remote) does not have a url in .git/config" + url="$1" + while test -n "$url" + do + case "$url" in + ../*) + url="${url#../}" + remoteurl="${remoteurl%/*}" + ;; + ./*) + url="${url#./}" + ;; + *) + break;; + esac + done + echo "$remoteurl/$url" +} + # # Map submodule path to submodule name # @@ -46,8 +72,11 @@ get_repo_base() { # module_name() { - name=$(GIT_CONFIG=.gitmodules git config --get-regexp '^submodule\..*\.path$' "$1" | - sed -nre 's/^submodule\.(.+)\.path .+$/\1/p') + # Do we have "submodule..path = $1" defined in .gitmodules file? + re=$(printf '%s' "$1" | sed -e 's/\([^a-zA-Z0-9_]\)/\\\1/g') + name=$( GIT_CONFIG=.gitmodules \ + git config --get-regexp '^submodule\..*\.path$' | + sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' ) test -z "$name" && die "No submodule mapping found in .gitmodules for path '$path'" echo "$name" @@ -100,11 +129,19 @@ module_add() usage fi - # Turn the source into an absolute path if - # it is local - if base=$(get_repo_base "$repo"); then - repo="$base" - fi + 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 # Guess path from repo if not specified or strip trailing slashes if test -z "$path"; then @@ -119,7 +156,7 @@ module_add() git ls-files --error-unmatch "$path" > /dev/null 2>&1 && die "'$path' already exists in the index" - module_clone "$path" "$repo" || exit + module_clone "$path" "$realrepo" || exit (unset GIT_DIR && cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) || die "Unable to checkout submodule '$path'" git add "$path" || @@ -150,6 +187,13 @@ modules_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 + git config submodule."$name".url "$url" || die "Failed to register url for submodule path '$path'" @@ -233,7 +277,6 @@ modules_list() say "-$sha1 $path" continue; fi - revname=$(unset GIT_DIR && cd "$path" && git describe --tags $sha1) set_name_rev "$path" "$sha1" if git diff-files --quiet -- "$path" then @@ -249,7 +292,7 @@ modules_list() done } -while case "$#" in 0) break ;; esac +while test $# != 0 do case "$1" in add) @@ -311,7 +354,7 @@ case "$add,$init,$update,$status,$cached" in ,,1,,) modules_update "$@" ;; -,,,1,*) +,,,*,*) modules_list "$@" ;; *)