Git Repositories

Using a sub-folder for git repositories, allowing mount-bind of it
authorCyrille Pontvieux <cyrille@enialis.net>
Tue, 17 Jan 2017 18:10:05 +0000 (19:10 +0100)
committerCyrille Pontvieux <cyrille@enialis.net>
Sat, 21 Jan 2017 10:09:34 +0000 (11:09 +0100)
Makefile
homegit/git-shell-commands/check
homegit/gitrepo.sh
homegit/makekeys.sh
src/config.inc.php.example
tpl/nginx.conf

index d87278d..31a35b5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -18,7 +18,7 @@ _options:
        @echo ""
 
 gen/home:
-       @mkdir -p $@
+       @mkdir -p $@/repos
 
 gen/www/$(WEB_BASE_DIR):
        @mkdir -p $@
@@ -36,7 +36,7 @@ gen/www/$(WEB_BASE_DIR)config.inc.php:
        @echo '$$githost = "${GIT_HOSTNAME}";' >> $@
        @echo '$$gitwebroot = "${WEB_BASE_DIR}";' >> $@
        @echo '$$gituser = "${GIT_USER}";' >> $@
-       @echo '$$gitdir = "${GIT_HOME}";' >> $@
+       @echo '$$gitdir = "${GIT_HOME}/repos";' >> $@
        @echo '$$gitwebpath = "${GITWEB_DIR}";' >> $@
        @echo '?>' >> $@
 
index 07d2078..5f21456 100755 (executable)
@@ -9,22 +9,24 @@ ispublic() {
   [ -e "$1"/git-daemon-export-ok ]
 }
 rungitcmd() {
-  exec /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"
+  exec /usr/bin/git-shell -c "$1"
 }
 error() {
   echo "Error: $1" >&2
   exit 1
 }
 CMD=$(echo "$SSH_ORIGINAL_COMMAND" | cut -d' ' -f1)
-REPO=$(echo "$SSH_ORIGINAL_COMMAND" | cut -d' ' -f2)
+REPO=$(echo "$SSH_ORIGINAL_COMMAND" | sed "s/'//g" | cut -d' ' -f2 | cut -d'/' -f2-)
+REPO_DIR="$HOME/repos/$REPO"
 PUSHCMD="git-receive-pack"
-if [ -d "$REPO" ] && [ -r "$REPO"/.users ]; then
-  if grep -q "^$GITUSER:.*\$" "$REPO"/.users; then
-    RIGHT=$(sed -r -n "/^$GITUSER:/{s/^$GITUSER:(.*)/\1/;p}" "$REPO"/.users)
+SSH_COMMAND=$(echo "$SSH_ORIGINAL_COMMAND" | sed "s|$REPO|$REPO_DIR|")
+if [ -d "$REPO_DIR" ] && [ -r "$REPO_DIR"/.users ]; then
+  if grep -q "^$GITUSER:.*\$" "$REPO_DIR"/.users; then
+    RIGHT=$(sed -r -n "/^$GITUSER:/{s/^$GITUSER:(.*)/\1/;p}" "$REPO_DIR"/.users)
     case $RIGHT in
       admin|user)
         # admin and regular user have the same right on the git repo
-        rungitcmd
+        rungitcmd "$SSH_COMMAND"
         ;;
       readonly)
         if [ "$CMD" = "$PUSHCMD" ]; then
@@ -32,15 +34,15 @@ if [ -d "$REPO" ] && [ -r "$REPO"/.users ]; then
           error "$GITUSER not authorized to push on $REPO"
         else
           # other commands are allowed
-          rungitcmd
+          rungitcmd "$SSH_COMMAND"
         fi
         ;;
       *)
         error "$GITUSER has the unexpected right $RIGHT"
     esac
   else
-    if [ "$CMD" != "$PUSHCMD" ] && [ -e "$REPO"/git-daemon-export-ok ]; then
-      rungitcmd
+    if [ "$CMD" != "$PUSHCMD" ] && ispublic "$REPO_DIR"; then
+      rungitcmd "$SSH_COMMAND"
     else
       # not a member and the command is push or
       # not a member and the repo is not public
@@ -49,5 +51,5 @@ if [ -d "$REPO" ] && [ -r "$REPO"/.users ]; then
   fi
 else
   # will fail as the repo does not exist
-  rungitcmd
+  rungitcmd "$SSH_COMMAND"
 fi
index de473a2..a034278 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 # vim: et ai cin sw=2 ts=2 tw=0:
-cd ~/
+cd ~/repos
 
 usage() {
   cat <<EOF
index bd4c265..731c429 100755 (executable)
@@ -7,7 +7,7 @@ if ! [ -d .ssh ]; then
   chmod go= .ssh
 fi
 cat /dev/null > .ssh/authorized_keys.tmp
-for f in .keys/*.keys; do
+for f in repos/.keys/*.keys; do
   u=$(basename $f .keys)
   sed "s/^/command=\"check $u\" /" $f >> .ssh/authorized_keys.tmp
 done
index 93113ba..989f4b5 100644 (file)
@@ -3,5 +3,5 @@ $title = 'git.myhost.com';
 $githost = 'myhost.com';
 $gitwebroot = '';
 $gituser = 'git';
-$gitdir = '/home/git';
+$gitdir = '/home/git/repos';
 $gitwebpath = 'gitweb';
index 51c9ea2..5925bd1 100644 (file)
@@ -22,8 +22,8 @@ server {
     include fastcgi_params;
     fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend;
     fastcgi_param GIT_HTTP_EXPORT_ALL "";
-    fastcgi_param GIT_PROJECT_ROOT __GIT_HOME__;
-    fastcgi_param HOME __GIT_HOME__;
+    fastcgi_param GIT_PROJECT_ROOT __GIT_HOME__/repos;
+    fastcgi_param HOME __GIT_HOME__/repos;
     fastcgi_param PATH_INFO $1;
   }
   location /__WEB_BASE_DIR____GITWEB_DIR__/ {