Mercurial RSS

The RSS feed that is built into Mercurial is a great thing. It let's you track easily who's checking in and what get's done in your repositories.

The preconfigured layout, however, is a bit spartan. It only shows the date, the commit message and the author. This always bugged me, because I'd like to see how much was done and how many files were changed on each commit.

Luckily, the contents of the RSS feed get prepared through a template engine. This makes it possible to change the contents of the feed without needing to muck around with too much stuff.

The following repeats much of the information you can also find on http://mercurial.selenic.com/wiki/Theming but is specific to RSS feed customization.

If you're on Ubuntu, the files we're going to look at are stored in

/usr/share/mercurial/templates/rss/

The feeds use the same framework as the web-served styles, which is why the layout and the file structures are a bit confusing at first. Basically, the RSS feed is composed of three files: the header (header.tmpl), the actual content (changelog.tmpl), within which single items (changelogentry.tmpl) are looped, and the footer (footer.htmpl). Since RSS feeds don't offer much in terms of customizability, we can focus on each individual entry, stored in changelogentry.tmpl. Looking at that give us this:

<item>    <title>{desc|strip|firstline|strip|escape}</title>    <guid isPermaLink="true">{urlbase}{url}rev/{node|short}</guid>    <description><![CDATA[{desc|strip|escape|addbreaks|nonempty}]]></description>    <author>{author|obfuscate}</author>    <pubDate>{date|rfc822date}</pubDate> </item>

Looks nice. But I don't really need the description twice. So let's change the contents of <description> (which is what get's displayed in the RSS reader as the contents) with a list of changed files. For that, we simply exchange the description line, so that the file looks like this:

<item>    <title>{desc|strip|firstline|strip|escape}</title>    <guid isPermaLink="true">{urlbase}{url}rev/{node|short}</guid>    <description><![CDATA[{files}]]></description>    <author>{author|obfuscate}</author>    <pubDate>{date|rfc822date}</pubDate> </item>

 

Trying this, however, results an error. The reason for this is because the template engine will give us a "filedifflink" for each file, i.e. we have to prepare a template fragment for the filedifflink. The template fragments are stored in the file ''map'' and to define the fragment, we simply add this line to the file:

filedifflink = '{file|escape}<br/>'

And that's all. Now the RSS feed contains for each entry a list of files that were changed, complete with a link to the file changes on the web frontend.