You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2011/10/11 17:16:49 UTC

svn commit: r1181833 - in /subversion/branches/tree-read-api: ./ subversion/include/ subversion/include/private/ subversion/libsvn_client/ subversion/libsvn_fs_fs/ subversion/libsvn_subr/ subversion/libsvn_wc/ subversion/tests/libsvn_subr/ tools/client...

Author: julianfoad
Date: Tue Oct 11 15:16:47 2011
New Revision: 1181833

URL: http://svn.apache.org/viewvc?rev=1181833&view=rev
Log:
On the 'tree-read-api' branch: Catch up to trunk@1181830.

Added:
    subversion/branches/tree-read-api/tools/dist/templates/stable-news.ezt
      - copied unchanged from r1181830, subversion/trunk/tools/dist/templates/stable-news.ezt
Modified:
    subversion/branches/tree-read-api/   (props changed)
    subversion/branches/tree-read-api/INSTALL
    subversion/branches/tree-read-api/subversion/include/private/svn_adler32.h   (props changed)
    subversion/branches/tree-read-api/subversion/include/private/svn_string_private.h   (props changed)
    subversion/branches/tree-read-api/subversion/include/private/svn_temp_serializer.h   (props changed)
    subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h
    subversion/branches/tree-read-api/subversion/include/svn_sorts.h
    subversion/branches/tree-read-api/subversion/include/svn_types.h
    subversion/branches/tree-read-api/subversion/libsvn_client/merge.c
    subversion/branches/tree-read-api/subversion/libsvn_fs_fs/temp_serializer.c   (props changed)
    subversion/branches/tree-read-api/subversion/libsvn_fs_fs/temp_serializer.h   (props changed)
    subversion/branches/tree-read-api/subversion/libsvn_subr/adler32.c   (props changed)
    subversion/branches/tree-read-api/subversion/libsvn_subr/hash.c   (props changed)
    subversion/branches/tree-read-api/subversion/libsvn_subr/kitchensink.c
    subversion/branches/tree-read-api/subversion/libsvn_subr/mergeinfo.c
    subversion/branches/tree-read-api/subversion/libsvn_subr/sorts.c
    subversion/branches/tree-read-api/subversion/libsvn_subr/sqlite.c
    subversion/branches/tree-read-api/subversion/libsvn_subr/svn_temp_serializer.c   (props changed)
    subversion/branches/tree-read-api/subversion/libsvn_wc/status.c
    subversion/branches/tree-read-api/subversion/tests/libsvn_subr/mergeinfo-test.c
    subversion/branches/tree-read-api/tools/client-side/mergeinfo-sanitizer.py
    subversion/branches/tree-read-api/tools/client-side/svn-viewspec.py
    subversion/branches/tree-read-api/tools/dev/benchmarks/suite1/cronjob
    subversion/branches/tree-read-api/tools/dist/collect_sigs.py
    subversion/branches/tree-read-api/tools/dist/rat-excludes
    subversion/branches/tree-read-api/tools/dist/release.py

Propchange: subversion/branches/tree-read-api/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 11 15:16:47 2011
@@ -55,3 +55,4 @@
 /subversion/branches/tree-conflicts:868291-873154
 /subversion/branches/tree-conflicts-notify:873926-874008
 /subversion/branches/uris-as-urls:1060426-1064427
+/subversion/trunk:1180089-1181830

Modified: subversion/branches/tree-read-api/INSTALL
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/INSTALL?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/INSTALL (original)
+++ subversion/branches/tree-read-api/INSTALL Tue Oct 11 15:16:47 2011
@@ -195,10 +195,7 @@ I.    INTRODUCTION
 
       Whenever you want to build any part of Subversion, you need the
       Apache Portable Runtime (APR) and the APR Utility (APR-util)
-      libraries. These are included in the Subversion dependency package -
-      if you are building from a source tarball and wish to use the versions
-      of APR and APR-util included there, just unpack the dependency package
-      and skip ahead to the next requirement.
+      libraries.
 
 
         ****************************************************************
@@ -233,7 +230,7 @@ I.    INTRODUCTION
         | Note that it's *perfectly* safe to use APR 1.X from the      |
         | beginning.  In fact, we recommend it.  If you're building    |
         | Subversion for the first time, there's no compatibility      |
-        | issue to worry about, so grab the latest version of APR.
+        | issue to worry about, so grab the latest version of APR.     |
         |                                                              |
         | If you already have a Subversion installation using APR      |
         | 0.9.x, it's still possible to move to APR 1.X safely.  Just  |
@@ -242,8 +239,8 @@ I.    INTRODUCTION
         |______________________________________________________________|
 
 
-      If you are not building from a tarball with the dependency
-      package, you will need to get these yourself:
+      If you do not have a pre-installed APR and APR-util, you will need
+      to get these yourself:
 
           http://apr.apache.org/download.cgi
 
@@ -737,7 +734,7 @@ II.   INSTALLATION
       of the libsvn_* libraries.
 
       Note that if you commonly build with the -jN option to make and
-      have unpacked a dependency tarball into your checkout, the make
+      have used the get-deps.sh script to fetch dependencies, the make
       step above may fail, because we don't ensure that third party
       libraries in our source tree will finish building before
       subversion itself.  If you want to use -jN, use the following

Propchange: subversion/branches/tree-read-api/subversion/include/private/svn_adler32.h
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 11 15:16:47 2011
@@ -44,3 +44,4 @@
 /subversion/branches/tc_url_rev/subversion/libsvn_diff/diff.h:874351-874483
 /subversion/branches/tree-conflicts/subversion/libsvn_diff/diff.h:868291-873154
 /subversion/branches/tree-conflicts-notify/subversion/libsvn_diff/diff.h:873926-874008
+/subversion/trunk/subversion/include/private/svn_adler32.h:1180089-1181830

Propchange: subversion/branches/tree-read-api/subversion/include/private/svn_string_private.h
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 11 15:16:47 2011
@@ -53,3 +53,4 @@
 /subversion/branches/tree-conflicts/subversion/include/svn_string.h:868291-873154
 /subversion/branches/tree-conflicts-notify/subversion/include/svn_string.h:873926-874008
 /subversion/branches/uris-as-urls/subversion/include/svn_string.h:1060426-1064427
+/subversion/trunk/subversion/include/private/svn_string_private.h:1180089-1181830

Propchange: subversion/branches/tree-read-api/subversion/include/private/svn_temp_serializer.h
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 11 15:16:47 2011
@@ -1,2 +1,2 @@
 /subversion/branches/revprop-packing/subversion/include/private/svn_temp_serializer.h:1143907,1143971,1144017,1144568,1146145
