secretbase.log

.NET/C#/Pythonなど

出荷するときのバージョン埋め込みに使える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

こんな風になります。更新されているバージョンであることがわかりますね。

これをちょっと改変して、ソースコードのヘッダに仕込んだり、テキストファイルで出荷アーカイブに含めるなどしておけば、不具合報告を受ける際にこのバージョン情報を教えてもらえば、どのソースコードを見れば良いか、一意に特定することができますね。