--- /dev/null
+#!/bin/sh
+
+# This script prepends BASE_PATH to any arguments that are not options (start
+# with --) and do not start with BASE_PATH already.
+# It then executes its equivalent in /usr/bin with those updated arguments.
+#
+# This script is meant to provide a base path for accessing git repositories
+# through ssh. This is similar to running git-daemon(1) with --base-path and
+# --base-path-relaxed.
+
+BASE_PATH='/data/vcs/git'
+POST_UPDATE_HOOK="$BASE_PATH/hooks/post-update"
+
+function init_repos() {
+ mkdir "$1" &> /dev/null || return 1
+ (cd $1 && git --bare init &> /dev/null) || return 1
+ cp -P "$POST_UPDATE_HOOK" "$1/hooks/" || return 1
+}
+
+# We keep an array of arguments, so we can handle quoting an spaces in
+# arguments properly.
+ARGS=()
+i=0
+until [ "$#" -eq 0 ]
+do
+ if echo $1 | egrep "^--" &>/dev/null; then
+ # This is an option argument, leave it untouched
+ ARGS[$i]="$1"
+ elif echo $1 | egrep ".git$" &>/dev/null; then
+ # This is a path to a git repository
+ DIR="$1"
+ # Prepend BASE_PATH if the path does not start with it already.
+ if ! echo $DIR | egrep "^$BASE_PATH" &>/dev/null; then
+ DIR="$BASE_PATH/$DIR"
+ fi
+
+ # When the client wants us to receive a pack, create the git
+ # repository if it does not exist yet
+ if [ "`basename $0`" = "git-receive-pack" -a ! -e "$DIR" ]; then
+ init_repos "$DIR" || exit 1
+ fi
+ ARGS[$i]="$DIR"
+ else
+ # Not a path to a git repository, leave untouched.
+ ARGS[$i]="$1"
+ fi
+ ((i++))
+ shift
+done
+
+exec /usr/bin/`basename $0` "${ARGS[@]}"