the platinum searcher(pt)をビルドして使ってみよう
※この記事はピョッコリンアドベントカレンダーのために書かれたものです。
サマリ
Golang初心者だけどthe platinum searcherをビルドして使ってみた。ついでにpull requestもしてみた。
the platinum searcherとは何か
ひとことで言うと、プログラマ向けの速いgrep。 作者様のblogはこちら。
世の中には改良版grepとして、以下のものがあるみたい。
- ack:プログラマ向けの便利なgrep
- the silver searcher(ag):プログラマ向けの高速grep
- the platinum searcher(pt):プログラマ向けの高速grep
ptとagの違いは、EUC-JPやShift_JISに対応しているか否か。 (agはUTF-8しか対応していなくて、EUC-JPやShift_JISのファイルが スキップされてしまうという罠がある)
the platinum searcherのビルドとインストール
README.mdにしたがっていけばOK。
$ go get -u github.com/monochromegane/the_platinum_searcher $ go get -u github.com/jessevdk/go-flags # なぜか入らなかったので別立て。普通はいらないはず。 $ go get -u github.com/monochromegane/conflag # なぜか入らなかったので別立て。普通はいらないはず。 $ go get -u github.com/monochromegane/terminal # なぜか入らなかったので別立て。普通はいらないはず。 $ cd $GOPATH/src/github.com/monochromegane/the_platinum_searcher $ go build -o $GOPATH/bin/pt cmd/pt/main.go
おまけ:pull requestを投げてみた
pull requestした背景
githubを使ってはいるが、恥ずかしながら1度もpull requestというものを投げたことがなかったので、 pull requestを投げてみたかったんです・・・ というわけで、A Tour of Goをひととおりやった程度の僕でもなんとかできそうなissueを選んでpull requestを投げてみた。
以下のissueは、.gitconfigにexcludesfileが指定されていないときに、グローバルなgitignoreファイルを 読んでくれないよ、っていうもの。
問題箇所の特定
おおよそこんな感じだったと思う。gdbで実行するまでもなかったかもしれないけど、 gdbを使ってみたかったのもあって、gdbでステップ実行しながら特定した。
gdbで追いかけられるように、まずはptをビルドし直す:
go build -v -gcflags "-N -l" -o pt_debug cmd/pt/main.go
ptなりgrepなりで"gitignore"をソースのどこで使っているか探す
ソースコードでは、option.goとoption_test.goとignore.goがひっかかるので、中を覗く。ignore.goだけが関係あることがわかる。
gdbでptを起動する。入り口と思しきignore.go内のglobalGitIgnore関数にbreakpointを作成する。"b globalGitIgnore"と打つと、gdbはそんな関数しらねとのたまうので、"b ignore.go:88"とファイルかつ行数指定でbreakpointを作成する。
gdbでステップ実行していくと、globalGitIgnoreName関数内で、gitconfig内にexcludesfilesが定義されていないときに空文字列が返されることがわかるので、その部分を修正すればよいことがわかる。
追記
何か中途半端だったし、元のソースコードとコンフリクトしてたしでプルリクを引っ込めた。