MailArchivePluginのWikiSyntaxMlとInterTracスキーム付ログ範囲指定の衝突

MailArchivePluginのWikiSyntaxMlをそのまま使用した場合、以下のようなMLタイトルはうまく機能しない。

[AAAAA100:012345]

問題は上記が他のTracを参照する書式InterTracスキーム付でログ範囲指定する書式と区別がついていない点にある。

[trac10:11] or [trac 10:11]

ソース覗いてみて初めてスペース無しでもInterTrac指定になる事を理解w
どのみち使っていないので区別をつける意図で、
InterTracスキームでは空白文字必須とするように改変してみた。

%TRACLIGHT_HOME%\python-lib\trac\trac\versioncontrol\web_ui\log.py

    # IWikiSyntaxProvider methods

    REV_RANGE = r"(?:%s|%s)" % (Ranges.RE_STR, ChangesetModule.CHANGESET_ID)
    #                          int rev ranges or any kind of rev
    
    def get_wiki_syntax(self):
        yield (
            # [...] form, starts with optional intertrac: [T... or [trac ...
            #r"!?\[(?P<it_log>%s\s*)" % WikiParser.INTERTRAC_SCHEME +
            r"!?\[(?P<it_log>%s\s+)*" % WikiParser.INTERTRAC_SCHEME +
            # <from>:<to> + optional path restriction
            r"(?P<log_revs>%s)(?P<log_path>[/?][^\]]*)?\]" % self.REV_RANGE,
            lambda x, y, z: self._format_link(x, 'log1', y[1:-1], y, z))
        yield (
            # r<from>:<to> form (no intertrac and no path restriction)
            r"(?:\b|!)r%s\b" % Ranges.RE_STR,
            lambda x, y, z: self._format_link(x, 'log2', '@' + y[1:], y))

無事動作確認成功〜

TracLightning(2.5.2)のMailArchivePlugin改造メモ

本家サイトに繋がらない事多いので動かしている環境の改変箇所を自分用にメモ:

  • MailArchivePlugin本体
    • 初期状態はツリー表示OFF、トップに最新メール表示が好みなのでデフォルト値変更
    • WikiSyntaxMlを改変
    • wiki表示モードが死んでるので修正
    • text表示モードでAAが崩れないように等幅フォントに変更
Index: E:/SampleProject/mailarchiveplugin/mailarchive/web_ui.py
===================================================================
--- E:/SampleProject/mailarchiveplugin/mailarchive/web_ui.py	(リビジョン 2)
+++ E:/SampleProject/mailarchiveplugin/mailarchive/web_ui.py	(リビジョン 3)
@@ -136,7 +136,7 @@
 
         #id = req.args.get('id','')
         action = req.args.get('action', 'list')
-        flatmode = (req.args.get('flatmode', 'off') == 'on')
+        flatmode = (req.args.get('flatmode', 'on') == 'on')
         
         if action == 'import':
             # before import lock db , in order to avoid import twice
@@ -200,7 +200,7 @@
         pagelized = self._pagelize_list(req, results, data)
 
         #Thanks http://d.hatena.ne.jp/ohgui/20090806/1249579406
-        data['reversemode'] = reversemode = (req.args.get('reversemode', 'off') == 'on')
+        data['reversemode'] = reversemode = (req.args.get('reversemode', 'on') == 'on')
         data['flatmode'] = flatmode
 
         mails_per_page, cached_mails = self._get_mails_per_page(pagelized, reversemode, flatmode)
Index: E:/SampleProject/mailarchiveplugin/mailarchive/wikisyntax.py
===================================================================
--- E:/SampleProject/mailarchiveplugin/mailarchive/wikisyntax.py	(リビジョン 2)
+++ E:/SampleProject/mailarchiveplugin/mailarchive/wikisyntax.py	(リビジョン 3)
@@ -36,9 +36,11 @@
         return [('ml', self._format_link)]
 
     def get_wiki_syntax(self):
-        yield (r"!?\[(.+?)[ :]([0-9]+)\]", # [xxx 123] or [aaa:123]
-               lambda x, y, z: self._format_link(x, 'ml', y[1:1], y))
-
+#       yield (r"!?\[(.+?)[ :]([0-9]+)\]", # [xxx 123] or [aaa:123]
+#              lambda x, y, z: self._format_link(x, 'ml', y[1:1], y))
+        yield (r"!?\[ML:\[(.+?)[ :]([0-9]+)\]\]", # [xxx 123] or [aaa:123]
+               lambda x, y, z: self._format_link(x, 'ml', y[1:1], y[4:-1]))
+	       
     def _format_link(self, formatter, ns, target, label):
         cursor = formatter.db.cursor()
         cursor.execute("SELECT subject,id FROM mailarc WHERE subject like '%s%%'" % label)
Index: E:/SampleProject/mailarchiveplugin/mailarchive/htdocs/css/mailarchive.css
===================================================================
--- E:/SampleProject/mailarchiveplugin/mailarchive/htdocs/css/mailarchive.css	(リビジョン 2)
+++ E:/SampleProject/mailarchiveplugin/mailarchive/htdocs/css/mailarchive.css	(リビジョン 3)
@@ -1,3 +1,6 @@
+
+.mailarchive { font: normal 13px "MS Gothic"; background: #dfd; }
+
 fieldset.collapsed {
 	border-width: 0px;
 	margin-bottom: 0px;
Index: E:/SampleProject/mailarchiveplugin/mailarchive/model.py
===================================================================
--- E:/SampleProject/mailarchiveplugin/mailarchive/model.py	(リビジョン 2)
+++ E:/SampleProject/mailarchiveplugin/mailarchive/model.py	(リビジョン 3)
@@ -18,6 +18,7 @@
 from trac.util.compat import set, sorted
 from trac.util.datefmt import utc, to_timestamp
 from trac.wiki.formatter import Formatter, WikiProcessor
+from trac.wiki import wiki_to_oneliner
 
 from api import IEmailHandler
 from attachment import MailArchiveAttachment
  • Trac本体(メール添付ファイルがチケットへの添付と誤認識される件への対策)
Index: python-lib/trac/trac/ticket/model.py
===================================================================
--- python-lib/trac/trac/ticket/model.py	(リビジョン 4)
+++ python-lib/trac/trac/ticket/model.py	(作業コピー)
@@ -316,10 +316,10 @@
                            "FROM ticket_change WHERE ticket=%s AND time=%s "
                            "UNION "
                            "SELECT time,author,'attachment',null,filename,0 "
-                           "FROM attachment WHERE id=%s AND time=%s "
+                           "FROM attachment WHERE id=%s AND time=%s AND type='ticket'"
                            "UNION "
                            "SELECT time,author,'comment',null,description,0 "
-                           "FROM attachment WHERE id=%s AND time=%s "
+                           "FROM attachment WHERE id=%s AND time=%s AND type='ticket'"
                            "ORDER BY time",
                            (self.id, when_ts, str(self.id), when_ts, 
                            str(self.id), when_ts))
@@ -328,10 +328,10 @@
                            "FROM ticket_change WHERE ticket=%s "
                            "UNION "
                            "SELECT time,author,'attachment',null,filename,0 "
-                           "FROM attachment WHERE id=%s "
+                           "FROM attachment WHERE id=%s AND type='ticket'"
                            "UNION "
                            "SELECT time,author,'comment',null,description,0 "
-                           "FROM attachment WHERE id=%s "
+                           "FROM attachment WHERE id=%s AND type='ticket'"
                            "ORDER BY time", (self.id,  str(self.id), 
                            str(self.id)))
         log = []
  • その他の仕込み
    • nkfのインストール
      • make出来る環境無いならcompile済のWindows用バイナリ拾ってくるのが手っ取り早い
      • %TRAC_LIGHT_HOME%\bin 以下とかに置いておく
    • メールアカウントの準備
      • ArchiveしたいMLに登録する
    • trac.iniの編集
      • メールアドレス情報を反映
      • nkfの指定
[mailarchive]
codecaliases = iso-2022-jp:cmd:nkf -J -w -x --cp932,Shift_JIS:cp932
items_page = 200
pop3_delete = imported
pop3_password = ******
pop3_server = ******
pop3_user = ******
replaceat = @
wikiview = enabled
    • TracMailArchive-admin.exeの定期巡回
call setenv.bat
TracMailArchive-admin.exe %TRAC_LIGHT_HOME%\projects\trac\%PROJECT_NAME% pop3 %ML_NAME%
      • schtasksで一時間おきに自動実行
schtasks /create /tn "MailArchiveScript" /tr %TRAC_LIGHT_HOME%\python\Scripts\GetPop3.bat /sc minute /mo 60

TracBrowserがSVNの巨大なChangesetを処理しきれない場合へのフェイルセーフ

