2012-04-09 14 views
3

Antを使ってsvnリポジトリの最新のコミットのユーザ名を取得したいと思います。antを使って最後のsvnコミットのユーザ名を取得する方法は?

できるだけクロスプラットフォームでこれを行うことができますか?

ありがとうございました!

<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> 

は、あなたが "devlibs.path" で識別されるパスに "svnant.jar" と "svnClientAdapter.jar" を置く必要があります。

+0

情報はプロジェクトルートの '.svn/entries'の中にあります。 – okm

+0

@okm:このファイルには数字だけがあります。これは何らかの指標ですか? – clamp

+2

@ clamp:http://code.google.com/p/svntask/またはhttp://subclipse.tigris.org/svnant.htmlを試してみましたか?最初にsvn logコマンドが実装されています。 – Jayan

答えて

7

だから、ここの例では、 "svnant" のためです。 "javahl"や "svnkit"があなたの "$ {ANT_HOME}/lib"に必要とする他のライブラリです。

1.6形式のSVNリポジトリがある場合は、 "svnkit"( "svnSetting" -blockの "true"に設定)を使用できます。 "svnkit"は純粋なJavaツールキットなので、クロスプラットフォームソリューションが必要なときに使用することをお勧めします。すでに1.7に切り替えた場合は、SVNコマンドラインクライアント(私の例ではコマンドラインクライアント用に設定された "svnSetting")を使用することをお勧めします。検索する場所と異なるSVNコマンドラインクライアントをインストールする方法については、​​(Slik SVN)を参照してください。

+0

:// Subclipseの.tigris.org/svnant/svntask.html)タスク。 – Jesse

7

はちょうどあなたが、オプションのタスクを使用しないソリューションを好む場合には、ここにあなたがそれを行うことができる方法の要旨です:

<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> 

一つの漁獲量は、あなたが常に可能ではないかもしれないファイルを削除/書き込みということです(つまり、あなたが権限を持っていない場合)。もう一つのキャッチは、コマンドラインからsvnコマンドで実行できるsvnクライアントをインストールする必要があることです。

+0

あなたの答えには関係ありませんが、 'filset' dir =ローカルフォルダではなくsvnリポジトリにリンクできますか?たとえば、この私はディレクトリがsvnサーバー上にあることを望みます – Moudiz

1

私は答えを投稿したと思いました。これは多かれ少なかれmalenkiy_scotのanswerです。しかし、私はsvn infoコマンドで--xmlフラグを使用します。これにより、svn infoコマンドの出力がxml出力に出力されます。私は<xmlproperty>タスクを使って読むことができました。

リソースコレクションを使用することで、後で削除する必要があるファイルに出力を保存するという問題も回避できました。

<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> 

私はリソースとして<exec>タスク自体を使用して逃げることができるかどうかを確認してみました。そうすれば、svn infoコマンドの出力をプロパティに保存する必要はありません。しかし、うーん、私はそれを行う方法を理解できませんでした。


最もプラットフォーム中立方法は、ヴァディムポノマリョフのanswerです。これは私がこの質問に答えることを意図した方法でした。

しかし、私はdevlibディレクトリにsvnkit jarファイルを含めて、svnkitの使用を強制しました。これにより、どのSubversionクライアントがインストールされているかにかかわらず動作することが確認されます。 Subversionクライアントがインストールされていなくても動作します。必要なjarファイルをプロジェクト内のディレクトリに保存してください。

0

実行可能なシェルにはすでに優れた解決策があります。このソリューションには、ビルド後の段階ではなく、スクリプトを使用してビルド段階の一部として実行できるという利点があります。これについては後述します。https://stackoverflow.com/a/11837662/5842403

実際、ビルド・フォルダー内の../builds/$BUILD_NUMBER/changelog.xmlファイルの読み取り/解析によって、ビルド・フェーズの終了前に情報にアクセスできます。このファイルはSVNコミットトリガで作成され、ビルドまたはpost_buildフェーズの終了では作成されません。つまり、スクリプトを使用して同じジョブのビルドフェーズの開始時に解析し、env変数にデータを挿入することができます。

関連する問題