Ant を使用して、svn リポジトリの最新のコミットのユーザー名を取得したいと考えています。
可能な限りクロスプラットフォームでこれを行うにはどうすればよいですか?
ありがとう!
したがって、「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>
「devlibs.path」で識別されるパスに「svnant.jar」と「svnClientAdapter.jar」を配置する必要があります。「javahl」または「svnkit」で必要なその他のライブラリを「${ANT_HOME}/lib」に追加します。
1.6 形式の SVN リポジトリがある場合は、"svnkit" ("svnSetting" ブロックで "true" に設定) を使用できます。「svnkit」は純粋な Java ツールキットであるため、クロスプラットフォーム ソリューションが必要な場合に使用するのが最適です。すでに 1.7 に切り替えている場合は、SVN コマンド ライン クライアントを使用することをお勧めします (この例では、コマンド ライン クライアント用に「svnSetting」が構成されています)。このページ( Slik SVN) で、さまざまな SVN コマンド ライン クライアントの場所とインストール方法に関する情報を確認してください。
オプションのタスクを使用しないソリューションを好む場合に備えて、その方法の要点を次に示します。
<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>
1 つの問題は、常に可能であるとは限らないファイルの書き込み/削除です (つまり、権限がない場合)。もう 1 つの問題は、svn クライアント (svn
コマンド ラインからコマンドを介して実行できる) をインストールする必要があることです。
私は答えを投稿したと思った。これは多かれ少なかれ malenkiy_scot の答えです。ただし、コマンドで--xml
フラグを使用しsvn info
ます。これにより、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
コマンドの出力をプロパティに保存する必要さえありません。しかし、残念ながら、私はそれを行う方法を理解できませんでした。
最もプラットフォームに依存しない方法は、Vadim Ponomarev の答えです。これが私がこの質問に答えるつもりだった方法でした。
devlib
ただし、ディレクトリにsvnkit jar ファイルを含め、svnkit
. これにより、どの Subversion クライアントがインストールされていても確実に機能します。Subversion クライアントがインストールされていなくても動作します。プロジェクトのディレクトリ内に必要な jar を保持するだけです。
There is already a good solution within a executable shell. That solution has the advantage that you can do it as part of the build phase using scripting and not in the post-build phase.That is explained below. See https://stackoverflow.com/a/11837662/5842403
In fact, you can access to the information before the build phase finish by reading/parsing the ../builds/$BUILD_NUMBER/changelog.xml file inside the build folder. This file is created with the SVN commit triggering and not with the end of the build or post_build phase. That means, you can parse it at the start of the build phase of the same job with a script and insert the data in env variables.