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 <[email protected]> (Swig-Perl b.)
joeswatosh Joe Swatosh <[email protected]> (Swig-Ruby b.)
jrvernooij Jelmer Vernooij <[email protected]> (Python bindings)
- sage Sage LaTorra <[email protected]> (Ctypes-Python
bindings)
+ sage Sage LaTorra <[email protected]> (Ctypes-Python b.)
rdonch Роман Донченко <[email protected]> (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--------------------'