A Django site.
August 13, 2008

Diego Escalante
dieguito
hack my cow
» Evolution plugins hacking

Hace como dos meses, Yannick[0] me contactó para preguntarme si podía implementar para él un plugin de Evolution. Concretamente quería el plugin que se pedía en este bug de eons de antiguedad. Por cierto Beeznest (la empresa de Yannick) tiene un post sobre el tema.

El reto entonces era implementar un plugin de Evolution que permitiese responder a los correos recibidos con respuestas prefabricadas, templates.
El plugin debía permitir reemplazar ciertos "tokens" por información del usuario, por ejemplo reemplazar "%from%" por el nombre del remitente a quien se le estaba respondiendo. Además, debía ser posible tener una carpeta de templates con infinitas subcarpetas.


Resultado final

Lo más simple, y por lo que hay q empezar, es habilitar nuestro plugin en la infraestructura de compilación, osea en los Makefiles. Esto es trivial y solo hay que decirle al configure.in que construya nuestro Makefile:
plugins/templates/Makefile

Luego, hay que crear la infra para el plugin mismo:

INCLUDES = \
-I$(top_srcdir) \
$(EVOLUTION_MAIL_CFLAGS)

@EVO_PLUGIN_RULE@

plugin_DATA = org-gnome-templates.eplug org-gnome-templates-ui.xml
plugin_LTLIBRARIES = liborg-gnome-templates.la

liborg_gnome_templates_la_SOURCES = templates.c
liborg_gnome_templates_la_LDFLAGS = -module -avoid-version

EXTRA_DIST = org-gnome-templates.eplug.xml org-gnome-templates-ui.xml

BUILT_SOURCES = org-gnome-templates.eplug
CLEANFILES = $(BUILT_SOURCES)


Este es el Makefile de mi versión original, la incluida en trunk de Evolution es distinta y tiene algunas cosas extra.

Basicamente hay que decirle a autofoo que queremos que nos construya un shared object que se llame liborg-gnome-templates, osea una librería que pueda cargarse en tiempo de ejecución (si mi mumbo jumbo técnico está mal, corríjanme).

Luego toca crear un archivo definiendo el UI de nuestro plugin, esto es parte del framework de evo, pero recuerda a como GTK+ hace las cosas:

<Root>
<commands>
<cmd name="FileSaveAsTemplate" _label="Save As _Template"/>
</commands>
<menu>
<submenu name="File">
<placeholder name="Print">
<menuitem name="FileSaveAsTemplate" verb="" />
</placeholder>
</submenu>
</menu>
</Root>


Luego toca crear un .eplug que defina nuestro plugin, lo importante es saber el nombre de los hooks que hay q usar y asignarles la propiedad factory que es como quién dice el callback, eso y otras cosas están en la muy incompleta y arcana documentación de los eplugins (cookie para quien los encuentre en el svn, no me acuerdo!).

Luego, solamente programas y lo mandas a la lista y algún buen dude como Bharath Acharya lo integra a Evolution trunk.

En cuanto al código, todo es magia negra de Evolution y C, pueden ver el original en launchpad o el parche final con los cambios de Bharath. Se reciben preguntas y pedidos de plugins, cotización previa :P.

Kudos a Yannick que vía Beeznest que financió el trabajo inicial.

May 13, 2008

Diego Escalante
dieguito
hack my cow
» bzr-builddeb para mantener paquetes Debian

Tal como se ve en la web de DebianPerú, he publicado un tutorial sobre cómo usar bzr-builddeb para mantener paquetes Debian/Ubuntu: