https://github.com/rails/bootsnap
bs_rb_scan_dir()にreaddir()のエラーハンドリングを追加。ストリーム終端とエラーを区別するため、whileループを無限ループ形式に変更し、readdir()呼び出し直前にerrnoをリセットする実装に。
PathScannerの`native_call`で相対パスと絶対パスの`BUNDLE_PATH`を比較していたバグを修正。`ruby_call`と`native_call`の共通処理を`prepare_scan`ヘルパーに抽出し、両実装の動作差異を最小化しました。
PathScanner.native_callが絶対パス形式での除外ディレクトリ指定に対応。partitionによる事前分類と条件分岐の階層化により、不要な絶対パス構築を避けつつ、シンボリックリンクループなどの問題を確実に回避できるようになりました。
bootsnap 1.23.0で最小サポートバージョンがRuby 2.7に引き上げられました。`File.absolute_path?`メソッドの利用を目的とし、gemspec、CI、Rubocopの設定を更新。Ruby 2.6サポートのための回避コードを削除し、コードベースの保守性を向上させています。
bootsnap利用者がRakeの標準cleanタスクでキャッシュを削除できるよう、lib/bootsnap/rake.rbを追加。Rakefileにrequire "bootsnap/rake"を追加することで、rake cleanでtmp/cache/bootsnap配下が削除可能に。opt-in設計で既存環境への影響なし。
bootsnapのC拡張において、opendir失敗時にerrno=0によるクラッシュが発生していた問題を根本から修正。rb_ary_new呼び出しがGCをトリガーし、ファイナライザーがerrnoをリセットしていたことが原因。配列初期化をopendir後に移動することで、errnoの上書きを防ぎ、応急処置コードとフォールバック処理を削除した。
bootsnap の Native 実装で libc の opendir バグによるクラッシュが発生していた問題に対し、errno が 0 の異常ケースへのガード処理と Pure Ruby 実装へのフォールバック機構を実装。BOOTSNAP_DEBUG 環境変数により詳細なデバッグも可能に。
requireされたファイル内でBootsnap.unload_cache!が呼ばれた場合にキャッシュインデックスがnilになり、NoMethodErrorが発生する問題を修正。安全なナビゲーション演算子を使用してキャッシュ操作を安全にスキップできるようにしました。