要約
Renovateがホストしているプロダクションのコンテナの中でcore.quotePath
が有効になっていた。このふるまいは#18963以降で修正され、34.27.3
以降では問題とならない…はずだ。
事象
ASCII範囲外の文字がバックスラッシュと8進数3桁の文字列に置き換わる。
事象例
- Japanese file names are renamed incorrectly every time in PR.
- File with umlaut ü (special character) in its name gets corruped
原因
もし原因が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帝国主義の呪いは根深いと言わざるを得ない。