時間のかかる数値計算を行っていると、どのプログラムによる結果なのかを見返したくなるときがある。以下はそんな場合に有効。
gitの最新のcommitを取得&unstagedがあるか判定
ワンライナーで書いてみた。そんなに難しくはない。
git rev-parse --short HEAD | tr -d '\n'; if [ `git status -s -uno | wc -l` -ne 0 ]; then echo "_unstaged"; fi
git rev-parse --short HEAD
でコミット取得- これを
tr -d '\n'
で返り値の改行を削除する
- これを
git status -s -uno
追跡されているファイルのうち、変更したファイル名を列挙wc -l
でその数を数える- 条件分岐でこれらが一行でもあれば、
_unstaged
を後ろにつける
ビルド時に埋め込む
上記ワンライナを使用して以下でCOMMIT
を取得
COMMIT := $(shell git rev-parse --short HEAD | tr -d '\n'; if [ `git status -s -uno | wc -l` -ne 0 ]; then echo "_unstaged"; fi)
あとはコンパイルの際、(gccやclangなどは)オプションで-DCOMMIT_ID=\"$(COMMIT)\"
を渡してやればOK(この場合は#define COMMIT_ID 00aabb
のようになる。プログラム中ではこのマクロを埋め込んでやれば良い。
補足
上記でビルドは問題なく通るはずだが、エディタなどが未定義のマクロを使うなと怒ってくることがある。その場合は
#ifndef COMMIT_ID
#define COMMIT_ID "undefined"
#endif
などと先頭に記載しておけば良いだろう。