Automating SVN Tagging

I’ve been using the SVN version control system for a couple years now to maintain the code for the WordPress plugins I write. Using a version control system is a fantastic tool that allows me to write and release great code. However, this post is not about how SVN is spectacular and everyone should use it whenever they write code of any sort (although they should). This post is about automating SVN tagging.

But first, a quick overview of SVN and how things are done. There are three main directories for each plugin that I write: trunk, tag, branch.

‘Trunk’ is the main code area and is where all primary and active development of code occurs. The latest version of any plugin can be found in the Trunk folder.

‘Branch’ is similar to Trunk, however it’s mostly used for side development. It’s actually exactly the same as Tag, except that development continues in a Branch.

‘Tag’ is where copy of milestones are kept. For me, this means versions of plugins that I release. You can browse the tag folder and find all the versions of a plugin I’ve created and download them if you wanted. It’s similar to a Branch, but development is not continued.

I rarely create branches. I think this is mostly because I’m the only official contributor and there are not other developers working on them at the same time. So other then committing changes to the trunk, the only other operation I perform on a regular basis is tagging. The issue with tagging, though, is that it’s a tedious and repetitive process that should be automated in SVN for large sets of files, but isn’t.

This annoys me.

So I created a solution. I downloaded the SVN command line version and then wrote the following Batch file:

:input
set TAG=
set /P TAG=Version Tag: %=%
if "%TAG%"=="" goto input
echo Creating the version %TAG%
set BASEURL=http://svn.wp-plugins.org/countdown-timer
svn mkdir %BASEURL%/tags/%TAG%/ -m "Version %TAG% tag"
set FILE=afdn_countdownTimer.php
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=afdn_countdownTimer.po
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=afdn_countdownTimer.po
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=afdn_countdownTimer-es_ES.mo
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=afdn_countdownTimer-es_ES.po
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=afdn_countdownTimer-sv_SE.mo
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=afdn_countdownTimer-sv_SE.po
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=fergcorp_countdownTimer_java.js
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=readme.txt
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=screenshot-1.png
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"
set FILE=screenshot-2.png
svn copy %BASEURL%/trunk/%FILE% %BASEURL%/tags/%TAG%/%FILE% -m "Version %TAG% tag"

It’s not terribly pretty, in fact I’d argue that it’s downright ugly. But. It does get the job done. One of the things that I want to do is figure out a better way to do the “svn copy” part of the operation since it’s repetitive. However, Batch files don’t appear to handle arrays at all. Although they do handle loops (I believe) and I could just pass the file names in as parameters. I may end up converting the thing to VBScript or write little C++, although it’s been ages since I’ve done either.

4 Replies to “Automating SVN Tagging”

  1. Why not just do:
    svn copy %BASEURL%/trunk %BASEURL%/tags/%TAG% -m “Version %TAG% tag”

    That will make the new tag directory and add all files from trunk to the tag as a “lightweight” copy (that is, initially nothing more that a set of pointers to the trunk files at the current version). You repository would hardly grow any at all, but you could still get back to that version by the tag name.

  2. I had no idea that you could do that. Although I don’t think I looked into it too much either. So call it ignorance on my part.

    In any event, thanks for making my life easier! 🙂

  3. I have a question, Andrew with your original svn copy command of individual file to a tag approach do you tag that individual file or the whole tree structure? With Marshall’s suggestion it is clear that the whole trunk gets tagged.

  4. From my experience, creation of tag using mkdir is mandatory to not to expect weird results.
    svn copy do creates it but there is a difference in the output.

    thanks,

Leave a Reply

Your email address will not be published. Required fields are marked *