Apache Subversion (SVN) ist eine freie Software zur Versionsverwaltung von Dateien und Verzeichnissen.
Die Versionierung erfolgt in einem zentralen Projektarchiv (engl. repository) in Form einer einfachen Revisionszählung. Wenn Änderungen an Inhalten verteilt auf den Computern der Bearbeiter ausgeführt werden, werden zwischen dem Projektarchiv und einem Arbeitsplatz jeweils nur die Unterschiede zu bereits vorhandenen Ständen übertragen.
Quelle: http://de.wikipedia.org/wiki/Subversion_%28Software%29
Es gibt eine Reihe von Anleitungen für die Arbeit mit svn. Ich beschränke mich daher auf die Beschreibung des Scriptes.
Das Script ist im Rahmen der Entwicklung von Part-DB entstanden. Folgende Befehle sind für svn relevant:
Es gibt unterschiedliche Coding-Styles. Ich nutze in den meisten Fällen ein Tab zur Einrückung, andere dagegen nur Leerzeichen. Part-DB hat sich auf die Verwendung von 4 Leerzeichen geeinigt und daher muss eine automatische Ersetzung erfolgen. Nach einigen Versuchen mit sed fand ich den Befehl expand, der mir diese Arbeit übernimmt. Dazu werden dann im zweiten Schritt noch alle Leerzeilen mit Leerzeichen gekürzt.
Backupfiles haben in ein Repository nichts verloren. Daher werden alle Files mit der Tilde am Ende gesucht und gelöscht.
Nach dem Entfernen der Backupfiles werden neue Dateien der Arbeitskopie hinzugefügt.
Führt ein commit aus und verwendet den angebenen Text als Kommentar.
Es werden die Schritte -a und -c in einem Schritt durchgeführt. Das sollte der meist genutzte Befehl des Scripts sein.
Das Script ist zusätzlich mit Code ausgestattet, das ein neues Update-System (UPS) für PHP-Anwendungen unterstützen soll. Als Basis dient die Ausgabe von svn status. Die Ausgabe kann mit -o in eine Datei umgeleitet werden. Die UPS-Klasse gehört zu meinem phpBookWorm-Framework, welches ich in Kürze in einem neuen svn-Repo einchecken will.
svn.sh
#!/bin/sh UPS='/dev/stdout' tab2spaces () { # replaces tabs with spaces echo -e "- replacing tabs with spaces" FILES=`find . -type f -name "*php" -o -name "*tmpl"` for FILE in $FILES do echo "working on file $FILE..." expand -t4 "$FILE" > "$FILE.bak" sed 's/^ *$//g' "$FILE.bak" > "$FILE" rm -f "$FILE.bak" done } remove_backups () { # remove backup files from working directory echo -e "- removing backup files..." find . -name "*~" -print -exec rm {} \; } svn_modified () { MODIFIED=`svn status | sed 's/ \+/@/g'` for MOD in $MODIFIED do STATUS=`echo $MOD | cut -d"@" -f1` FILE=`echo $MOD | cut -d"@" -f2` case $STATUS in M|A) echo -e "copy :: $FILE `sha256sum $FILE| cut -d" " -f1`" 1>> $UPS echo -e "chmod :: `stat -c "%n 0%a" $FILE`" 1>> $UPS ;; R|D) echo -e "delete :: $FILE" 1>> $UPS ;; *) echo -e "log :: $FILE unknown status" 1>> $UPS ;; esac done } svn_all () { find . -name "*~" -exec rm {} \; FILES=`find . | grep -v ".svn" | sed 's/^.\///g'` for FILE in $FILES do if [ $FILE != '.' -a $FILE != '..' ]; then stat -c "chmod :: %n 0%a" $FILE 1>> $UPS fi done } while [ "$1" != "" ]; do case $1 in -o) shift UPS=$1 echo -e "creating $UPS..." ;; -t|--tab) tab2spaces ;; -a|--add) remove_backups echo -e "- adding files to repository..." svn add * --force ;; -r|--remove) remove_backups ;; -c|--commit) shift echo -e "- committing..." svn commit -m "$1" svn up ;; --all) remove_backups tab2spaces echo -e "- adding files to repository..." svn add * --force echo -e "- committing..." shift svn commit -m "$1" svn up ;; --ups) shift case $1 in all) svn_all ;; update) svn_modified ;; esac ;; *) echo "$0" echo -e "Licence: GPL, 2012 by Udo Neist\n" echo "Usage: $0" echo -e "\nWrapper for svn" echo -e "\nHint: Use code.google.com only with https to avoid problems with authentication!" echo -e "\n\t-t|--tab\t\tReplace 1 tab with 4 spaces." echo -e "\t-r|--remove\t\tRemove backup files." echo -e "\t-a|--add\t\tRemove backup files and add new files to repository." echo -e "\t-c|--commit text\tCommit with comment." echo -e "\t--all text\t\tAll steps above in one." echo -e "\nMaking an UPS-script for scripted update (default hash: sha256)" echo -e "\n\t-o\t\t\tRedirects output to the specified file. Attention! File will be overwritten!" echo -e "\n\t--ups update\t\tShow svn status of each modified file/directory and create an ups-script (e.g. update.ups)" echo -e "\t--ups all\t\tShow status of all files/directories and create an ups-script (e.g. repair.ups)" exit 1 ;; esac shift done