tks i will do that :)

在2024年6月18日星期二 UTC+8 19:48:33<daniel.l...@gmail.com> 写道:

> Since this concerns the Subversion library, please re-send this message to 
> d...@subversion.apache.org.
>
> Kind regards,
> Daniel
>
> tisdag 18 juni 2024 kl. 10:09:53 UTC+2 skrev iceyu...@gmail.com:
>
>> Hello,
>>
>> Recently, we encountered a bug while using mergeinfo in SVN. Here is an 
>> example:
>> Our source branch has the following branch changes (through copy or 
>> rename) history:
>>
>>    - Branch 1: /products/xy1/develop/mos2/trunk, revision a-b
>>    - Branch 2: /products/xy1/develop/mos2/server, revision b-c
>>    - Branch 3: 
>>    /products/xy1/develop/mos2/server/branches/zlp_20240306, revision c-d
>>    
>> From the current code, in the svn_client__mergeinfo_log function, when 
>> constructing merge_source_fspaths, all the changed branches are added to 
>> merge_source_fspaths: 
>> ```
>> for (hi = apr_hash_first(scratch_pool, source_history);
>>   hi;
>>   hi = apr_hash_next(hi))
>> {
>>  const char *key = apr_hash_this_key(hi);
>>  svn_rangelist_t *subtree_merged_rangelist = apr_hash_this_val(hi);
>>  svn_rangelist_t *intersecting_rangelist;
>>
>>  svn_pool_clear(iterpool);
>>  SVN_ERR(svn_rangelist_intersect(&intersecting_rangelist,
>>                                  youngest_rangelist,
>>                                  subtree_merged_rangelist,
>>                                  FALSE, iterpool));
>>
>>  APR_ARRAY_PUSH(merge_source_fspaths, const char *) = key;
>>
>>  if (intersecting_rangelist->nelts)
>>    log_target = key;
>> }
>> ```
>> In filter_log_entry_with_rangelist function, when searching for the 
>> changed_path for each revision, there is some code based on 
>> merge_source_fspaths to match the common prefix and calculate the relative 
>> path as follows:
>> ```
>> for (i = 0; i merge_source_fspaths->nelts; i++)
>> {
>>  merge_source_fspath = APR_ARRAY_IDX(fleb->merge_source_fspaths,
>>                                      i, const char *);
>>
>>  merge_source_rel_target
>>    = svn_fspath__skip_ancestor(merge_source_fspath, path);
>>    …
>> ```
>> When a revision has a changed_path such as 
>> /products/xy1/develop/mos2/server/branches/zlp_20240306/engine/src/gameplay/mosprop/src/prop_desc.cpp,
>>  
>> its corresponding merge_source is 
>> /products/xy1/develop/mos2/server/branches/zlp_20240306. However, due to 
>> the fact that the for-loop does not guarantee order, if merge_source_fspath 
>> first matches /products/xy1/develop/mos2/server, it will still proceed with 
>> the subsequent processing because of the common prefix, eventually 
>> obtaining an incorrect relative path merge_source_rel_target, leading to an 
>> incorrect judgment in the subsequent steps.
>>
>> One modification approach is, since when calling 
>> logs_for_mergeinfo_rangelist in the svn_client__mergeinfo_log function, the 
>> revision range of master_inheritable_rangelist is used:
>> ```
>> --- a/ext/Subversion/subversion/libsvn_client/mergeinfo.c
>> +++ b/ext/Subversion/subversion/libsvn_client/mergeinfo.c
>> @@ -2139,6 +2139,7 @@ svn_client__mergeinfo_log(svn_boolean_t 
>> finding_merged,
>>           const char *key = apr_hash_this_key(hi);
>>           svn_rangelist_t *subtree_merged_rangelist = 
>> apr_hash_this_val(hi);
>>           svn_rangelist_t *intersecting_rangelist;
>> +          svn_rangelist_t *intersecting_rangelist_merge_source_filter;
>>
>>           svn_pool_clear(iterpool);
>>           SVN_ERR(svn_rangelist_intersect(&intersecting_rangelist,
>> @@ -2146,7 +2147,13 @@ svn_client__mergeinfo_log(svn_boolean_t 
>> finding_merged,
>>                                           subtree_merged_rangelist,
>>                                           FALSE, iterpool));
>>
>> -          APR_ARRAY_PUSH(merge_source_fspaths, const char *) = key;
>> +         
>>  SVN_ERR(svn_rangelist_intersect(&intersecting_rangelist_merge_source_filter,
>> +                                          master_inheritable_rangelist,
>> +                                          subtree_merged_rangelist,
>> +                                          FALSE, iterpool));
>> +
>> +          if (intersecting_rangelist_merge_source_filter->nelts)
>> +            APR_ARRAY_PUSH(merge_source_fspaths, const char *) = key;
>>
>>           if (intersecting_rangelist->nelts)
>>             log_target = key;
>> ```
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"TortoiseSVN" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to tortoisesvn+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tortoisesvn/720bf000-d035-40fa-adb6-a4881f446e7cn%40googlegroups.com.

Reply via email to