You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2012/08/16 12:18:03 UTC

svn commit: r1373783 [48/50] - in /subversion/branches/compressed-pristines: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ build/win32/ contrib/client-side/emacs/ contrib/client-side/svn-push/ contrib/client-side/svnmerge/ cont...

Modified: subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/mergeinfo-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/mergeinfo-test.c?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/mergeinfo-test.c (original)
+++ subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/mergeinfo-test.c Thu Aug 16 10:17:48 2012
@@ -78,7 +78,7 @@ verify_mergeinfo_parse(const char *input
     {
       const void *path;
       void *val;
-      apr_array_header_t *ranges;
+      svn_rangelist_t *ranges;
       svn_merge_range_t *range;
       int j;
 
@@ -236,7 +236,7 @@ test_mergeinfo_dup(apr_pool_t *pool)
 {
   apr_hash_t *orig_mergeinfo, *copied_mergeinfo;
   apr_pool_t *subpool;
-  apr_array_header_t *rangelist;
+  svn_rangelist_t *rangelist;
 
   /* Assure that copies which should be empty turn out that way. */
   subpool = svn_pool_create(pool);
@@ -399,7 +399,7 @@ range_to_string(svn_merge_range_t *range
    verified (e.g. "svn_rangelist_intersect"), while TYPE is a word
    describing what the ranges being examined represent. */
 static svn_error_t *
-verify_ranges_match(const apr_array_header_t *actual_rangelist,
+verify_ranges_match(const svn_rangelist_t *actual_rangelist,
                     svn_merge_range_t *expected_ranges, int nbr_expected,
                     const char *func_verified, const char *type,
                     apr_pool_t *pool)
@@ -436,7 +436,7 @@ verify_mergeinfo_deltas(apr_hash_t *delt
                         const char *func_verified, const char *type,
                         apr_pool_t *pool)
 {
-  apr_array_header_t *rangelist;
+  svn_rangelist_t *rangelist;
 
   if (apr_hash_count(deltas) != 1)
     /* Deltas on "/trunk" expected. */
@@ -479,7 +479,7 @@ test_diff_mergeinfo(apr_pool_t *pool)
 static svn_error_t *
 test_rangelist_reverse(apr_pool_t *pool)
 {
-  apr_array_header_t *rangelist;
+  svn_rangelist_t *rangelist;
   svn_merge_range_t expected_rangelist[3] =
     { {10, 9, TRUE}, {7, 4, TRUE}, {3, 2, TRUE} };
 
@@ -494,7 +494,7 @@ test_rangelist_reverse(apr_pool_t *pool)
 static svn_error_t *
 test_rangelist_intersect(apr_pool_t *pool)
 {
-  apr_array_header_t *rangelist1, *rangelist2, *intersection;
+  svn_rangelist_t *rangelist1, *rangelist2, *intersection;
 
   /* Expected intersection when considering inheritance. */
   svn_merge_range_t intersection_consider_inheritance[] =
@@ -562,7 +562,7 @@ test_mergeinfo_intersect(apr_pool_t *poo
 {
   svn_merge_range_t expected_intersection[3] =
     { {0, 1, TRUE}, {2, 4, TRUE}, {11, 12, TRUE} };
-  apr_array_header_t *rangelist;
+  svn_rangelist_t *rangelist;
   apr_hash_t *intersection;
 
   SVN_ERR(svn_mergeinfo_parse(&info1, "/trunk: 1-6,12-16\n/foo: 31", pool));
@@ -712,7 +712,7 @@ test_merge_mergeinfo(apr_pool_t *pool)
       SVN_ERR(svn_mergeinfo_to_string(&info2_starting, info2, pool));
 
       SVN_ERR(svn_mergeinfo_merge(info1, info2, pool));
-      if (mergeinfo[i].expected_paths != apr_hash_count(info1))
+      if (mergeinfo[i].expected_paths != (int)apr_hash_count(info1))
         return fail(pool, "Wrong number of paths in merged mergeinfo");
 
       /* Check that info2 remained unchanged. */
@@ -728,7 +728,7 @@ test_merge_mergeinfo(apr_pool_t *pool)
 
       for (j = 0; j < mergeinfo[i].expected_paths; j++)
         {
-          apr_array_header_t *rangelist =
+          svn_rangelist_t *rangelist =
             apr_hash_get(info1, mergeinfo[i].path_rngs[j].path,
                          APR_HASH_KEY_STRING);
           if (!rangelist)
@@ -751,7 +751,7 @@ test_remove_rangelist(apr_pool_t *pool)
 {
   int i, j;
   svn_error_t *err, *child_err;
-  apr_array_header_t *output, *eraser, *whiteboard;
+  svn_rangelist_t *output, *eraser, *whiteboard;
 
   /* Struct for svn_rangelist_remove test data.
      Parse WHITEBOARD and ERASER to hashes and then get the rangelist for
@@ -938,7 +938,7 @@ randomly_fill_rev_array(svn_boolean_t *r
 /* Set *RANGELIST to a rangelist representing the revisions that are marked
  * with TRUE in the array REVS[RANDOM_REV_ARRAY_LENGTH]. */
 static svn_error_t *
-rev_array_to_rangelist(apr_array_header_t **rangelist,
+rev_array_to_rangelist(svn_rangelist_t **rangelist,
                        svn_boolean_t *revs,
                        apr_pool_t *pool)
 {
@@ -980,7 +980,7 @@ test_rangelist_remove_randomly(apr_pool_
       svn_boolean_t first_revs[RANDOM_REV_ARRAY_LENGTH],
         second_revs[RANDOM_REV_ARRAY_LENGTH],
         expected_revs[RANDOM_REV_ARRAY_LENGTH];
-      apr_array_header_t *first_rangelist, *second_rangelist,
+      svn_rangelist_t *first_rangelist, *second_rangelist,
         *expected_rangelist, *actual_rangelist;
       /* There will be at most RANDOM_REV_ARRAY_LENGTH ranges in
          expected_rangelist. */
@@ -1038,7 +1038,7 @@ test_rangelist_intersect_randomly(apr_po
       svn_boolean_t first_revs[RANDOM_REV_ARRAY_LENGTH],
         second_revs[RANDOM_REV_ARRAY_LENGTH],
         expected_revs[RANDOM_REV_ARRAY_LENGTH];
-      apr_array_header_t *first_rangelist, *second_rangelist,
+      svn_rangelist_t *first_rangelist, *second_rangelist,
         *expected_rangelist, *actual_rangelist;
       /* There will be at most RANDOM_REV_ARRAY_LENGTH ranges in
          expected_rangelist. */
@@ -1105,7 +1105,7 @@ test_remove_mergeinfo(apr_pool_t *pool)
 static svn_error_t *
 test_rangelist_to_string(apr_pool_t *pool)
 {
-  apr_array_header_t *result;
+  svn_rangelist_t *result;
   svn_string_t *output;
   svn_string_t *expected = svn_string_create("3,5,7-11,13-14", pool);
 
@@ -1162,7 +1162,7 @@ test_rangelist_merge(apr_pool_t *pool)
 {
   int i;
   svn_error_t *err, *child_err;
-  apr_array_header_t *rangelist1, *rangelist2;
+  svn_rangelist_t *rangelist1, *rangelist2;
 
   /* Struct for svn_rangelist_merge test data.  Similar to
      mergeinfo_merge_test_data struct in svn_mergeinfo_merge() test. */
@@ -1359,7 +1359,7 @@ test_rangelist_diff(apr_pool_t *pool)
 {
   int i;
   svn_error_t *err, *child_err;
-  apr_array_header_t *from, *to, *added, *deleted;
+  svn_rangelist_t *from, *to, *added, *deleted;
 
   /* Structure containing two ranges to diff and the expected output of the
      diff both when considering and ignoring range inheritance. */

Modified: subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/skel-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/skel-test.c?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/skel-test.c (original)
+++ subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/skel-test.c Thu Aug 16 10:17:48 2012
@@ -216,7 +216,7 @@ gen_implicit_length_all_chars(apr_size_t
   for (i = 0; i < 256; i++)
     if (! skel_is_space( (apr_byte_t)i)
         && ! skel_is_paren( (apr_byte_t)i))
-      name[pos++] = i;
+      name[pos++] = (char)i;
 
   *len_p = pos;
   return name;
@@ -375,7 +375,7 @@ parse_explicit_length(apr_pool_t *pool)
       {
         char buf[1];
 
-        buf[0] = i;
+        buf[0] = (char)i;
         SVN_ERR(try_explicit_length(buf, 1, 1, pool));
       }
   }
@@ -386,7 +386,7 @@ parse_explicit_length(apr_pool_t *pool)
     char data[256];
 
     for (i = 0; i < 256; i++)
-      data[i] = i;
+      data[i] = (char)i;
 
     SVN_ERR(try_explicit_length(data, 256, 256, pool));
   }
@@ -592,7 +592,7 @@ parse_list(apr_pool_t *pool)
                       svn_skel_t *child;
                       char buf[1];
 
-                      buf[0] = atom_byte;
+                      buf[0] = (char)atom_byte;
 
                       put_list_start(str,  (apr_byte_t)sep, sep_count);
                       for (i = 0; i < list_len; i++)
@@ -619,7 +619,7 @@ parse_list(apr_pool_t *pool)
                     char data[256];
 
                     for (i = 0; i < 256; i++)
-                      data[i] = i;
+                      data[i] = (char)i;
 
                     put_list_start(str,  (apr_byte_t)sep, sep_count);
                     for (i = 0; i < list_len; i++)
@@ -797,7 +797,7 @@ unparse_list(apr_pool_t *pool)
     for (byte = 0; byte < 256; byte++)
       if (skel_is_name( (apr_byte_t)byte))
         {
-          char buf = byte;
+          char buf = (char)byte;
           add(build_atom(1, &buf, pool), list);
         }
 
@@ -858,7 +858,7 @@ unparse_list(apr_pool_t *pool)
             val = i * 10 + j;
             for (k = 0; k < sizeof(buf); k++)
               {
-                buf[k] = val;
+                buf[k] = (char)val;
                 val += j;
               }
 
@@ -873,6 +873,11 @@ unparse_list(apr_pool_t *pool)
 
     if (! skel_equal(top, reparsed))
       return fail(pool, "failed to reparse list of lists");
+
+    reparsed = svn_skel__dup(reparsed, TRUE, pool);
+
+    if (! skel_equal(top, reparsed))
+      return fail(pool, "failed to dup list of lists");
   }
 
   return SVN_NO_ERROR;

Propchange: subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/spillbuf-test.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/stream-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/stream-test.c?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/stream-test.c (original)
+++ subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/stream-test.c Thu Aug 16 10:17:48 2012
@@ -138,7 +138,7 @@ generate_test_bytes(int num_bytes, apr_p
         {
           if (c == 127)
             repeat++;
-          c = (c + 1) % 127;
+          c = (char)((c + 1) % 127);
           repeat_iter = repeat;
         }
     }

Modified: subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/string-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/string-test.c?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/string-test.c (original)
+++ subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/string-test.c Thu Aug 16 10:17:48 2012
@@ -521,7 +521,7 @@ test24(apr_pool_t *pool)
   SVN_TEST_ASSERT(length == 1);
   SVN_TEST_STRING_ASSERT(buffer, "0");
 
-  length = svn__i64toa(buffer, -0x8000000000000000ll);
+  length = svn__i64toa(buffer, 0x8000000000000000ll);
   SVN_TEST_ASSERT(length == 20);
   SVN_TEST_STRING_ASSERT(buffer, "-9223372036854775808");
 
@@ -529,14 +529,14 @@ test24(apr_pool_t *pool)
   SVN_TEST_ASSERT(length == 19);
   SVN_TEST_STRING_ASSERT(buffer, "9223372036854775807");
 
-  length = svn__ui64toa(buffer, 0);
+  length = svn__ui64toa(buffer, 0ull);
   SVN_TEST_ASSERT(length == 1);
   SVN_TEST_STRING_ASSERT(buffer, "0");
 
-  length = svn__ui64toa(buffer, 0xffffffffffffffffll);
+  length = svn__ui64toa(buffer, 0xffffffffffffffffull);
   SVN_TEST_ASSERT(length == 20);
   SVN_TEST_STRING_ASSERT(buffer, "18446744073709551615");
-  
+
   return test_stringbuf_unequal("abc", "abb", pool);
 }
 

Modified: subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/utf-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/utf-test.c?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/utf-test.c (original)
+++ subversion/branches/compressed-pristines/subversion/tests/libsvn_subr/utf-test.c Thu Aug 16 10:17:48 2012
@@ -197,7 +197,7 @@ utf_validate2(apr_pool_t *pool)
       /* A random string; experiment shows that it's occasionally (less
          than 1%) valid but usually invalid. */
       for (j = 0; j < sizeof(str) - 1; ++j)
-        str[j] = range_rand(0, 255);
+        str[j] = (char)range_rand(0, 255);
       str[sizeof(str) - 1] = 0;
       len = strlen(str);
 

Propchange: subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Thu Aug 16 10:17:48 2012
@@ -1,11 +1,13 @@
-tree-conflict-data-test
-.libs
 *.lo
+.libs
+conflict-data-test
 db-test
+entries-compat-test
 fake-wc
+op-depth-test
 pristine-store-test
 svn-test-work
-entries-compat-test
-op-depth-test
-wc-lock-tester
+tree-conflict-data-test
 wc-incomplete-tester
+wc-lock-tester
+wc-queries-test

Modified: subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/db-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/db-test.c?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/db-test.c (original)
+++ subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/db-test.c Thu Aug 16 10:17:48 2012
@@ -664,7 +664,8 @@ test_inserting_nodes(apr_pool_t *pool)
             props,
             1, TIME_1a, AUTHOR_1,
             checksum,
-            NULL, NULL, FALSE, NULL, FALSE, FALSE, NULL,
+            NULL, FALSE, FALSE, NULL, FALSE, FALSE,
+            NULL, NULL,
             pool));
 
   /* Create a new symlink node. */
@@ -676,7 +677,8 @@ test_inserting_nodes(apr_pool_t *pool)
             props,
             1, TIME_1a, AUTHOR_1,
             "O-target",
-            NULL, NULL, FALSE, NULL, NULL,
+            NULL, FALSE, FALSE, NULL, FALSE, FALSE,
+            NULL, NULL,
             pool));
 
   /* Replace an incomplete node with an absent file node. */
@@ -1416,6 +1418,7 @@ test_externals_store(apr_pool_t *pool)
                                        FALSE, NULL,
                                        FALSE,
                                        NULL,
+                                       NULL,
                                        pool));
 
   SVN_ERR(svn_wc__db_external_add_dir(db,

Modified: subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/op-depth-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/op-depth-test.c?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/op-depth-test.c (original)
+++ subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/op-depth-test.c Thu Aug 16 10:17:48 2012
@@ -43,6 +43,7 @@
 #include "private/svn_dep_compat.h"
 #include "../../libsvn_wc/wc.h"
 #include "../../libsvn_wc/wc_db.h"
+#include "../../libsvn_wc/workqueue.h"
 #define SVN_WC__I_AM_WC_DB
 #include "../../libsvn_wc/wc_db_private.h"
 
@@ -238,7 +239,10 @@ wc_update(svn_test__sandbox_t *b, const 
   apr_array_header_t *result_revs;
   apr_array_header_t *paths = apr_array_make(b->pool, 1,
                                              sizeof(const char *));
-  svn_opt_revision_t revision = { svn_opt_revision_number, { revnum } };
+  svn_opt_revision_t revision;
+
+  revision.kind = svn_opt_revision_number;
+  revision.value.number = revnum;
 
   APR_ARRAY_PUSH(paths, const char *) = wc_path(b, path);
   SVN_ERR(svn_client_create_context(&ctx, b->pool));
@@ -455,8 +459,12 @@ check_db_rows(svn_test__sandbox_t *b,
   svn_boolean_t have_row;
   apr_hash_t *found_hash = apr_hash_make(b->pool);
   apr_hash_t *expected_hash = apr_hash_make(b->pool);
-  comparison_baton_t comparison_baton
-    = { expected_hash, found_hash, b->pool, NULL };
+  comparison_baton_t comparison_baton;
+
+  comparison_baton.expected_hash = expected_hash;
+  comparison_baton.found_hash = found_hash;
+  comparison_baton.scratch_pool = b->pool;
+  comparison_baton.errors = NULL;
 
   /* Fill ACTUAL_HASH with data from the WC DB. */
   SVN_ERR(open_wc_db(&sdb, b->wc_abspath, statements, b->pool, b->pool));
@@ -523,23 +531,23 @@ struct copy_subtest_t
   nodes_row_t expected[20];
 };
 
+#define source_everything   "A/B"
+
+#define source_base_file    "A/B/lambda"
+#define source_base_dir     "A/B/E"
+
+#define source_added_file   "A/B/file-added"
+#define source_added_dir    "A/B/D-added"
+#define source_added_dir2   "A/B/D-added/D2"
+
+#define source_copied_file  "A/B/lambda-copied"
+#define source_copied_dir   "A/B/E-copied"
+
 /* Check that all kinds of WC-to-WC copies give correct op_depth results:
  * create a Greek tree, make copies in it, and check the resulting DB rows. */
 static svn_error_t *
 wc_wc_copies(svn_test__sandbox_t *b)
 {
-  const char source_everything[]  = "A/B";
-
-  const char source_base_file[]   = "A/B/lambda";
-  const char source_base_dir[]    = "A/B/E";
-
-  const char source_added_file[]  = "A/B/file-added";
-  const char source_added_dir[]   = "A/B/D-added";
-  const char source_added_dir2[]  = "A/B/D-added/D2";
-
-  const char source_copied_file[] = "A/B/lambda-copied";
-  const char source_copied_dir[]  = "A/B/E-copied";
-
   SVN_ERR(add_and_commit_greek_tree(b));
 
   /* Create the various kinds of source node which will be copied */
@@ -756,13 +764,15 @@ repo_wc_copies(svn_test__sandbox_t *b)
     for (subtest = subtests; subtest->from_path; subtest++)
       {
         svn_opt_revision_t rev = { svn_opt_revision_number, { 1 } };
-        svn_client_copy_source_t source = { NULL, &rev, &rev };
+        svn_client_copy_source_t source;
         apr_array_header_t *sources
           = apr_array_make(b->pool, 0, sizeof(svn_client_copy_source_t *));
 
         source.path = svn_path_url_add_component2(b->repos_url,
                                                   subtest->from_path,
                                                   b->pool);
+        source.revision = &rev;
+        source.peg_revision = &rev;
         APR_ARRAY_PUSH(sources, svn_client_copy_source_t *) = &source;
         SVN_ERR(svn_client_copy6(sources,
                                  wc_path(b, subtest->to_path),
@@ -1217,9 +1227,9 @@ insert_dirs(svn_test__sandbox_t *b,
       if (nodes->local_relpath[0])
         {
           SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 2));
-          SVN_ERR(svn_sqlite__bindf(stmt, "sissrs",
+          SVN_ERR(svn_sqlite__bindf(stmt, "sdssrs",
                                     nodes->local_relpath,
-                                    (apr_int64_t)nodes->op_depth,
+                                    nodes->op_depth,
                                     nodes->presence,
                                     nodes->repo_relpath,
                                     nodes->repo_revnum,
@@ -1229,9 +1239,9 @@ insert_dirs(svn_test__sandbox_t *b,
       else
         {
           SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, 1));
-          SVN_ERR(svn_sqlite__bindf(stmt, "sissr",
+          SVN_ERR(svn_sqlite__bindf(stmt, "sdssr",
                                     nodes->local_relpath,
-                                    (apr_int64_t)nodes->op_depth,
+                                    nodes->op_depth,
                                     nodes->presence,
                                     nodes->repo_relpath,
                                     nodes->repo_revnum));
@@ -1277,7 +1287,7 @@ base_dir_insert_remove(svn_test__sandbox
                                         NULL, NULL, FALSE, NULL, NULL,
                                         b->pool));
 
-  after = apr_palloc(b->pool, sizeof(*after) * (num_before + num_added + 1));
+  after = apr_palloc(b->pool, sizeof(*after) * (apr_size_t)(num_before + num_added + 1));
   for (i = 0; i < num_before; ++i)
     after[i] = before[i];
   for (i = 0; i < num_added; ++i)
@@ -1286,7 +1296,11 @@ base_dir_insert_remove(svn_test__sandbox
 
   SVN_ERR(check_db_rows(b, "", after));
 
-  SVN_ERR(svn_wc__db_base_remove(b->wc_ctx->db, dir_abspath, b->pool));
+  SVN_ERR(svn_wc__db_base_remove(b->wc_ctx->db, dir_abspath,
+                                 FALSE, SVN_INVALID_REVNUM,
+                                 NULL, NULL, b->pool));
+  SVN_ERR(svn_wc__wq_run(b->wc_ctx->db, dir_abspath,
+                         NULL, NULL, b->pool));
 
   SVN_ERR(check_db_rows(b, "", before));
 
@@ -2830,8 +2844,10 @@ do_delete(svn_test__sandbox_t *b,
   SVN_ERR(check_db_rows(b, "", before));
   SVN_ERR(check_db_actual(b, actual_before));
   SVN_ERR(svn_wc__db_op_delete(b->wc_ctx->db, local_abspath, NULL,
-                               NULL, NULL /* notification */,
+                               TRUE /* delete_dir_externals */,
+                               NULL /* conflict */, NULL /* work_item */,
                                NULL, NULL /* cancellation */,
+                               NULL, NULL /* notification */,
                                b->pool));
   SVN_ERR(check_db_rows(b, "", after));
   SVN_ERR(check_db_actual(b, actual_after));
@@ -3634,8 +3650,6 @@ copy_file_externals(const svn_test_opts_
       { 2, "A/B",   "normal", NO_COPY_FROM },
       { 0, "A/g",   "normal", 1, "f", TRUE },
       { 0, "A/B/g", "normal", 1, "f", TRUE },
-      { 0, "X/g",   "normal", 1, "f", TRUE },
-      { 0, "X/B/g", "normal", 1, "f", TRUE },
       { 0 }
     };
     SVN_ERR(check_db_rows(&b, "", rows));
@@ -4576,6 +4590,404 @@ move_update(const svn_test_opts_t *opts,
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+check_moved_to(apr_array_header_t *moved_tos,
+               int i,
+               int op_depth,
+               const char *local_relpath)
+{
+  struct svn_wc__db_moved_to_t *moved_to;
+
+  if (i >= moved_tos->nelts)
+    return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+                             "moved-to %d not found", i);
+
+  moved_to = APR_ARRAY_IDX(moved_tos, i, struct svn_wc__db_moved_to_t *);
+
+  if (moved_to->op_depth != op_depth
+      || strcmp(moved_to->local_relpath, local_relpath))
+    return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
+                             "expected: {%d '%s'} found[%d]: {%d '%s'}",
+                             op_depth, local_relpath, i,
+                             moved_to->op_depth, moved_to->local_relpath);
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_scan_delete(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+  svn_test__sandbox_t b;
+  const char *moved_to_abspath, *moved_to_op_root_abspath;
+  apr_array_header_t *moved_tos;
+
+  SVN_ERR(svn_test__sandbox_create(&b, "scan_delete", opts, pool));
+
+  SVN_ERR(wc_mkdir(&b, "A"));
+  SVN_ERR(wc_mkdir(&b, "A/B"));
+  SVN_ERR(wc_mkdir(&b, "A/B/C"));
+  SVN_ERR(wc_mkdir(&b, "A2"));
+  SVN_ERR(wc_mkdir(&b, "A2/B"));
+  SVN_ERR(wc_mkdir(&b, "C2"));
+  SVN_ERR(wc_commit(&b, ""));
+  SVN_ERR(wc_update(&b, "", 1));
+
+  SVN_ERR(wc_move(&b, "A2", "X"));
+  SVN_ERR(wc_move(&b, "X/B", "Z"));
+  SVN_ERR(wc_move(&b, "A/B", "X/B"));
+  SVN_ERR(wc_move(&b, "X/B/C", "Y"));
+  SVN_ERR(wc_move(&b, "C2", "X/B/C"));
+
+  {
+    nodes_row_t nodes[] = {
+      {0, "",         "normal",       1, ""},
+      {0, "A",        "normal",       1, "A"},
+      {0, "A/B",      "normal",       1, "A/B"},
+      {0, "A/B/C",    "normal",       1, "A/B/C"},
+      {0, "A2",       "normal",       1, "A2"},
+      {0, "A2/B",     "normal",       1, "A2/B"},
+      {0, "C2",       "normal",       1, "C2"},
+      {1, "A2",       "base-deleted", NO_COPY_FROM, "X"},
+      {1, "A2/B",     "base-deleted", NO_COPY_FROM},
+      {1, "Z",        "normal",       1, "A2/B", MOVED_HERE},
+      {1, "X",        "normal",       1, "A2", MOVED_HERE},
+      {1, "X/B",      "normal",       1, "A2/B", MOVED_HERE},
+      {2, "A/B",      "base-deleted", NO_COPY_FROM, "X/B"},
+      {2, "A/B/C",    "base-deleted", NO_COPY_FROM},
+      {2, "X/B",      "normal",       1, "A/B", FALSE, "Z", TRUE},
+      {2, "X/B/C",    "normal",       1, "A/B/C", MOVED_HERE},
+      {1, "Y",        "normal",       1, "A/B/C", MOVED_HERE},
+      {1, "C2",       "base-deleted", NO_COPY_FROM, "X/B/C"},
+      {3, "X/B/C",    "normal",       1, "C2", FALSE, "Y", TRUE},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  SVN_ERR(svn_wc__db_scan_deletion(NULL, &moved_to_abspath,
+                                   NULL, &moved_to_op_root_abspath,
+                                   b.wc_ctx->db, wc_path(&b, "C2"),
+                                   pool, pool));
+  SVN_TEST_STRING_ASSERT(moved_to_abspath, wc_path(&b, "X/B/C"));
+  SVN_TEST_STRING_ASSERT(moved_to_op_root_abspath, wc_path(&b, "X/B/C"));
+
+  SVN_ERR(svn_wc__db_scan_deletion(NULL, &moved_to_abspath,
+                                   NULL, &moved_to_op_root_abspath,
+                                   b.wc_ctx->db, wc_path(&b, "A/B"),
+                                   pool, pool));
+  SVN_TEST_STRING_ASSERT(moved_to_abspath, wc_path(&b, "X/B"));
+  SVN_TEST_STRING_ASSERT(moved_to_op_root_abspath, wc_path(&b, "X/B"));
+
+  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, 2, "X/B/C"));
+  SVN_ERR(check_moved_to(moved_tos, 1, 3, "Y"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 2);
+
+  SVN_ERR(svn_wc__db_scan_deletion(NULL, &moved_to_abspath,
+                                   NULL, &moved_to_op_root_abspath,
+                                   b.wc_ctx->db, wc_path(&b, "A/B/C"),
+                                   pool, pool));
+  SVN_TEST_STRING_ASSERT(moved_to_abspath, wc_path(&b, "X/B/C"));
+  SVN_TEST_STRING_ASSERT(moved_to_op_root_abspath, wc_path(&b, "X/B"));
+
+  SVN_ERR(svn_wc__db_scan_deletion(NULL, &moved_to_abspath,
+                                   NULL, &moved_to_op_root_abspath,
+                                   b.wc_ctx->db, wc_path(&b, "A2"),
+                                   pool, pool));
+  SVN_TEST_STRING_ASSERT(moved_to_abspath, wc_path(&b, "X"));
+  SVN_TEST_STRING_ASSERT(moved_to_op_root_abspath, wc_path(&b, "X"));
+
+  SVN_ERR(svn_wc__db_scan_deletion(NULL, &moved_to_abspath,
+                                   NULL, &moved_to_op_root_abspath,
+                                   b.wc_ctx->db, wc_path(&b, "A2/B"),
+                                   pool, pool));
+  SVN_TEST_STRING_ASSERT(moved_to_abspath, wc_path(&b, "X/B"));
+  SVN_TEST_STRING_ASSERT(moved_to_op_root_abspath, wc_path(&b, "X"));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_follow_moved_to(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, "follow_moved_to", opts, pool));
+
+  SVN_ERR(wc_mkdir(&b, "A1"));
+  SVN_ERR(wc_mkdir(&b, "A1/B"));
+  SVN_ERR(wc_mkdir(&b, "A1/B/C"));
+  SVN_ERR(wc_mkdir(&b, "A1/B/C/D"));
+  SVN_ERR(wc_mkdir(&b, "A1/B/C/D/E"));
+  SVN_ERR(wc_mkdir(&b, "A2"));
+  SVN_ERR(wc_mkdir(&b, "A2/B"));
+  SVN_ERR(wc_mkdir(&b, "A2/B/C"));
+  SVN_ERR(wc_mkdir(&b, "A2/B/C/D"));
+  SVN_ERR(wc_mkdir(&b, "A2/B/C/D/E"));
+  SVN_ERR(wc_mkdir(&b, "A3"));
+  SVN_ERR(wc_mkdir(&b, "A3/B"));
+  SVN_ERR(wc_mkdir(&b, "A3/B/C"));
+  SVN_ERR(wc_mkdir(&b, "A3/B/C/D"));
+  SVN_ERR(wc_mkdir(&b, "A3/B/C/D/E"));
+  SVN_ERR(wc_commit(&b, ""));
+  SVN_ERR(wc_update(&b, "", 1));
+
+  {
+    nodes_row_t nodes[] = {
+      {0, "",         "normal", 1, ""},
+      {0, "A1",       "normal", 1, "A1"},
+      {0, "A1/B",     "normal", 1, "A1/B"},
+      {0, "A1/B/C",   "normal", 1, "A1/B/C"},
+      {0, "A1/B/C/D", "normal", 1, "A1/B/C/D"},
+      {0, "A1/B/C/D/E", "normal", 1, "A1/B/C/D/E"},
+      {0, "A2",       "normal", 1, "A2"},
+      {0, "A2/B",     "normal", 1, "A2/B"},
+      {0, "A2/B/C",   "normal", 1, "A2/B/C"},
+      {0, "A2/B/C/D", "normal", 1, "A2/B/C/D"},
+      {0, "A2/B/C/D/E", "normal", 1, "A2/B/C/D/E"},
+      {0, "A3",       "normal", 1, "A3"},
+      {0, "A3/B",     "normal", 1, "A3/B"},
+      {0, "A3/B/C",   "normal", 1, "A3/B/C"},
+      {0, "A3/B/C/D", "normal", 1, "A3/B/C/D"},
+      {0, "A3/B/C/D/E", "normal", 1, "A3/B/C/D/E"},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  SVN_ERR(wc_move(&b, "A1", "X"));
+  SVN_ERR(wc_move(&b, "A2", "A1"));
+  SVN_ERR(wc_move(&b, "A3", "A2"));
+  SVN_ERR(wc_move(&b, "X", "A3"));
+  SVN_ERR(wc_move(&b, "A1/B", "X"));
+  SVN_ERR(wc_move(&b, "A2/B", "A1/B"));
+  SVN_ERR(wc_move(&b, "A3/B", "A2/B"));
+  SVN_ERR(wc_move(&b, "X", "A3/B"));
+  SVN_ERR(wc_move(&b, "A1/B/C/D", "X"));
+  SVN_ERR(wc_move(&b, "A2/B/C/D", "A1/B/C/D"));
+  SVN_ERR(wc_move(&b, "A3/B/C/D", "A2/B/C/D"));
+  SVN_ERR(wc_move(&b, "X", "A3/B/C/D"));
+  SVN_ERR(wc_move(&b, "A1/B/C/D/E", "X"));
+  SVN_ERR(wc_move(&b, "A2/B/C/D/E", "A1/B/C/D/E"));
+  SVN_ERR(wc_move(&b, "A3/B/C/D/E", "A2/B/C/D/E"));
+  SVN_ERR(wc_move(&b, "X", "A3/B/C/D/E"));
+
+  {
+    nodes_row_t nodes[] = {
+      {0, "",         "normal", 1, ""},
+      {0, "A1",       "normal", 1, "A1"},
+      {0, "A1/B",     "normal", 1, "A1/B"},
+      {0, "A1/B/C",   "normal", 1, "A1/B/C"},
+      {0, "A1/B/C/D", "normal", 1, "A1/B/C/D"},
+      {0, "A1/B/C/D/E", "normal", 1, "A1/B/C/D/E"},
+      {0, "A2",       "normal", 1, "A2"},
+      {0, "A2/B",     "normal", 1, "A2/B"},
+      {0, "A2/B/C",   "normal", 1, "A2/B/C"},
+      {0, "A2/B/C/D", "normal", 1, "A2/B/C/D"},
+      {0, "A2/B/C/D/E", "normal", 1, "A2/B/C/D/E"},
+      {0, "A3",       "normal", 1, "A3"},
+      {0, "A3/B",     "normal", 1, "A3/B"},
+      {0, "A3/B/C",   "normal", 1, "A3/B/C"},
+      {0, "A3/B/C/D", "normal", 1, "A3/B/C/D"},
+      {0, "A3/B/C/D/E", "normal", 1, "A3/B/C/D/E"},
+
+      {1, "A1",       "normal", 1, "A2", FALSE, "A3", TRUE},
+      {1, "A1/B",     "normal", 1, "A2/B", MOVED_HERE},
+      {1, "A1/B/C",   "normal", 1, "A2/B/C", MOVED_HERE},
+      {1, "A1/B/C/D", "normal", 1, "A2/B/C/D", MOVED_HERE},
+      {1, "A1/B/C/D/E", "normal", 1, "A2/B/C/D/E", MOVED_HERE},
+
+      {1, "A2",       "normal", 1, "A3", FALSE, "A1", TRUE},
+      {1, "A2/B",     "normal", 1, "A3/B", MOVED_HERE},
+      {1, "A2/B/C",   "normal", 1, "A3/B/C", MOVED_HERE},
+      {1, "A2/B/C/D", "normal", 1, "A3/B/C/D", MOVED_HERE},
+      {1, "A2/B/C/D/E", "normal", 1, "A3/B/C/D/E", MOVED_HERE},
+
+      {1, "A3",       "normal", 1, "A1", FALSE, "A2", TRUE},
+      {1, "A3/B",     "normal", 1, "A1/B", MOVED_HERE},
+      {1, "A3/B/C",   "normal", 1, "A1/B/C", MOVED_HERE},
+      {1, "A3/B/C/D", "normal", 1, "A1/B/C/D", MOVED_HERE},
+      {1, "A3/B/C/D/E", "normal", 1, "A1/B/C/D/E", MOVED_HERE},
+
+      {2, "A1/B",     "normal", 1, "A3/B", FALSE, "A3/B", TRUE},
+      {2, "A1/B/C",   "normal", 1, "A3/B/C", MOVED_HERE},
+      {2, "A1/B/C/D", "normal", 1, "A3/B/C/D", MOVED_HERE},
+      {2, "A1/B/C/D/E", "normal", 1, "A3/B/C/D/E", MOVED_HERE},
+
+      {2, "A2/B",     "normal", 1, "A1/B", FALSE, "A1/B", TRUE},
+      {2, "A2/B/C",   "normal", 1, "A1/B/C", MOVED_HERE},
+      {2, "A2/B/C/D", "normal", 1, "A1/B/C/D", MOVED_HERE},
+      {2, "A2/B/C/D/E", "normal", 1, "A1/B/C/D/E", MOVED_HERE},
+
+      {2, "A3/B",     "normal", 1, "A2/B", FALSE, "A2/B", TRUE},
+      {2, "A3/B/C",   "normal", 1, "A2/B/C", MOVED_HERE},
+      {2, "A3/B/C/D", "normal", 1, "A2/B/C/D", MOVED_HERE},
+      {2, "A3/B/C/D/E", "normal", 1, "A2/B/C/D/E", MOVED_HERE},
+
+      {4, "A1/B/C/D",   "normal", 1, "A1/B/C/D", FALSE, "A3/B/C/D", TRUE},
+      {4, "A1/B/C/D/E", "normal", 1, "A1/B/C/D/E", MOVED_HERE},
+
+      {4, "A2/B/C/D",   "normal", 1, "A2/B/C/D", FALSE, "A1/B/C/D", TRUE},
+      {4, "A2/B/C/D/E", "normal", 1, "A2/B/C/D/E", MOVED_HERE},
+
+      {4, "A3/B/C/D",   "normal", 1, "A3/B/C/D", FALSE, "A2/B/C/D", TRUE},
+      {4, "A3/B/C/D/E", "normal", 1, "A3/B/C/D/E", MOVED_HERE},
+
+      {5, "A1/B/C/D/E", "normal", 1, "A2/B/C/D/E", FALSE, "A3/B/C/D/E", TRUE},
+      {5, "A2/B/C/D/E", "normal", 1, "A3/B/C/D/E", FALSE, "A1/B/C/D/E", TRUE},
+      {5, "A3/B/C/D/E", "normal", 1, "A1/B/C/D/E", FALSE, "A2/B/C/D/E", TRUE},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  /* A1->A3, A3/B->A2/B, A2/B/C/D->A1/B/C/D, A1/B/C/D/E->A3/B/C/D/E */
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A1"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "A3"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 1);
+
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A1/B"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "A3/B"));
+  SVN_ERR(check_moved_to(moved_tos, 1, 2, "A2/B"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 2);
+
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A1/B/C"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "A3/B/C"));
+  SVN_ERR(check_moved_to(moved_tos, 1, 2, "A2/B/C"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 2);
+
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A1/B/C/D"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "A3/B/C/D"));
+  SVN_ERR(check_moved_to(moved_tos, 1, 2, "A2/B/C/D"));
+  SVN_ERR(check_moved_to(moved_tos, 2, 4, "A1/B/C/D"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 3);
+
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A1/B/C/D/E"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "A3/B/C/D/E"));
+  SVN_ERR(check_moved_to(moved_tos, 1, 2, "A2/B/C/D/E"));
+  SVN_ERR(check_moved_to(moved_tos, 2, 4, "A1/B/C/D/E"));
+  SVN_ERR(check_moved_to(moved_tos, 3, 5, "A3/B/C/D/E"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 4);
+
+  SVN_ERR(wc_delete(&b, "A3/B/C/D/E"));
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A1/B/C/D/E"), pool, pool));
+  SVN_ERR(check_moved_to(moved_tos, 0, 1, "A3/B/C/D/E"));
+  SVN_ERR(check_moved_to(moved_tos, 1, 2, "A2/B/C/D/E"));
+  SVN_ERR(check_moved_to(moved_tos, 2, 4, "A1/B/C/D/E"));
+  SVN_TEST_ASSERT(moved_tos->nelts == 3);
+
+  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));
+  }
+
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A/B/C"), pool, pool));
+  SVN_TEST_ASSERT(moved_tos->nelts == 0);
+
+  SVN_ERR(svn_wc__db_follow_moved_to(&moved_tos, b.wc_ctx->db,
+                                     wc_path(&b, "A/B"), pool, pool));
+  SVN_TEST_ASSERT(moved_tos->nelts == 0);
+
+  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);
+
+  return SVN_NO_ERROR;
+}
 
 
 /* ---------------------------------------------------------------------- */
@@ -4668,5 +5080,11 @@ struct svn_test_descriptor_t test_funcs[
                        "move_added"),
     SVN_TEST_OPTS_XFAIL(move_update,
                        "move_update"),
+    SVN_TEST_OPTS_PASS(test_scan_delete,
+                       "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/compressed-pristines/subversion/tests/libsvn_wc/utils.c
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/utils.c?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/utils.c (original)
+++ subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/utils.c Thu Aug 16 10:17:48 2012
@@ -81,17 +81,18 @@ create_repos_and_wc(const char **repos_u
 
   /* Create a WC. Set *WC_ABSPATH to its path. */
   {
+    apr_pool_t *subpool = svn_pool_create(pool); /* To cleanup CTX */
     svn_client_ctx_t *ctx;
     svn_opt_revision_t head_rev = { svn_opt_revision_head, {0} };
 
-    SVN_ERR(svn_client_create_context(&ctx, pool));
-    /* SVN_ERR(svn_config_get_config(&ctx->config, config_dir, pool)); */
+    SVN_ERR(svn_client_create_context(&ctx, subpool));
     SVN_ERR(svn_dirent_get_absolute(wc_abspath, wc_path, pool));
     SVN_ERR(svn_client_checkout3(NULL, *repos_url, *wc_abspath,
                                  &head_rev, &head_rev, svn_depth_infinity,
                                  FALSE /* ignore_externals */,
                                  FALSE /* allow_unver_obstructions */,
-                                 ctx, pool));
+                                 ctx, subpool));
+    svn_pool_destroy(subpool);
   }
 
   /* Register this WC for cleanup. */

Propchange: subversion/branches/compressed-pristines/subversion/tests/libsvn_wc/wc-incomplete-tester.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: subversion/branches/compressed-pristines/subversion/tests/svn_test.h
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/subversion/tests/svn_test.h?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/subversion/tests/svn_test.h (original)
+++ subversion/branches/compressed-pristines/subversion/tests/svn_test.h Thu Aug 16 10:17:48 2012
@@ -54,7 +54,9 @@ extern "C" {
   } while (0)
 
 /** Handy macro for testing an expected svn_error_t return value.
- * EXPECTED must be a real error (neither SVN_NO_ERROR nor APR_SUCCESS). */
+ * EXPECTED must be a real error (neither SVN_NO_ERROR nor APR_SUCCESS).
+ * The error returned by EXPR will be cleared.
+ */
 #define SVN_TEST_ASSERT_ERROR(expr, expected)                             \
   do {                                                                    \
     svn_error_t *err__ = (expr);                                          \
@@ -68,9 +70,13 @@ extern "C" {
                                         "Expected error %d but got %s",   \
                                         (expected),                       \
                                         "SVN_NO_ERROR");                  \
+    svn_error_clear(err__);                                               \
   } while (0)
 
 /** Handy macro for testing string equality.
+ *
+ * EXPR and/or EXPECTED_EXPR may be NULL which compares equal to NULL and
+ * not equal to any non-NULL string.
  */
 #define SVN_TEST_STRING_ASSERT(expr, expected_expr)                 \
   do {                                                              \
@@ -79,8 +85,8 @@ extern "C" {
                                                                     \
     if (tst_str2 == NULL && tst_str1 == NULL)                       \
       break;                                                        \
-    if (   (tst_str2 != NULL && tst_str1 == NULL)                   \
-        || (strcmp(tst_str2, tst_str1) != 0)  )                     \
+    if ((tst_str1 == NULL) || (tst_str2 == NULL)                    \
+        || (strcmp(tst_str2, tst_str1) != 0))                       \
       return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,           \
           "Strings not equal\n  Expected: '%s'\n  Found:    '%s'"   \
           "\n  at %s:%d",                                           \

Modified: subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svnbuild.sh
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svnbuild.sh?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svnbuild.sh (original)
+++ subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svnbuild.sh Thu Aug 16 10:17:48 2012
@@ -22,5 +22,7 @@
 set -e
 set -x
 
+export JAVA_HOME=/usr/local/jdk-1.7.0
+
 branch="$(basename $(svn info . | grep ^URL  | cut -d' ' -f2))"
-(cd .. && gmake BRANCH="$branch")
+(cd .. && gmake BRANCH="$branch" THREADING="no")

Modified: subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svncheck-bindings.sh
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svncheck-bindings.sh?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svncheck-bindings.sh (original)
+++ subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svncheck-bindings.sh Thu Aug 16 10:17:48 2012
@@ -24,7 +24,7 @@ set -x
 
 branch="$(basename $(svn info . | grep ^URL  | cut -d' ' -f2))"
 export MALLOC_OPTIONS=S
-(cd .. && gmake BRANCH="$branch" svn-check-bindings)
+(cd .. && gmake BRANCH="$branch" THREADING="no" svn-check-bindings)
 grep -q "^Result: PASS$" tests.log.bindings.pl || exit 1
 grep -q "^OK$" tests.log.bindings.py || exit 1
 tail -n 1 tests.log.bindings.rb | grep -q ", 0 failures, 0 errors" || exit 1

Modified: subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svncheck.sh
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svncheck.sh?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svncheck.sh (original)
+++ subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svncheck.sh Thu Aug 16 10:17:48 2012
@@ -24,11 +24,11 @@ set -x
 
 branch="$(basename $(svn info . | grep ^URL  | cut -d' ' -f2))"
 export MALLOC_OPTIONS=S
-(cd .. && gmake BRANCH="$branch" PARALLEL="" \
+(cd .. && gmake BRANCH="$branch" PARALLEL="" THREADING="no" \
                                   svn-check-local \
                                   svn-check-svn \
                                   svn-check-neon \
                                   svn-check-serf)
-grep -q "^FAIL:" tests.log* && exit 1
-grep -q "^XPASS:" tests.log* && exit 1
+grep -q "^FAIL:" tests.log.svn-check* && exit 1
+grep -q "^XPASS:" tests.log.svn-check* && exit 1
 exit 0

Modified: subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svnclean.sh
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svnclean.sh?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svnclean.sh (original)
+++ subversion/branches/compressed-pristines/tools/buildbot/slaves/bb-openbsd/svnclean.sh Thu Aug 16 10:17:48 2012
@@ -24,9 +24,10 @@ set -x
 
 branch="$(basename $(svn info . | grep ^URL  | cut -d' ' -f2))"
 (test -h ../svn-trunk || ln -s build ../svn-trunk)
-for i in 3 4 5 6 7; do
+for i in 6 7; do
   (test -h ../svn-1.${i}.x || ln -s build ../svn-1.${i}.x)
 done
 svn update ../../unix-build
 (test -h ../GNUmakefile || ln -s ../unix-build/Makefile.svn ../GNUmakefile)
 (cd .. && gmake BRANCH="$branch" reset clean)
+rm -f tests.log* fails.log*

Modified: subversion/branches/compressed-pristines/tools/buildbot/slaves/centos/svnbuild.sh
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/buildbot/slaves/centos/svnbuild.sh?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/buildbot/slaves/centos/svnbuild.sh (original)
+++ subversion/branches/compressed-pristines/tools/buildbot/slaves/centos/svnbuild.sh Thu Aug 16 10:17:48 2012
@@ -23,6 +23,7 @@
 set -x
 
 export MAKEFLAGS=-j4
+export PYTHON=/usr/local/python25/bin/python
 
 echo "========= autogen.sh"
 ./autogen.sh || exit $?
@@ -30,15 +31,17 @@ echo "========= autogen.sh"
 echo "========= configure"
 #            --with-junit=/usr/share/java/junit.jar
 #            --with-jdk=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64 \
+#            --without-berkeley-db \
 ./configure --enable-javahl --enable-maintainer-mode \
             --with-neon=/usr \
+            --with-serf=/usr/local \
             --with-apxs=/usr/sbin/apxs \
-            --without-berkeley-db \
+            --with-berkeley-db \
             --with-apr=/usr \
             --with-apr-util=/usr \
             --with-jdk=/opt/java/jdk1.6.0_15 \
 	    --with-junit=/home/bt/junit-4.4.jar \
-	    --with-sqlite=/home/bt/sqlite-3.6.17/sqlite3.c \
+	    --with-sqlite=/home/bt/packages/sqlite-amalgamation-dir/sqlite3.c \
             || exit $?
 
 echo "========= make"

Modified: subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd (original)
+++ subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd Thu Aug 16 10:17:48 2012
@@ -67,6 +67,12 @@ for %%i in (*.dll) do (
 )
 popd
 
+svnversion . /1.7.x | find "S" > nul:
+IF ERRORLEVEL 1 (
+  ECHO --- Building 1.7.x: Skipping perl tests ---
+  EXIT /B %result%
+)
+
 SET PERL5LIB=%PERL5LIB%;%TESTDIR%\swig\pl-release;
 pushd subversion\bindings\swig\perl\native
 perl -MExtUtils::Command::MM -e test_harness() t\*.t

Modified: subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd (original)
+++ subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd Thu Aug 16 10:17:48 2012
@@ -31,12 +31,13 @@ IF NOT EXIST "imports\" (
   svn co --username guest --password "" http://sharpsvn.open.collab.net/svn/sharpsvn/trunk/imports imports
 )
 IF NOT EXIST build\imports.done (
+  svn up imports
   copy /y imports\dev-default.build default.build
   nant prep-dev %NANTARGS%
   IF ERRORLEVEL 1 (
     exit /B 1
   )
-  del release\bin\*svn* release\bin\_*.*
+  del release\bin\*svn* release\bin\_*.* 2>nul:
   echo. > build\imports.done
 )
 
@@ -58,6 +59,8 @@ taskkill /im svnsync.exe /f 2> nul:
 taskkill /im httpd.exe /f 2> nul:
 taskkill /im fs-test.exe /f 2> nul:
 taskkill /im op-depth-test.exe /f 2> nul:
+taskkill /im java.exe /f 2> nul:
+taskkill /im perl.exe /f 2> nul:
 IF EXIST "%TESTDIR%\tests\subversion\tests\cmdline\httpd\" (
   rmdir /s /q  "%TESTDIR%\tests\subversion\tests\cmdline\httpd"
 )

Modified: subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-test.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-test.cmd?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-test.cmd (original)
+++ subversion/branches/compressed-pristines/tools/buildbot/slaves/win32-SharpSvn/svntest-test.cmd Thu Aug 16 10:17:48 2012
@@ -51,10 +51,10 @@ IF "%1" == "-r" (
     SET SVN=1
     SHIFT
 ) ELSE IF "%1" == "serf" (
-    SET SERF=1
+    SET DAV=1
     SHIFT
-) ELSE IF "%1" == "neon" (
-    SET NEON=1
+) ELSE IF "%1" == "dav" (
+    SET DAV=1
     SHIFT
 ) ELSE (
     SET ARGS=!ARGS! -t %1
@@ -63,6 +63,7 @@ IF "%1" == "-r" (
 
 IF NOT "%1" == "" GOTO next
 
+taskkill /im svnserve.exe httpd.exe /f 2> nul:
 
 IF NOT EXIST "%TESTDIR%\bin" MKDIR "%TESTDIR%\bin"
 xcopy /y /i ..\deps\release\bin\*.dll "%TESTDIR%\bin"
@@ -76,22 +77,13 @@ IF "%LOCAL%+%FSFS%" == "1+1" (
 )
 
 IF "%SVN%+%FSFS%" == "1+1" (
-  taskkill /im svnserve.exe /f 2> nul:
-  echo win-tests.py -c %PARALLEL% %MODE% -f fsfs -u svn://localhost %ARGS% "%TESTDIR%\tests"
-  win-tests.py -c %PARALLEL% %MODE% -f fsfs -u svn://localhost %ARGS% "%TESTDIR%\tests"
+  echo win-tests.py -c %PARALLEL% %MODE% -f fsfs -u svn://127.0.0.1 %ARGS% "%TESTDIR%\tests"
+  win-tests.py -c %PARALLEL% %MODE% -f fsfs -u svn://127.0.0.1 %ARGS% "%TESTDIR%\tests"
   IF ERRORLEVEL 1 EXIT /B 1
 )
 
-IF "%SERF%+%FSFS%" == "1+1" (
-  taskkill /im httpd.exe /f 2> nul:
-  echo win-tests.py -c %PARALLEL% %MODE% -f fsfs --http-library serf --httpd-dir "%CD%\..\deps\release\httpd" --httpd-port %TESTPORT% -u http://localhost:%TESTPORT% %ARGS% "%TESTDIR%\tests"
-  win-tests.py -c %PARALLEL% %MODE% -f fsfs --http-library serf --httpd-dir "%CD%\..\deps\release\httpd" --httpd-port %TESTPORT% -u http://localhost:%TESTPORT% %ARGS% "%TESTDIR%\tests"
-  IF ERRORLEVEL 1 EXIT /B 1
-)
-
-IF "%NEON%+%FSFS%" == "1+1" (
-  taskkill /im httpd.exe /f 2> nul:
-  echo win-tests.py -c %PARALLEL% %MODE% -f fsfs --http-library neon --httpd-dir "%CD%\..\deps\release\httpd" --httpd-port %TESTPORT% -u http://localhost:%TESTPORT% %ARGS% "%TESTDIR%\tests"
-  win-tests.py -c %PARALLEL% %MODE% -f fsfs --http-library neon --httpd-dir "%CD%\..\deps\release\httpd" --httpd-port %TESTPORT% -u http://localhost:%TESTPORT% %ARGS% "%TESTDIR%\tests"
+IF "%DAV%+%FSFS%" == "1+1" (
+  echo win-tests.py -c %PARALLEL% %MODE% -f fsfs --httpd-dir "%CD%\..\deps\release\httpd" --httpd-port %TESTPORT% -u http://127.0.0.1:%TESTPORT% %ARGS% "%TESTDIR%\tests"
+  win-tests.py -c %PARALLEL% %MODE% -f fsfs --httpd-dir "%CD%\..\deps\release\httpd" --httpd-port %TESTPORT% -u http://127.0.0.1:%TESTPORT% %ARGS% "%TESTDIR%\tests"
   IF ERRORLEVEL 1 EXIT /B 1
 )

Modified: subversion/branches/compressed-pristines/tools/client-side/bash_completion
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/client-side/bash_completion?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/client-side/bash_completion (original)
+++ subversion/branches/compressed-pristines/tools/client-side/bash_completion Thu Aug 16 10:17:48 2012
@@ -479,7 +479,7 @@ _svn()
 
 	    [[ $previous = '--extensions' || $previous = '-x' ]] && \
 		values="--unified --ignore-space-change \
-   		        --ignore-all-space --ignore-eol-style"
+		   --ignore-all-space --ignore-eol-style --show-c-functions"
 
 	    [[ $previous = '--depth' ]] && \
 		values='empty files immediates infinity'
@@ -494,8 +494,8 @@ _svn()
 		    # from svn help resolve
 		    values='base working mine-full theirs-full'
 		else # checkout merge switch update
-		    # not implemented yet: mine-conflict theirs-conflict
-		    values='postpone base mine-full theirs-full edit launch'
+		    values="postpone base mine-full theirs-full edit launch \
+			mine-conflict theirs-conflict"
 		fi
 	    }
 
@@ -889,7 +889,8 @@ _svn()
                          --parents"
 		;;
 	patch)
-		cmdOpts="$qOpts $pOpts --dry-run --ignore-whitespace --reverse-diff --strip"
+		cmdOpts="$qOpts $pOpts --dry-run --ignore-whitespace \
+			--reverse-diff --strip"
 		;;
 	propdel|pdel|pd)
 		cmdOpts="$qOpts -R --recursive $rOpts $pOpts $cOpts \

Propchange: subversion/branches/compressed-pristines/tools/client-side/mergeinfo-sanitizer.py
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: subversion/branches/compressed-pristines/tools/dev/benchmarks/large_dirs/create_bigdir.sh
URL: http://svn.apache.org/viewvc/subversion/branches/compressed-pristines/tools/dev/benchmarks/large_dirs/create_bigdir.sh?rev=1373783&r1=1373782&r2=1373783&view=diff
==============================================================================
--- subversion/branches/compressed-pristines/tools/dev/benchmarks/large_dirs/create_bigdir.sh (original)
+++ subversion/branches/compressed-pristines/tools/dev/benchmarks/large_dirs/create_bigdir.sh Thu Aug 16 10:17:48 2012
@@ -124,6 +124,20 @@ run_svn_del() {
   fi
 }
 
+run_svn_del_many() {
+  printf "\n" > files.lst
+  sequence=`get_sequence 2 ${1}`
+  for i in $sequence; do
+    printf "$WC/${1}_c/$i\n" >> files.lst
+  done
+
+  if [ "${VALGRIND}" = "" ] ; then
+    time ${SVN} del -q --targets files.lst > /dev/null
+  else
+    ${VALGRIND} ${VG_OUTFILE}="${VG_TOOL}.out.del_many.$1" ${SVN} del -q --targets files.lst > /dev/null
+  fi
+}
+
 run_svn_ci() {
   if [ "${VALGRIND}" = "" ] ; then
     time ${SVN} ci $WC/$1 -m "" -q > /dev/null
@@ -185,12 +199,13 @@ while [ $FILECOUNT -lt $MAXCOUNT ]; do
   run_svn_del ${FILECOUNT} 1
 
   printf "\tDeleting files ... \t"
-  time sh -c "
-  for i in $sequence; do
-    ${SVN} del $WC/${FILECOUNT}_c/\$i -q
-  done "
+  if [ "$FILECOUNT" == "1" ] ; then
+    printf " skipped (0 files to delete)\n"
+  else
+    run_svn_del_many ${FILECOUNT}
+  fi
 
-  printf "\tCommit deletions ...\t"
+  printf "\tCommit deletions ..\t"
   run_svn_ci ${FILECOUNT}_c del
 
   rm -rf $WC