2013年6月29日土曜日

gentwoo と python と eselect と

Gentoo の portage の機能として、make.conf で PORTAGE_ELOG_COMMAND にログ出力用の任意のコマンドを指定して実行させる仕組みがある。 gentwoo はそれを利用したログ収集のサイトで、そこにログを送るために betagarden overlay の app-portage/gentwoo をインストールして

PORTAGE_ELOG_SYSTEM="custom:* save"
PORTAGE_ELOG_COMMAND="gentwoo '${PACKAGE}' '${LOGFILE}'"

といった行を make.conf に書き加えてある。

最近、といってももう3週間ぐらい、この gentwoo の呼び出しでエラーが発生するのである。

二種類のパターンがある。 一つめは gentwoo-2.7 という(Python 2.7 で実行される)スクリプト本体で発生するエラー。

Traceback (most recent call last):
  File "/Users/tetsushi/Gentoo/usr/bin/gentwoo-2.7", line 11, in 
    from portage.util import getconfig
ImportError: No module named portage.util
!!! PORTAGE_ELOG_COMMAND failed with exitcode 1

二つめは gentwoo というラッパーシェルスクリプトで発生するエラー。

/Users/tetsushi/Gentoo/usr/bin/gentwoo: Execution of 'eselect python show --python2' failed
!!! PORTAGE_ELOG_COMMAND failed with exitcode 1

どちらのエラーも portage がインストールする ${EPREFIX}/usr/lib/portage/pym/portage/elog/mod_custom.py で spawn_bash の引数に env=os.environ を追加すれば回避できるようだが、このファイルは数年書き変えられていないので挙動が変わってしまった真の原因ではない。

portage と eselect のバージョンによるエラーのパターンは以下の表の通り。 portage のバージョンは現在 prefix ツリーにある最古と最新。 eselect のバージョンは最近エラーが変わる前後のバージョン。

portage-2.2.01.219382.2.01.22013
eselect-1.3.4パターン1パターン1
1.3.5パターン2パターン2

eselect は予想通りの結果だったけど、portage はエラーが起こり始めたと思った時点よりも前の 2.2.01.21938 でも再現されてしまって意外な感じ。 gentwoo のバージョンも関係ないし、原因が判らない。

と書いたところで思い出した。 そういえば最初にエラーが出た6月10日前後、python のアップデートもあった。 現在使っているのは dev-lang/python-2.7.5 だ。 ebuild の更新が6月のバージョンを避けて python-2.7.3-r2 を emerge すると、パターン1は再現しなくなった。 6月に更新されているけど 2.7.3-r3 も OK。 しかし 2.7.4 は再びエラーだ。

結論。パターン1は python 側の何らかの変更が原因。 パターン2は eselect の何らかの変更が原因。 さて、どこにどう報告すればいい?