#!/bin/bash log() { echo $@ } fatal() { log $@ exit 1 } goodbye() { rm -f $scm_status } check_scm() { local p=$1 if [ -d $p/.git ]; then log + checking git #git -C $p pull --no-edit || fatal "git pull failed, giving up" git -C $p status --porcelain | grep -v '^??' | grep -q . && { git -C $p status fatal "git in project \"$p\" has locally modified files, giving up" } else log + checking cvs #cvs update -dP $p cvs status $p > $scm_status 2>&1 if [ $? != 0 ]; then cat $scm_status fatal "\n======== cvs status failed in project \"$p\", giving up." fi grep -qi "locally modified" $scm_status && \ fatal "cvs copy in project \"$p\" has locally modified files, giving up" grep -qi "needs" $scm_status && \ fatal "+ cvs copy in project \"$p\" is out-of-date, giving up" fi } ssh=ssh [ "$CVS_RSH" ] && ssh="$CVS_RSH" [ "$GIT_SSH" ] && ssh="$GIT_SSH" ssh=`which $ssh` [ -x "$ssh" ] || fatal "SSH executable \"$ssh\" not found" [ "$JANWARE_USER" ] || JANWARE_USER=`whoami` ssh="$ssh -l $JANWARE_USER" for host in cvs.jannet.de git.jannet.de; do $ssh $host echo hallo >/dev/null 2>&1 || fatal "Can't ssh into host $host" done local_cvs_proj=`ls -d */CVS 2>/dev/null | sed 's%/[^/]*%%'` local_git_proj=`ls -d */.git 2>/dev/null | sed 's%/[^/]*%%'` remote_cvs_proj=`$ssh cvs.jannet.de find /home/jannet/arc/cvs/proj -maxdepth 1 -mindepth 1 -type d -executable -readable | sed 's%.*/%%'` remote_git_proj=`$ssh git.jannet.de git-srv-admin.sh -j list-personal-projects` date=`date +'%Y%m%d'` myname=`basename $0` trap goodbye EXIT INT QUIT KILL scm_status=`mktemp /tmp/$myname""_XXXXXX` for p in $local_cvs_proj; do [ -L $p ] && continue [ -d $p ] || continue echo $remote_cvs_proj | grep -q "\(^\| \)$p\($\| \)" && continue n=purged/cvs/$date/$p mkdir -p `dirname $n` echo "--------------- moving stale cvs project $p to $n" if ! make -C $p distclean; then echo "distclean failed, ignoring"; fi if ! make -C $p clean; then echo "clean failed, ignoring"; fi mv $p $n sed -i "/\/$p\// d" CVS/Entries purged="$purged $p" done [ -d old ] && mv old purged [ "$purged" ] && { cp -p CVS/Entries CVS/Entries-$date-`date +'%H%M%S'` } for p in $purged; do sed -i "/D\/$p\/\/\/\// d" CVS/Entries done for p in $local_git_proj; do [ -L $p ] && continue [ -d $p ] || continue echo $remote_git_proj | grep -q "\(^\| \)$p\($\| \)" && continue check_scm $p n=purged/git/$date/$p mkdir -p `dirname $n` mv $p $n log "moving stale project \"$p\" to \"$n\"" done