読者です 読者をやめる 読者になる 読者になる

プラグインとログ出力と認証機構と

SourceForge.netにTracを入れようとやってた理由は、XML-RPCプラグインを入れてMylynと連携させたかったから。で、XML-RPCプラグインが入れられないとほとんど意味がないんで、その辺りにチャレンジしてみた。

  1. まず、TracXML-RPCプラグインを入れてみる。

Tracは1システムに複数のプロジェクトをインストールできる。*1それからTracのプラグインはシステム全体に入れるか、プロジェクトに入れるかを選択できる。システム全体と書いたが、Tracのディレクトリというわけではなく、Pythonの共有パスに追加される様子。共有パスは大抵インストールディレクトリのLib/site-packeges/以下のなので、システム全体にインストールできない。

昨日の日記で、SourceForge.netにCGIをインストールした場合、CGIからファイルを書き込む場所は/tmp/persistent以下にプロジェクトのディレクトリを掘って、その下を指定すると記載しましたが、これはどう考えても一時フォルダとして指定してねという意図が感じられるわけです。なので、Tracのログを出力させるだけとか、常用すべきではなさそうです。

それでもプラグインのキャッシュを出力するフォルダを/tmp/persistent/ProjectName以下に指定することでプラグインが解凍され使えるように。

続いて認証機構
SourceForge.netでは

GroupName/cgi-bin

にCGIを置くと固定されていますので、.htaccessを使って権限を調整するしかありません。とりあえずcgi-binの下にloginってディレクトリを掘って、そこに.htaccessを置いてみました。でもそもそもTracってScriptAliasを使ってあるURITracのパスとする設計だから、それだけじゃどうにもならんわけで、結局思いついたのが、loginの下にもう一個trac.cgiを置いた。

そしてリンクを貼るためにtracのweb/href.pyにloginというメソッドを追加するという無理やりなコード。

*** href.py.org 2007-04-20 06:41:51.000000000 -0700
--- href.py     2007-10-27 06:58:23.000000000 -0700
***************
*** 157,163 ****
          if not self._derived.has_key(name):
              self._derived[name] = lambda *args, **kw: self(name, *args, **kw)
          return self._derived[name]
!

  if __name__ == '__main__':
      import doctest, sys
--- 157,165 ----
          if not self._derived.has_key(name):
              self._derived[name] = lambda *args, **kw: self(name, *args, **kw)
          return self._derived[name]
!
!     def login(self):
!         return '/cgi-bin/login/trac.cgi'

  if __name__ == '__main__':
      import doctest, sys

こんな感じなんですが、「!」って衝突ってこと?
「+」じゃないとパッチとして当たらない気がするんですが、とりあえずこのままさらしておきます。

*1:ついでに言うと、1システムに複数バージョンのTracを入れられそう。それは後々