Problem:  Subversion doesn't have branches.  

Subversion has directory objects, and we Humans(tm) arbitrarily decide that 
some directories are "branches," thereby giving these directories (branches) 
magical powers and mystical significance.  Meanwhile, Subversion grinds on, 
treating those magic branches as mundane directories.

You can see the effects of this problem when you change a parent directory 
common to multiple branches, e.g. changing "/projectFoo/branches" to 
"/projectBar/branches" will cause every "branch" in "/projectBar/branches/*" to 
have a shared revision.  This complicates finding branch points 
(--stop-on-copy), finding the common ancestor, etc..

Are there any plans to address this issue or otherwise make branches a first 
class object?  Or at least add a switch to 'svn log' to skip over extraneous 
"only the parent dir path changed" revisions?

Demonstration:

$ svn mkdir -m "" ^/project1/branches
        Committed revision 73.
$ svn mkdir -m "" ^/project1/branches/alpha
        Committed revision 74.
$ svn mkdir -m "" ^/project1/branches/beta
        Committed revision 75.
$ svn log -q -v ^/project1/branches/alpha
        ------------------------------------------------------------------------
        r74 | test | 2013-05-09 15:27:49 -0400 (Thu, 09 May 2013) | 1 line
        Changed paths:
           A /project1/branches/alpha
        ------------------------------------------------------------------------
$ svn log -q -v ^/project1/branches/beta
        ------------------------------------------------------------------------
        r75 | test | 2013-05-09 15:27:50 -0400 (Thu, 09 May 2013)
        Changed paths:
           A /project1/branches/beta
        ------------------------------------------------------------------------

As you can see from the svn logs, the "alpha" and "beta" branches are 
completely independent.  They have no revisions in common.

But by renaming the parent "project1" dir to "project100", we create a linkage 
between the two:
$ svn mv -m "" ^/project1 ^/project100
        Committed revision 76.
$ svn log ^/project100/branches/alpha
        ------------------------------------------------------------------------
        r76 | test | 2013-05-09 15:29:11 -0400 (Thu, 09 May 2013)
        Changed paths:
           D /project1
           A /project100 (from /project1:75)
        ------------------------------------------------------------------------
        r74 | test | 2013-05-09 15:27:49 -0400 (Thu, 09 May 2013)
        Changed paths:
           A /project1/branches/alpha
        ------------------------------------------------------------------------

$ svn log ^/project100/branches/beta
        ------------------------------------------------------------------------
        r76 | test | 2013-05-09 15:29:11 -0400 (Thu, 09 May 2013)
        Changed paths:
           D /project1
           A /project100 (from /project1:75)
        ------------------------------------------------------------------------
        r75 | test | 2013-05-09 15:27:50 -0400 (Thu, 09 May 2013)
        Changed paths:
           A /project1/branches/beta
        ------------------------------------------------------------------------

Note that the independent branches "alpha" and "beta" now have revision 76 in 
common... even though neither branch was changed.

Adding insult to injury, "svn log --stop-on-copy" will stop on revision 76, 
i.e. it treats r76 as a branch point:

$ svn log --stop-on-copy -v ^/project100/branches/alpha
        ------------------------------------------------------------------------
        r76 | test | 2013-05-09 15:29:11 -0400 (Thu, 09 May 2013)
        Changed paths:
           D /project1
           A /project100 (from /project1:75)
        ------------------------------------------------------------------------
$ svn log --stop-on-copy -v ^/project100/branches/beta
        ------------------------------------------------------------------------
        r76 | test | 2013-05-09 15:29:11 -0400 (Thu, 09 May 2013)
        Changed paths:
           D /project1
           A /project100 (from /project1:75)
        ------------------------------------------------------------------------

As you can see, the "independent" alpha and beta branches now have revision 76 
in common.  All because Subversion doesn't have branches.

/grumble


Reply via email to