On Fri, Jan 21, 2011 at 7:19 PM, Johan Corveleyn <jcor...@gmail.com> wrote:
> On Mon, Jan 17, 2011 at 5:30 PM, krueger, Andreas (Andreas Krüger, > DV-RATIO) <andreas.krue...@hp.com> wrote: > > Hello, Daniel and all, > > > >> In other words, merging changes from file.c@BRANCH to trunk should > >> detect that file@trunk and file@BRANCH@BRANCH-CREATION are the same > >> node-revision? > > > > I think that my intended optimization should work in this case. > > But I don't think that's the condition I mean. > > > > It does not feel general enough. > > > > But then, I also don't think this has to be discussed in the context > > of this optimization proposal. After all, there is some condition > > already implemented. SVN already knows how to check > > whether a merge is possible or not in the binary case. > > > > That condition IS what I want. > > > > If a binary merge would be possible, be fast and do the binary merge > > and don't bother with text diffs. > > > > > >> but giving the question more > >> visibility (as opposed to burying it in the middle of a paragraph on > >> users@) might help you get an answer. :-) > > > > Thanks for the hint! > > > > I'd be more than willing to convert this to an issue at > > http://subversion.tigris.org/issues . > > > > Writing a self-contained script that demonstrates the performance > > problem (starting with the creation of a scratch SVN repository) - > > would that be a good next step? > > Hi Andreas, > > Yes, I think you should probably file an issue for this in the issue > tracker, referring to this thread. If you could write a self-contained > script to demonstrate, that would certainly be a good thing. > > Just to confirm your hypothesis about the special shortcut in "svn > merge" for binary files, here is the relevant excerpt from > subversion/libsvn_client/merge.c (starting at line 1454): > > [[[ > /* Special case: if a binary file's working file is > exactly identical to the 'left' side of the merge, then don't > allow svn_wc_merge to produce a conflict. Instead, just > overwrite the working file with the 'right' side of the > merge. Why'd we check for local mods above? Because we want > to do a different notification depending on whether or not > the file was locally modified. > > Alternately, if the 'left' side of the merge doesn't exist in > the repository, and the 'right' side of the merge is > identical to the WC, pretend we did the merge (a no-op). */ > if ((mimetype1 && svn_mime_type_is_binary(mimetype1)) > || (mimetype2 && svn_mime_type_is_binary(mimetype2))) > { > /* For adds, the 'left' side of the merge doesn't exist. */ > svn_boolean_t older_revision_exists = > !merge_b->add_necessitated_merge; > svn_boolean_t same_contents; > SVN_ERR(svn_io_files_contents_same_p(&same_contents, > (older_revision_exists ? > older_abspath : > yours_abspath), > mine_abspath, subpool)); > if (same_contents) > { > if (older_revision_exists && !merge_b->dry_run) > { > SVN_ERR(svn_io_file_move(yours_abspath, mine_abspath, > subpool)); > } > merge_outcome = svn_wc_merge_merged; > merge_required = FALSE; > } > } > ]]] > > See also: > > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?view=markup > > That said, I'm not so sure that we could blindly take this same > shortcut for text files. It sounds like a trivial decision, but there > might be some hidden problems if we do this. We just need to be > careful, and think this through ... > (deja vu, I've just been looking at this bit of code) For binary files, this special case causes issues (e.g. #3686), because it bypasses the general work-queue logic, and any special logic for properties does not get applied (e.g. svn:executable). This currently works for text files, since it runs the svn_client_mergeX() process. Just my $0.02. Cheers, Daniel B.