aleix's blog


15 November 2012 1:43 AM (git | guile)

If you use git, you might find yourself wanting to merge a huge list of commits into a branch, but you might not want all of them. git-rebase already helps with this task but it becomes less convenient when you have lots of commits as you may not remember all of them and also because it doesn't show you the contents of each commit

git-cherry-base is an interactive script (written in Guile) that lets you choose which commits you'd like to merge and even which parts of the commit you want. Given a list of revisions (obtained from git-rev-list) it will show the contents for each commit and will let you choose if you want to merge the commit, skip it or merge only parts of it.

Usage: git-cherry-base rev-file

I wrote it some months ago as I couldn't find any other command line tool to do this and, well, it was just a good excuse to hack something in Scheme.

Emacs 23.3 for RHEL 6

28 June 2011 3:12 PM (emacs | redhat)

Emacs version in RHEL 6.1 is very outdated, 23.1 (which was released on July 2009). I needed a newer version to run Geiser at work, so after searching for the package in the typical places ( and and Google I decided to build my own one. For it, I just followed these instructions on how to build Source RPM packages and did some minor updates on the RPM spec file.

So, simply download emacs-23.3-1.el6.src.rpm and follow these instructions:

This will only create an rpmbuild directory in your home:

$ rpm -i emacs-23.3-1.el6.src.rpm

Install rpm-build if you don't have it, and build the Emacs RPMs:

$ cd $HOME/rpmbuild/SPECS
$ rpmbuild -ba emacs.spec

Finally, upgrade your old installed Emacs and happy hacking!

$ cd $HOME/rpmbuild/RPMS
$ sudo rpm -U emacs-23.3-1.el6.x86_64.rpm emacs-common-23.3-1.el6.x86_64.rpm

more tekuti hacks

1 March 2011 4:58 PM (tekuti | guile)

I have had less time lately, but I still found some minutes to hack on tekuti. The most important new feature is performance. tekuti is now one or two order of magnitudes faster than before. No more delays when accessing posts or listing tags or archives posts. Basically, accesses to git have been reduced to the minimumn. So, these are the new features since last post:

  • Fixes: search works again.

  • Performance: reduction of git accesses (and adding Look-Up-Tables) has improved speed dramatically.

  • New widgets: blank and page-rank.

  • Page navigation: the new links at the bottom (go to the end of the page) allow navigation through all blog history.

  • Cosmetics: post lists (in tags or archives) show the post date besides the title...

You can check out all these new features from gitorious:

git clone git://

Happy hacking!

tekuti hacks

10 January 2011 1:24 AM (tekuti | guile)

Lately, I've been hacking new features for tekuti, the blogging software that's running this site. tekuti is written in Scheme (GNU Guile), so I had no more excuses to start hacking on it.

Blah, blah, blah... but what have you done? Nothing really impressive, indeed, but quite useful for my needs:

  • Support for deleting posts. As tekuti is based on git, it's easy to recover them for free. And you don't need to spell any git command, tekuti admin interface can help you here.

  • Support for deleting post comments. This is useful if undesired spam gets in your site.

  • Support for custom user templates. Before, there was only one template. Now, it is possible to add multiple templates and choose your desired one from the configuration file (via the *template-module* variable).

  • Configure widgets on the sidebar. You can now configure the widgets you want to appear in your blog sidebar. Mine, looks like this:

    (set! *main-sidebar-widgets* '(subscribe search tag-list))
    (set! *post-sidebar-widgets* '(subscribe related))

    Available widgets are: subscribe, search, related, tag-cloud, tag-list.

  • Support Movable Type API. This means it is now possible to use your favorite blog editor and post or edit your tekuti articles. You need to configure tekuti as a Movable Type blog. The XMLRPC endpoint is In fact, some MetaWeblog and Blogger methods have been also implemented. This is the list of supported methods:

    • metaWeblog.newPost

    • metaWeblog.getPost

    • metaWeblog.editPost

    • metaWeblog.getRecentPosts

    • metaWeblog.getCategories

    • mt.setPostCategories

    • mt.getPostCategories

    • mt.getCategoryList

    • blogger.getUsersBlogs

    • blogger.deletePost

    For this to work, I have created a reusable XMLRPC library for guile. More on this in next post.

These hacks are not yet available in tekuti's master, so you can get them from my branch:

git clone git://

Happy new year and happy hacking!

ropemacs and remote files (fuse)

16 November 2010 8:27 PM (emacs | python)

This morning I needed to edit some python scripts from a local server at work and, as always, used the TRAMP Emacs mode, but immediately found a problem. A few months ago I installed the great python refactoring library rope and its Emacs mode ropemacs. It comes out that ropemacs asks you for the location of your rope project if it cannot find it (this always happens the first time you start a project).

TRAMP URLs look like this:


So, you can now imagine what happens when Emacs gives an URL like this to rope (which is a python library and doesn't know anything about TRAMP URLs) as if it was a local file name...

Traceback (most recent call last):
  File "/usr/lib/python2.6/.../ropemode/", line 88, in open_project
    self.project = rope.base.project.Project(root)
  File "/usr/lib/python2.6/.../rope/base/", line 134, in __init__
OSError: [Errno 2] No such file or directory: '/ssh:user@server:/path'

The worst is that you are continuously being asked by Emacs to enter a valid rope project location.

The solution? Simply use the FUSE SSH Filesystem.

$ sudo apt-get install sshfs
$ sshfs user@server:path mountpoint

FUSE stands for Filesystem in Userspace. With FUSE you will end up editing remote files as if they were in your computer and the great thing is that you don't need root access, so any user can mount a FUSE filesystem.

Update 2010/11/17: FUSE mounted directory can be unmounted with:

$ fusermount -u mountpoint