巨大なテキスト扱いのファイルがSVNレポジトリにコミットされている場合(一般的なソフト開発では普通遭遇しないようなケース?でも業界によっては軽く単発で100Mbyte以上のテキストファイルを運用せざるを得ない事もあったりなかったり)、Changesetを要求されればTracBrowserはある意味真面目にブラウザ上に要求通りに表示しようとして固まってしまう(あるいはメモリエラーでoops)。
max_diff_bytes,max_diff_filesの設定値で表示抑制できるとなっているが、おそらくその前処理部分で死亡してしまう(unicode変換辺りが重いヨカン)。

その一方で属性binary扱いのファイルであれば最初から差分抽出処理が走らずTracBrowserも固まらない。しかし全てのcommitterに巨大なテキストは皆の迷惑だからbinary属性つけろというのも運用としてなかなか難しい。とはいえ地雷の如く踏むとブラウザ固まるchangeset revisionがある状態も放置出来ないので対策としてTrac本体の改造を検討してみた。方針は、「ある一定サイズを超えるファイルはchangeset表示処理上問答無用でbinaryと同様の扱いにする」

%TRAC_LIGHT_HOME%\python-lib\trac\trac\versioncontrol\web_ui\changeset.py

例によってファイル名から当たりをつけた上記ファイルを潜入調査。幸いというかファイルがbinaryかどうかチェックして差分抽出処理をスキップする記述はすぐ特定できファイルサイズを取得する処理も内包されていたのでif分岐を数カ所追加で意外とあっさり改造自体は完了。その後いつものように

cd %TRAC_LIGHT_HOME%\python-lib\trac
python setup.py install
実行してTrac再構築→再起動で無事動作確認成功。地雷除去バンザーイ

TracBrowserでのグループ認証が機能しない(TracLightning2.5.2):多分解決(?)

暫定対策として、既存のグループをアカウントに展開してべた書きすれば一応以前と同じように使えるけれどとってもバッドノウハウなのでちょろっと潜入調査開始。ファイル名から多分この辺なんだろうとあたりをつけてみる。

%TRAC_LIGHT_HOME%\python-lib\trac\trac\versioncontrol\svn_authz.py

んんん、、、何か微妙な既視感があるなぁとgoogle先生にお伺いをたててみるとちょろちょろと気になる案件が引っかかってきた。

http://de.sourceforge.jp/ticket/browse.php?tid=21299&group_id=2810
http://trac.edgewall.org/ticket/9215
http://trac.edgewall.org/changeset/9646

どうやら日本語(というかマルチビット言語全般)を使ったディレクトリ名のTracBrowserの認証問題について、ローカルなパッチを適用したVersionとTrac本体に取り込み済みのVersionがあって、今のTracLightning2.5.2には過去のローカルパッチ版がそのまま残ってるっぽい。他のファイルは0.11.7ja前提のようなのでこの辺の不整合がトリガーになってる感じかなーと、とりあえず入れ替えてみるテスト。

http://trac.edgewall.org/export/9646/branches/0.11-stable/trac/versioncontrol/svn_authz.py
をダウンロードしてきて最初のファイルと入れ替え、Tracをinstallし直し。
cd %TRAC_LIGHT_HOME%\python-lib\trac
python setup.py install

んで我が家の環境では無事問題解決万歳(`・ω・´)
日本語ディレクトリの認証もちゃんと所望の動きをしてるっぽいのでこれでよしとする

TracBrowserでのグループ認証が機能しない(TracLightning2.5.2)

TracLightning2.3.2から2.5.2にアップグレードした際にこの問題が発生。症状は、

  • Subversion Access 設定でGroupを作成してグループ単位でRead/Write権限付与してもTracBrowserに反映されない
    • 無視されている感じ
    • apache再起動しても変わらず
  • Subversion自体は設定通りの動作をする(TortoiseSVN etcから確認)
  • アカウント単位での設定は正しく反映される
  • アップグレードではなく一度0から2.5.2をインストールし直しても状況変わらず
  • 2.3.2では問題なく動作

んー、何だろう3台の鯖(XP-SP3 x2 + WindowsServer2008(x64) x1)で試してみたけどどれも同じ症状。私個人の環境依存の問題かなぁとも思ったけどなんかちょっと違うかも。でも他に困ってそうな人見あたらないんだよなぁ。。。('ω`)

QueryChartPluginとtrac-post-commit-hookを連携させてみる

