タブとスペースの混在を検知してissuesを作るGithub botを作りました
Github上のレポジトリをクロールして、1個のファイルでタブによるインデントとスペースによるインデントを混在しているのを発見すると、issuesを作ってくれるbotを作りました。
作るissuesはこんな感じです。
ソースコード
https://github.com/mzp/space_tab_bot/
ビルド方法・使い方
詳しくはREADME.mkdn に書いてありますが、要するにSML#をインストールした上で、makeすればビルドできます。
$ make depend $ make
監視したいレポジトリのURLは~/.space_tab_bot
に書きます。
https://github.com/mzp/space_tab_bot
issuesを作るのに使うGithubアカウントを環境変数にセットした上で実行します。
$ export GITHUB_USERNAME=“your_name” $ export GITHUB_PASSWORD="your_password” $ ./space_tab_bot
実行されると監視対象のレポジトリをクロールし、タブとスペースを混在して使っているファイルを見付けると、そのレポジトリにissuesを作成します。
運用方法
SML#がx86なライブラリを要求してつらいので、実際に運用するときはDockerに隔離しました*1。
Dockerfileはレポジトリにコミットしてあるので、以下のコマンドでspace_tab_bot用のイメージを作れます。
$ cd misc/dockerfile $ docker build -t space_tab_bot .
あとはcronで定期的にbotを起動するようにします。
00 * * * * docker run space_tab_bot env GITHUB_USERNAME=“your_username" GITHUB_PASSWORD="your_password" ./space_tab_bot/space_tab_bot --config /root/.space_tab_bot
俺はこれをDigitalOceanのVPS上で動かしてます。
余談: 動機その1
ソフトウェアを作るのは楽しいけど、メンテナンスは結構ダルいです。バグ修正はしょうがないにしても、依存しているライブラリがバージョンアップしたせいで、メンテナンスしないといけないのが本当にダルい。
というわけで常々そういう作業を自動化したいと思ってました。具体的には
- 依存しているライブラリがバージョンアップしたら、修正してpull reqを投げてほしい。
- コード中のFIXMEを抜きだしてissuesにしてほしい。
- コーディングスタイルに合わないところ({}の位置とか)を修正して、pull reqを投げてほしい。
みたいなことを人類がやる必要はないんじゃないかと思います。
というわけで、それを自動化するための最初の1歩として、タブとスペースの混在を検知するbotを作ってみました。
余談: 動機その2
今回、botの開発にはSML#を使いました。これは東北大学の大堀研究室が開発している言語で、
- 大学が開発している言語なのに実用的を志向していて
- わりと継続的にメンテナンスされててて
- 開発の中心が日本にある
というわりとおもしろい特徴を持っている言語処理系です。
ですけど、なぜかみんなインストールして、それをブログに書いて、満足してしまっている感じがあります。実際、Googleも「SMLsharp」と入力すると「インストール」をサジェストしてきます。
これはよくない、プログラミング言語はプログラムを書くために使われるべきだ、と思ったので実際に使ってみました。*2
余談: 得られた知見
- Rubygemsとかopamみたいなエコシステムはおろかライブラリがほぼなくて辛かった。
- ときおりコンパイラが発狂するけどmake cleanすれば問題ない。
- x86しか対応してないので環境を作るのが面倒。SML#用に1個VMを作ったほうがいい*3
*1:このためにDocker HubにSML#用のイメージを登録してました。
*2:ちなみにこのbotのレポジトリのissues #1にそういうことが書いてあります。
*3:64bit対応は現在進行中だそうです。https://twitter.com/no_maddo/status/473740777693016064