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?)

© 2023 暇人じゃない. All rights reserved.