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,