redmine と mercurial の連携 新その4

ってことで、redmineMercurial のタグ・ブランチ対応のソース、今のままでは、とてもではないが、ブランチの扱いと、パフォーマンス的に使えないってことで、書き換えのための下調べをまとめる。

git の実装も安定していないが、まぁ、こっちが参考になるってことで。

まず、
http://www.redmine.org/projects/redmine/repository/entry/tags/0.9.2/app/controllers/repositories_controller.rb#L69
の show が呼ばれる。

んで、@repository.entries を呼んでいる。
んで、git の場合、呼ばれるのが、
http://www.redmine.org/projects/redmine/repository/entry/tags/0.9.2/lib/redmine/scm/adapters/git_adapter.rb#L58

んで、git の ls-tree コマンドをたたいているが、これが結構、あっさり返ってくる。あと、ディレクトリは、ディレクトリとして、きちんと返ってきて、再帰的に読みに行かない。

で、Mercurial だが、git の ls-tree に対応するのが、locate コマンドだが、これは、ツリーを展開する。まぁ、これは仕方が無いんだが、次が重い。ディレクトリに対して、指定したリビジョンから最も新しいものを探しに行く。
これが強烈に重い。個々のファイルに対して、hg log -l 1 FILE はあっさり返すが、hg log -l1 DIR は、Mercurial が個々のファイルを管理しているという概念上、ディレクトリ上の全てのファイルを調べて返しているんだろう。
これをディレクトリ毎に繰り返しているから、リポジトリタブを開くのに、10秒やら30秒もかかる。

でだ、1回リポジトリタブが開けば、個々のフォルダの展開は、Ajax になっているんで、パフォーマンス的には、まぁ仕方が無い気もするが、リポジトリタブのトップ画面を開くのに、10秒やら30秒もかかるのは、いくらなんでも遅すぎ。

で、ディレクトリの最新リビジョンを見れることは便利っちゃ便利だが、redmine 0.9.x で見れていないんだから、見れなくても良いんじゃない?って結論に行き着いている。(まぁ0.9.x は、そもそも、hg のリポを見に行かずに、DB の changes だけしか見ていないからってのもあるが)
githubディレクトリツリーのディレクトリの表示は、Ajax で見に行っているみたいだから、Redmine もそうなってからじゃない?