You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2015/07/24 18:02:42 UTC
svn commit: r1692546 - in
/subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer:
logic.c svn-mergeinfo-normalizer.c
Author: stefan2
Date: Fri Jul 24 16:02:42 2015
New Revision: 1692546
URL: http://svn.apache.org/r1692546
Log:
On the svn-mergeinfo-normalizer branch:
Detect non-recursive ranges. For now, they will prevent branch elision.
* tools/client-side/svn-mergeinfo-normalizer/logic.c
(find_non_recursive_ranges,
show_non_recursive_ranges): New functions.
(remove_lines): Detect and report non-recursive ranges for the node
_and_ the parent. Don't ignore recursiveness in rev
range arithmetics.
* tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
(svn_min__cmd_table): Extend the docstring for the 'normalize' sub-command
to cover the new elision messages.
Modified:
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/logic.c
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
Modified: subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/logic.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/logic.c?rev=1692546&r1=1692545&r2=1692546&view=diff
==============================================================================
--- subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/logic.c (original)
+++ subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/logic.c Fri Jul 24 16:02:42 2015
@@ -61,6 +61,25 @@ find_reverse_ranges(svn_rangelist_t *ran
return result;
}
+static svn_rangelist_t *
+find_non_recursive_ranges(svn_rangelist_t *ranges,
+ apr_pool_t *result_pool)
+{
+ svn_rangelist_t *result = apr_array_make(result_pool, 0, ranges->elt_size);
+
+ int i;
+ for (i = 0; i < ranges->nelts; ++i)
+ {
+ const svn_merge_range_t *range
+ = APR_ARRAY_IDX(ranges, i, const svn_merge_range_t *);
+
+ if (!range->inheritable)
+ APR_ARRAY_PUSH(result, const svn_merge_range_t *) = range;
+ }
+
+ return result;
+}
+
static svn_error_t *
print_ranges(svn_rangelist_t *ranges,
const char *title,
@@ -117,6 +136,26 @@ show_reverse_ranges(const char *subtree_
}
static svn_error_t *
+show_non_recursive_ranges(const char *subtree_path,
+ svn_rangelist_t *non_recursive_ranges,
+ svn_min__opt_state_t *opt_state,
+ apr_pool_t *scratch_pool)
+{
+ if (non_recursive_ranges->nelts)
+ return SVN_NO_ERROR;
+
+ if (opt_state->verbose || opt_state->run_analysis)
+ {
+ SVN_ERR(svn_cmdline_printf(scratch_pool,
+ _(" NON-RECURSIVE RANGE(S) found for %s:\n"),
+ subtree_path));
+ SVN_ERR(print_ranges(non_recursive_ranges, "", scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
show_branch_elision(const char *branch,
svn_rangelist_t *subtree_only,
svn_rangelist_t *parent_only,
@@ -400,7 +439,8 @@ remove_lines(svn_min__log_t *log,
for (i = 0; i < sorted_mi->nelts; ++i)
{
const char *parent_path, *subtree_path, *parent_fs_path;
- svn_rangelist_t *parent_ranges, *subtree_ranges, *reverse_ranges;
+ svn_rangelist_t *parent_ranges, *subtree_ranges;
+ svn_rangelist_t *reverse_ranges, *non_recursive_ranges;
svn_rangelist_t *subtree_only, *parent_only;
svn_rangelist_t *operative_outside_subtree, *operative_in_subtree;
svn_rangelist_t *implied_in_subtree, *implied_in_parent;
@@ -462,10 +502,50 @@ remove_lines(svn_min__log_t *log,
continue;
}
+ /* We don't know how to handle reverse ranges (there should be none).
+ So, we must check for them - just to be sure. */
+ non_recursive_ranges = find_non_recursive_ranges(subtree_ranges,
+ iterpool);
+ if (non_recursive_ranges->nelts)
+ {
+ /* We really found non-recursive merges?
+ Try to get rid of them. */
+ SVN_ERR(remove_obsolete_line(&deleted, lookup, subtree_mergeinfo,
+ subtree_path, opt_state, NULL, FALSE,
+ iterpool));
+ if (!deleted)
+ SVN_ERR(show_non_recursive_ranges(subtree_path,
+ non_recursive_ranges,
+ opt_state, iterpool));
+
+ continue;
+ }
+
+ non_recursive_ranges = find_non_recursive_ranges(parent_ranges,
+ iterpool);
+ if (non_recursive_ranges->nelts)
+ {
+ /* We really found non-recursive merges at the parent?
+ Try to get rid of them at the parent and sub-node alike. */
+ SVN_ERR(remove_obsolete_line(&deleted, lookup, subtree_mergeinfo,
+ parent_path, opt_state, NULL, FALSE,
+ iterpool));
+ if (deleted)
+ SVN_ERR(remove_obsolete_line(&deleted, lookup, subtree_mergeinfo,
+ subtree_path, opt_state, NULL, FALSE,
+ iterpool));
+ if (!deleted)
+ SVN_ERR(show_non_recursive_ranges(parent_path,
+ non_recursive_ranges,
+ opt_state, iterpool));
+
+ continue;
+ }
+
/* Try the actual elision, i.e. compare parent and sub-tree m/i.
Where they don't fit, figure out if they can be aligned. */
SVN_ERR(svn_rangelist_diff(&parent_only, &subtree_only,
- parent_ranges, subtree_ranges, FALSE,
+ parent_ranges, subtree_ranges, TRUE,
iterpool));
/* From the set of revisions missing on the parent, remove those that
Modified: subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c?rev=1692546&r1=1692545&r2=1692546&view=diff
==============================================================================
--- subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c (original)
+++ subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c Fri Jul 24 16:02:42 2015
@@ -287,6 +287,10 @@ const svn_opt_subcommand_desc2_t svn_min
" revisions missing in sub-node\n"
" ... these revisions affect current sub-tree\n"
" but are only listed as merged for the parent.\n"
+ " NON-RECURSIVE RANGE(S) found\n"
+ " - Those revisions had been merged into a sparse\n
+ " working copy resulting in incomplete merges.\n"
+ " The sub-tree mergeinfo cannot be elided.\n"
" MISSING in parent - The branch for the parent node exists in the\n"
" repository but is not in its mergeinfo.\n"
" The sub-tree mergeinfo will not be elided.\n"