Getting Subversion Revision in Ant January 30, 2008
Posted by ccollins in How To, Java, Software Engineering.Tags: Ant, How To, Java, Software Engineering, Subversion
trackback
Here’s a nifty Ant snippet. This can be used to get the Subversion revision number from your Ant build system. Using this, you can label your build artefacts, providing better visibility on what exactly is contained in each build.
<target name="find_revision" description="Sets property 'revision.number' to the head svn revision">
<property name="revision" value="HEAD"/>
<!-- find out revision number of HEAD, need svn.exe installed on local machine -->
<exec executable="svn" outputproperty="svnlog.out">
<arg line="log ${homedir}/.. -r ${revision} -q"/>
</exec>
<echo>${svnlog.out}</echo>
<!-- need ant-contrib.jar for this in lib dir of ant install -->
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
<propertyregex property="revision.number" input="${svnlog.out}" select="\1">
<regexp pattern="r([0-9]*)"/>
</propertyregex>
<echo>Revision found: ${revision.number}</echo>
</target>
Nice – this helped me out.
Thx
Nice idea, I took it and made the following Groovy version:
rev = ’svn log . -r HEAD -q’.execute().text =~ /r([0-9]*).*/
project.setProperty(’svn.revision’, rev[0][1])
@didge
Thanks, I’m sure that’ll come in handy sometime.
I haven’t got around to looking at all those new scripting languages, such as groovy, ruby, python, etc. It’s been on my to-do list for a while, but the opportunity hasn’t arisen yet.
“svn log” have one problem:
If you run svn log on a specific path and provide a specific revision and get no output at all
$ svn log -r HEAD -q
That just means that the path was not modified in that revision.
Use “svn info -r HEAD” “Last Changed Rev” property.
this is perfect
[...] Uncategorized. Tags: Ant, Build Tools, scm, svn trackback We have previously discussed getting the subversion revision number from an ant script. Whie the previous method relied on antcontrib and regexes, I’ve recently come across the [...]
This gets the latest revision that is in subversion rather than the revision the current directory has. In nightly-build setups, this may be identical, but better use “svnversion” tool (shipped with subversion just next to svn exec) instead of “svn” + some strange command lines. svnversion has been designed to do exactly the job you try to accomplish here.
To comment number 7, this is not true what you are saying! Otherwise you would put at least a link to your svnversion.
For the author please remove comment 7. and mine afterwards. I will follow up with you in your next post about this topic, because this one did not work with me.
You can easily get rid of the dependency of ant-contrib.jar by using this code instead that uses only built in ant tasks and places the revision in ${Revision}.
<!-- find out svn.revision of HEAD, need svn.exe installed on local machine will en up in property ${Revision} --> <exec executable="svn" output="svnlog.out"> <arg line="info -r ${revision}"/> </exec> <loadproperties srcFile="svnlog.out"> <filterchain> <linecontains> <contains value="Revision"/> </linecontains> </filterchain> </loadproperties> <delete file="svnlog.out"/>Go one step further! Do it with no need for dependencies or temp files!
<exec executable="svn" outputproperty="revision.number"> <arg line="info -r ${revision}"/> <redirector> <outputfilterchain> <linecontainsregexp> <regexp pattern='^Revision' /> </linecontainsregexp> <tokenfilter> <replaceregex pattern='[\D]+([\d]+)' replace="\1" /> </tokenfilter> </outputfilterchain> </redirector> </exec>One step further more. This is my prefered way without any library or executable.
Udo,
> This is my prefered way without any library or executable.
This is liable to break when you upgrade SVN, if they change the format of these _private_ files (which they have done in the past).
Yes, I know. But I have no svn executables installed, just an IDE with svn support. To use the other suggestions I have to install svn additionally. Anyway, if they change the format, I have to change something else in my environment (executables, libraries or just my build script).
I prefer to use svnant this way
Getting HEAD revision: ${svn.info.lastRev}
Getting current revision: ${svn.info.rev}
See http://subclipse.tigris.org/svnant/svn.html#info
Try that again (hope this works … sorry… don’t blog often):
Getting HEAD revision: ${svn.info.lastRev}
Getting current revision: ${svn.info.rev}
another attempt to make sure
<svn><info target=”${svn.url}”/></svn>
<echo>Getting HEAD revision: ${svn.info.lastRev}</echo>
<echo>Getting current revision: ${svn.info.rev}</echo>
Hi Shannon,
I’ve covered this in a follow up post. I’ve found myself using both methods from time to time.
-Chris