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

the platinum searcher(pt)をビルドして使ってみよう

※この記事はピョッコリンアドベントカレンダーのために書かれたものです。

サマリ

Golang初心者だけどthe platinum searcherをビルドして使ってみた。ついでにpull requestもしてみた。

the platinum searcherとは何か

ひとことで言うと、プログラマ向けの速いgrep。 作者様のblogはこちら

世の中には改良版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ファイルを 読んでくれないよ、っていうもの。

github.com

問題箇所の特定

おおよそこんな感じだったと思う。gdbで実行するまでもなかったかもしれないけど、 gdbを使ってみたかったのもあって、gdbでステップ実行しながら特定した。

  1. gdbで追いかけられるように、まずはptをビルドし直す:go build -v -gcflags "-N -l" -o pt_debug cmd/pt/main.go

  2. ptなりgrepなりで"gitignore"をソースのどこで使っているか探す

  3. ソースコードでは、option.goとoption_test.goとignore.goがひっかかるので、中を覗く。ignore.goだけが関係あることがわかる。

  4. gdbでptを起動する。入り口と思しきignore.go内のglobalGitIgnore関数にbreakpointを作成する。"b globalGitIgnore"と打つと、gdbはそんな関数しらねとのたまうので、"b ignore.go:88"とファイルかつ行数指定でbreakpointを作成する。

  5. gdbでステップ実行していくと、globalGitIgnoreName関数内で、gitconfig内にexcludesfilesが定義されていないときに空文字列が返されることがわかるので、その部分を修正すればよいことがわかる。

追記

何か中途半端だったし、元のソースコードとコンフリクトしてたしでプルリクを引っ込めた。