つい最近まで知らなかったのでメモ。
ソースコードのバージョン管理と言えば今ではgitがトレンドだけど、仕事先ではまだまだSubversionだったりマイクロソフトのTeam Foundation Serverだったりで、おそらくgitを使っているチームはほとんど無いのではないかと思う。
そんな中、Subversionのコミットログをプログラム上で扱いたいと思うことがあり、いろいろと方法を探していた。
最初はSubversionの言語バインディング(API)を使うしかないのかな、と調べてみたけれどJavaとCしかまともにサポートされてなさそうな雰囲気だったのと使い方が面倒そうで保留。
次にSubvertionがリポジトリとやり取りしてるプロトコルを喋れないかと調べてみたけれどこれも仕様がよく分からず、WebDAVだとどうかな?と見てみてもSubversionのサーバー構築の情報はたくさん出てくるけれど、あまり情報が無くてこれも保留。
※いまこのブログを書いてる途中に調べてみると、WebDAVのプロトコル仕様は公開されている様子。時間があればこちらも調べてみる。
で、何気なくsvn logコマンドのリファレンスを眺めていたら"--xml"というオプションがあるのを発見。
通常のsvn logコマンドだとこんな感じの出力(一部省略)だが、
# svn log -l 2 http://svn.apache.org/repos/asf/subversion/trunk
------------------------------------------------------------------------
r1801108 | philip | 2017-07-07 05:56:14 +0900 (金, 07 7月 2017) | 24 lines
Add exception checks to some of the JavaHL native code to avoid JVM
warnings about JNI problems of the form:
WARNING in native method: JNI call made without checking exceptions when required to
------------------------------------------------------------------------
r1801012 | danielsh | 2017-07-06 19:19:47 +0900 (木, 06 7月 2017) | 3 lines
* tools/dist/templates/rc-release-ann.ezt,
* tools/dist/templates/stable-release-ann.ezt:
Fix a copy-pasto in these templates.
------------------------------------------------------------------------
--xmlオプションをつけると
# svn log -l 2 --xml http://svn.apache.org/repos/asf/subversion/trunk
philip
2017-07-06T20:56:14.167594Z
Add exception checks to some of the JavaHL native code to avoid JVM
warnings about JNI problems of the form:
WARNING in native method: JNI call made without checking exceptions when required to
danielsh
2017-07-06T10:19:47.297427Z
* tools/dist/templates/rc-release-ann.ezt,
* tools/dist/templates/stable-release-ann.ezt:
Fix a copy-pasto in these templates.
とXMLで出力される。
これなら標準入力でXMLを受け取ってパースすればどうとでも扱える。プログラム内からsvnコマンドを直接実行するのでセキュリティ的にどうこうはあるかもしれないが、個人が使うちょっとしたツールではあまり問題にならないだろう。
svn logコマンド以外にもsvn info や svn status など--xmlオプションを付けられるコマンドは他にもあるようなので、上手く使うと便利なことができるかも。