summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorLionel Elie Mamane <lionel@mamane.lu>2013-06-21 13:31:37 +0200
committerLionel Elie Mamane <lionel@mamane.lu>2013-06-21 13:36:33 +0200
commitaa1a988c7403cac81638c195b753fab7ac3600f9 (patch)
tree98ae761cb8cd1edcbedd56a49973ca4a265cfef4 /bin
parent699180768bf600d646f8652c3fff886bcf052891 (diff)
Reintroduce --with-linked-git option
With slightly different semantics: Instead of pointing at a previous checkout, point at base directory of all repos. Change-Id: I254ecc33071be53067c44610b030f737cf75a7ee
Diffstat (limited to 'bin')
-rwxr-xr-xbin/git-new-module-workdir88
1 files changed, 88 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