Archive for the ‘svn’ tag
Software grafisch darstellen mit Code_Swarm
Hier erstmal das Video, damit ihr seht worum es geht:
Dies ist das Video, das ich gerade erstellt habe, und zwar vom Zend Framework 1.10 branch. Man sieht, wo welche Programmierer mitgeholfen haben, wer häufig welche Art von Dateien bearbeitet usw. Mit mehr Zeit könnte man da noch andere coole Dinge mit anstellen, wie beispielsweise weitere Dateiendungen farbig markieren etc. etc.
Es gibt natürlich auch aussagekräftigere Tabellen und Statistik-Tools, aber ich finde das eine sehr schöne Darstellung, sollte man mal von seinem Projekt machen wenn mehrere Leute involviert sind (als Motivation).
Code_Swarm kann auf svn, git, hg und wahrscheinlich noch weiteren Repositories losgelassen werden. Wie man es installiert und laufen lässt steht hier:
http://github.com/rictic/code_swarm
ich möchte es nicht kopieren. Ich habe es bereits ohne Probleme unter Mac OS X und Ubuntu ans Laufen bekommen. Unter Ubuntu 9.10 sah das so bei mir aus:
cd mkdir code_swarm cd code_swarm sudo apt-get install git-core subversion mencoder git clone git://github.com/rictic/code_swarm.git svn co http://framework.zend.com/svn/framework/standard/branches/release-1.10/ export PATH=$PATH:~/code_swarm/code_swarm/bin cd release-1.10 code_swarm
Der erste Aufruf von code_swarm generiert eine Folge von Ergebnisbildern, die man auch als Film angezeigt bekommt.. Um viele Tausend png-Bilder auf der Festplatte zu generieren, die wir dann noch in einen Film umwandeln können, muss in der Projektdatei (~/code_swarm/release-1.10/.svn/.code_swarm/project.config) folgendes geändert werden:
ColorAssign3="Source Code" <-- .php hinzufügen TakeSnapshots=true SnapshotLocation=frames/#####.png
Dann nochmal code_swarm im Repository-Verzeichnis aufrufen, anschliessend wird der Aufruf von mencoder daraus ein Video generieren:
cd ../code_swarm/frames/ mencoder mf://*.png -mf fps=24:type=png -ovc lavc -oac copy -o video1.avi
Bei Problemen oder weiteren Einstellungsfragen sollte man dieses HowTo gelesen haben. Hier ist noch ein Posting wo man sehr viele Einstellungsmöglichkeiten sehen kann (Die „Masse“ der Entwickler, Framegröße, Geschwindigkeiten usw)
Weitere interessante Projekte, die sich mit der visuellen Darstellung von Repositores oder Logs beschäftigen, kann man hier sehen:
Sinnvolle SVN Hooks für PHP Projekte
Dieser Artikel ist nur für diejenigen gedacht, die SVN bereits kennen. Wer jetzt die Stirn runzelt, möge sich vorher bei wikipedia oder youtube informieren und mal erste Versuche mit einem SVN-Server sammeln.
Erstmal zur Begrifflichkeit ansich: Hooks sind Interfaces zu kleinen externen Programmen, die zu bestimmten Zeiten während eines Programmablaufs aufgerufen werden können. Sie klinken sich also in den Ablauf ein.
Beim SVN gibt es 3 interessante Hooks, die häufig genutzt werden (insgesamt gibt es 9):
– start-commit
– pre-commit
– post-commit
Im SVN Handbuch kann man genauer nachlesen, wann diese Hooks aufgerufen werden.
Das erste Script, welches wir als pre-commit-Hook aufrufen wollen, ist ein einfaches PHP-Lint, wir wollen also die PHP-Syntax testen. Dieses Beispiel mache ich etwas ausführlicher, alle anderen Hook-Scripte hänge ich einfach an dieses Posting dran.
#!/bin/bash REPOS="$1" TXN="$2" PHP="/usr/local/php5/bin/php" SVNLOOK="/usr/bin/svnlook" AWK="/usr/bin/awk" GREP="/bin/egrep" SED="/bin/sed" CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A]" | $AWK '{print $2}' | $GREP \\.php$` for FILE in $CHANGED do MESSAGE=`$SVNLOOK cat -t "$TXN" "$REPOS" "$FILE" | $PHP -l` if [ $? -ne 0 ] then echo 1>&2 echo "***********************************" 1>&2 echo "PHP error in: $FILE:" 1>&2 echo `echo "$MESSAGE" | $SED "s| -| $FILE|g"` 1>&2 echo "***********************************" 1>&2 exit 1 fi done
Da ich mein SVN auf einem Linux-Server betreibe, habe ich hier das entsprechende Bash-Script. Falls ihr euren SVN-Server unter Windows betreibt, muß man das Script natürlich anpassen.
Was passiert hier? Es werden mittels svnlook alle geänderten oder neu hinzugefügten Dateien gesucht, aufgelistet und dann noch die Dateien mit einer .php Endung gefiltert. Für jede Dieser Dateien wird dann wiederum via svnlook der Quelltext geholt und mittels der Pipe an „php -l“ übergeben. Im Falle eines Fehlers gibt es eine Fehlermeldung, die dann im SVN-Client ausgegeben wird. Der Commit wird also scheitern (da dies ja ein pre-commit-Hook ist).
Ein weiteres Hook-Script, welches pre-commit ausgeführt wird, ist zum Beispiel der PEAR PHP-CodeSniffer. Dieses kleine Script kann PHP-Code auf Coding-Standards überprüfen, also ob beispielsweise PHPdoc vorhanden ist, oder ob die geschweiften Klammern an den richtigen Stellen stehen. Ich persönlich habe dieses Script allerdings nicht als Hook eingebunden, da ich auch ab und zu fremden Code ins SVN packe, der natürlich nicht meinen Code-Standards entspricht. PHP-CodeSniffer führe ich lokal ab und zu aus, und dann auch nur auf meine Verzeichnisse. Beim CodeSniffer wird ein entsprechendes Hook-Script gleich mitgeliefert.
Noch ein einfaches kleines Hook-Script wäre das hier:
/* test to see if svn commit comment length is greater than or equal to 10 chars */ $log = exec("svnlook log -t ". $argv[2] ." ". $argv[1]); if(strlen($log) > 9){ exit(0); }else{ exit(1); }
---------
Weitere Hook-Scripte:
- PHP CodeSniffer: liegt dem Paket bei unter /scripts/phpcs-svn-pre-commit
- PHPUnit: dazu gibt es im Internet keine Quellen (ich habe jedenfalls keine gefunden), wie man das am besten machen kann. Ich habe es früher (vor 2 Jahren) so gelöst: Download Vorgehensweise ist einfach: Nach dem commit einmal das svn komplett auschecken, dann die beiden unit-tests starten, und im Fehlerfall Emails versenden
- Mailer-Script: subversion liegt bereits eins bei, hier eine Weiterentwicklung: http://opensource.perlig.de/svnmailer/
- Jabber Benachrichtung: http://trac.c3d2.de/subversion-hooks/browser (über einen ICQ-Gateway kann man dann auch ICQ-Nachrichten senden)
- Trac Issue Tracking/Wiki: http://trac.edgewall.org/browser/trunk/contrib/trac-post-commit-hook
- Bei Tigris liegen auch noch einige, aber auch viel unnützes Zeug: http://subversion.tigris.org/tools_contrib.html#hook_scripts
Falls ihr noch andere Hook-Scripte habt, nur her damit!
EDIT: Stefan empfiehlt noch ein tolles Hook-Script, mit dem man automatisch nach einem Commit die geänderten Dateien auf einen FTP, SFTP oder Filesystem synchronisieren kann: http://svn2web.sourceforge.net
Versionierungssysteme (auch SCM genannt)
Nahezu jedes OpenSource-Projekt hat ein svn-Repository. Aber was genau ist das eigentlich? Und gibt es Alternativen?
SVN (Subversion) ist das wohl bekannteste Version Control System(VCS). Häufig wird diese Art von Software auch Source Configuration Management system (SCM) genannt. Das Hauptziel ist es, eine gemeinsame Platform für Quelltexte bereitzustellen, um mit vielen Personen gleichzeitig daran zu arbeiten, und dabei viele Probleme wie Inkonsistenzen, Versionsprobleme und gleichzeitigen Zugriff zu beseitigen.
In den Anfängen der Programmierung mußte man die Arbeit an einem Softwareprojekt immer gut organisieren, d.h. es mußte geplant werden, welche Person an welcher Datei arbeitet, man brauchte einen gemeinsamen Ordner, damit jeder alles lesen kann usw. Und wie sollte es sein, häufig öffneten zwei Personen die selbe Datei, machten Änderungen, und beim Speichern überschrieb der eine die Änderungen des anderen. Auch mit Hilfe von Locks auf die Dateien war dieses Problem nicht wirklich zufriedenstellend lösbar.
Also überlegten sich kluge Köpf, einen Server-Dienst anzubieten, wo man seine Dateien „hochladen“(commit) kann. Jeder kann sich nun eine Kopie von diesem Server herunterladen(checkout) und an den Dateien arbeiten. Das interessante ist nun, dass beim erneuten Hochladen die Datei auf dem Server nicht überschrieben wird, sondern zusammengeführt (merge) wird. Außerdem hat man durch dieses System die Möglichkeit, auf ältere Versionen der Dateien zuzugreifen, denn der Server speichert die Änderungen mit, und zu jeder Änderung gehört auch ein Kommentar. Ungefähr 1980 kamen die ersten Umsetzungen RCS und SCCS für einzelne Dateien ans Licht. Das erste nutzbare System für die Softwareentwicklung und große Projekte wurde 1989 geboren: CVS (Concurrent Versions System).
Merging machen natürlich nur Sinn bei Textdateien, Binärdateien wie zB. Bilder müssen weiterhin überschrieben werden.
Seit dem Jahr 2000 wird Subversion als Nachfolger von CVS entwickelt, um konzeptionelle Fehler auszubügeln und das wichtigste, nämlich das mergen, zu verbessern. Durch Tags und Branches kann man nun auch besser verschiedene Zweige oder Releasestände/Versionen definieren.
Alle bisher besprochenen VCS waren zentralisierte Lösungen, es gibt also einen zentralen Server, der diesen Dienst zur Verfügung stellt. Heutzutage setzen sich langsam immer mehr die verteilte SCM durch, wie zB git oder Mercurial.
Aber genug Text, hier ein paar Screenshots aus meinem eclipse, in dem ich einen SVN-Client-Plugin installiert habe und so einfach via Menu Dateien ins svn commiten oder mir aktuelle Versionen aus dem svn holen kann:
Falls man eine IDE nutzt, die kein svn-Plugin unterstützt, kann man das ganze auch direkt im Windows-Explorer erledigen mit Tortoise-SVN.
Linux-Fans empfehle ich das Video von Linus Torvalds zum Thema git, und warum es seiner Meinung nach das beste SCM ist:
Mehr Informationen zu VCS, ihren Funktionen und Zielen findet man bei Wikipedia schön zusammengefasst:
http://de.wikipedia.org/wiki/Versionsverwaltung
Eine sehr schöne Übersicht aller Features der bekanntesten 6 VCS:
Wir nutzen in der Firma aktuell Subversion, privat nutze ich es ebenfalls.