Use `cp -c` when copying files by tesaguri · Pull Request #17373 · Homebrew/brew · GitHub
https://github.com/Homebrew/brew/pull/17373
マージされていた。macOSにおいてファイルのコピーをCoWで行うようにして高速化&ストレージに優しくするパッチ
Use `cp -c` when copying files by tesaguri · Pull Request #17373 · Homebrew/brew · GitHub
https://github.com/Homebrew/brew/pull/17373
マージされていた。macOSにおいてファイルのコピーをCoWで行うようにして高速化&ストレージに優しくするパッチ
どうせならRubyの`FileUtils`がmacOSでも`clonefile(2)`を使うようになってくれると嬉しいよね(Linuxでは既にCoWらしい)という話になって、メンテナがシュッと上流へのパッチを作り始めていて腕力を感じるなどした。それはそれとしてHomebrewはCaskのファイルをコピーで`sudo`が必要なときに`cp`コマンドを呼び出すから`FileUtils`がCoWに対応してもこのパッチの意義は残るのだけど
Homebrewでコピーってどこでしてるんだろ (基本的にシンボリックリンクな印象があった)
これは私もコードを調べて意外に思った点なのだけど、Homebrewは例えばbottleのアーカイブの展開先の一時ディレクトリからkegへpourするときなどに割と`mv`でなく`cp`相当の処理をしていることが多いようだった。理由は特に調べていないけど
cp --reflink=always は知ってるけど -c は初耳だぞ!? と思って Linux で man cp したけどやっぱりなかった。 Mac 版限定なのか
Sonomaより前のmacOSの`cp -c`がcoreutilsの`cp —reflink=auto`でなく`cp --reflink=always`相当の挙動(CoWに出来ない場合にエラーになる)だったので、私もはじめはそれ(とLinuxbrew対応)を理由にcoreutils formulaがインストールされている場合にcoreutilsの`cp --reflink=auto`を使う実装にしていたのだけど、メンテナからのフィードバ--ックでmacOS Sonoma以降でのみ`cp -c`を使う実装にしたという経緯がある
最新のメジャーバージョンであるSonomaにのみ対応するというのは思い切った判断だなと思ったけど、まあパフォーマンスの改善のための処理でしかないし、古いバージョンの対応のためのコードがいつか負債になることを考えればそれもそうかと思うなどした
Vimのdein.vimプラグインについても`dein#recache_runtimepath`に時間がかかるので手元では同様に`gcp --reflink=auto`を使うようにパッチを当てたものを使っているけど、こちらについてはHomebrewと違って`cp`の実装を真面目に判別しようとすると泥沼になりそうなのでupstreamは出来なそうだなと思っている
https://github.com/Homebrew/brew/commits/master/?after=1e0add6d66e52a9bf95cb3a115301403ace256d8+0
そういえば「レビューが終わったらコミット履歴を整理するよ」と伝えていたのだけど、結局approve即mergeされてしまい、とっ散らかったコミット履歴がそのままmasterに入ってしまったな……。まあメンテナがそれで良いなら良いのだけど