Title : RSS feed for OpenBSD stable packages repository (made with XSLT)
Author: Solène
Date  : 05 June 2019
Tags  : openbsd automation

I am happy to announce there is now a RSS feed for getting news in case of new
packages available on my repository
[https://stable.perso.pw/](https://stable.perso.pw/)

The file is available at [https://stable.perso.pw/rss.xml](https://stable.perso.pw/rss.xml).

I take the occasion of this blog post to explain how the file is generated as I
did not find easy tool for this task, so I ended up doing it myself.

I choosed to use **XSLT**, which is not quite common. Briefly, **XSLT** allows
to use some kind of XML template on a XML data file, this allow loops,
filtering etc... It requires only two parts: the template and the data.


**Simple RSS template**

The following file is a template for my RSS file, we can see a few tags
starting by `xsl` like `xsl:for-each` or `xsl:value-of`.

It's interesting to note that the `xsl-for-each` can use a condition like
`position < 10` in order to limit the loop to the 10 first items.


    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
        <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
            <channel>
                <description></description>
    
                <!-- BEGIN CONFIGURATION -->
                <title>OpenBSD unofficial stable packages repository</title>
                <link>https://stable.perso.pw/</link>
                <atom:link href="https://stable.perso.pw/rss.xml" rel="self" type="application/rss+xml" />
                <!-- END CONFIGURATION -->
    
                <!-- Generating items -->
                <xsl:for-each select="feed/news[position()&lt;10]">
                <item>
                    <title>
                        <xsl:value-of select="title"/>
                    </title>
                    <description>
                        <xsl:value-of select="description"/>
                    </description>
                    <pubDate>
                        <xsl:value-of select="date"/>
                    </pubDate>
                </item>
                </xsl:for-each>
    
            </channel>
        </rss>
    </xsl:template>
    </xsl:stylesheet>


**Simple data file**

Now, we need some data to use with the template.
I've added a comment block so I can copy / paste it to add a new entry into the
RSS easily. As the date is in a painful format to write for a human, I added to
my Makefile starting the commands a call to a script replacing the string DATE
by the current date with the correct format.

    <feed>
    <news>
        <title>www/mozilla-firefox</title>
        <description>Firefox 67.0.1</description>
        <date>Wed, 05 Jun 2019 06:00:00 GMT</date>
    </news>
    
    <!-- copy paste for a new item
    <news>
        <title></title>
        <description></description>
        <date></date>
    </news>
    -->
    </feed>


**Makefile**

I love makefiles, so I share it even if this one is really short.

    all:
    	sh replace_date.sh
    	xsltproc template.xml news.xml | xmllint -format - | tee rss.xml
    	scp rss.xml perso.pw:/home/stable/
    
    clean:
    	rm rss.xml

When I want to add an entry, I copy / paste the comment block in news.xml, add
DATE, run `make` and it's uploaded :)

The command **xsltproc** is available from the package **libxslt** on OpenBSD.

And then, after writing this, I realise that manually editing the result file
rss.xml is as much work as editing the news.xml file and then process it with
xslt... But I keep that blog post as this can be useful for more complicated
cases. :)