2010-11-30 10 views
1

Ich schreibe einen Post-Commit-Hook, in dem ich svn diff -summarize verwende, um eine Zusammenfassung dessen zu erhalten, was geändert wurde. Wenn Dateien/Ordner hinzugefügt oder geändert werden, kann ich ihren Dateityp einfach in einer Arbeitskopie abrufen, die automatisch immer auf dem neuesten Stand gehalten wird. Aber wenn eine Datei oder ein Ordner gelöscht wird, kann ich nicht herausfinden, ob ein Element in der Datei svn diff -summarize eine Datei oder ein Ordner ist.Wie erkennt man, ob ein Element in einem SVN-Diff eine Datei oder ein Ordner ist?

Eine Problemumgehung, die ich dafür gedacht habe, ist, eine andere Arbeitskopie zu behalten, automatisch aktualisiert, aber immer eine Revision hinter der anderen Arbeitskopie behalten. Wenn eine Datei/ein Ordner gelöscht wurde, konnte ich sie in der älteren Arbeitskopie erhalten. Ich denke jedoch, dass dies eine außerordentlich ineffiziente Art ist, dies zu tun, was mich zwingt, zwei verschiedene Arbeitskopien gleichzeitig zu behalten, und ich fragte mich, ob es irgendetwas in SVN gibt, das bei dieser Aufgabe helfen würde.

Antwort

2

Wenn Sie svn-Hooks eines beliebigen Typs schreiben, wenn Sie Informationen über das Repository oder über eine Transaktion benötigen, verwenden Sie das Programm svnlook aus einem Shell-Skript oder verwenden Sie die svn-API in der Sprache Ihrer Wahl. Die Verwendung von svnlook ist schneller, da es den gesamten svn RA-Code (Fernzugriff) umgeht, einschließlich der Ebene der Berechtigungsprüfungen - da die Skripte im Kontext des Servers ausgeführt werden, ist dies kein Problem. Darüber hinaus haben Sie nicht den zusätzlichen Aufwand für das Aktualisieren einer Arbeitskopie, die Sie nicht verwenden, also nichts anderes als Dateitypinformationen.

svnlook enthält zahlreiche Optionen zur Untersuchung von Revisionen (für Post * Hooks) und Transaktionen (für Pre * Transaktionen). Von besonderem Interesse ist hier die Option changed.

            
 
changed: usage: svnlook changed REPOS_PATH Print the paths that were changed. Valid options: -r [--revision] ARG : specify revision number ARG -t [--transaction] ARG : specify transaction name ARG --copy-info : show details for copies

Die Änderungen, die die Revision oder Transaktion aus angezeigt werden, etwa so:

A trunk/src/new-dir/ 
A trunk/src/new-dir/newheader.h 
A trunk/src/new-dir/newsrc.c 
U trunk/src/existingsrc.c 

Ausgabe von svnlook, wenn ein Verzeichnis verweisen, endet immer in /. Dies ist ein einfacher Diskriminator für die Erkennung von Dateien oder Verzeichnissen.

Die Dinge werden jedoch ein wenig düsterer im Umgang mit Löschungen. Wenn ein Verzeichnis gelöscht wird, wird auch alles unter dem Verzeichnis entfernt, und diese Information wird nicht in changed angezeigt. Siehe hier:

D trunk/src/new-dir/ 
U trunk/src/existingsrc.c 

Basierend auf der Beschreibung dessen, was Sie suchen auf, ich werde erraten, dass Sie sich für irgendeine Form von suchen Berichterstattung post-commit. Wenn ja, möchten Sie vielleicht the subversion mailer post-* hook auschecken. Auch wenn Sie keine Ergebnisse per E-Mail versenden möchten, zeigt der Code, wie Sie mit der svn-API eine Transaktion oder Revision für Änderungen durchlaufen.

+0

Wow, ich hätte nie darüber nachgedacht. Danke, dass du die Frage beantwortet hast, obwohl ich das schon aufgegeben habe und nach Git gegangen bin. –

+0

@BrunoDeBarros Ich kann nicht sagen, dass ich dir die Schuld gebe. 4 Monate sind genug Zeit, um es sich noch einmal zu überlegen. –

Verwandte Themen