summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/git-new-module-workdir88
-rw-r--r--config_host.mk.in1
-rw-r--r--configure.ac18
-rwxr-xr-xg9
4 files changed, 116 insertions, 0 deletions
diff --git a/bin/git-new-module-workdir b/bin/git-new-module-workdir
new file mode 100755
index 000000000000..bfad184a308d
--- /dev/null
+++ b/bin/git-new-module-workdir
@@ -0,0 +1,88 @@
+#!/bin/sh
+
+usage () {
+ echo "usage:" $@
+ exit 127
+}
+
+die () {
+ echo $@
+ exit 128
+}
+
+if test $# -lt 2 || test $# -gt 2
+then
+ usage "$0 <repository> <new_workdir>"
+fi
+
+orig_git=$1
+new_workdir=$2
+branch=$3
+
+# want to make sure that what is pointed to has a .git directory ...
+git_dir=$(cd "$orig_git" 2>/dev/null &&
+ git rev-parse --git-dir 2>/dev/null) ||
+ die "Not a git repository: \"$orig_git\""
+
+case "$git_dir" in
+.git)
+ git_dir="$orig_git/.git"
+ ;;
+.)
+ git_dir=$orig_git
+ ;;
+esac
+
+# don't link to a configured bare repository
+isbare=$(git --git-dir="$git_dir" config --bool --get core.bare)
+if test ztrue = z$isbare
+then
+ die "\"$git_dir\" has core.bare set to true," \
+ " remove from \"$git_dir/config\" to use $0"
+fi
+
+# don't link to a workdir
+if test -h "$git_dir/config"
+then
+ die "\"$orig_git\" is a working directory only, please specify" \
+ "a complete repository."
+fi
+
+if ! test -d ".git"
+then
+ die "the current directory is not a git workdir"
+fi
+
+# don't recreate a workdir over an existing repository
+if test -e "$new_workdir/.git"
+then
+ die "destination directory '$new_workdir' already exists."
+fi
+
+# make sure the links use full paths
+git_dir=$(cd "$git_dir"; pwd)
+
+# create the workdir
+mkdir -p ".git/modules/$new_workdir" || die "unable to create \".git/modules/$new_workdir\"!"
+
+# create the links to the original repo. explicitly exclude index, HEAD and
+# logs/HEAD from the list since they are purely related to the current working
+# directory, and should not be shared.
+## LEM: add branches; deprecated, but safer to include it
+for x in branches config refs logs/refs objects info hooks packed-refs remotes rr-cache svn
+do
+ case $x in
+ */*)
+ mkdir -p "$(dirname ".git/modules/$new_workdir/$x")"
+ ;;
+ esac
+ ln -s "$git_dir/$x" ".git/modules/$new_workdir/$x"
+done
+
+# now setup the workdir
+mkdir -p "$new_workdir"
+cd "$new_workdir"
+echo "gitdir: ../.git/modules/$new_workdir" > .git
+# copy the HEAD from the original repository as a default branch
+cp "$git_dir/HEAD" ../.git/modules/$new_workdir/HEAD
+# don't checkout the branch, a subsequent "git module update" will do it
diff --git a/config_host.mk.in b/config_host.mk.in
index a3ecf99b1f8b..1ce861879b32 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -174,6 +174,7 @@ export GCONF_LIBS=$(gb_SPACE)@GCONF_LIBS@
export GIO_CFLAGS=$(gb_SPACE)@GIO_CFLAGS@
export GIO_LIBS=$(gb_SPACE)@GIO_LIBS@
export GIT_REFERENCE_SRC=@GIT_REFERENCE_SRC@
+export GIT_LINK_SRC=@GIT_LINK_SRC@
export GIT_NEEDED_SUBMODULES=@GIT_NEEDED_SUBMODULES@
export GNOMEVFS_CFLAGS=$(gb_SPACE)@GNOMEVFS_CFLAGS@
export GNOMEVFS_LIBS=$(gb_SPACE)@GNOMEVFS_LIBS@
diff --git a/configure.ac b/configure.ac
index c7e64387ea13..b9810f36f2e0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1238,6 +1238,13 @@ AC_ARG_WITH(referenced-git,
GIT_REFERENCE_SRC=$withval ,
)
+AC_ARG_WITH(linked-git,
+ AS_HELP_STRING([--with-linked-git=<submodules repo basedir>],
+ [Specify a directory where the repositories of submodules are located.
+ This uses a method similar to git-new-workdir to get submodules.]),
+ GIT_LINK_SRC=$withval ,
+)
+
AC_ARG_WITH(galleries,
AS_HELP_STRING([--with-galleries],
[Specify how galleries should be built. It is possible either to
@@ -11616,6 +11623,17 @@ if test -n "${GIT_REFERENCE_SRC}"; then
fi
AC_SUBST(GIT_REFERENCE_SRC)
+dnl git submodules linked dirs
+dnl ===================================================================
+if test -n "${GIT_LINK_SRC}"; then
+ for repo in ${GIT_NEEDED_SUBMODULES}; do
+ if ! test -d "${GIT_LINK_SRC}"/${repo}; then
+ AC_MSG_ERROR([linked git: required repository does not exist: ${GIT_LINK_SRC}/${repo}])
+ fi
+ done
+fi
+AC_SUBST(GIT_LINK_SRC)
+
dnl branding
dnl ===================================================================
AC_MSG_CHECKING([for alternative branding images directory])
diff --git a/g b/g
index c24ca3bad481..e273171ae7c2 100755
--- a/g
+++ b/g
@@ -152,6 +152,10 @@ get_git_reference()
if [ -f config_host.mk ]; then
REFERENCED_GIT=$(cat config_host.mk | grep GIT_REFERENCE_SRC | sed -e "s/.*=//")
fi
+ LINKED_GIT=""
+ if [ -f config_host.mk ]; then
+ LINKED_GIT=$(cat config_host.mk | grep GIT_LINK_SRC | sed -e "s/.*=//")
+ fi
}
do_shortcut_update()
@@ -249,6 +253,11 @@ local configured
do_shortcut_update
for module in $SUBMODULES_CONFIGURED ; do
+ if [ -n "$LINKED_GIT" ] ; then
+ if ! [ -d ".git/modules/${module}" ]; then
+ ./bin/git-new-module-workdir "${LINKED_GIT}/${module}" "${module}"
+ fi
+ fi
configured=$(git config --local --get submodule.${module}.url)
if [ -z "$configured" ] ; then
git submodule init $module || return $?