Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automatically creating a tag in subversion

Tags:

svn

I maintain the build system at my company, which is currently using CVS. This build system is used across multiple projects and multiple CVS repositories.

Whenever we have a release milestone, we create a tag. In CVS, this is easy:

$ cvs tag TAG_NAME

That command works regardless of the CVS module or repository, as long as it is executed in a CVS working directory.

In order to do the same thing in subversion though, it looks like I will first have to parse the output of svn info to get the repository root. Then I can create the tag with:

svn cp . $REPO_ROOT/tags/TAG_NAME -m"Created tag TAG_NAME"

This of course assumes that the svn repository has the recommended "trunk, tags, branches" directory structure. So to be safe I'll probably need to verify this first.

That seems like a lot of work just to map a revision number to a symbolic name. Is there a better way?

like image 544
Jason Day Avatar asked Nov 12 '08 20:11

Jason Day


2 Answers

I use svn from the command line almost exclusively and0t I quickly tired of typing in monster URLs. I finally wrote a script svnurl, which I use from the shell. It operates on the assumption that an "project" hast the form:

.../PROJECTNAME/trunk
                tags
                branches

Let's assume you are somewhere in a working copy of PROJECTNAME/branches/foo:

svnurl -tl  # gives a list of tags for the current project 
svnurl -tlu # the same as full urls
svnurl -t 1.1 # the url for the tag 1.1 of the current project
# analagous functions for branches
svnurl -ru  # the url of the "root" of the current working copy
            # eg  svn://.../PROJECTNAME/branches/foo
svnurl -T   # the url of the trunk of the current project
svnurl -pn  # the name of the current project, `PROJECTNAME`
# ...

Usage looks something like this:

$ svn cp $(svnurl -T) $(svnurl -t 1.1.1)  # tag trunk as 1.1.1

The code isn't beautiful, but it has saved me many keystrokes and been useful in ways I hadn't expected. I'd be willing to share it if you are interested.

like image 168
bendin Avatar answered Sep 20 '22 00:09

bendin


You're missing a core principle of Subversion: the revision number is the tag. When you "tag" it with svn cp, you're just making a copy of that particular revision with a longer name. And unlike a CVS tag, you (or other developers) could continue doing ongoing development on that "tag". It isn't a static entity like a CVS tag is (well, to be fair, you can move a tag on individual CVS files which effectively "changes" it).

Most svn users treat tags the way CVS presented them. And (under Apache, at least) you can configure the DAV server to not permit writes/check-ins under any tag directory. I haven't tried this, and it might prevent you using http URLs for creating the tags (you'd have to use file paths from a shell on the hosting machine). But for all practical purposes, your release process should be more interested in the specific revision number, than in some arbitrary text-string. The latter can be altered after the release; the former should[*] always give you access to the exact same set of files every time you check it out.

[*] There's always a way to fiddle around with files behind the scenes, after the fact... I used to hand-edit RCS and CVS files with vi when I needed to fix a comment, etc. But without some serious svn-cleverness, a given revision number should be pretty constant.

like image 42
rjray Avatar answered Sep 21 '22 00:09

rjray