subversion-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stefan Kueng <tortoise...@gmail.com>
Subject Re: wish for new API or extended one
Date Tue, 07 Feb 2017 21:21:04 GMT


On 07.02.2017 21:34, Stefan Sperling wrote:
> On Tue, Feb 07, 2017 at 08:17:41PM +0100, Stefan Kueng wrote:
>> I figured out the problem:
>> to get updated descriptions, I have to call
>> svn_client_conflict_tree_get_resolution_options() again to get new updated
>> options. I can't just get the description from the option I set the move
>> target index to.
>>
>> this won't work:
>> svn_client_conflict_option_set_moved_to_abspath(opt, j, m_pctx,
>> scratchpool);
>>
>> label = svn_client_conflict_option_get_label(opt, scratchpool);
>> description = svn_client_conflict_option_get_description(opt, scratchpool);
>>
>>
>> but this works:
>> svn_client_conflict_option_set_moved_to_abspath(opt, j, m_pctx,
>> scratchpool);
>>
>> // now get the resolution options again, so the label/description is
>> // properly updated.
>> apr_array_header_t *opts;
>> SVNTRACE(
>>     Err = svn_client_conflict_tree_get_resolution_options(&opts, m_conflict,
>>                                                           m_pctx,
>> result.GetPool(), scratchpool),
>>     path
>> );
>> auto o = svn_client_conflict_option_find_by_id(opts, id);
>>
>> label = svn_client_conflict_option_get_label(o, scratchpool);
>> description = svn_client_conflict_option_get_description(o, scratchpool);
>>
>>
>> maybe the docs should be updated to say that a call to
>> svn_client_conflict_tree_get_resolution_options is required to get updated
>> strings?
>
> I'm guessing that you are mixing up repository paths and working copy paths.
> Perhaps your expectation is that a repository-side path in the conflict
> description is changed by svn_client_conflict_option_set_moved_to_abspath()?
> If you do, then the API's behaviour will seem confusing indeed.
>
> There are two kinds of paths which can be selected:
>
> svn_client_conflict_option_set_moved_to_repos_relpath() selects the
> repository path which corresponds to the move target. This is the important
> path to worry about. In the example I gave earlier, this selects between
> '^/trunk/alpha2' and '^/trunk/alpha3'.
> Your examples don't seem to be calling this function.

Sorry, my mistake: I copied the wrong part of the code above. Here's 
what I'm doing now:


apr_array_header_t *possible_moved_to_repos_relpaths = nullptr;
Err = svn_client_conflict_option_get_moved_to_repos_relpath_candidates
         (&possible_moved_to_repos_relpaths, opt, result.GetPool(), 
scratchpool);

if ((Err == nullptr) && possible_moved_to_repos_relpaths &&
                         (possible_moved_to_repos_relpaths->nelts > 1))
{
     for (int j = 0; j < possible_moved_to_repos_relpaths->nelts; ++j)
     {
         svn_client_conflict_option_set_moved_to_repos_relpath(opt, j,
                                                               scratchpool);

         // now get the resolution options again, so the 
label/description is
         // properly updated.
         // Note: without this, the label and description text is NOT 
updated!
	// calling svn_client_conflict_option_get_description on 'opt'
	// instead of 'o' will get the existing description, not the
	// updated one, even though we set the move index on 'opt'.
         apr_array_header_t *opts;
         SVNTRACE(
             Err = svn_client_conflict_tree_get_resolution_options(&opts,
                     m_conflict, m_pctx, result.GetPool(), scratchpool),
             path
         );
         auto o = svn_client_conflict_option_find_by_id(opts, id);

         if (0 == nullptr)
             continue;

         label = svn_client_conflict_option_get_label(o, scratchpool);
         description = svn_client_conflict_option_get_description(o,
                                                         scratchpool);

         result.push_back(std::unique_ptr<SVNConflictOption>(new
                                           SVNConflictOption(o, id,
             CUnicodeUtils::GetUnicode(label),
             CUnicodeUtils::GetUnicode(description), -1, j)));
         bResultAdded = true;
     }
}


But as I mentioned: without getting the options again with 
svn_client_conflict_tree_get_resolution_options, the strings are not 
updated. If you look at the svn code: the 
svn_client_conflict_option_set_moved_to_repos_relpath call sets the 
index to the options object, but does *not* update the strings, and 
svn_client_conflict_option_get_description just returns the already 
created string.

Stefan


-- 
        ___
   oo  // \\      "De Chelonian Mobile"
  (_,\/ \_/ \     TortoiseSVN
    \ \_/_\_/>    The coolest interface to (Sub)version control
    /_/   \_\     http://tortoisesvn.net

Mime
View raw message