2度目だから、あのややこしいTracのセットアップも楽チンさ!と思っていたら、そうは卸してくれないケチなシステム問屋がこんなエラーを。
Creating and Initializing Project
Initenv for '/data/trac/hoge' failed.
Failed to create environment.
('ascii', "'\xe3\x83\x9e\xe3\x82\xa4\xe3\x83\xab\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xbc\xe3\x83\xb3 '||milestone", 1, 2, 'ordinal not in range(128)')
Traceback (most recent call last):
File "/usr/local/python2.6.1/lib/python2.6/site-packages/Trac-0.11.2.1.ja1-py2.6.egg/trac/admin/console.py", line 568, in do_initenv
options=options)
File "/usr/local/python2.6.1/lib/python2.6/site-packages/Trac-0.11.2.1.ja1-py2.6.egg/trac/env.py", line 202, in __init__
setup_participant.environment_created()
File "/usr/local/python2.6.1/lib/python2.6/site-packages/Trac-0.11.2.1.ja1-py2.6.egg/trac/env.py", line 485, in environment_created
for table, cols, vals in db_default.get_data(db):
File "/usr/local/python2.6.1/lib/python2.6/site-packages/Trac-0.11.2.1.ja1-py2.6.egg/trac/db_default.py", line 395, in get_data
__mkreports(get_reports(db))))
File "/usr/local/python2.6.1/lib/python2.6/site-packages/Trac-0.11.2.1.ja1-py2.6.egg/trac/db_default.py", line 229, in get_reports
u""" % (db.concat("'マイルストーン '", 'milestone'), db.cast('p.value', 'int'))),
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 1: ordinal not in range(128)
なんかはっきりわかってないんだけど、pythonで良くアルunicodeの
取り扱いの問題らしい。
で、SQLでunicode扱う場所にunicodeを扱いますよマークであるところの
"u"をつける必要があるらしい。
上2行は自分でも何を書いてるのかよくわかってないが、
とにかく下記のdiffを参考にdb_default.pyを直すと通った。
ちなみにpatchでうまくいかなかったから、手でこつこつ直したよ
--- db_default.py.org 2008-06-06 15:58:03.000000000 +0900
+++ db_default.py 2008-11-02 16:26:41.000000000 +0900
@@ -170,7 +170,7 @@
* 全コンポーネント、全バージョンの未解決チケットを優先度順に表示します。
* 優先度別の色付けを行っています。
""",
-"""
+u"""
SELECT p.value AS __color__,
id AS ticket, summary AS 概要, component AS コンポーネント,
version AS バージョン, milestone AS マイルストーン, t.type AS 分類,
@@ -180,7 +180,7 @@
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
WHERE status <> 'closed'
- ORDER BY """ + db.cast('p.value', 'int') + """, milestone, t.type, time
+ ORDER BY """ + db.cast('p.value', 'int') + u""", milestone, t.type, time
"""),
#----------------------------------------------------------------------------
(u'未解決チケット (バージョン別)',
@@ -191,7 +191,7 @@
最終更新日時、チケットの説明、報告者が隠しフィールドとして含まれています。
これらのフィールドは Web ブラウザでは表示されませんが、 RSS には出力されます。
""",
-"""
+u"""
SELECT p.value AS __color__,
version AS __group__,
id AS ticket, summary AS 概要, component AS コンポーネント,
@@ -203,7 +203,7 @@
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
WHERE status <> 'closed'
ORDER BY (version IS NULL),version, """ + db.cast('p.value', 'int') +
- """, t.type, time
+ u""", t.type, time
"""),
#----------------------------------------------------------------------------
(u'未解決チケット (マイルストーン別)',
@@ -214,7 +214,7 @@
最終更新日時、チケットの説明、報告者が隠しフィールドとして含まれています。
これらのフィールドは Web ブラウザでは表示されませんが、 RSS には出力されます。
""",
-"""
+u"""
SELECT p.value AS __color__,
%s AS __group__,
id AS ticket, summary AS 概要, component AS コンポーネント,
@@ -226,13 +226,13 @@
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
WHERE status <> 'closed'
ORDER BY (milestone IS NULL),milestone, %s, t.type, time
-""" % (db.concat("'マイルストーン '", 'milestone'), db.cast('p.value', 'int'))),
+""" % (db.concat(u"'マイルストーン '", 'milestone'), db.cast('p.value', 'int'))),
#----------------------------------------------------------------------------
(u'着手中の未解決チケット (担当者別)',
u"""
担当者別に優先度順に並べた、着手中の未解決チケットの一覧です。
""",
-"""
+u"""
SELECT p.value AS __color__,
owner AS __group__,
id AS ticket, summary AS 概要, component AS コンポーネント,
@@ -242,7 +242,7 @@
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
WHERE status = 'accepted'
- ORDER BY owner, """ + db.cast('p.value', 'int') + """, t.type, time
+ ORDER BY owner, """ + db.cast('p.value', 'int') + u""", t.type, time
"""),
#----------------------------------------------------------------------------
(u'着手中の未解決チケット (担当者別, 説明文付き)',
@@ -250,7 +250,7 @@
担当者別に優先度順に並べた、着手中の未解決チケットの一覧です。
このレポートでは、全列結合表示を使用しています。
""",
-"""
+u"""
SELECT p.value AS __color__,
owner AS __group__,
id AS ticket, summary AS 概要, component AS コンポーネント,
@@ -260,14 +260,14 @@
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
WHERE status = 'accepted'
- ORDER BY owner, """ + db.cast('p.value', 'int') + """, t.type, time
+ ORDER BY owner, """ + db.cast('p.value', 'int') + u""", t.type, time
"""),
#----------------------------------------------------------------------------
(u'全チケット (マイルストーン別, 解決済みも含む)',
u"""
高度なレポートを作成するための例です。
""",
-"""
+u"""
SELECT p.value AS __color__,
t.milestone AS __group__,
(CASE status
@@ -292,7 +292,7 @@
動的に置き換えられる変数 USER を
使用した例です。
""",
-"""
+u"""
SELECT p.value AS __color__,
(CASE status WHEN 'accepted' THEN '着手中' ELSE '担当中' END) AS __group__,
id AS ticket, summary AS 概要, component AS コンポーネント,
@@ -304,7 +304,7 @@
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
WHERE t.status <> 'closed' AND owner = $USER
ORDER BY (status = 'accepted') DESC, """ + db.cast('p.value', 'int') +
- """, milestone, t.type, time
+ u""", milestone, t.type, time
"""),
#----------------------------------------------------------------------------
(u'未解決チケット (自分のチケットを優先して表示)',
@@ -312,7 +312,7 @@
* 全ての未解決チケットを優先度順に表示します。
* ログインユーザが担当者になっているチケットを最初のグループで表示します。
""",
-"""
+u"""
SELECT p.value AS __color__,
(CASE owner
WHEN $USER THEN '自分のチケット'
@@ -328,7 +328,7 @@
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
WHERE status <> 'closed'
ORDER BY (owner = $USER) DESC, """ + db.cast('p.value', 'int') +
- """, milestone, t.type, time
+ u""", milestone, t.type, time
"""))
コメントする