LoginSignup
1
0

More than 1 year has passed since last update.

かつてのRenovateがファイル名を勝手に変えていた振る舞いの原因を深堀り

Posted at

要約

Renovateがホストしているプロダクションのコンテナの中でcore.quotePathが有効になっていた。このふるまいは#18963以降で修正され、34.27.3以降では問題とならない…はずだ。

事象

ASCII範囲外の文字がバックスラッシュと8進数3桁の文字列に置き換わる。

事象例

原因

もし原因がRenovate自身やどこかのライブラリにあるとすれば、作為的にエスケープしなければそのような振る舞いは埋め込めないと仮定できる。ここで言う「作為的にエスケープ」というのはString.prototype.charCodeAtなどを必要とするものである1。そのため、gitの何らかの振る舞いによって引き起こされていると見るのが妥当だろう。

core.quotePath

core.quotePathは以下のように説明されている (git-scm.com):

Commands that output paths (e.g. ls-files, diff), will quote "unusual" characters in the pathname by enclosing the pathname in double-quotes and escaping those characters with backslashes in the same way C escapes control characters (e.g. \t for TAB, \n for LF, \\ for backslash) or bytes with values larger than 0x80 (e.g. octal \302\265 for "micro" in UTF-8).

参考訳:

パスを出力するコマンドが「普通ではない」文字を出力する際、全体をダブルクォーテーションで囲んだ上でCと同じようにエスケープする (例. \tがタブ文字、\nがラインフィード、\\がバックスラッシュ) 上、0x80よりも大きいバイトもエスケープする (例. UTF-8の「マイクロ」は8進数で \302\265 とエスケープされる)

ウムラウトつきの「ü」はUnicodeコードポイントでは252、日本語文字は全てが非ASCII範囲内なのでこの変数の影響を受ける。

寄り道: core.quotePathはいつからあるのか

さすがに現代に2 3このようなオプションを追加しないとは思うので、いつからあるのか調べてみた。

バージョン1.5.3-rc0から入ったようだ。つまり、現代のgit (>= 2.0.0) はすべてこの影響を受ける。

終わりに

私達日本語話者からすればほとんど意味不明3だが、当時の彼は必要だと思ったのだろう4。ASCII帝国主義の呪いは根深いと言わざるを得ない。

  1. Pull Request中の全てのファイルを反復し、その名前の非ASCII文字をUTF-8 (など―最も、現代においてWindows以外の大半のマシンはUTF-8を用いているだろうが―) でエスケープし、再度連結する必要がある。

  2. シェルスクリプトに埋め込むときに便利とかならまだわかるが、今は2023年なのでシェルスクリプトにもUTF-8対応のぶん別が求められるところだ

  3. Unicodeは1993年から存在しているし、UTF-8の前身のFSS-UTFは1992年に存在している 2

  4. そこまで考慮できなかったのだろう

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0