On Tue, 2010-10-19 at 11:59 +0200, Johan Corveleyn wrote:
> On Tue, Oct 19, 2010 at 9:40 AM, Tony Butt <tony.butt_at_cea.com.au> wrote:
> > On Tue, 2010-10-19 at 18:23 +1100, Tony Butt wrote:
> >> I have had 2 unusual occurrences with merges with some of our software
> >> engineers here in the last month. I wrote the first off as user error,
> >> but a similar event has occurred - still possibly user error.
> >> We are using subversion 1.6.12 on our server, and a mix of TortoiseSVN
> >> 1.5 and 1.6 clients on our clients, as well as some commandline usage
> >> through an automated tool.
> >> What has happened is that twice now, an engineer has branched some code,
> >> and then seen unusual checking behaviour. The second instance was today,
> > Whoops - make that *check-in*
> >> and occurred after merging the trunk of the software module into the
> >> branch, then checking the results back in to the branch. What actually
> >> happened is that 2 source files were checked back in to the trunk
> >> instead. The first instance is less clear cut. Unfortunately, in both
> >> cases, the engineers involved discovered the problem, took steps to
> >> correct it, including deleting and checking out the relevant working
> >> copies again, then thought to tell me about it - not too much evidence
> >> left to trace from.
> >> The first time I assumed that the user involved had performed a switch
> >> inadvertently, this time I am less sure.
> >> What is most puzzling is that looking at the mergeinfo properties on the
> >> branch , I see the following:
> >> Properties for <modulepath>/Branches/
> >> svn:mergeinfo <modulepath>/Branches/branchA:49494-49689
> >> <modulepath>/Branches/branchB:47790-51680
> >> <modulepath>/Branches/branchC:52621-53396
> >> <modulepath>/Trunk:54546-54710
> >> Which seems OK,
> >> But in a subdirectory, I see
> >> Properties for <modulepath>/Branches/Implementation/IlluminationManager
> >> svn:mergeinfo <modulepath>/Branches/branchA/Implementation/IlluminationManager:49494-49689
> >> <modulepath>/Branches/branchB/Implementation/IlluminationManager:47790-51680
> >> <modulepath>/Branches/branchC/Implementation/IlluminationManager:52621-53396
> >> <modulepath>/Trunk/Implementation/IlluminationManager:54546-54710*
> >> Where I expected to see no mergeinfo recorded at all, since our merges
> >> are done at the <modulepath> level only. Further, I don't know what the
> >> trailing '*' on the last property line means.
> >> If anyone could explain what the trailing '*' is for, and for extra
> >> bonus points :-) explain why the mergeinfo is set on the subdirectory, I
> >> would be quite grateful. I have looked at the subversion book for some
> >> explanation, but could find no further explanation of the '*'.
> You should probably read
> (very long article) for a thorough understanding. The '*' means
> "non-inheritable mergeinfo", which means that this mergeinfo only
> applies up to /Branches/Implementation/IlluminationManager, and will
> not be inherited by its children (i.e. these revisions from trunk were
> not merged into the subtree of
> This kind of thing can happen when working with sparse working copies,
> and merging into them. Subversion notes that it only merged those
> revisions up to /Branches/Implementation/IlluminationManager and not
> below it (see the article for an example, in the section "Mergeinfo
> Inheritance and Non-Inheritable Ranges").
> What you should also know is: once a subtree gets its own explicit
> mergeinfo, subversion needs to maintain this mergeinfo all the time,
> because it now no longer inherits the mergeinfo from the root.
> So a scenario that could explain your mergeinfo is: some user merged
> /Trunk:54546-54710 into a sparse working copy of the branch, where
> everything below /Branches/Implementation/IlluminationManager was
> excluded, and then committed this merge. The same can probably also
> happen when /Branches/Implementation/IlluminationManager is switched
> in the working copy where you are merging into. The first paragraph of
> the section "Mergeinfo Inheritance and Non-Inheritable Ranges" in the
> article says:
> "Subversion allows a working copies which are incomplete
> representations of the repository. This is possible with with shallow
> checkouts, switched subtrees, or because of authorization restrictions
> that prevent parts of a tree from being checked out. You can merge
> into an incomplete tree if you wish and Subversion endeavors to keep
> your mergeinfo accurate. It does this primarily with non-inheritable
> mergeinfo ranges."
That provides me with a likely explanation for the events - it seems
that a switch was made involving the IlluminationManager subdirectory,
which is why some code from there was checked back in to the Trunk.
I think I have 3 possibilities for this, in decreasing likelihood they
1) User error with TortoiseSVN, possibly selected switch from the menu
instead of merge at some point in time, or copied a directory by hand.
2) Our home grown automated checkout and build tool did something bad,
which left bad working copy data. This tool is a python script using the
subversion bindings, which fetches the dependencies for a project, as
specified in a configuration file.
3) TortoiseSVN left bad working copy data around during the merge
Tony Butt <tony.butt_at_cea.com.au>
Received on 2010-10-21 02:02:47 CEST