You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2017/07/20 10:29:57 UTC

svn commit: r1802470 - /subversion/trunk/subversion/libsvn_subr/mergeinfo.c

Author: rhuijben
Date: Thu Jul 20 10:29:57 2017
New Revision: 1802470

URL: http://svn.apache.org/viewvc?rev=1802470&view=rev
Log:
As initial work of fixing the merging of merge rangelists, refactor
svn_rangelist_merge2 to be a for loop over the changes to merge.

This is the first part of a complete refactoring of this function.

* subversion/libsvn_subr/mergeinfo.c
  (svn_rangelist_merge2): Adjust existing code to work like a loop over
    the provided changes. Temporarily add explicit continue statements
    to simplify analyzing the dependencies between the different cases.

Modified:
    subversion/trunk/subversion/libsvn_subr/mergeinfo.c

Modified: subversion/trunk/subversion/libsvn_subr/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/mergeinfo.c?rev=1802470&r1=1802469&r2=1802470&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/mergeinfo.c (original)
+++ subversion/trunk/subversion/libsvn_subr/mergeinfo.c Thu Jul 20 10:29:57 2017
@@ -1,4 +1,4 @@
-/*
+/*
  * mergeinfo.c:  Mergeinfo parsing and handling
  *
  * ====================================================================
@@ -956,29 +956,33 @@ adjust_remaining_ranges(svn_rangelist_t
 
 svn_error_t *
 svn_rangelist_merge2(svn_rangelist_t *rangelist,
-                     const svn_rangelist_t *changes,
+                     const svn_rangelist_t *chg,
                      apr_pool_t *result_pool,
                      apr_pool_t *scratch_pool)
 {
+  svn_rangelist_t *changes;
   int i = 0;
-  int j = 0;
+  int j;
 
-#ifdef SVN_DEBUG
-  svn_boolean_t was_normalized =
-                    (svn_rangelist__is_canonical(rangelist)
-                     && svn_rangelist__is_canonical(changes));
-#endif
+  SVN_ERR(svn_rangelist__canonicalize(rangelist, scratch_pool));
 
   /* We may modify CHANGES, so make a copy in SCRATCH_POOL. */
-  changes = svn_rangelist_dup(changes, scratch_pool);
+  changes = svn_rangelist_dup(chg, scratch_pool);
+  SVN_ERR(svn_rangelist__canonicalize(changes, scratch_pool));
 
-  while (i < rangelist->nelts && j < changes->nelts)
+  for (j = 0; j < changes->nelts; j++)
     {
-      svn_merge_range_t *range =
-        APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *);
+      svn_merge_range_t *range;
       svn_merge_range_t *change =
         APR_ARRAY_IDX(changes, j, svn_merge_range_t *);
-      int res = svn_sort_compare_ranges(&range, &change);
+      int res;
+
+      /* ### TODO: Remove as part of refactoring */
+      if (i >= rangelist->nelts)
+        break;
+
+      range = APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *);
+      res = svn_sort_compare_ranges(&range, &change);
 
       if (res == 0)
         {
@@ -988,7 +992,7 @@ svn_rangelist_merge2(svn_rangelist_t *ra
           if (range->inheritable || change->inheritable)
             range->inheritable = TRUE;
           i++;
-          j++;
+          continue;
         }
       else if (res < 0) /* CHANGE is younger than RANGE */
         {
@@ -997,6 +1001,8 @@ svn_rangelist_merge2(svn_rangelist_t *ra
               /* RANGE is older than CHANGE and the two do not
                  adjoin or overlap */
               i++;
+              j--;
+              continue;
             }
           else if (range->end == change->start)
             {
@@ -1007,7 +1013,7 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                      RANGE expands to absord CHANGE. */
                   range->end = change->end;
                   adjust_remaining_ranges(rangelist, &i, result_pool);
-                  j++;
+                  continue;
                 }
               else
                 {
@@ -1015,6 +1021,8 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                      inheritability.  Since RANGE is older, just
                      move on to the next RANGE. */
                   i++;
+                  j--;
+                  continue;
                 }
             }
           else
@@ -1027,9 +1035,13 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                       with no adjustment otherwise only the intersection is
                       absorbed and CHANGE is truncated. */
                   if (range->end >= change->end)
-                    j++;
+                    continue;
                   else
-                    change->start = range->end;
+                    {
+                      change->start = range->end;
+                      j--;
+                      continue;
+                    }
                 }
               else
                 {
@@ -1043,6 +1055,8 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                       range_copy->end = change->start;
                       range->start = change->start;
                       svn_sort__array_insert(rangelist, &range_copy, i++);
+                      j--;
+                      continue;
                     }
                   else
                     {
@@ -1051,6 +1065,8 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                          is older. */
                       range->inheritable = TRUE;
                       change->start = range->end;
+                      j--;
+                      continue;
                     }
                 }
             }
