You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by as...@apache.org on 2012/11/24 21:29:48 UTC

svn commit: r1413258 [15/33] - in /subversion/branches/compressed-pristines: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ contrib/client-side/emacs/ contrib/server-side/fsfsfixer/ notes/ notes/directory-index/ subversion/ subv...

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/named_atomic.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/named_atomic.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/named_atomic.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/named_atomic.c Sat Nov 24 20:29:11 2012
@@ -24,7 +24,7 @@
 #include "private/svn_named_atomic.h"
 
 #include <apr_global_mutex.h>
-#include <apr_shm.h>
+#include <apr_mmap.h>
 
 #include "svn_private_config.h"
 #include "private/svn_atomic.h"
@@ -35,13 +35,16 @@
 
 /* Implementation aspects.
  *
- * We use a single shared memory block that will be created by the first
- * user and merely mapped by all subsequent ones. The memory block contains
- * an short header followed by a fixed-capacity array of named atomics. The
- * number of entries currently in use is stored in the header part.
+ * We use a single shared memory block (memory mapped file) that will be
+ * created by the first user and merely mapped by all subsequent ones.
+ * The memory block contains an short header followed by a fixed-capacity
+ * array of named atomics. The number of entries currently in use is stored
+ * in the header part.
  *
- * Finding / creating the SHM object as well as adding new array entries
- * is being guarded by an APR global mutex.
+ * Finding / creating the MMAP object as well as adding new array entries
+ * is being guarded by an APR global mutex. Since releasing the MMAP
+ * structure and closing the underlying does not affect other users of the
+ * same, cleanup will not be synchronized.
  *
  * The array is append-only.  Once a process mapped the block into its
  * address space, it may freely access any of the used entries.  However,
@@ -182,8 +185,8 @@ struct named_atomic_data_t
  */
 struct shared_data_t
 {
-  volatile apr_int32_t count;
-  char padding [sizeof(struct named_atomic_data_t) - sizeof(apr_int32_t)];
+  volatile apr_uint32_t count;
+  char padding [sizeof(struct named_atomic_data_t) - sizeof(apr_uint32_t)];
 
   struct named_atomic_data_t atomics[MAX_ATOMIC_COUNT];
 };
