Tracを0.12へバージョンアップした
変更点が多いのでためらっていたけれど、どんなものか検証するためにTracを0.12へバージョンアップしてみた。現行の環境は下記の通り。
リポジトリ更新
次にリポジトリを更新するが、ここで問題発生。
$ 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
プラグイン
- ChangeLogMacro
- 0.12用の新しいバージョンが出ていたので入れ替えた。
- TagsPlugin
- 上記のように無理矢理に移行しているけど、動作としては問題ない。
導入済みだった他のプラグインについては、対応している旨が正式には出ていないけど、特に問題なく動作しているようだ。