I am currently available as a freelance Senior Perl Programmer. Download my up-to-date resume (PDF)
John Bokma MexIT
freelance Perl programmer

Subversion: Using the svn:keywords property

Tuesday, September 30, 2008 | 3 comments

After having read a bit more about the various subversion properties I decided to use the svn:keywords property to solve my problem: inserting automatically a timestamp in program code I publish on my website. Until recently, the Perl program that generates (almost) all pages on this site read the timestamp from the source code files it includes. A feature I broke by dumping the Subversion repository on my old development machine, loading it back on my new one - a Dell Vostro 200 ST - and checking out the files again. The good news was that making my sites from 70+ XML files now just took about 35 seconds instead of over 300 seconds. The bad news was that the timestamps got lost. Not a problem for most files, except for the ones I included in web pages with the timestamp added to reflect the time the program code was last updated.

After I discovered this; svn diff showed that some HTML files, which I also keep under version control for exactly this reason: to verify if the same XML files still generate the same HTML 4.01 strict pages, didn't match the output I expected, I considered at first to use touch to set the timestamps back. Not only did that sound as quite some work, but also it would mean that as soon as I checked out source code on a different computer, I had to fix the timestamp of each file on that computer as well.

Anyway, after some reading, mostly in the online Subversion manual, I decided to use the svn:keywords property, which would substitute the keyword specified (keyword substitution) for dynamic information in the file itself. I decided to use the Id keyword because the dynamic information not only included a timestamp but also the filename, revision number, and author.

Setting the svn:keywords property on the command line

So I opened a file, in this example https-test.pl using the vi editor and added the following at line 5 of the Perl program file:

# $Id$

The first character is a comment character (in Perl), and $Id$ is the magic keyword which Subversion will replace with the filename, the revision of the file, the date and time in UTC, and the author. In order to get this behavior, svn:keywords property must be set to Id:

$ svn propset svn:keywords "Id" https-test.pl 
property 'svn:keywords' set on 'https-test.pl'

Note: the second line is a message reported by Subversion.

Next, I comitted the file as follows:

svn ci https-test.pl -m "Set svn:keywords property to Id"
Sending        https-test.pl
Transmitting file data .
Committed revision 1081.

After this the file https-test.pl got magically updated to (only the first 8 lines are shown):

# https-test.pl - HTTPS GET example
# (c) Copyright, 2004-2005 By John Bokma, http://johnbokma.com/
# $Id: https-test.pl 1081 2008-09-30 19:03:23Z john $

use strict;
use warnings;

And from now on - hopefully more drastic changes than just adding a $Id$ - each time the file is commited to the Subversion repository, the revision number and timestamp will be updated. Looks like a feature I should have learned about much earlier on. But it's never too late to learn, as my mother would say.

Setting the svn:keywords property via TortoiseSVN

On the Compaq SR1505LA I mostly used (and still use) TortoiseSVN as a Subversion client. So when I had modified all source files from the command line on Linux, I decided to check out how easy the svn:keywords property could be set via TortoiseSVN.

Adding the svn:keywords property using TortoiseSVN.
Adding the svn:keywords property using TortoiseSVN.

And it turned out to be quite easy. If you want to give it a try, follow the following instructions:

This looks like quite some more steps compared to the command line version. Remember that you can install a command line client on Windows XP as well.

Subversion keyword substitution related

Also today

Please post a comment | read 3 comments, latest by Ben Zemm | RSS feed