basyura's blog

あしたになったらほんきだす。

Redmine - サブプロジェクトから親プロジェクトのリポジトリに識別子無しでリンクを貼る

うちのプロジェクトの構成はこんな感じ。

親プロジェクト
  │  ├ メインリポジトリ (svn)
  │  └ サブリポジトリ (git)
  ├ サブプロジェクト1
  ├ サブプロジェクト2
  └ サブプロジェクト3

ようやく git での開発が始まったので、メインリポジトリ(だった) の svn に加えて git のリポジトリを追加。親プロジェクトにだけリポジトリを登録してサブプロジェクトからもコミットのリンクを貼りたい。記法があるので紐付けられるんだけど、かなり冗長になる。

プロジェクトにリポジトリがある場合

commit:abcdefg

プロジェクトにリポジトリ (git) があるけど、メインリポジトリじゃない場合

commit:git|abdefg

別プロジェクト (parent) にリポジトリ (git) がある場合

parent:commit:git|abcdefg

特に 3 つ目。書けるんだけど、記述が冗長すぎて辛い。

  • 親プロジェクトにリポジトリがあるけどサブプロジェクトにはない
  • commit だけを指定してサブプロジェクトからリンクを貼りたい

どうするか。とりあえずパーサーをいじる。親プロジェクトの ID が 1 でリポジトリが git の場合。

diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 6893174..55b2352 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -834,13 +834,8 @@ module ApplicationHelper
               end
             when 'commit', 'source', 'export'
               if project
-                repository = nil
-                if name =~ %r{^(([a-z0-9\-_]+)\|)(.+)$}
-                  repo_prefix, repo_identifier, name = $1, $2, $3
-                  repository = project.repositories.detect {|repo| repo.identifier == repo_identifier}
-                else
-                  repository = project.repository
-                end
+                project = Project.find(1)
+                repository = project.repositories.detect {|repo| repo.identifier == 'git'}
                 if prefix == 'commit'

これでサブプロジェクトでも

commit:abcdefg

と書けばリンクが貼られるようになる。逆に、プロジェクト名やリポジトリ名を指定すると逆にリンクが貼られなくなる。うちのプロジェクトでは問題なくなるけど、redmine のアップデートの度に修正を当て直すのはめんどくさい。サブプロジェクトの設定に親プロジェクトのリポジトリを引き継ぐ設定があると良いなぁ。