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

svn commit: r1182877 [1/5] - in /subversion/branches/fs-py: ./ subversion/bindings/javahl/native/ subversion/bindings/javahl/src/org/tigris/subversion/javahl/ subversion/bindings/javahl/tests/org/apache/subversion/javahl/ subversion/include/ subversion...

Author: hwright
Date: Thu Oct 13 14:30:07 2011
New Revision: 1182877

URL: http://svn.apache.org/viewvc?rev=1182877&view=rev
Log:
On the fs-py branch:
Bring up-to-date with trunk.

Added:
    subversion/branches/fs-py/subversion/include/private/svn_mutex.h
      - copied unchanged from r1182874, subversion/trunk/subversion/include/private/svn_mutex.h
    subversion/branches/fs-py/subversion/libsvn_subr/svn_mutex.c
      - copied unchanged from r1182874, subversion/trunk/subversion/libsvn_subr/svn_mutex.c
    subversion/branches/fs-py/subversion/libsvn_subr/svn_types.c
      - copied unchanged from r1182874, subversion/trunk/subversion/libsvn_subr/svn_types.c
    subversion/branches/fs-py/tools/client-side/mergeinfo-sanitizer.py
      - copied unchanged from r1182874, subversion/trunk/tools/client-side/mergeinfo-sanitizer.py
    subversion/branches/fs-py/tools/dist/templates/stable-news.ezt
      - copied unchanged from r1182874, subversion/trunk/tools/dist/templates/stable-news.ezt
Removed:
    subversion/branches/fs-py/subversion/libsvn_subr/constructors.c
    subversion/branches/fs-py/subversion/libsvn_subr/kitchensink.c
Modified:
    subversion/branches/fs-py/   (props changed)
    subversion/branches/fs-py/CHANGES
    subversion/branches/fs-py/INSTALL
    subversion/branches/fs-py/build.conf
    subversion/branches/fs-py/subversion/bindings/javahl/native/Array.cpp
    subversion/branches/fs-py/subversion/bindings/javahl/native/JNIUtil.cpp
    subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java
    subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
    subversion/branches/fs-py/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java
    subversion/branches/fs-py/subversion/include/private/ra_svn_sasl.h
    subversion/branches/fs-py/subversion/include/private/svn_mergeinfo_private.h
    subversion/branches/fs-py/subversion/include/private/svn_wc_private.h
    subversion/branches/fs-py/subversion/include/svn_client.h
    subversion/branches/fs-py/subversion/include/svn_ra.h
    subversion/branches/fs-py/subversion/include/svn_repos.h
    subversion/branches/fs-py/subversion/include/svn_sorts.h
    subversion/branches/fs-py/subversion/include/svn_types.h
    subversion/branches/fs-py/subversion/libsvn_client/cleanup.c
    subversion/branches/fs-py/subversion/libsvn_client/client.h
    subversion/branches/fs-py/subversion/libsvn_client/info.c
    subversion/branches/fs-py/subversion/libsvn_client/list.c
    subversion/branches/fs-py/subversion/libsvn_client/log.c
    subversion/branches/fs-py/subversion/libsvn_client/merge.c
    subversion/branches/fs-py/subversion/libsvn_client/mergeinfo.c
    subversion/branches/fs-py/subversion/libsvn_client/ra.c
    subversion/branches/fs-py/subversion/libsvn_fs/fs-loader.c
    subversion/branches/fs-py/subversion/libsvn_fs_base/bdb/env.c
    subversion/branches/fs-py/subversion/libsvn_fs_fs/fs.c
    subversion/branches/fs-py/subversion/libsvn_fs_fs/fs.h
    subversion/branches/fs-py/subversion/libsvn_fs_fs/fs_fs.c
    subversion/branches/fs-py/subversion/libsvn_fs_fs/fs_fs.h
    subversion/branches/fs-py/subversion/libsvn_ra_svn/cyrus_auth.c
    subversion/branches/fs-py/subversion/libsvn_repos/log.c
    subversion/branches/fs-py/subversion/libsvn_subr/cache-inprocess.c
    subversion/branches/fs-py/subversion/libsvn_subr/cache-membuffer.c
    subversion/branches/fs-py/subversion/libsvn_subr/cmdline.c
    subversion/branches/fs-py/subversion/libsvn_subr/dso.c
    subversion/branches/fs-py/subversion/libsvn_subr/mergeinfo.c
    subversion/branches/fs-py/subversion/libsvn_subr/properties.c
    subversion/branches/fs-py/subversion/libsvn_subr/sorts.c
    subversion/branches/fs-py/subversion/libsvn_subr/sqlite.c
    subversion/branches/fs-py/subversion/libsvn_subr/utf.c
    subversion/branches/fs-py/subversion/libsvn_wc/adm_crawler.c
    subversion/branches/fs-py/subversion/libsvn_wc/adm_files.c
    subversion/branches/fs-py/subversion/libsvn_wc/adm_ops.c
    subversion/branches/fs-py/subversion/libsvn_wc/ambient_depth_filter_editor.c
    subversion/branches/fs-py/subversion/libsvn_wc/cleanup.c
    subversion/branches/fs-py/subversion/libsvn_wc/conflicts.c
    subversion/branches/fs-py/subversion/libsvn_wc/conflicts.h
    subversion/branches/fs-py/subversion/libsvn_wc/copy.c
    subversion/branches/fs-py/subversion/libsvn_wc/crop.c
    subversion/branches/fs-py/subversion/libsvn_wc/deprecated.c
    subversion/branches/fs-py/subversion/libsvn_wc/diff_editor.c
    subversion/branches/fs-py/subversion/libsvn_wc/diff_local.c
    subversion/branches/fs-py/subversion/libsvn_wc/entries.c
    subversion/branches/fs-py/subversion/libsvn_wc/externals.c
    subversion/branches/fs-py/subversion/libsvn_wc/info.c
    subversion/branches/fs-py/subversion/libsvn_wc/lock.c
    subversion/branches/fs-py/subversion/libsvn_wc/merge.c
    subversion/branches/fs-py/subversion/libsvn_wc/node.c
    subversion/branches/fs-py/subversion/libsvn_wc/props.c
    subversion/branches/fs-py/subversion/libsvn_wc/props.h
    subversion/branches/fs-py/subversion/libsvn_wc/questions.c
    subversion/branches/fs-py/subversion/libsvn_wc/relocate.c
    subversion/branches/fs-py/subversion/libsvn_wc/status.c
    subversion/branches/fs-py/subversion/libsvn_wc/translate.c
    subversion/branches/fs-py/subversion/libsvn_wc/update_editor.c
    subversion/branches/fs-py/subversion/libsvn_wc/upgrade.c
    subversion/branches/fs-py/subversion/libsvn_wc/wc-metadata.sql
    subversion/branches/fs-py/subversion/libsvn_wc/wc.h
    subversion/branches/fs-py/subversion/libsvn_wc/wc_db.c
    subversion/branches/fs-py/subversion/libsvn_wc/wc_db.h
    subversion/branches/fs-py/subversion/libsvn_wc/workqueue.c
    subversion/branches/fs-py/subversion/libsvn_wc/workqueue.h
    subversion/branches/fs-py/subversion/svnserve/cyrus_auth.c
    subversion/branches/fs-py/subversion/tests/cmdline/authz_tests.py
    subversion/branches/fs-py/subversion/tests/cmdline/log_tests.py
    subversion/branches/fs-py/subversion/tests/cmdline/svnadmin_tests.py
    subversion/branches/fs-py/subversion/tests/libsvn_subr/cache-test.c
    subversion/branches/fs-py/subversion/tests/libsvn_subr/mergeinfo-test.c
    subversion/branches/fs-py/subversion/tests/libsvn_wc/db-test.c
    subversion/branches/fs-py/tools/client-side/svn-viewspec.py
    subversion/branches/fs-py/tools/dev/benchmarks/suite1/cronjob
    subversion/branches/fs-py/tools/dev/unix-build/Makefile.svn
    subversion/branches/fs-py/tools/dev/wc-format.py
    subversion/branches/fs-py/tools/dist/collect_sigs.py
    subversion/branches/fs-py/tools/dist/rat-excludes
    subversion/branches/fs-py/tools/dist/release.py
    subversion/branches/fs-py/tools/dist/templates/rc-news.ezt

Propchange: subversion/branches/fs-py/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Oct 13 14:30:07 2011
@@ -45,6 +45,7 @@
 /subversion/branches/subtree-mergeinfo:876734-878766
 /subversion/branches/svn-mergeinfo-enhancements:870119-870195,870197-870288
 /subversion/branches/svn-patch-improvements:918519-934609
+/subversion/branches/svn_mutex:1141683-1182099
 /subversion/branches/svnpatch-diff:865738-876477
 /subversion/branches/svnraisetc:874709-875149
 /subversion/branches/svnserve-logging:869828-870893
@@ -55,4 +56,4 @@
 /subversion/branches/tree-conflicts:868291-873154
 /subversion/branches/tree-conflicts-notify:873926-874008
 /subversion/branches/uris-as-urls:1060426-1064427
-/subversion/trunk:1154223-1177689
+/subversion/trunk:1154223-1182874

