CentOS5 の trac0.11 に Account Manager Plugin を入れる

CentOS5 の trac0.11 に Account Manager Plugin を入れる際に出た問題対処のメモ。

先にやったことの流れを紹介。
→ easy_install でのプラグインインストールに失敗
→ CentOS5 の python-setuptools が Subversion1.5 のワーキングコピーに未対応
→ 最新版は対応しているので、rpm を作成してインストールしようとした
python-setuptools の rpm 作成に失敗
→ CentOS5 の python setup.py の bdist_rpm のバグ、らしい。
→ bdist_rpm にパッチをあてて、再度 python-setuptools の rpm を作成
→ できあがった rpm をインストール
→ easy_install でプラグインをインストール


これからプラグインを入れる人は
→ CentOS5 の python setup.py の bdist_rpm にパッチを当てる
python-setuptools の最新版 rpm を作成、インストール
→ easy_install
の手順が幸せだと思います。
その手順は http://d.hatena.ne.jp/naga_sawa/20080919/1221839008 に抜き出しているので、そっちが目当ての方はそちら参照で。

trac はこんな感じで rpmforge の trac-0.11.1-1.el5.rf を利用。
(参考 http://www.cafechantant.com/blog/2007/08/27/centos5-%E3%81%A7-subversiontrac/)

# yum --enable=rpmforge install trac
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
 * rpmforge: fr2.rpmfind.net
 * base: ftp2.riken.jp
....(省略)....
Dependency Installed: python-genshi.i386 0:0.5.1-2.el5.rf python-setuptools.noarch 0:0.6c5-2.el5
Complete!
#

基本的な設定を済ませ、その状態での動作を確認。
次に Account Manager Plugin を入れようと http://trac-hacks.org/wiki/AccountManagerPlugin の説明に沿ってインストールしようとしたところ、

# easy_install http://trac-hacks.org/svn/accountmanagerplugin/trunk
Downloading http://trac-hacks.org/svn/accountmanagerplugin/trunk
Doing subversion checkout from http://trac-hacks.org/svn/accountmanagerplugin/trunk to /tmp/easy_install-Pd27aL/trunk
Processing trunk
Running setup.py -q bdist_egg --dist-dir /tmp/easy_install-Pd27aL/trunk/egg-dist-tmp-l-X6vE
unrecognized .svn/entries format; skipping .
Traceback (most recent call last):
  File "/usr/bin/easy_install", line 7, in ?
    sys.exit(
  File "/usr/lib/python2.4/site-packages/setuptools/command/easy_install.py", line 1670, in main
    with_ei_usage(lambda:
  File "/usr/lib/python2.4/site-packages/setuptools/command/easy_install.py", line 1659, in with_ei_usage
    return f()
....(省略)....
  File "/usr/lib/python2.4/site-packages/setuptools/command/sdist.py", line 52, in _default_revctrl
    for path in finder(dirname,path):
  File "/usr/lib/python2.4/site-packages/setuptools/command/sdist.py", line 98, in entries_finder
    log.warn("unrecognized .svn/entries format in %s", dirname)
NameError: global name 'log' is not defined
#

とエラーを吐いてインストールされない。

エラーメッセージなどで調べたところ、どうも setuptools が Subversion 1.5 のワーキングコピーの形式に対応していない模様。
最新の setuptools では svn 1.5 に対応していて、最新版をリポジトリから取得してインストールすることで解決できそうな塩梅なので rpm を作成してアップデートすることにする。
(参考 http://d.hatena.ne.jp/jun66j5/20080701/setuptools, http://d.hatena.ne.jp/jun66j5/20080723/setuptools, http://d.hatena.ne.jp/jun66j5/20080724/setuptools)

最新版をチェックアウト。

$ mkdir setuptools
$ svn co http://svn.python.org/projects/sandbox/branches/setuptools-0.6
....(省略)....
リビジョン 66497 をチェックアウトしました。

python setup.py bdist_rpmrpm を作る。

$ cd setuptools
$ python setup.py bdist_rpm
running bdist_rpm
running egg_info
....(省略)....
building RPMs
rpmbuild -bs --define _topdir /home/*****/setuptools/build/bdist.linux-i686/rpm --clean build/bdist.linux-i686/rpm/SPECS/setuptools.spec
書き込み完了: /home/*****/setuptools/build/bdist.linux-i686/rpm/SRPMS/setuptools-0.6c9dev_r66389-1.src.rpm
実行中(--clean): /bin/sh -e /var/tmp/rpm-tmp.80773
+ umask 022
+ cd /home/*****/setuptools/build/bdist.linux-i686/rpm/BUILD
+ rm -rf setuptools-0.6c9dev-r66389
+ exit 0
moving build/bdist.linux-i686/rpm/SRPMS/setuptools-0.6c9dev_r66389-1.src.rpm -> dist
$

build/bdist.linux-i686/rpm/SPECS/ に spec ファイルが出来ているので、CentOSのパッケージ名と整合をとるため、以下のパッチを適用、

--- setuptools.spec.orig        2008-09-18 15:41:39.000000000 +0900
+++ setuptools.spec     2008-09-18 15:41:48.000000000 +0900
@@ -1,4 +1,4 @@
-%define name setuptools
+%define name python-setuptools
 %define version 0.6c9dev_r66389
 %define unmangled_version 0.6c9dev-r66389
 %define release 1

また、rpm でなく、tarball と srpm が dist 以下にできているので、こちらも CentOS のパッケージ名に合わせるために、tarball 内のディレクトリ名と tarball 自体のファイル名を変更する。

$ cd dist/
$ tar zxf setuptools-0.6c9dev-r66389.tar.gz
$ mv setuptools-0.6c9dev-r66389 python-setuptools-0.6c9dev-r66389
$ tar -cf python-setuptools-0.6c9dev-r66389.tar python-setuptools-0.6c9dev-r66389
$ gzip -9 python-setuptools-0.6c9dev-r66389.tar
$ cd ..


tarball を RPM 環境に流し込んで、先ほど修正した spec ファイルで rpmbuild すると…

$ cp dist/python-setuptools-0.6c9dev-r66389.tar.gz ~/RPM/SOURCES/
$ rpmbuild -ba build/bdist.linux-i686/rpm/SPECS/setuptools.spec

実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.43286
+ umask 022
+ cd /home/*****/RPM/BUILD
....(省略)....
+ umask 022
+ cd /home/*****/RPM/BUILD
+ cd python-setuptools-0.6c9dev-r66389
+ DOCDIR=/var/tmp/python-setuptools-0.6c9dev_r66389-1-buildroot/usr/share/doc/python-setuptools-0.6c9dev_r66389
+ export DOCDIR
+ rm -rf /var/tmp/python-setuptools-0.6c9dev_r66389-1-buildroot/usr/share/doc/python-setuptools-0.6c9dev_r66389
+ /bin/mkdir -p /var/tmp/python-setuptools-0.6c9dev_r66389-1-buildroot/usr/share/doc/python-setuptools-0.6c9dev_r66389
+ cp -pr setuptools.txt EasyInstall.txt pkg_resources.txt README.txt /var/tmp/python-setuptools-0.6c9dev_r66389-1-buildroot/usr/share/doc/python-setuptools-0.6c9dev_r66389
+ exit 0
警告: ファイルが2回表記されています: /usr/lib/python2.4/site-packages/setuptools-0.6c9dev_r66389-py2.4.egg-info/PKG-INFO
....(省略)....
Requires: /usr/bin/python python(abi) = 2.4 python-devel
伸張ファイルの検査中: /usr/lib/rpm/check-files /var/tmp/python-setuptools-0.6c9dev_r66389-1-buildroot
エラー: インストール済み(ただし未伸張)ファイルが見つかりました:
   /usr/lib/python2.4/site-packages/easy_install.pyo
   /usr/lib/python2.4/site-packages/pkg_resources.pyo
....(省略)....

RPM ビルドエラー:
    ファイルが2回表記されています: /usr/lib/python2.4/site-packages/setuptools-0.6c9dev_r66389-py2.4.egg-info/PKG-INFO
....(省略)....
    ファイルが2回表記されています: /usr/lib/python2.4/site-packages/setuptools-0.6c9dev_r66389-py2.4.egg-info/top_level.txt
    インストール済み(ただし未伸張)ファイルが見つかりました:
   /usr/lib/python2.4/site-packages/easy_install.pyo
   /usr/lib/python2.4/site-packages/pkg_resources.pyo
....(省略)....
   /usr/lib/python2.4/site-packages/setuptools/tests/test_resources.pyo
   /usr/lib/python2.4/site-packages/site.pyo
$

と、こんな感じで「インストール済み(ただし未伸張)ファイルが見つかりました:」
もしくは「Installed (but unpackaged) file(s) found:」
というエラーが発生して rpm が作成できない。

こちらも調べたところ、 bdist_rpm が正常に動作しないようだ。
(参考 http://wtnb.mydns.jp/wordpress/archives/4235)
なので、参考サイトに書かれているパッチを /usr/lib/python2.4 に適用してやる

--- python2.4/distutils/command/bdist_rpm.py.orig	2007-01-19 18:57:07.000000000 +0900
+++ python2.4/distutils/command/bdist_rpm.py	2007-01-19 18:57:43.000000000 +0900
@@ -488,6 +488,7 @@ class bdist_rpm (Command):
             ('build', 'build_script', def_build),
             ('install', 'install_script',
              ("%s install "
+              "--optimize 1 "
               "--root=$RPM_BUILD_ROOT "
               "--record=INSTALLED_FILES") % def_setup_call),
             ('clean', 'clean_script', "rm -rf $RPM_BUILD_ROOT"),

そして、ビルド途中のゴミが残っている /var/tmp を掃除してから setup.py をやりなおし。

$ python setup.py bdist_rpm
$ cd dist
$ tar zxf setuptools-0.6c9dev-r66389.tar.gz
$ mv setuptools-0.6c9dev-r66389 python-setuptools-0.6c9dev-r66389
$ tar -cf python-setuptools-0.6c9dev-r66389.tar python-setuptools-0.6c9dev-r66389
$ gzip -9 python-setuptools-0.6c9dev-r66389.tar
$ cp python-setuptools-0.6c9dev-r66389.tar.gz ~/RPM/SOURCES/
$ cd ..
$ vi build/bdist.linux-i686/rpm/SPECS/setuptools.spec

そして rpmbuild。今回はちゃんと成功する。

$ rpmbuild -ba build/bdist.linux-i686/rpm/SPECS/setuptools.spec
....(省略)....
$

これで ~/RPM/RPMS/noarch/ 以下に python-setuptools の rpm が出来るので yum なり rpm -ivh で入れる。

これでようやく TracAccountManager のインストールが成功するようになる。

# easy_install http://trac-hacks.org/svn/accountmanagerplugin/trunk
Downloading http://trac-hacks.org/svn/accountmanagerplugin/trunk
Doing subversion checkout from http://trac-hacks.org/svn/accountmanagerplugin/trunk to /tmp/easy_install-So4Fz1/trunk
Processing trunk
Running setup.py -q bdist_egg --dist-dir /tmp/easy_install-So4Fz1/trunk/egg-dist-tmp-GbMhk-
TracAccountManager 0.2.1dev-r3857 is already the active version in easy-install.pth

Installed /usr/lib/python2.4/site-packages/TracAccountManager-0.2.1dev_r3857-py2.4.egg
Processing dependencies for TracAccountManager==0.2.1dev-r3857
Finished processing dependencies for TracAccountManager==0.2.1dev-r3857

#

やれやれ。。