関わってるプロジェクトで愛用させていただいているQueryChartPluginだが、
チケットの作業開始日と作業終了日の自動設定がチケットのステータスを直接変更する際にしか行われないのが微妙にストレスだったのでちょっと弄ってみた。
SVNコミットログでclose実行しておいて、
#後から終了日をチケット編集で追記とかションボリだったので

以下、既にQueryChartPluginの設定済みという前提で。

%TRACLIGHT_HOME%\python-lib\trac\contrib

Index: trac-post-commit-hook
===================================================================
--- trac-post-commit-hook	(リビジョン 2)
+++ trac-post-commit-hook	(作業コピー)
@@ -75,7 +75,7 @@
 import re
 import os
 import sys
-from datetime import datetime 
+from datetime import datetime,date
 from optparse import OptionParser
 
 parser = OptionParser()
@@ -195,9 +195,18 @@
     def _cmdClose(self, ticket):
         ticket['status'] = 'closed'
         ticket['resolution'] = 'fixed'
+        ticket['complete'] = '100'
+        today = date.today()
+        ticket['last_closed'] = today.strftime("%Y/%m/%d")
+        if ticket['last_assigned'] == "":
+            ticket['last_assigned'] = today.strftime("%Y/%m/%d")
 
     def _cmdRefs(self, ticket):
-        pass
+        if ticket['status'] == "new":
+            ticket['status'] = 'accepted'
+        if ticket['last_assigned'] == "":
+            today = date.today()
+            ticket['last_assigned'] = today.strftime("%Y/%m/%d")
 
 
 if __name__ == "__main__":

本日の日付を取得するのにdateを使っているけどもっといいやり方はありそう。
進捗率もついでに100%に。
おまけでrefsコマンドの場合の挙動もちょっと改変。だけどこっちはcloseと比べると色々なケースがありそうなのでちょっと悩ましい。もうちょい弄るか?
んーでもあんまりやり過ぎるとdb処理が重くなるかもしれないので程々にしておくべきかしら('ω`)

TracLightning(2.4.2)のMailArchivePluginについてのA.I.

TraM導入という事で二の足を踏んでいた2.4.X系について、テスト用鯖に突っ込んでみてTracM周りの設定は大体の感触は掴めたので、さて、本番プロジェクト(のバックアップデータ)を流し込んでみるかーとやってみたところ、初めてMailArchivePluginの挙動が違う事に気がついた。ぐぬぬ、これはどういう。。。とソースに潜入。そこには衝撃の事実が。

 C:\TracLight\plugins\svn\mailarchiveplugin\mailarchive

2010/02/10  01:23    <DIR>          .
2010/02/10  01:23    <DIR>          ..
2009/10/02  09:30               734 api.py
2009/10/02  09:30             1,558 attachment.py
2009/10/02  09:30             1,946 env.py
2009/11/22  02:33    <DIR>          htdocs
2009/09/27  08:58            23,442 mailarchive.py
2009/10/02  09:30            12,279 mailarchiveadmin.py
2009/10/02  09:30            29,619 model.py
2010/02/10  01:23    <DIR>          stripogram
2010/02/10  01:23    <DIR>          templates
2009/11/22  02:33    <DIR>          test
2010/02/10  01:23    <DIR>          tests
2009/10/02  09:30             5,762 util.py
2009/10/02  09:30            14,988 web_ui.py
2009/10/02  09:30             2,613 wikisyntax.py
2009/10/02  09:30               118 __init__.py

ファイル構成変わってるぅぅ('A`)
というか、2.3.2の時のインストール先に上書きしたせいでか、何か混ざってる?これは大変に宜しくないwというか何か変な事が起きていてもおかしくない。projectsデータのみ逃がして他のデータは破棄&新規インストールが無難か。
自分用にカスタマイズしていたmailarchivepluginの中身も、より新しい方にあわせる形で差分マージしないと駄目かなーと少々鬱になりつつソースを眺め始めた私を襲う第二の衝撃。

        #customize!
        #http://d.hatena.ne.jp/ohgui/20090604/1244114483

なんという羞恥プレイ。いあ、有り難いんですよ?手間省けるし。拙いアイデアでも誰かの役に立ってるかもナノで。ああ、でもこれは(懊悩)

あと現時点で気になっているところ(対処が必要かどうかもこれから確認予定)

  1. WikiSyntaxMl
  2. 添付ファイルの扱いとチケットへの誤爆
  3. HTMLメールの処理

Hirohiroさんのbranchesが採用されたっぽいのかな?
全部解決済みで何もしなくてもいいよーとかだったりするといいなぁ…w