Merge branch 'ml/submodule'

* ml/submodule:
  git-submodule - allow a relative path as the subproject url
This commit is contained in:
Junio C Hamano
2007-09-29 16:43:10 -07:00
2 changed files with 50 additions and 6 deletions

View File

@ -21,6 +21,9 @@ add::
repository is cloned at the specified path, added to the repository is cloned at the specified path, added to the
changeset and registered in .gitmodules. If no path is changeset and registered in .gitmodules. If no path is
specified, the path is deduced from the repository specification. specified, the path is deduced from the repository specification.
If the repository url begins with ./ or ../, it is stored as
given but resolved as a relative path from the main project's
url when cloning.
status:: status::
Show the status of the submodules. This will print the SHA-1 of the Show the status of the submodules. This will print the SHA-1 of the

View File

@ -39,6 +39,32 @@ get_repo_base() {
) 2>/dev/null ) 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 # Map submodule path to submodule name
# #
@ -103,11 +129,19 @@ module_add()
usage usage
fi fi
# Turn the source into an absolute path if case "$repo" in
# it is local ./*|../*)
if base=$(get_repo_base "$repo"); then # dereference source url relative to parent's url
repo="$base" realrepo="$(resolve_relative_url $repo)" ;;
fi *)
# Turn the source into an absolute path if
# it is local
if base=$(get_repo_base "$repo"); then
repo="$base"
realrepo=$repo
fi
;;
esac
# Guess path from repo if not specified or strip trailing slashes # Guess path from repo if not specified or strip trailing slashes
if test -z "$path"; then if test -z "$path"; then
@ -122,7 +156,7 @@ module_add()
git ls-files --error-unmatch "$path" > /dev/null 2>&1 && git ls-files --error-unmatch "$path" > /dev/null 2>&1 &&
die "'$path' already exists in the index" 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"}) || (unset GIT_DIR && cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) ||
die "Unable to checkout submodule '$path'" die "Unable to checkout submodule '$path'"
git add "$path" || git add "$path" ||
@ -153,6 +187,13 @@ modules_init()
test -z "$url" && test -z "$url" &&
die "No url found for submodule path '$path' in .gitmodules" 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" || git config submodule."$name".url "$url" ||
die "Failed to register url for submodule path '$path'" die "Failed to register url for submodule path '$path'"