On Tue, 27 Mar 2007, Daniel Rall wrote:
> On Tue, 27 Mar 2007, Paul Burba wrote:
> 
> > The current notification behavior when merging into a target with child
> > file paths that contain their own merge info seems a bit off when those
> > children are unaffected by the merge:
> > 
> > An example will probably make what I'm trying to say clearer:
> > 
> > Starting with a standard test suite greek tree:
> > 
> > 
> > 1) Make a branch and commit it
> > ------------------------------
> > >set
> > URL=file:///C:/SVN/src-trunk/Release/subversion/tests/cmdline/svn-test-w
> > ork/repositories/merge_tests-1
> > 
> > >svn copy %URL%/A/D merge_tests-1/A/D_COPY
> > A    merge_tests-1\A\D_COPY\gamma
> > A    merge_tests-1\A\D_COPY\G
> > A    merge_tests-1\A\D_COPY\G\pi
> > A    merge_tests-1\A\D_COPY\G\rho
> > A    merge_tests-1\A\D_COPY\G\tau
> > A    merge_tests-1\A\D_COPY\H
> > A    merge_tests-1\A\D_COPY\H\chi
> > A    merge_tests-1\A\D_COPY\H\omega
> > A    merge_tests-1\A\D_COPY\H\psi
> > Checked out revision 1.
> > A         merge_tests-1\A\D_COPY
> > 
> > >svn ci -m "" merge_tests-1
> > Adding         merge_tests-1\A\D_COPY
> > 
> > Committed revision 2.
> > 
> > 
> > 2) Make two mods to the source of the branch
> > --------------------------------------------
> > >echo new content > merge_tests-1\A\D\H\chi
> > 
> > >svn ci -m "" merge_tests-1
> > Sending        merge_tests-1\A\D\H\chi
> > Transmitting file data .
> > Committed revision 3.
> > 
> > >echo new content > merge_tests-1\A\D\G\rho
> > 
> > >svn ci -m "" merge_tests-1
> > Sending        merge_tests-1\A\D\G\rho
> > Transmitting file data .
> > Committed revision 4.
> > 
> > 
> > 4) Merge one of the mods into a branch
> >    target unaffected by the merge.  Note
> >    that there are no notifications, but the
> >    mergeinfo on the target is appropriately
> >    updated.
> > ------------------------------------------
> > >svn merge %URL%/A/D/G merge_tests-1\A\D_COPY\G -c3
> > 
> > >svn pl -vR merge_tests-1
> > Properties on 'merge_tests-1\A\D_COPY':
> >   svn:mergeinfo : /A/D:1
> > Properties on 'merge_tests-1\A\D_COPY\G':
> >   svn:mergeinfo : /A/D/G:1,3
> > 
> > 
> > 5) Revert the previous merge
> > ----------------------------
> > >svn revert -R merge_tests-1
> > Reverted 'merge_tests-1\A\D_COPY\G'
> > 
> > 
> > 6) Now merge the other mod into the same
> >    target, one of the target's children is
> >    affected this time and we get an
> >    appropriate notification and mergeinfo.
> > ------------------------------------------
> > >svn merge %URL%/A/D/G/rho merge_tests-1\A\D_COPY\G\rho -c4
> > U    merge_tests-1\A\D_COPY\G\rho
> > 
> > >svn pl -vR merge_tests-1
> > Properties on 'merge_tests-1\A\D_COPY':
> >   svn:mergeinfo : /A/D:1
> > Properties on 'merge_tests-1\A\D_COPY\G\rho':
> >   svn:mergeinfo : /A/D/G/rho:1,4
> > 
> > 
> > 7) Now repeat the first merge we performed,
> >    the mergeinfo is set correctly, but we get
> >    a notification that rho is mer'G'ed which
> >    isn't true since r3 doesn't affect rho.
> > ------------------------------------------
> > >svn merge %URL%/A/D/G merge_tests-1\A\D_COPY\G -c3
> > G    merge_tests-1\A\D_COPY\G\rho
> > 
> > >svn pl -vR merge_tests-1
> > Properties on 'merge_tests-1\A\D_COPY':
> >   svn:mergeinfo : /A/D:1
> > Properties on 'merge_tests-1\A\D_COPY\G':
> >   svn:mergeinfo : /A/D/G:1,3
> > Properties on 'merge_tests-1\A\D_COPY\G\rho':
> >   svn:mergeinfo : /A/D/G/rho:1,3-4
> > 
> > Note: If the target child is a directory the 'G' notification doesn't
> > occur.
> >  
> > So, should the notification in 7) not occur?  If so I'll add this to the
> > "Handle notifications resulting from a merge." section in
> > http://svn.collab.net/repos/svn/trunk/notes/merge-tracking.txt and/or
> > look into a fix.
> 
> Paul, the notification from step #7 shouldn't occur.  I'd hazard a
> guess that the notification is related to the way handling for
> sub-tree merge info performs a separate editor drive for children of
> the target of a merge which have their own merge info, likely in
> conjunction with the fact that this is a single file.
From reading the code, this seems to be it.
> Usage of the "text_state" local variable in
> libsvn_client/merge.c:do_single_file_merge(), where we explicitly
> invoke notification_receiver(), seems interesting.
...
do_single_file_merge() calls merge_file_changed(), which sets
text_state.  merge_file_changed() in turn calls svn_wc_text_modified_p()
to detect whether the target WC path has any local mods.  The local
mods from the merge in step #6 are detected, and the notification is
set accordingly:
          else if (has_local_mods)
            *content_state = svn_wc_notify_state_merged;
Since no merge actually occurs to "rho" during step #7, I still think
we need a way to silence this notification for this particular case.
If everyone agrees with this, we can special-case the way
discover_and_merge_children() calls do_single_file_merge() (e.g. drill
another flag into do_single_file_merge() for whether or not to send
notifications for this case).
- application/pgp-signature attachment: stored
 
 
Received on Tue Mar 27 20:55:52 2007