subversion-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From hwri...@apache.org
Subject svn commit: r1333596 - in /subversion/branches/ev2-export: ./ subversion/include/ subversion/include/private/ subversion/libsvn_client/ subversion/libsvn_delta/ subversion/libsvn_fs/ subversion/libsvn_fs_fs/ subversion/libsvn_ra_serf/ subversion/libsvn...
Date Thu, 03 May 2012 19:48:39 GMT
Author: hwright
Date: Thu May  3 19:48:38 2012
New Revision: 1333596

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

Modified:
    subversion/branches/ev2-export/   (props changed)
    subversion/branches/ev2-export/COMMITTERS
    subversion/branches/ev2-export/subversion/include/private/svn_subr_private.h
    subversion/branches/ev2-export/subversion/include/svn_hash.h
    subversion/branches/ev2-export/subversion/libsvn_client/merge.c
    subversion/branches/ev2-export/subversion/libsvn_client/patch.c
    subversion/branches/ev2-export/subversion/libsvn_delta/compat.c
    subversion/branches/ev2-export/subversion/libsvn_fs/fs-loader.c
    subversion/branches/ev2-export/subversion/libsvn_fs_fs/caching.c
    subversion/branches/ev2-export/subversion/libsvn_fs_fs/fs_fs.c
    subversion/branches/ev2-export/subversion/libsvn_fs_fs/temp_serializer.c
    subversion/branches/ev2-export/subversion/libsvn_ra_serf/property.c
    subversion/branches/ev2-export/subversion/libsvn_ra_serf/ra_serf.h
    subversion/branches/ev2-export/subversion/libsvn_ra_serf/serf.c
    subversion/branches/ev2-export/subversion/libsvn_ra_serf/update.c
    subversion/branches/ev2-export/subversion/libsvn_ra_serf/util.c
    subversion/branches/ev2-export/subversion/libsvn_repos/repos.c
    subversion/branches/ev2-export/subversion/libsvn_subr/hash.c
    subversion/branches/ev2-export/subversion/libsvn_wc/adm_ops.c
    subversion/branches/ev2-export/subversion/svnrdump/dump_editor.c
    subversion/branches/ev2-export/subversion/svnrdump/load_editor.c
    subversion/branches/ev2-export/subversion/tests/cmdline/merge_symmetric_tests.py
    subversion/branches/ev2-export/subversion/tests/cmdline/svntest/main.py
    subversion/branches/ev2-export/subversion/tests/cmdline/svntest/sandbox.py
    subversion/branches/ev2-export/subversion/tests/libsvn_wc/op-depth-test.c
    subversion/branches/ev2-export/tools/dist/nightly.sh

Propchange: subversion/branches/ev2-export/
------------------------------------------------------------------------------
  Merged /subversion/trunk:r1332744-1333595

Modified: subversion/branches/ev2-export/COMMITTERS
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/COMMITTERS?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/COMMITTERS [UTF-8] (original)
+++ subversion/branches/ev2-export/COMMITTERS [UTF-8] Thu May  3 19:48:38 2012
@@ -93,7 +93,7 @@ Commit access for specific areas:
          clkao   Chia-liang Kao <clkao@clkao.org>            (Swig-Perl b.)
     joeswatosh   Joe Swatosh <joe.swatosh@gmail.com>         (Swig-Ruby b.)
     jrvernooij   Jelmer Vernooij <jelmer@samba.org>          (Python bindings)
-          sage   Sage LaTorra <sagelt@gmail.com>             (Ctypes-Python bindings)
+          sage   Sage LaTorra <sagelt@gmail.com>             (Ctypes-Python b.)
         rdonch   Роман Донченко <DXDragon@yandex.ru>         (Swig-Python b.)
 
   Packages:

Modified: subversion/branches/ev2-export/subversion/include/private/svn_subr_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/include/private/svn_subr_private.h?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/include/private/svn_subr_private.h (original)
+++ subversion/branches/ev2-export/subversion/include/private/svn_subr_private.h Thu May  3 19:48:38 2012
@@ -220,6 +220,90 @@ svn_checksum_t *
 svn_checksum__from_digest_sha1(const unsigned char *digest,
                                apr_pool_t *result_pool);
 
+
+/**
+ * @defgroup svn_hash_support Hash table serialization support
+ * @{
+ */
+
+/*----------------------------------------------------*/
+
+/**
+ * @defgroup svn_hash_misc Miscellaneous hash APIs
+ * @{
+ */
+
+/**
+ * Clear any key/value pairs in the hash table.  A wrapper for a
+ * apr_hash_clear(), which isn't available until APR 1.3.0.
+ *
+ * @since New in 1.5.
+ */
+svn_error_t *
+svn_hash__clear(apr_hash_t *hash, apr_pool_t *pool);
+
+/** @} */
+
+
+/**
+ * @defgroup svn_hash_getters Specialized getter APIs for hashes
+ * @{
+ */
+
+/** Find the value of a @a key in @a hash, return the value.
+ *
+ * If @a hash is @c NULL or if the @a key cannot be found, the
+ * @a default_value will be returned.
+ *
+ * @since New in 1.7.
+ */
+const char *
+svn_hash__get_cstring(apr_hash_t *hash,
+                      const char *key,
+                      const char *default_value);
+
+/** Like svn_hash_get_cstring(), but for boolean values.
+ *
+ * Parses the value as a boolean value. The recognized representations
+ * are 'TRUE'/'FALSE', 'yes'/'no', 'on'/'off', '1'/'0'; case does not
+ * matter.
+ *
+ * @since New in 1.7.
+ */
+svn_boolean_t
+svn_hash__get_bool(apr_hash_t *hash,
+                   const char *key,
+                   svn_boolean_t default_value);
+
+/** @} */
+
+/**
+ * @defgroup svn_hash_create Create optimized APR hash tables
+ * @{
+ */
+
+/** Returns a hash table, allocated in @a pool, with the same ordering of
+ * elements as APR 1.4.5 or earlier (using apr_hashfunc_default) but uses
+ * a faster hash function implementation.
+ *
+ * @since New in 1.8.
+ */
+apr_hash_t *
+svn_hash__make(apr_pool_t *pool);
+
+/** Returns a hash table, allocated in @a pool, that is faster to modify
+ * and access then the ones returned by @ref svn_hash__make. The element
+ * order does not match any APR default and is platform dependent.
+ *
+ * @since New in 1.8.
+ */
+apr_hash_t *
+svn_hash__make_fast(apr_pool_t *pool);
+
+/** @} */
+
+/** @} */
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/branches/ev2-export/subversion/include/svn_hash.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/include/svn_hash.h?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/include/svn_hash.h (original)
+++ subversion/branches/ev2-export/subversion/include/svn_hash.h Thu May  3 19:48:38 2012
@@ -240,48 +240,6 @@ svn_hash_from_cstring_keys(apr_hash_t **
                            const apr_array_header_t *keys,
                            apr_pool_t *pool);
 
