新年一発目の更新。 年末に駆け込みでv1.14.0を出したので、前回ブログで書いたv1.13.0から2つアップデートした。
🏕 Features
v1.14.0
- Add changes for suppressing output when binary output is encountered by @buty4649 in https://github.com/buty4649/rf/pull/136
v1.15.0
- Add changes for suppressing output when binary output is encountered by @buty4649 in https://github.com/buty4649/rf/pull/136
- Use ruby 3.3! by @buty4649 in https://github.com/buty4649/rf/pull/138
- Implement auto-disable of color output in non-TTY environment by @buty4649 in https://github.com/buty4649/rf/pull/140
- Improved runtime performance by adding build-time optimization options by @buty4649 in https://github.com/buty4649/rf/pull/141
- Use iij/mruby-tempfile instead of mrbgems/mruby-tempfile by @buty4649 in https://github.com/buty4649/rf/pull/142
- Fix infinite loop issue when reading binary files by @buty4649 in https://github.com/buty4649/rf/pull/143
それぞれの機能追加について以下で説明する。
バイナリファイルを読み込んで出力するときに出力をフィルタするようにした
grepでバイナリファイルにマッチした時に、binary file matches
っとでるやる。
再起検索しているときに不意にバイナリを読んでしまい、ターミナルが破滅するのを防ぐことができる。
実装としてはシンプルで、ファイルの読み込みにバッファを持つようにして、そのバッファに改行コード以外の制御文字が含まれていたらバイナリファイルとしてマークする。
マークされた状態で出力を行おうとしたときに、binary file matches
と表示するようにした。
文字で書くと簡単なのだけど実装してみたらなんとmrubyのバグを見つけてしまった。 そのバグとは、MRB_UTF8_STRINGフラグを設定した状態でビルドしたmrubyバイナリにおいて、UTF-8としてはinvalidなデータを含んだStringでindexメソッドを呼び出すと無限ループするというものだった。 mrubyのHEADでも再現したのでissueを立てたらmatzがすぐに解決してくれたので感謝!
出力先がTTYではない場合に色付き出力を抑止(--no-color)する
rfでフィルタした内容をパイプして違うコマンドに流し込むときに、エスケープシーケンスがついている邪魔になるので抑止するようにした。 具体的にはrf | xargs bash~みたいにしたときに困ったことになったのであった。 ちなみに、--colorを指定するとTTYでなくても強制的に色付き出力になる。
mrbges/mruby-tempfileからiij/mruby-tempfileに変更した
大きな挙動の変更はないのだが、mrbgems/mruby-tempfileを使ってWSL上でWindows向けのバイナリをビルドするとなぜかWindows Defenderにマルウェアとして誤判定されてしまうということが起こってしまった。 色々原因を探ったのだが原因がわからず。仕方なくiij/mruby-tempfileに変更を行った。
ビルドシステムをRuby 3.3にアップデートした
これも挙動の変更ではないが、Ruby 3.3がリリースされたのでそれにあわせてビルドシステムもRuby 3.3にした。 最新は最高。