Tracを0.12へバージョンアップした

変更点が多いのでためらっていたけれど、どんなものか検証するためにTracを0.12へバージョンアップしてみた。現行の環境は下記の通り。

Trac

いつものようにMacPorts経由で更新。これは一発で完了した。

$ sudo port upgrade trac

リポジトリ更新

次にリポジトリを更新するが、ここで問題発生。

$ trac-admin-2.6 myproject upgrade
14:24:07 Trac[env] INFO: -------------------------------- environment startup [Trac 0.12] --------------------------------
14:24:07 Trac[env] INFO: Trac database schema version is 21, should be 26
Traceback (most recent call last):
  File "/opt/local/bin/trac-admin-2.6", line 9, in <module>
    load_entry_point('Trac==0.11.7', 'console_scripts', 'trac-admin')()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/trac/admin/console.py", line 1321, in run
    return admin.onecmd(command)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/trac/admin/console.py", line 138, in onecmd
    rv = cmd.Cmd.onecmd(self, line) or 0
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/cmd.py", line 219, in onecmd
    return func(arg)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/trac/admin/console.py", line 1159, in do_upgrade
    self.__env.upgrade(backup=do_backup)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/trac/env.py", line 464, in upgrade
    participant.upgrade_environment(db)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/TracTags-0.6-py2.6.egg/tractags/model.py", line 46, in upgrade_environment
    self._upgrade_db(db)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/TracTags-0.6-py2.6.egg/tractags/model.py", line 84, in _upgrade_db
    cursor.execute(stmt)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/trac/db/util.py", line 65, in execute
    return self.cursor.execute(sql)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/trac/db/sqlite_backend.py", line 80, in execute
    result = PyFormatCursor.execute(self, *args)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/trac/db/sqlite_backend.py", line 59, in execute
    args or [])
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/trac/db/sqlite_backend.py", line 51, in _rollback_on_error
    return function(self, *args, **kwargs)
pysqlite2.dbapi2.OperationalError: table tags already exists

既にtagsテーブルが存在するのに、再度テーブルを作ろうとしているらしい。プラグインスクリプトTracTags-0.6-py2.6.egg/tractags/model.pyを見てみると、selectを呼んでテーブルの存在を事前に確認しているだけど、実際の動作はそうなっていないようだ。ログを仕込んで確認したみたらテーブルの存在確認自体に失敗し、下記のような例外が発生していると分かった。

<class 'pysqlite2.dbapi2.ProgrammingError'>, Cannot operate on a closed cursor.

何故こんな例外が発生するのか分からないけれど、処理内容と既存のテーブルを見比べる限り、特にテーブルの更新は必要なさそうだ。そんなわけで「更新不要」である旨を返す処理を無理矢理model.pyに追加してしまう。

def environment_needs_upgrade(self, db):
   return False    # <-Added 

プラグインを再インストールして、再度リポジトリを更新すると、今度は無事に終了。wikiの方も問題なく更新出来た。

プラグイン

  • ChangeLogMacro
    • 0.12用の新しいバージョンが出ていたので入れ替えた。
  • TagsPlugin
    • 上記のように無理矢理に移行しているけど、動作としては問題ない。

導入済みだった他のプラグインについては、対応している旨が正式には出ていないけど、特に問題なく動作しているようだ。