🤔

Scoop、レジストリファイルの扱いのせいで地獄を見る

2021/12/28に公開1

これは何?

everythingパッケージなどに関連するレジストリファイルが、そのファイルの扱いでしくじったせいで scoop update などに支障が出るようになった。

具体的には .reg が勝手に編集された扱いにされて commit を要求されるようになることで scoop update(実質的に当該 bucket のローカルリポジトリに対する git pull である)の実行に失敗する。

$ scoop update
Updating Scoop...
Updating 'extras' bucket...
error: Your local changes to the following files would be overwritten by merge:
        scripts/everything/install-context.reg
        scripts/everything/uninstall-context.reg

こんな具合で。


レジストリファイルのエンコードは UCS-2 LE BOM(いわゆる UTF-16 の一種)であることを強く推奨される。また行の終端も /r/n であることが求められる。まあ、UTF-8 なんかでも動くらしいのだけど、regedit は UCS-2 LE BOM を吐くっぽいし、そうであるのがいいらしい。

今回 extras が死んだのはよくわからない。scoop のお偉方も「この問題は見たことがない」とボヤいていた。

rashil2000 commented 12 days ago
Hmm, never faced this problem before. @tukanos could this be related to encoding?

https://github.com/ScoopInstaller/Extras/issues/7546#issuecomment-995552804

しかし解決は何となく分かった。エンコードというよりは終端処理が問題だったように見える。次のコミットは(副次的に)このバグを修繕したように見えるものである。

https://github.com/ScoopInstaller/Extras/commit/fd46c5fa79cf697681355101bd9746e3670f4071

install-context.reg および uninstall-context.reg の終端が(多分)/r から /r/n になっているように見える。このコミットもこのレジストリファイルの扱いをどうにかするのではなく全然別のことをしようとして、結果的に扱いも正しいものにしてしまったと捉えるのが妥当だと思われる。


私の見立てとしてはこうである: 正しくないフォーマットである .reg が git に吸われるたびに何らかの理由で Windows か何かに勝手に修正される。git のコミット上では正しくないフォーマットが正史であり、しかし Windows が勝手に直してしまうので冒頭の通り git pull に失敗する。

でもこの見立て、なんか違う気がする。私の見立ての打率はわずか1割であり、合っている方が少ない。まあ間違っているということがわかるということは、少なくとも正しい答えが出てくるということなので悪いことでもないと思うんだけど。

いかんせん私もレジストリファイルの扱いがそれなりにデリケートなものであるとは思ってもいなかったので、実際どうなのかよくわからない。scoop 本体側でもレジストリファイルの扱いをテストで検証するようにしようぜという旨のプルリクエストもある。状況を注視する必要がある。


備考

万が一今回の件が原因でぶっ壊れたと思われる場合、次の手続きで治るかもしれない。

$ scoop bucket rm extra
$ scoop bucket add extra

私の環境では治らなかったので、次のようにした。

  1. どうにかして scoop/buckets にたどり着く
  2. /extras を物理的に消す
  3. git clone https://github.com/ScoopInstaller/Extras.git extras
  4. ???
  5. Profit!

荒っぽいが、治った。


参考

Discussion

うぽぽんうぽぽん

ありがとうございます。同じ現象でなんだこれ?と思っていたのですが、おかげさまで解決しました(´▽`)