cleaning up mergeinfo using svn 1.7

2011-09-09 Thread David Carson
We have a repository that is seriously cluttered with the svn:mergeinfo
property.  I don't believe we ever used the buggy 1.5.x versions that added
the property erroneously (although I could be wrong).  However, due to a lax
policy regarding where merges should occur, the property is now attached to
files and directories all over the place.  For example, when a user wants to
double-commit his one-file change from release 1.3 to 1.2, he merges the
change from the top-level of the 1.3 branch into the 1.2 branch and commits.
 The change in 1.2 appears as one text change and *137 property changes*!

Note that one complication is the fact that some users have mistakenly
committed only the file changes and the top-level directory prop change, but
have left the rest of the property changes uncommitted.

I was hoping that the improvements in this area that are coming in 1.7 would
allow us to continue to use this polluted repository, because even though it
would not clean up the mess, it would not continue to create merges that
look much larger than they are (due to the numerous superfluous property
changes).

To that end, I installed 1.7.0-rc2 with a snapshot of our repository, so I
could experiment and see for myself.  I did a simple merge from one branch
to another.  I was disappointed to see that the same miscellaneous group of
files and directories below the top-level are having their snv:mergeinfo
modified, even though they do not participate in the change.  I guess I am
not reading the documentation for 1.7 correctly, because I thought that this
was one of the major changes; namely, that any object which is not affected
by the merged changes would not have its svn:mergeinfo property changed.

In my test, all files and directories that *currently* have svn:mergeinfo
attached get the updated info from the merge being performed.  This means
that the backport of my one-file change looks like a much larger change.

Here are my questions:

   1. Assuming I don't clean up the repository, what help can I expect from
   1.7 in terms of new merges?  In other words, explain the behavior I should
   expect, given the state of my repository now and the test I performed above.
   2. What other methods are recommended if 1.7 will not do what I'm hoping
   for?  Are there any good cleanup scripts to help scrub the whole tree?  (I
   tried mergeinfo-sanitize, to see what it was, but it did not allow me to
   authenticate??)
   3. If I decide to simply prohibit users from making changes to
   svn:mergeinfo on any object besides the top-level directory itself, what are
   the unforeseen consequences that I need to worry about?  For *this third
   question, *I'm not so concerned about information that might be lost
   during cleanup, although I know that is a huge issue.  I'm more interested
   in the limitations this might place on us in the future, assuming we can
   clean up the tree completely so that *only* the top-level directory has
   svn:mergeinfo attached to it.  For example, if a user commits two fixes
   using a single commit on 1.3, then wants to backport one of those fixes to
   1.2, can the mergeinfo -- limited to only the top-level directory --
   maintain all the information needed?


Thanks,
David


Re: cleaning up mergeinfo using svn 1.7

2011-09-09 Thread David Carson
On Fri, Sep 9, 2011 at 12:38 PM, Stefan Sperling  wrote:

> On Fri, Sep 09, 2011 at 12:17:15PM -0400, David Carson wrote:
> > To that end, I installed 1.7.0-rc2 with a snapshot of our repository, so
> I
> > could experiment and see for myself.  I did a simple merge from one
> branch
> > to another.  I was disappointed to see that the same miscellaneous group
> of
> > files and directories below the top-level are having their snv:mergeinfo
> > modified, even though they do not participate in the change.  I guess I
> am
> > not reading the documentation for 1.7 correctly, because I thought that
> this
> > was one of the major changes; namely, that any object which is not
> affected
> > by the merged changes would not have its svn:mergeinfo property changed.
>
> Did the change you were merging contain svn:mergeinfo property changes?
> If so, those will be applied to the working copy.
>
> If the revision rN you are merging from 1.2 into 1.3 was itself the
> result of a merge, and this merge was done with a 1.6 client,
> this would explain the problem.
>

Bingo -- that makes sense.  In my test, I updated a child branch with new
parent content and that range of revisions contained one that was itself a
merge which was performed using svn 1.6 (i.e., before taking the snapshot of
the repository).

