2012年11月03日

GitLabで日本語ファイル名周り(3.0.3)

前回のエントリでGitLabの2.4.0で日本語ファイル名のソースを表示するためのヒントを書きましたが、GitLab 3.0.3にバージョンアップしてみたところ今度は日本語ファイルのURLが化けたり、一部のフォルダが開けなくなる現象に遭遇しました。

まず、日本語ファイル名のURLが化けるのはソースを開こうとしたタイミングでしかもJavaScriptを有効にした場合だけです。

そのあたりから探っていったところ、どうもシームレスな画面遷移時にJavaScriptでブラウザの「戻る」の制御を行う「vendor/assets/javascripts/jquery.history.js」が原因だということが判明。

このソース、ライセンス表記などが無く、ネット上にも情報がないのでどこにバグ報告をすべきなのか不明なのですが、URLエンコードの復元にunescape関数を用いているため、1Byte文字圏でしかまともに動作しません。

しかも、デフォルトでミニファイ化されていコードが読みにくくなっているのですが、幸いにもunescapeを使っているところが1箇所しか無いためそれを「encodeURI」関数に置き換えることでキチンと動作するようになります。

で、この修正だけでほとんどのファイルやフォルダが問題が無くなったのですが、それでも一部のフォルダではencode errorと表示されるため、更に調べたところ「app/views/tree/_tree_item.html.haml」の内部で呼び出しているtree_join関数にてクラッシュしていることが判明。

で、こういう場合のお約束として下記の修正を実行したところ、あっさり表示出来るようになりました。

1
2
3
4
5
6
7
8
9
10
11
--- a/app/views/tree/_tree_item.html.haml
+++ b/app/views/tree/_tree_item.html.haml
@@ -1,7 +1,7 @@
 %tr{ class: "tree-item #{tree_hex_class(tree_item)}" }
   %td.tree-item-file-name
     = tree_icon(type)
-    %strong= link_to truncate(tree_item.name, length: 40), project_tree_path(@project, tree_join(@id || @commit.id, tree_item.name))
+    %strong= link_to truncate(tree_item.name, length: 40), project_tree_path(@project, tree_join(@id || @commit.id, tree_item.name.force_encoding('UTF-8')))
   %td.tree_time_ago.cgray
     %span.log_loading.hide
       Loading commit data...

困っている方はお試しあれ。

それにしてもruby 1.9は.force_encoding('UTF-8')をやらないとまともに文字列を扱えないことが多くて面倒な感じがします。

型とかガチガチに処理するような言語じゃないのだから、エンコードについてももっと上手く暗黙的に処理して欲しいものです。

Posted by Takuchan at 2012年11月03日 22:44 | トラックバック(0)