読者です 読者をやめる 読者になる 読者になる

みずぴー日記

陽気なプログラマが世界を廻す

タブとスペースの混在を検知してissuesを作るGithub botを作りました

f:id:mzp:20140620001024p:plain

Github上のレポジトリをクロールして、1個のファイルでタブによるインデントとスペースによるインデントを混在しているのを発見すると、issuesを作ってくれるbotを作りました。

作るissuesはこんな感じです。

f:id:mzp:20140620001039j:plain

ソースコード

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

俺はこれをDigitalOceanVPS上で動かしてます。

余談: 動機その1

ソフトウェアを作るのは楽しいけど、メンテナンスは結構ダルいです。バグ修正はしょうがないにしても、依存しているライブラリがバージョンアップしたせいで、メンテナンスしないといけないのが本当にダルい。

というわけで常々そういう作業を自動化したいと思ってました。具体的には

  • 依存しているライブラリがバージョンアップしたら、修正してpull reqを投げてほしい。
  • コード中のFIXMEを抜きだしてissuesにしてほしい。
  • コーディングスタイルに合わないところ({}の位置とか)を修正して、pull reqを投げてほしい。

みたいなことを人類がやる必要はないんじゃないかと思います。

というわけで、それを自動化するための最初の1歩として、タブとスペースの混在を検知するbotを作ってみました。

余談: 動機その2

今回、botの開発にはSML#を使いました。これは東北大学の大堀研究室が開発している言語で、

  • 大学が開発している言語なのに実用的を志向していて
  • わりと継続的にメンテナンスされててて
  • 開発の中心が日本にある

というわりとおもしろい特徴を持っている言語処理系です。

ですけど、なぜかみんなインストールして、それをブログに書いて、満足してしまっている感じがあります。実際、Googleも「SMLsharp」と入力すると「インストール」をサジェストしてきます。

f:id:mzp:20140620001607p:plain

これはよくない、プログラミング言語はプログラムを書くために使われるべきだ、と思ったので実際に使ってみました。*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