Author: stefan2
Date: Tue Jun 30 13:14:26 2015
New Revision: 1688446

URL: http://svn.apache.org/r1688446
Log:
On the svn-mergeinfo-normalizer branch:
Make the "clear obsoletes" logic part of the common mergeinfo processor.

* tools/client-side/svn-mergeinfo-normalizer/clear-obsolete-cmd.c
  (remove_obsolete_lines,
   remove_obsoletes): Move to logic.c .
  (svn_min__clear_obsolete): The default processor now does the right thing.

* tools/client-side/svn-mergeinfo-normalizer/logic.c
  (remove_obsolete_lines): Logic moved here from clear-obsolete-cmd.c .
                           Make it a no-op if the functionality has not
                           been selected and report progress.
  (default_processor): Invoke the new sub-command functionality where needed.

Modified:
    
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/clear-obsolete-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/clear-obsolete-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/clear-obsolete-cmd.c?rev=1688446&r1=1688445&r2=1688446&view=diff
==============================================================================
--- 
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/clear-obsolete-cmd.c
 (original)
+++ 
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/clear-obsolete-cmd.c
 Tue Jun 30 13:14:26 2015
@@ -27,88 +27,11 @@
 
 /*** Includes. ***/
 
-#include "svn_cmdline.h"
-#include "svn_dirent_uri.h"
-#include "svn_hash.h"
-#include "svn_path.h"
-#include "svn_pools.h"
-#include "private/svn_fspath.h"
-
 #include "mergeinfo-normalizer.h"
 
-#include "svn_private_config.h"
-
 
 /*** Code. ***/
 
