#!/bin/sh myname=`basename $0` usage() { cat << EOT | sed 's/^ |//' | | $myname [global options] cmd [cmd-arguments] ... | | global options are: | | -F flavour : flavour is one of: priv, jw, contrib | | commands are: | | create-repo name | list-repos | 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" } } } check_user_is_self() { [ "$id" != "$user" ] && fatal "User $id is not allowed to do this to user $user's repositories." } # ----------------- commands md_p() { if [ -d "$1" ]; then return fi md_p `dirname $1` $2 $3 $4 md $@ } create_repo_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_repo() { [ -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 create [$dir] as root" cd $dir || fatal "failed to change to $dir" git init --bare --shared=0640 || fatal "git init failed" } list_repos() { cd $pdir || return 1 ls */HEAD | sed 's%/HEAD%%' 2>/dev/null return $? } # ----------------- here we go no_error_if_exists=0 id=`whoami` #user=$id flavour=priv OPTIND=1 while getopts jhu:F: flag; do case $flag in h) usage 0;; u) user=$OPTARG;; j) # legacy support flavour=jw;; F) flavour=$OPTARG;; p) no_error_if_exist=1;; *) usage 1;; esac done shift $(($OPTIND - 1)) if [ "$user" ]; then id=$user else if [ "$SUDO_UID" ]; then id=`/opt/ytools/bin/getpwuid $SUDO_UID | sed '/^name *=/ !d; s/^name *= *//'` [ "$id" ] || fatal "failed to find uid $SUDO_UID in user database" fi user=$id fi git_home=/srv/git/$id pdir=$git_home/priv case $flavour in jw) pdir=$git_home/proj;; priv) pdir=$git_home/priv;; contrib) pdir=$git_home/contrib;; *) fatal "unknown repository flavour \"$flavour\"" esac cmd=$1 shift p=$1 dir=$pdir/$p case $cmd in create-personal-project|create-repo) check_user_is_self create_repo "$@" ;; list-personal-projects|list-repos) list_repos "$@" ;; create-project-dir|create-repo-dir) dir=$1 # this is all a horrible variable and usage mess check_user_is_self create_repo_dir "$@" ;; *) usage 1 ;; esac