Monday 12 April 2010

Is tag a branch?

I've been working with version control software for couple years now. At the beginning it was CVS, now it's mainly SVN. I thought I had a good general understanding of such terms as branch, revision or tag.

Recently I was very surprised when I was asked to commit my changes into a TAG.
So I asked:
- You mean branch?
- No, Tag!
- ???

I always thought that a tag is just a 'marker' that marks a point in a branch and it doesn't branch the code. So what does committing to a tag actually mean? How to commit something to a tag without affecting the branch it was created for?

The answer for those questions can be found in TortoiseSVN documentation explaining what tags and branches actually are from technical perspective:

Tags are typically used to create a static snapshot of the project at a particular stage. As such they not normally used for development - that's what branches are for, which is the reason we recommended the /trunk /branches /tags repository structure in the first place. Working on a tag revision is not a good idea, but because your local files are not write protected there is nothing to stop you doing this by mistake. However, if you try to commit to a path in the repository which contains /tags/, TortoiseSVN will warn you.

Although Tortoise actually allows you to commit into a tag you should never do that! It actually branches the code and makes the code repository messy! After such operations there are actual branches under tags structure. I can't imagine what merging such branched tag with its original branch would actually mean?

But what if you need to add changes to the tagged release (a.g. patches)? Here is the proper way to solve such problem:

It may be that you need to make further changes to a release which you have already tagged. The correct way to handle this is to create a new branch from the tag first and commit the branch. Do your Changes on this branch and then create a new tag from this new branch, e.g. Version_1.0.1.

Now when I understand the problem better I'm just wondering why TortoiseSVN (other tools probably too) allows such operation (with warning). Are there any situations where it would be necessary?

Thursday 1 April 2010

Line numbers in stack trace

When a .net application fails and an exception is thrown you may want to find the reason for such behavior. To identify the code that caused the exception you can examine the stack trace included in your exception. However, the stack trace may not contain line number, which makes the failing code harder to find, especially if you have a lot of code in single methods (not recommended).

Solution:
To ensure that line numbers are included in stack trace you need to deploy .pdb files together with your dll-s. Program database (pdb) files are created when you build your app in Debug mode. You need to copy them to the same directory where dll-s are placed.

Tip: GAC dll-s are stored under folder structure described here