SVN Repositories unter Windows spiegeln

In der letzten Woche ist auf unserem Trac-Server ein etwas seltsamer Fehler aufgetreten: Beim Laden der Projektseite erschien der Python-Traceback

  File "buildbdist.win32eggtracremotesvnsvn_ra.py", line 1232, in get_changes
AttributeError: 'NoneType' object has no attribute 'created_rev'

Die Gründe für diesen Fehler konnte ich nicht weiter ermitteln und habe deshalb den Entwickler des Trac Remote SVN-Plugins angeschrieben. Bis heute kam aber noch keine Antwort.
Da der Zugang zum SVN-Repository doch relativ wichtig ist, musste ich mir etwas Anderes einfallen lassen.

Mein Plan: Das Projekt-Repository von unserem SVN-Server auf die DMZ spiegeln und statt des TracRemoteSvnPlugins die Standard-SVN-Bindings von Trac/Python benutzen.

Ab Subversion 1.4 existiert das Kommando svnsync.exe, mit der man einfach ein bestehendes Repository synchronisieren kann. Ich also unser SVN auf 1.4 geupdatet, und mit Hilfe von

sc create Svnservice
      binpath= "d:svnbinsvnserve.exe --service --root d:svnrepos"
      displayname= "Subversion Repository"
      depend= Tcpip

den Dienst eingetragen. SVNService.exe funktionierte nämlich mit der 1.4er-Version nicht mehr (Fehler: SVNService process ended prematurely – er versuchte auf einen nicht-existenten Registry-Key zuzugreifen und das Wechseln des Benutzer-Kontos brachte auch keine brauchbaren Ergebnisse).

Als nächstes testete ich unsere Repositories. Sie waren alle unter SVN 1.3 erstellt. Machte aber nichts, da die 1.4er mit älteren Repositories ohne Probleme klar kommt.

Es folgte das Anlegen des lokalen Mirrors:

svnadmin create c:/server/repository/project_mirror

Ich musste noch einen Hook erstellen, der die revprops richtig setzt (unter c:/server/repository/project_mirror/hooks/pre-revprop-change.bat speichern):

set REPO=%1
set REV=%2
set USER=%3
set PROPNAME=%4
set ACTION=%5
if "%USER%"=="svnsync" goto DOIT
goto CANNOT_DOIT
:DOIT
exit 0
goto END
:CANNOT_DOIT
echo "Only the svnsync user can change revprops" >&2
exit 1
:END

Es folgte das Initalisieren des Repositories:

svnsync init --username file:///c:/server/repository/project_mirror svn://<url>/project

Damit der Mirror täglich geupdate wird, habe ich einen Job eingerichtet, der nun folgendes Script zum Synchronisieren aufruft:

cmd.exe /c svnsync sync file:///c:/server/repository/project_mirror svn://<url>/project

Nachdem ich nun die trac.ini auf den lokalen Mirror angepasst hatte, funktionierte die Oberfläche von Trac auch wieder ohne Probleme.

Leave a reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>