-static svn_error_t *
-remove_obsolete_lines(svn_ra_session_t *session,
-                      svn_mergeinfo_t mergeinfo,
-                      apr_pool_t *scratch_pool)
-{
-  apr_array_header_t *to_remove
-    = apr_array_make(scratch_pool, 16, sizeof(const char *));
-
-  int i;
-  apr_hash_index_t *hi;
-  for (hi = apr_hash_first(scratch_pool, mergeinfo);
-       hi;
-       hi = apr_hash_next(hi))
-    {
-      const char *path = apr_hash_this_key(hi);
-      svn_node_kind_t kind;
-
-      SVN_ERR_ASSERT(*path == '/');
-      SVN_ERR(svn_ra_check_path(session, path + 1, SVN_INVALID_REVNUM, &kind,
-                                scratch_pool));
-      if (kind == svn_node_none)
-        APR_ARRAY_PUSH(to_remove, const char *) = path;
-    }
-
-  for (i = 0; i < to_remove->nelts; ++i)
-    {
-      const char *path = APR_ARRAY_IDX(to_remove, i, const char *);
-      svn_hash_sets(mergeinfo, path, NULL);
-    }
-
-  return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-remove_obsoletes(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);
-
-  int i;
-  apr_int64_t removed = 0;
-  for (i = 0; i < wc_mergeinfo->nelts; ++i)
-    {
-      svn_mergeinfo_t mergeinfo = svn_min__get_mergeinfo(wc_mergeinfo, i);
-      unsigned initial_count = apr_hash_count(mergeinfo);
-      svn_pool_clear(iterpool);
-
-      /* Combine mergeinfo ranges */
-      SVN_ERR(remove_obsolete_lines(session, mergeinfo, iterpool));
-      removed += initial_count - apr_hash_count(mergeinfo);
-
-      /* 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 branch entries.\n"),
-                  i+1,
-                  apr_psprintf(iterpool, "%" APR_UINT64_T_FMT, removed)));
-    }
-
-  svn_pool_destroy(iterpool);
-
-  return SVN_NO_ERROR;
-}
-
 /* This implements the `svn_opt_subcommand_t' interface. */
 svn_error_t *
 svn_min__clear_obsolete(apr_getopt_t *os,
@@ -117,7 +40,7 @@ svn_min__clear_obsolete(apr_getopt_t *os
 {
   svn_min__cmd_baton_t *cmd_baton = baton;
   cmd_baton->opt_state->remove_obsoletes = TRUE;
-  SVN_ERR(svn_min__run_command(os, baton, remove_obsoletes, 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=1688446&r1=1688445&r2=1688446&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:14:26 2015
@@ -128,6 +128,49 @@ typedef struct progress_t
   apr_int64_t ranges_removed;
 } progress_t;
 
+static svn_error_t *
+remove_obsolete_lines(svn_ra_session_t *session,
+                      svn_mergeinfo_t mergeinfo,
+                      svn_min__opt_state_t *opt_state,
+                      progress_t *progress,
+                      apr_pool_t *scratch_pool)
+{
+  apr_array_header_t *to_remove;
+  int i;
+  apr_hash_index_t *hi;
+  unsigned initial_count;
+
+  if (!opt_state->remove_obsoletes)
+    return SVN_NO_ERROR;
+
+  initial_count = apr_hash_count(mergeinfo);
+  to_remove = apr_array_make(scratch_pool, 16, sizeof(const char *));
+
+  for (hi = apr_hash_first(scratch_pool, mergeinfo);
+       hi;
+       hi = apr_hash_next(hi))
+    {
+      const char *path = apr_hash_this_key(hi);
+      svn_node_kind_t kind;
+
+      SVN_ERR_ASSERT(*path == '/');
+      SVN_ERR(svn_ra_check_path(session, path + 1, SVN_INVALID_REVNUM, &kind,
+                                scratch_pool));
+      if (kind == svn_node_none)
+        APR_ARRAY_PUSH(to_remove, const char *) = path;
+    }
+
+  for (i = 0; i < to_remove->nelts; ++i)
+    {
+      const char *path = APR_ARRAY_IDX(to_remove, i, const char *);
+      svn_hash_sets(mergeinfo, path, NULL);
+    }
+
+  progress->obsoletes_removed += initial_count - apr_hash_count(mergeinfo);
+
+  return SVN_NO_ERROR;
+}
+
 static const char *
 progress_string(const progress_t *progress,
                 svn_min__opt_state_t *opt_state,
@@ -190,16 +233,29 @@ default_processor(apr_array_header_t *wc
       const char *relpath;
       svn_mergeinfo_t parent_mergeinfo;
       svn_mergeinfo_t subtree_mergeinfo;
+
+      svn_pool_clear(iterpool);
       progress.nodes_todo = i;
 
-      if (svn_min__get_mergeinfo_pair(&parent_path, &relpath,
+      /* Eliminate entries for deleted branches. */
+      SVN_ERR(remove_obsolete_lines(session,
+                                    svn_min__get_mergeinfo(wc_mergeinfo, i),
+                                    opt_state, &progress, iterpool));
+
+      /* Eliminate redundant sub-node mergeinfo. */
+      if (opt_state->remove_redundants &&
+          svn_min__get_mergeinfo_pair(&parent_path, &relpath,
                                       &parent_mergeinfo, &subtree_mergeinfo,
                                       wc_mergeinfo, i))
         {
           svn_mergeinfo_t parent_mergeinfo_copy;
           svn_mergeinfo_t subtree_mergeinfo_copy;
 
-          svn_pool_clear(iterpool);
+          /* Eliminate entries for deleted branches such that parent and
+             sub-node mergeinfo align again. */
+          SVN_ERR(remove_obsolete_lines(session, parent_mergeinfo,
+                                        opt_state, &progress, iterpool));
+
           parent_mergeinfo_copy = svn_mergeinfo_dup(parent_mergeinfo,
                                                     iterpool);
           subtree_mergeinfo_copy = svn_mergeinfo_dup(subtree_mergeinfo,
@@ -219,6 +275,7 @@ default_processor(apr_array_header_t *wc
             }
         }
 
+      /* Print progress info. */
       if (!opt_state->quiet && i % 1000 == 0)
         SVN_ERR(svn_cmdline_printf(iterpool, "    %s.\n",
                                    progress_string(&progress, opt_state,


Reply via email to