-/**
- * Clear any key/value pairs in the hash table.  A wrapper for a
- * apr_hash_clear(), which isn't available until APR 1.3.0.
- *
- * @since New in 1.5.
- */
-svn_error_t *
-svn_hash__clear(apr_hash_t *hash, apr_pool_t *pool);
-
-/** @} */
-
-
-/**
- * @defgroup svn_hash_getters Specialized getter APIs for hashes
- * @{
- */
-
-/** Find the value of a @a key in @a hash, return the value.
- *
- * If @a hash is @c NULL or if the @a key cannot be found, the
- * @a default_value will be returned.
- *
- * @since New in 1.7.
- */
-const char *
-svn_hash__get_cstring(apr_hash_t *hash,
-                      const char *key,
-                      const char *default_value);
-
-/** Like svn_hash_get_cstring(), but for boolean values.
- *
- * Parses the value as a boolean value. The recognized representations
- * are 'TRUE'/'FALSE', 'yes'/'no', 'on'/'off', '1'/'0'; case does not
- * matter.
- *
- * @since New in 1.7.
- */
-svn_boolean_t
-svn_hash__get_bool(apr_hash_t *hash,
-                   const char *key,
-                   svn_boolean_t default_value);
-
 /** @} */
 
 /** @} */

Modified: subversion/branches/ev2-export/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/merge.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/merge.c Thu May  3 19:48:38 2012
@@ -59,6 +59,7 @@
 #include "private/svn_fspath.h"
 #include "private/svn_ra_private.h"
 #include "private/svn_client_private.h"
+#include "private/svn_subr_private.h"
 
 #include "svn_private_config.h"
 
@@ -67,7 +68,8 @@
 /* MERGEINFO MERGE SOURCE NORMALIZATION
  *
  * Nearly any helper function herein that accepts two URL/revision
- * pairs expects one of two things to be true:
+ * pairs (or equivalent struct merge_source_t) expects one of two things
+ * to be true:
  *
  *    1.  that mergeinfo is not being recorded at all for this
  *        operation, or
@@ -3758,10 +3760,13 @@ ensure_implicit_mergeinfo(svn_client__me
    REVISION1 and REVISION2 describe the merge range requested from
    MERGEINFO_PATH.
 
-   TARGET_MERGEINFO is the CHILD->ABSPATH's explicit or inherited mergeinfo.
-   TARGET_MERGEINFO should be NULL if there is no explicit or inherited
-   mergeinfo on CHILD->ABSPATH or an empty hash if CHILD->ABSPATH has empty
-   mergeinfo.
+   TARGET_MERGEINFO is the portion of CHILD->ABSPATH's explicit or inherited
+   mergeinfo that intersects with the merge history described by
+   MERGEINFO_PATH@REVISION1:MERGEINFO_PATH@REVISION2.  TARGET_MERGEINFO
+   should be NULL if there is no explicit or inherited mergeinfo on
+   CHILD->ABSPATH or an empty hash if CHILD->ABSPATH has empty mergeinfo or
+   explicit mergeinfo that exclusively describes non-intersecting history
+   with MERGEINFO_PATH@REVISION1:MERGEINFO_PATH@REVISION2.
 
    SCRATCH_POOL is used for all temporary allocations.
 
@@ -4040,6 +4045,8 @@ calculate_remaining_ranges(svn_client__m
   const char *mergeinfo_path;
   const char *primary_url = (source->loc1->rev < source->loc2->rev)
                             ? source->loc2->url : source->loc1->url;
+  /* Intersection of TARGET_MERGEINFO and the merge history
+     described by SOURCE. */
   svn_mergeinfo_t adjusted_target_mergeinfo = NULL;
   svn_revnum_t child_base_revision;
 