@@ -1065,7 +1081,7 @@ svn_rangelist_merge2(svn_rangelist_t *ra
               svn_merge_range_t *change_copy =
                 svn_merge_range_dup(change, result_pool);
               svn_sort__array_insert(rangelist, &change_copy, i++);
-              j++;
+              continue;
             }
           else if (change->end == range->start)
             {
@@ -1075,7 +1091,7 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                   /* RANGE and CHANGE have the same inheritability so we
                      can simply combine the two in place. */
                   range->start = change->start;
-                  j++;
+                  continue;
                 }
               else
                 {
@@ -1084,7 +1100,7 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                   svn_merge_range_t *change_copy =
                     svn_merge_range_dup(change, result_pool);
                   svn_sort__array_insert(rangelist, &change_copy, i);
-                  j++;
+                  continue;
                 }
             }
           else
@@ -1102,7 +1118,7 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                       range->end = change->end;
                       adjust_remaining_ranges(rangelist, &i, result_pool);
                     }
-                  j++;
+                  continue;
                 }
               else if (range->inheritable)
                 {
@@ -1116,13 +1132,15 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                       change_copy->end = range->start;
                       change->start = range->start;
                       svn_sort__array_insert(rangelist, &change_copy, i++);
+                      j--;
+                      continue;
                     }
                   else
                     {
                       /* CHANGE and RANGE share the same start rev, but
                          CHANGE is considered older because CHANGE->END is
                          older than RANGE->END. */
-                      j++;
+                      continue;
                     }
                 }
               else
@@ -1136,7 +1154,7 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                              same end revision, so set RANGE equal to CHANGE. */
                           range->start = change->start;
                           range->inheritable = TRUE;
-                          j++;
+                          continue;
                         }
                       else if (change->end > range->end)
                         {
@@ -1146,6 +1164,8 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                           range->start = change->start;
                           range->inheritable = TRUE;
                           change->start = range->end;
+                          j--;
+                          continue;
                         }
                       else
                         {
@@ -1159,7 +1179,7 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                           range->end = change->end;
                           range->inheritable = TRUE;
                           svn_sort__array_insert(rangelist, &range_copy, ++i);
-                          j++;
+                          continue;
                         }
                     }
                   else
@@ -1177,11 +1197,12 @@ svn_rangelist_merge2(svn_rangelist_t *ra
                       range_copy->inheritable = TRUE;
                       range->start = change->end;
                       svn_sort__array_insert(rangelist, &range_copy, i++);
-                      j++;
+                      continue;
                     }
                 }
             }
         }
+      SVN_ERR_MALFUNCTION(); /* Unreachable */
     }
 
   /* Copy any remaining elements in CHANGES into RANGELIST. */
@@ -1195,7 +1216,7 @@ svn_rangelist_merge2(svn_rangelist_t *ra
     }
 
 #ifdef SVN_DEBUG
-  SVN_ERR_ASSERT(!was_normalized || svn_rangelist__is_canonical(rangelist));
+  SVN_ERR_ASSERT(svn_rangelist__is_canonical(rangelist));
 #endif
 
   return SVN_NO_ERROR;