OK, so let's try again.  I've merged a change from another branch, which is
a commit with a single file changed.  The result is much better, but let me
verify that I understand my results:
- file a/b/c/foo.c shows the file changes -- OK
- file a/b/c/foo.c also contains svn:mergeinfo changes -- I assume this is
because it happens to be one of the many files that got contaminated with
the property prior to this test.  So, since it is part of the changeset for
my merge, the prop has to be updated too.
-  directory (call it TLD/) contains svn:mergeinfo changes -- OK
- TLD/a also contains svn:mergeinfo changes -- Same as above.  Directory
TLD/a is one of the directories which was previously contaminated, and since
this path is 'involved' in the change, the prop has to be updated.  I
wouldn't say the path really involved, except that it is the path on wich
foo.c sits.  After all, TLD/a/ is not itself changed.  Nonetheless, I can
live with this.

Now, are there any tools to aid in cleanup of the mess?  Besides the large
number of files/dirs with the prop attached, the prop itself has a large
number of paths to contend with.


Re: cleaning up mergeinfo using svn 1.7

2011-09-12 Thread David Carson
On Fri, Sep 9, 2011 at 6:40 PM, Stefan Sperling  wrote:

> On Fri, Sep 09, 2011 at 03:00:53PM -0400, David Carson wrote:
> > OK, so let's try again.  I've merged a change from another branch, which
> is
> > a commit with a single file changed.  The result is much better, but let
> me
> > verify that I understand my results:
> > - file a/b/c/foo.c shows the file changes -- OK
> > - file a/b/c/foo.c also contains svn:mergeinfo changes -- I assume this
> is
> > because it happens to be one of the many files that got contaminated with
> > the property prior to this test.  So, since it is part of the changeset
> for
> > my merge, the prop has to be updated too.
> > -  directory (call it TLD/) contains svn:mergeinfo changes --
> OK
> > - TLD/a also contains svn:mergeinfo changes -- Same as above.  Directory
> > TLD/a is one of the directories which was previously contaminated, and
> since
> > this path is 'involved' in the change, the prop has to be updated.  I
> > wouldn't say the path really involved, except that it is the path on wich
> > foo.c sits.  After all, TLD/a/ is not itself changed.  Nonetheless, I can
> > live with this.
>
> This is because it's not about which "objects" (as you called them ealier)
> are affected by the merge, but which subtrees of the merge target are
> affected.
>
> In your case, it looks as if the target of the merge is the working copy
> root.  An affected subtree of the root is a, an affected subtree
> of a is b, and so on, until you get to foo.c.
>

OK, then it seems to be working as I expect it to.


>
> If you merge from ^/branch/a/b/c/foo.c into wc-path/a/b/c/foo.c
> only foo.c should receive mergeinfo updates, because it is the
> merge target and has no children.
>

Ironically, that is what got us in this mess in the first place (merging at
various locations in the tree).  I think what I want eventually is a tree
where ONLY the top-level directory has any svn:mergeinfo.


>
> > Now, are there any tools to aid in cleanup of the mess?  Besides the
> large
> > number of files/dirs with the prop attached, the prop itself has a large
> > number of paths to contend with.
>
> There doesn't seem to be any officially sanctioned script.
>
> There are various scripts people have written and posted to this list.
> One is here: http://svn.haxx.se/dev/archive-2009-05/0438.shtml
> You could try the archive search on svn.haxx.se -- maybe you'll find
> something useful.
>
> However, I would say that the need for such a script implies a lack
> of functionality in Subversion itself. 'svn merge' does try to elide
> mergeinfo when subtree mergeinfo becomes redundant, but AFAIK the
> current implementation is a bit simplistic.
> It would help if you could present examples where elision does not
> work for you, so we can fix 'svn merge'.
>
> We could allow the existing elision code to be invoked without running
> a merge. An option like --elide-mergeinfo could be added to the
> 'svn mergeinfo' command for this purpose. Would this be useful?
>

Yes, I think such an option would probably be useful.  What I really need,
based on how much information is currently in my props, is something like:
- try to elide (maybe using your new option)
- output says you can't because you are missing a, b and c; suggests I use
--record-only or do the missing merge if it is really missing
Then I can iterate over this sequence until I succeed and the elision
occurs.

Thanks.