-/subversion/trunk/subversion/include/private/svn_temp_serializer.h:1067687-1072301
+/subversion/trunk/subversion/include/private/svn_temp_serializer.h:1067687-1072301,1180089-1181830

Modified: subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h (original)
+++ subversion/branches/tree-read-api/subversion/include/private/svn_wc_private.h Tue Oct 11 15:16:47 2011
@@ -339,10 +339,10 @@ svn_wc__node_get_children_of_working_nod
                                           apr_pool_t *scratch_pool);
 
 /**
- * Like svn_wc__node_get_children2(), except also include any path that was
- * a child of a deleted directory that existed at @a dir_abspath, even if
- * that directory is now scheduled to be replaced by the working node at
- * @a dir_abspath.
+ * Like svn_wc__node_get_children_of_working_node(), except also include any
+ * path that was a child of a deleted directory that existed at
+ * @a dir_abspath, even if that directory is now scheduled to be replaced by
+ * the working node at @a dir_abspath.
  */
 svn_error_t *
 svn_wc__node_get_children(const apr_array_header_t **children,

Modified: subversion/branches/tree-read-api/subversion/include/svn_sorts.h
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/include/svn_sorts.h?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/include/svn_sorts.h (original)
+++ subversion/branches/tree-read-api/subversion/include/svn_sorts.h Tue Oct 11 15:16:47 2011
@@ -182,6 +182,16 @@ svn_sort__array_insert(const void *new_e
                        int insert_index);
 
 
+/* Remove ELEMENTS_TO_DELETE elements starting  at DELETE_INDEX from the
+   array ARR. If DELETE_INDEX is not a valid element of ARR,
+   ELEMENTS_TO_DELETE is not greater than zero, or
+   DELETE_INDEX + ELEMENTS_TO_DELETE is greater than ARR->NELTS, then do
+   nothing. */
+void
+svn_sort__array_delete(apr_array_header_t *arr,
+                       int delete_index,
+                       int elements_to_delete);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/branches/tree-read-api/subversion/include/svn_types.h
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/include/svn_types.h?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/include/svn_types.h (original)
+++ subversion/branches/tree-read-api/subversion/include/svn_types.h Tue Oct 11 15:16:47 2011
@@ -81,6 +81,22 @@ extern "C" {
 # endif
 #endif
 
+
+
+/** YABT:  Yet Another Boolean Type */
+typedef int svn_boolean_t;
+
+#ifndef TRUE
+/** uhh... true */
+#define TRUE 1
+#endif /* TRUE */
+
+#ifndef FALSE
+/** uhh... false */
+#define FALSE 0
+#endif /* FALSE */
+
+
 
 /** Subversion error object.
  *
@@ -188,28 +204,15 @@ svn__apr_hash_index_val(const apr_hash_i
 
 /** @} */
 
-/** The various types of nodes in the Subversion filesystem. */
-typedef enum svn_node_kind_t
-{
-  /** absent */
-  svn_node_none,
-
-  /** regular file */
-  svn_node_file,
-
-  /** directory */
-  svn_node_dir,
-
-  /** something's here, but we don't know what */
-  svn_node_unknown
-} svn_node_kind_t;
-
-/* A node kind.
+/** A node kind.
  *
  * @since New in 1.8. Replaces svn_node_kind_t.
  */
 typedef enum svn_kind_t
 {
+  /** something's here, but we don't know what */
+  svn_kind_unknown,
+
   /** absent */
   svn_kind_none,
 
@@ -220,12 +223,29 @@ typedef enum svn_kind_t
   svn_kind_dir,
 
   /** symbolic link */
-  svn_kind_symlink,
+  svn_kind_symlink
 
-  /** something's here, but we don't know what */
-  svn_kind_unknown
 } svn_kind_t;
 
+/** The various types of nodes in the Subversion filesystem.
+ *
+ * This type is superseded by #svn_kind_t and will be deprecated when
+ * transition to the new type is complete. */
+typedef enum svn_node_kind_t
+{
+  /** absent */
+  svn_node_none,
+
+  /** regular file */
+  svn_node_file,
+
+  /** directory */
+  svn_node_dir,
+
+  /** something's here, but we don't know what */
+  svn_node_unknown
+} svn_node_kind_t;
+
 /** Return a constant string expressing @a kind as an English word, e.g.,
  * "file", "dir", etc.  The string is not localized, as it may be used for
  * client<->server communications.  If the kind is not recognized, return
@@ -245,6 +265,24 @@ svn_node_kind_to_word(svn_node_kind_t ki
 svn_node_kind_t
 svn_node_kind_from_word(const char *word);
 
+/** Return the #svn_node_kind_t corresponding to the given #svn_kind_t;
+ * #svn_kind_symlink will become #svn_node_file.
+ *
+ * @since New in 1.8.
+ */
+svn_node_kind_t
+svn__node_kind_from_kind(svn_kind_t kind);
+
+/** Return the #svn_kind_t corresponding to the given #svn_node_kind_t,
+ * or #svn_kind_symlink if @a is_symlink is true.
+ *
+ * @since New in 1.8.
+ */
+svn_kind_t
+svn__kind_from_node_kind(svn_node_kind_t kind,
+                         svn_boolean_t is_symlink);
+
+
 /** Generic three-state property to represent an unknown value for values
  * that are just like booleans.  The values have been set deliberately to
  * make tristates disjoint from #svn_boolean_t.
@@ -378,20 +416,6 @@ typedef apr_int64_t svn_filesize_t;
 #endif
 
 
-/** YABT:  Yet Another Boolean Type */
-typedef int svn_boolean_t;
-
-#ifndef TRUE
-/** uhh... true */
-#define TRUE 1
-#endif /* TRUE */
-
-#ifndef FALSE
-/** uhh... false */
-#define FALSE 0
-#endif /* FALSE */
-
-
 /** An enum to indicate whether recursion is needed. */
 enum svn_recurse_kind
 {

Modified: subversion/branches/tree-read-api/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/libsvn_client/merge.c?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/tree-read-api/subversion/libsvn_client/merge.c Tue Oct 11 15:16:47 2011
@@ -293,7 +293,7 @@ typedef struct merge_cmd_baton_t {
 /*** Utilities ***/
 
 /* Return SVN_ERR_UNSUPPORTED_FEATURE if URL is not inside the repository
-   of LOCAL_ABSPAT.  Use SCRATCH_POOL for temporary allocations. */
+   of LOCAL_ABSPATH.  Use SCRATCH_POOL for temporary allocations. */
 static svn_error_t *
 check_repos_match(merge_cmd_baton_t *merge_b,
                   const char *local_abspath,
@@ -4770,30 +4770,6 @@ make_merge_conflict_error(const char *ta
      r->start, r->end, svn_dirent_local_style(target_wcpath, scratch_pool));
 }
 
-/* Remove the element at IDX from the array ARR.
-   If IDX is not a valid element of ARR do nothing. */
-static void
-remove_element_from_array(apr_array_header_t *arr,
-                          int idx)
-{
-  /* Do we have a valid index? */
-  if (idx >= 0 && idx < arr->nelts)
-    {
-      if (idx == (arr->nelts - 1))
-        {
-          /* Deleting the last or only element in an array is easy. */
-          apr_array_pop(arr);
-        }
-      else
-        {
-          memmove(arr->elts + arr->elt_size * idx,
-                  arr->elts + arr->elt_size * (idx + 1),
-                  arr->elt_size * (arr->nelts - 1 - idx));
-          --(arr->nelts);
-        }
-    }
-}
-
 /* Helper for do_directory_merge().
 
    TARGET_WCPATH is a directory and CHILDREN_WITH_MERGEINFO is filled
@@ -4819,7 +4795,7 @@ remove_absent_children(const char *targe
       if ((child->absent || child->scheduled_for_deletion)
           && svn_dirent_is_ancestor(target_wcpath, child->abspath))
         {
-          remove_element_from_array(children_with_mergeinfo, i--);
+          svn_sort__array_delete(children_with_mergeinfo, i--, 1);
         }
     }
 }
@@ -4855,8 +4831,7 @@ remove_children_with_deleted_mergeinfo(m
                        child->abspath,
                        APR_HASH_KEY_STRING))
         {
-          remove_element_from_array(notify_b->children_with_mergeinfo,
-                                    i--);
+          svn_sort__array_delete(notify_b->children_with_mergeinfo, i--, 1);
         }
     }
 }

Propchange: subversion/branches/tree-read-api/subversion/libsvn_fs_fs/temp_serializer.c
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 11 15:16:47 2011
@@ -1,2 +1,2 @@
 /subversion/branches/revprop-packing/subversion/libsvn_fs_fs/temp_serializer.c:1143907,1143971,1144017,1144568,1146145
-/subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c:1067687-1072301
+/subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.c:1067687-1072301,1180089-1181830

Propchange: subversion/branches/tree-read-api/subversion/libsvn_fs_fs/temp_serializer.h
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 11 15:16:47 2011
@@ -1,2 +1,2 @@
 /subversion/branches/revprop-packing/subversion/libsvn_fs_fs/temp_serializer.h:1143907,1143971,1144017,1144568,1146145
-/subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h:1067687-1072301
+/subversion/trunk/subversion/libsvn_fs_fs/temp_serializer.h:1067687-1072301,1180089-1181830

Propchange: subversion/branches/tree-read-api/subversion/libsvn_subr/adler32.c
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 11 15:16:47 2011
@@ -2,3 +2,4 @@
 /subversion/branches/diff-optimizations-bytes/subversion/libsvn_subr/adler32.c:1037353-1067789
 /subversion/branches/performance/subversion/libsvn_subr/adler32.c:1067697-1078365
 /subversion/branches/revprop-packing/subversion/libsvn_subr/adler32.c:1143907,1143971,1144017,1144568,1146145
+/subversion/trunk/subversion/libsvn_subr/adler32.c:1180089-1181830

Propchange: subversion/branches/tree-read-api/subversion/libsvn_subr/hash.c
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 11 15:16:47 2011
@@ -53,3 +53,4 @@
 /subversion/branches/tree-conflicts/subversion/libsvn_subr/hash.c:868291-873154
 /subversion/branches/tree-conflicts-notify/subversion/libsvn_subr/hash.c:873926-874008
 /subversion/branches/uris-as-urls/subversion/libsvn_subr/hash.c:1060426-1064427
+/subversion/trunk/subversion/libsvn_subr/hash.c:1180089-1181830

Modified: subversion/branches/tree-read-api/subversion/libsvn_subr/kitchensink.c
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/libsvn_subr/kitchensink.c?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/libsvn_subr/kitchensink.c (original)
+++ subversion/branches/tree-read-api/subversion/libsvn_subr/kitchensink.c Tue Oct 11 15:16:47 2011
@@ -26,7 +26,7 @@
 
 #include "svn_types.h"
 #include "svn_error.h"
-#include "svn_mergeinfo.h"
+#include "svn_string.h"
 #include "svn_private_config.h"
 
 svn_error_t *
@@ -120,29 +120,35 @@ svn_depth_from_word(const char *word)
   return svn_depth_unknown;
 }
 
-const char *
-svn_inheritance_to_word(svn_mergeinfo_inheritance_t inherit)
+svn_node_kind_t
+svn__node_kind_from_kind(svn_kind_t kind)
 {
-  switch (inherit)
+  switch (kind)
     {
-    case svn_mergeinfo_inherited:
-      return "inherited";
-    case svn_mergeinfo_nearest_ancestor:
-      return "nearest-ancestor";
-    default:
-      return "explicit";
+    case svn_kind_unknown:  return svn_node_unknown;
+    case svn_kind_none:     return svn_node_none;
+    case svn_kind_file:     return svn_node_file;
+    case svn_kind_dir:      return svn_node_dir;
+    case svn_kind_symlink:  return svn_node_file;
+    default: SVN_ERR_MALFUNCTION_NO_RETURN();
     }
 }
 
-
-svn_mergeinfo_inheritance_t
-svn_inheritance_from_word(const char *word)
+svn_kind_t
+svn__kind_from_node_kind(svn_node_kind_t kind,
+                         svn_boolean_t is_symlink)
 {
-  if (strcmp(word, "inherited") == 0)
-    return svn_mergeinfo_inherited;
-  if (strcmp(word, "nearest-ancestor") == 0)
-    return svn_mergeinfo_nearest_ancestor;
-  return svn_mergeinfo_explicit;
+  if (is_symlink)
+    return svn_kind_symlink;
+
+  switch (kind)
+    {
+    case svn_node_unknown:  return svn_kind_unknown;
+    case svn_node_none:     return svn_kind_none;
+    case svn_node_file:     return svn_kind_file;
+    case svn_node_dir:      return svn_kind_dir;
+    default: SVN_ERR_MALFUNCTION_NO_RETURN();
+    }
 }
 
 const char *

Modified: subversion/branches/tree-read-api/subversion/libsvn_subr/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/libsvn_subr/mergeinfo.c?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/libsvn_subr/mergeinfo.c (original)
+++ subversion/branches/tree-read-api/subversion/libsvn_subr/mergeinfo.c Tue Oct 11 15:16:47 2011
@@ -742,68 +742,401 @@ svn_mergeinfo_parse(svn_mergeinfo_t *mer
   return err;
 }
 
+/* Cleanup after svn_rangelist_merge2 when it modifies the ending range of
+   a single rangelist element in-place.
+
+   If *RANGE_INDEX is not a valid element in RANGELIST do nothing.  Otherwise
+   ensure that RANGELIST[*RANGE_INDEX]->END does not adjoin or overlap any
+   subsequent ranges in RANGELIST.
+
+   If overlap is found, then remove, modify, and/or add elements to RANGELIST
+   as per the invariants for rangelists documented in svn_mergeinfo.h.  If
+   RANGELIST[*RANGE_INDEX]->END adjoins a subsequent element then combine the
+   elements if their inheritability permits -- The inheritance of intersecting
+   and adjoining ranges is handled as per svn_mergeinfo_merge2.  Upon return
+   set *RANGE_INDEX to the index of the youngest element modified, added, or
+   adjoined to RANGELIST[*RANGE_INDEX].
+
+   Note: Adjoining rangelist elements are those where the end rev of the older
+   element is equal to the start rev of the younger element.
+
+   Any new elements inserted into RANGELIST are allocated in  RESULT_POOL.*/
+static void
+adjust_remaining_ranges(apr_array_header_t *rangelist,
+                        int *range_index,
+                        apr_pool_t *result_pool)
+{
+  int i;
+  int starting_index;
+  int elements_to_delete = 0;
+  svn_merge_range_t *modified_range;
+
+  if (*range_index >= rangelist->nelts)
+    return;
+
+  starting_index = *range_index + 1;
+  modified_range = APR_ARRAY_IDX(rangelist, *range_index, svn_merge_range_t *);
+
+  for (i = *range_index + 1; i < rangelist->nelts; i++)
+    {
+      svn_merge_range_t *next_range = APR_ARRAY_IDX(rangelist, i,
+                                                    svn_merge_range_t *);
+
+      /* If MODIFIED_RANGE doesn't adjoin or overlap the next range in
+         RANGELIST then we are finished. */
+      if (modified_range->end < next_range->start)
+        break;
+
+      /* Does MODIFIED_RANGE adjoin NEXT_RANGE? */
+      if (modified_range->end == next_range->start)
+        {
+          if (modified_range->inheritable == next_range->inheritable)
+            {
+              /* Combine adjoining ranges with the same inheritability. */
+              modified_range->end = next_range->end;
+              elements_to_delete++;
+            }
+          else
+            {
+              /* Cannot join because inheritance differs. */
+              (*range_index)++;
+            }
+          break;
+        }
+
+      /* Alright, we know MODIFIED_RANGE overlaps NEXT_RANGE, but how? */
+      if (modified_range->end > next_range->end)
+        {
+          /* NEXT_RANGE is a proper subset of MODIFIED_RANGE and the two
+             don't share the same end range. */
+          if (modified_range->inheritable
+              || (modified_range->inheritable == next_range->inheritable))
+            {
+              /* MODIFIED_RANGE absorbs NEXT_RANGE. */
+              elements_to_delete++;
+            }
+          else
+            {
+              /* NEXT_RANGE is a proper subset MODIFIED_RANGE but
+                 MODIFIED_RANGE is non-inheritable and NEXT_RANGE is
+                 inheritable.  This means MODIFIED_RANGE is truncated,
+                 NEXT_RANGE remains, and the portion of MODIFIED_RANGE
+                 younger than NEXT_RANGE is added as a separate range:
+                  ______________________________________________
+                 |                                              |
+                 M                 MODIFIED_RANGE               N
+                 |                 (!inhertiable)               |
+                 |______________________________________________|
+                                  |              |
+                                  O  NEXT_RANGE  P
+                                  | (inheritable)|
+                                  |______________|
+                                         |
+                                         V
+                  _______________________________________________
+                 |                |              |               |
+                 M MODIFIED_RANGE O  NEXT_RANGE  P   NEW_RANGE   N
+                 | (!inhertiable) | (inheritable)| (!inheritable)|
+                 |________________|______________|_______________|
+              */
+              svn_merge_range_t *new_modified_range =
+                apr_palloc(result_pool, sizeof(*new_modified_range));
+              new_modified_range->start = next_range->end;
+              new_modified_range->end = modified_range->end;
+              new_modified_range->inheritable = FALSE;
+              modified_range->end = next_range->start;
+              (*range_index)+=2;
+              svn_sort__array_insert(&new_modified_range, rangelist,
+                                     *range_index);
+              /* Recurse with the new range. */
+              adjust_remaining_ranges(rangelist, range_index, result_pool);
+              break;
+            }
+        }
+      else if (modified_range->end == next_range->end)
+        {
+          /* NEXT_RANGE is a proper subset MODIFIED_RANGE and share
+             the same end range. */
+          if (modified_range->inheritable
+              || (modified_range->inheritable == next_range->inheritable))
+            {
+              /* MODIFIED_RANGE absorbs NEXT_RANGE. */
+              elements_to_delete++;
+            }
+          else
+            {
+              /* The intersection between MODIFIED_RANGE and NEXT_RANGE is
+                 absorbed by the latter. */
+              modified_range->end = next_range->start;
+              (*range_index)++;
+            }
+          break;
+        }
+      else
+        {
+          /* NEXT_RANGE and MODIFIED_RANGE intersect but NEXT_RANGE is not
+             a proper subset of MODIFIED_RANGE, nor do the two share the
+             same end revision, i.e. they overlap. */
+          if (modified_range->inheritable == next_range->inheritable)
+            {
+              /* Combine overlapping ranges with the same inheritability. */
+              modified_range->end = next_range->end;
+              elements_to_delete++;
+            }
+          else if (modified_range->inheritable)
+            {
+              /* MODIFIED_RANGE absorbs the portion of NEXT_RANGE it overlaps
+                 and NEXT_RANGE is truncated. */
+              next_range->start = modified_range->end;
+              (*range_index)++;
+            }
+          else
+            {
+              /* NEXT_RANGE absorbs the portion of MODIFIED_RANGE it overlaps
+                 and MODIFIED_RANGE is truncated. */
+              modified_range->end = next_range->start;
+              (*range_index)++;
+            }
+          break;
+        }
+    }
+
+  if (elements_to_delete)
+    svn_sort__array_delete(rangelist, starting_index, elements_to_delete);
+}
+
 svn_error_t *
 svn_rangelist_merge2(apr_array_header_t *rangelist,
                      const apr_array_header_t *changes,
                      apr_pool_t *result_pool,
                      apr_pool_t *scratch_pool)
 {
-  int i, j;
-  apr_array_header_t *original_rangelist;
-  
-  original_rangelist = apr_array_copy(scratch_pool, rangelist);
-  apr_array_clear(rangelist);
+  int i = 0;
+  int j = 0;
 
-  i = 0;
-  j = 0;
-  while (i < (original_rangelist)->nelts && j < changes->nelts)
-    {
-      svn_merge_range_t *elt1, *elt2;
-      int res;
+  /* We may modify CHANGES, so make a copy in SCRATCH_POOL. */
+  changes = svn_rangelist_dup(changes, scratch_pool);
 
-      elt1 = APR_ARRAY_IDX(original_rangelist, i, svn_merge_range_t *);
-      elt2 = APR_ARRAY_IDX(changes, j, svn_merge_range_t *);
+  while (i < rangelist->nelts && j < changes->nelts)
+    {
+      svn_merge_range_t *range =
+        APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *);
+      svn_merge_range_t *change =
+        APR_ARRAY_IDX(changes, j, svn_merge_range_t *);
+      int res = svn_sort_compare_ranges(&range, &change);
 
-      res = svn_sort_compare_ranges(&elt1, &elt2);
       if (res == 0)
         {
           /* Only when merging two non-inheritable ranges is the result also
              non-inheritable.  In all other cases ensure an inheritiable
              result. */
-          if (elt1->inheritable || elt2->inheritable)
-            elt1->inheritable = TRUE;
-          SVN_ERR(combine_with_lastrange(elt1, rangelist, TRUE, result_pool));
+          if (range->inheritable || change->inheritable)
+            range->inheritable = TRUE;
           i++;
           j++;
         }
-      else if (res < 0)
+      else if (res < 0) /* CHANGE is younger than RANGE */
         {
-          SVN_ERR(combine_with_lastrange(elt1, rangelist, TRUE, result_pool));
-          i++;
+          if (range->end < change->start)
+            {
+              /* RANGE is older than CHANGE and the two do not
+                 adjoin or overlap */
+              i++;
+            }
+          else if (range->end == change->start)
+            {
+              /* RANGE and CHANGE adjoin */
+              if (range->inheritable == change->inheritable)
+                {
+                  /* RANGE and CHANGE have the same inheritability so
+                     RANGE expands to absord CHANGE. */
+                  range->end = change->end;
+                  adjust_remaining_ranges(rangelist, &i, result_pool);
+                  j++;
+                }
+              else
+                {
+                  /* RANGE and CHANGE adjoin, but have different
+                     inheritability.  Since RANGE is older, just
+                     move on to the next RANGE. */
+                  i++;
+                }
+            }
+          else
+            {
+              /* RANGE and CHANGE overlap, but how? */
+              if ((range->inheritable == change->inheritable)
+                  || range->inheritable)
+                {
+                  /* If CHANGE is a proper subset of RANGE, it absorbs RANGE
+                      with no adjustment otherwise only the intersection is
+                      absorbed and CHANGE is truncated. */
+                  if (range->end >= change->end)
+                    j++;
+                  else
+                    change->start = range->end;
+                }
+              else
+                {
+                  /* RANGE is non-inheritable and CHANGE is inheritable. */
+                  if (range->start < change->start)
+                    {
+                      /* CHANGE absorbs intersection with RANGE and RANGE
+                         is truncated. */
+                      svn_merge_range_t *range_copy =
+                        svn_merge_range_dup(range, result_pool);
+                      range_copy->end = change->start;
+                      range->start = change->start;
+                      svn_sort__array_insert(&range_copy, rangelist, i++);
+                    }
+                  else
+                    {
+                      /* CHANGE and RANGE share the same start rev, but
+                         RANGE is considered older because its end rev
+                         is older. */
+                      range->inheritable = TRUE;
+                      change->start = range->end;
+                    }
+                }
+            }
         }
-      else
+      else /* res > 0, CHANGE is older than RANGE */
         {
-          SVN_ERR(combine_with_lastrange(elt2, rangelist, TRUE, result_pool));
-          j++;
+          if (change->end < range->start)
+            {
+              /* CHANGE is older than RANGE and the two do not
+                 adjoin or overlap, so insert a copy of CHANGE
+                 into RANGELIST. */
+              svn_merge_range_t *change_copy =
+                svn_merge_range_dup(change, result_pool);
+              svn_sort__array_insert(&change_copy, rangelist, i++);
+              j++;
+            }
+          else if (change->end == range->start)
+            {
+              /* RANGE and CHANGE adjoin */
+              if (range->inheritable == change->inheritable)
+                {
+                  /* RANGE and CHANGE have the same inheritability so we
+                     can simply combine the two in place. */
+                  range->start = change->start;
+                  j++;
+                }
+              else
+                {
+                  /* RANGE and CHANGE have different inheritability so insert
+                     a copy of CHANGE into RANGELIST. */
+                  svn_merge_range_t *change_copy =
+                    svn_merge_range_dup(change, result_pool);
+                  svn_sort__array_insert(&change_copy, rangelist, i);
+                  j++;
+                }
+            }
+          else
+            {
+              /* RANGE and CHANGE overlap. */
+              if (range->inheritable == change->inheritable)
+                {
+                  /* RANGE and CHANGE have the same inheritability so we
+                     can simply combine the two in place... */
+                  range->start = change->start;
+                  if (range->end < change->end)
+                    {
+                      /* ...but if RANGE is expanded ensure that we don't
+                         violate any rangelist invariants. */
+                      range->end = change->end;
+                      adjust_remaining_ranges(rangelist, &i, result_pool);
+                    }
+                  j++;
+                }
+              else if (range->inheritable)
+                {
+                  if (change->start < range->start)
+                    {
+                      /* RANGE is inheritable so absorbs any part of CHANGE
+                         it overlaps.  CHANGE is truncated and the remainder
+                         inserted into RANGELIST. */
+                      svn_merge_range_t *change_copy =
+                        svn_merge_range_dup(change, result_pool);
+                      change_copy->end = range->start;
+                      change->start = range->start;
+                      svn_sort__array_insert(&change_copy, rangelist, i++);
+                    }
+                  else
+                    {
+                      /* CHANGE and RANGE share the same start rev, but
+                         CHANGE is considered older because CHANGE->END is
+                         older than RANGE->END. */
+                      j++;
+                    }
+                }
+              else
+                {
+                  /* RANGE is non-inheritable and CHANGE is inheritable. */
+                  if (change->start < range->start)
+                    {
+                      if (change->end == range->end)
+                        {
+                          /* RANGE is a proper subset of CHANGE and share the
+                             same end revision, so set RANGE equal to CHANGE. */
+                          range->start = change->start;
+                          range->inheritable = TRUE;
+                          j++;
+                        }
+                      else if (change->end > range->end)
+                        {
+                          /* RANGE is a proper subset of CHANGE and CHANGE has
+                             a younger end revision, so set RANGE equal to its
+                             intersection with CHANGE and truncate CHANGE. */
+                          range->start = change->start;
+                          range->inheritable = TRUE;
+                          change->start = range->end;
+                        }
+                      else
+                        {
+                          /* CHANGE and RANGE overlap. Set RANGE equal to its
+                             intersection with CHANGE and take the remainder
+                             of RANGE and insert it into RANGELIST. */
+                          svn_merge_range_t *range_copy =
+                            svn_merge_range_dup(range, result_pool);
+                          range_copy->start = change->end;
+                          range->start = change->start;
+                          range->end = change->end;
+                          range->inheritable = TRUE;
+                          svn_sort__array_insert(&range_copy, rangelist, ++i);
+                          j++;
+                        }
+                    }
+                  else 
+                    {
+                      /* CHANGE and RANGE share the same start rev, but
+                         CHANGE is considered older because its end rev
+                         is older.
+                         
+                         Insert the intersection of RANGE and CHANGE into
+                         RANGELIST and then set RANGE to the non-intersecting
+                         portion of RANGE. */
+                      svn_merge_range_t *range_copy =
+                        svn_merge_range_dup(range, result_pool);
+                      range_copy->end = change->end;
+                      range_copy->inheritable = TRUE;
+                      range->start = change->end;
+                      svn_sort__array_insert(&range_copy, rangelist, i++);
+                      j++;
+                    }
+                }
+            }
         }
     }
-  /* Copy back any remaining elements.
-     Only one of these loops should end up running, if anything. */
-
-  SVN_ERR_ASSERT(!(i < (original_rangelist)->nelts && j < changes->nelts));
 
-  for (; i < (original_rangelist)->nelts; i++)
+  /* Copy any remaining elements in CHANGES into RANGELIST. */
+  for (; j < (changes)->nelts; j++)
     {
-      svn_merge_range_t *elt = APR_ARRAY_IDX(original_rangelist, i,
-                                             svn_merge_range_t *);
-      SVN_ERR(combine_with_lastrange(elt, rangelist, TRUE, result_pool));
-    }
-
-
-  for (; j < changes->nelts; j++)
-    {
-      svn_merge_range_t *elt = APR_ARRAY_IDX(changes, j, svn_merge_range_t *);
-      SVN_ERR(combine_with_lastrange(elt, rangelist, TRUE, result_pool));
+      svn_merge_range_t *change =
+        APR_ARRAY_IDX(changes, j, svn_merge_range_t *);
+      svn_merge_range_t *change_copy = svn_merge_range_dup(change,
+                                                           result_pool);
+      svn_sort__array_insert(&change_copy, rangelist, rangelist->nelts);
     }
 
   return SVN_NO_ERROR;
@@ -2280,3 +2613,27 @@ svn_mergeinfo__mergeinfo_from_segments(s
   *mergeinfo_p = mergeinfo;
   return SVN_NO_ERROR;
 }
+
+const char *
+svn_inheritance_to_word(svn_mergeinfo_inheritance_t inherit)
+{
+  switch (inherit)
+    {
+    case svn_mergeinfo_inherited:
+      return "inherited";
+    case svn_mergeinfo_nearest_ancestor:
+      return "nearest-ancestor";
+    default:
+      return "explicit";
+    }
+}
+
+svn_mergeinfo_inheritance_t
+svn_inheritance_from_word(const char *word)
+{
+  if (strcmp(word, "inherited") == 0)
+    return svn_mergeinfo_inherited;
+  if (strcmp(word, "nearest-ancestor") == 0)
+    return svn_mergeinfo_nearest_ancestor;
+  return svn_mergeinfo_explicit;
+}

Modified: subversion/branches/tree-read-api/subversion/libsvn_subr/sorts.c
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/libsvn_subr/sorts.c?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/libsvn_subr/sorts.c (original)
+++ subversion/branches/tree-read-api/subversion/libsvn_subr/sorts.c Tue Oct 11 15:16:47 2011
@@ -245,3 +245,35 @@ svn_sort__array_insert(const void *new_e
   /* Copy in the new element */
   memcpy(new_position, new_element, array->elt_size);
 }
+
+void
+svn_sort__array_delete(apr_array_header_t *arr,
+                       int delete_index,
+                       int elements_to_delete)
+{
+  /* Do we have a valid index and are there enough elements? */
+  if (delete_index >= 0
+      && delete_index < arr->nelts
+      && elements_to_delete > 0
+      && (elements_to_delete + delete_index) <= arr->nelts)
+    {
+      if (delete_index == (arr->nelts - 1))
+        {
+          /* Deleting the last or only element in an array is easy. */
+          apr_array_pop(arr);
+        }
+      else if ((delete_index + elements_to_delete) == arr->nelts)
+        {
+          /* Delete the last ELEMENTS_TO_DELETE elements. */
+          arr->nelts -= elements_to_delete;
+        }
+      else
+        {
+          memmove(
+            arr->elts + arr->elt_size * delete_index,
+            arr->elts + (arr->elt_size * (delete_index + elements_to_delete)),
+            arr->elt_size * (arr->nelts - elements_to_delete - delete_index));
+          arr->nelts -= elements_to_delete;
+        }
+    }
+}

Modified: subversion/branches/tree-read-api/subversion/libsvn_subr/sqlite.c
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/libsvn_subr/sqlite.c?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/libsvn_subr/sqlite.c (original)
+++ subversion/branches/tree-read-api/subversion/libsvn_subr/sqlite.c Tue Oct 11 15:16:47 2011
@@ -637,12 +637,6 @@ init_sqlite(void *baton, apr_pool_t *poo
 
 #endif /* APR_HAS_THRADS */
 
-  /* SQLite 3.5 allows sharing cache instances, even in a multithreaded
-     environment. This allows sharing cached data when we open a database
-     more than once (Very common in the current pre-single-database state) */
-  SQLITE_ERR_MSG(sqlite3_enable_shared_cache(TRUE),
-                 _("Could not initialize SQLite shared cache"));
-
   return SVN_NO_ERROR;
 }
 
@@ -673,6 +667,13 @@ internal_open(sqlite3 **db3, const char 
     flags |= SQLITE_OPEN_NOMUTEX;
 #endif
 
+    /* SQLite 3.5 allows sharing cache instances, even in a multithreaded
+       environment. This allows sharing cached data when we open a database
+       more than once.
+
+       OS X 10.7 doesn't support sqlite3_enable_shared_cache. */
+    flags |= SQLITE_OPEN_SHAREDCACHE;
+
     /* Open the database. Note that a handle is returned, even when an error
        occurs (except for out-of-memory); thus, we can safely use it to
        extract an error message and construct an svn_error_t. */

Propchange: subversion/branches/tree-read-api/subversion/libsvn_subr/svn_temp_serializer.c
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 11 15:16:47 2011
@@ -1,2 +1,2 @@
 /subversion/branches/revprop-packing/subversion/libsvn_subr/svn_temp_serializer.c:1143907,1143971,1144017,1144568,1146145
-/subversion/trunk/subversion/libsvn_subr/svn_temp_serializer.c:1067687-1072301
+/subversion/trunk/subversion/libsvn_subr/svn_temp_serializer.c:1067687-1072301,1180089-1181830

Modified: subversion/branches/tree-read-api/subversion/libsvn_wc/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/libsvn_wc/status.c?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/libsvn_wc/status.c (original)
+++ subversion/branches/tree-read-api/subversion/libsvn_wc/status.c Tue Oct 11 15:16:47 2011
@@ -184,6 +184,9 @@ struct dir_baton
   /* The pool in which this baton itself is allocated. */
   apr_pool_t *pool;
 
+  /* The repository root relative path to this item in the repository. */
+  const char *repos_relpath;
+
   /* out-of-date info corresponding to ood_* fields in svn_wc_status3_t. */
   svn_node_kind_t ood_kind;
   svn_revnum_t ood_changed_rev;
@@ -223,6 +226,9 @@ struct file_baton
      the code that syncs up the adm dir and working copy. */
   svn_boolean_t prop_changed;
 
+  /* The repository root relative path to this item in the repository. */
+  const char *repos_relpath;
+
   /* out-of-date info corresponding to ood_* fields in svn_wc_status3_t. */
   svn_node_kind_t ood_kind;
   svn_revnum_t ood_changed_rev;
@@ -1573,6 +1579,27 @@ tweak_statushash(void *baton,
     {
       struct dir_baton *b = this_dir_baton;
 
+      if (!statstruct->repos_relpath && b->repos_relpath)
+        {
+          if (statstruct->repos_node_status == svn_wc_status_deleted)
+            {
+              /* When deleting PATH, BATON is for PATH's parent,
+                 so we must construct PATH's real statstruct->url. */
+              statstruct->repos_relpath =
+                            svn_relpath_join(b->repos_relpath,
+                                             svn_dirent_basename(local_abspath,
+                                                                 NULL),
+                                             pool);
+            }
+          else
+            statstruct->repos_relpath = apr_pstrdup(pool, b->repos_relpath);
+
+          statstruct->repos_root_url = 
+                              b->edit_baton->anchor_status->repos_root_url;
+          statstruct->repos_uuid = 
+                              b->edit_baton->anchor_status->repos_uuid;
+        }
+
       /* The last committed date, and author for deleted items
          isn't available. */
       if (statstruct->repos_node_status == svn_wc_status_deleted)
@@ -1606,6 +1633,14 @@ tweak_statushash(void *baton,
       struct file_baton *b = baton;
       statstruct->ood_changed_rev = b->ood_changed_rev;
       statstruct->ood_changed_date = b->ood_changed_date;
+      if (!statstruct->repos_relpath && b->repos_relpath)
+        {
+          statstruct->repos_relpath = apr_pstrdup(pool, b->repos_relpath);
+          statstruct->repos_root_url =
+                          b->edit_baton->anchor_status->repos_root_url;
+          statstruct->repos_uuid =
+                          b->edit_baton->anchor_status->repos_uuid;
+        }
       statstruct->ood_kind = b->ood_kind;
       if (b->ood_changed_author)
         statstruct->ood_changed_author =
@@ -1628,9 +1663,9 @@ find_dir_repos_relpath(const struct dir_
       const svn_wc_status3_t *status = apr_hash_get(pb->statii,
                                                     db->local_abspath,
                                                     APR_HASH_KEY_STRING);
-      /* Note that status->url is NULL in the case of a missing
-       * directory, which means we need to recurse up another level to
-       * get a useful URL. */
+      /* Note that status->repos_relpath could be NULL in the case of a missing
+       * directory, which means we need to recurse up another level to get
+       * a useful relpath. */
       if (status)
         return status->repos_relpath;
 
@@ -1675,6 +1710,7 @@ make_dir_baton(void **dir_baton,
   d->statii = apr_hash_make(pool);
   d->ood_changed_rev = SVN_INVALID_REVNUM;
   d->ood_changed_date = 0;
+  d->repos_relpath = apr_pstrdup(pool, find_dir_repos_relpath(d, pool));
   d->ood_kind = svn_node_dir;
   d->ood_changed_author = NULL;
 
@@ -1768,6 +1804,8 @@ make_file_baton(struct dir_baton *parent
   f->edit_baton = eb;
   f->ood_changed_rev = SVN_INVALID_REVNUM;
   f->ood_changed_date = 0;
+  f->repos_relpath = svn_relpath_join(find_dir_repos_relpath(pb, pool),
+                                      f->name, pool);
   f->ood_kind = svn_node_file;
   f->ood_changed_author = NULL;
   return f;

Modified: subversion/branches/tree-read-api/subversion/tests/libsvn_subr/mergeinfo-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/subversion/tests/libsvn_subr/mergeinfo-test.c?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/subversion/tests/libsvn_subr/mergeinfo-test.c (original)
+++ subversion/branches/tree-read-api/subversion/tests/libsvn_subr/mergeinfo-test.c Tue Oct 11 15:16:47 2011
@@ -1181,7 +1181,7 @@ test_rangelist_merge(apr_pool_t *pool)
     svn_merge_range_t expected_merge[6];
   };
 
-  #define SIZE_OF_RANGE_MERGE_TEST_ARRAY 59
+  #define SIZE_OF_RANGE_MERGE_TEST_ARRAY 68
   /* The actual test data. */
   struct rangelist_merge_test_data test_data[SIZE_OF_RANGE_MERGE_TEST_ARRAY] =
     {
@@ -1266,6 +1266,29 @@ test_rangelist_merge(apr_pool_t *pool)
       {"/A: 2-17", "/A: 1-5*,7*,12-13*", 2,
        {{0, 1, FALSE}, {1, 17, TRUE}}},
 
+      {"/A: 3-4*,10-15,20", "/A: 5-60*", 5,
+       {{2, 9, FALSE}, {9, 15, TRUE}, {15, 19, FALSE},{19, 20, TRUE},
+        {20, 60, FALSE}}},
+
+      {"/A: 5-60*", "/A: 3-4*,10-15,20", 5,
+       {{2, 9, FALSE}, {9, 15, TRUE}, {15, 19, FALSE},{19, 20, TRUE},
+        {20, 60, FALSE}}},
+
+      {"/A: 3-4*,50-100*", "/A: 5-60*", 1, {{2, 100, FALSE}}},
+
+      {"/A: 5-60*", "/A: 3-4*,50-100*", 1, {{2, 100, FALSE}}},
+
+      {"/A: 3-4*,50-100", "/A: 5-60*", 2, {{2, 49, FALSE}, {49, 100, TRUE}}},
+
+      {"/A: 5-60*", "/A: 3-4*,50-100", 2, {{2, 49, FALSE}, {49, 100, TRUE}}},
+
+      {"/A: 3-4,50-100*", "/A: 5-60", 2, {{2, 60, TRUE}, {60, 100, FALSE}}},
+
+      {"/A: 5-60", "/A: 3-4,50-100*", 2, {{2, 60, TRUE}, {60, 100, FALSE}}},
+
+      {"/A: 5,9,11-15,17,200-300,999", "/A: 7-50", 4,
+       {{4, 5, TRUE}, {6, 50, TRUE}, {199, 300, TRUE}, {998, 999, TRUE}}},
+
       /* A rangelist merged with an empty rangelist should equal the
          non-empty rangelist but in compacted form. */
       {"/A: 1-44,45,46,47-50",       "",  1, {{ 0, 50, TRUE }}},

Modified: subversion/branches/tree-read-api/tools/client-side/mergeinfo-sanitizer.py
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/tools/client-side/mergeinfo-sanitizer.py?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/tools/client-side/mergeinfo-sanitizer.py (original)
+++ subversion/branches/tree-read-api/tools/client-side/mergeinfo-sanitizer.py Tue Oct 11 15:16:47 2011
@@ -1,4 +1,23 @@
 #!/usr/bin/env python
+#
+# ====================================================================
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ====================================================================
 import svn
 import sys
 import os

Modified: subversion/branches/tree-read-api/tools/client-side/svn-viewspec.py
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/tools/client-side/svn-viewspec.py?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/tools/client-side/svn-viewspec.py (original)
+++ subversion/branches/tree-read-api/tools/client-side/svn-viewspec.py Tue Oct 11 15:16:47 2011
@@ -20,6 +20,8 @@
 # ====================================================================
 
 """\
+__SCRIPTNAME__: checkout utility for sparse Subversion working copies
+
 Usage: 1. __SCRIPTNAME__ checkout VIEWSPEC-FILE TARGET-DIR
        2. __SCRIPTNAME__ examine VIEWSPEC-FILE
        3. __SCRIPTNAME__ help

Modified: subversion/branches/tree-read-api/tools/dev/benchmarks/suite1/cronjob
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/tools/dev/benchmarks/suite1/cronjob?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/tools/dev/benchmarks/suite1/cronjob (original)
+++ subversion/branches/tree-read-api/tools/dev/benchmarks/suite1/cronjob Tue Oct 11 15:16:47 2011
@@ -1,4 +1,24 @@
 #!/bin/bash
+#
+# ====================================================================
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ====================================================================
+#
 # This is the cronjob as run on our ASF box aka svn-qavm.
 # It uses neels' mad bash script magic called 'pat' to update and
 # build the latest trunk, invokes a benchmark and sends as mail.

Modified: subversion/branches/tree-read-api/tools/dist/collect_sigs.py
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/tools/dist/collect_sigs.py?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/tools/dist/collect_sigs.py (original)
+++ subversion/branches/tree-read-api/tools/dist/collect_sigs.py Tue Oct 11 15:16:47 2011
@@ -75,7 +75,7 @@ def generate_asc_files(target_dir='.'):
 
   db = sqlite3.connect(os.path.join(target_dir, 'sigs.db'))
   curs = db.cursor()
-  like_filename = 'subversion-%s%%' % config.version
+  like_filename = 'subversion-%s.%%' % config.version
   curs.execute('''SELECT filename, signature FROM signatures
                   WHERE filename LIKE ?''', (like_filename, ) )
   for filename, signature in curs:
@@ -183,7 +183,7 @@ def list_signatures():
 
   lines = ""
   curs = db.cursor()
-  like_filename = 'subversion-%s%%' % config.version
+  like_filename = 'subversion-%s.%%' % config.version
   curs.execute('''SELECT filename, COUNT(*) FROM signatures
                   WHERE filename LIKE ?
                   GROUP BY filename ORDER BY filename''',

Modified: subversion/branches/tree-read-api/tools/dist/rat-excludes
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/tools/dist/rat-excludes?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/tools/dist/rat-excludes (original)
+++ subversion/branches/tree-read-api/tools/dist/rat-excludes Tue Oct 11 15:16:47 2011
@@ -15,6 +15,7 @@ doc/doxygen.conf
 notes/**
 packages/
 subversion/tests/cmdline/getopt_tests_data/*
+subversion/tests/cmdline/diff_tests_data/*
 subversion/bindings/swig/NOTES
 subversion/libsvn_fs_base/notes/TODO
 subversion/libsvn_fs_base/notes/fs-history
@@ -31,8 +32,11 @@ subversion/bindings/ctypes-python/csvn/e
 subversion/tests/cmdline/svntest/err.py
 tools/buildbot/master/public_html/buildbot.css
 tools/dist/rat-excludes
+tools/dist/_gnupg.py
+tools/dist/templates/*.ezt
 tools/dev/iz/defect.dem
 tools/dev/iz/ff2csv.command
+tools/dev/benchmarks/suite1/crontab.entry
 tools/hook-scripts/mailer/tests/mailer-t1.output
 **/*.dump
 **/*.icns

Modified: subversion/branches/tree-read-api/tools/dist/release.py
URL: http://svn.apache.org/viewvc/subversion/branches/tree-read-api/tools/dist/release.py?rev=1181833&r1=1181832&r2=1181833&view=diff
==============================================================================
--- subversion/branches/tree-read-api/tools/dist/release.py (original)
+++ subversion/branches/tree-read-api/tools/dist/release.py Tue Oct 11 15:16:47 2011
@@ -626,7 +626,7 @@ def check_sigs(args):
         target = args.target
     else:
         target = os.path.join(os.getenv('HOME'), 'public_html', 'svn',
-                              str(args.version), 'deploy')
+                              str(args.version))
 
     good_sigs = {}