Trac es fantástico. Tiene todo lo que quiero y más. Amo Trac...

... hasta que se me ocurre la inefable idea de ponerle plugins. Resulta que Trac es plugineable desde la versión 0.9, y que en la versdion 0.10 más aún, con más plugineabilidad que antes! Y además, existen usas cosas llamadas .egg que simplifican todo: sólo ponés un .egg en el tracenv/plugins y ya.

... y ya? I wish. Resulta que no, mirá vos, que si no hacés la danza del easy_install no anda. Esto es porque éste se las arregla para que un .egg (que a todo esto es un .zip con el paquete) se pueda cargar. Ok, tons nos proponemos a hacer dicha danza. El tema es que uno quiere ser ordenadito y en vez de ensuciar el sistema (e_i por defecto pone todo en el site-packages del python por defecto) espero que los .eggs terminen en el mencionado directorio. Así, intentamos con esto:

sudo -u www-data easy_install --install-dir /var/lib/trac/xarope/plugins/ \
--site-dirs /var/lib/trac/xarope/plugins/ TracSpamFilter
error: /var/lib/trac/xarope/plugins/ (in --site-dirs) is not on sys.path

Lindo error. Resulta que no hay forma de coercer a e_i que lo haga, por más que no esté en el PYTHONPATH (bah, en el sys.path). Y hablando de dicha envvar, no anda ni con PYTHONPATH=path comando ni con un export previo.

Comienza la hora de la negrada. Primero vemos que e_i es en realidad un wrapper de 4 líneas python:

$ cat $(which easy_install)

#!/usr/bin/python2.4
# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==0.6c3','console_scripts','easy_install'
__requires__ = 'setuptools==0.6c3'
import sys
from pkg_resources import load_entry_point

sys.exit(
load_entry_point('setuptools==0.6c3', 'console_scripts', 'easy_install')()
)

Cuál es la idea? Arrancar un intérprete python, modificar sys.path, de paso sys.argv, invocar dichas líneas de python y ya:

In [1]: import sys
In [2]: sys.path.append ("/var/lib/trac/xarope/plugins/")
In [3]: __requires__ = 'setuptools==0.6c3'
In [4]: from pkg_resources import load_entry_point
In [5]: lep= load_entry_point('setuptools==0.6c3', 'console_scripts', 'easy_install')
In [10]: sys.argv.extend (['--install-dir', '/var/lib/trac/xarope/plugins/', '--site-dirs', '/var/lib/trac/xarope/plugins/', 'TracSpamFilter'])
In [13]: lep ()
Creating /var/lib/trac/xarope/plugins/site.py
Searching for TracSpamFilter
Reading http://www.python.org/pypi/TracSpamFilter/
Reading http://trac.edgewall.org/wiki/SpamFilter
Reading http://www.python.org/pypi/TracSpamFilter/0.2dev-r4489
Best match: TracSpamFilter dev
Downloading http://svn.edgewall.com/repos/trac/sandbox/spam-filter#egg=TracSpamFilter-dev
Doing subversion checkout from http://svn.edgewall.com/repos/trac/sandbox/spam-filter to /tmp/easy_install-C5o9rL/spam-filter
Processing spam-filter
Running setup.py -q bdist_egg --dist-dir /tmp/easy_install-C5o9rL/spam-filter/egg-dist-tmp-nVJ04Y
Adding TracSpamFilter 0.2.1dev-r6418 to easy-install.pth file

Installed /var/lib/trac/xarope/plugins/TracSpamFilter-0.2.1dev_r6418-py2.4.egg
Processing dependencies for TracSpamFilter

Voilá! De acá! Si apunto mi browser a mi trac obtengo:

[back trace]
ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

  [Errno 13] Permission denied: '/var/www/.python-eggs'

The Python egg cache directory is currently set to:

  /var/www/.python-eggs

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

Ah, esto es fácil, sólo agrego un SetEnv PYTHON_EGG_CACHE path en la configuración de Apache para este Trac y ahora sí, yastá!

sysadmin trac