On Mon, Dec 12, 2011 at 5:51 AM, Julian Foad <julianf...@btopenworld.com> wrote:
> Responses in-line, but first a reminder of why I'm doing this.
>
> It's because I've been looking at making 'svn merge' give better diagnostics 
> and confirmations.

+1 to the spirit of that!

> Things like issuing an error or warning if the source and target are in fact 
> the same 'branch', or if the user is trying to reintegrate in the wrong 
> direction (the same direction as some sync merges have been done).  To do 
> this, the client needs to ask questions like 'what branches and revisions 
> would this merge affect?' before executing the merge.  Similar issues apply 
> to all kinds of merges, but I happen to have taken the reintegrate first, 
> since it's known to be a wrapper for a two-URL merge.
>
> I expect kind of control this would be especially valuable for GUIs, and I 
> would appreciate feedback on this matter.
>
> I don't suggest that every client should be required to execute the steps 
> separately.  I think we should keep the 'svn_client_merge_reintegrate' API as 
> a shortcut, and not deprecate it.

+1

> Opinions welcome.
>
> Daniel Shahaf wrote:
>
>> OK.  I can't find reintegrate_merge_locked(),
>
>
> Oops, I meant 'merge_reintegrate_locked'.
>
> And:
>> Julian Foad wrote:
>>>  >
>>>  >     svn_client_find_reintegrate_merge(&url1, &rev1, &url2, &rev2, ...);
>>>  >     svn_client_merge4(url1, rev1, url2, rev2, ...);
>>>
>>>  One issue is that there is some duplication of work in this
>>>  formulation.  Both of these functions check that the target WC is
>>>  suitable for merging into.  Both open up RA sessions.  Both determine
>>>  the youngest common ancestor.
>>
>> I don't think "opening an RA session" is a problem for a function
>> that's about to do a merge operation :)
>
> Yes, even for a small merge the cost of that can't be of much importance.
>
>> Checking the WC's sanity, presumably that's necessary since the WC may
>> be modified after svn_client_find_reintegrate_merge() but before
>> svn_client_merge4()?  Especially if the user is prompted to +1 the
>> output of svn_client_find_reintegrate_merge() before the actual merge
>> is done.  (and then goes to lunch, comes back, makes some commits, finds
>> a loose TSVN dialog and OKs it)
>
> Good thoughts.  The current situation in this patch (v2) is that step 1 
> (_find_reintegrate_merge) checks the WC is:
>
>   * single-revision
>   * unmodified
>   * unswitched
>
> and step 2 (_merge4) checks the WC is:
>
>   * single-revision
>
> because that's all that a normal (non-reintegrate) invocation of 
> svn_client_merge4() needs.
>
> If step 2 could repeat the same check as step 1, that would be useful for 
> your scenario, but otherwise there's little point in step 2 doing a partial 
> check.  So for now I'll take the simple solution which is to call 
> svn_client_merge4(allow_mixed_rev=TRUE) to bypass the check.
>
> If and when we want to perform the full check in step 2, then we'll want to 
> alter svn_client_merge4() in some way to provide more control over those 
> checks, or else expose the check function separately.  The best way might 
> become clearer with further work on the APIs.

Agreed, this can be dealt with later (if it needs to be dealt with at all).

Overall I think this patch looks good.  The only problem I see is:

> Index: subversion/svn/merge-cmd.c
> ===================================================================
> --- subversion/svn/merge-cmd.c  (revision 1213025)
> +++ subversion/svn/merge-cmd.c  (working copy)
> @@ -39,6 +39,59 @@
>
>  /*** Code. ***/
>
> +/* Do a reintegrate merge from SOURCE_PATH_OR_URL@SOURCE_PEG_REVISION into
> + * TARGET_WCPATH.  Do it with a WC write lock unless DRY_RUN is true. */
> +static svn_error_t *
> +merge_reintegrate(const char *source_path_or_url,
> +                  const svn_opt_revision_t *source_peg_revision,
> +                  const char *target_wcpath,
> +                  svn_boolean_t dry_run,
> +                  svn_boolean_t quiet,
> +                  const apr_array_header_t *merge_options,
> +                  svn_client_ctx_t *ctx,
> +                  apr_pool_t *scratch_pool)
> +{
> +  const char *url1, *url2;
> +  svn_revnum_t rev1, rev2;
> +
> +  SVN_ERR(svn_client_find_reintegrate_merge(
> +            &url1, &rev1, &url2, &rev2,
> +            source_path_or_url, source_peg_revision, target_wcpath,
> +            ctx, scratch_pool, scratch_pool));

svn_client_find_reintegrate_merge() takes an absolute WC path, but we
might be passing it a relative path here.  That will ultimately cause
an assertion in wc_db.c:

svn: E235000: In file '..\..\..\subversion\libsvn_wc\wc_db.c' line
7173: assertion failed (svn_dirent_is_absolute(local_abspath))

Paul

Reply via email to