出荷するときのバージョン埋め込みに使えるtemplate
出荷するときにバージョンを付与したい
社内のあるソースコードリポジトリをMercurialに移行して数ヶ月。そろそろ社内の他部署にリリースします。リリースといえば、ソースコードにタグ付して出荷したリビジョンを特定する必要がありますよね。tagを付与してhg up 0.0.1 とかして ビルドすればOKですが、ビルドしたオブジェクトにバージョン情報を含めたい。そして tag が付与していないバージョンでもそれなりにわかる情報を付与したいとそんなことを考えていました。
野良ビルドした hg を hg version してみると
Mercurial 自体のソースコードのリポジトリを持ってきてビルドすると、なんだかタグ名+アルファの情報がついてタグからいくつかリビジョンが更新されたバージョンであることがわかって良い感じです。
$ /c/Python26/Scripts/hg version Mercurial - 分散構成管理ツール(バージョン 2.2.1+38-2fdd1902ed2d) (詳細は http://mercurial.selenic.com を参照してください) Copyright (C) 2005-2012 Matt Mackall 他 本製品はフリーソフトウェアです。 頒布条件に関しては同梱されるライセンス条項をお読みください。 市場適合性や特定用途への可否を含め、 本製品は無保証です。
サンプルコード
hg help template でそれっぽいキーワードを見つけたのでつくってみた。Windowsのバッチコマンドと、bashで確認したシェルスクリプトです。どちらも同じ結果が得られます。
バッチファイルの場合
@echo off setlocal for /f "usebackq tokens=*" %%i in (`hg parent --template "{latesttag}"`) do @set HG_TAG=%%i for /f "usebackq tokens=*" %%i in (`hg parent --template "{latesttagdistance}"`) do @set HG_TAGDIST=%%i for /f "usebackq tokens=*" %%i in (`hg parent --template "{latesttag}+{latesttagdistance}-{node|short}"`) do @set HG_VER=%%i REM --- print version like mercurial style --- if %HG_TAGDIST%==0 ( echo %HG_TAG% ) else ( echo %HG_VER% )
シェルスクリプトの場合
#!/bin/bash HG_TAG=`hg parent --template "{latesttag}"` HG_TAGDIST=`hg parent --template "{latesttagdistance}"` HG_VER=`hg parent --template "{latesttag}+{latesttagdistance}-{node|short}"` if [ $HG_TAGDIST == 0 ]; then echo $HG_TAG else echo $HG_VER fi
0.1.0の場合は、
$ ./hgver.sh 0.1.0
となります。リリースするバージョンはタグ情報だけでシンプルです。
0.1.0のタグから3リビジョンの更新があると、
$ ./hgver.sh 0.1.0+3-5efd20969e45
こんな風になります。更新されているバージョンであることがわかりますね。
これをちょっと改変して、ソースコードのヘッダに仕込んだり、テキストファイルで出荷アーカイブに含めるなどしておけば、不具合報告を受ける際にこのバージョン情報を教えてもらえば、どのソースコードを見れば良いか、一意に特定することができますね。