@@ -382,8 +385,13 @@ svn_atomic_namespace__create(svn_atomic_
                              apr_pool_t *result_pool)
 {
   apr_status_t apr_err;
+  svn_error_t *err;
+  apr_file_t *file;
+  apr_mmap_t *mmap;
   const char *shm_name, *lock_name;
-  apr_shm_t *shared_mem;
+  apr_finfo_t finfo;
+
+  apr_pool_t *subpool = svn_pool_create(result_pool);
 
   /* allocate the namespace data structure
    */
@@ -391,15 +399,13 @@ svn_atomic_namespace__create(svn_atomic_
 
   /* construct the names of the system objects that we need
    */
-  shm_name = apr_pstrcat(result_pool, name, SHM_NAME_SUFFIX, NULL);
-  lock_name = apr_pstrcat(result_pool, name, MUTEX_NAME_SUFFIX, NULL);
+  shm_name = apr_pstrcat(subpool, name, SHM_NAME_SUFFIX, NULL);
+  lock_name = apr_pstrcat(subpool, name, MUTEX_NAME_SUFFIX, NULL);
 
   /* initialize the lock objects
    */
-  svn_atomic__init_once(&mutex_initialized,
-                        init_thread_mutex,
-                        NULL,
-                        result_pool);
+  SVN_ERR(svn_atomic__init_once(&mutex_initialized, init_thread_mutex, NULL,
+                                result_pool));
 
   new_ns->mutex.pool = result_pool;
   SVN_ERR(svn_io_file_open(&new_ns->mutex.lock_file, lock_name,
@@ -417,42 +423,80 @@ svn_atomic_namespace__create(svn_atomic_
    */
   SVN_ERR(lock(&new_ns->mutex));
 
-  /* First, look for an existing shared memory object.  If it doesn't
-   * exist, create one.
+  /* First, make sure that the underlying file exists.  If it doesn't
+   * exist, create one and initialize its content.
+   */
+  err = svn_io_file_open(&file, shm_name,
+                          APR_READ | APR_WRITE | APR_CREATE,
+                          APR_OS_DEFAULT,
+                          result_pool);
+  if (!err)
+    {
+      err = svn_io_stat(&finfo, shm_name, APR_FINFO_SIZE, subpool);
+      if (!err && finfo.size < sizeof(struct shared_data_t))
+        {
+           /* Zero all counters, values and names.
+            */
+           struct shared_data_t initial_data;
+           memset(&initial_data, 0, sizeof(initial_data));
+           err = svn_io_file_write_full(file, &initial_data,
+                                        sizeof(initial_data), NULL,
+                                        subpool);
+        }
+    }
+
+  /* Now, map it into memory.
    */
-  apr_err = apr_shm_attach(&shared_mem, shm_name, result_pool);
-  if (apr_err)
+  if (!err)
     {
-      apr_err = apr_shm_create(&shared_mem,
-                               sizeof(*new_ns->data),
-                               shm_name,
-                               result_pool);
-      if (apr_err)
-        return unlock(&new_ns->mutex,
-                      svn_error_wrap_apr(apr_err,
-                          _("Can't get shared memory for named atomics")));
+      apr_err = apr_mmap_create(&mmap, file, 0, sizeof(*new_ns->data),
+                                APR_MMAP_READ | APR_MMAP_WRITE , result_pool);
+      if (!apr_err)
+        new_ns->data = mmap->mm;
+      else
+        err = svn_error_createf(apr_err, NULL,
+                                _("MMAP failed for file '%s'"), shm_name);
+    }
 
-      new_ns->data = apr_shm_baseaddr_get(shared_mem);
+  svn_pool_destroy(subpool);
 
-      /* Zero all counters, values and names.
+  if (!err && new_ns->data)
+    {
+      /* Sanitize (in case of data corruption)
        */
-      memset(new_ns->data, 0, sizeof(*new_ns->data));
-    }
-  else
-    new_ns->data = apr_shm_baseaddr_get(shared_mem);
+      if (new_ns->data->count > MAX_ATOMIC_COUNT)
+        new_ns->data->count = MAX_ATOMIC_COUNT;
 
-  /* Cache the number of existing, complete entries.  There can't be
-   * incomplete ones from other processes because we hold the mutex.
-   * Our process will also not access this information since we are
-   * wither being called from within svn_atomic__init_once or by
-   * svn_atomic_namespace__create for a new object.
-   */
-  new_ns->min_used = new_ns->data->count;
+      /* Cache the number of existing, complete entries.  There can't be
+       * incomplete ones from other processes because we hold the mutex.
+       * Our process will also not access this information since we are
+       * either being called from within svn_atomic__init_once or by
+       * svn_atomic_namespace__create for a new object.
+       */
+      new_ns->min_used = new_ns->data->count;
+      *ns = new_ns;
+    }
 
   /* Unlock to allow other processes may access the shared memory as well.
    */
-  *ns = new_ns;
-  return unlock(&new_ns->mutex, SVN_NO_ERROR);
+  return unlock(&new_ns->mutex, err);
+}
+
+svn_error_t *
+svn_atomic_namespace__cleanup(const char *name,
+                              apr_pool_t *pool)
+{
+  const char *shm_name, *lock_name;
+
+  /* file names used for the specified namespace */
+  shm_name = apr_pstrcat(pool, name, SHM_NAME_SUFFIX, NULL);
+  lock_name = apr_pstrcat(pool, name, MUTEX_NAME_SUFFIX, NULL);
+
+  /* remove these files if they exist */
+  SVN_ERR(svn_io_remove_file2(shm_name, TRUE, pool));
+  SVN_ERR(svn_io_remove_file2(lock_name, TRUE, pool));
+
+  return SVN_NO_ERROR;
 }
 
 svn_error_t *
@@ -461,7 +505,7 @@ svn_named_atomic__get(svn_named_atomic__
                       const char *name,
                       svn_boolean_t auto_create)
 {
-  apr_int32_t i, count;
+  apr_uint32_t i, count;
   svn_error_t *error = SVN_NO_ERROR;
   apr_size_t len = strlen(name);
 
@@ -499,7 +543,7 @@ svn_named_atomic__get(svn_named_atomic__
   /* We only need to check for new entries.
    */
   for (i = count; i < ns->data->count; ++i)
-    if (strcmp(ns->data->atomics[i].name, name) == 0)
+    if (strncmp(ns->data->atomics[i].name, name, len + 1) == 0)
       {
         return_atomic(atomic, ns, i);
 

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/nls.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/nls.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/nls.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/nls.c Sat Nov 24 20:29:11 2012
@@ -121,10 +121,12 @@ svn_nls_init(void)
 #else /* ! WIN32 */
       bindtextdomain(PACKAGE_NAME, SVN_LOCALE_DIR);
     }
+#endif /* WIN32 */
+
 #ifdef HAVE_BIND_TEXTDOMAIN_CODESET
   bind_textdomain_codeset(PACKAGE_NAME, "UTF-8");
 #endif /* HAVE_BIND_TEXTDOMAIN_CODESET */
-#endif /* WIN32 */
+
 #endif /* ENABLE_NLS */
 
   return err;

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/opt.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/opt.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/opt.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/opt.c Sat Nov 24 20:29:11 2012
@@ -49,7 +49,6 @@
 #include "private/svn_opt_private.h"
 
 #include "opt.h"
-#include "sysinfo.h"
 #include "svn_private_config.h"
 
 
@@ -1102,9 +1101,11 @@ svn_opt__arg_canonicalize_path(const cha
   return SVN_NO_ERROR;
 }
 
+
 svn_error_t *
 svn_opt__print_version_info(const char *pgm_name,
                             const char *footer,
+                            const svn_version_extended_t *info,
                             svn_boolean_t quiet,
                             svn_boolean_t verbose,
                             apr_pool_t *pool)
@@ -1114,16 +1115,11 @@ svn_opt__print_version_info(const char *
 
   SVN_ERR(svn_cmdline_printf(pool, _("%s, version %s\n"
                                      "   compiled %s, %s on %s\n\n"),
-                             pgm_name, SVN_VERSION, __DATE__, __TIME__,
-                             SVN_BUILD_HOST));
-  SVN_ERR(svn_cmdline_fputs(
-             _("Copyright (C) 2012 The Apache Software Foundation.\n"
-               "This software consists of contributions made by many "
-               "people; see the NOTICE\n"
-               "file for more information.\n"
-               "Subversion is open source software, see "
-               "http://subversion.apache.org/\n\n"),
-             stdout, pool));
+                             pgm_name, SVN_VERSION,
+                             svn_version_ext_build_date(info),
+                             svn_version_ext_build_time(info),
+                             svn_version_ext_build_host(info)));
+  SVN_ERR(svn_cmdline_printf(pool, "%s\n", svn_version_ext_copyright(info)));
 
   if (footer)
     {
@@ -1132,30 +1128,66 @@ svn_opt__print_version_info(const char *
 
   if (verbose)
     {
-      const char *const host = svn_sysinfo__canonical_host(pool);
-      const char *const relname = svn_sysinfo__release_name(pool);
-      const char *const dlibs = svn_sysinfo__loaded_libs(pool);
+      const apr_array_header_t *libs;
 
       SVN_ERR(svn_cmdline_fputs(_("System information:\n\n"), stdout, pool));
-      if (relname)
-        SVN_ERR(svn_cmdline_printf(pool, _("* running on %s\n"
-                                           "  - %s\n"),
-                                   host, relname));
-      else
-        SVN_ERR(svn_cmdline_printf(pool, _("* running on %s\n"), host));
+      SVN_ERR(svn_cmdline_printf(pool, _("* running on %s\n"),
+                                 svn_version_ext_runtime_host(info)));
+      if (svn_version_ext_runtime_osname(info))
+        {
+          SVN_ERR(svn_cmdline_printf(pool, _("  - %s\n"),
+                                     svn_version_ext_runtime_osname(info)));
+        }
 
-      if (dlibs)
+      libs = svn_version_ext_linked_libs(info);
+      if (libs && libs->nelts)
         {
+          const svn_version_ext_linked_lib_t *lib;
+          int i;
+
+          SVN_ERR(svn_cmdline_fputs(_("* linked dependencies:\n"),
+                                    stdout, pool));
+          for (i = 0; i < libs->nelts; ++i)
+            {
+              lib = &APR_ARRAY_IDX(libs, i, svn_version_ext_linked_lib_t);
+              if (lib->runtime_version)
+                SVN_ERR(svn_cmdline_printf(pool,
+                                           "  - %s %s (compiled with %s)\n",
+                                           lib->name,
+                                           lib->runtime_version,
+                                           lib->compiled_version));
+              else
+                SVN_ERR(svn_cmdline_printf(pool,
+                                           "  - %s %s (static)\n",
+                                           lib->name,
+                                           lib->compiled_version));
+            }
+        }
+
+      libs = svn_version_ext_loaded_libs(info);
+      if (libs && libs->nelts)
+        {
+          const svn_version_ext_loaded_lib_t *lib;
+          int i;
+
           SVN_ERR(svn_cmdline_fputs(_("* loaded shared libraries:\n"),
                                     stdout, pool));
-          SVN_ERR(svn_cmdline_fputs(dlibs, stdout, pool));
+          for (i = 0; i < libs->nelts; ++i)
+            {
+              lib = &APR_ARRAY_IDX(libs, i, svn_version_ext_loaded_lib_t);
+              if (lib->version)
+                SVN_ERR(svn_cmdline_printf(pool,
+                                           "  - %s   (%s)\n",
+                                           lib->name, lib->version));
+              else
+                SVN_ERR(svn_cmdline_printf(pool, "  - %s\n", lib->name));
+            }
         }
     }
 
   return SVN_NO_ERROR;
 }
 
-
 svn_error_t *
 svn_opt_print_help4(apr_getopt_t *os,
                     const char *pgm_name,
@@ -1187,8 +1219,11 @@ svn_opt_print_help4(apr_getopt_t *os,
         }
     }
   else if (print_version)   /* just --version */
-    SVN_ERR(svn_opt__print_version_info(pgm_name, version_footer,
-                                        quiet, verbose, pool));
+    {
+      SVN_ERR(svn_opt__print_version_info(pgm_name, version_footer,
+                                          svn_version_extended(verbose, pool),
+                                          quiet, verbose, pool));
+    }
   else if (os && !targets->nelts)            /* `-h', `--help', or `help' */
     svn_opt_print_generic_help2(header,
                                 cmd_table,

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/opt.h
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/opt.h?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/opt.h (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/opt.h Sat Nov 24 20:29:11 2012
@@ -24,15 +24,17 @@
 #ifndef SVN_LIBSVN_SUBR_OPT_H
 #define SVN_LIBSVN_SUBR_OPT_H
 
+#include "svn_version.h"
 #include "svn_opt.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
 
-/* Print version info for PGM_NAME.  If QUIET is  true, print in
- * brief.  Else if QUIET is not true, print the version more
- * verbosely, and if FOOTER is non-null, print it following the
+
+/* Print version version info for PGM_NAME to the console.  If QUIET is
+ * true, print in brief.  Else if QUIET is not true, print the version
+ * more verbosely, and if FOOTER is non-null, print it following the
  * version information. If VERBOSE is true, print running system info.
  *
  * Use POOL for temporary allocations.
@@ -40,6 +42,7 @@ extern "C" {
 svn_error_t *
 svn_opt__print_version_info(const char *pgm_name,
                             const char *footer,
+                            const svn_version_extended_t *info,
                             svn_boolean_t quiet,
                             svn_boolean_t verbose,
                             apr_pool_t *pool);

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/path.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/path.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/path.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/path.c Sat Nov 24 20:29:11 2012
@@ -1082,7 +1082,7 @@ svn_path_url_add_component2(const char *
   /* = svn_path_uri_encode() but without always copying */
   component = uri_escape(component, svn_uri__char_validity, pool);
 
-  return svn_path_join(url, component, pool);
+  return svn_path_join_internal(url, component, pool);
 }
 
 svn_error_t *
@@ -1100,7 +1100,7 @@ svn_path_get_absolute(const char **pabso
 }
 
 
-
+#if !defined(WIN32) && !defined(DARWIN)
 /** Get APR's internal path encoding. */
 static svn_error_t *
 get_path_encoding(svn_boolean_t *path_is_utf8, apr_pool_t *pool)
@@ -1119,6 +1119,7 @@ get_path_encoding(svn_boolean_t *path_is
   *path_is_utf8 = (encoding_style == APR_FILEPATH_ENCODING_UTF8);
   return SVN_NO_ERROR;
 }
+#endif
 
 
 svn_error_t *

Added: subversion/branches/compressed-pristines/subversion/libsvn_subr/pseudo_md5.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/pseudo_md5.c?rev=1413258&view=auto
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/pseudo_md5.c (added)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/pseudo_md5.c Sat Nov 24 20:29:11 2012
@@ -0,0 +1,422 @@
+/*
+ * This is work is derived from material Copyright RSA Data Security, Inc.
+ *
+ * The RSA copyright statement and Licence for that original material is
+ * included below. This is followed by the Apache copyright statement and
+ * licence for the modifications made to that material.
+ */
+
+/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+   rights reserved.
+
+   License to copy and use this software is granted provided that it
+   is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+   Algorithm" in all material mentioning or referencing this software
+   or this function.
+
+   License is also granted to make and use derivative works provided
+   that such works are identified as "derived from the RSA Data
+   Security, Inc. MD5 Message-Digest Algorithm" in all material
+   mentioning or referencing the derived work.
+
+   RSA Data Security, Inc. makes no representations concerning either
+   the merchantability of this software or the suitability of this
+   software for any particular purpose. It is provided "as is"
+   without express or implied warranty of any kind.
+
+   These notices must be retained in any copies of any part of this
+   documentation and/or software.
+ */
+
+/* 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.
+ */
+
+/*
+ * The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
+ * MD5 crypt() function, which is licenced as follows:
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <ph...@login.dknet.dk> wrote this file.  As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+ * pseudo_md5.c:  md5-esque hash sum calculation for short data blocks.
+ *                Code taken and adapted from the APR (see licenses above).
+ */
+#include "private/svn_pseudo_md5.h"
+
+/* Constants for MD5 calculation.
+ */
+
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#if defined(_MSC_VER) && _MSC_VER >= 1310
+#pragma intrinsic(_rotl)
+#define ROTATE_LEFT(x, n) (_rotl(x,n))
+#else
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+#endif
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ * Rotation is separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+  }
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+  }
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+  }
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+  }
+
+/* The idea of the functions below is as follows:
+ * 
+ * - The core MD5 algorithm does not assume that the "important" data
+ *   is at the begin of the encryption block, followed by e.g. 0.
+ *   Instead, all bits are equally relevant.
+ * 
+ * - If some bytes in the input are known to be 0, we may hard-code them.
+ *   With the previous property, it is safe to move them to the upper end
+ *   of the encryption block to maximize the number of steps that can be
+ *   pre-calculated.
+ *
+ * - Variable-length streams will use the upper 8 byte of the last
+ *   encryption block to store the stream length in bits (to make 0, 00,
+ *   000, ... etc. produce different hash sums).
+ *
+ * - We will hash at most 63 bytes, i.e. 504 bits.  In the standard stream
+ *   implementation, the upper 6 bytes of the last encryption block would
+ *   be 0.  We will put at least one non-NULL value in the last 4 bytes.
+ *   Therefore, our input will always be different to a standard MD5 stream
+ *   implementation in either block count, content or both.
+ *
+ * - Our length indicator also varies with the number bytes in the input.
+ *   Hence, different pseudo-MD5 input length produces different output
+ *   (with "cryptographic probability") even if the content is all 0 or
+ *   otherwise identical.
+ *
+ * - Collisions between pseudo-MD5 and pseudo-MD5 as well as pseudo-MD5
+ *   and standard MD5 are as likely as any other MD5 collision.
+ */
+  
+void svn__pseudo_md5_15(apr_uint32_t digest[4],
+                        const apr_uint32_t x[4])
+{
+    apr_uint32_t a = 0x67452301;
+    apr_uint32_t b = 0xefcdab89;
+    apr_uint32_t c = 0x98badcfe;
+    apr_uint32_t d = 0x10325476;
+
+    /* make sure byte 63 gets the marker independently of BE / LE */
+    apr_uint32_t x3n = x[3] ^ 0xffffffff;
+    
+    /* Round 1 */
+    FF(a, b, c, d, 0,    S11, 0xd76aa478); /* 1 */
+    FF(d, a, b, c, 0,    S12, 0xe8c7b756); /* 2 */
+    FF(c, d, a, b, 0,    S13, 0x242070db); /* 3 */
+    FF(b, c, d, a, 0,    S14, 0xc1bdceee); /* 4 */
+    FF(a, b, c, d, 0,    S11, 0xf57c0faf); /* 5 */
+    FF(d, a, b, c, 0,    S12, 0x4787c62a); /* 6 */
+    FF(c, d, a, b, 0,    S13, 0xa8304613); /* 7 */
+    FF(b, c, d, a, 0,    S14, 0xfd469501); /* 8 */
+    FF(a, b, c, d, 0,    S11, 0x698098d8); /* 9 */
+    FF(d, a, b, c, 0,    S12, 0x8b44f7af); /* 10 */
+    FF(c, d, a, b, 0,    S13, 0xffff5bb1); /* 11 */
+    FF(b, c, d, a, 0,    S14, 0x895cd7be); /* 12 */
+    FF(a, b, c, d, x[0], S11, 0x6b901122); /* 13 */
+    FF(d, a, b, c, x[1], S12, 0xfd987193); /* 14 */
+    FF(c, d, a, b, x[2], S13, 0xa679438e); /* 15 */
+    FF(b, c, d, a, x3n,  S14, 0x49b40821); /* 16 */
+
+    /* Round 2 */
+    GG(a, b, c, d, 0,    S21, 0xf61e2562); /* 17 */
+    GG(d, a, b, c, 0,    S22, 0xc040b340); /* 18 */
+    GG(c, d, a, b, 0,    S23, 0x265e5a51); /* 19 */
+    GG(b, c, d, a, 0,    S24, 0xe9b6c7aa); /* 20 */
+    GG(a, b, c, d, 0,    S21, 0xd62f105d); /* 21 */
+    GG(d, a, b, c, 0,    S22, 0x2441453);  /* 22 */
+    GG(c, d, a, b, x3n,  S23, 0xd8a1e681); /* 23 */
+    GG(b, c, d, a, 0,    S24, 0xe7d3fbc8); /* 24 */
+    GG(a, b, c, d, 0,    S21, 0x21e1cde6); /* 25 */
+    GG(d, a, b, c, x[2], S22, 0xc33707d6); /* 26 */
+    GG(c, d, a, b, 0,    S23, 0xf4d50d87); /* 27 */
+    GG(b, c, d, a, 0,    S24, 0x455a14ed); /* 28 */
+    GG(a, b, c, d, x[1], S21, 0xa9e3e905); /* 29 */
+    GG(d, a, b, c, 0,    S22, 0xfcefa3f8); /* 30 */
+    GG(c, d, a, b, 0,    S23, 0x676f02d9); /* 31 */
+    GG(b, c, d, a, x[0], S24, 0x8d2a4c8a); /* 32 */
+
+    /* Round 3 */
+    HH(a, b, c, d, 0,    S31, 0xfffa3942); /* 33 */
+    HH(d, a, b, c, 0,    S32, 0x8771f681); /* 34 */
+    HH(c, d, a, b, 0,    S33, 0x6d9d6122); /* 35 */
+    HH(b, c, d, a, x[2], S34, 0xfde5380c); /* 36 */
+    HH(a, b, c, d, 0,    S31, 0xa4beea44); /* 37 */
+    HH(d, a, b, c, 0,    S32, 0x4bdecfa9); /* 38 */
+    HH(c, d, a, b, 0,    S33, 0xf6bb4b60); /* 39 */
+    HH(b, c, d, a, 0,    S34, 0xbebfbc70); /* 40 */
+    HH(a, b, c, d, x[1], S31, 0x289b7ec6); /* 41 */
+    HH(d, a, b, c, 0,    S32, 0xeaa127fa); /* 42 */
+    HH(c, d, a, b, 0,    S33, 0xd4ef3085); /* 43 */
+    HH(b, c, d, a, 0,    S34, 0x4881d05);  /* 44 */
+    HH(a, b, c, d, 0,    S31, 0xd9d4d039); /* 45 */
+    HH(d, a, b, c, x[0], S32, 0xe6db99e5); /* 46 */
+    HH(c, d, a, b, x3n,  S33, 0x1fa27cf8); /* 47 */
+    HH(b, c, d, a, 0,    S34, 0xc4ac5665); /* 48 */
+
+    /* Round 4 */
+    II(a, b, c, d, 0,    S41, 0xf4292244); /* 49 */
+    II(d, a, b, c, 0,    S42, 0x432aff97); /* 50 */
+    II(c, d, a, b, x[2], S43, 0xab9423a7); /* 51 */
+    II(b, c, d, a, 0,    S44, 0xfc93a039); /* 52 */
+    II(a, b, c, d, x[0], S41, 0x655b59c3); /* 53 */
+    II(d, a, b, c, 0,    S42, 0x8f0ccc92); /* 54 */
+    II(c, d, a, b, 0,    S43, 0xffeff47d); /* 55 */
+    II(b, c, d, a, 0,    S44, 0x85845dd1); /* 56 */
+    II(a, b, c, d, 0,    S41, 0x6fa87e4f); /* 57 */
+    II(d, a, b, c, x3n,  S42, 0xfe2ce6e0); /* 58 */
+    II(c, d, a, b, 0,    S43, 0xa3014314); /* 59 */
+    II(b, c, d, a, x[1], S44, 0x4e0811a1); /* 60 */
+    II(a, b, c, d, 0,    S41, 0xf7537e82); /* 61 */
+    II(d, a, b, c, 0,    S42, 0xbd3af235); /* 62 */
+    II(c, d, a, b, 0,    S43, 0x2ad7d2bb); /* 63 */
+    II(b, c, d, a, 0,    S44, 0xeb86d391); /* 64 */
+
+    digest[0] = a;
+    digest[1] = b;
+    digest[2] = c;
+    digest[3] = d;
+}
+
+void svn__pseudo_md5_31(apr_uint32_t digest[4],
+                        const apr_uint32_t x[8])
+{
+    apr_uint32_t a = 0x67452301;
+    apr_uint32_t b = 0xefcdab89;
+    apr_uint32_t c = 0x98badcfe;
+    apr_uint32_t d = 0x10325476;
+
+    /* make sure byte 63 gets the marker independently of BE / LE */
+    apr_uint32_t x7n = x[7] ^ 0xfefefefe;
+    
+    /* Round 1 */
+    FF(a, b, c, d, 0,    S11, 0xd76aa478); /* 1 */
+    FF(d, a, b, c, 0,    S12, 0xe8c7b756); /* 2 */
+    FF(c, d, a, b, 0,    S13, 0x242070db); /* 3 */
+    FF(b, c, d, a, 0,    S14, 0xc1bdceee); /* 4 */
+    FF(a, b, c, d, 0,    S11, 0xf57c0faf); /* 5 */
+    FF(d, a, b, c, 0,    S12, 0x4787c62a); /* 6 */
+    FF(c, d, a, b, 0,    S13, 0xa8304613); /* 7 */
+    FF(b, c, d, a, 0,    S14, 0xfd469501); /* 8 */
+    FF(a, b, c, d, x[0], S11, 0x698098d8); /* 9 */
+    FF(d, a, b, c, x[1], S12, 0x8b44f7af); /* 10 */
+    FF(c, d, a, b, x[2], S13, 0xffff5bb1); /* 11 */
+    FF(b, c, d, a, x[3], S14, 0x895cd7be); /* 12 */
+    FF(a, b, c, d, x[4], S11, 0x6b901122); /* 13 */
+    FF(d, a, b, c, x[5], S12, 0xfd987193); /* 14 */
+    FF(c, d, a, b, x[6], S13, 0xa679438e); /* 15 */
+    FF(b, c, d, a, x7n,  S14, 0x49b40821); /* 16 */
+
+    /* Round 2 */
+    GG(a, b, c, d, 0,    S21, 0xf61e2562); /* 17 */
+    GG(d, a, b, c, 0,    S22, 0xc040b340); /* 18 */
+    GG(c, d, a, b, x[3], S23, 0x265e5a51); /* 19 */
+    GG(b, c, d, a, 0,    S24, 0xe9b6c7aa); /* 20 */
+    GG(a, b, c, d, 0,    S21, 0xd62f105d); /* 21 */
+    GG(d, a, b, c, x[2], S22, 0x2441453);  /* 22 */
+    GG(c, d, a, b, x7n,  S23, 0xd8a1e681); /* 23 */
+    GG(b, c, d, a, 0,    S24, 0xe7d3fbc8); /* 24 */
+    GG(a, b, c, d, x[1], S21, 0x21e1cde6); /* 25 */
+    GG(d, a, b, c, x[6], S22, 0xc33707d6); /* 26 */
+    GG(c, d, a, b, 0,    S23, 0xf4d50d87); /* 27 */
+    GG(b, c, d, a, x[0], S24, 0x455a14ed); /* 28 */
+    GG(a, b, c, d, x[5], S21, 0xa9e3e905); /* 29 */
+    GG(d, a, b, c, 0,    S22, 0xfcefa3f8); /* 30 */
+    GG(c, d, a, b, 0,    S23, 0x676f02d9); /* 31 */
+    GG(b, c, d, a, x[4], S24, 0x8d2a4c8a); /* 32 */
+
+    /* Round 3 */
+    HH(a, b, c, d, 0,    S31, 0xfffa3942); /* 33 */
+    HH(d, a, b, c, x[0], S32, 0x8771f681); /* 34 */
+    HH(c, d, a, b, x[3], S33, 0x6d9d6122); /* 35 */
+    HH(b, c, d, a, x[6], S34, 0xfde5380c); /* 36 */
+    HH(a, b, c, d, 0,    S31, 0xa4beea44); /* 37 */
+    HH(d, a, b, c, 0,    S32, 0x4bdecfa9); /* 38 */
+    HH(c, d, a, b, 0,    S33, 0xf6bb4b60); /* 39 */
+    HH(b, c, d, a, x[2], S34, 0xbebfbc70); /* 40 */
+    HH(a, b, c, d, x[5], S31, 0x289b7ec6); /* 41 */
+    HH(d, a, b, c, 0,    S32, 0xeaa127fa); /* 42 */
+    HH(c, d, a, b, 0,    S33, 0xd4ef3085); /* 43 */
+    HH(b, c, d, a, 0,    S34, 0x4881d05);  /* 44 */
+    HH(a, b, c, d, x[1], S31, 0xd9d4d039); /* 45 */
+    HH(d, a, b, c, x[4], S32, 0xe6db99e5); /* 46 */
+    HH(c, d, a, b, x7n,  S33, 0x1fa27cf8); /* 47 */
+    HH(b, c, d, a, 0,    S34, 0xc4ac5665); /* 48 */
+
+    /* Round 4 */
+    II(a, b, c, d, 0,    S41, 0xf4292244); /* 49 */
+    II(d, a, b, c, 0,    S42, 0x432aff97); /* 50 */
+    II(c, d, a, b, x[6], S43, 0xab9423a7); /* 51 */
+    II(b, c, d, a, 0,    S44, 0xfc93a039); /* 52 */
+    II(a, b, c, d, x[4], S41, 0x655b59c3); /* 53 */
+    II(d, a, b, c, 0,    S42, 0x8f0ccc92); /* 54 */
+    II(c, d, a, b, x[2], S43, 0xffeff47d); /* 55 */
+    II(b, c, d, a, 0,    S44, 0x85845dd1); /* 56 */
+    II(a, b, c, d, x[0], S41, 0x6fa87e4f); /* 57 */
+    II(d, a, b, c, x7n,  S42, 0xfe2ce6e0); /* 58 */
+    II(c, d, a, b, 0,    S43, 0xa3014314); /* 59 */
+    II(b, c, d, a, x[5], S44, 0x4e0811a1); /* 60 */
+    II(a, b, c, d, 0,    S41, 0xf7537e82); /* 61 */
+    II(d, a, b, c, x[3], S42, 0xbd3af235); /* 62 */
+    II(c, d, a, b, 0,    S43, 0x2ad7d2bb); /* 63 */
+    II(b, c, d, a, x[1], S44, 0xeb86d391); /* 64 */
+
+    digest[0] = a;
+    digest[1] = b;
+    digest[2] = c;
+    digest[3] = d;
+}
+
+void svn__pseudo_md5_63(apr_uint32_t digest[4],
+                        const apr_uint32_t x[16])
+{
+    apr_uint32_t a = 0x67452301;
+    apr_uint32_t b = 0xefcdab89;
+    apr_uint32_t c = 0x98badcfe;
+    apr_uint32_t d = 0x10325476;
+
+    /* make sure byte 63 gets the marker independently of BE / LE */
+    apr_uint32_t x15n = x[15] ^ 0xfcfcfcfc;
+    
+    /* Round 1 */
+    FF(a, b, c, d, x[0],  S11, 0xd76aa478); /* 1 */
+    FF(d, a, b, c, x[1],  S12, 0xe8c7b756); /* 2 */
+    FF(c, d, a, b, x[2],  S13, 0x242070db); /* 3 */
+    FF(b, c, d, a, x[3],  S14, 0xc1bdceee); /* 4 */
+    FF(a, b, c, d, x[4],  S11, 0xf57c0faf); /* 5 */
+    FF(d, a, b, c, x[5],  S12, 0x4787c62a); /* 6 */
+    FF(c, d, a, b, x[6],  S13, 0xa8304613); /* 7 */
+    FF(b, c, d, a, x[7],  S14, 0xfd469501); /* 8 */
+    FF(a, b, c, d, x[8],  S11, 0x698098d8); /* 9 */
+    FF(d, a, b, c, x[9],  S12, 0x8b44f7af); /* 10 */
+    FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+    FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+    FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+    FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+    FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+    FF(b, c, d, a, x15n,  S14, 0x49b40821); /* 16 */
+
+    /* Round 2 */
+    GG(a, b, c, d, x[1],  S21, 0xf61e2562); /* 17 */
+    GG(d, a, b, c, x[6],  S22, 0xc040b340); /* 18 */
+    GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+    GG(b, c, d, a, x[0],  S24, 0xe9b6c7aa); /* 20 */
+    GG(a, b, c, d, x[5],  S21, 0xd62f105d); /* 21 */
+    GG(d, a, b, c, x[10], S22, 0x2441453);  /* 22 */
+    GG(c, d, a, b, x15n,  S23, 0xd8a1e681); /* 23 */
+    GG(b, c, d, a, x[4],  S24, 0xe7d3fbc8); /* 24 */
+    GG(a, b, c, d, x[9],  S21, 0x21e1cde6); /* 25 */
+    GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+    GG(c, d, a, b, x[3],  S23, 0xf4d50d87); /* 27 */
+    GG(b, c, d, a, x[8],  S24, 0x455a14ed); /* 28 */
+    GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+    GG(d, a, b, c, x[2],  S22, 0xfcefa3f8); /* 30 */
+    GG(c, d, a, b, x[7],  S23, 0x676f02d9); /* 31 */
+    GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+    /* Round 3 */
+    HH(a, b, c, d, x[5],  S31, 0xfffa3942); /* 33 */
+    HH(d, a, b, c, x[8],  S32, 0x8771f681); /* 34 */
+    HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+    HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+    HH(a, b, c, d, x[1],  S31, 0xa4beea44); /* 37 */
+    HH(d, a, b, c, x[4],  S32, 0x4bdecfa9); /* 38 */
+    HH(c, d, a, b, x[7],  S33, 0xf6bb4b60); /* 39 */
+    HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+    HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+    HH(d, a, b, c, x[0],  S32, 0xeaa127fa); /* 42 */
+    HH(c, d, a, b, x[3],  S33, 0xd4ef3085); /* 43 */
+    HH(b, c, d, a, x[6],  S34, 0x4881d05);  /* 44 */
+    HH(a, b, c, d, x[9],  S31, 0xd9d4d039); /* 45 */
+    HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+    HH(c, d, a, b, x15n,  S33, 0x1fa27cf8); /* 47 */
+    HH(b, c, d, a, x[2],  S34, 0xc4ac5665); /* 48 */
+
+    /* Round 4 */
+    II(a, b, c, d, x[0],  S41, 0xf4292244); /* 49 */
+    II(d, a, b, c, x[7],  S42, 0x432aff97); /* 50 */
+    II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+    II(b, c, d, a, x[5],  S44, 0xfc93a039); /* 52 */
+    II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+    II(d, a, b, c, x[3],  S42, 0x8f0ccc92); /* 54 */
+    II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+    II(b, c, d, a, x[1],  S44, 0x85845dd1); /* 56 */
+    II(a, b, c, d, x[8],  S41, 0x6fa87e4f); /* 57 */
+    II(d, a, b, c, x15n,  S42, 0xfe2ce6e0); /* 58 */
+    II(c, d, a, b, x[6],  S43, 0xa3014314); /* 59 */
+    II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+    II(a, b, c, d, x[4],  S41, 0xf7537e82); /* 61 */
+    II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+    II(c, d, a, b, x[2],  S43, 0x2ad7d2bb); /* 63 */
+    II(b, c, d, a, x[9],  S44, 0xeb86d391); /* 64 */
+
+    digest[0] = a;
+    digest[1] = b;
+    digest[2] = c;
+    digest[3] = d;
+}

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/simple_providers.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/simple_providers.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/simple_providers.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/simple_providers.c Sat Nov 24 20:29:11 2012
@@ -475,6 +475,10 @@ svn_auth__simple_creds_cache_set(svn_boo
   /* Save credentials to disk. */
   err = svn_config_write_auth_data(creds_hash, SVN_AUTH_CRED_SIMPLE,
                                    realmstring, config_dir, pool);
+  if (err)
+    *saved = FALSE;
+
+  /* ### return error? */
   svn_error_clear(err);
 
   return SVN_NO_ERROR;

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/skel.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/skel.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/skel.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/skel.c Sat Nov 24 20:29:11 2012
@@ -23,6 +23,8 @@
 #include <string.h>
 #include "svn_string.h"
 #include "svn_error.h"
+#include "svn_props.h"
+#include "svn_pools.h"
 #include "private/svn_skel.h"
 #include "private/svn_string_private.h"
 
@@ -167,6 +169,35 @@ is_valid_proplist_skel(const svn_skel_t 
   return FALSE;
 }
 
+static svn_boolean_t
+is_valid_iproplist_skel(const svn_skel_t *skel)
+{
+  int len = svn_skel__list_length(skel);
+
+  if ((len >= 0) && (len & 1) == 0)
+    {
+      svn_skel_t *elt;
+
+      for (elt = skel->children; elt; elt = elt->next)
+        {
+          if (!elt->is_atom)
+            return FALSE;
+
+          if (elt->next == NULL)
+            return FALSE;
+
+          elt = elt->next;
+
+          if (! is_valid_proplist_skel(elt))
+            return FALSE;
+        }
+
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 
 static svn_skel_t *parse(const char *data, apr_size_t len,
                          apr_pool_t *pool);
@@ -689,6 +720,34 @@ svn_skel__parse_proplist(apr_hash_t **pr
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_skel__parse_iprops(apr_array_header_t **iprops,
+                       const svn_skel_t *skel,
+                       apr_pool_t *result_pool)
+{
+  svn_skel_t *elt;
+
+  /* Validate the skel. */
+  if (! is_valid_iproplist_skel(skel))
+    return skel_err("iprops");
+
+  /* Create the returned structure */
+  *iprops = apr_array_make(result_pool, 1,
+                           sizeof(svn_prop_inherited_item_t *));
+
+  for (elt = skel->children; elt; elt = elt->next->next)
+    {
+      svn_prop_inherited_item_t *new_iprop = apr_palloc(result_pool,
+                                                        sizeof(*new_iprop));
+      svn_string_t *repos_parent = svn_string_ncreate(elt->data, elt->len,
+                                                      result_pool);
+      SVN_ERR(svn_skel__parse_proplist(&(new_iprop->prop_hash), elt->next,
+                                       result_pool));
+      new_iprop->path_or_url = repos_parent->data;
+      APR_ARRAY_PUSH(*iprops, svn_prop_inherited_item_t *) = new_iprop;
+    }
+  return SVN_NO_ERROR;
+}
 
 svn_error_t *
 svn_skel__parse_prop(svn_string_t **propval,
@@ -760,3 +819,65 @@ svn_skel__unparse_proplist(svn_skel_t **
   *skel_p = skel;
   return SVN_NO_ERROR;
 }
+
+svn_error_t *
+svn_skel__unparse_iproplist(svn_skel_t **skel_p,
+                            const apr_array_header_t *inherited_props,
+                            apr_pool_t *result_pool)
+{
+  svn_skel_t *skel = svn_skel__make_empty_list(result_pool);
+
+  /* Create the skel. */
+  if (inherited_props)
+    {
+      int i;
+      apr_hash_index_t *hi;
+      apr_pool_t *subpool = svn_pool_create(result_pool);
+
+      for (i = 0; i < inherited_props->nelts; i++)
+        {
+          svn_prop_inherited_item_t *iprop =
+            APR_ARRAY_IDX(inherited_props, i, svn_prop_inherited_item_t *);
+
+          svn_skel_t *skel_list = svn_skel__make_empty_list(result_pool);
+          svn_skel_t *skel_atom;
+
+          svn_pool_clear(subpool);
+
+          /* Loop over hash entries */
+          for (hi = apr_hash_first(subpool, iprop->prop_hash);
+               hi;
+               hi = apr_hash_next(hi))
+            {
+              const void *key;
+              void *val;
+              apr_ssize_t klen;
+              svn_string_t *value;
+
+              apr_hash_this(hi, &key, &klen, &val);
+              value = val;
+
+              /* VALUE */
+              svn_skel__prepend(svn_skel__mem_atom(value->data, value->len,
+                                                   result_pool), skel_list);
+
+              /* NAME */
+              svn_skel__prepend(svn_skel__mem_atom(key, klen, result_pool),
+                                skel_list);
+            }
+
+          skel_atom = svn_skel__str_atom(
+            apr_pstrdup(result_pool, iprop->path_or_url), result_pool);
+          svn_skel__append(skel, skel_atom);
+          svn_skel__append(skel, skel_list);
+        }
+      svn_pool_destroy(subpool);
+    }
+
+  /* Validate and return the skel. */
+  if (! is_valid_iproplist_skel(skel))
+    return skel_err("iproplist");
+
+  *skel_p = skel;
+  return SVN_NO_ERROR;
+}

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/sqlite.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/sqlite.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/sqlite.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/sqlite.c Sat Nov 24 20:29:11 2012
@@ -45,6 +45,9 @@
 #ifdef SVN_SQLITE_INLINE
 /* Include sqlite3 inline, making all symbols private. */
   #define SQLITE_API static
+  #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
+    #pragma GCC diagnostic ignored "-Wunused-function"
+  #endif
   #include <sqlite3.c>
 #else
   #include <sqlite3.h>
@@ -54,6 +57,20 @@
 #error SQLite is too old -- version 3.7.12 is the minimum required version
 #endif
 
+const char *
+svn_sqlite__compiled_version(void)
+{
+  static const char sqlite_version[] = SQLITE_VERSION;
+  return sqlite_version;
+}
+
+const char *
+svn_sqlite__runtime_version(void)
+{
+  return sqlite3_libversion();
+}
+
+
 INTERNAL_STATEMENTS_SQL_DECLARE_STATEMENTS(internal_statements);
 
 
@@ -462,6 +479,27 @@ svn_sqlite__bind_properties(svn_sqlite__
 }
 
 svn_error_t *
+svn_sqlite__bind_iprops(svn_sqlite__stmt_t *stmt,
+                        int slot,
+                        const apr_array_header_t *inherited_props,
+                        apr_pool_t *scratch_pool)
+{
+  svn_skel_t *skel;
+  svn_stringbuf_t *properties;
+
+  if (inherited_props == NULL)
+    return svn_error_trace(svn_sqlite__bind_blob(stmt, slot, NULL, 0));
+
+  SVN_ERR(svn_skel__unparse_iproplist(&skel, inherited_props,
+                                      scratch_pool));
+  properties = svn_skel__unparse(skel, scratch_pool);
+  return svn_error_trace(svn_sqlite__bind_blob(stmt,
+                                               slot,
+                                               properties->data,
+                                               properties->len));
+}
+
+svn_error_t *
 svn_sqlite__bind_checksum(svn_sqlite__stmt_t *stmt,
                           int slot,
                           const svn_checksum_t *checksum,
@@ -567,6 +605,31 @@ svn_sqlite__column_properties(apr_hash_t
 }
 
 svn_error_t *
+svn_sqlite__column_iprops(apr_array_header_t **iprops,
+                          svn_sqlite__stmt_t *stmt,
+                          int column,
+                          apr_pool_t *result_pool,
+                          apr_pool_t *scratch_pool)
+{
+  apr_size_t len;
+  const void *val;
+
+  /* svn_skel__parse_iprops copies everything needed to result_pool */
+  val = svn_sqlite__column_blob(stmt, column, &len, NULL);
+  if (val == NULL)
+    {
+      *iprops = NULL;
+      return SVN_NO_ERROR;
+    }
+
+  SVN_ERR(svn_skel__parse_iprops(iprops,
+                                 svn_skel__parse(val, len, scratch_pool),
+                                 result_pool));
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
 svn_sqlite__column_checksum(const svn_checksum_t **checksum,
                             svn_sqlite__stmt_t *stmt, int column,
                             apr_pool_t *result_pool)

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/ssl_client_cert_pw_providers.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/ssl_client_cert_pw_providers.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/ssl_client_cert_pw_providers.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/ssl_client_cert_pw_providers.c Sat Nov 24 20:29:11 2012
@@ -82,7 +82,7 @@ svn_auth__ssl_client_cert_pw_get(svn_boo
       return SVN_NO_ERROR;
     }
   *done = FALSE;
-  return FALSE;
+  return SVN_NO_ERROR;
 }
 
 /* This implements the svn_auth__password_set_t interface.

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/string.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/string.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/string.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/string.c Sat Nov 24 20:29:11 2012
@@ -578,6 +578,80 @@ svn_stringbuf_appendcstr(svn_stringbuf_t
   svn_stringbuf_appendbytes(targetstr, cstr, strlen(cstr));
 }
 
+void
+svn_stringbuf_insert(svn_stringbuf_t *str,
+                     apr_size_t pos,
+                     const char *bytes,
+                     apr_size_t count)
+{
+  if (bytes + count > str->data && bytes < str->data + str->blocksize)
+    {
+      /* special case: BYTES overlaps with this string -> copy the source */
+      const char *temp = apr_pstrndup(str->pool, bytes, count);
+      svn_stringbuf_insert(str, pos, temp, count);
+    }
+  else
+    {
+      if (pos > str->len)
+        pos = str->len;
+
+      svn_stringbuf_ensure(str, str->len + count);
+      memmove(str->data + pos + count, str->data + pos, str->len - pos + 1);
+      memcpy(str->data + pos, bytes, count);
+
+      str->len += count;
+    }
+}
+
+void
+svn_stringbuf_remove(svn_stringbuf_t *str,
+                     apr_size_t pos,
+                     apr_size_t count)
+{
+  if (pos > str->len)
+    pos = str->len;
+  if (pos + count > str->len)
+    count = str->len - pos;
+
+  memmove(str->data + pos, str->data + pos + count, str->len - pos - count + 1);
+  str->len -= count;
+}
+
+void
+svn_stringbuf_replace(svn_stringbuf_t *str,
+                      apr_size_t pos,
+                      apr_size_t old_count,
+                      const char *bytes,
+                      apr_size_t new_count)
+{
+  if (bytes + new_count > str->data && bytes < str->data + str->blocksize)
+    {
+      /* special case: BYTES overlaps with this string -> copy the source */
+      const char *temp = apr_pstrndup(str->pool, bytes, new_count);
+      svn_stringbuf_replace(str, pos, old_count, temp, new_count);
+    }
+  else
+    {
+      if (pos > str->len)
+        pos = str->len;
+      if (pos + old_count > str->len)
+        old_count = str->len - pos;
+
+      if (old_count < new_count)
+        {
+          apr_size_t delta = new_count - old_count;
+          svn_stringbuf_ensure(str, str->len + delta);
+        }
+
+      if (old_count != new_count)
+        memmove(str->data + pos + new_count, str->data + pos + old_count,
+                str->len - pos - old_count + 1);
+
+      memcpy(str->data + pos, bytes, new_count);
+      str->len += new_count - old_count;
+    }
+}
+
 
 svn_stringbuf_t *
 svn_stringbuf_dup(const svn_stringbuf_t *original_string, apr_pool_t *pool)
@@ -989,7 +1063,7 @@ svn__ui64toa(char * dest, apr_uint64_t n
       target -= 8;
     }
 
-  /* Now, the number fits into 32 bits, but is larger than 1 */
+  /* Now, the number fits into 32 bits, but may still be larger than 99 */
   reduced = (apr_uint32_t)(number);
   while (reduced >= 100)
     {
@@ -1019,3 +1093,44 @@ svn__i64toa(char * dest, apr_int64_t num
   *dest = '-';
   return svn__ui64toa(dest + 1, (apr_uint64_t)(0-number)) + 1;
 }
+
+static void
+ui64toa_sep(apr_uint64_t number, char seperator, char *buffer)
+{
+  apr_size_t length = svn__ui64toa(buffer, number);
+  apr_size_t i;
+
+  for (i = length; i > 3; i -= 3)
+    {
+      memmove(&buffer[i - 2], &buffer[i - 3], length - i + 3);
+      buffer[i-3] = seperator;
+      length++;
+    }
+
+  buffer[length] = 0;
+}
+
+char *
+svn__ui64toa_sep(apr_uint64_t number, char seperator, apr_pool_t *pool)
+{
+  char buffer[2 * SVN_INT64_BUFFER_SIZE];
+  ui64toa_sep(number, seperator, buffer);
+
+  return apr_pstrdup(pool, buffer);
+}
+
+char *
+svn__i64toa_sep(apr_int64_t number, char seperator, apr_pool_t *pool)
+{
+  char buffer[2 * SVN_INT64_BUFFER_SIZE];
+  if (number < 0)
+    {
+      buffer[0] = '-';
+      ui64toa_sep((apr_uint64_t)(-number), seperator, &buffer[1]);
+    }
+  else
+    ui64toa_sep((apr_uint64_t)(number), seperator, buffer);
+
+  return apr_pstrdup(pool, buffer);
+}
+

Modified: subversion/branches/compressed-pristines/subversion/libsvn_subr/subst.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/libsvn_subr/subst.c?rev=1413258&r1=1413257&r2=1413258&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/libsvn_subr/subst.c (original)
+++ subversion/branches/compressed-pristines/subversion/libsvn_subr/subst.c Sat Nov 24 20:29:11 2012
@@ -1613,7 +1613,7 @@ create_special_file_from_stream(svn_stre
     }
 
   if (! strncmp(identifier, SVN_SUBST__SPECIAL_LINK_STR " ",
-                strlen(SVN_SUBST__SPECIAL_LINK_STR " ")))
+                sizeof(SVN_SUBST__SPECIAL_LINK_STR " ")-1))
     {
       /* For symlinks, the type specific data is just a filesystem
          path that the symlink should reference. */