Modified: subversion/branches/fs-py/CHANGES
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/CHANGES?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/CHANGES (original)
+++ subversion/branches/fs-py/CHANGES Thu Oct 13 14:30:07 2011
@@ -9,6 +9,26 @@ http://svn.apache.org/repos/asf/subversi
     * fix inconsistent handling of log revs without changed paths (issue #3694)
 
 
+Version 1.7.1
+(?? ??? 2011, from /branches/1.7.x)
+http://svn.apache.org/repos/asf/subversion/tags/1.7.1
+
+  User-visible changes:
+   * improve performance of 'svn info' (r1164386)
+   * improve sorting performance (r1167659)
+   * update base completion for 1.7 (r1177001)
+   * make 'svn ls' continue to work with 1.0-1.3 repos (r1154278, -379, -82)
+   * improve error messages generated by SASL (r1179767)
+
+  Developer-visible changes:
+   * fix object lifetime issues in the JavaHL bindings (r1175888)
+   * fix org.tigris JavaHL wrappers to avoid double finalize (r1179680)
+   * don't write to const memory (r1177492)
+   * improve zlib configuration (r1174761, -98, -806)
+   * improve SQLite runtime init for OS X 10.7 compat (r1181666)
+   * improve test suite correctness (r1174111)
+
+
 Version 1.7.0
 (11 Oct 2011, from /branches/1.7.x)
 http://svn.apache.org/repos/asf/subversion/tags/1.7.0

Modified: subversion/branches/fs-py/INSTALL
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/INSTALL?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/INSTALL (original)
+++ subversion/branches/fs-py/INSTALL Thu Oct 13 14:30:07 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
 
@@ -627,7 +624,7 @@ II.   INSTALLATION
 
       Download the most recent distribution tarball from:
 
-          http://subversion.tigris.org/servlets/ProjectDocumentList
+          http://subversion.apache.org/download/
 
       Unpack it, and use the standard GNU procedure to compile:
 
@@ -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
@@ -804,7 +801,7 @@ II.   INSTALLATION
       easiest.  Download a Zip (*.zip) or self-extracting installer
       (*-setup.exe) file from:
 
-      http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
+      http://subversion.apache.org/packages#windows
 
       For a Zip file, run your unzipping utility (WinZIP, ZipGenius,
       UltimateZIP, FreeZIP, whatever) and extract the DLLs and EXEs to
@@ -864,7 +861,7 @@ II.   INSTALLATION
         from http://www.apache.org/dist/apr/.
       * ZLib 1.2 or higher is required and is included in the Subversion
         dependencies zip file or can be obtained from http://www.zlib.org
-      * Either a Subversion client binary from http://subversion.tigris.org/ to
+      * Either a Subversion client binary from http://subversion.apache.org/ to
         do the initial checkout of the Subversion source or the zip file
         source distribution. See the section "Bootstrapping from a Zip or
         Installer File under Windows" above for more.

Modified: subversion/branches/fs-py/build.conf
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/build.conf?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/build.conf (original)
+++ subversion/branches/fs-py/build.conf Thu Oct 13 14:30:07 2011
@@ -339,7 +339,7 @@ msvc-export = 
         private\svn_token.h  private\svn_adler32.h
         private\svn_temp_serializer.h private\svn_io_private.h
         private\svn_string_private.h private\svn_magic.h
-        private\svn_subr_private.h
+        private\svn_subr_private.h private\svn_mutex.h
 
 # Working copy management lib
 [libsvn_wc]

Modified: subversion/branches/fs-py/subversion/bindings/javahl/native/Array.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/bindings/javahl/native/Array.cpp?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/bindings/javahl/native/Array.cpp (original)
+++ subversion/branches/fs-py/subversion/bindings/javahl/native/Array.cpp Thu Oct 13 14:30:07 2011
@@ -33,16 +33,13 @@
 
 Array::~Array()
 {
-  if (m_objectArray != NULL)
-    {
-      for (std::vector<jobject>::iterator it = m_objects.begin();
-            it < m_objects.end(); ++it)
-        {
-          JNIUtil::getEnv()->DeleteLocalRef(*it);
-        }
-
-      JNIUtil::getEnv()->DeleteLocalRef(m_objectArray);
-    }
+  /* We don't clean up our Java object here, because this destructor may run
+     *after* a call to PopLocalFrame().  If so, we would be deleting references
+     twice, which leads to all kinds of problems.
+
+     Instead, we intentionally "leak" these references, knowing that a call
+     to PopLocalFrame() will clean them up, or, in the worse case, the JVM
+     will clean them up when it returns from the JNI code. */
 }
 
 const std::vector<jobject> &Array::vector(void) const

Modified: subversion/branches/fs-py/subversion/bindings/javahl/native/JNIUtil.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/bindings/javahl/native/JNIUtil.cpp?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/bindings/javahl/native/JNIUtil.cpp (original)
+++ subversion/branches/fs-py/subversion/bindings/javahl/native/JNIUtil.cpp Thu Oct 13 14:30:07 2011
@@ -474,9 +474,9 @@ void JNIUtil::handleSVNError(svn_error_t
       if (isJavaExceptionThrown())
         POP_AND_RETURN_NOTHING();
     }
-  Array *stackTraceArray =
-    new Array((jobjectArray) env->CallObjectMethod(nativeException, mid_gst));
-  std::vector<jobject> oldStackTrace = stackTraceArray->vector();
+  Array stackTraceArray((jobjectArray) env->CallObjectMethod(nativeException,
+                                                             mid_gst));
+  std::vector<jobject> oldStackTrace = stackTraceArray.vector();
 
   // Build the new stack trace elements from the chained errors.
   std::vector<jobject> newStackTrace;
@@ -506,8 +506,6 @@ void JNIUtil::handleSVNError(svn_error_t
       ++i;
     }
 
-  delete stackTraceArray;
-
   // And put the entire trace back into the exception
   static jmethodID mid_sst = 0;
   if (mid_sst == 0)

Modified: subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java (original)
+++ subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java Thu Oct 13 14:30:07 2011
@@ -59,7 +59,6 @@ public class SVNAdmin
      */
     protected void finalize()
     {
-        aSVNAdmin.finalize();
     }
 
     /**

Modified: subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java (original)
+++ subversion/branches/fs-py/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java Thu Oct 13 14:30:07 2011
@@ -70,7 +70,6 @@ public class SVNClient implements SVNCli
      */
     protected void finalize()
     {
-        aSVNClient.finalize();
     }
 
     /**

Modified: subversion/branches/fs-py/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java (original)
+++ subversion/branches/fs-py/subversion/bindings/javahl/tests/org/apache/subversion/javahl/WC.java Thu Oct 13 14:30:07 2011
@@ -519,6 +519,9 @@ public class WC
                                         + item.myPath + "' don't match:",
                                         item.reposLastCmtAuthor,
                                         status.getReposLastCmtAuthor());
+                    Assert.assertNotNull("URL for path " + item.myPath
+                                         + " should not be null", 
+                                         status.getUrl());
                 }
             }
             item.touched = true;

Modified: subversion/branches/fs-py/subversion/include/private/ra_svn_sasl.h
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/include/private/ra_svn_sasl.h?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/include/private/ra_svn_sasl.h (original)
+++ subversion/branches/fs-py/subversion/include/private/ra_svn_sasl.h Thu Oct 13 14:30:07 2011
@@ -60,7 +60,7 @@ svn_ra_svn__default_secprops(sasl_securi
 
 /* This function is called by the client and the server before
    calling sasl_{client, server}_init, pool is used for allocations. */
-apr_status_t
+svn_error_t *
 svn_ra_svn__sasl_common_init(apr_pool_t *pool);
 
 /* Sets local_addrport and remote_addrport to a string containing the

Modified: subversion/branches/fs-py/subversion/include/private/svn_mergeinfo_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/include/private/svn_mergeinfo_private.h?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/include/private/svn_mergeinfo_private.h (original)
+++ subversion/branches/fs-py/subversion/include/private/svn_mergeinfo_private.h Thu Oct 13 14:30:07 2011
@@ -252,6 +252,17 @@ svn_mergeinfo__mergeinfo_from_segments(s
                                        const apr_array_header_t *segments,
                                        apr_pool_t *pool);
 
+/* Merge every rangelist in MERGEINFO into the given MERGED_RANGELIST,
+ * ignoring the source paths of MERGEINFO. MERGED_RANGELIST may
+ * initially be empty. New elements added to @a rangelist are allocated in
+ * @a result_pool. See svn_rangelist_merge2() for details of inheritability
+ * etc. */
+svn_error_t *
+svn_rangelist__merge_many(apr_array_header_t *merged_rangelist,
+                          svn_mergeinfo_t mergeinfo,
+                          apr_pool_t *result_pool,
+                          apr_pool_t *scratch_pool);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/branches/fs-py/subversion/include/private/svn_wc_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/include/private/svn_wc_private.h?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/include/private/svn_wc_private.h (original)
+++ subversion/branches/fs-py/subversion/include/private/svn_wc_private.h Thu Oct 13 14:30:07 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/fs-py/subversion/include/svn_client.h
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/include/svn_client.h?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/include/svn_client.h (original)
+++ subversion/branches/fs-py/subversion/include/svn_client.h Thu Oct 13 14:30:07 2011
@@ -1561,6 +1561,9 @@ svn_client_add(const char *path,
 
 /** Create a directory, either in a repository or a working copy.
  *
+ * @a paths is an array of (const char *) paths, either all local WC paths
+ * or all URLs.
+ *
  * If @a paths contains URLs, use the authentication baton in @a ctx
  * and @a message to immediately attempt to commit the creation of the
  * directories in @a paths in the repository.
@@ -1656,6 +1659,9 @@ svn_client_mkdir(svn_client_commit_info_
 
 /** Delete items from a repository or working copy.
  *
+ * @a paths is an array of (const char *) paths, either all local WC paths
+ * or all URLs.
+ *
  * If the paths in @a paths are URLs, use the authentication baton in
  * @a ctx and @a ctx->log_msg_func3/@a ctx->log_msg_baton3 to
  * immediately attempt to commit a deletion of the URLs from the
@@ -2457,8 +2463,11 @@ svn_client_status(svn_revnum_t *result_r
  * If @a limit is non-zero only invoke @a receiver on the first @a limit
  * logs.
  *
- * If @a discover_changed_paths is set, then the `@a changed_paths' argument
- * to @a receiver will be passed on each invocation.
+ * If @a discover_changed_paths is set, then the @c changed_paths and @c
+ * changed_paths2 fields in the @c log_entry argument to @a receiver will be
+ * populated on each invocation.  @note The @c text_modified and @c
+ * props_modified fields of the changed paths structure may have the value
+ * #svn_tristate_unknown if the repository does not report that information.
  *
  * If @a strict_node_history is set, copy history (if any exists) will
  * not be traversed while harvesting revision logs for each target.
@@ -2466,18 +2475,12 @@ svn_client_status(svn_revnum_t *result_r
  * If @a include_merged_revisions is set, log information for revisions
  * which have been merged to @a targets will also be returned.
  *
- * If @a revprops is NULL, retrieve all revprops; else, retrieve only the
- * revprops named in the array (i.e. retrieve none if the array is empty).
+ * If @a revprops is NULL, retrieve all revision properties; else, retrieve
+ * only the revision properties named by the (const char *) array elements
+ * (i.e. retrieve none if the array is empty).
  *
  * Use @a pool for any temporary allocation.
  *
- * @par Important:
- * A special case for the revision range HEAD:1, which was present
- * in svn_client_log(), has been removed from svn_client_log2().  Instead, it
- * is expected that callers will specify the range HEAD:0, to avoid a
- * #SVN_ERR_FS_NO_SUCH_REVISION error when invoked against an empty repository
- * (i.e. one not containing a revision 1).
- *
  * If @a ctx->notify_func2 is non-NULL, then call @a ctx->notify_func2/baton2
  * with a 'skip' signal on any unversioned targets.
  *
@@ -2548,6 +2551,13 @@ svn_client_log3(const apr_array_header_t
  * Similar to svn_client_log3(), but with the @c kind field of
  * @a peg_revision set to #svn_opt_revision_unspecified.
  *
+ * @par Important:
+ * A special case for the revision range HEAD:1, which was present
+ * in svn_client_log(), has been removed from svn_client_log2().  Instead, it
+ * is expected that callers will specify the range HEAD:0, to avoid a
+ * #SVN_ERR_FS_NO_SUCH_REVISION error when invoked against an empty repository
+ * (i.e. one not containing a revision 1).
+ *
  * @deprecated Provided for compatibility with the 1.3 API.
  * @since New in 1.2.
  */
@@ -3745,11 +3755,13 @@ svn_client_relocate(const char *dir,
  */
 
 /**
- * Restore the pristine version of a working copy @a paths,
+ * Restore the pristine version of working copy @a paths,
  * effectively undoing any local mods.  For each path in @a paths,
  * revert it if it is a file.  Else if it is a directory, revert
  * according to @a depth:
  *
+ * @a paths is an array of (const char *) local WC paths.
+ *
  * If @a depth is #svn_depth_empty, revert just the properties on
  * the directory; else if #svn_depth_files, revert the properties
  * and any files immediately under the directory; else if
@@ -3885,20 +3897,14 @@ typedef struct svn_client_copy_source_t
     const svn_opt_revision_t *peg_revision;
 } svn_client_copy_source_t;
 
-/** Copy each @a src in @a sources to @a dst_path.
+/** Copy each source in @a sources to @a dst_path.
  *
  * If multiple @a sources are given, @a dst_path must be a directory,
  * and @a sources will be copied as children of @a dst_path.
  *
- * @a sources must be an array of elements of type
- * <tt>svn_client_copy_source_t *</tt>.
- *
- * Each @a src in @a sources must be files or directories under version control,
- * or URLs of a versioned item in the repository.  If @a sources has multiple
- * items, the @a src members must be all repository URLs or all working copy
- * paths.
- *
- * The parent of @a dst_path must already exist.
+ * @a sources is an array of <tt>svn_client_copy_source_t *</tt> elements,
+ * either all referring to local WC items or all referring to versioned
+ * items in the repository.
  *
  * If @a sources has only one item, attempt to copy it to @a dst_path.  If
  * @a copy_as_child is TRUE and @a dst_path already exists, attempt to copy the
@@ -3926,7 +3932,7 @@ typedef struct svn_client_copy_source_t
  * This scheduling can be removed with svn_client_revert2().
  *
  * If @a make_parents is TRUE, create any non-existent parent directories
- * also.
+ * also.  Otherwise the parent of @a dst_path must already exist.
  *
  * If @a ignore_externals is set, don't process externals definitions
  * as part of this operation.
@@ -4066,10 +4072,10 @@ svn_client_copy(svn_client_commit_info_t
 /**
  * Move @a src_paths to @a dst_path.
  *
- * @a src_paths must be files or directories under version control, or
- * URLs of versioned items in the repository.  All @a src_paths must be of
- * the same type.  If multiple @a src_paths are given, @a dst_path must be
- * a directory and @a src_paths will be moved as children of @a dst_path.
+ * @a src_paths is an array of (const char *) paths -- either all WC paths
+ * or all URLs -- of versioned items.  If multiple @a src_paths are given,
+ * @a dst_path must be a directory and @a src_paths will be moved as
+ * children of @a dst_path.
  *
  * If @a src_paths are repository URLs:
  *
@@ -4093,8 +4099,6 @@ svn_client_copy(svn_client_commit_info_t
  *     is a directory it will remain in the working copy but all the files,
  *     and unversioned items, it contains will be removed.
  *
- * The parent of @a dst_path must already exist.
- *
  * If @a src_paths has only one item, attempt to move it to @a dst_path.  If
  * @a move_as_child is TRUE and @a dst_path already exists, attempt to move the
  * item as a child of @a dst_path.  If @a move_as_child is FALSE and
@@ -4112,7 +4116,7 @@ svn_client_copy(svn_client_commit_info_t
  * with #SVN_ERR_CLIENT_MULTIPLE_SOURCES_DISALLOWED.
  *
  * If @a make_parents is TRUE, create any non-existent parent directories
- * also.
+ * also.  Otherwise, the parent of @a dst_path must already exist.
  *
  * If non-NULL, @a revprop_table is a hash table holding additional,
  * custom revision properties (<tt>const char *</tt> names mapped to
@@ -4492,6 +4496,8 @@ svn_client_revprop_set(const char *propn
  * Allocate @a *props, its keys, and its values in @a pool, use
  * @a scratch_pool for temporary allocations.
  *
+ * @a target is a WC absolute path or a URL.
+ *
  * Don't store any path, not even @a target, if it does not have a
  * property named @a propname.
  *
@@ -4530,7 +4536,7 @@ svn_client_revprop_set(const char *propn
 svn_error_t *
 svn_client_propget4(apr_hash_t **props,
                     const char *propname,
-                    const char *target,
+                    const char *target,  /* abspath or URL */
                     const svn_opt_revision_t *peg_revision,
                     const svn_opt_revision_t *revision,
                     svn_revnum_t *actual_revnum,
@@ -4624,6 +4630,8 @@ svn_client_revprop_get(const char *propn
  * of @a target, a URL or working copy path.  @a receiver will be called
  * for each path encountered.
  *
+ * @a target is a WC path or a URL.
+ *
  * If @a revision->kind is #svn_opt_revision_unspecified, then get
  * properties from the working copy, if @a target is a working copy
  * path, or from the repository head if @a target is a URL.  Else get
@@ -5134,6 +5142,8 @@ svn_client_cat(svn_stream_t *out,
  * @a changelist.  (For now, a path cannot belong to two changelists
  * at once.)
  *
+ * @a paths is an array of (const char *) local WC paths.
+ *
  * @a changelists is an array of <tt>const char *</tt> changelist
  * names, used as a restrictive filter on items whose changelist
  * assignments are adjusted; that is, don't tweak the changeset of any
@@ -5158,6 +5168,8 @@ svn_client_add_to_changelist(const apr_a
  * Remove each path in @a paths (recursing to @a depth as necessary)
  * from changelists to which they are currently assigned.
  *
+ * @a paths is an array of (const char *) local WC paths.
+ *
  * @a changelists is an array of <tt>const char *</tt> changelist
  * names, used as a restrictive filter on items whose changelist
  * assignments are removed; that is, don't remove from a changeset any
@@ -5187,6 +5199,8 @@ svn_client_remove_from_changelists(const
  * Call @a callback_func (with @a callback_baton) each time a
  * changelist-having path is discovered.
  *
+ * @a path is a local WC path.
+ *
  * If @a ctx->cancel_func is not @c NULL, invoke it passing @a
  * ctx->cancel_baton during the recursive walk.
  *
@@ -5213,8 +5227,8 @@ svn_client_get_changelists(const char *p
 
 /**
  * Lock @a targets in the repository.  @a targets is an array of
- * <tt>const char *</tt> paths - either all working copy paths or URLs.  All
- * @a targets must be in the same repository.
+ * <tt>const char *</tt> paths - either all working copy paths or all URLs.
+ * All targets must be in the same repository.
  *
  * If a target is already locked in the repository, no lock will be
  * acquired unless @a steal_lock is TRUE, in which case the locks are
@@ -5244,10 +5258,10 @@ svn_client_lock(const apr_array_header_t
 /**
  * Unlock @a targets in the repository.  @a targets is an array of
  * <tt>const char *</tt> paths - either all working copy paths or all URLs.
- * All @a targets must be in the same repository.
+ * All targets must be in the same repository.
  *
  * If the targets are WC paths, and @a break_lock is FALSE, the working
- * copy must contain a locks for each target.
+ * copy must contain a lock for each target.
  * If this is not the case, or the working copy lock doesn't match the
  * lock token in the repository, an error will be signaled.
  *

Modified: subversion/branches/fs-py/subversion/include/svn_ra.h
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/include/svn_ra.h?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/include/svn_ra.h (original)
+++ subversion/branches/fs-py/subversion/include/svn_ra.h Thu Oct 13 14:30:07 2011
@@ -1415,8 +1415,9 @@ svn_ra_do_diff(svn_ra_session_t *session
  * If @a include_merged_revisions is set, log information for revisions
  * which have been merged to @a targets will also be returned.
  *
- * If @a revprops is NULL, retrieve all revprops; else, retrieve only the
- * revprops named in the array (i.e. retrieve none if the array is empty).
+ * If @a revprops is NULL, retrieve all revision properties; else, retrieve
+ * only the revision properties named by the (const char *) array elements
+ * (i.e. retrieve none if the array is empty).
  *
  * If any invocation of @a receiver returns error, return that error
  * immediately and without wrapping it.

Modified: subversion/branches/fs-py/subversion/include/svn_repos.h
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/include/svn_repos.h?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/include/svn_repos.h (original)
+++ subversion/branches/fs-py/subversion/include/svn_repos.h Thu Oct 13 14:30:07 2011
@@ -1628,8 +1628,9 @@ svn_repos_node_location_segments(svn_rep
  * filesystem, as limited by @a paths. In the latter case those revisions
  * are skipped and @a receiver is not invoked.
  *
- * If @a revprops is NULL, retrieve all revprops; else, retrieve only the
- * revprops named in the array (i.e. retrieve none if the array is empty).
+ * If @a revprops is NULL, retrieve all revision properties; else, retrieve
+ * only the revision properties named by the (const char *) array elements
+ * (i.e. retrieve none if the array is empty).
  *
  * If any invocation of @a receiver returns error, return that error
  * immediately and without wrapping it.

Modified: subversion/branches/fs-py/subversion/include/svn_sorts.h
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/include/svn_sorts.h?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/include/svn_sorts.h (original)
+++ subversion/branches/fs-py/subversion/include/svn_sorts.h Thu Oct 13 14:30:07 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/fs-py/subversion/include/svn_types.h
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/include/svn_types.h?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/include/svn_types.h (original)
+++ subversion/branches/fs-py/subversion/include/svn_types.h Thu Oct 13 14:30:07 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.
  *
@@ -131,9 +147,13 @@ typedef struct svn_error_t
 
 } svn_error_t;
 
+
+
 /* See svn_version.h.
    Defined here to avoid including svn_version.h from all public headers. */
 typedef struct svn_version_t svn_version_t;
+
+
 
 /** @defgroup APR_ARRAY_compat_macros APR Array Compatibility Helper Macros
  * These macros are provided by APR itself from version 1.3.
@@ -152,6 +172,8 @@ typedef struct svn_version_t svn_version
 #endif
 
 /** @} */
+
+
 
 /** @defgroup apr_hash_utilities APR Hash Table Helpers
  * These functions enable the caller to dereference an APR hash table index
@@ -173,6 +195,10 @@ svn__apr_hash_index_klen(const apr_hash_
 void *
 svn__apr_hash_index_val(const apr_hash_index_t *hi);
 
+/** @} */
+
+
+
 /** On Windows, APR_STATUS_IS_ENOTDIR includes several kinds of
  * invalid-pathname error but not ERROR_INVALID_NAME, so we include it.
  * We also include ERROR_DIRECTORY as that was not included in apr versions
@@ -187,8 +213,36 @@ svn__apr_hash_index_val(const apr_hash_i
 #endif
 
 /** @} */
+
+
 
-/** The various types of nodes in the Subversion filesystem. */
+/** 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,
+
+  /** regular file */
+  svn_kind_file,
+
+  /** directory */
+  svn_kind_dir,
+
+  /** symbolic link */
+  svn_kind_symlink
+
+} 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 */
@@ -223,6 +277,25 @@ 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.
@@ -256,6 +329,7 @@ svn_tristate_t
 svn_tristate__from_word(const char * word);
 
 
+
 /** About Special Files in Subversion
  *
  * Subversion denotes files that cannot be portably created or
@@ -293,6 +367,8 @@ svn_tristate__from_word(const char * wor
  *     routines from 1.
  */
 
+
+
 /** A revision number. */
 typedef long int svn_revnum_t;
 
@@ -339,6 +415,7 @@ svn_revnum_parse(svn_revnum_t *rev,
 #define SVN_REVNUM_T_FMT "ld"
 
 
+
 /** The size of a file in the Subversion FS. */
 typedef apr_int64_t svn_filesize_t;
 
@@ -356,20 +433,7 @@ 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
 {
@@ -427,7 +491,6 @@ typedef enum svn_depth_t
 
 } svn_depth_t;
 
-
 /** Return a constant string expressing @a depth as an English word,
  * e.g., "infinity", "immediates", etc.  The string is not localized,
  * as it may be used for client<->server communications.
@@ -437,7 +500,6 @@ typedef enum svn_depth_t
 const char *
 svn_depth_to_word(svn_depth_t depth);
 
-
 /** Return the appropriate depth for @a depth_str.  @a word is as
  * returned from svn_depth_to_word().  If @a depth_str does not
  * represent a recognized depth, return #svn_depth_unknown.
@@ -447,7 +509,6 @@ svn_depth_to_word(svn_depth_t depth);
 svn_depth_t
 svn_depth_from_word(const char *word);
 
-
 /* Return #svn_depth_infinity if boolean @a recurse is TRUE, else
  * return #svn_depth_files.
  *
@@ -459,7 +520,6 @@ svn_depth_from_word(const char *word);
 #define SVN_DEPTH_INFINITY_OR_FILES(recurse) \
   ((recurse) ? svn_depth_infinity : svn_depth_files)
 
-
 /* Return #svn_depth_infinity if boolean @a recurse is TRUE, else
  * return #svn_depth_immediates.
  *
@@ -471,7 +531,6 @@ svn_depth_from_word(const char *word);
 #define SVN_DEPTH_INFINITY_OR_IMMEDIATES(recurse) \
   ((recurse) ? svn_depth_infinity : svn_depth_immediates)
 
-
 /* Return #svn_depth_infinity if boolean @a recurse is TRUE, else
  * return #svn_depth_empty.
  *
@@ -483,7 +542,6 @@ svn_depth_from_word(const char *word);
 #define SVN_DEPTH_INFINITY_OR_EMPTY(recurse) \
   ((recurse) ? svn_depth_infinity : svn_depth_empty)
 
-
 /* Return a recursion boolean based on @a depth.
  *
  * Although much code has been converted to use depth, some code still
@@ -496,6 +554,7 @@ svn_depth_from_word(const char *word);
    ? TRUE : FALSE)
 
 
+
 /**
  * It is sometimes convenient to indicate which parts of an #svn_dirent_t
  * object you are actually interested in, so that calculating and sending
@@ -553,7 +612,6 @@ typedef struct svn_dirent_t
   /* IMPORTANT: If you extend this struct, check svn_dirent_dup(). */
 } svn_dirent_t;
 
-
 /** Return a deep copy of @a dirent, allocated in @a pool.
  *
  * @since New in 1.4.
@@ -562,8 +620,8 @@ svn_dirent_t *
 svn_dirent_dup(const svn_dirent_t *dirent,
                apr_pool_t *pool);
 
-
 
+
 /** Keyword substitution.
  *
  * All the keywords Subversion recognizes.
@@ -640,6 +698,7 @@ svn_dirent_dup(const svn_dirent_t *diren
 
 /** @} */
 
+
 
 /** All information about a commit.
  *
@@ -668,7 +727,6 @@ typedef struct svn_commit_info_t
 
 } svn_commit_info_t;
 
-
 /**
  * Allocate an object of type #svn_commit_info_t in @a pool and
  * return it.
@@ -686,7 +744,6 @@ typedef struct svn_commit_info_t
 svn_commit_info_t *
 svn_create_commit_info(apr_pool_t *pool);
 
-
 /**
  * Return a deep copy @a src_commit_info allocated in @a pool.
  *
@@ -696,6 +753,7 @@ svn_commit_info_t *
 svn_commit_info_dup(const svn_commit_info_t *src_commit_info,
                     apr_pool_t *pool);
 
+
 
 /**
  * A structure to represent a path that changed for a log entry.
@@ -757,7 +815,7 @@ svn_log_changed_path2_dup(const svn_log_
 
 /**
  * A structure to represent a path that changed for a log entry.  Same as
- * #svn_log_changed_path2_t, but without the node kind.
+ * the first three fields of #svn_log_changed_path2_t.
  *
  * @deprecated Provided for backward compatibility with the 1.5 API.
  */
@@ -774,7 +832,6 @@ typedef struct svn_log_changed_path_t
 
 } svn_log_changed_path_t;
 
-
 /**
  * Return a deep copy of @a changed_path, allocated in @a pool.
  *
@@ -810,7 +867,8 @@ typedef struct svn_log_entry_t
   svn_revnum_t revision;
 
   /** The hash of requested revision properties, which may be NULL if it
-   * would contain no revprops. */
+   * would contain no revprops.  Maps (const char *) property name to
+   * (svn_string_t *) property value. */
   apr_hash_t *revprops;
 
   /**
@@ -923,7 +981,6 @@ svn_log_entry_dup(const svn_log_entry_t 
  *
  * @since New in 1.5.
  */
-
 typedef svn_error_t *(*svn_log_entry_receiver_t)(
   void *baton,
   svn_log_entry_t *log_entry,
@@ -944,6 +1001,7 @@ typedef svn_error_t *(*svn_log_message_r
   const char *message,
   apr_pool_t *pool);
 
+
 
 /** Callback function type for commits.
  *
@@ -969,6 +1027,7 @@ typedef svn_error_t *(*svn_commit_callba
   const char *author,
   void *baton);
 
+
 
 /** A buffer size that may be used when processing a stream of data.
  *
@@ -1021,7 +1080,6 @@ svn_error_t *
 svn_mime_type_validate(const char *mime_type,
                        apr_pool_t *pool);
 
-
 /** Return FALSE iff @a mime_type is a textual type.
  *
  * All mime types that start with "text/" are textual, plus some special
@@ -1092,6 +1150,8 @@ svn_lock_create(apr_pool_t *pool);
 svn_lock_t *
 svn_lock_dup(const svn_lock_t *lock, apr_pool_t *pool);
 
+
+
 /**
  * Return a formatted Universal Unique IDentifier (UUID) string.
  *
@@ -1100,6 +1160,8 @@ svn_lock_dup(const svn_lock_t *lock, apr
 const char *
 svn_uuid_generate(apr_pool_t *pool);
 
+
+
 /**
  * Mergeinfo representing a merge of a range of revisions.
  *
@@ -1165,7 +1227,6 @@ typedef struct svn_location_segment_t
 
 } svn_location_segment_t;
 
-
 /**
  * A callback invoked by generators of #svn_location_segment_t
  * objects, used to report information about a versioned object's
@@ -1177,7 +1238,6 @@ typedef svn_error_t *(*svn_location_segm
   void *baton,
   apr_pool_t *pool);
 
-
 /**
  * Return a deep copy of @a segment, allocated in @a pool.
  *
@@ -1189,6 +1249,8 @@ svn_location_segment_dup(const svn_locat
 
 /** @} */
 
+
+
 /** A line number, such as in a file or a stream.
  *
  * @since New in 1.7.
@@ -1202,6 +1264,7 @@ typedef unsigned long svn_linenum_t;
 #define SVN_LINENUM_MAX_VALUE ULONG_MAX
 
 
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/branches/fs-py/subversion/libsvn_client/cleanup.c
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_client/cleanup.c?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_client/cleanup.c (original)
+++ subversion/branches/fs-py/subversion/libsvn_client/cleanup.c Thu Oct 13 14:30:07 2011
@@ -187,7 +187,7 @@ svn_client_upgrade(const char *path,
       if (!err)
         err = svn_wc_parse_externals_description3(
                   &externals_p, svn_dirent_dirname(path, iterpool),
-                  external_desc->data, TRUE, iterpool);
+                  external_desc->data, FALSE, iterpool);
       if (err)
         {
           svn_wc_notify_t *notify =

Modified: subversion/branches/fs-py/subversion/libsvn_client/client.h
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_client/client.h?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_client/client.h (original)
+++ subversion/branches/fs-py/subversion/libsvn_client/client.h Thu Oct 13 14:30:07 2011
@@ -109,6 +109,9 @@ svn_error_t *svn_client__get_copy_source
    END_URL and END_REVISION are not touched by the function);
    START and REVISION may not.
 
+   If PATH is a WC path and REVISION is of kind svn_opt_revision_working,
+   then look at the PATH's copy-from URL instead of its base URL.
+
    RA_SESSION should be an open RA session pointing at the URL of PATH,
    or NULL, in which case this function will open its own temporary session.
 
@@ -191,7 +194,8 @@ svn_client__get_youngest_common_ancestor
    is not, then @c SVN_ERR_CLIENT_UNRELATED_RESOURCES is returned.
 
    BASE_DIR_ABSPATH is the working copy path the ra_session corresponds to,
-   should only be used if PATH_OR_URL is a url.
+   and should only be used if PATH_OR_URL is a url
+     ### else NULL? what's it for?
 
    If PEG_REVISION's kind is svn_opt_revision_unspecified, it is
    interpreted as "head" for a URL or "working" for a working-copy path.

Modified: subversion/branches/fs-py/subversion/libsvn_client/info.c
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_client/info.c?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_client/info.c (original)
+++ subversion/branches/fs-py/subversion/libsvn_client/info.c Thu Oct 13 14:30:07 2011
@@ -256,6 +256,75 @@ wc_info_receiver(void *baton,
                                  abspath_or_url, &client_info, scratch_pool);
 }
 
+/* Like svn_ra_stat() but with a compatibility hack for pre-1.2 svnserve. */
+static svn_error_t *
+ra_stat_compatible(svn_ra_session_t *ra_session,
+                   svn_revnum_t rev,
+                   svn_dirent_t **dirent_p,
+                   apr_uint32_t dirent_fields,
+                   svn_client_ctx_t *ctx,
+                   apr_pool_t *pool)
+{
+  const char *repos_root_URL, *url;
+  svn_error_t *err;
+  svn_dirent_t *the_ent;
+
+  SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_URL, pool));
+  SVN_ERR(svn_ra_get_session_url(ra_session, &url, pool));
+
+  err = svn_ra_stat(ra_session, "", rev, &the_ent, pool);
+
+  /* svn_ra_stat() will work against old versions of mod_dav_svn, but
+     not old versions of svnserve.  In the case of a pre-1.2 svnserve,
+     catch the specific error it throws:*/
+  if (err && err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
+    {
+      /* Fall back to pre-1.2 strategy for fetching dirent's URL. */
+      svn_node_kind_t url_kind;
+      svn_ra_session_t *parent_ra_session;
+      apr_hash_t *parent_ents;
+      const char *parent_url, *base_name;
+
+      if (strcmp(url, repos_root_URL) == 0)
+        {
+          /* In this universe, there's simply no way to fetch
+             information about the repository's root directory! */
+          return err;
+        }
+
+      svn_error_clear(err);
+
+      SVN_ERR(svn_ra_check_path(ra_session, "", rev, &url_kind, pool));
+      if (url_kind == svn_node_none)
+        return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
+                                 _("URL '%s' non-existent in revision %ld"),
+                                 url, rev);
+
+      /* Open a new RA session to the item's parent. */
+      svn_uri_split(&parent_url, &base_name, url, pool);
+      SVN_ERR(svn_client__open_ra_session_internal(&parent_ra_session, NULL,
+                                                   parent_url, NULL,
+                                                   NULL, FALSE, TRUE,
+                                                   ctx, pool));
+
+      /* Get all parent's entries, and find the item's dirent in the hash. */
+      SVN_ERR(svn_ra_get_dir2(parent_ra_session, &parent_ents, NULL, NULL,
+                              "", rev, dirent_fields, pool));
+      the_ent = apr_hash_get(parent_ents, base_name, APR_HASH_KEY_STRING);
+      if (the_ent == NULL)
+        return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
+                                 _("URL '%s' non-existent in revision %ld"),
+                                 url, rev);
+    }
+  else if (err)
+    {
+      return svn_error_trace(err);
+    }
+
+  *dirent_p = the_ent;
+  return SVN_NO_ERROR;
+}
+
 svn_error_t *
 svn_client_info3(const char *abspath_or_url,
                  const svn_opt_revision_t *peg_revision,
@@ -269,15 +338,13 @@ svn_client_info3(const char *abspath_or_
                  svn_client_ctx_t *ctx,
                  apr_pool_t *pool)
 {
-  svn_ra_session_t *ra_session, *parent_ra_session;
+  svn_ra_session_t *ra_session;
   svn_revnum_t rev;
   const char *url;
-  svn_node_kind_t url_kind;
   const char *repos_root_URL, *repos_UUID;
   svn_lock_t *lock;
   svn_boolean_t related;
-  apr_hash_t *parent_ents;
-  const char *parent_url, *base_name;
+  const char *base_name;
   svn_dirent_t *the_ent;
   svn_client_info2_t *info;
   svn_error_t *err;
@@ -312,56 +379,26 @@ svn_client_info3(const char *abspath_or_
   SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_URL, pool));
   SVN_ERR(svn_ra_get_uuid2(ra_session, &repos_UUID, pool));
 
-  svn_uri_split(&parent_url, &base_name, url, pool);
+  svn_uri_split(NULL, &base_name, url, pool);
 
   /* Get the dirent for the URL itself. */
-  err = svn_ra_stat(ra_session, "", rev, &the_ent, pool);
-
-  /* svn_ra_stat() will work against old versions of mod_dav_svn, but
-     not old versions of svnserve.  In the case of a pre-1.2 svnserve,
-     catch the specific error it throws:*/
+  err = ra_stat_compatible(ra_session, rev, &the_ent, DIRENT_FIELDS,
+                           ctx, pool);
   if (err && err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
     {
-      /* Fall back to pre-1.2 strategy for fetching dirent's URL. */
       svn_error_clear(err);
 
-      if (strcmp(url, repos_root_URL) == 0)
-        {
-          /* In this universe, there's simply no way to fetch
-             information about the repository's root directory!
-             If we're recursing, degrade gracefully: rather than
-             throw an error, return no information about the
-             repos root. */
-          if (depth > svn_depth_empty)
-            goto pre_1_2_recurse;
-
-          /* Otherwise, we really are stuck.  Better tell the user
-             what's going on. */
-          return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
-                                   _("Server does not support retrieving "
-                                     "information about the repository root"));
-        }
-
-      SVN_ERR(svn_ra_check_path(ra_session, "", rev, &url_kind, pool));
-      if (url_kind == svn_node_none)
-        return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
-                                 _("URL '%s' non-existent in revision %ld"),
-                                 url, rev);
-
-      /* Open a new RA session to the item's parent. */
-      SVN_ERR(svn_client__open_ra_session_internal(&parent_ra_session, NULL,
-                                                   parent_url, NULL,
-                                                   NULL, FALSE, TRUE,
-                                                   ctx, pool));
-
-      /* Get all parent's entries, and find the item's dirent in the hash. */
-      SVN_ERR(svn_ra_get_dir2(parent_ra_session, &parent_ents, NULL, NULL,
-                              "", rev, DIRENT_FIELDS, pool));
-      the_ent = apr_hash_get(parent_ents, base_name, APR_HASH_KEY_STRING);
-      if (the_ent == NULL)
-        return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
-                                 _("URL '%s' non-existent in revision %ld"),
-                                 url, rev);
+      /* If we're recursing, degrade gracefully: rather than
+         throw an error, return no information about the
+         repos root. */
+      if (depth > svn_depth_empty)
+        goto pre_1_2_recurse;
+
+      /* Otherwise, we really are stuck.  Better tell the user
+         what's going on. */
+      return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+                               _("Server does not support retrieving "
+                                 "information about the repository root"));
     }
   else if (err)
     {

Modified: subversion/branches/fs-py/subversion/libsvn_client/list.c
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_client/list.c?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_client/list.c (original)
+++ subversion/branches/fs-py/subversion/libsvn_client/list.c Thu Oct 13 14:30:07 2011
@@ -121,42 +121,21 @@ get_dir_contents(apr_uint32_t dirent_fie
   return SVN_NO_ERROR;
 }
 
-svn_error_t *
-svn_client_list2(const char *path_or_url,
-                 const svn_opt_revision_t *peg_revision,
-                 const svn_opt_revision_t *revision,
-                 svn_depth_t depth,
-                 apr_uint32_t dirent_fields,
-                 svn_boolean_t fetch_locks,
-                 svn_client_list_func_t list_func,
-                 void *baton,
-                 svn_client_ctx_t *ctx,
-                 apr_pool_t *pool)
+/* Like svn_ra_stat() but with a compatibility hack for pre-1.2 svnserve. */
+static svn_error_t *
+ra_stat_compatible(svn_ra_session_t *ra_session,
+                   svn_revnum_t rev,
+                   svn_dirent_t **dirent_p,
+                   apr_uint32_t dirent_fields,
+                   svn_client_ctx_t *ctx,
+                   apr_pool_t *pool)
 {
-  svn_ra_session_t *ra_session;
-  svn_revnum_t rev;
-  svn_dirent_t *dirent;
-  const char *url;
-  const char *repos_root;
-  const char *fs_path;
+  const char *repos_root, *url;
   svn_error_t *err;
-  apr_hash_t *locks;
-
-  /* We use the kind field to determine if we should recurse, so we
-     always need it. */
-  dirent_fields |= SVN_DIRENT_KIND;
-
-  /* Get an RA plugin for this filesystem object. */
-  SVN_ERR(svn_client__ra_session_from_path(&ra_session, &rev,
-                                           &url, path_or_url, NULL,
-                                           peg_revision,
-                                           revision, ctx, pool));
+  svn_dirent_t *dirent;
 
   SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root, pool));
-
-  SVN_ERR(svn_client__path_relative_to_root(&fs_path, ctx->wc_ctx, url,
-                                            repos_root, TRUE, ra_session,
-                                            pool, pool));
+  SVN_ERR(svn_ra_get_session_url(ra_session, &url, pool));
 
   err = svn_ra_stat(ra_session, "", rev, &dirent, pool);
 
@@ -240,6 +219,49 @@ svn_client_list2(const char *path_or_url
   else if (err)
     return svn_error_trace(err);
 
+  *dirent_p = dirent;
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_client_list2(const char *path_or_url,
+                 const svn_opt_revision_t *peg_revision,
+                 const svn_opt_revision_t *revision,
+                 svn_depth_t depth,
+                 apr_uint32_t dirent_fields,
+                 svn_boolean_t fetch_locks,
+                 svn_client_list_func_t list_func,
+                 void *baton,
+                 svn_client_ctx_t *ctx,
+                 apr_pool_t *pool)
+{
+  svn_ra_session_t *ra_session;
+  svn_revnum_t rev;
+  svn_dirent_t *dirent;
+  const char *url;
+  const char *repos_root;
+  const char *fs_path;
+  svn_error_t *err;
+  apr_hash_t *locks;
+
+  /* We use the kind field to determine if we should recurse, so we
+     always need it. */
+  dirent_fields |= SVN_DIRENT_KIND;
+
+  /* Get an RA plugin for this filesystem object. */
+  SVN_ERR(svn_client__ra_session_from_path(&ra_session, &rev,
+                                           &url, path_or_url, NULL,
+                                           peg_revision,
+                                           revision, ctx, pool));
+
+  SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root, pool));
+
+  SVN_ERR(svn_client__path_relative_to_root(&fs_path, ctx->wc_ctx, url,
+                                            repos_root, TRUE, ra_session,
+                                            pool, pool));
+
+  SVN_ERR(ra_stat_compatible(ra_session, rev, &dirent, dirent_fields,
+                             ctx, pool));
   if (! dirent)
     return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
                              _("URL '%s' non-existent in revision %ld"),

Modified: subversion/branches/fs-py/subversion/libsvn_client/log.c
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_client/log.c?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_client/log.c (original)
+++ subversion/branches/fs-py/subversion/libsvn_client/log.c Thu Oct 13 14:30:07 2011
@@ -211,8 +211,7 @@ pre_15_receiver(void *baton, svn_log_ent
                                   name, &value, pool));
           if (log_entry->revprops == NULL)
             log_entry->revprops = apr_hash_make(pool);
-          apr_hash_set(log_entry->revprops, (const void *)name,
-                       APR_HASH_KEY_STRING, (const void *)value);
+          apr_hash_set(log_entry->revprops, name, APR_HASH_KEY_STRING, value);
         }
       if (log_entry->revprops)
         {

Modified: subversion/branches/fs-py/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_client/merge.c?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/fs-py/subversion/libsvn_client/merge.c Thu Oct 13 14:30:07 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,
@@ -1060,8 +1060,9 @@ filter_self_referential_mergeinfo(apr_ar
       /* Combine whatever older and younger filtered mergeinfo exists
          into filtered_mergeinfo. */
       if (filtered_mergeinfo && filtered_younger_mergeinfo)
-        SVN_ERR(svn_mergeinfo_merge(filtered_mergeinfo,
-                                    filtered_younger_mergeinfo, iterpool));
+        SVN_ERR(svn_mergeinfo_merge2(filtered_mergeinfo,
+                                     filtered_younger_mergeinfo, iterpool,
+                                     iterpool));
       else if (filtered_younger_mergeinfo)
         filtered_mergeinfo = filtered_younger_mergeinfo;
 
@@ -1463,7 +1464,6 @@ merge_file_changed(svn_wc_notify_state_t
   if (wc_kind != svn_node_file || is_deleted)
     {
       const char *moved_to_abspath;
-      svn_wc_conflict_reason_t reason;
       svn_error_t *err;
 
       /* Maybe the node is excluded via depth filtering? */
@@ -1513,6 +1513,8 @@ merge_file_changed(svn_wc_notify_state_t
         }
       else
         {
+          svn_wc_conflict_reason_t reason;
+
           if (is_deleted)
             reason = svn_wc_conflict_reason_deleted;
           else
@@ -4140,21 +4142,10 @@ find_gaps_in_merge_source_history(svn_re
       apr_array_header_t *implicit_rangelist =
         apr_array_make(scratch_pool, 2, sizeof(svn_merge_range_t *));
       apr_array_header_t *gap_rangelist;
-      apr_hash_index_t *hi;
-      apr_pool_t *iterpool = svn_pool_create(scratch_pool);
-
-      for (hi = apr_hash_first(scratch_pool, implicit_src_mergeinfo);
-           hi;
-           hi = apr_hash_next(hi))
-        {
-          apr_array_header_t *value = svn__apr_hash_index_val(hi);
 
-          svn_pool_clear(iterpool);
-
-          SVN_ERR(svn_rangelist_merge2(implicit_rangelist, value,
-                                       scratch_pool, iterpool));
-        }
-      svn_pool_destroy(iterpool);
+      SVN_ERR(svn_rangelist__merge_many(implicit_rangelist,
+                                        implicit_src_mergeinfo,
+                                        scratch_pool, scratch_pool));
       SVN_ERR(svn_rangelist_remove(&gap_rangelist, implicit_rangelist,
                                    requested_rangelist, FALSE,
                                    scratch_pool));
@@ -4770,30 +4761,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 +4786,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 +4822,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);
         }
     }
 }
@@ -7201,9 +7167,9 @@ process_children_with_new_mergeinfo(merg
              explicit mergeinfo. */
           if (path_inherited_mergeinfo)
             {
-              SVN_ERR(svn_mergeinfo_merge(path_explicit_mergeinfo,
-                                          path_inherited_mergeinfo,
-                                          iterpool));
+              SVN_ERR(svn_mergeinfo_merge2(path_explicit_mergeinfo,
+                                           path_inherited_mergeinfo,
+                                           iterpool, iterpool));
               SVN_ERR(svn_client__record_wc_mergeinfo(
                                           abspath_with_new_mergeinfo,
                                           path_explicit_mergeinfo,
@@ -7971,8 +7937,9 @@ record_mergeinfo_for_added_subtrees(
           /* Combine the explict mergeinfo on the added path (if any)
              with the mergeinfo describing this merge. */
           if (added_path_mergeinfo)
-            SVN_ERR(svn_mergeinfo_merge(merge_mergeinfo, added_path_mergeinfo,
-                                        iterpool));
+            SVN_ERR(svn_mergeinfo_merge2(merge_mergeinfo,
+                                         added_path_mergeinfo,
+                                         iterpool, iterpool));
           SVN_ERR(svn_client__record_wc_mergeinfo(
             added_abspath, merge_mergeinfo,
             !squelch_mergeinfo_notifications, merge_b->ctx, iterpool));
@@ -9991,21 +9958,10 @@ find_unsynced_ranges(const char *source_
            hi_catalog = apr_hash_next(hi_catalog))
         {
           svn_mergeinfo_t mergeinfo = svn__apr_hash_index_val(hi_catalog);
-          apr_hash_index_t *hi_mergeinfo;
-          apr_pool_t *iterpool = svn_pool_create(scratch_pool);
 
-          for (hi_mergeinfo = apr_hash_first(scratch_pool, mergeinfo);
-               hi_mergeinfo;
-               hi_mergeinfo = apr_hash_next(hi_mergeinfo))
-            {
-              apr_array_header_t *rangelist =
-                svn__apr_hash_index_val(hi_mergeinfo);
-
-              svn_pool_clear(iterpool);
-              SVN_ERR(svn_rangelist_merge2(potentially_unmerged_ranges,
-                                           rangelist, scratch_pool, iterpool));
-            }
-          svn_pool_destroy(iterpool);
+          SVN_ERR(svn_rangelist__merge_many(potentially_unmerged_ranges,
+                                            mergeinfo,
+                                            scratch_pool, scratch_pool));
         }
     }
 
@@ -10237,8 +10193,9 @@ find_unmerged_mergeinfo(svn_mergeinfo_ca
                                                   ctx, iterpool));
       SVN_ERR(svn_mergeinfo__mergeinfo_from_segments(
         &source_history_as_mergeinfo, segments, iterpool));
-      SVN_ERR(svn_mergeinfo_merge(source_mergeinfo,
-                                  source_history_as_mergeinfo, iterpool));
+      SVN_ERR(svn_mergeinfo_merge2(source_mergeinfo,
+                                   source_history_as_mergeinfo, iterpool,
+                                   iterpool));
 
       /* Now source_mergeinfo represents everything we know about
          source_path's history.  Now we need to know what part, if any, of the
@@ -10354,9 +10311,9 @@ find_unmerged_mergeinfo(svn_mergeinfo_ca
                 ctx, iterpool));
               SVN_ERR(svn_mergeinfo__mergeinfo_from_segments(
                 &source_history_as_mergeinfo, segments, iterpool));
-              SVN_ERR(svn_mergeinfo_merge(source_mergeinfo,
-                                          source_history_as_mergeinfo,
-                                          iterpool));
+              SVN_ERR(svn_mergeinfo_merge2(source_mergeinfo,
+                                           source_history_as_mergeinfo,
+                                           iterpool, iterpool));
               SVN_ERR(svn_mergeinfo_intersect2(&common_mergeinfo,
                                                source_mergeinfo,
                                                target_history_as_mergeinfo,

Modified: subversion/branches/fs-py/subversion/libsvn_client/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_client/mergeinfo.c?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_client/mergeinfo.c (original)
+++ subversion/branches/fs-py/subversion/libsvn_client/mergeinfo.c Thu Oct 13 14:30:07 2011
@@ -1937,23 +1937,9 @@ svn_client_mergeinfo_log(svn_boolean_t f
 
       /* Keep track of all ranges partially merged to any and all
          subtrees. */
-      if (apr_hash_count(merged_noninheritable))
-        {
-          apr_pool_t *iterpool2 = svn_pool_create(iterpool);
-
-          for (hi = apr_hash_first(iterpool, merged_noninheritable);
-               hi;
-               hi = apr_hash_next(hi))
-            {
-              apr_array_header_t *list = svn__apr_hash_index_val(hi);
-              svn_pool_clear(iterpool2);
-              SVN_ERR(svn_rangelist_merge2(
-                master_noninheritable_rangelist,
-                svn_rangelist_dup(list, scratch_pool),
-                scratch_pool, iterpool2));
-            }
-          svn_pool_destroy(iterpool2);
-        }
+      SVN_ERR(svn_rangelist__merge_many(master_noninheritable_rangelist,
+                                        merged_noninheritable,
+                                        scratch_pool, iterpool));
 
       /* Find the intersection of the inheritable part of TGT_MERGEINFO
          and SOURCE_HISTORY. */
@@ -1970,25 +1956,11 @@ svn_client_mergeinfo_log(svn_boolean_t f
              to SUBTREE_PATH. */
           apr_array_header_t *subtree_merged_rangelist =
             apr_array_make(scratch_pool, 1, sizeof(svn_merge_range_t *));
-          apr_pool_t *iterpool2 = svn_pool_create(iterpool);
 
-          for (hi = apr_hash_first(iterpool, merged);
-               hi;
-               hi = apr_hash_next(hi))
-            {
-              apr_array_header_t *list = svn__apr_hash_index_val(hi);
-
-              svn_pool_clear(iterpool2);
-              SVN_ERR(svn_rangelist_merge2(master_inheritable_rangelist,
-                                           svn_rangelist_dup(list,
-                                                             scratch_pool),
-                                           scratch_pool, iterpool2));
-              SVN_ERR(svn_rangelist_merge2(subtree_merged_rangelist,
-                                           svn_rangelist_dup(list,
-                                                            scratch_pool),
-                                           scratch_pool, iterpool2));
-            }
-          svn_pool_destroy(iterpool2);
+          SVN_ERR(svn_rangelist__merge_many(master_inheritable_rangelist,
+                                            merged, scratch_pool, iterpool));
+          SVN_ERR(svn_rangelist__merge_many(subtree_merged_rangelist,
+                                            merged, scratch_pool, iterpool));
 
           apr_hash_set(inheritable_subtree_merges,
                        apr_pstrdup(scratch_pool, subtree_path),
@@ -2062,18 +2034,9 @@ svn_client_mergeinfo_log(svn_boolean_t f
       apr_array_header_t *source_master_rangelist =
         apr_array_make(scratch_pool, 1, sizeof(svn_merge_range_t *));
 
-      for (hi = apr_hash_first(scratch_pool, source_history);
-           hi;
-           hi = apr_hash_next(hi))
-        {
-          apr_array_header_t *subtree_merged_rangelist =
-            svn__apr_hash_index_val(hi);
-
-          svn_pool_clear(iterpool);
-          SVN_ERR(svn_rangelist_merge2(source_master_rangelist,
-                                       subtree_merged_rangelist,
-                                       scratch_pool, iterpool));
-        }
+      SVN_ERR(svn_rangelist__merge_many(source_master_rangelist,
+                                        source_history,
+                                        scratch_pool, scratch_pool));
 
       /* From what might be eligible subtract what we know is partially merged
          and then merge that back. */

Modified: subversion/branches/fs-py/subversion/libsvn_client/ra.c
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_client/ra.c?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_client/ra.c (original)
+++ subversion/branches/fs-py/subversion/libsvn_client/ra.c Thu Oct 13 14:30:07 2011
@@ -655,9 +655,9 @@ svn_client__repos_locations(const char *
       end = &unspecified_rev;
     }
 
-  /* Check to see if this is schedule add with history working copy
-     path.  If it is, then we need to use the URL and peg revision of
-     the copyfrom information. */
+  /* Determine LOCAL_ABSPATH_OR_URL, URL, and possibly PEG_REVNUM.
+     If we are looking at the working version of a WC path that is scheduled
+     as a copy, then we need to use the copy-from URL and peg revision. */
   if (! svn_path_is_url(path))
     {
       SVN_ERR(svn_dirent_get_absolute(&local_abspath_or_url, path, subpool));

Modified: subversion/branches/fs-py/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/branches/fs-py/subversion/libsvn_fs/fs-loader.c?rev=1182877&r1=1182876&r2=1182877&view=diff
==============================================================================
--- subversion/branches/fs-py/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/branches/fs-py/subversion/libsvn_fs/fs-loader.c Thu Oct 13 14:30:07 2011
@@ -43,6 +43,7 @@
 #include "private/svn_fs_private.h"
 #include "private/svn_fs_util.h"
 #include "private/svn_utf_private.h"
+#include "private/svn_mutex.h"
 
 #include "fs-loader.h"
 #include "svn_hash.h"
@@ -58,9 +59,7 @@
 /* A pool common to all FS objects.  See the documentation on the
    open/create functions in fs-loader.h and for svn_fs_initialize(). */
 static apr_pool_t *common_pool;
-#if APR_HAS_THREADS
-static apr_thread_mutex_t *common_pool_lock;
-#endif
+svn_mutex__t *common_pool_lock;
 
 
 /* --- Utility functions for the loader --- */
@@ -124,30 +123,6 @@ load_module(fs_init_func_t *initfunc, co
   return SVN_NO_ERROR;
 }
 
-static svn_error_t *
-acquire_fs_mutex(void)
-{
-#if APR_HAS_THREADS
-  apr_status_t status;
-  status = apr_thread_mutex_lock(common_pool_lock);
-  if (status)
-    return svn_error_wrap_apr(status, _("Can't grab FS mutex"));
-#endif
-  return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-release_fs_mutex(void)
-{
-#if APR_HAS_THREADS
-  apr_status_t status;
-  status = apr_thread_mutex_unlock(common_pool_lock);
-  if (status)
-    return svn_error_wrap_apr(status, _("Can't ungrab FS mutex"));
-#endif
-  return SVN_NO_ERROR;
-}
-
 /* Fetch a library vtable by a pointer into the library definitions array. */
 static svn_error_t *
 get_library_vtable_direct(fs_library_vtable_t **vtable,
@@ -168,9 +143,6 @@ get_library_vtable_direct(fs_library_vta
                              fst->fs_type);
 
   {
-    svn_error_t *err;
-    svn_error_t *err2;
-
     /* Per our API compatibility rules, we cannot ensure that
        svn_fs_initialize is called by the application.  If not, we
        cannot create the common pool and lock in a thread-safe fashion,
@@ -183,16 +155,8 @@ get_library_vtable_direct(fs_library_vta
 
     /* Invoke the FS module's initfunc function with the common
        pool protected by a lock. */
-    SVN_ERR(acquire_fs_mutex());
-    err = initfunc(my_version, vtable, common_pool);
-    err2 = release_fs_mutex();
-    if (err)
-      {
-        svn_error_clear(err2);
-        return err;
-      }
-    if (err2)
-      return err2;
+    SVN_MUTEX__WITH_LOCK(common_pool_lock, 
+                         initfunc(my_version, vtable, common_pool));
   }
   fs_version = (*vtable)->get_version();
   if (!svn_ver_equal(my_version, fs_version))
@@ -290,31 +254,20 @@ write_fs_type(const char *path, const ch
 static apr_status_t uninit(void *data)
 {
   common_pool = NULL;
-#if APR_HAS_THREADS
-  common_pool_lock = NULL;
-#endif
   return APR_SUCCESS;
 }
 
 svn_error_t *
 svn_fs_initialize(apr_pool_t *pool)
 {
-#if APR_HAS_THREADS
-  apr_status_t status;
-#endif
-
   /* Protect against multiple calls. */
   if (common_pool)
     return SVN_NO_ERROR;
 
   common_pool = svn_pool_create(pool);
 #if APR_HAS_THREADS
-  status = apr_thread_mutex_create(&common_pool_lock,
-                                   APR_THREAD_MUTEX_DEFAULT, common_pool);
-  if (status)
-    return svn_error_wrap_apr(status, _("Can't allocate FS mutex"));
+  SVN_ERR(svn_mutex__init(&common_pool_lock, TRUE, common_pool));
 #endif
-
   /* ### This won't work if POOL is NULL and libsvn_fs is loaded as a DSO
      ### (via libsvn_ra_local say) since the global common_pool will live
      ### longer than the DSO, which gets unloaded when the pool used to
@@ -392,8 +345,6 @@ svn_error_t *
 svn_fs_create(svn_fs_t **fs_p, const char *path, apr_hash_t *fs_config,
               apr_pool_t *pool)
 {
-  svn_error_t *err;
-  svn_error_t *err2;
   fs_library_vtable_t *vtable;
 
   const char *fs_type = svn_hash__get_cstring(fs_config,
@@ -407,57 +358,37 @@ svn_fs_create(svn_fs_t **fs_p, const cha
 
   /* Perform the actual creation. */
   *fs_p = fs_new(fs_config, pool);
-  SVN_ERR(acquire_fs_mutex());
-  err = vtable->create(*fs_p, path, pool, common_pool);
-  err2 = release_fs_mutex();
-  if (err)
-    {
-      svn_error_clear(err2);
-      return svn_error_trace(err);
-    }
-  return svn_error_trace(err2);
+  
+  SVN_MUTEX__WITH_LOCK(common_pool_lock,
+                       vtable->create(*fs_p, path, pool, common_pool));
+  return SVN_NO_ERROR;
 }
 
 svn_error_t *
 svn_fs_open(svn_fs_t **fs_p, const char *path, apr_hash_t *fs_config,
             apr_pool_t *pool)
 {
-  svn_error_t *err;
-  svn_error_t *err2;
   fs_library_vtable_t *vtable;
 
   SVN_ERR(fs_library_vtable(&vtable, path, pool));
   *fs_p = fs_new(fs_config, pool);
-  SVN_ERR(acquire_fs_mutex());
-  err = vtable->open_fs(*fs_p, path, pool, common_pool);
-  err2 = release_fs_mutex();
-  if (err)
-    {
-      svn_error_clear(err2);
-      return svn_error_trace(err);
-    }
-  return svn_error_trace(err2);
+  SVN_MUTEX__WITH_LOCK(common_pool_lock,
+                       vtable->open_fs(*fs_p, path, pool, common_pool));
+  return SVN_NO_ERROR;
 }
 
 svn_error_t *
 svn_fs_upgrade(const char *path, apr_pool_t *pool)
 {
-  svn_error_t *err;
-  svn_error_t *err2;
   fs_library_vtable_t *vtable;
   svn_fs_t *fs;
 
   SVN_ERR(fs_library_vtable(&vtable, path, pool));
   fs = fs_new(NULL, pool);
-  SVN_ERR(acquire_fs_mutex());
-  err = vtable->upgrade_fs(fs, path, pool, common_pool);
-  err2 = release_fs_mutex();
-  if (err)
-    {
-      svn_error_clear(err2);
-      return svn_error_trace(err);
-    }
-  return svn_error_trace(err2);
+
+  SVN_MUTEX__WITH_LOCK(common_pool_lock,
+                       vtable->upgrade_fs(fs, path, pool, common_pool));
+  return SVN_NO_ERROR;
 }
 
 svn_error_t *
@@ -466,23 +397,16 @@ svn_fs_verify(const char *path,
               void *cancel_baton,
               apr_pool_t *pool) 
 {
-  svn_error_t *err;
-  svn_error_t *err2;
   fs_library_vtable_t *vtable;
   svn_fs_t *fs;
 
   SVN_ERR(fs_library_vtable(&vtable, path, pool));
   fs = fs_new(NULL, pool);
-  SVN_ERR(acquire_fs_mutex());
-  err = vtable->verify_fs(fs, path, cancel_func, cancel_baton,
-                          pool, common_pool);
-  err2 = release_fs_mutex();
-  if (err)
-    {
-      svn_error_clear(err2);
-      return svn_error_trace(err);
-    }
-  return svn_error_trace(err2);
+
+  SVN_MUTEX__WITH_LOCK(common_pool_lock,
+                       vtable->verify_fs(fs, path, cancel_func, cancel_baton,
+                                         pool, common_pool));
+  return SVN_NO_ERROR;
 }
 
 const char *
@@ -521,23 +445,16 @@ svn_fs_pack(const char *path,
             void *cancel_baton,
             apr_pool_t *pool)
 {
-  svn_error_t *err;
-  svn_error_t *err2;
   fs_library_vtable_t *vtable;
   svn_fs_t *fs;
 
   SVN_ERR(fs_library_vtable(&vtable, path, pool));
   fs = fs_new(NULL, pool);
-  SVN_ERR(acquire_fs_mutex());
-  err = vtable->pack_fs(fs, path, notify_func, notify_baton,
-                        cancel_func, cancel_baton, pool);
-  err2 = release_fs_mutex();
-  if (err)
-    {
-      svn_error_clear(err2);
-      return svn_error_trace(err);
-    }
-  return svn_error_trace(err2);
+
+  SVN_MUTEX__WITH_LOCK(common_pool_lock,
+                       vtable->pack_fs(fs, path, notify_func, notify_baton,
+                                       cancel_func, cancel_baton, pool));
+  return SVN_NO_ERROR;
 }
 
 svn_error_t *
@@ -545,24 +462,17 @@ svn_fs_recover(const char *path,
                svn_cancel_func_t cancel_func, void *cancel_baton,
                apr_pool_t *pool)
 {
-  svn_error_t *err;
-  svn_error_t *err2;
   fs_library_vtable_t *vtable;
   svn_fs_t *fs;
 
   SVN_ERR(fs_library_vtable(&vtable, path, pool));
   fs = fs_new(NULL, pool);
-  SVN_ERR(acquire_fs_mutex());
-  err = vtable->open_fs_for_recovery(fs, path, pool, common_pool);
-  err2 = release_fs_mutex();
-  if (err)
-    {
-      svn_error_clear(err2);
-      return svn_error_trace(err);
-    }
-  if (! err2)
-    err2 = vtable->recover(fs, cancel_func, cancel_baton, pool);
-  return svn_error_trace(err2);
+
+  SVN_MUTEX__WITH_LOCK(common_pool_lock,
+                       vtable->open_fs_for_recovery(fs, path, pool,
+                                                    common_pool));
+  return svn_error_trace(vtable->recover(fs, cancel_func, cancel_baton,
+                                         pool));
 }
 
 
@@ -571,8 +481,6 @@ svn_fs_recover(const char *path,
 svn_error_t *
 svn_fs_create_berkeley(svn_fs_t *fs, const char *path)
 {
-  svn_error_t *err;
-  svn_error_t *err2;
   fs_library_vtable_t *vtable;
 
   SVN_ERR(get_library_vtable(&vtable, SVN_FS_TYPE_BDB, fs->pool));
@@ -582,34 +490,20 @@ svn_fs_create_berkeley(svn_fs_t *fs, con
   SVN_ERR(write_fs_type(path, SVN_FS_TYPE_BDB, fs->pool));
 
   /* Perform the actual creation. */
-  SVN_ERR(acquire_fs_mutex());
-  err = vtable->create(fs, path, fs->pool, common_pool);
-  err2 = release_fs_mutex();
-  if (err)
-    {
-      svn_error_clear(err2);
-      return svn_error_trace(err);
-    }
-  return svn_error_trace(err2);
+  SVN_MUTEX__WITH_LOCK(common_pool_lock,
+                       vtable->create(fs, path, fs->pool, common_pool));
+  return SVN_NO_ERROR;
 }
 
 svn_error_t *
 svn_fs_open_berkeley(svn_fs_t *fs, const char *path)
 {
-  svn_error_t *err;
-  svn_error_t *err2;
   fs_library_vtable_t *vtable;
 
   SVN_ERR(fs_library_vtable(&vtable, path, fs->pool));
-  SVN_ERR(acquire_fs_mutex());
-  err = vtable->open_fs(fs, path, fs->pool, common_pool);
-  err2 = release_fs_mutex();
-  if (err)
-    {
-      svn_error_clear(err2);
-      return svn_error_trace(err);
-    }
-  return svn_error_trace(err2);
+  SVN_MUTEX__WITH_LOCK(common_pool_lock,
+                       vtable->open_fs(fs, path, fs->pool, common_pool));
+  return SVN_NO_ERROR;
 }
 
 const char *