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/24 18:02:42 UTC

svn commit: r1692546 - in /subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer: logic.c svn-mergeinfo-normalizer.c

Author: stefan2
Date: Fri Jul 24 16:02:42 2015
New Revision: 1692546

URL: http://svn.apache.org/r1692546
Log:
On the svn-mergeinfo-normalizer branch:
Detect non-recursive ranges.  For now, they will prevent branch elision.

* tools/client-side/svn-mergeinfo-normalizer/logic.c
  (find_non_recursive_ranges,
   show_non_recursive_ranges): New functions.
  (remove_lines): Detect and report non-recursive ranges for the node
                  _and_ the parent.  Don't ignore recursiveness in rev
                  range arithmetics.

* tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
  (svn_min__cmd_table): Extend the docstring for the 'normalize' sub-command
                        to cover the new elision messages.

Modified:
    subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/logic.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/logic.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-mergeinfo-normalizer/tools/client-side/svn-mergeinfo-normalizer/logic.c?rev=1692546&r1=1692545&r2=1692546&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 Fri Jul 24 16:02:42 2015
@@ -61,6 +61,25 @@ find_reverse_ranges(svn_rangelist_t *ran
   return result;
 }
 
+static svn_rangelist_t *
+find_non_recursive_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->inheritable)
+        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,
@@ -117,6 +136,26 @@ show_reverse_ranges(const char *subtree_
 }
 
 static svn_error_t *
+show_non_recursive_ranges(const char *subtree_path,
+                          svn_rangelist_t *non_recursive_ranges,
+                          svn_min__opt_state_t *opt_state,
+                          apr_pool_t *scratch_pool)
+{
+  if (non_recursive_ranges->nelts)
+    return SVN_NO_ERROR;
+
+  if (opt_state->verbose || opt_state->run_analysis)
+    {
+      SVN_ERR(svn_cmdline_printf(scratch_pool,
+                            _("    NON-RECURSIVE RANGE(S) found for %s:\n"),
+                            subtree_path));
+      SVN_ERR(print_ranges(non_recursive_ranges, "", scratch_pool));
+    }
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
 show_branch_elision(const char *branch,
                     svn_rangelist_t *subtree_only,
                     svn_rangelist_t *parent_only,
@@ -400,7 +439,8 @@ remove_lines(svn_min__log_t *log,
   for (i = 0; i < sorted_mi->nelts; ++i)
     {
       const char *parent_path, *subtree_path, *parent_fs_path;
-      svn_rangelist_t *parent_ranges, *subtree_ranges, *reverse_ranges;
+      svn_rangelist_t *parent_ranges, *subtree_ranges;
+      svn_rangelist_t *reverse_ranges, *non_recursive_ranges;
       svn_rangelist_t *subtree_only, *parent_only;
       svn_rangelist_t *operative_outside_subtree, *operative_in_subtree;
       svn_rangelist_t *implied_in_subtree, *implied_in_parent;
@@ -462,10 +502,50 @@ remove_lines(svn_min__log_t *log,
           continue;
         }
 
+      /* We don't know how to handle reverse ranges (there should be none).
+         So, we must check for them - just to be sure. */
+      non_recursive_ranges = find_non_recursive_ranges(subtree_ranges,
+                                                       iterpool);
+      if (non_recursive_ranges->nelts)
+        {
+          /* We really found non-recursive merges?
+             Try to get rid of them. */
+          SVN_ERR(remove_obsolete_line(&deleted, lookup, subtree_mergeinfo,
+                                       subtree_path, opt_state, NULL, FALSE,
+                                       iterpool));
+          if (!deleted)
+            SVN_ERR(show_non_recursive_ranges(subtree_path,
+                                              non_recursive_ranges,
+                                              opt_state, iterpool));
+
+          continue;
+        }
+
+      non_recursive_ranges = find_non_recursive_ranges(parent_ranges,
+                                                       iterpool);
+      if (non_recursive_ranges->nelts)
+        {
+          /* We really found non-recursive merges at the parent?
+             Try to get rid of them at the parent and sub-node alike. */
+          SVN_ERR(remove_obsolete_line(&deleted, lookup, subtree_mergeinfo,
+                                       parent_path, opt_state, NULL, FALSE,
+                                       iterpool));
+          if (deleted)
+            SVN_ERR(remove_obsolete_line(&deleted, lookup, subtree_mergeinfo,
+                                        subtree_path, opt_state, NULL, FALSE,
+                                        iterpool));
+          if (!deleted)
+            SVN_ERR(show_non_recursive_ranges(parent_path,
+                                              non_recursive_ranges,
+                                              opt_state, iterpool));
+
+          continue;
+        }
+
       /* Try the actual elision, i.e. compare parent and sub-tree m/i.
          Where they don't fit, figure out if they can be aligned. */
       SVN_ERR(svn_rangelist_diff(&parent_only, &subtree_only,
-                                 parent_ranges, subtree_ranges, FALSE,
+                                 parent_ranges, subtree_ranges, TRUE,
                                  iterpool));
 
       /* From the set of revisions missing on the parent, remove those that

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=1692546&r1=1692545&r2=1692546&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 Fri Jul 24 16:02:42 2015
@@ -287,6 +287,10 @@ const svn_opt_subcommand_desc2_t svn_min
      "      revisions missing in sub-node\n"
      "                             ... these revisions affect current sub-tree\n"
      "                             but are only listed as merged for the parent.\n"
+     "    NON-RECURSIVE RANGE(S) found\n"
+     "                           - Those revisions had been merged into a sparse\n
+     "                             working copy resulting in incomplete merges.\n"
+     "                             The sub-tree mergeinfo cannot be elided.\n"
      "    MISSING in parent      - The branch for the parent node exists in the\n"
      "                             repository but is not in its mergeinfo.\n"
      "                             The sub-tree mergeinfo will not be elided.\n"