Git のブランチ名をパースして Issue ID を出力する buranko を作った
git-flow なブランチ名 feature/1234_foo-bar
から Issue ID を取得してコミットコメントに追加する git hook
を書いていたのだが、sed
でパースして加工していた部分がいつの間にか Linux と Mac OS X で挙動が異なっていた。
そこで、パース処理を Golang で実装した buranko というツールを作った。 https://github.com/chocoby/buranko
インストール
go get
コマンドでインストールできる。
$ go get github.com/chocoby/buranko
または Releases からバイナリをダウンロードして
$PATH
が通っているディレクトリに置く。
使い方
buranko
コマンドを引数無しで実行した場合は、Issue ID を出力する。
-ref
オプションを付けると ID に #
が付くのでコミットコメントで利用しやすくなる。
パースできない場合は何も出力しない。
$ git checkout -b feature/1234_foo-bar
$ buranko
1234
$ buranko -ref
#1234
内部で git
コマンドを実行して現在のブランチ名を取得しているのだが、標準入力があればそれをパースする。
$ echo 'feature/1234_foo-bar' | buranko
1234
パースできるパターンは parser_test.go でテストしている。
git の hook でコミットコメントに ID を付ける
git リポジトリの .git/hooks/prepare-commit-msg
に以下のコードを書く。
if [ "$2" == "" ]; then
mv $1 $1.tmp
echo `buranko -ref` > $1
cat $1.tmp >> $1
fi
良かったらどうぞ!
初めて Golang でツールを書いたので、何を使ったのかをメモしておく。
ひな形の作成
CLI のひな形の作成には tcnksm/gcli を使った。 現在は 3 種類のフレームワークからひな形を作成できるのだが、複雑な構成にはならないので、 一番シンプルな go_cmd パターンで作成した。 こんな感じ で作成される。
コマンドの実行
git
コマンドの実行には mattn/go-shellwords を使った。
コマンドの組み立てには使っていないのだが、$PATH
の面倒を見てくれるところが助かる。
クロスコンパイル
クロスコンパイルは laher/goxc を使った。
最初は gox
を試したのだが、goxc
はアーカイブまでやってくれるところがお気に入り。
以下のオプションでコンパイルしている。
goxc -arch="386 amd64" -os="windows linux darwin"
Releases への登録は手動なので、後々 CI でやるようにしたい。
手元の Windows には git 環境がないので、標準入力経由でのみ確認している。
テスト
RSpec に慣れた身からするとシンプルな仕様には少々戸惑ったが、慣れてくるとアリだと思った。 パースのパターンについてのテストを書いた時は go-shellwords のテストを参考にさせてもらった。
go fmt
少しぐらいコーディングスタイルを乱しても go fmt
が面倒を見てくれるのでありがたい。
エディアは vim なので fatih/vim-go を使っている。
TODO
- コードの整理
- リポジトリ外でコマンドを実行した時などのエラー処理
- 自動クロスコンパイル
- 対応パターンの充実
ひな形で作ったまま放置している部分があったりするので整理していきたい。
参考にしたプロジェクト
いろいろなプロジェクトを参考にさせてもらった。
まだ Golang に慣れていないが、書いていて楽しい言語だなーと感じた。
静的型付けでは当たり前だと思うが、コードに不備があった時に go build
で止まるのはありがたい。
今回は goroutine などの特徴的な機能は使っていないが、どんどん Golang を書いていきたい!
(Go? Golang?)