#!/bin/sh myname=`basename $0` usage() { cat << EOT | sed 's/^ |//' | | $myname [global options] cmd [cmd-arguments] ... | | global options are: | | -j : project is a jannet-project (default is a private project) | | commands are: | | create-personal-project name | list-personal-projects | EOT [ "$1" ] && exit $1 } log() { echo $@ } err() { echo $@ >&2 } fatal() { err $@ exit 1 } md() { local dir=$1 local mode=$2 local owner=$3 local group=$4 [ -d $dir ] || { log "creating $dir as $owner.$group with mode $mode" /usr/bin/install -m $mode -o $owner -g $group -d $dir || { fatal "failed to create directory $dir" } } } # ----------------- commands md_p() { if [ -d "$1" ]; then return fi md_p `dirname $1` $2 $3 $4 md $@ } create_project_dir() { if [ "$UID" != 0 ]; then fatal "tried to create directory \"$dir\" as `whoami`, needs to be done as root" fi md_p /srv/git 750 root cvs md_p /srv/git/$id 750 root cvs md_p `dirname $dir` 750 $id jannet md_p $dir 02750 $id `id -g $id` } create_personal_project() { [ -e $dir ] && { err "$dir already exists" test $no_error_if_exists -eq 0 exit $? } /usr/bin/sudo `readlink -f $0` create-project-dir $dir || fatal "failed to set root uid" cd $dir || fatal "failed to change to $dir" git init --bare --shared=0640 || fatal "git init failed" } list_personal_projects() { cd $pdir ls */HEAD | sed 's%/HEAD%%' 2>/dev/null } # ----------------- here we go id=`whoami` [ "$SUDO_UID" ] && { id=`/opt/ytools/bin/getpwuid $SUDO_UID | sed '/^name *=/ !d; s/^name *= *//'` [ "$id" ] || fatal "failed to find uid $SUDO_UID in user database" } git_home=/srv/git/$id pdir=$git_home/priv no_error_if_exists=0 OPTIND=1 while getopts jh flag; do case $flag in j) pdir=$git_home/proj;; h) usage 0;; p) no_error_if_exist=1;; *) usage 1;; esac done shift $(($OPTIND - 1)) cmd=$1 shift p=$1 dir=$pdir/$p case $cmd in create-personal-project) create_personal_project "$@" ;; list-personal-projects) list_personal_projects "$@" ;; create-project-dir) dir=$1 # this is all a horrible variable and usage mess create_project_dir "$@" ;; *) usage 1 ;; esac