git: Rename git-prepend-base to git-wrapper.
[matthijs/servers/drsnuggles.git] / usr / local / bin / git-wrapper
diff --git a/usr/local/bin/git-wrapper b/usr/local/bin/git-wrapper
new file mode 100755 (executable)
index 0000000..cd8f7c1
--- /dev/null
@@ -0,0 +1,43 @@
+#!/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'
+
+# 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
+       
+               # Create the git repository if it does not exist yet    
+               if [ ! -e "$DIR" ]; then
+                       mkdir "$DIR" &> /dev/null && (cd $DIR && git --bare init &> /dev/null)
+               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[@]}"