On 28.03.2013 21:38, Julian Foad wrote:
> Now with a patch for discussion.
>
> (More below...)
>
> Julian Foad wrote:
>>> Brane told me that while updating the JavaHL API he noticed that the new
>>> svn_client_merge_automatic() is Yet Another Merge API, and would prefer make
>>> the existing JavaHL merge API encompass that functionality rather than add
>>> yet another variant.  So I said if let's see if we can apply that idea to 
>>> the
>>> libsvn_client API.
>>>
>>> Idea: 'automatic' merge is (in a high level logical sense) most similar to
>>> a subset of the 'pegged' merge.  So make 'merge_peg' do the automatic merge
>>> (like calling the automatic merge API) if the params are suitable.  The
>>> intention is that this should be easier for Subversion client developers to
>>> understand and for them to DTRT.
>>>
>>> API differences between pegged and automatic merge:
>>>
>>>                 Pegged merge                 Automatic merge
>>>
>>> The 'find'API:  Single merge_peg call does   Separate'find' and 'do'..
>>>                 the whole process.           Result of 'find' ... used
>>>                                              used for 'svn mergeinfo' graph.
>>>
>>> Source:         Revision ranges X:Y[,X:Y...] Revision range 0:Y
>>>                 on branch URL@PEG            on branch URL@PEG
>>>
>>> Target:                                      optional non-WC tgt for 'find'
>>>
>>> If mergeinfo:   skip already-merged revs     (same)
>>>                 record the merge
>>>
>>> No mergeinfo:   don't skip revs              error out
>>>                 don't record
>>>
>>> Options differ: allow_mixed_rev              allow_mixed_rev
>>>                                              allow_local_mods
>>>                                              allow_switched_subtrees
>>>                 ignore_mergeinfo
>>>
>>>   At that level, it looks close enough to be feasible to embed 
>>> 'automatic' merge inside 'pegged'.  I'm looking closer now.
>>>
>>>   Any thoughts?
> Branko Čibej wrote:
>> This is pretty much the same conclusion I came to earlier today. I looks
>> like the easiest thing to do would be to make the _automatic_ APIs
>> private within libsvn_client, move the selection logic to
>> svn_client_merge_pegX, and simplify the client implementation.
>>
>> The only trouble with that is, as you say, that "svn mergeinfo" relies
>> on having the automatic_find API available. I think this could be solved
>> in several ways:
>>
>> 1. by splitting the merge-peg into two, as the current automatic-merge; or,
>> 2. by making only the "do" phase of the automatic merge private, and
>>     wile leaving the "find" phase public -- but renaming it to something
>>     more in line with merginfo discovery; or,
>> 3. somehow exposing the "find" phase through one of the existing (or
>>     revised) svn_client_mergeinfo_* APIs.
>>
>> I'm kind of leaning towards #3, but don't have a sense of how
>> complicated that would be.
> Mark Phippard wrote:
>> There are obviously some benefits for having less API, especially when
>> it comes time to rev it for something.  That said, as a caller of the
>> API, it seems nice that the separate "automatic merge" API can provide
>> a more focused and simpler interface.  For example, the interface does
>> not need to expose things like a revision range, which should not
>> apply when doing this kind of merge, but obviously is needed when
>> doing a cherry-pick merge.
>>
>> Looking through a long list of API is hard sometime, but it is also
>> hard when you want to do something like merge everything in BranchX
>> and the interface requires passing a bunch of parameters that do not
>> directly apply.
> I like the focused API, but I also see how the automatic merge can be 
> considered to fill in a bit of missing functionality that merge_peg ought to 
> provide.
>
> Perhaps we can have both.  Teach merge_peg to DTRT in this case, and still 
> have the focused API available for when a client knows it wants an automatic 
> merge.  Is there sufficient merit in that to outweigh the overhead of having 
> to test two similar but different entry points?
>
> The attached patch moves the decision to call the 'automatic merge' API from 
> 'svn' into 'svn_merge_peg5()'.  I have run some merge tests and tree conflict 
> tests, but not the whole test suite yet.  Here is the log msg.
>
> [[[
> Teach svn_client_merge_peg5() to do an automatic merge, and let 'svn merge'
> rely on that instead of calling the dedicated automatic merge APIs.
>
> TODO: Decide whether to keep or make private the 'automatic merge' APIs.
> TODO: This reduces the verbosity of 'svn merge --verbose'. Consider
>   doing something about it, perhaps by adding some new notifications for the
>   notifier callback?
>
> * subversion/include/svn_client.h,
>   subversion/libsvn_client/merge.c
>   (svn_client_merge_peg5): Do an automatic merge if no revision range
>     specified.
>
> * subversion/svn/merge-cmd.c
>   (automatic_merge): Delete.
>   (run_merge): Don't take special action to handle an automatic merge, let
>     the pegged merge code path handle it.
> ]]]
>
> Thoughts?

I like it. Apparently the encapsulation is even simpler than I expected.

For JavaHL, a simple overload of ISVNClient.merge can provide the
"focused" interface without inventing yet another type of merge API.
Even better, passing null for the revision ranges in the existing
merge-peg overload can be made to yield the same effect, without
affecting the API signature at all. (Currently IIUC passing a null
ranges array will cause an error.)

-- Brane


-- 
Branko Čibej
Director of Subversion | WANdisco | www.wandisco.com

Reply via email to