Skip to content

Commit

Permalink
Merge branch 'ml/submodule'
Browse files Browse the repository at this point in the history
* ml/submodule:
  git-submodule - allow a relative path as the subproject url
  • Loading branch information
Junio C Hamano committed Sep 29, 2007
2 parents 471fa1e + f31a522 commit 2a350d7
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 6 deletions.
3 changes: 3 additions & 0 deletions Documentation/git-submodule.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ add::
repository is cloned at the specified path, added to the
changeset and registered in .gitmodules. If no path is
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::
Show the status of the submodules. This will print the SHA-1 of the
Expand Down
53 changes: 47 additions & 6 deletions git-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
#
Expand Down Expand Up @@ -103,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"
realrepo=$repo
fi
;;
esac

# Guess path from repo if not specified or strip trailing slashes
if test -z "$path"; then
Expand All @@ -122,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" ||
Expand Down Expand Up @@ -153,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'"

Expand Down

0 comments on commit 2a350d7

Please sign in to comment.