@ -1,13 +1,15 @@
#!/bin/sh
#!/bin/sh
#
#
# git-submodules.sh: init, update or list git submodules
# git-submodules.sh: add, init, update or list git submodules
#
#
# Copyright (c) 2007 Lars Hjemli
# Copyright (c) 2007 Lars Hjemli
USAGE='[--quiet] [--cached] [status|init|update] [--] [<path>...]'
USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]'
. git-sh-setup
. git-sh-setup
require_work_tree
require_work_tree
add=
branch=
init=
init=
update=
update=
status=
status=
@ -25,6 +27,18 @@ say()
fi
fi
}
}
# NEEDSWORK: identical function exists in get_repo_base in clone.sh
get_repo_base() {
(
cd "`/bin/pwd`" &&
cd "$1" || cd "$1.git" &&
{
cd .git
pwd
}
) 2>/dev/null
}
#
#
# Map submodule path to submodule name
# Map submodule path to submodule name
#
#
@ -42,6 +56,11 @@ module_name()
#
#
# Clone a submodule
# Clone a submodule
#
#
# Prior to calling, modules_update checks that a possibly existing
# path is not a git repository.
# Likewise, module_add checks that path does not exist at all,
# since it is the location of a new submodule.
#
module_clone()
module_clone()
{
{
path=$1
path=$1
@ -65,6 +84,53 @@ module_clone()
die "Clone of '$url' into submodule path '$path' failed"
die "Clone of '$url' into submodule path '$path' failed"
}
}
#
# Add a new submodule to the working tree, .gitmodules and the index
#
# $@ = repo [path]
#
# optional branch is stored in global branch variable
#
module_add()
{
repo=$1
path=$2
if test -z "$repo"; then
usage
fi
# Turn the source into an absolute path if
# it is local
if base=$(get_repo_base "$repo"); then
repo="$base"
fi
# Guess path from repo if not specified or strip trailing slashes
if test -z "$path"; then
path=$(echo "$repo" | sed -e 's|/*$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
else
path=$(echo "$path" | sed -e 's|/*$||')
fi
test -e "$path" &&
die "'$path' already exists"
git-ls-files --error-unmatch "$path" > /dev/null 2>&1 &&
die "'$path' already exists in the index"
module_clone "$path" "$repo" || exit
(unset GIT_DIR && cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) ||
die "Unable to checkout submodule '$path'"
git add "$path" ||
die "Failed to add submodule '$path'"
GIT_CONFIG=.gitmodules git config submodule."$path".path "$path" &&
GIT_CONFIG=.gitmodules git config submodule."$path".url "$repo" &&
git add .gitmodules ||
die "Failed to register submodule '$path'"
}
#
#
# Register submodules in .git/config
# Register submodules in .git/config
#
#
@ -173,6 +239,9 @@ modules_list()
while case "$#" in 0) break ;; esac
while case "$#" in 0) break ;; esac
do
do
case "$1" in
case "$1" in
add)
add=1
;;
init)
init)
init=1
init=1
;;
;;
@ -185,6 +254,14 @@ do
-q|--quiet)
-q|--quiet)
quiet=1
quiet=1
;;
;;
-b|--branch)
case "$2" in
'')
usage
;;
esac
branch="$2"; shift
;;
--cached)
--cached)
cached=1
cached=1
;;
;;
@ -201,14 +278,27 @@ do
shift
shift
done
done
case "$init,$update,$status,$cached" in
case "$add,$branch" in
1,,,)
1,*)
;;
,)
;;
,*)
usage
;;
esac
case "$add,$init,$update,$status,$cached" in
1,,,,)
module_add "$@"
;;
,1,,,)
modules_init "$@"
modules_init "$@"
;;
;;
,1,,)
,,1,,)
modules_update "$@"
modules_update "$@"
;;
;;
,,*,*)
,,,1,*)
modules_list "$@"
modules_list "$@"
;;
;;
*)
*)