svndisk.sh
#!/bin/sh
# (c) 2009, Klaus.Franken@StrukturPunkt.de
# vim: ts=4 ai
DIR=$1
WAIT1=15 # WAIT1: Sekunden zwischen "svn stat"
WAIT2=10 # Anzahl WAIT1 bis Server befragen
PERL=/usr/bin/perl
XARGS=/usr/bin/xargs
if test `uname` == 'Linux'; then
XARGS_OPT="--no-run-if-empty"
SVN=/usr/bin/svn
fi
if test `uname` == 'Darwin'; then
# Darwin / Mac OS X
XARGS_OPT=""
SVN=/opt/subversion/bin/svn
fi
test -x $SVN || exit 1
test -x $PERL || exit 4
test -x $XARGS || exit 5
test ! -z $DIR || exit 2
test -d $DIR || exit 2
cd $DIR || exit 3
sync () {
# FIXME: bei Meldung:
# svn: Directory '/Users/kfr/SvnDisk/SvnDisk/StrukturPunkt/Kunden/falkemedia-maclife/uck/.svn' containing working copy admin area is missing
# wurde (versehentlich) .svn im betroffenen Pfad gelöscht. Diverse Kommandos "svn stat", "svn update" brechen ab!
# Lösung:
# cd ...
# svn co svn+ssh://kfr@strukturpunkt.de/home/kfr/SvnDisk/repo/SvnDisk/StrukturPunkt/Kunden/falkemedia-maclife/uck/ DELME
# (URL siehe Pfad in .svn im Ordner darüber)
# mv DELME/.svn/
# rm -rf DELME
# gelöschtes löschen:
# Beispiel: "! Klexe/Arcor-Vertragsänderung-090610.pdf"
$SVN stat | $PERL -ne '$_ =~ s/^\!\s+// || next; $_ =~ s/\s(.)/\\ $1/g; print $_;' | $XARGS $XARGS_OPT $SVN del
# FIXME: wie ein ganzes Verzeichnis löschen?
# Konflikte beheben (umbenennen):
# Bsp-Zeile: "M * 17 NEU.txt"
# Erkennung: Konflikt wenn modifiziert (M) und neue Version auf Server (*)
# Version für svn 1.4
## $SVN stat -u | perl -ne '$_ =~ s/^M[\w\s]{6}\*\s*\d*\s*// || next; print $_;' | xargs $XARGS_OPT -I % mv % %-$USER-$HOSTNAME-`date "+%y%m%d-%H%M%S"`
# Version für svn 1.4 und 1.6:
$SVN stat -u | perl -ne '$_ =~ s/^M[\w\s]+\*\s*\d*\s*// || next; print $_;' | xargs $XARGS_OPT -I % mv % %-$USER-$HOSTNAME-`date "+%y%m%d-%H%M%S"`
# Updates abholen (Konflikte ignorieren, FIXME: "postponed" legt kopien an, aber die andere Parameter sind noch blöder):
$SVN update --accept postpone
# neues hinzufügen:
# BUG: keine Dateinamen mit "´" oder "`" im Namen
$SVN stat | $PERL -ne '$_ =~ s/^\?\s+// || next; $_ =~ s/\s(.)/\\ $1/g; print $_;' | $XARGS $XARGS_OPT $SVN add
$SVN commit -m "svndisk auto commit"
}
WAITING=$WAIT2
while test 1; do
UPDATES=`$SVN stat 2>&1`
if test ! -z "$UPDATES" -o $WAITING -eq 0; then
sync
WAITING=$WAIT2
fi
sleep $WAIT1
WAITING=`expr $WAITING - 1`
done
Das Script svndisk.sh mit einem Subversion-Verzeichnis als Parameter starten, z.B.:
sh svndisk.sh /Users/kfr/SvnDisk/
Das soll so sicher/automatische laufen, dass man es auch seinem Chef installieren kann.
Eine GUI wäre schön. Z.T gibt es Integrationen in den Dateimanager/Finder. Austesten.
Meldung:
svn: Commit failed (details follow): svn: '/Users/kfr/SvnDisk/SvnDisk/StrukturPunkt/Briefwechsel Sonstiges/.~lock.Gerlin-Haftpflicht-Fragebogen.odt#' is scheduled for addition, but is missing
Lösung:
Datei löschen:
svn del "StrukturPunkt/Briefwechsel Sonstiges/.~lock.Gerlin-Haftpflicht-Fragebogen.odt#"
(Fehlermeldung ignorieren)
Ev. zusätzlich den Konflikt als gelöst markieren:
svn resolved ...
Meldung:
macbook:SvnDisk kfr$ svn stat
! C pw2.kdb.lock
> local delete, incoming delete upon update
Lösung:
svn resolved pw2.kdb.lock