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/07 03:25:47 UTC
svn commit: r1689551 - in
/subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer:
analyze-cmd.c svn-mergeinfo-normalizer.c
Author: stefan2
Date: Tue Jul 7 01:25:46 2015
New Revision: 1689551
URL: http://svn.apache.org/r1689551
Log:
On the svn-mergeinfo-normalizer branch:
Implement the 'analyze' sub-command using the common logic.c code.
It has now the same flexibility as the 'normalize' command.
* tools/client-side/svn-mergeinfo-normalizer/analyze-cmd.c
(remove_obsolete_lines,
find_reverse_ranges,
print_ranges,
remove_lines,
analyze): Drop redundant code.
(svn_min__analyze): Simply call into logic.c with appropriate parameters.
* tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
(svn_min__cmd_table): 'analyze' now supports -v and selective analysis.
Modified:
subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/analyze-cmd.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/analyze-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/analyze-cmd.c?rev=1689551&r1=1689550&r2=1689551&view=diff
==============================================================================
--- subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/analyze-cmd.c (original)
+++ subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/analyze-cmd.c Tue Jul 7 01:25:46 2015
@@ -27,348 +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 "svn_sorts.h"
-#include "private/svn_fspath.h"
-#include "private/svn_sorts_private.h"
-
#include "mergeinfo-normalizer.h"
-#include "svn_private_config.h"
-
/*** Code. ***/
-static svn_error_t *
-remove_obsolete_lines(svn_mergeinfo_t *obsolete,
- svn_ra_session_t *session,
- svn_mergeinfo_t mergeinfo,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- apr_array_header_t *to_remove
- = apr_array_make(scratch_pool, 16, sizeof(const char *));
-
- int i;
- apr_hash_index_t *hi;
- *obsolete = apr_hash_make(result_pool);
-
- 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;
- apr_hash_set(*obsolete, path, apr_hash_this_key_len(hi),
- apr_hash_this_val(hi));
- }
- }
-
- svn_sort__array(to_remove, svn_sort_compare_paths);
- if (to_remove->nelts)
- {
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" %d branches don't exist in HEAD:\n"),
- to_remove->nelts));
-
- for (i = 0; i < to_remove->nelts; ++i)
- {
- const char *path;
- svn_pool_clear(iterpool);
-
- path = APR_ARRAY_IDX(to_remove, i, const char *);
- svn_hash_sets(mergeinfo, path, NULL);
-
- SVN_ERR(svn_cmdline_printf(iterpool, _(" %s\n"), path));
- }
- }
- else
- {
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" All branches still exist in HEAD.\n")));
- }
-
- SVN_ERR(svn_cmdline_printf(iterpool, _("\n")));
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-static svn_rangelist_t *
-find_reverse_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->start >= range->end)
- 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,
- apr_pool_t *scratch_pool)
-{
- svn_string_t *string;
-
- SVN_ERR(svn_rangelist_to_string(&string, ranges, scratch_pool));
- SVN_ERR(svn_cmdline_printf(scratch_pool, _(" %s%s\n"),
- title, string->data));
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-remove_lines(svn_min__log_t *log,
- const char *relpath,
- svn_mergeinfo_t parent_mergeinfo,
- svn_mergeinfo_t subtree_mergeinfo,
- const char *title,
- apr_pool_t *scratch_pool)
-{
- apr_pool_t *iterpool;
- int i;
- apr_hash_t *processed;
- svn_boolean_t needs_header = TRUE;
- apr_array_header_t *sorted_mi;
-
- if (apr_hash_count(subtree_mergeinfo) == 0)
- return SVN_NO_ERROR;
-
- iterpool = svn_pool_create(scratch_pool);
- processed = apr_hash_make(scratch_pool);
-
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" Try to elide %s branches:\n"), title));
-
- sorted_mi = svn_sort__hash(parent_mergeinfo,
- svn_sort_compare_items_lexically,
- scratch_pool);
- for (i = 0; i < sorted_mi->nelts; ++i)
- {
- const char *parent_path, *subtree_path;
- svn_rangelist_t *parent_ranges, *subtree_ranges, *reverse_ranges;
- svn_rangelist_t *subtree_only, *parent_only;
- svn_rangelist_t *operative_outside_subtree, *operative_in_subtree;
- const svn_sort__item_t *item;
-
- svn_pool_clear(iterpool);
-
- item = &APR_ARRAY_IDX(sorted_mi, i, svn_sort__item_t);
- parent_path = item->key;
- subtree_path = svn_fspath__join(parent_path, relpath, scratch_pool);
- parent_ranges = item->value;
- subtree_ranges = svn_hash_gets(subtree_mergeinfo, subtree_path);
-
- if (!subtree_ranges)
- continue;
-
- svn_hash_sets(processed, subtree_path, subtree_path);
-
- reverse_ranges = find_reverse_ranges(subtree_ranges, iterpool);
- if (reverse_ranges->nelts)
- {
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" Reverse range(s) found for %s:\n"),
- subtree_path));
- SVN_ERR(print_ranges(reverse_ranges, "", iterpool));
- continue;
- }
-
- SVN_ERR(svn_rangelist_diff(&parent_only, &subtree_only,
- parent_ranges, subtree_ranges, TRUE,
- iterpool));
- subtree_only
- = svn_min__operative(log, subtree_path, subtree_only, iterpool);
-
- if (!subtree_only->nelts && !parent_only->nelts)
- {
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" elide redundant branch %s\n"),
- subtree_path));
- svn_hash_sets(subtree_mergeinfo, subtree_path, NULL);
- continue;
- }
-
- operative_outside_subtree
- = svn_min__operative_outside_subtree(log, parent_path, subtree_path,
- subtree_only, iterpool);
- operative_in_subtree
- = svn_min__operative(log, subtree_path, parent_only, iterpool);
-
- if (operative_outside_subtree->nelts || operative_in_subtree->nelts)
- {
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" CANNOT elide branch %s\n"),
- subtree_path));
- if (operative_outside_subtree->nelts)
- SVN_ERR(print_ranges(operative_outside_subtree,
- _("revisions not movable to parent: "),
- iterpool));
- if (operative_in_subtree->nelts)
- SVN_ERR(print_ranges(operative_in_subtree,
- _("revisions missing in sub-node: "),
- iterpool));
- }
- else
- {
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" elide branch %s\n"),
- subtree_path));
- if (subtree_only->nelts)
- SVN_ERR(print_ranges(subtree_only,
- _("revisions moved to parent: "),
- iterpool));
- if (parent_only->nelts)
- SVN_ERR(print_ranges(parent_only,
- _("revisions inoperative in sub-node: "),
- iterpool));
-
- SVN_ERR(svn_rangelist_merge2(parent_ranges, subtree_only,
- parent_ranges->pool, iterpool));
- svn_hash_sets(subtree_mergeinfo, subtree_path, NULL);
- }
- }
-
- sorted_mi = svn_sort__hash(subtree_mergeinfo,
- svn_sort_compare_items_lexically,
- scratch_pool);
- for (i = 0; i < sorted_mi->nelts; ++i)
- {
- const char *path = APR_ARRAY_IDX(sorted_mi, i, svn_sort__item_t).key;
- svn_pool_clear(iterpool);
-
- if (!svn_hash_gets(processed, path))
- {
- if (needs_header)
- {
- SVN_ERR(svn_cmdline_printf(scratch_pool,
- _("\n Branches not mentioned in parent:\n")));
- needs_header = FALSE;
- }
-
- SVN_ERR(svn_cmdline_printf(iterpool, (" %s\n"), path));
- }
- }
-
- SVN_ERR(svn_cmdline_printf(iterpool, "\n"));
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-analyze(svn_ra_session_t *session,
- apr_array_header_t *wc_mergeinfo,
- svn_min__log_t *log,
- apr_pool_t *scratch_pool)
-{
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
-
- int i;
- for (i = wc_mergeinfo->nelts - 1; i >= 0; --i)
- {
- const char *parent_path;
- const char *relpath;
- svn_mergeinfo_t parent_mergeinfo;
- svn_mergeinfo_t subtree_mergeinfo;
- svn_mergeinfo_t obsolete;
-
- svn_min__get_mergeinfo_pair(&parent_path, &relpath,
- &parent_mergeinfo, &subtree_mergeinfo,
- wc_mergeinfo, i);
-
- if (parent_mergeinfo)
- SVN_ERR(svn_cmdline_printf(iterpool,
- _("Trying to elide mergeinfo from path\n"
- " %s\n"
- " into mergeinfo at path\n"
- " %s\n\n"),
- svn_dirent_join(parent_path, relpath,
- iterpool),
- parent_path));
- else
- SVN_ERR(svn_cmdline_printf(iterpool,
- _("Trying to elide mergeinfo at path\n"
- " %s\n\n"),
- svn_min__get_mergeinfo_path(wc_mergeinfo,
- i)));
-
- svn_pool_clear(iterpool);
-
- subtree_mergeinfo = svn_mergeinfo_dup(subtree_mergeinfo, iterpool);
- SVN_ERR(remove_obsolete_lines(&obsolete, session, subtree_mergeinfo,
- iterpool, iterpool));
-
- if (parent_mergeinfo)
- {
- parent_mergeinfo = svn_mergeinfo_dup(parent_mergeinfo, iterpool);
- SVN_ERR(remove_lines(log, relpath, parent_mergeinfo, obsolete,
- "obsolete", iterpool));
- SVN_ERR(remove_lines(log, relpath, parent_mergeinfo,
- subtree_mergeinfo, "remaining", iterpool));
- }
-
- SVN_ERR(svn_mergeinfo_merge2(subtree_mergeinfo, obsolete, iterpool,
- iterpool));
- if (apr_hash_count(subtree_mergeinfo))
- {
- apr_array_header_t *sorted_mi;
- int k;
-
- if (parent_mergeinfo)
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" Sub-tree merge info cannot be elided due to "
- "the following branches:\n")));
- else
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" Merge info kept for the following branches:\n")));
-
- sorted_mi = svn_sort__hash(subtree_mergeinfo,
- svn_sort_compare_items_lexically,
- iterpool);
- for (k = 0; k < sorted_mi->nelts; ++k)
- {
- const char *branch = APR_ARRAY_IDX(sorted_mi, k,
- svn_sort__item_t).key;
- SVN_ERR(svn_cmdline_printf(iterpool, _(" %s\n"), branch));
- }
-
- SVN_ERR(svn_cmdline_printf(iterpool, _("\n")));
- }
- else
- {
- SVN_ERR(svn_cmdline_printf(iterpool,
- _(" All sub-tree mergeinfo can be elided.\n\n")));
- }
- }
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_min__analyze(apr_getopt_t *os,
@@ -376,50 +39,21 @@ svn_min__analyze(apr_getopt_t *os,
apr_pool_t *pool)
{
svn_min__cmd_baton_t *cmd_baton = baton;
- apr_pool_t *iterpool = svn_pool_create(pool);
- apr_pool_t *subpool = svn_pool_create(pool);
- int i;
- for (i = 0; i < cmd_baton->opt_state->targets->nelts; i++)
+ /* If no option is given, default to "remove redundant sub-node m/i". */
+ if ( !cmd_baton->opt_state->remove_redundants
+ && !cmd_baton->opt_state->remove_obsoletes
+ && !cmd_baton->opt_state->combine_ranges)
{
- svn_ra_session_t *session;
- apr_array_header_t *wc_mergeinfo;
- svn_min__log_t *log;
- const char *url;
- const char *common_path;
-
- svn_pool_clear(iterpool);
- SVN_ERR(svn_min__add_wc_info(baton, i, iterpool, subpool));
- SVN_ERR(svn_client_open_ra_session2(&session, cmd_baton->repo_root,
- NULL, cmd_baton->ctx, iterpool,
- subpool));
-
- /* scan working copy */
- svn_pool_clear(subpool);
- SVN_ERR(svn_min__read_mergeinfo(&wc_mergeinfo, cmd_baton, iterpool,
- subpool));
-
- /* Any mergeinfo at all? */
- if (wc_mergeinfo->nelts == 0)
- continue;
-
- /* fetch log */
- svn_pool_clear(subpool);
- common_path = svn_min__common_parent(wc_mergeinfo, subpool, subpool);
- SVN_ERR_ASSERT(*common_path == '/');
-
- url = svn_path_url_add_component2(cmd_baton->repo_root,
- common_path + 1,
- subpool);
- SVN_ERR(svn_min__log(&log, url, cmd_baton, iterpool, subpool));
-
- /* actual analysis */
- svn_pool_clear(subpool);
- SVN_ERR(analyze(session, wc_mergeinfo, log, subpool));
+ cmd_baton->opt_state->remove_redundants = TRUE;
+ cmd_baton->opt_state->remove_obsoletes = TRUE;
+ cmd_baton->opt_state->combine_ranges = TRUE;
}
- svn_pool_destroy(subpool);
- svn_pool_destroy(iterpool);
+ cmd_baton->opt_state->run_analysis = TRUE;
+ cmd_baton->opt_state->dry_run = TRUE;
+
+ SVN_ERR(svn_min__run_normalize(os, baton, pool));
return SVN_NO_ERROR;
}
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=1689551&r1=1689550&r2=1689551&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 Tue Jul 7 01:25:46 2015
@@ -234,7 +234,8 @@ const svn_opt_subcommand_desc2_t svn_min
("Generate a report of which part of the sub-tree mergeinfo\n"
"can be removed and which part can't.\n"
"usage: remove-ranges [WCPATH...]\n"),
- {opt_targets, opt_depth, opt_dry_run} },
+ {opt_targets, opt_depth, 'v',
+ opt_remove_obsoletes, opt_remove_redundant, opt_combine_ranges} },
{ NULL, NULL, {0}, NULL, {0} }
};