@@ -4047,14 +4054,19 @@ calculate_remaining_ranges(svn_client__m
   SVN_ERR(svn_ra__get_fspath_relative_to_root(ra_session, &mergeinfo_path,
                                               primary_url, result_pool));
 
-  /* Consider: CHILD might have explicit mergeinfo '/MERGEINFO_PATH:M-N'
-     where M-N fall into the gap in SOURCE's natural
-     history allowed by 'MERGEINFO MERGE SOURCE NORMALIZATION'.  If this is
-     the case, then '/MERGEINFO_PATH:N' actually refers to a completely
-     different line of history than SOURCE and we
-     *don't* want to consider those revisions merged already. */
+  /* Does SOURCE describe a single, unbroken line of history or is there a
+     copy as allowed by `MERGEINFO MERGE SOURCE NORMALIZATION'? */
   if (implicit_src_gap && child->pre_merge_mergeinfo)
     {
+      /* Handle issue #3242: The presence of IMPLICIT_SRC_GAP implies that
+         a single copy of SOURCE->LOC1->URL@SOURCE->LOC1->REV was made
+         between SOURCE->LOC1->REV + 1 and SOURCE->LOC2->REV and that
+         there exists a single range M:N, where
+         SOURCE->LOC1->REV < M < N < SOURCE->LOC2->REV, such that
+         SOURCE->LOC2->URL@M:SOURCE->LOC2->URL@N either doesn't exist
+         or describes a different line of history than SOURCE.  In either
+         case we don't want to consider this range as merged so remove it
+         from TARGET_MERGEINFO. */
       apr_array_header_t *explicit_mergeinfo_gap_ranges =
         apr_hash_get(child->pre_merge_mergeinfo, mergeinfo_path,
                      APR_HASH_KEY_STRING);
@@ -4072,6 +4084,10 @@ calculate_remaining_ranges(svn_client__m
     }
   else
     {
+      /* The simple case: SOURCE->LOC1->URL2@SOURCE->LOC1->REV:
+         SOURCE->LOC2->URL2@SOURCE->LOC2->REV describes two locations
+         along a single, unbroken line of history, there is nothing to
+         filter out. */
       adjusted_target_mergeinfo = target_mergeinfo;
     }
 

Modified: subversion/branches/ev2-export/subversion/libsvn_client/patch.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/patch.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/patch.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/patch.c Thu May  3 19:48:38 2012
@@ -47,6 +47,7 @@
 #include "private/svn_wc_private.h"
 #include "private/svn_dep_compat.h"
 #include "private/svn_string_private.h"
+#include "private/svn_subr_private.h"
 
 typedef struct hunk_info_t {
   /* The hunk. */

Modified: subversion/branches/ev2-export/subversion/libsvn_delta/compat.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_delta/compat.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_delta/compat.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_delta/compat.c Thu May  3 19:48:38 2012
@@ -21,6 +21,8 @@
  * ====================================================================
  */
 
+#include <stddef.h>
+
 #include "svn_types.h"
 #include "svn_error.h"
 #include "svn_delta.h"
@@ -799,6 +801,8 @@ ev2_apply_textdelta(void *file_baton,
   struct handler_baton *hb = apr_pcalloc(handler_pool, sizeof(*hb));
   struct change_node *change;
   svn_stream_t *target;
+  /* ### fix this. for now, we know this has a "short" lifetime.  */
+  apr_pool_t *scratch_pool = handler_pool;
 
   change = locate_change(fb->eb, fb->path);
   SVN_ERR_ASSERT(change->contents_abspath == NULL);
@@ -810,11 +814,11 @@ ev2_apply_textdelta(void *file_baton,
     hb->source = svn_stream_empty(handler_pool);
   else
     SVN_ERR(svn_stream_open_readonly(&hb->source, fb->delta_base, handler_pool,
-                                     result_pool));
+                                     scratch_pool));
 
   SVN_ERR(svn_stream_open_unique(&target, &change->contents_abspath, NULL,
                                  svn_io_file_del_on_pool_cleanup,
-                                 fb->eb->edit_pool, result_pool));
+                                 fb->eb->edit_pool, scratch_pool));
 
   svn_txdelta_apply(hb->source, target,
                     NULL, NULL,
@@ -1340,15 +1344,40 @@ rotate_cb(void *baton,
 
 
 static int
+count_components(const char *relpath)
+{
+  int count = 1;
+  const char *slash = strchr(relpath, '/');
+
+  while (slash != NULL)
+    {
+      ++count;
+      slash = strchr(slash + 1, '/');
+    }
+  return count;
+}
+
+
+static int
 sort_deletes_first(const svn_sort__item_t *item1,
                    const svn_sort__item_t *item2)
 {
   const char *relpath1 = item1->key;
   const char *relpath2 = item2->key;
+  const struct change_node *change1 = item1->value;
+  const struct change_node *change2 = item2->value;
   const char *slash1;
   const char *slash2;
-  int len1;
-  int len2;
+  ptrdiff_t len1;
+  ptrdiff_t len2;
+
+  /* Force the root to always sort first. Otherwise, it may look like a
+     sibling of its children (no slashes), and could get sorted *after*
+     any children that get deleted.  */
+  if (*relpath1 == '\0')
+    return -1;
+  if (*relpath2 == '\0')
+    return 1;
 
   /* Are these two items siblings? The 'if' statement tests if they are
      siblings in the root directory, or that slashes were found in both
@@ -1362,9 +1391,6 @@ sort_deletes_first(const svn_sort__item_
           && (len1 = slash1 - relpath1) == (len2 = slash2 - relpath2)
           && memcmp(relpath1, relpath2, len1) == 0))
     {
-      const struct change_node *change1 = item1->value;
-      const struct change_node *change2 = item2->value;
-
       if (change1->action == RESTRUCTURE_DELETE)
         {
           if (change2->action == RESTRUCTURE_DELETE)
@@ -1394,6 +1420,28 @@ sort_deletes_first(const svn_sort__item_
       /* FALLTHROUGH */
     }
 
+  /* Paths-to-be-deleted with fewer components always sort earlier.
+
+     For example, gamma will sort before E/alpha.
+
+     Without this test, E/alpha lexicographically sorts before gamma,
+     but gamma sorts before E when gamma is to be deleted. This kind of
+     ordering would place E/alpha before E. Not good.
+
+     With this test, gamma sorts before E/alpha. E and E/alpha are then
+     sorted by svn_path_compare_paths() (which places E before E/alpha).  */
+  if (change1->action == RESTRUCTURE_DELETE
+      || change2->action == RESTRUCTURE_DELETE)
+    {
+      int count1 = count_components(relpath1);
+      int count2 = count_components(relpath2);
+
+      if (count1 < count2 && change1->action == RESTRUCTURE_DELETE)
+        return -1;
+      if (count1 > count2 && change2->action == RESTRUCTURE_DELETE)
+        return 1;
+    }
+
   /* Use svn_path_compare_paths() to get correct depth-based ordering.  */
   return svn_path_compare_paths(relpath1, relpath2);
 }
@@ -1676,11 +1724,6 @@ drive_changes(const struct editor_baton 
   /* Get a sorted list of Ev1-relative paths.  */
   paths = get_sorted_paths(eb->changes, eb->base_relpath, scratch_pool);
 
-#if 1
-  /* ### something is still broken. sort the paths normally for now.  */
-  qsort(paths->elts, paths->nelts, paths->elt_size, svn_sort_compare_paths);
-#endif
-
   /* We need to pass SVN_INVALID_REVNUM to the path_driver. It uses this
      revision whenever it opens directory batons. If we specified a "real"
      value, such as eb->root.base_revision, then it might use that for a

Modified: subversion/branches/ev2-export/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_fs/fs-loader.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_fs/fs-loader.c Thu May  3 19:48:38 2012
@@ -44,6 +44,7 @@
 #include "private/svn_fs_util.h"
 #include "private/svn_utf_private.h"
 #include "private/svn_mutex.h"
+#include "private/svn_subr_private.h"
 
 #include "fs-loader.h"
 #include "svn_hash.h"

Modified: subversion/branches/ev2-export/subversion/libsvn_fs_fs/caching.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_fs_fs/caching.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_fs_fs/caching.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_fs_fs/caching.c Thu May  3 19:48:38 2012
@@ -33,6 +33,7 @@
 #include "svn_private_config.h"
 #include "svn_hash.h"
 #include "private/svn_debug.h"
+#include "private/svn_subr_private.h"
 
 /* Return a memcache in *MEMCACHE_P for FS if it's configured to use
    memcached, or NULL otherwise.  Also, sets *FAIL_STOP to a boolean

Modified: subversion/branches/ev2-export/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_fs_fs/fs_fs.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_fs_fs/fs_fs.c Thu May  3 19:48:38 2012
@@ -61,6 +61,7 @@
 
 #include "private/svn_string_private.h"
 #include "private/svn_fs_util.h"
+#include "private/svn_subr_private.h"
 #include "../libsvn_fs/fs-loader.h"
 
 #include "svn_private_config.h"

Modified: subversion/branches/ev2-export/subversion/libsvn_fs_fs/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_fs_fs/temp_serializer.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_fs_fs/temp_serializer.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_fs_fs/temp_serializer.c Thu May  3 19:48:38 2012
@@ -30,6 +30,7 @@
 
 #include "private/svn_fs_util.h"
 #include "private/svn_temp_serializer.h"
+#include "private/svn_subr_private.h"
 
 #include "temp_serializer.h"
 
@@ -359,7 +360,7 @@ serialize_dir(apr_hash_t *entries, apr_p
 static apr_hash_t *
 deserialize_dir(void *buffer, hash_data_t *hash_data, apr_pool_t *pool)
 {
-  apr_hash_t *result = apr_hash_make(pool);
+  apr_hash_t *result = svn_hash__make(pool);
   apr_size_t i;
   apr_size_t count;
   svn_fs_dirent_t *entry;
@@ -678,7 +679,7 @@ svn_fs_fs__deserialize_properties(void *
                                   apr_size_t data_len,
                                   apr_pool_t *pool)
 {
-  apr_hash_t *hash = apr_hash_make(pool);
+  apr_hash_t *hash = svn_hash__make(pool);
   properties_data_t *properties = (properties_data_t *)data;
   size_t i;
 

Modified: subversion/branches/ev2-export/subversion/libsvn_ra_serf/property.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_ra_serf/property.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_ra_serf/property.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_ra_serf/property.c Thu May  3 19:48:38 2012
@@ -595,11 +595,6 @@ svn_ra_serf__propfind_is_done(svn_ra_ser
   return ctx->done;
 }
 
-int
-svn_ra_serf__propfind_status_code(svn_ra_serf__propfind_context_t *ctx)
-{
-  return ctx->status_code;
-}
 
 /*
  * This helper function will block until the PROP_CTX indicates that is done
@@ -1089,7 +1084,7 @@ svn_ra_serf__get_baseline_info(const cha
 
 
 svn_error_t *
-svn_ra_serf__get_resource_type(svn_node_kind_t *kind,
+svn_ra_serf__get_resource_type(svn_kind_t *kind,
                                apr_hash_t *props,
                                const char *url,
                                svn_revnum_t revision)
@@ -1108,11 +1103,11 @@ svn_ra_serf__get_resource_type(svn_node_
 
   if (strcmp(res_type, "collection") == 0)
     {
-      *kind = svn_node_dir;
+      *kind = svn_kind_dir;
     }
   else
     {
-      *kind = svn_node_file;
+      *kind = svn_kind_file;
     }
 
   return SVN_NO_ERROR;

Modified: subversion/branches/ev2-export/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_ra_serf/ra_serf.h?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/branches/ev2-export/subversion/libsvn_ra_serf/ra_serf.h Thu May  3 19:48:38 2012
@@ -858,11 +858,6 @@ typedef struct svn_ra_serf__propfind_con
 svn_boolean_t
 svn_ra_serf__propfind_is_done(svn_ra_serf__propfind_context_t *ctx);
 
-/*
- * Returns the response status code of the PROPFIND @a ctx.
- */
-int
-svn_ra_serf__propfind_status_code(svn_ra_serf__propfind_context_t *ctx);
 
 /*
  * This function will deliver a PROP_CTX PROPFIND request in the SESS
@@ -1035,7 +1030,7 @@ svn_ra_serf__set_prop(apr_hash_t *props,
                       const svn_string_t *val, apr_pool_t *pool);
 
 svn_error_t *
-svn_ra_serf__get_resource_type(svn_node_kind_t *kind,
+svn_ra_serf__get_resource_type(svn_kind_t *kind,
                                apr_hash_t *props,
                                const char *url,
                                svn_revnum_t revision);

Modified: subversion/branches/ev2-export/subversion/libsvn_ra_serf/serf.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_ra_serf/serf.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_ra_serf/serf.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_ra_serf/serf.c Thu May  3 19:48:38 2012
@@ -48,6 +48,7 @@
 #include "private/svn_dav_protocol.h"
 #include "private/svn_dep_compat.h"
 #include "private/svn_fspath.h"
+#include "private/svn_subr_private.h"
 #include "svn_private_config.h"
 
 #include "ra_serf.h"
@@ -648,11 +649,15 @@ svn_ra_serf__check_path(svn_ra_session_t
     }
   else
     {
+      svn_kind_t res_kind;
+
       /* Any other error, raise to caller. */
       if (err)
         return err;
 
-      SVN_ERR(svn_ra_serf__get_resource_type(kind, props, path, fetched_rev));
+      SVN_ERR(svn_ra_serf__get_resource_type(&res_kind, props, path,
+                                             fetched_rev));
+      *kind = svn__node_kind_from_kind(res_kind);
     }
 
   return SVN_NO_ERROR;
@@ -936,11 +941,11 @@ resource_is_directory(apr_hash_t *props,
                       const char *path,
                       svn_revnum_t revision)
 {
-  svn_node_kind_t kind;
+  svn_kind_t kind;
 
   SVN_ERR(svn_ra_serf__get_resource_type(&kind, props, path, revision));
 
-  if (kind != svn_node_dir)
+  if (kind != svn_kind_dir)
     {
       return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
                               _("Can't get entries of non-directory"));

Modified: subversion/branches/ev2-export/subversion/libsvn_ra_serf/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_ra_serf/update.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_ra_serf/update.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_ra_serf/update.c Thu May  3 19:48:38 2012
@@ -2788,7 +2788,7 @@ svn_ra_serf__get_file(svn_ra_session_t *
   svn_ra_serf__connection_t *conn;
   const char *fetch_url;
   apr_hash_t *fetch_props;
-  svn_node_kind_t res_kind;
+  svn_kind_t res_kind;
 
   /* What connection should we go on? */
   conn = session->conns[session->cur_conn];
@@ -2821,7 +2821,7 @@ svn_ra_serf__get_file(svn_ra_session_t *
   /* Verify that resource type is not colelction. */
   SVN_ERR(svn_ra_serf__get_resource_type(&res_kind, fetch_props, fetch_url,
                                          revision));
-  if (res_kind != svn_node_file)
+  if (res_kind != svn_kind_file)
     {
       return svn_error_create(SVN_ERR_FS_NOT_FILE, NULL,
                               _("Can't get text contents of a directory"));

Modified: subversion/branches/ev2-export/subversion/libsvn_ra_serf/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_ra_serf/util.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_ra_serf/util.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_ra_serf/util.c Thu May  3 19:48:38 2012
@@ -1326,7 +1326,7 @@ inject_to_parser(svn_ra_serf__xml_parser
 {
   int xml_status;
 
-  xml_status = XML_Parse(ctx->xmlp, data, len, 0);
+  xml_status = XML_Parse(ctx->xmlp, data, (int) len, 0);
   if (xml_status == XML_STATUS_ERROR && !ctx->ignore_errors)
     {
       if (sl == NULL)

Modified: subversion/branches/ev2-export/subversion/libsvn_repos/repos.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_repos/repos.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_repos/repos.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_repos/repos.c Thu May  3 19:48:38 2012
@@ -36,6 +36,7 @@
 #include "svn_version.h"
 
 #include "private/svn_repos_private.h"
+#include "private/svn_subr_private.h"
 #include "svn_private_config.h" /* for SVN_TEMPLATE_ROOT_DIR */
 
 #include "repos.h"

Modified: subversion/branches/ev2-export/subversion/libsvn_subr/hash.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_subr/hash.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_subr/hash.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_subr/hash.c Thu May  3 19:48:38 2012
@@ -40,6 +40,7 @@
 #include "svn_pools.h"
 
 #include "private/svn_dep_compat.h"
+#include "private/svn_subr_private.h"
 
 #include "svn_private_config.h"
 
@@ -495,7 +496,7 @@ svn_hash_from_cstring_keys(apr_hash_t **
                            apr_pool_t *pool)
 {
   int i;
-  apr_hash_t *hash = apr_hash_make(pool);
+  apr_hash_t *hash = svn_hash__make(pool);
   for (i = 0; i < keys->nelts; i++)
     {
       const char *key =
@@ -560,3 +561,130 @@ svn_hash__get_bool(apr_hash_t *hash, con
   return default_value;
 }
 
+
+
+/*** Optimized hash functions ***/
+
+/* Optimized version of apr_hashfunc_default. It assumes that the CPU has
+ * 32-bit multiplications with high throughput of at least 1 operation
+ * every 3 cycles. Latency is not an issue. Another optimization is a
+ * mildly unrolled main loop.
+ */
+static unsigned int
+hashfunc_compatible(const char *char_key, apr_ssize_t *klen)
+{
+    unsigned int hash = 0;
+    const unsigned char *key = (const unsigned char *)char_key;
+    const unsigned char *p;
+    apr_ssize_t i;
+
+    if (*klen == APR_HASH_KEY_STRING)
+      {
+        for (p = key; ; p+=4)
+          {
+            unsigned int new_hash = hash * 33 * 33 * 33 * 33;
+            if (!p[0]) break;
+            new_hash += p[0] * 33 * 33 * 33;
+            if (!p[1]) break;
+            new_hash += p[1] * 33 * 33;
+            if (!p[2]) break;
+            new_hash += p[2] * 33;
+            if (!p[3]) break;
+            hash = new_hash + p[3];
+          }
+        for (; *p; p++)
+            hash = hash * 33 + *p;
+
+        *klen = p - key;
+      }
+    else
+      {
+        for (p = key, i = *klen; i >= 4; i-=4, p+=4)
+          {
+            hash = hash * 33 * 33 * 33 * 33
+                 + p[0] * 33 * 33 * 33
+                 + p[1] * 33 * 33
+                 + p[2] * 33
+                 + p[3];
+          }
+        for (; i; i--, p++)
+            hash = hash * 33 + *p;
+      }
+
+    return hash;
+}
+
+/* Used to detect NUL chars 
+ */
+#define LOWER_7BITS_SET 0x7f7f7f7f
+#define BIT_7_SET       0x80808080
+
+/* Read 4 bytes at P. LE / BE interpretation is platform-dependent
+ */
+#if SVN_UNALIGNED_ACCESS_IS_OK
+#  define READ_CHUNK(p) *(const apr_uint32_t *)(p)
+#else
+#  define READ_CHUNK(p) \
+     (   (apr_uint32_t)p[0]        \
+      + ((apr_uint32_t)p[1] << 8)  \
+      + ((apr_uint32_t)p[2] << 16) \
+      + ((apr_uint32_t)p[3] << 24))
+#endif
+
+/* Similar to the previous but operates on 4 bytes at once instead of the
+ * classic unroll. This is particularly fast when unaligned access is
+ * supported.
+ */
+static unsigned int
+hashfunc_fast(const char *char_key, apr_ssize_t *klen)
+{
+    unsigned int hash = 0;
+    const unsigned char *key = (const unsigned char *)char_key;
+    const unsigned char *p;
+    apr_ssize_t i;
+    apr_uint32_t chunk, test;
+
+    if (*klen == APR_HASH_KEY_STRING)
+      {
+        for (p = key; ; p += sizeof(chunk))
+          {
+            /* This is a variant of the well-known strlen test: */
+            chunk = READ_CHUNK(p);
+            test = chunk | ((chunk & LOWER_7BITS_SET) + LOWER_7BITS_SET);
+            if ((test & BIT_7_SET) != BIT_7_SET)
+              break;
+
+            hash = (hash + chunk) * 0xd1f3da69;
+          }
+        for (; i; i--, p++)
+            hash = hash * 33 + *p;
+
+        *klen = p - key;
+      }
+    else
+      {
+        for ( p = key, i = *klen
+            ; i >= sizeof(chunk)
+            ; i -= sizeof(chunk), p += sizeof(chunk))
+          {
+            chunk = READ_CHUNK(p);
+            hash = (hash + chunk) * 0xd1f3da69;
+          }
+        for (; i; i--, p++)
+            hash = hash * 33 + *p;
+      }
+
+    return hash;
+}
+
+apr_hash_t *
+svn_hash__make(apr_pool_t *pool)
+{
+  return apr_hash_make_custom(pool, hashfunc_compatible);
+}
+
+apr_hash_t *
+svn_hash__make_fast(apr_pool_t *pool)
+{
+  return apr_hash_make_custom(pool, hashfunc_fast);
+}

Modified: subversion/branches/ev2-export/subversion/libsvn_wc/adm_ops.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_wc/adm_ops.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_wc/adm_ops.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_wc/adm_ops.c Thu May  3 19:48:38 2012
@@ -59,7 +59,7 @@
 #include "svn_private_config.h"
 #include "private/svn_io_private.h"
 #include "private/svn_wc_private.h"
-
+#include "private/svn_subr_private.h"
 
 
 struct svn_wc_committed_queue_t

Modified: subversion/branches/ev2-export/subversion/svnrdump/dump_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnrdump/dump_editor.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svnrdump/dump_editor.c (original)
+++ subversion/branches/ev2-export/subversion/svnrdump/dump_editor.c Thu May  3 19:48:38 2012
@@ -31,6 +31,7 @@
 #include "svn_dirent_uri.h"
 
 #include "private/svn_fspath.h"
+#include "private/svn_subr_private.h"
 
 #include "svnrdump.h"
 

Modified: subversion/branches/ev2-export/subversion/svnrdump/load_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnrdump/load_editor.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svnrdump/load_editor.c (original)
+++ subversion/branches/ev2-export/subversion/svnrdump/load_editor.c Thu May  3 19:48:38 2012
@@ -567,7 +567,7 @@ new_revision_record(void **revision_bato
      several separate operations. It is highly susceptible to race conditions.
      Calculate the revision 'offset' for finding copyfrom sources.
      It might be positive or negative. */
-  rb->rev_offset = (apr_int32_t) (rb->rev) - (head_rev + 1);
+  rb->rev_offset = (apr_int32_t) ((rb->rev) - (head_rev + 1));
 
   /* Stash the oldest (non-zero) dumpstream revision seen. */
   if ((rb->rev > 0) && (!SVN_IS_VALID_REVNUM(pb->oldest_dumpstream_rev)))

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/merge_symmetric_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/merge_symmetric_tests.py?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/merge_symmetric_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/merge_symmetric_tests.py Thu May  3 19:48:38 2012
@@ -157,6 +157,19 @@ def assert_equal(a, b):
   if a != b:
     raise Exception("assert_equal failed: a = (%s), b = (%s)" % (a, b))
 
+def logical_changes_in_branch(sbox, branch):
+  """Return the set of logical changes that are actually in branch BRANCH
+     (at its current working version), by examining the state of the
+     branch files and directories rather than its mergeinfo.
+
+     Each logical change is described by its branch and revision number
+     as a string such as 'A1'."""
+  changes = set()
+  for propname in sbox.simple_proplist(branch + '/D').keys():
+    if propname.startswith('prop-'):
+      changes.add(propname[5:])
+  return changes
+
 def get_mergeinfo_change(sbox, target):
   """Return a list of revision numbers representing the mergeinfo change
   on TARGET (working version against base).  Non-recursive."""
@@ -165,7 +178,7 @@ def get_mergeinfo_change(sbox, target):
                                               sbox.ospath(target))
   merged_revs = []
   for line in out:
-    match = re.match(r'   Merged /(\w+):r([0-9-]+)', line)
+    match = re.match(r'   Merged /(\w+):r(.*)', line)
     if match:
       for r_range in match.group(2).split(','):
         if '-' in r_range:
@@ -209,11 +222,14 @@ def make_branches(sbox):
 def modify_branch(sbox, branch, number, conflicting=False):
   """Commit a modification to branch BRANCH. The actual modification depends
      on NUMBER.  If CONFLICTING=True, the change will be of a kind that
-     conflicts with any other change that has CONFLICTING=True."""
+     conflicts with any other change that has CONFLICTING=True.  We don't
+     modify (properties on) the branch root node itself, to make it easier
+     for the tests to distinguish mergeinfo changes from these mods."""
   uniq = branch + str(number)  # something like 'A1' or 'B2'
   if conflicting:
     sbox.simple_propset('conflict', uniq, branch + '/C')
   elif number % 2 == 0:
+    sbox.simple_propset('prop-' + uniq, uniq, branch + '/D')
     sbox.simple_copy(branch + '/mu', branch + '/mu-' + uniq)
   else:  # number % 2 == 1
     sbox.simple_propset('prop-' + uniq, uniq, branch + '/D')
@@ -247,6 +263,7 @@ def expected_symmetric_merge_output(targ
   # differences between repository URLs' notifications when it need not
   # or should not; so expect that.
   lines += ["--- Merging differences between repository URLs into '%s':\n" % (target,),
+            "--- Recording mergeinfo for merge of r.* through r.* into '%s':\n" % (target,),
             "--- Recording mergeinfo for merge between repository URLs into '%s':\n" % (target,)]
 
   return expected_merge_output(rev_ranges, lines, target=target)
@@ -268,6 +285,8 @@ def symmetric_merge(sbox, source, target
   # First, update the WC target because mixed-rev is not fully supported.
   sbox.simple_update(target)
 
+  before_changes = logical_changes_in_branch(sbox, target)
+
   exp_out = expected_symmetric_merge_output(target, expect_3ways)
   exit, out, err = svntest.actions.run_and_verify_svn(None, exp_out, [],
                                      'merge', '--symmetric',
@@ -275,9 +294,11 @@ def symmetric_merge(sbox, source, target
                                      *args)
 
   if expect_changes is not None:
-    ### actual_changes = get_changes(sbox, target)
-    ### assert_equal(actual_changes, expect_changes)
-    pass
+    after_changes = logical_changes_in_branch(sbox, target)
+    merged_changes = after_changes - before_changes
+    assert_equal(merged_changes, set(expect_changes))
+    reversed_changes = before_changes - after_changes
+    assert_equal(reversed_changes, set())
 
   if expect_mi is not None:
     actual_mi_change = get_mergeinfo_change(sbox, target)
@@ -644,16 +665,37 @@ def merge_to_and_fro_4_2(sbox):
 
 #----------------------------------------------------------------------
 
-# Cherry2, fwd
+# Cherry-pick scenarios
+
+@SkipUnless(server_has_mergeinfo)
+def cherry1_fwd(sbox):
+  """cherry1_fwd"""
+
+  #   A (--o------o--[o]----o---
+  #     (     \         \     \
+  #   B (---o--x---------c-----x
+  #     2  34  5  67  8  9  0  1
+
+  init_mod_merge_mod(sbox, mod_6=True, mod_7=False)
+  modify_branch(sbox, 'A', 8)
+  cherry_pick(sbox, 8, 'A', 'B')
+  modify_branch(sbox, 'A', 10)
+
+  symmetric_merge(sbox, 'A', 'B',
+                  expect_changes=['A6', 'A10'],  # and NOT A8
+                  expect_mi=[5, 6, 7, 9, 10],
+                  expect_3ways=[three_way_merge('A4', 'A7'),
+                                three_way_merge('A8', 'A10')])
 
 @SkipUnless(server_has_mergeinfo)
+@XFail()
 def cherry2_fwd(sbox):
   """cherry2_fwd"""
 
-  #   A (--o------------c--o---
-  #     (    \         /     \
-  #   B (--o--x---o-[o]-------x
-  #     2 34  5  67  8  9  0  1
+  #   A (--o-------------c--o---
+  #     (     \         /     \
+  #   B (---o--x---o-[o]-------x
+  #     2  34  5  67  8  9  0  1
 
   init_mod_merge_mod(sbox, mod_6=False, mod_7=True)
   modify_branch(sbox, 'B', 8)
@@ -665,6 +707,36 @@ def cherry2_fwd(sbox):
                   expect_mi=[5, 6, 7, 8, 9, 10],
                   expect_3ways=[three_way_merge('A9', 'A10')])
 
+@SkipUnless(server_has_mergeinfo)
+@XFail()
+def cherry3_fwd(sbox):
+  """cherry3_fwd"""
+
+  #   A (--o--------------c--o----
+  #     (          \     /     \
+  #     (           \   /       \
+  #   B (---o--o-[o]-x-/---------x
+  #               \__/
+  #     2  34  5  6  7    8  9   0
+
+  make_branches(sbox)
+  modify_branch(sbox, 'A', 3)
+  modify_branch(sbox, 'B', 4)
+  modify_branch(sbox, 'B', 5)
+  modify_branch(sbox, 'B', 6)
+
+  symmetric_merge(sbox, 'A', 'B',
+                  expect_changes=['A3'],
+                  expect_mi=[2, 3, 4, 5, 6],
+                  expect_3ways=[three_way_merge('A1', 'A6')])
+
+  cherry_pick(sbox, 6, 'B', 'A')
+  modify_branch(sbox, 'A', 9)
+
+  symmetric_merge(sbox, 'A', 'B',
+                  expect_changes=['A9'],  # and NOT A8
+                  expect_mi=[7, 8, 9],
+                  expect_3ways=[three_way_merge('A8', 'A9')])
 
 ########################################################################
 # Run the tests
@@ -686,7 +758,9 @@ test_list = [ None,
               merge_to_and_fro_3_2,
               merge_to_and_fro_4_1,
               merge_to_and_fro_4_2,
+              cherry1_fwd,
               cherry2_fwd,
+              cherry3_fwd,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/svntest/main.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/svntest/main.py?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/svntest/main.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/svntest/main.py Thu May  3 19:48:38 2012
@@ -78,18 +78,10 @@ SVN_VER_MINOR = 8
 
 default_num_threads = 5
 
-# This enables both a time stamp prefix on all log lines and a
-# '<TIME = 0.042552>' line after running every external command.
-log_with_timestamps = True
-
 # Set up logging
 logger = logging.getLogger()
 handler = logging.StreamHandler(sys.stdout)
-if log_with_timestamps:
-  formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s',
-                                '%Y-%m-%d %H:%M:%S')
-else:
-  formatter = logging.Formatter('[%(levelname)s] %(message)s')
+formatter = logging.Formatter('%(message)s')
 handler.setFormatter(formatter)
 logger.addHandler(handler)
 
@@ -529,9 +521,8 @@ def run_command_stdin(command, error_exp
        and not any(map(lambda arg: 'prop_tests-12' in arg, varargs)):
       raise Failure("Repository diskpath in %s: %r" % (name, lines))
 
-  if log_with_timestamps:
-    stop = time.time()
-    logger.info('<TIME = %.6f>' % (stop - start))
+  stop = time.time()
+  logger.info('<TIME = %.6f>' % (stop - start))
   for x in stdout_lines:
     logger.info(x.rstrip())
   for x in stderr_lines:
@@ -903,9 +894,8 @@ def copy_repos(src_path, dst_path, head_
   load_out.close()
   load_err.close()
 
-  if log_with_timestamps:
-    stop = time.time()
-    logger.info('<TIME = %.6f>' % (stop - start))
+  stop = time.time()
+  logger.info('<TIME = %.6f>' % (stop - start))
 
   if saved_quiet is None:
     del os.environ['SVN_DBG_QUIET']
@@ -1556,7 +1546,11 @@ def _create_parser():
                     help="Configuration file for tests.")
   parser.add_option('--set-log-level', action='callback', type='str',
                     callback=set_log_level,
-		    help="Set log level (numerically or symbolically)")
+                    help="Set log level (numerically or symbolically). " +
+                         "Symbolic levels are: CRITICAL, ERROR, WARNING, " +
+                         "INFO, DEBUG")
+  parser.add_option('--log-with-timestamps', action='store_true',
+                    help="Show timestamps in test log.")
   parser.add_option('--keep-local-tmp', action='store_true',
                     help="Don't remove svn-test-work/local_tmp after test " +
                          "run is complete.  Useful for debugging failures.")
@@ -1690,6 +1684,11 @@ def execute_tests(test_list, serial_only
   else:
     parser = _create_parser()
 
+  if options.log_with_timestamps:
+    formatter = logging.Formatter('[%(asctime)s] %(message)s',
+                                  '%Y-%m-%d %H:%M:%S')
+    handler.setFormatter(formatter)
+
   # parse the positional arguments (test nums, names)
   for arg in test_selection:
     appended = False

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/svntest/sandbox.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/svntest/sandbox.py?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/svntest/sandbox.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/svntest/sandbox.py Thu May  3 19:48:38 2012
@@ -276,6 +276,37 @@ class Sandbox:
     targets = self.ospaths(targets)
     svntest.main.run_svn(False, 'propdel', name, *targets)
 
+  def simple_propget(self, name, target):
+    """Return the value of the property NAME on TARGET.
+       TARGET is a relpath relative to the WC."""
+    target = self.ospath(target)
+    exit, out, err = svntest.main.run_svn(False, 'propget',
+                                          '--strict', name, target)
+    return ''.join(out)
+
+  def simple_proplist(self, target):
+    """Return a dictionary mapping property name to property value, of the
+       properties on TARGET.
+       TARGET is a relpath relative to the WC."""
+    target = self.ospath(target)
+    exit, out, err = svntest.main.run_svn(False, 'proplist',
+                                          '--verbose', '--quiet', target)
+    props = {}
+    for line in out:
+      line = line.rstrip('\r\n')
+      if line[2] != ' ':  # property name
+        name = line[2:]
+        val = None
+      elif line.startswith('    '):  # property value
+        if val is None:
+          val = line[4:]
+        else:
+          val += '\n' + line[4:]
+        props[name] = val
+      else:
+        raise Exception("Unexpected line '" + line + "' in proplist output" + str(out))
+    return props
+
   def simple_copy(self, source, dest):
     """Copy SOURCE to DEST in the WC.
        SOURCE and DEST are relpaths relative to the WC."""

Modified: subversion/branches/ev2-export/subversion/tests/libsvn_wc/op-depth-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/libsvn_wc/op-depth-test.c?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/libsvn_wc/op-depth-test.c (original)
+++ subversion/branches/ev2-export/subversion/tests/libsvn_wc/op-depth-test.c Thu May  3 19:48:38 2012
@@ -4865,6 +4865,106 @@ test_follow_moved_to(const svn_test_opts
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+mixed_rev_move(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+  svn_test__sandbox_t b;
+  apr_array_header_t *moved_tos;
+
+  SVN_ERR(svn_test__sandbox_create(&b, "mixed_rev_move", opts, pool));
+
+  SVN_ERR(wc_mkdir(&b, "A"));
+  SVN_ERR(wc_commit(&b, ""));
+  SVN_ERR(wc_mkdir(&b, "A/B"));
+  SVN_ERR(wc_commit(&b, ""));
+  SVN_ERR(wc_mkdir(&b, "A/B/C"));
+  SVN_ERR(wc_commit(&b, ""));
+
+  {
+    nodes_row_t nodes[] = {
+      {0, "",      "normal", 0, ""},
+      {0, "A",     "normal", 1, "A"},
+      {0, "A/B",   "normal", 2, "A/B"},
+      {0, "A/B/C", "normal", 3, "A/B/C"},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  SVN_ERR(wc_move(&b, "A", "X"));
+
+  {
+    nodes_row_t nodes[] = {
+      {0, "",      "normal",       0, ""},
+      {0, "A",     "normal",       1, "A"},
+      {0, "A/B",   "normal",       2, "A/B"},
+      {0, "A/B/C", "normal",       3, "A/B/C"},
+      {1, "A",     "base-deleted", NO_COPY_FROM, "X"},
+      {1, "A/B",   "base-deleted", NO_COPY_FROM},
+      {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+      {1, "X",     "normal",       1, "A", MOVED_HERE},
+      {1, "X/B",   "not-present",  2, "A/B"},
+      {2, "X/B",   "normal",       2, "A/B", MOVED_HERE},
+      {2, "X/B/C", "not-present",  3, "A/B/C"},
+      {3, "X/B/C", "normal",       3, "A/B/C", MOVED_HERE},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  /* ### These values PASS but I'm not sure they are correct. */
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A/B/C"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "X/B/C"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 1);
+
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A/B"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "X/B"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 1);
+
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "X"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 1);
+
+
+  /* This move doesn't record moved-to */
+  SVN_ERR(wc_move(&b, "X/B", "X/Y"));
+
+  {
+    nodes_row_t nodes[] = {
+      {0, "",      "normal",       0, ""},
+      {0, "A",     "normal",       1, "A"},
+      {0, "A/B",   "normal",       2, "A/B"},
+      {0, "A/B/C", "normal",       3, "A/B/C"},
+      {1, "A",     "base-deleted", NO_COPY_FROM, "X"},
+      {1, "A/B",   "base-deleted", NO_COPY_FROM},
+      {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+      {1, "X",     "normal",       1, "A", MOVED_HERE},
+      {1, "X/B",   "not-present",  2, "A/B"},
+      {2, "X/Y",   "normal",       2, "A/B"},
+      {2, "X/Y/C", "not-present",  NO_COPY_FROM},
+      {3, "X/Y/C", "normal",       3, "A/B/C"},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  /* ### These values are unchanged, is that right? */
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A/B/C"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "X/B/C"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 1);
+
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A/B"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "X/B"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 1);
+
+  return SVN_NO_ERROR;
+}
+
 
 /* ---------------------------------------------------------------------- */
 /* The list of test functions */
@@ -4960,5 +5060,7 @@ struct svn_test_descriptor_t test_funcs[
                        "scan_delete"),
     SVN_TEST_OPTS_PASS(test_follow_moved_to,
                        "follow_moved_to"),
+    SVN_TEST_OPTS_PASS(mixed_rev_move,
+                       "mixed_rev_move"),
     SVN_TEST_NULL
   };

Modified: subversion/branches/ev2-export/tools/dist/nightly.sh
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/tools/dist/nightly.sh?rev=1333596&r1=1333595&r2=1333596&view=diff
==============================================================================
--- subversion/branches/ev2-export/tools/dist/nightly.sh (original)
+++ subversion/branches/ev2-export/tools/dist/nightly.sh Thu May  3 19:48:38 2012
@@ -63,7 +63,7 @@ $svn export -r $head $repo/trunk/build/g
 # Create the environment
 cd roll
 echo '----------------building environment------------------'
-../release.py --base-dir ${abscwd}/roll build-env
+../release.py --base-dir ${abscwd}/roll build-env trunk-nightly
 
 # Roll the tarballs
 echo '-------------------rolling tarball--------------------'



Mime
View raw message