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 *) = &range;
-
-  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 *) = &range;
+
+  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",


Reply via email to