2012-04-09 4 views
3

Ich möchte Ant verwenden, um den Benutzernamen des letzten Commits eines SVN-Repository zu erhalten.Wie bekomme ich den Benutzernamen des letzten Svn Commits mit ant?

Wie kann ich dies so plattformübergreifend wie möglich tun?

danke!

+0

Die Information ist innerhalb '.svn/entries' des Projektstamms – okm

+0

@okm: in dieser Datei gibt es nur eine Nummer. ist das eine Art Index? – clamp

+2

@ clamp: Haben Sie eines der http://code.google.com/p/svntask/ oder http://subclipse.tigris.org/svnant.html versucht. Der erste hat Svn Log-Befehl implementiert. – Jayan

Antwort

7

So, hier ist beispielsweise für "svnant":

<path id="devlibs.path"> 
    <fileset dir="devlib" includes="**/*.jar" /> 
</path> 

<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="devlibs.path" /> 

<svnSetting 
     id="svn.settings" 
     svnkit="false" 
     javahl="false" 
     username="${svn.username}" 
     password="${svn.password}" /> 

<target name="get-svn-author"> 
    <svn refid="svn.settings"> 
     <singleinfo target="${svn.repo.url}" property="author.result" request="author" /> 
    </svn> 

    <echo message="Author of last commit: ${author.result}" /> 
</target> 

Sie sollten "svnant.jar" setzen und "svnClientAdapter.jar" auf Pfad durch "devlibs.path" identifiziert. Und andere Bibliotheken, die von "javahl" oder "svnkit" für Ihre "$ {ANT_HOME}/lib" benötigt werden.

Wenn Sie SVN-Repository mit 1.6-Format haben, könnten Sie "svnkit" verwenden (im "svnSetting" -Block auf "true" gesetzt). Da "svnkit" ein reines Java-Toolkit ist, sollte es am besten verwendet werden, wenn Sie eine plattformübergreifende Lösung benötigen. Wenn Sie bereits zu 1.7 gewechselt haben, dann empfehle ich, den SVN-Kommandozeilen-Client zu verwenden ("svnSetting" ist in meinem Beispiel für den Kommandozeilen-Client konfiguriert). Überprüfen Sie this page (Slik SVN) für Informationen über wo zu finden und wie verschiedene SVN-Befehlszeilenclients zu installieren.

+0

Diese Antwort ist auch ein gutes Beispiel dafür, SvnAnt svnSetting zu verwenden, da die Parameter username, password, javahl, svnkit usw. für die [svn] veraltet sind (http: // subclipse .tigris.org/svnant/svntask.html) Aufgabe. – Jesse

7

Gerade falls Sie eine Lösung bevorzugen, die nicht optionale Aufgaben nicht verwendet, hier ist der Kern, wie Sie es tun können:

<target name="get-svn-author"> 
    <tempfile property="svninfo.result"/> 
    <exec executable="svn" output="${svninfo.result}"> 
     <arg value="info"/> 
     <arg value="${svn.repo.url}"/> 
    </exec> 
    <tempfile property="svnauthor.result"/> 
    <copy file="${svninfo.result}" tofile="${svnauthor.result}"> 
     <filterchain> 
      <linecontainsregexp> 
       <regexp pattern="Last Changed Author:*"/> 
      </linecontainsregexp> 
     </filterchain> 
    </copy> 
    <concat> 
     <filelist files="${svnauthor.result}"/> 
    </concat> 
    <delete file="${svninfo.result}"/> 
    <delete file="${svnauthor.result}"/> 
</target> 

Ein Haken ist, dass Sie schreiben/Löschen von Dateien, die nicht immer möglich ist, (dh wenn Sie keine Berechtigungen haben). Ein weiterer Haken ist, dass ein Svn-Client (der über den Befehl svn über die Befehlszeile ausgeführt werden kann) installiert sein muss.

+0

nicht im Zusammenhang mit Ihrer Antwort, aber kann ein 'filset' dir = mit Svn Repository nicht lokalen Ordner verknüpft werden? zum Beispiel in diesem Ich möchte das Verzeichnis auf Svn Server ist das möglich – Moudiz

1

Ich dachte, ich hätte eine Antwort geschrieben. Dies ist mehr oder weniger malenkiy_scots answer. Allerdings verwende ich das --xml Flag auf dem svn info Befehl. Dies brachte die Ausgabe des Befehls svn info in XML-Ausgabe. Ich war dann in der Lage, die <xmlproperty> Aufgabe zu verwenden, um es zu lesen.

Durch die Verwendung von Resource Collections habe ich auch das Problem vermieden, die Ausgabe in eine Datei zu speichern, die später gelöscht werden muss.

<project> 
    <property name="svn.url" value="http://svn.foo.com/src/repos"/> 
    <exec executable="svn" 
     outputproperty="svn.info"> 
     <arg value="info"/> 
     <arg value="--xml"/> 
     <arg value="${svn.url}"/> 
    </exec> 
    <xmlproperty prefix="svn"> 
     <propertyresource name="svn.info"/> 
    </xmlproperty> 
    <echo message="Last committer = ${svn.info.entry.commit.author}"/> 
</project> 

Ich habe versucht zu sehen, ob ich mit der Verwendung der <exec> Aufgabe selbst als Ressource wegkommen kann. Auf diese Weise würde ich die Ausgabe des Befehls svn info nicht einmal in eine Eigenschaft speichern müssen. Aber leider konnte ich nicht herausfinden, wie ich das machen sollte.


Die Plattform neutral Weg ist answer Vadim Ponomarev. So wollte ich diese Frage beantworten.

Allerdings hätte ich die SVNKIT-JAR-Datei in das Verzeichnis devlib eingefügt und die Verwendung von svnkit erzwungen. Dies stellt sicher, dass es funktioniert, egal, welcher Subversion-Client installiert ist. Es funktioniert sogar, wenn kein Subversion-Client installiert ist. Bewahren Sie einfach die erforderlichen JAR-Dateien in einem Verzeichnis im Projekt auf.

0

Es gibt bereits eine gute Lösung innerhalb einer ausführbaren Shell. Diese Lösung hat den Vorteil, dass Sie dies als Teil der Erstellungsphase mithilfe von Skripten und nicht in der Post-Build-Phase durchführen können. Dies wird nachstehend erläutert.Siehe https://stackoverflow.com/a/11837662/5842403

In der Tat können Sie auf die Informationen zugreifen, bevor die Build-Phase fertig ist, indem Sie die Datei ../builds/$BUILD_NUMBER/changelog.xml im Build-Ordner lesen/analysieren. Diese Datei wird mit dem auslösenden SVN-Commit und nicht mit dem Ende der Build- oder post_build-Phase erstellt. Das heißt, Sie können es zu Beginn der Erstellungsphase desselben Jobs mit einem Skript analysieren und die Daten in env-Variablen einfügen.

Verwandte Themen