Author: stefan2
Date: Tue Jun 30 13:31:47 2015
New Revision: 1688448
URL: http://svn.apache.org/r1688448
Log:
On the svn-mergeinfo-normalizer branch:
Make the last sub-command, "combine ranges", part of the common
normalization processor. We can now combine any of those functions
freely. The only thing left to add is UI for it.
* tools/client-side/svn-mergeinfo-normalizer/combine-ranges-cmd.c
(all_positive_ranges,
inoperative,
shorten_lines): Moved to logic.c .
(svn_min__combine_ranges): The default processor is good enough now.
* tools/client-side/svn-mergeinfo-normalizer/logic.c
(inoperative): Moved here from combine-ranges-cmd.c .
(shorten_lines): Same. Only process a single node's m/i and only
do it when activated. Report progress nicely.
(default_processor): Invoke the new functionality.
Modified:
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/combine-ranges-cmd.c
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/logic.c
Modified:
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/combine-ranges-cmd.c
URL:
http://svn.apache.org/viewvc/subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/combine-ranges-cmd.c?rev=1688448&r1=1688447&r2=1688448&view=diff
==============================================================================
---
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/combine-ranges-cmd.c
(original)
+++
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/combine-ranges-cmd.c
Tue Jun 30 13:31:47 2015
@@ -42,111 +42,6 @@
/*** Code. ***/
-static svn_boolean_t
-all_positive_ranges(svn_rangelist_t *ranges)
-{
- 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->start > range->end)
- return FALSE;
- }
-
- return TRUE;
-}
-
-static svn_boolean_t
-inoperative(svn_min__log_t *log,
- const char *path,
- svn_revnum_t start,
- svn_revnum_t end,
- apr_pool_t *scratch_pool)
-{
- svn_merge_range_t range = { 0 };
- apr_array_header_t *ranges = apr_array_make(scratch_pool, 1, sizeof(&range));
-
- range.start = start - 1;
- range.end = end;
- APR_ARRAY_PUSH(ranges, svn_merge_range_t *) = ⦥
-
- return svn_min__operative(log, path, ranges, scratch_pool)->nelts == 0;
-}
-
-static svn_error_t *
-shorten_lines(apr_array_header_t *wc_mergeinfo,
- svn_min__log_t *log,
- svn_ra_session_t *session,
- svn_min__opt_state_t *opt_state,
- apr_pool_t *scratch_pool)
-{
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- apr_pool_t *iterpool2 = svn_pool_create(scratch_pool);
-
- int i;
- apr_int64_t removed = 0;
- for (i = 0; i < wc_mergeinfo->nelts; ++i)
- {
- apr_hash_index_t *hi;
- svn_mergeinfo_t mergeinfo = svn_min__get_mergeinfo(wc_mergeinfo, i);
-
- svn_pool_clear(iterpool);
-
- for (hi = apr_hash_first(iterpool, mergeinfo);
- hi;
- hi = apr_hash_next(hi))
- {
- int source, dest;
- const char *path = apr_hash_this_key(hi);
- svn_rangelist_t *ranges = apr_hash_this_val(hi);
-
- if (ranges->nelts < 2 || !all_positive_ranges(ranges))
- continue;
-
- for (source = 1, dest = 0; source < ranges->nelts; ++source)
- {
- svn_merge_range_t *source_range
- = APR_ARRAY_IDX(ranges, source, svn_merge_range_t *);
- svn_merge_range_t *dest_range
- = APR_ARRAY_IDX(ranges, dest, svn_merge_range_t *);
-
- svn_pool_clear(iterpool2);
-
- if ( (source_range->inheritable == dest_range->inheritable)
- && inoperative(log, path, dest_range->end + 1,
- source_range->start, iterpool2))
- {
- dest_range->end = source_range->end;
- }
- else
- {
- ++dest;
- APR_ARRAY_IDX(ranges, dest, svn_merge_range_t *)
- = source_range;
- }
- }
-
- removed += ranges->nelts - dest - 1;
- ranges->nelts = dest + 1;
- }
-
- /* Show progress after every 1000 nodes and after the last one. */
- if (!opt_state->quiet
- && ((i+1) % 1000 == 0 || (i+1) == wc_mergeinfo->nelts))
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" Processed %d nodes, removed %s revision ranges.\n"),
- i+1,
- apr_psprintf(iterpool, "%" APR_UINT64_T_FMT, removed)));
- }
-
- svn_pool_destroy(iterpool2);
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_min__combine_ranges(apr_getopt_t *os,
@@ -155,7 +50,7 @@ svn_min__combine_ranges(apr_getopt_t *os
{
svn_min__cmd_baton_t *cmd_baton = baton;
cmd_baton->opt_state->combine_ranges = TRUE;
- SVN_ERR(svn_min__run_command(os, baton, shorten_lines, pool));
+ SVN_ERR(svn_min__run_command(os, baton, NULL, pool));
return SVN_NO_ERROR;
}
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=1688448&r1=1688447&r2=1688448&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
Tue Jun 30 13:31:47 2015
@@ -171,6 +171,78 @@ remove_obsolete_lines(svn_ra_session_t *
return SVN_NO_ERROR;
}
+static svn_boolean_t
+inoperative(svn_min__log_t *log,
+ const char *path,
+ svn_revnum_t start,
+ svn_revnum_t end,
+ apr_pool_t *scratch_pool)
+{
+ svn_merge_range_t range = { 0 };
+ apr_array_header_t *ranges = apr_array_make(scratch_pool, 1, sizeof(&range));
+
+ range.start = start - 1;
+ range.end = end;
+ APR_ARRAY_PUSH(ranges, svn_merge_range_t *) = ⦥
+
+ return svn_min__operative(log, path, ranges, scratch_pool)->nelts == 0;
+}
+
+static svn_error_t *
+shorten_lines(svn_mergeinfo_t mergeinfo,
+ svn_min__log_t *log,
+ svn_min__opt_state_t *opt_state,
+ progress_t *progress,
+ apr_pool_t *scratch_pool)
+{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ apr_hash_index_t *hi;
+
+ if (!opt_state->combine_ranges)
+ return SVN_NO_ERROR;
+
+ for (hi = apr_hash_first(scratch_pool, mergeinfo);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ int source, dest;
+ const char *path = apr_hash_this_key(hi);
+ svn_rangelist_t *ranges = apr_hash_this_val(hi);
+
+ if (ranges->nelts < 2 || !all_positive_ranges(ranges))
+ continue;
+
+ for (source = 1, dest = 0; source < ranges->nelts; ++source)
+ {
+ svn_merge_range_t *source_range
+ = APR_ARRAY_IDX(ranges, source, svn_merge_range_t *);
+ svn_merge_range_t *dest_range
+ = APR_ARRAY_IDX(ranges, dest, svn_merge_range_t *);
+
+ svn_pool_clear(iterpool);
+
+ if ( (source_range->inheritable == dest_range->inheritable)
+ && inoperative(log, path, dest_range->end + 1,
+ source_range->start, iterpool))
+ {
+ dest_range->end = source_range->end;
+ }
+ else
+ {
+ ++dest;
+ APR_ARRAY_IDX(ranges, dest, svn_merge_range_t *)
+ = source_range;
+ }
+ }
+
+ progress->ranges_removed += ranges->nelts - dest - 1;
+ ranges->nelts = dest + 1;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+
static const char *
progress_string(const progress_t *progress,
svn_min__opt_state_t *opt_state,
@@ -275,6 +347,10 @@ default_processor(apr_array_header_t *wc
}
}
+ /* Reduce the number of remaining ranges. */
+ SVN_ERR(shorten_lines(svn_min__get_mergeinfo(wc_mergeinfo, i), log,
+ opt_state, &progress, iterpool));
+
/* Print progress info. */
if (!opt_state->quiet && i % 1000 == 0)
SVN_ERR(svn_cmdline_printf(iterpool, " %s.\n",