mantisからtracへのデータ移行

検索エンジンから来られた方と未来の自分へmantisからtracへのデータ移行を行った記録を記す。移行に使うmantis2trac.pyを編集していますが、pythonは今回が初めてなので適切ではない変更を行っている可能性があります。また、ここの内容を実行する際には自己責任でお願いします。データの破壊等が発生しても当方では補償しかねます。

環境

OS
CentOS 4.4
uname -a

Linux locahost.localdomain 2.6.9-42.ELsmp

mysql
5.0.37をソースからコンパイル
sqlite
sqlite-3.3.3-1.2、python-sqlite-1.1.7-1.2をprmからインストール

mantis2trac.3.pyを入手

# wget http://trac.edgewall.org/attachment/wiki/TracImport/mantis2trac.3.py?format=raw
# mv mantis2trac.3.py?format=raw mantis2trac.3.py

mantis2trac.3.pyでデフォルトエンコードの指定

266行目付近の

sys.setdefaultencoding('latin1')

sys.setdefaultencoding('utf8')

に変更。mantisが使うMySQLのDB、OS、tracが使うsqliteのDBの全てをUTF-8に統一していても移行後のtracで文字化けが発生する。tracにINSERTする各所で文字列に対しては「value.encode(’utf-8′)」
をしているのが原因。当初は文字化けに対してtracへ実行しているSQL文をデバックライトで画面に表示させそれをスクリプトファイルに編集していたが、作業が破綻してしまったし、繰り返しの作業が面倒になってきた。

LAST_INSERT_IDの取得を無効

392行目近辺の

        c.execute('''SELECT LAST_INSERT_ID()''')
        eturn c.fetchall()[0][0]
        eturn self.db().db.sqlite_last_insert_rowid()

をコメントアウト。LAST_INSERT_IDが無いと言われるが。
changelogに

Changes since version 1.1:
  - Made it work against Trac running on MySQL (specifically, changes to the
    LAST_INSERT_ID() call on line 382 (in the addTicket function))

という記述があり大事そうだけどないものは無い。

カスタム項目の移行

カスタム項目に相当する列はticketテーブルにないので実行時に

 * ERROR: unable to add ticket(#114) change "発生要因": "" -> "詳細設計不備" (2007-05-31 19:58:04)
          The bug id, field name, and time must be unique

とエラーになる。ticket_customテーブルに値を設定すればよい。
trac.iniで

[ticket-custom]
factor = select
factor.label = 発生要因
factor.options = 仕様変更|仕様不明確|仕様誤認|機能設計不備|詳細設計不備|コーディング不備|データ誤り|既存機能理解不足

と設定していれば、上のエラーメッセージからSQL文をエディタで編集して

INSERT INTO ticket_custom values (114,'factor','詳細設計不備');

とする。これをsqliteのコマンドラインインターフェイスから実行

添付ファイル

mantis2trac.3.pyが移行してくれる。

mantisのデータ整理

mantisに登録した件名がDBの列長を超えていると、有無を言わさず超えている部分をカットされてしまう。マルチバイトの途中でもお構いなし(ちょほほ)。mantisで見ると件名の末尾が文字化けしているデータは移行したtracでUTF-8への変換に失敗すると仰られ表示できなかった。mantisでフィルタを外して1件ずつ手直し。

mantis2trac.3.pyを実行

MySQLでのmantisのDBユーザ
bugtracker
MySQLでのmantisのDBユーザのパスワード
btspass
tracのプロジェクトの位置
/usr/local/trac/prj1/

とした場合に

./mantis2trac.3.py –db bugtracker -u btsuser -p btspass –tracenv /usr/local/trac/prj1/

と実行する

Leave a comment

Your comment