I'm just trying to follow some existing code. The comment that I'm adding in this pseudo-patch is a stalled attempt to describe the following code block.
[[[
/* Helper for do_file_merge and do_directory_merge (by way of
populate_remaining_ranges() for the latter).
Determine what portions of SOURCE have already been merged
to CHILD->ABSPATH and populate CHILD->REMAINING_RANGES with
the ranges that still need merging.
[...] TARGET_MERGEINFO is the working mergeinfo on CHILD.
[...]
*/
static svn_error_t *
calculate_remaining_ranges(svn_client__merge_path_t *parent,
svn_client__merge_path_t *child,
const merge_source_t *source,
svn_mergeinfo_t target_mergeinfo,
const apr_array_header_t *implicit_src_gap,
svn_boolean_t child_inherits_implicit,
svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *mergeinfo_path;
const char *primary_url = (source->loc1->rev < source->loc2->rev)
? source->loc2->url : source->loc1->url;
svn_mergeinfo_t adjusted_target_mergeinfo = NULL;
svn_revnum_t child_base_revision;
/* Determine which of the requested ranges to consider merging... */
SVN_ERR(svn_ra__get_fspath_relative_to_root(ra_session, &mergeinfo_path,
primary_url, result_pool));
+ /* [Let's see if we can describe the following if-else block.]
+
+ Set ADJUSTED_TARGET_MERGEINFO to ... let's see ... in some cases,
+ the portion of CHILD's pre-merge mergeinfo that represents merges
+ from the branch-segment SOURCE. If CHILD has no mergeinfo that
+ refers to SOURCE, this could leave it as NULL or set it to an
+ empty hash. In other cases, set it to TARGET_MERGEINFO -- that is,
+ CHILD's current working mergeinfo, in its entirety.
+
+ [That doesn't seem too coherent. Maybe we can better describe this
+ code block in terms of preparing for the next step:]
+
+ We need to pass mergeinfo in to filter_merged_revisions(), which says
+ its TARGET_MERGEINFO input should be "the CHILD->ABSPATH's explicit
+ or inherited mergeinfo [NULL if none, empty if empty]". So ...
+
+ [But we're calculating something more specific here. The doc string on
+ filter_merged_revisions() doesn't say, but apparent from this code (its
+ only caller) is that it should not always be passed the whole mergeinfo
+ of CHILD.]
+ */
/* Consider: CHILD might have explicit mergeinfo '/MERGEINFO_PATH:M-N'
where M-N fall into the gap in SOURCE's natural
history allowed by 'MERGEINFO MERGE SOURCE NORMALIZATION'. If this is
the case, then '/MERGEINFO_PATH:N' actually refers to a completely
different line of history than SOURCE and we
*don't* want to consider those revisions merged already. */
if (implicit_src_gap && child->pre_merge_mergeinfo)
{
apr_array_header_t *explicit_mergeinfo_gap_ranges =
apr_hash_get(child->pre_merge_mergeinfo, mergeinfo_path,
APR_HASH_KEY_STRING);
if (explicit_mergeinfo_gap_ranges)
{
svn_mergeinfo_t gap_mergeinfo = apr_hash_make(scratch_pool);
apr_hash_set(gap_mergeinfo, mergeinfo_path, APR_HASH_KEY_STRING,
implicit_src_gap);
SVN_ERR(svn_mergeinfo_remove2(&adjusted_target_mergeinfo,
gap_mergeinfo, target_mergeinfo,
FALSE, result_pool, scratch_pool));
}
}
else
{
adjusted_target_mergeinfo = target_mergeinfo;
}
/* Initialize CHILD->REMAINING_RANGES and filter out revisions already
merged (or, in the case of reverse merges, ranges not yet merged). */
SVN_ERR(filter_merged_revisions(parent, child, mergeinfo_path,
adjusted_target_mergeinfo,
source->loc1->rev, source->loc2->rev,
child_inherits_implicit,
ra_session, ctx, result_pool,
scratch_pool));
[...]
}
- Julian
Received on 2012-05-01 10:53:42 CEST