You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pr...@apache.org on 2013/06/05 11:22:51 UTC

svn commit: r1489765 [20/22] - in /subversion/branches/verify-keep-going: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ contrib/hook-scripts/ contrib/server-side/fsfsfixer/ contrib/server-side/fsfsfixer/fixer/ notes/ subversion...

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_diff/diff-diff3-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_diff/diff-diff3-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_diff/diff-diff3-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_diff/diff-diff3-test.c Wed Jun  5 09:22:43 2013
@@ -2947,7 +2947,7 @@ struct svn_test_descriptor_t test_funcs[
     SVN_TEST_PASS2(test_identical_suffix,
                    "identical suffix starts at the boundary of a chunk"),
     SVN_TEST_PASS2(test_token_compare,
-                   "compare tokes at the chunk boundary"),
+                   "compare tokens at the chunk boundary"),
     SVN_TEST_PASS2(two_way_issue_3362_v1,
                    "2-way issue #3362 test v1"),
     SVN_TEST_PASS2(two_way_issue_3362_v2,

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_fs/fs-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_fs/fs-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_fs/fs-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_fs/fs-test.c Wed Jun  5 09:22:43 2013
@@ -2074,7 +2074,7 @@ copy_test(const svn_test_opts_t *opts,
   svn_revnum_t after_rev;
 
   /* Prepare a filesystem. */
-  SVN_ERR(svn_test__create_fs(&fs, "test-repo-copy-test",
+  SVN_ERR(svn_test__create_fs(&fs, "test-repo-copy",
                               opts, pool));
 
   /* In first txn, create and commit the greek tree. */
@@ -3755,6 +3755,17 @@ small_file_integrity(const svn_test_opts
 
 
 static svn_error_t *
+almostmedium_file_integrity(const svn_test_opts_t *opts,
+                            apr_pool_t *pool)
+{
+  apr_uint32_t seed = (apr_uint32_t) apr_time_now();
+
+  return file_integrity_helper(SVN_DELTA_WINDOW_SIZE - 1, &seed, opts,
+                               "test-repo-almostmedium-file-integrity", pool);
+}
+
+
+static svn_error_t *
 medium_file_integrity(const svn_test_opts_t *opts,
                       apr_pool_t *pool)
 {
@@ -4237,7 +4248,7 @@ branch_test(const svn_test_opts_t *opts,
   svn_revnum_t youngest_rev = 0;
 
   /* Create a filesystem and repository. */
-  SVN_ERR(svn_test__create_fs(&fs, "test-repo-branch-test",
+  SVN_ERR(svn_test__create_fs(&fs, "test-repo-branch",
                               opts, pool));
 
   /*** Revision 1:  Create the greek tree in revision.  ***/
@@ -4935,7 +4946,7 @@ delete_fs(const svn_test_opts_t *opts,
   return SVN_NO_ERROR;
 }
 
-/* Issue 4340, "fs layer should reject filenames with trailing \n" */
+/* Issue 4340, "filenames containing \n corrupt FSFS repositories" */
 static svn_error_t *
 filename_trailing_newline(const svn_test_opts_t *opts,
                           apr_pool_t *pool)
@@ -4947,7 +4958,7 @@ filename_trailing_newline(const svn_test
   svn_revnum_t youngest_rev = 0;
   svn_error_t *err;
   svn_boolean_t allow_newlines;
-  
+
   /* Some filesystem implementations can handle newlines in filenames
    * and can be white-listed here.
    * Currently, only BDB supports \n in filenames. */
@@ -5055,6 +5066,8 @@ struct svn_test_descriptor_t test_funcs[
                        "check old revisions"),
     SVN_TEST_OPTS_PASS(check_all_revisions,
                        "after each commit, check all revisions"),
+    SVN_TEST_OPTS_PASS(almostmedium_file_integrity,
+                       "create and modify almostmedium file"),
     SVN_TEST_OPTS_PASS(medium_file_integrity,
                        "create and modify medium file"),
     SVN_TEST_OPTS_PASS(large_file_integrity,

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_fs_fs/fs-pack-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_fs_fs/fs-pack-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_fs_fs/fs-pack-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_fs_fs/fs-pack-test.c Wed Jun  5 09:22:43 2013
@@ -71,17 +71,8 @@ write_format(const char *path,
       contents = apr_psprintf(pool, "%d\n", format);
     }
 
-    {
-      const char *path_tmp;
-
-      SVN_ERR(svn_io_write_unique(&path_tmp,
-                                  svn_dirent_dirname(path, pool),
-                                  contents, strlen(contents),
-                                  svn_io_file_del_none, pool));
-
-      /* rename the temp file as the real destination */
-      SVN_ERR(svn_io_file_rename(path_tmp, path, pool));
-    }
+  SVN_ERR(svn_io_write_atomic(path, contents, strlen(contents),
+                              NULL /* copy perms */, pool));
 
   /* And set the perms to make it read only */
   return svn_io_set_file_read_only(path, FALSE, pool);
@@ -256,7 +247,7 @@ large_log(svn_revnum_t rev, apr_size_t l
   svn_stringbuf_appendcstr(temp, "A ");
   for (i = 0; i < count; ++i)
     svn_stringbuf_appendcstr(temp, "very, ");
-  
+
   svn_stringbuf_appendcstr(temp,
     apr_psprintf(pool, "very long message for rev %ld, indeed", rev));
 
@@ -762,7 +753,7 @@ file_hint_at_shard_boundary(const svn_te
   subpool = svn_pool_create(pool);
   SVN_ERR(svn_fs_open(&fs, REPO_NAME, NULL, subpool));
 
-  /* Revision = SHARD_SIZE */ 
+  /* Revision = SHARD_SIZE */
   file_contents = get_rev_contents(SHARD_SIZE, subpool);
   SVN_ERR(svn_fs_begin_txn(&txn, fs, MAX_REV, subpool));
   SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool));
@@ -781,13 +772,57 @@ file_hint_at_shard_boundary(const svn_te
   /* Close the repo. */
   svn_pool_destroy(subpool);
 
-  return err; 
+  return err;
 }
 #undef REPO_NAME
 #undef MAX_REV
 #undef SHARD_SIZE
 
 /* ------------------------------------------------------------------------ */
+#define REPO_NAME "test-repo-fsfs-info"
+#define SHARD_SIZE 3
+#define MAX_REV 5
+static svn_error_t *
+test_info(const svn_test_opts_t *opts,
+          apr_pool_t *pool)
+{
+  svn_fs_t *fs;
+  const svn_fs_fsfs_info_t *fsfs_info;
+  const svn_fs_info_placeholder_t *info;
+
+  SVN_ERR(create_packed_filesystem(REPO_NAME, opts, MAX_REV, SHARD_SIZE,
+                                   pool));
+
+  SVN_ERR(svn_fs_open(&fs, REPO_NAME, NULL, pool));
+  SVN_ERR(svn_fs_info(&info, fs, pool, pool));
+  info = svn_fs_info_dup(info, pool, pool);
+
+  SVN_TEST_STRING_ASSERT(opts->fs_type, info->fs_type);
+
+  /* Bail (with success) on known-untestable scenarios */
+  if (strcmp(opts->fs_type, "fsfs") != 0)
+    return SVN_NO_ERROR;
+
+  fsfs_info = (const void *)info;
+  if (opts->server_minor_version && (opts->server_minor_version < 6))
+    {
+      SVN_TEST_ASSERT(fsfs_info->shard_size == 0);
+      SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev == 0);
+    }
+  else
+    {
+      SVN_TEST_ASSERT(fsfs_info->shard_size == SHARD_SIZE);
+      SVN_TEST_ASSERT(fsfs_info->min_unpacked_rev
+                      == (MAX_REV + 1) / SHARD_SIZE * SHARD_SIZE);
+    }
+
+  return SVN_NO_ERROR;
+}
+#undef REPO_NAME
+#undef SHARD_SIZE
+#undef MAX_REV
+
+/* ------------------------------------------------------------------------ */
 
 /* The test table.  */
 
@@ -812,5 +847,7 @@ struct svn_test_descriptor_t test_funcs[
                        "recover a fully packed filesystem"),
     SVN_TEST_OPTS_PASS(file_hint_at_shard_boundary,
                        "test file hint at shard boundary"),
+    SVN_TEST_OPTS_PASS(test_info,
+                       "test svn_fs_info"),
     SVN_TEST_NULL
   };

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_repos/repos-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_repos/repos-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_repos/repos-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_repos/repos-test.c Wed Jun  5 09:22:43 2013
@@ -1423,15 +1423,15 @@ in_repo_authz(const svn_test_opts_t *opt
    * Create an authz file and put it in the repository.
    * Verify it can be read with an relative URL.
    * Verify it can be read with an absolute URL.
-   * Verify non-existant path does not error out when must_exist is FALSE. 
+   * Verify non-existant path does not error out when must_exist is FALSE.
    * Verify non-existant path does error out when must_exist is TRUE.
    * Verify that an http:// URL produces an error.
    * Verify that an svn:// URL produces an error.
    */
 
   /* What we'll put in the authz file, it's simple since we're not testing
-   * the parsing, just that we got what we expected. */ 
-  authz_contents = 
+   * the parsing, just that we got what we expected. */
+  authz_contents =
     ""                                                                       NL
     ""                                                                       NL
     "[/]"                                                                    NL
@@ -1451,7 +1451,7 @@ in_repo_authz(const svn_test_opts_t *opt
                                       pool));
   SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
   SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(youngest_rev));
-  
+
   repos_root = svn_repos_path(repos, pool);
   SVN_ERR(svn_uri_get_file_url_from_dirent(&repos_url, repos_root, pool));
   authz_url = apr_pstrcat(pool, repos_url, "/authz", (char *)NULL);
@@ -1460,12 +1460,12 @@ in_repo_authz(const svn_test_opts_t *opt
   /* absolute file URL. */
   SVN_ERR(svn_repos_authz_read2(&authz_cfg, authz_url, NULL, TRUE, pool));
   SVN_ERR(authz_check_access(authz_cfg, test_set, pool));
-  
-  /* Non-existant path in the repo with must_exist set to FALSE */ 
+
+  /* Non-existant path in the repo with must_exist set to FALSE */
   SVN_ERR(svn_repos_authz_read2(&authz_cfg, noent_authz_url, NULL,
                                 FALSE, pool));
 
-  /* Non-existant path in the repo with must_exist set to TRUE */ 
+  /* Non-existant path in the repo with must_exist set to TRUE */
   err = svn_repos_authz_read2(&authz_cfg, noent_authz_url, NULL, TRUE, pool);
   if (!err || err->apr_err != SVN_ERR_ILLEGAL_TARGET)
     return svn_error_createf(SVN_ERR_TEST_FAILED, err,
@@ -1601,7 +1601,6 @@ in_repo_groups_authz(const svn_test_opts
 
 
   /* absolute file URLs. */
-  groups_url = apr_pstrcat(pool, repos_url, "/groups", (char *)NULL);
   SVN_ERR(svn_repos_authz_read2(&authz_cfg, authz_url, groups_url, TRUE, pool));
   SVN_ERR(authz_check_access(authz_cfg, test_set, pool));
 
@@ -2035,6 +2034,9 @@ test_path_authz(svn_repos_t *repos,
                                     path_action->copyfrom_path, youngest_rev,
                                     scratch_pool, &out_baton);
         break;
+
+      default:
+        SVN_TEST_ASSERT(FALSE);
     }
 
   /* Don't worry about closing batons, just abort the edit.  Since errors
@@ -3162,7 +3164,7 @@ test_delete_repos(const svn_test_opts_t 
   return SVN_NO_ERROR;
 }
 
-/* Related to issue 4340, "fs layer should reject filenames with trailing \n" */
+/* Related to issue 4340, "filenames containing \n corrupt FSFS repositories" */
 static svn_error_t *
 filename_with_control_chars(const svn_test_opts_t *opts,
                             apr_pool_t *pool)
@@ -3268,7 +3270,7 @@ test_repos_info(const svn_test_opts_t *o
   svn_version_t v1_0_0 = {1, 0, 0, ""};
   svn_version_t v1_4_0 = {1, 4, 0, ""};
   int repos_format;
-  
+
   opts2 = *opts;
 
   opts2.server_minor_version = 3;

Propchange: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Jun  5 09:22:43 2013
@@ -41,3 +41,4 @@ named_atomic-test
 named_atomic-proc-test
 io-test
 io-test-temp
+auth-clear

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/auth-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/auth-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/auth-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/auth-test.c Wed Jun  5 09:22:43 2013
@@ -208,20 +208,21 @@ test_platform_specific_auth_providers(ap
   return SVN_NO_ERROR;
 }
 
-/* Helper for test_auth_clear(). Implements svn_auth_cleanup_callback */
+/* Helper for test_auth_clear(). Implements svn_config_auth_walk_func_t */
 static svn_error_t *
 cleanup_callback(svn_boolean_t *delete_cred,
-                 void *cleanup_baton,
+                 void *walk_baton,
                  const char *cred_kind,
                  const char *realmstring,
-                 const char *provider,
+                 apr_hash_t *cred_hash,
                  apr_pool_t *scratch_pool)
 {
-  if (strcmp(provider, SVN_AUTH__SIMPLE_PASSWORD_TYPE))
-    return SVN_NO_ERROR;
+  svn_auth_baton_t *b = walk_baton;
 
-  SVN_TEST_ASSERT(! strcmp(cred_kind, SVN_AUTH_CRED_SIMPLE));
-  SVN_TEST_ASSERT(! strcmp(realmstring, "<http://my.host> My realm"));
+  SVN_TEST_ASSERT(strcmp(cred_kind, SVN_AUTH_CRED_SIMPLE) == 0);
+  SVN_TEST_ASSERT(strcmp(realmstring, "<http://my.host> My realm") == 0);
+
+  SVN_ERR(svn_auth_forget_credentials(b, cred_kind, realmstring, scratch_pool));
 
   *delete_cred = TRUE;
 
@@ -270,7 +271,7 @@ test_auth_clear(apr_pool_t *pool)
                                      pool));
 
   creds = credentials;
-  SVN_TEST_ASSERT(! strcmp(creds->username, "jrandom"));
+  SVN_TEST_ASSERT(strcmp(creds->username, "jrandom") == 0);
   SVN_TEST_ASSERT(creds->may_save);
 
   /* And tell that they are ok and can be saved */
@@ -290,14 +291,14 @@ test_auth_clear(apr_pool_t *pool)
 
   SVN_TEST_ASSERT(credentials);
   creds = credentials;
-  SVN_TEST_ASSERT(! strcmp(creds->username, "jrandom"));
+  SVN_TEST_ASSERT(strcmp(creds->username, "jrandom") == 0);
   SVN_TEST_ASSERT(creds->may_save);
 
+  /* Use our walker function to delete credentials (and forget them
+     from the auth baton). */
+  SVN_ERR(svn_config_walk_auth_data(auth_dir, cleanup_callback, baton, pool));
 
-  SVN_ERR(svn_auth_cleanup_walk(baton,
-                                cleanup_callback, NULL,
-                                pool));
-
+  /* Finally, they should be gone! */
   SVN_ERR(svn_auth_first_credentials(&credentials,
                                      &state,
                                      SVN_AUTH_CRED_SIMPLE,
@@ -318,13 +319,7 @@ struct svn_test_descriptor_t test_funcs[
     SVN_TEST_NULL,
     SVN_TEST_PASS2(test_platform_specific_auth_providers,
                    "test retrieving platform-specific auth providers"),
-#ifndef SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE
     SVN_TEST_PASS2(test_auth_clear,
                    "test svn_auth_clear()"),
-#else
-    SVN_TEST_WIMP(test_auth_clear,
-                  "test svn_auth_clear()",
-                  "Needs testing with SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE"),
-#endif
     SVN_TEST_NULL
   };

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/cache-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/cache-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/cache-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/cache-test.c Wed Jun  5 09:22:43 2013
@@ -155,8 +155,8 @@ test_memcache_basic(const svn_test_opts_
 
   if (opts->config_file)
     {
-      SVN_ERR(svn_config_read2(&config, opts->config_file,
-                               TRUE, FALSE, pool));
+      SVN_ERR(svn_config_read3(&config, opts->config_file,
+                               TRUE, FALSE, FALSE, pool));
       SVN_ERR(svn_cache__make_memcache_from_config(&memcache, config, pool));
     }
 
@@ -223,8 +223,8 @@ test_memcache_long_key(const svn_test_op
 
   if (opts->config_file)
     {
-      SVN_ERR(svn_config_read2(&config, opts->config_file,
-                               TRUE, FALSE, pool));
+      SVN_ERR(svn_config_read3(&config, opts->config_file,
+                               TRUE, FALSE, FALSE, pool));
       SVN_ERR(svn_cache__make_memcache_from_config(&memcache, config, pool));
     }
 

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/checksum-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/checksum-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/checksum-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/checksum-test.c Wed Jun  5 09:22:43 2013
@@ -103,7 +103,7 @@ test_pseudo_md5(apr_pool_t *pool)
   /* the checksums shall also be different from "proper" MD5 */
   SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, input, 15, pool));
   SVN_TEST_ASSERT(memcmp(digest_15, checksum->digest, sizeof(digest_15)));
-  
+
   SVN_ERR(svn_checksum(&checksum, svn_checksum_md5, input, 31, pool));
   SVN_TEST_ASSERT(memcmp(digest_31, checksum->digest, sizeof(digest_15)));
 
@@ -122,8 +122,8 @@ zero_match(apr_pool_t *pool)
   svn_checksum_t *B_md5;
   svn_checksum_t *A_sha1;
   svn_checksum_t *B_sha1;
-  
-  
+
+
   zero_md5 = svn_checksum_create(svn_checksum_md5, pool);
   SVN_ERR(svn_checksum_clear(zero_md5));
   SVN_ERR(svn_checksum(&A_md5, svn_checksum_md5, "A", 1, pool));

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/compat-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/compat-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/compat-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/compat-test.c Wed Jun  5 09:22:43 2013
@@ -162,7 +162,7 @@ test_version_parsing(apr_pool_t *pool)
         }
     }
   svn_pool_destroy(iterpool);
-  
+
   return SVN_NO_ERROR;
 }
 
@@ -204,7 +204,7 @@ test_version_at_least(apr_pool_t *pool)
         return svn_error_create(SVN_ERR_TEST_FAILED, NULL,
                                 "Expected at-least to be TRUE; got FALSE");
     }
-  
+
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/config-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/config-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/config-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/config-test.c Wed Jun  5 09:22:43 2013
@@ -109,7 +109,7 @@ test_text_retrieval(apr_pool_t *pool)
     SVN_ERR(init_params(pool));
 
   cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
-  SVN_ERR(svn_config_read2(&cfg, cfg_file, TRUE, FALSE, pool));
+  SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, FALSE, FALSE, pool));
 
   /* Test values retrieved from our ConfigParser instance against
      values retrieved using svn_config. */
@@ -160,7 +160,7 @@ test_boolean_retrieval(apr_pool_t *pool)
     SVN_ERR(init_params(pool));
 
   cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
-  SVN_ERR(svn_config_read2(&cfg, cfg_file, TRUE, FALSE, pool));
+  SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, FALSE, FALSE, pool));
 
   for (i = 0; true_keys[i] != NULL; i++)
     {
@@ -220,7 +220,7 @@ test_has_section_case_insensitive(apr_po
     SVN_ERR(init_params(pool));
 
   cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
-  SVN_ERR(svn_config_read2(&cfg, cfg_file, TRUE, FALSE, pool));
+  SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, FALSE, FALSE, pool));
 
   if (! svn_config_has_section(cfg, "section1"))
     return fail(pool, "Failed to find section1");
@@ -250,7 +250,7 @@ test_has_section_case_sensitive(apr_pool
     SVN_ERR(init_params(pool));
 
   cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
-  SVN_ERR(svn_config_read2(&cfg, cfg_file, TRUE, TRUE, pool));
+  SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, TRUE, FALSE, pool));
 
   if (! svn_config_has_section(cfg, "section1"))
     return fail(pool, "Failed to find section1");
@@ -271,6 +271,48 @@ test_has_section_case_sensitive(apr_pool
 }
 
 static svn_error_t *
+test_has_option_case_sensitive(apr_pool_t *pool)
+{
+  svn_config_t *cfg;
+  const char *cfg_file;
+  apr_int64_t value;
+  int i;
+
+  static struct test_dataset {
+    const char *option;
+    apr_int64_t value;
+  } const test_data[] = {
+    { "a", 1 },
+    { "A", 2 },
+    { "B", 3 },
+    { "b", 4 }
+  };
+  static const int test_data_size = sizeof(test_data)/sizeof(*test_data);
+
+  if (!srcdir)
+    SVN_ERR(init_params(pool));
+
+  cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
+  SVN_ERR(svn_config_read3(&cfg, cfg_file, TRUE, TRUE, TRUE, pool));
+
+  for (i = 0; i < test_data_size; ++i)
+    {
+      SVN_ERR(svn_config_get_int64(cfg, &value, "case-sensitive-option",
+                                   test_data[i].option, -1));
+      if (test_data[i].value != value)
+        return fail(pool,
+                    apr_psprintf(pool,
+                                 "case-sensitive-option.%s != %"
+                                 APR_INT64_T_FMT" but %"APR_INT64_T_FMT,
+                                 test_data[i].option,
+                                 test_data[i].value,
+                                 value));
+    }
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
 test_stream_interface(apr_pool_t *pool)
 {
   svn_config_t *cfg;
@@ -283,7 +325,7 @@ test_stream_interface(apr_pool_t *pool)
   cfg_file = apr_pstrcat(pool, srcdir, "/", "config-test.cfg", (char *)NULL);
   SVN_ERR(svn_stream_open_readonly(&stream, cfg_file, pool, pool));
 
-  SVN_ERR(svn_config_parse(&cfg, stream, TRUE, pool));
+  SVN_ERR(svn_config_parse(&cfg, stream, TRUE, TRUE, pool));
 
   /* nominal test to make sure cfg is populated with something since
    * svn_config_parse will happily return an empty cfg if the stream is
@@ -313,6 +355,8 @@ struct svn_test_descriptor_t test_funcs[
                    "test svn_config_has_section (case insensitive)"),
     SVN_TEST_PASS2(test_has_section_case_sensitive,
                    "test svn_config_has_section (case sensitive)"),
+    SVN_TEST_PASS2(test_has_option_case_sensitive,
+                   "test case-sensitive option name lookup"),
     SVN_TEST_PASS2(test_stream_interface,
                    "test svn_config_parse"),
     SVN_TEST_NULL

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/config-test.cfg
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/config-test.cfg?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/config-test.cfg (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/config-test.cfg Wed Jun  5 09:22:43 2013
@@ -55,3 +55,9 @@ false2 = no
 false3 = oFf
 false4 = 0
 bad_false = nyet!
+
+[case-sensitive-option]
+a = 1
+A = 2
+B = 3
+b = 4

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/error-code-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/error-code-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/error-code-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/error-code-test.c Wed Jun  5 09:22:43 2013
@@ -78,6 +78,6 @@ struct svn_test_descriptor_t test_funcs[
   {
     SVN_TEST_NULL,
     SVN_TEST_PASS2(check_error_codes_unique,
-                   "check that error codes are unique"), 
+                   "check that error codes are unique"),
     SVN_TEST_NULL
   };

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/error-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/error-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/error-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/error-test.c Wed Jun  5 09:22:43 2013
@@ -205,8 +205,12 @@ test_error_symbolic_name(apr_pool_t *poo
     { SVN_ERR_WC_NOT_WORKING_COPY, "SVN_ERR_WC_NOT_WORKING_COPY" },
     /* Test an implementation detail. */
     { SVN_ERR_BAD_CATEGORY_START, "SVN_ERR_BAD_CONTAINING_POOL" },
+#ifdef SVN_DEBUG
+    { ENOENT, "ENOENT" },
+    { APR_ENOPOOL, "APR_ENOPOOL" },
+#endif
     /* Test non-errors. */
-    { 1, NULL },
+    { -1, NULL },
     { SVN_ERR_WC_CATEGORY_START - 1, NULL },
     /* Whitebox-test exceptional cases. */
     { SVN_WARNING, "SVN_WARNING" },

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/named_atomic-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/named_atomic-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/named_atomic-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/named_atomic-test.c Wed Jun  5 09:22:43 2013
@@ -118,7 +118,7 @@ static apr_status_t
 cleanup_test_shm(void *arg)
 {
   apr_pool_t *pool = arg;
-  
+
   svn_error_clear(svn_atomic_namespace__cleanup(name_namespace, pool));
   svn_error_clear(svn_atomic_namespace__cleanup(name_namespace1, pool));
   svn_error_clear(svn_atomic_namespace__cleanup(name_namespace2, pool));

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/path-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/path-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/path-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/path-test.c Wed Jun  5 09:22:43 2013
@@ -1685,7 +1685,7 @@ test_path_resolve_repos_relative_url(apr
                                  tests[i].repos_root_url,
                                  result, tests[i].absolute_url);
     }
-  
+
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/revision-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/revision-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/revision-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/revision-test.c Wed Jun  5 09:22:43 2013
@@ -34,6 +34,12 @@ test_revnum_parse(apr_pool_t *pool)
     "",
     "abc",
     "-456",
+    "2147483648",
+    "4294967295",
+    "4300000000",
+    "00000000001",
+    "21474836470",
+    "999999999999999999999999",
     NULL
   };
 
@@ -41,6 +47,8 @@ test_revnum_parse(apr_pool_t *pool)
     "0",
     "12345",
     "12345ABC",
+    "0000000001",
+    "2147483647x",
     NULL
   };
 

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/string-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/string-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/string-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/string-test.c Wed Jun  5 09:22:43 2013
@@ -564,7 +564,7 @@ test_stringbuf_insert(apr_pool_t *pool)
 
   svn_stringbuf_insert(a, 6, a->data + 1, 1);
   SVN_TEST_STRING_ASSERT(a->data, "test hello, ");
-  
+
   svn_stringbuf_insert(a, 12, "world class", 5);
   SVN_TEST_STRING_ASSERT(a->data, "test hello, world");
 

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/subst_translate-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/subst_translate-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/subst_translate-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/subst_translate-test.c Wed Jun  5 09:22:43 2013
@@ -23,12 +23,14 @@
 
 #include <locale.h>
 #include <string.h>
+#include <apr_time.h>
 
 #include "../svn_test.h"
 
 #include "svn_types.h"
 #include "svn_string.h"
 #include "svn_subst.h"
+#include "svn_hash.h"
 
 #define ARRAY_LEN(ary) ((sizeof (ary)) / (sizeof ((ary)[0])))
 
@@ -246,6 +248,258 @@ test_svn_subst_translate_cstring2(apr_po
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+test_svn_subst_build_keywords3(apr_pool_t *pool)
+{
+  /* Test expansion of custom keywords. */
+  struct keywords_tests_data
+    {
+      const char *keyword_name;
+      const char *keywords_string;
+      const char *expanded_keyword;
+      const char *rev;
+      const char *url;
+      const char *repos_root_url;
+      /* Can't test date since expanded value depends on local clock. */
+      const char *author;
+    }
+  tests[] =
+    {
+      {"FOO", "FOO=%P%_%a%_%b%_%%",
+       "trunk/foo.txt stsp foo.txt %",
+       "1234", "http://svn.example.com/repos/trunk/foo.txt",
+       "http://svn.example.com/repos", "stsp"},
+      {"FOO", "FOO=author%_=%_%a",
+       "author = stsp",
+       "1234", "http://svn.example.com/repos/trunk/foo.txt",
+       "http://svn.example.com/repos", "stsp"},
+      {"MyKeyword", "MyKeyword=%r%_%u%_%_%a",
+       "4567 http://svn.example.com/svn/branches/myfile  jrandom",
+       "4567", "http://svn.example.com/svn/branches/myfile",
+       "http://svn.example.com/svn", "jrandom"},
+      {"FreeBSD", "FreeBSD=%H",
+       "head/README 222812  joel", /* date is not expanded in this test */
+       "222812", "http://svn.freebsd.org/base/head/README",
+       "http://svn.freebsd.org/base", "joel"},
+      {"FreeBSD", "FreeBSD=%I",
+       "README 222812  joel", /* date is not expanded in this test */
+       "222812", "http://svn.freebsd.org/base/head/README",
+       "http://svn.freebsd.org/base", "joel"},
+      { NULL, NULL, NULL, NULL, NULL, NULL, NULL}
+  };
+
+  const struct keywords_tests_data *t;
+
+  for (t = tests; t->keyword_name != NULL; t++)
+    {
+      apr_hash_t *kw;
+      svn_string_t *expanded_keyword;
+
+      SVN_ERR(svn_subst_build_keywords3(&kw, t->keywords_string,
+                                        t->rev, t->url, t->repos_root_url,
+                                        0 /* date */, t->author, pool));
+      expanded_keyword = svn_hash_gets(kw, t->keyword_name);
+      SVN_TEST_ASSERT(expanded_keyword != NULL);
+      SVN_TEST_STRING_ASSERT(expanded_keyword->data, t->expanded_keyword);
+    }
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_svn_subst_truncated_keywords(apr_pool_t *pool)
+{
+  svn_string_t *src_string
+    = svn_string_create("$Qq: "
+                        "01234567890123456789012345678901234567890123456789"
+                        "01234567890123456789012345678901234567890123456789"
+                        "01234567890123456789012345678901234567890123456789"
+                        "01234567890123456789012345678901234567890123456789"
+                        "012345678901234567890123456789012345678901234567"
+                        " $", pool);
+  svn_stream_t *src_stream = svn_stream_from_string(src_string, pool);
+  svn_stringbuf_t *dst_stringbuf = svn_stringbuf_create_empty(pool);
+  svn_stream_t *dst_stream = svn_stream_from_stringbuf(dst_stringbuf, pool);
+  apr_hash_t *keywords = apr_hash_make(pool);
+  svn_string_t *expanded
+    = svn_string_create("01234567890123456789012345678901234567890123456789"
+                        "01234567890123456789012345678901234567890123456789"
+                        "01234567890123456789012345678901234567890123456789"
+                        "01234567890123456789012345678901234567890123456789"
+                        "012345678901234567890123456789012345678901234567"
+                        "xxxxxxxxxx",
+                        pool);
+
+  /* The source is already at the maximum length. */
+  SVN_TEST_ASSERT(src_string->len == SVN_KEYWORD_MAX_LEN);
+
+  svn_hash_sets(keywords, "Qq", expanded);
+  dst_stream = svn_subst_stream_translated(dst_stream, NULL, FALSE, keywords,
+                                           TRUE, pool);
+  SVN_ERR(svn_stream_copy3(src_stream, dst_stream, NULL, NULL, pool));
+
+  /* The expanded value would make the keyword longer than the maximum
+     allowed so it must be truncated; the remaining part of the
+     expanded value is the same as the source. */
+  SVN_TEST_STRING_ASSERT(dst_stringbuf->data, src_string->data);
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_one_long_keyword(const char *keyword,
+                      const char *expected,
+                      apr_pool_t *pool)
+{
+  svn_string_t *src_string;
+  svn_stream_t *src_stream, *dst_stream;
+  svn_stringbuf_t *dst_stringbuf, *src_stringbuf;
+  apr_hash_t *keywords = apr_hash_make(pool);
+  svn_string_t *expanded = svn_string_create("abcdefg", pool);
+
+  svn_hash_sets(keywords, keyword, expanded);
+
+  /* Expand */
+  src_string = svn_string_createf(pool, "$%s$", keyword);
+  src_stream = svn_stream_from_string(src_string, pool);
+  dst_stringbuf = svn_stringbuf_create_empty(pool);
+  dst_stream = svn_stream_from_stringbuf(dst_stringbuf, pool);
+  dst_stream = svn_subst_stream_translated(dst_stream, NULL, FALSE, keywords,
+                                           TRUE, pool);
+  SVN_ERR(svn_stream_copy3(src_stream, dst_stream, NULL, NULL, pool));
+
+  SVN_TEST_STRING_ASSERT(dst_stringbuf->data, expected);
+
+  /* Unexpand */
+  src_stringbuf = dst_stringbuf;
+  src_stream = svn_stream_from_stringbuf(src_stringbuf, pool);
+  dst_stringbuf = svn_stringbuf_create_empty(pool);
+  dst_stream = svn_stream_from_stringbuf(dst_stringbuf, pool);
+  dst_stream = svn_subst_stream_translated(dst_stream, NULL, FALSE, keywords,
+                                           FALSE, pool);
+  SVN_ERR(svn_stream_copy3(src_stream, dst_stream, NULL, NULL, pool));
+
+  SVN_TEST_STRING_ASSERT(dst_stringbuf->data, src_string->data);
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_svn_subst_long_keywords(apr_pool_t *pool)
+{
+  /* The longest keyword that can be expanded to a value: there is
+     space for one character in the expanded value. */
+  const char keyword_p1[]
+    = "Q"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "012345678901234567890123456789012345678901234567";
+
+  /* The longest keyword that can be expanded: the value is empty. */ 
+  const char keyword_z[]
+    = "Q"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "0123456789012345678901234567890123456789012345678";
+
+  /* One more than the longest keyword that can be expanded. */
+  const char keyword_m1[]
+    = "Q"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789";
+
+  /* Two more than the longest keyword that can be expanded. */
+  const char keyword_m2[]
+    = "Q"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "0";
+
+  /* Three more than the longest keyword that can be expanded. */
+  const char keyword_m3[]
+    = "Q"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01";
+
+  /* Four more than the longest keyword that can be expanded. */
+  const char keyword_m4[]
+    = "Q"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "012";
+
+  /* Five more than the longest keyword that can be expanded. */
+  const char keyword_m5[]
+    = "Q"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "0123";
+
+  /* Six more than the longest keyword that can be expanded. */
+  const char keyword_m6[]
+    = "Q"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234567890123456789012345678901234567890123456789"
+      "01234";
+
+  SVN_ERR(test_one_long_keyword(keyword_p1,
+                                apr_psprintf(pool, "$%s: a $", keyword_p1),
+                                pool));
+
+  SVN_ERR(test_one_long_keyword(keyword_z,
+                                apr_psprintf(pool, "$%s:  $", keyword_z),
+                                pool));
+
+  SVN_ERR(test_one_long_keyword(keyword_m1,
+                                apr_psprintf(pool, "$%s$", keyword_m1),
+                                pool));
+
+  SVN_ERR(test_one_long_keyword(keyword_m2,
+                                apr_psprintf(pool, "$%s$", keyword_m2),
+                                pool));
+
+  SVN_ERR(test_one_long_keyword(keyword_m3,
+                                apr_psprintf(pool, "$%s$", keyword_m3),
+                                pool));
+
+  SVN_ERR(test_one_long_keyword(keyword_m4,
+                                apr_psprintf(pool, "$%s$", keyword_m4),
+                                pool));
+
+  SVN_ERR(test_one_long_keyword(keyword_m5,
+                                apr_psprintf(pool, "$%s$", keyword_m5),
+                                pool));
+
+  SVN_ERR(test_one_long_keyword(keyword_m6,
+                                apr_psprintf(pool, "$%s$", keyword_m6),
+                                pool));
+
+  return SVN_NO_ERROR;
+}
+
 struct svn_test_descriptor_t test_funcs[] =
   {
     SVN_TEST_NULL,
@@ -257,5 +511,11 @@ struct svn_test_descriptor_t test_funcs[
                    "test repairing svn_subst_translate_string2()"),
     SVN_TEST_PASS2(test_svn_subst_translate_cstring2,
                    "test svn_subst_translate_cstring2()"),
+    SVN_TEST_PASS2(test_svn_subst_build_keywords3,
+                   "test svn_subst_build_keywords3()"),
+    SVN_TEST_PASS2(test_svn_subst_truncated_keywords,
+                   "test truncated keywords (issue 4349)"),
+    SVN_TEST_PASS2(test_svn_subst_long_keywords,
+                   "test long keywords (issue 4350)"),
     SVN_TEST_NULL
   };

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/utf-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/utf-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/utf-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_subr/utf-test.c Wed Jun  5 09:22:43 2013
@@ -25,6 +25,7 @@
 #include "svn_utf.h"
 #include "svn_pools.h"
 
+#include "private/svn_string_private.h"
 #include "private/svn_utf_private.h"
 
 /* Random number seed.  Yes, it's global, just pretend you can't see it. */
@@ -294,6 +295,329 @@ test_utf_cstring_from_utf8_ex2(apr_pool_
   return SVN_NO_ERROR;
 }
 
+/* Test normalization-independent UTF-8 string comparison */
+static svn_error_t *
+test_utf_collated_compare(apr_pool_t *pool)
+{
+  /* Normalized: NFC */
+  static const char nfc[] =
+    "\xe1\xb9\xa8"              /* S with dot above and below */
+    "\xc5\xaf"                  /* u with ring */
+    "\xe1\xb8\x87"              /* b with macron below */
+    "\xe1\xb9\xbd"              /* v with tilde */
+    "\xe1\xb8\x9d"              /* e with breve and cedilla */
+    "\xc8\x91"                  /* r with double grave */
+    "\xc5\xa1"                  /* s with caron */
+    "\xe1\xb8\xaf"              /* i with diaeresis and acute */
+    "\xe1\xbb\x9d"              /* o with grave and hook */
+    "\xe1\xb9\x8b";             /* n with circumflex below */
+
+  /* Normalized: NFD */
+  static const char nfd[] =
+    "S\xcc\xa3\xcc\x87"         /* S with dot above and below */
+    "u\xcc\x8a"                 /* u with ring */
+    "b\xcc\xb1"                 /* b with macron below */
+    "v\xcc\x83"                 /* v with tilde */
+    "e\xcc\xa7\xcc\x86"         /* e with breve and cedilla */
+    "r\xcc\x8f"                 /* r with double grave */
+    "s\xcc\x8c"                 /* s with caron */
+    "i\xcc\x88\xcc\x81"         /* i with diaeresis and acute */
+    "o\xcc\x9b\xcc\x80"         /* o with grave and hook */
+    "n\xcc\xad";                /* n with circumflex below */
+
+  /* Mixed, denormalized */
+  static const char mixup[] =
+    "S\xcc\x87\xcc\xa3"         /* S with dot above and below */
+    "\xc5\xaf"                  /* u with ring */
+    "b\xcc\xb1"                 /* b with macron below */
+    "\xe1\xb9\xbd"              /* v with tilde */
+    "e\xcc\xa7\xcc\x86"         /* e with breve and cedilla */
+    "\xc8\x91"                  /* r with double grave */
+    "s\xcc\x8c"                 /* s with caron */
+    "\xe1\xb8\xaf"              /* i with diaeresis and acute */
+    "o\xcc\x80\xcc\x9b"         /* o with grave and hook */
+    "\xe1\xb9\x8b";             /* n with circumflex below */
+
+  static const char longer[] =
+    "\xe1\xb9\xa8"              /* S with dot above and below */
+    "\xc5\xaf"                  /* u with ring */
+    "\xe1\xb8\x87"              /* b with macron below */
+    "\xe1\xb9\xbd"              /* v with tilde */
+    "\xe1\xb8\x9d"              /* e with breve and cedilla */
+    "\xc8\x91"                  /* r with double grave */
+    "\xc5\xa1"                  /* s with caron */
+    "\xe1\xb8\xaf"              /* i with diaeresis and acute */
+    "\xe1\xbb\x9d"              /* o with grave and hook */
+    "\xe1\xb9\x8b"              /* n with circumflex below */
+    "X";
+
+  static const char shorter[] =
+    "\xe1\xb9\xa8"              /* S with dot above and below */
+    "\xc5\xaf"                  /* u with ring */
+    "\xe1\xb8\x87"              /* b with macron below */
+    "\xe1\xb9\xbd"              /* v with tilde */
+    "\xe1\xb8\x9d"              /* e with breve and cedilla */
+    "\xc8\x91"                  /* r with double grave */
+    "\xc5\xa1"                  /* s with caron */
+    "\xe1\xb8\xaf"              /* i with diaeresis and acute */
+    "\xe1\xbb\x9d";             /* o with grave and hook */
+
+  static const char lowcase[] =
+    "s\xcc\x87\xcc\xa3"         /* s with dot above and below */
+    "\xc5\xaf"                  /* u with ring */
+    "b\xcc\xb1"                 /* b with macron below */
+    "\xe1\xb9\xbd"              /* v with tilde */
+    "e\xcc\xa7\xcc\x86"         /* e with breve and cedilla */
+    "\xc8\x91"                  /* r with double grave */
+    "s\xcc\x8c"                 /* s with caron */
+    "\xe1\xb8\xaf"              /* i with diaeresis and acute */
+    "o\xcc\x80\xcc\x9b"         /* o with grave and hook */
+    "\xe1\xb9\x8b";             /* n with circumflex below */
+
+  static const struct utfcmp_test_t {
+    const char *stra;
+    char op;
+    const char *strb;
+    const char *taga;
+    const char *tagb;
+  } utfcmp_tests[] = {
+    /* Empty key */
+    {"",  '=', "",  "empty",    "empty"},
+    {"",  '<', "a", "empty",    "nonempty"},
+    {"a", '>', "",  "nonempty", "empty"},
+
+    /* Deterministic ordering */
+    {"a", '<', "b", "a", "b"},
+    {"b", '<', "c", "b", "c"},
+    {"a", '<', "c", "a", "c"},
+
+    /* Normalized equality */
+    {nfc,   '=', nfd,    "nfc",   "nfd"},
+    {nfd,   '=', nfc,    "nfd",   "nfc"},
+    {nfc,   '=', mixup,  "nfc",   "mixup"},
+    {nfd,   '=', mixup,  "nfd",   "mixup"},
+    {mixup, '=', nfd,    "mixup", "nfd"},
+    {mixup, '=', nfc,    "mixup", "nfc"},
+
+    /* Key length */
+    {nfc,     '<', longer,    "nfc",     "longer"},
+    {longer,  '>', nfc,       "longer",  "nfc"},
+    {nfd,     '>', shorter,   "nfd",     "shorter"},
+    {shorter, '<', nfd,       "shorter", "nfd"},
+    {mixup,   '<', lowcase,   "mixup",   "lowcase"},
+    {lowcase, '>', mixup,     "lowcase",  "mixup"},
+
+    {NULL, 0, NULL, NULL, NULL}
+  };
+
+
+  const struct utfcmp_test_t *ut;
+  svn_membuf_t bufa, bufb;
+  svn_membuf__create(&bufa, 0, pool);
+  svn_membuf__create(&bufb, 0, pool);
+
+  srand(111);
+  for (ut = utfcmp_tests; ut->stra; ++ut)
+    {
+      const svn_boolean_t implicit_size = (rand() % 17) & 1;
+      const apr_size_t lena = (implicit_size
+                               ? SVN_UTF__UNKNOWN_LENGTH : strlen(ut->stra));
+      const apr_size_t lenb = (implicit_size
+                               ? SVN_UTF__UNKNOWN_LENGTH : strlen(ut->strb));
+      int result;
+
+      SVN_ERR(svn_utf__normcmp(&result,
+                               ut->stra, lena, ut->strb, lenb,
+                               &bufa, &bufb));
+
+      /* UCS-4 debugging dump of the decomposed strings
+      {
+        const apr_int32_t *const ucsbufa = bufa.data;
+        const apr_int32_t *const ucsbufb = bufb.data;
+        apr_size_t i;
+
+        printf("(%c)%7s %c %s\n", ut->op,
+               ut->taga, (!result ? '=' : (result < 0 ? '<' : '>')), ut->tagb);
+
+        for (i = 0; i < bufa.size || i < bufb.size; ++i)
+        {
+          if (i < bufa.size && i < bufb.size)
+            printf("    U+%04X   U+%04X\n", ucsbufa[i], ucsbufb[i]);
+          else if (i < bufa.size)
+            printf("    U+%04X\n", ucsbufa[i]);
+          else
+            printf("             U+%04X\n", ucsbufb[i]);
+        }
+      }
+      */
+
+      if (('=' == ut->op && 0 != result)
+          || ('<' == ut->op && 0 <= result)
+          || ('>' == ut->op && 0 >= result))
+        {
+          return svn_error_createf
+            (SVN_ERR_TEST_FAILED, NULL,
+             "Ut->Op '%s' %c '%s' but '%s' %c '%s'",
+             ut->taga, ut->op, ut->tagb,
+             ut->taga, (!result ? '=' : (result < 0 ? '<' : '>')), ut->tagb);
+        }
+    }
+
+  return SVN_NO_ERROR;
+}
+
+
+
+static svn_error_t *
+test_utf_pattern_match(apr_pool_t *pool)
+{
+  static const struct glob_test_t {
+    svn_boolean_t sql_like;
+    svn_boolean_t matches;
+    const char *pattern;
+    const char *string;
+    const char *escape;
+  } glob_tests[] = {
+#define LIKE_MATCH TRUE, TRUE
+#define LIKE_FAIL  TRUE, FALSE
+#define GLOB_MATCH FALSE, TRUE
+#define GLOB_FAIL  FALSE, FALSE
+
+    {LIKE_FAIL,  "",     "test", NULL},
+    {GLOB_FAIL,  "",     "test", NULL},
+    {LIKE_FAIL,  "",     "%",    NULL},
+    {GLOB_FAIL,  "",     "*",    NULL},
+    {LIKE_FAIL,  "test", "%",    NULL},
+    {GLOB_FAIL,  "test", "*",    NULL},
+    {LIKE_MATCH, "test", "test", NULL},
+    {GLOB_MATCH, "test", "test", NULL},
+    {LIKE_MATCH, "t\xe1\xb8\x9dst", "te\xcc\xa7\xcc\x86st", NULL},
+    {GLOB_MATCH, "te\xcc\xa7\xcc\x86st", "t\xe1\xb8\x9dst", NULL},
+
+    {LIKE_FAIL,  "test", "test", "\xe1\xb8\x9d"}, /* escape char not ascii */
+    {LIKE_FAIL,  "test", "test", ""},             /* empty escape string */
+
+    {LIKE_MATCH, "te#st",    "test",   "#"},
+    {LIKE_FAIL,  "te#st",    "test",   NULL},
+    {GLOB_MATCH, "te\\st",   "test",   NULL},
+    {LIKE_MATCH, "te##st",   "te#st",  "#"},
+    {LIKE_FAIL,  "te##st",   "te#st",  NULL},
+    {GLOB_MATCH, "te\\\\st", "te\\st", NULL},
+    {GLOB_FAIL,  "te\\\\st", "te\\st", "\\"}, /* escape char with glob */
+    {LIKE_FAIL,  "te#%t",    "te%t",   NULL},
+    {LIKE_MATCH, "te#%t",    "te%t",   "#"},
+    {GLOB_MATCH, "te\\*t",   "te*t",   NULL},
+    {LIKE_FAIL,  "te#%t",    "test",   NULL},
+    {GLOB_FAIL,  "te\\*t",   "test",   NULL},
+    {LIKE_FAIL,  "te#_t",    "te_t",   NULL},
+    {LIKE_MATCH, "te#_t",    "te_t",   "#"},
+    {GLOB_MATCH, "te\\?t",   "te?t",   NULL},
+    {LIKE_FAIL,  "te#_t",    "test",   NULL},
+    {LIKE_FAIL,  "te#_t",    "test",   "#"},
+    {GLOB_FAIL,  "te\\?t",   "test",   NULL},
+
+    {LIKE_MATCH, "_est",     "test",   NULL},
+    {GLOB_MATCH, "?est",     "test",   NULL},
+    {LIKE_MATCH, "te_t",     "test",   NULL},
+    {GLOB_MATCH, "te?t",     "test",   NULL},
+    {LIKE_MATCH, "tes_",     "test",   NULL},
+    {GLOB_MATCH, "tes?",     "test",   NULL},
+    {LIKE_FAIL,  "test_",    "test",   NULL},
+    {GLOB_FAIL,  "test?",    "test",   NULL},
+
+    {LIKE_MATCH, "[s%n]",   "[subversion]", NULL},
+    {GLOB_FAIL,  "[s*n]",   "[subversion]", NULL},
+    {LIKE_MATCH, "#[s%n]",  "[subversion]", "#"},
+    {GLOB_MATCH, "\\[s*n]", "[subversion]", NULL},
+
+    {GLOB_MATCH, ".[\\-\\t]", ".t",           NULL},
+    {GLOB_MATCH, "test*?*[a-z]*", "testgoop", NULL},
+    {GLOB_MATCH, "te[^x]t", "test",           NULL},
+    {GLOB_MATCH, "te[^abc]t", "test",         NULL},
+    {GLOB_MATCH, "te[^x]t", "test",           NULL},
+    {GLOB_MATCH, "te[!x]t", "test",           NULL},
+    {GLOB_FAIL,  "te[^x]t", "text",           NULL},
+    {GLOB_FAIL,  "te[^\\x]t", "text",         NULL},
+    {GLOB_FAIL,  "te[^x\\", "text",           NULL},
+    {GLOB_FAIL,  "te[/]t", "text",            NULL},
+    {GLOB_MATCH, "te[r-t]t", "test",          NULL},
+    {GLOB_MATCH, "te[r-Tz]t", "tezt",         NULL},
+    {GLOB_FAIL,  "te[R-T]t", "tent",          NULL},
+/*  {GLOB_MATCH, "tes[]t]", "test",           NULL}, */
+    {GLOB_MATCH, "tes[t-]", "test",           NULL},
+    {GLOB_MATCH, "tes[t-]]", "test]",         NULL},
+    {GLOB_FAIL,  "tes[t-]]", "test",          NULL},
+    {GLOB_FAIL,  "tes[u-]", "test",           NULL},
+    {GLOB_FAIL,  "tes[t-]", "tes[t-]",        NULL},
+    {GLOB_MATCH, "test[/-/]", "test/",        NULL},
+    {GLOB_MATCH, "test[\\/-/]", "test/",      NULL},
+    {GLOB_MATCH, "test[/-\\/]", "test/",      NULL},
+
+#undef LIKE_MATCH
+#undef LIKE_FAIL
+#undef GLOB_MATCH
+#undef GLOB_FAIL
+
+    {FALSE, FALSE, NULL, NULL, NULL}
+  };
+
+  const struct glob_test_t *gt;
+  svn_membuf_t bufa, bufb, bufc;
+  svn_membuf__create(&bufa, 0, pool);
+  svn_membuf__create(&bufb, 0, pool);
+  svn_membuf__create(&bufc, 0, pool);
+
+  srand(79);
+  for (gt = glob_tests; gt->pattern; ++gt)
+    {
+      const svn_boolean_t implicit_size = (rand() % 13) & 1;
+      const apr_size_t lenptn = (implicit_size
+                                 ? SVN_UTF__UNKNOWN_LENGTH
+                                 : strlen(gt->pattern));
+      const apr_size_t lenstr = (implicit_size
+                                 ? SVN_UTF__UNKNOWN_LENGTH
+                                 : strlen(gt->string));
+      const apr_size_t lenesc = (implicit_size
+                                 ? SVN_UTF__UNKNOWN_LENGTH
+                                 : (gt->escape ? strlen(gt->escape) : 0));
+      svn_boolean_t match;
+      svn_error_t *err;
+
+
+      err = svn_utf__glob(&match,
+                          gt->pattern, lenptn,
+                          gt->string, lenstr,
+                          gt->escape, lenesc,
+                          gt->sql_like, &bufa, &bufb, &bufc);
+
+      if (!gt->sql_like && gt->escape && !err)
+        return svn_error_create
+          (SVN_ERR_TEST_FAILED, err, "Failed to detect GLOB ESCAPE");
+
+      if ((err && gt->matches)
+          || (!err && !match != !gt->matches))
+        {
+          if (gt->sql_like)
+            return svn_error_createf
+              (SVN_ERR_TEST_FAILED, err,
+               "Wrong result: %s'%s' LIKE '%s'%s%s%s%s",
+               (gt->matches ? "NOT " : ""), gt->string, gt->pattern,
+               (gt->escape ? " ESCAPE " : ""), (gt->escape ? "'" : ""),
+               (gt->escape ? gt->escape : ""), (gt->escape ? "'" : ""));
+          else
+            return svn_error_createf
+              (SVN_ERR_TEST_FAILED, err, "Wrong result: %s%s GLOB %s",
+               (gt->matches ? "NOT " : ""), gt->string, gt->pattern);
+        }
+
+      if (err)
+        svn_error_clear(err);
+    }
+
+  return SVN_NO_ERROR;
+}
+
+
 
 /* The test table.  */
 
@@ -308,5 +632,9 @@ struct svn_test_descriptor_t test_funcs[
                    "test svn_utf_cstring_to_utf8_ex2"),
     SVN_TEST_PASS2(test_utf_cstring_from_utf8_ex2,
                    "test svn_utf_cstring_from_utf8_ex2"),
+    SVN_TEST_PASS2(test_utf_collated_compare,
+                   "test svn_utf__normcmp"),
+    SVN_TEST_PASS2(test_utf_pattern_match,
+                   "test svn_utf__glob"),
     SVN_TEST_NULL
   };

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/conflict-data-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/conflict-data-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/conflict-data-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/conflict-data-test.c Wed Jun  5 09:22:43 2013
@@ -28,6 +28,7 @@
 #include <apr_hash.h>
 #include <apr_tables.h>
 
+#include "svn_props.h"
 #include "svn_pools.h"
 #include "svn_hash.h"
 #include "svn_types.h"
@@ -54,42 +55,128 @@ fail(apr_pool_t *pool, const char *fmt, 
   return svn_error_create(SVN_ERR_TEST_FAILED, 0, msg);
 }
 
-/* Raise a test error if EXPECTED and ACTUAL differ. */
+/* Assert that two integers are equal. Return an error if not. */
+#define ASSERT_INT_EQ(a, b) \
+  do { \
+    if ((a) != (b)) \
+      return svn_error_createf(SVN_ERR_TEST_FAILED, NULL, \
+                               "failed: ASSERT_INT_EQ(" #a ", " #b ") " \
+                               "-> (%d == %d)", a, b); \
+  } while (0)
+
+/* Assert that two strings are equal or both null. Return an error if not. */
+#define ASSERT_STR_EQ(a, b) \
+  SVN_TEST_STRING_ASSERT(a, b)
+
+/* Assert that two version_t's are equal or both null. Return an error if not. */
+static svn_error_t *
+compare_version(const svn_wc_conflict_version_t *actual,
+                const svn_wc_conflict_version_t *expected)
+{
+  if (actual == NULL && expected == NULL)
+    return SVN_NO_ERROR;
+
+  SVN_TEST_ASSERT(actual && expected);
+  ASSERT_STR_EQ(actual->repos_url,      expected->repos_url);
+  ASSERT_INT_EQ((int)actual->peg_rev,   (int)expected->peg_rev);
+  ASSERT_STR_EQ(actual->path_in_repos,  expected->path_in_repos);
+  ASSERT_INT_EQ(actual->node_kind,      expected->node_kind);
+  return SVN_NO_ERROR;
+}
+
+/* Assert that two conflict descriptions contain exactly the same data
+ * (including names of temporary files), or are both NULL.  Return an
+ * error if not. */
+static svn_error_t *
+compare_conflict(const svn_wc_conflict_description2_t *actual,
+                 const svn_wc_conflict_description2_t *expected)
+{
+  if (actual == NULL && expected == NULL)
+    return SVN_NO_ERROR;
+
+  SVN_TEST_ASSERT(actual && expected);
+
+  ASSERT_INT_EQ(actual->kind,           expected->kind);
+  ASSERT_STR_EQ(actual->local_abspath,  expected->local_abspath);
+  ASSERT_INT_EQ(actual->node_kind,      expected->node_kind);
+  ASSERT_STR_EQ(actual->property_name,  expected->property_name);
+  ASSERT_INT_EQ(actual->is_binary,      expected->is_binary);
+  ASSERT_STR_EQ(actual->mime_type,      expected->mime_type);
+  ASSERT_INT_EQ(actual->action,         expected->action);
+  ASSERT_INT_EQ(actual->reason,         expected->reason);
+  ASSERT_STR_EQ(actual->base_abspath,   expected->base_abspath);
+  ASSERT_STR_EQ(actual->their_abspath,  expected->their_abspath);
+  ASSERT_STR_EQ(actual->my_abspath,     expected->my_abspath);
+  ASSERT_STR_EQ(actual->merged_file,    expected->merged_file);
+  ASSERT_INT_EQ(actual->operation,      expected->operation);
+  SVN_ERR(compare_version(actual->src_left_version,
+                          expected->src_left_version));
+  SVN_ERR(compare_version(actual->src_right_version,
+                          expected->src_right_version));
+  return SVN_NO_ERROR;
+}
+
+/* Assert that a file contains the expected data.  Return an
+ * error if not. */
 static svn_error_t *
-compare_version(const svn_wc_conflict_version_t *expected,
-                const svn_wc_conflict_version_t *actual)
+compare_file_content(const char *file_abspath,
+                     const char *expected_val,
+                     apr_pool_t *scratch_pool)
 {
-  SVN_TEST_STRING_ASSERT(expected->repos_url, actual->repos_url);
-  SVN_TEST_ASSERT(expected->peg_rev == actual->peg_rev);
-  SVN_TEST_STRING_ASSERT(expected->path_in_repos, actual->path_in_repos);
-  SVN_TEST_ASSERT(expected->node_kind == actual->node_kind);
+  svn_stringbuf_t *actual_val;
+
+  SVN_ERR(svn_stringbuf_from_file2(&actual_val, file_abspath, scratch_pool));
+  ASSERT_STR_EQ(actual_val->data, expected_val);
   return SVN_NO_ERROR;
 }
 
-/* Raise a test error if EXPECTED and ACTUAL differ or if ACTUAL is NULL. */
-static svn_error_t *
-compare_conflict(const svn_wc_conflict_description2_t *expected,
-                 const svn_wc_conflict_description2_t *actual)
-{
-  SVN_TEST_ASSERT(actual != NULL);
-
-  SVN_TEST_STRING_ASSERT(expected->local_abspath, actual->local_abspath);
-  SVN_TEST_ASSERT(expected->node_kind == actual->node_kind);
-  SVN_TEST_ASSERT(expected->kind == actual->kind);
-  SVN_TEST_STRING_ASSERT(expected->property_name, actual->property_name);
-  SVN_TEST_ASSERT(expected->is_binary == actual->is_binary);
-  SVN_TEST_STRING_ASSERT(expected->mime_type, actual->mime_type);
-  SVN_TEST_ASSERT(expected->action == actual->action);
-  SVN_TEST_ASSERT(expected->reason == actual->reason);
-  SVN_TEST_STRING_ASSERT(expected->base_abspath, actual->base_abspath);
-  SVN_TEST_STRING_ASSERT(expected->their_abspath, actual->their_abspath);
-  SVN_TEST_STRING_ASSERT(expected->my_abspath, actual->my_abspath);
-  SVN_TEST_STRING_ASSERT(expected->merged_file, actual->merged_file);
-  SVN_TEST_ASSERT(expected->operation == actual->operation);
-  SVN_ERR(compare_version(expected->src_left_version,
-                          actual->src_left_version));
-  SVN_ERR(compare_version(expected->src_right_version,
-                          actual->src_right_version));
+/* Assert that ACTUAL and EXPECTED both represent the same property
+ * conflict, or are both NULL.  Return an error if not.
+ *
+ * Compare the property values found in files named by
+ * ACTUAL->base_abspath, ACTUAL->my_abspath, ACTUAL->merged_abspath
+ * with EXPECTED_BASE_VAL, EXPECTED_MY_VAL, EXPECTED_THEIR_VAL
+ * respectively, ignoring the corresponding fields in EXPECTED. */
+static svn_error_t *
+compare_prop_conflict(const svn_wc_conflict_description2_t *actual,
+                      const svn_wc_conflict_description2_t *expected,
+                      const char *expected_base_val,
+                      const char *expected_my_val,
+                      const char *expected_their_val,
+                      apr_pool_t *scratch_pool)
+{
+  if (actual == NULL && expected == NULL)
+    return SVN_NO_ERROR;
+
+  SVN_TEST_ASSERT(actual && expected);
+  ASSERT_INT_EQ(actual->kind,   svn_wc_conflict_kind_property);
+  ASSERT_INT_EQ(expected->kind, svn_wc_conflict_kind_property);
+
+  ASSERT_STR_EQ(actual->local_abspath,  expected->local_abspath);
+  ASSERT_INT_EQ(actual->node_kind,      expected->node_kind);
+  ASSERT_STR_EQ(actual->property_name,  expected->property_name);
+  ASSERT_INT_EQ(actual->action,         expected->action);
+  ASSERT_INT_EQ(actual->reason,         expected->reason);
+  ASSERT_INT_EQ(actual->operation,      expected->operation);
+  SVN_ERR(compare_version(actual->src_left_version,
+                          expected->src_left_version));
+  SVN_ERR(compare_version(actual->src_right_version,
+                          expected->src_right_version));
+
+  SVN_ERR(compare_file_content(actual->base_abspath, expected_base_val,
+                               scratch_pool));
+  SVN_ERR(compare_file_content(actual->my_abspath, expected_my_val,
+                               scratch_pool));
+  /* Historical wart: for a prop conflict, 'theirs' is in the 'merged_file'
+   * field, and the conflict artifact file is in the 'theirs_abspath' field. */
+  SVN_ERR(compare_file_content(actual->merged_file, expected_their_val,
+                               scratch_pool));
+  /*ASSERT_STR_EQ(actual->theirs_abspath, conflict_artifact_file));*/
+
+  /* These are 'undefined' for a prop conflict */
+  /*ASSERT_INT_EQ(actual->is_binary, expected->is_binary);*/
+  /*ASSERT_STR_EQ(actual->mime_type, expected->mime_type);*/
+
   return SVN_NO_ERROR;
 }
 
@@ -254,11 +341,11 @@ test_read_write_tree_conflicts(const svn
 
     SVN_ERR(svn_wc__get_tree_conflict(&read_conflict, sbox.wc_ctx,
                                       child1_abspath, pool, pool));
-    SVN_ERR(compare_conflict(conflict1, read_conflict));
+    SVN_ERR(compare_conflict(read_conflict, conflict1));
 
     SVN_ERR(svn_wc__get_tree_conflict(&read_conflict, sbox.wc_ctx,
                                       child2_abspath, pool, pool));
-    SVN_ERR(compare_conflict(conflict2, read_conflict));
+    SVN_ERR(compare_conflict(read_conflict, conflict2));
   }
 
   /* Read many */
@@ -540,6 +627,186 @@ test_serialize_tree_conflict(const svn_t
   return SVN_NO_ERROR;
 }
 
+/* A conflict resolver callback baton for test_prop_conflicts(). */
+typedef struct test_prop_conflict_baton_t
+{
+  /* Sets of properties. */
+  apr_hash_t *mine;
+  apr_hash_t *their_old;
+  apr_hash_t *theirs;
+  /* The set of prop names in conflict. */
+  apr_hash_t *conflicts;
+
+  /* We use all the fields of DESC except the base/theirs/mine/merged paths. */
+  svn_wc_conflict_description2_t *desc;
+
+  int conflicts_seen;
+} test_prop_conflict_baton_t;
+
+/* Set *CONFLICT_SKEL_P to a new property conflict skel reflecting the
+ * conflict details given in B. */
+static svn_error_t *
+create_prop_conflict_skel(svn_skel_t **conflict_skel_p,
+                          svn_wc_context_t *wc_ctx,
+                          const test_prop_conflict_baton_t *b,
+                          apr_pool_t *result_pool,
+                          apr_pool_t *scratch_pool)
+{
+  svn_skel_t *conflict_skel = svn_wc__conflict_skel_create(result_pool);
+  const char *marker_abspath;
+  svn_boolean_t complete;
+
+  SVN_ERR(svn_io_write_unique(&marker_abspath,
+                              b->desc->local_abspath,
+                              "conflict-artifact-file-content\n", 6,
+                              svn_io_file_del_none, scratch_pool));
+
+  SVN_ERR(svn_wc__conflict_skel_add_prop_conflict(conflict_skel,
+                                                  wc_ctx->db,
+                                                  b->desc->local_abspath,
+                                                  marker_abspath,
+                                                  b->mine, b->their_old,
+                                                  b->theirs, b->conflicts,
+                                                  result_pool, scratch_pool));
+
+  switch (b->desc->operation)
+    {
+    case svn_wc_operation_update:
+      SVN_ERR(svn_wc__conflict_skel_set_op_update(
+                conflict_skel,
+                b->desc->src_left_version, b->desc->src_right_version,
+                result_pool, scratch_pool));
+      break;
+    case svn_wc_operation_switch:
+      SVN_ERR(svn_wc__conflict_skel_set_op_switch(
+                conflict_skel,
+                b->desc->src_left_version, b->desc->src_right_version,
+                result_pool, scratch_pool));
+      break;
+    case svn_wc_operation_merge:
+      SVN_ERR(svn_wc__conflict_skel_set_op_merge(
+                conflict_skel,
+                b->desc->src_left_version, b->desc->src_right_version,
+                result_pool, scratch_pool));
+      break;
+    default:
+      SVN_ERR_MALFUNCTION();
+    }
+
+  SVN_ERR(svn_wc__conflict_skel_is_complete(&complete, conflict_skel));
+  SVN_TEST_ASSERT(complete);
+  *conflict_skel_p = conflict_skel;
+  return SVN_NO_ERROR;
+}
+
+/* A conflict resolver callback for test_prop_conflicts(), that checks
+ * that the conflict described to it matches the one described in BATON,
+ * and also counts the number of times it is called. */
+static svn_error_t *
+prop_conflict_cb(svn_wc_conflict_result_t **result_p,
+                 const svn_wc_conflict_description2_t *desc,
+                 void *baton,
+                 apr_pool_t *result_pool,
+                 apr_pool_t *scratch_pool)
+{
+  test_prop_conflict_baton_t *b = baton;
+
+  SVN_ERR(compare_prop_conflict(
+            desc, b->desc,
+            svn_prop_get_value(b->their_old, desc->property_name),
+            svn_prop_get_value(b->mine, desc->property_name),
+            svn_prop_get_value(b->theirs, desc->property_name),
+            scratch_pool));
+  b->conflicts_seen++;
+
+  *result_p = svn_wc_create_conflict_result(svn_wc_conflict_choose_postpone,
+                                            NULL /*merged_file*/, result_pool);
+  return SVN_NO_ERROR;
+}
+
+/* Test for correct retrieval of property conflict descriptions from
+ * the WC DB.
+ *
+ * Presently it tests just one prop conflict, and only during the
+ * 'resolve' operation.  We should also test during the 'update'/
+ * 'switch'/'merge' operations.
+ */
+static svn_error_t *
+test_prop_conflicts(const svn_test_opts_t *opts,
+                    apr_pool_t *pool)
+{
+  svn_test__sandbox_t sbox;
+  svn_skel_t *conflict_skel;
+  svn_error_t *err;
+  const char *lock_abspath;
+  test_prop_conflict_baton_t *b = apr_pcalloc(pool, sizeof(*b));
+  svn_wc_conflict_description2_t *desc = apr_pcalloc(pool, sizeof(*desc));
+
+  SVN_ERR(svn_test__sandbox_create(&sbox, "test_prop_conflicts", opts, pool));
+
+  /* Describe a property conflict */
+  b->mine = apr_hash_make(pool);
+  b->their_old = apr_hash_make(pool);
+  b->theirs = apr_hash_make(pool);
+  b->conflicts = apr_hash_make(pool);
+  svn_hash_sets(b->mine, "prop", svn_string_create("Mine", pool));
+  svn_hash_sets(b->their_old, "prop", svn_string_create("Their-Old", pool));
+  svn_hash_sets(b->theirs, "prop", svn_string_create("Theirs", pool));
+  svn_hash_sets(b->conflicts, "prop", "");
+
+  b->desc = desc;
+  desc->local_abspath = sbox.wc_abspath;
+  desc->kind = svn_wc_conflict_kind_property;
+  desc->node_kind = svn_node_dir;
+  desc->operation = svn_wc_operation_update;
+  desc->action = svn_wc_conflict_action_edit;
+  desc->reason = svn_wc_conflict_reason_edited;
+  desc->mime_type = NULL;
+  desc->is_binary = FALSE;
+  desc->property_name = "prop";
+  desc->src_left_version
+    = svn_wc_conflict_version_create2(sbox.repos_url, "uuid",
+                                      "trunk", 12, svn_node_dir, pool);
+  desc->src_right_version = NULL;  /* WC only */
+
+  b->conflicts_seen = 0;
+
+  /* Record a conflict */
+  {
+    apr_pool_t *subpool = svn_pool_create(pool);
+    SVN_ERR(create_prop_conflict_skel(&conflict_skel, sbox.wc_ctx, b,
+                                      pool, subpool));
+    svn_pool_clear(subpool);
+    SVN_ERR(svn_wc__db_op_mark_conflict(sbox.wc_ctx->db,
+                                        sbox.wc_abspath,
+                                        conflict_skel, NULL, subpool));
+    svn_pool_destroy(subpool);
+  }
+
+  /* Test the API for resolving the conflict: check that correct details
+   * of the conflict are returned. */
+  SVN_ERR(svn_wc__acquire_write_lock_for_resolve(&lock_abspath, sbox.wc_ctx,
+                                                 sbox.wc_abspath, pool, pool));
+  err = svn_wc__resolve_conflicts(sbox.wc_ctx, sbox.wc_abspath,
+                                  svn_depth_empty,
+                                  FALSE /* resolve_text */,
+                                  "" /* resolve_prop (ALL props) */,
+                                  FALSE /* resolve_tree */,
+                                  svn_wc_conflict_choose_unspecified,
+                                  prop_conflict_cb, b,
+                                  NULL, NULL, /* cancellation */
+                                  NULL, NULL, /* notification */
+                                  pool);
+
+  SVN_ERR(svn_error_compose_create(err,
+                                   svn_wc__release_write_lock(sbox.wc_ctx,
+                                                              lock_abspath,
+                                                              pool)));
+
+  ASSERT_INT_EQ(b->conflicts_seen, 1);
+  return SVN_NO_ERROR;
+}
+
 /* The test table.  */
 
 struct svn_test_descriptor_t test_funcs[] =
@@ -557,6 +824,8 @@ struct svn_test_descriptor_t test_funcs[
                        "read and write a text conflict"),
     SVN_TEST_OPTS_PASS(test_serialize_tree_conflict,
                        "read and write a tree conflict"),
+    SVN_TEST_OPTS_PASS(test_prop_conflicts,
+                       "test prop conflicts"),
     SVN_TEST_NULL
   };
 

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/db-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/db-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/db-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/db-test.c Wed Jun  5 09:22:43 2013
@@ -343,6 +343,8 @@ create_open(svn_wc__db_t **db,
   SVN_ERR(svn_wc__db_open(db, NULL, FALSE, TRUE, pool, pool));
   SVN_ERR(svn_test__create_fake_wc(*local_abspath, TESTING_DATA, pool, pool));
 
+  svn_test_add_dir_cleanup(*local_abspath);
+
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/entries-compat.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/entries-compat.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/entries-compat.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/entries-compat.c Wed Jun  5 09:22:43 2013
@@ -336,6 +336,8 @@ create_open(svn_wc__db_t **db,
                           TRUE /* enforce_empty_wq */,
                           pool, pool));
 
+  svn_test_add_dir_cleanup(*local_abspath);
+
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/op-depth-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/op-depth-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/op-depth-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/op-depth-test.c Wed Jun  5 09:22:43 2013
@@ -8035,6 +8035,119 @@ move_delete_file_externals(const svn_tes
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+update_with_tree_conflict(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+  svn_test__sandbox_t b;
+
+  SVN_ERR(svn_test__sandbox_create(&b, "update_with_tree_conflict", opts,
+                                   pool));
+
+  SVN_ERR(sbox_wc_mkdir(&b, "A"));
+  SVN_ERR(sbox_wc_mkdir(&b, "A/B"));
+  SVN_ERR(sbox_wc_commit(&b, ""));
+  SVN_ERR(sbox_wc_mkdir(&b, "A/B/C"));
+  SVN_ERR(sbox_wc_commit(&b, ""));
+  SVN_ERR(sbox_wc_update(&b, "", 1));
+  SVN_ERR(sbox_wc_move(&b, "A", "A2"));
+
+  SVN_ERR(sbox_wc_update_depth(&b, "A", 2, svn_depth_empty, FALSE));
+  {
+    nodes_row_t nodes[] = {
+      {0, "",       "normal",       1, ""},
+      {0, "A",      "normal",       2, "A"},
+      {0, "A/B",    "normal",       1, "A/B"},
+      {1, "A",      "base-deleted", NO_COPY_FROM, "A2"},
+      {1, "A/B",    "base-deleted", NO_COPY_FROM},
+      {1, "A2",     "normal",       1, "A", MOVED_HERE},
+      {1, "A2/B",   "normal",       1, "A/B", MOVED_HERE},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  SVN_ERR(sbox_wc_update(&b, "A", 2));
+  {
+    nodes_row_t nodes[] = {
+      {0, "",       "normal",       1, ""},
+      {0, "A",      "normal",       2, "A"},
+      {0, "A/B",    "normal",       2, "A/B"},
+      {0, "A/B/C",  "normal",       2, "A/B/C"},
+      {1, "A",      "base-deleted", NO_COPY_FROM, "A2"},
+      {1, "A/B",    "base-deleted", NO_COPY_FROM},
+      {1, "A/B/C",  "base-deleted", NO_COPY_FROM},
+      {1, "A2",     "normal",       1, "A", MOVED_HERE},
+      {1, "A2/B",   "normal",       1, "A/B", MOVED_HERE},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  /* Second update overwrote the existing tree-conflict and that
+     causes the move-update to assert. */
+  SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_infinity,
+                          svn_wc_conflict_choose_mine_conflict));
+  {
+    nodes_row_t nodes[] = {
+      {0, "",       "normal",       1, ""},
+      {0, "A",      "normal",       2, "A"},
+      {0, "A/B",    "normal",       2, "A/B"},
+      {0, "A/B/C",  "normal",       2, "A/B/C"},
+      {1, "A",      "base-deleted", NO_COPY_FROM, "A2"},
+      {1, "A/B",    "base-deleted", NO_COPY_FROM},
+      {1, "A/B/C",  "base-deleted", NO_COPY_FROM},
+      {1, "A2",     "normal",       2, "A", MOVED_HERE},
+      {1, "A2/B",   "normal",       2, "A/B", MOVED_HERE},
+      {1, "A2/B/C", "normal",       2, "A/B/C", MOVED_HERE},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  /* Same again but second update is A/B rather than A which triggers
+     the problem through open_root rather than open_directory. */
+  SVN_ERR(sbox_wc_revert(&b, "", svn_depth_infinity));
+  SVN_ERR(sbox_wc_update(&b, "", 1));
+  SVN_ERR(sbox_wc_move(&b, "A", "A2"));
+  SVN_ERR(sbox_wc_update_depth(&b, "A", 2, svn_depth_empty, FALSE));
+  SVN_ERR(sbox_wc_update(&b, "A/B", 2));
+  {
+    nodes_row_t nodes[] = {
+      {0, "",       "normal",       1, ""},
+      {0, "A",      "normal",       2, "A"},
+      {0, "A/B",    "normal",       2, "A/B"},
+      {0, "A/B/C",  "normal",       2, "A/B/C"},
+      {1, "A",      "base-deleted", NO_COPY_FROM, "A2"},
+      {1, "A/B",    "base-deleted", NO_COPY_FROM},
+      {1, "A/B/C",  "base-deleted", NO_COPY_FROM},
+      {1, "A2",     "normal",       1, "A", MOVED_HERE},
+      {1, "A2/B",   "normal",       1, "A/B", MOVED_HERE},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+  SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_infinity,
+                          svn_wc_conflict_choose_mine_conflict));
+  {
+    nodes_row_t nodes[] = {
+      {0, "",       "normal",       1, ""},
+      {0, "A",      "normal",       2, "A"},
+      {0, "A/B",    "normal",       2, "A/B"},
+      {0, "A/B/C",  "normal",       2, "A/B/C"},
+      {1, "A",      "base-deleted", NO_COPY_FROM, "A2"},
+      {1, "A/B",    "base-deleted", NO_COPY_FROM},
+      {1, "A/B/C",  "base-deleted", NO_COPY_FROM},
+      {1, "A2",     "normal",       2, "A", MOVED_HERE},
+      {1, "A2/B",   "normal",       2, "A/B", MOVED_HERE},
+      {1, "A2/B/C", "normal",       2, "A/B/C", MOVED_HERE},
+      {0}
+    };
+    SVN_ERR(check_db_rows(&b, "", nodes));
+  }
+
+  return SVN_NO_ERROR;
+}
+
 /* ---------------------------------------------------------------------- */
 /* The list of test functions */
 
@@ -8186,5 +8299,7 @@ struct svn_test_descriptor_t test_funcs[
                        "move retract (issue 4336)"),
     SVN_TEST_OPTS_PASS(move_delete_file_externals,
                        "move/delete file externals (issue 4293)"),
+    SVN_TEST_OPTS_PASS(update_with_tree_conflict,
+                       "update with tree conflict (issue 4347)"),
     SVN_TEST_NULL
   };

Modified: subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/wc-queries-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/wc-queries-test.c?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/wc-queries-test.c (original)
+++ subversion/branches/verify-keep-going/subversion/tests/libsvn_wc/wc-queries-test.c Wed Jun  5 09:22:43 2013
@@ -32,6 +32,17 @@
 #ifdef SVN_SQLITE_INLINE
 /* Include sqlite3 inline, making all symbols private. */
   #define SQLITE_API static
+  #ifdef __APPLE__
+    #include <Availability.h>
+    #if __MAC_OS_X_VERSION_MIN_REQUIRED < 1060
+      /* <libkern/OSAtomic.h> is included on OS X by sqlite3.c, and
+         on old systems (Leopard or older), it cannot be compiled
+         with -std=c89 because it uses inline. This is a work-around. */
+      #define inline __inline__
+      #include <libkern/OSAtomic.h>
+      #undef inline
+    #endif
+  #endif
   #include <sqlite3.c>
 #else
   #include <sqlite3.h>

Modified: subversion/branches/verify-keep-going/subversion/tests/svn_test.h
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/tests/svn_test.h?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/tests/svn_test.h (original)
+++ subversion/branches/verify-keep-going/subversion/tests/svn_test.h Wed Jun  5 09:22:43 2013
@@ -63,12 +63,13 @@ extern "C" {
     SVN_ERR_ASSERT((expected));                                           \
     if (err__ == SVN_NO_ERROR || err__->apr_err != (expected))            \
       return err__ ? svn_error_createf(SVN_ERR_TEST_FAILED, err__,        \
-                                       "Expected error %d but got %d",    \
-                                       (expected),                        \
-                                       err__->apr_err)                    \
+                                       "Expected error %s but got %s",    \
+                                       svn_error_symbolic_name(expected), \
+                                       svn_error_symbolic_name(           \
+                                         err__->apr_err))                 \
                    : svn_error_createf(SVN_ERR_TEST_FAILED, err__,        \
-                                        "Expected error %d but got %s",   \
-                                        (expected),                       \
+                                       "Expected error %s but got %s",    \
+                                       svn_error_symbolic_name(expected), \
                                         "SVN_NO_ERROR");                  \
     svn_error_clear(err__);                                               \
   } while (0)

Modified: subversion/branches/verify-keep-going/tools/buildbot/slaves/bb-openbsd/svnclean.sh
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/tools/buildbot/slaves/bb-openbsd/svnclean.sh?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/tools/buildbot/slaves/bb-openbsd/svnclean.sh (original)
+++ subversion/branches/verify-keep-going/tools/buildbot/slaves/bb-openbsd/svnclean.sh Wed Jun  5 09:22:43 2013
@@ -24,7 +24,7 @@ set -x
 
 branch="$(basename $(svn info . | grep ^URL  | cut -d' ' -f2))"
 (test -h ../svn-trunk || ln -s build ../svn-trunk)
-for i in 6 7; do
+for i in 6 7 8 9 10; do
   (test -h ../svn-1.${i}.x || ln -s build ../svn-1.${i}.x)
 done
 svn update ../../unix-build

Modified: subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd (original)
+++ subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-bindings.cmd Wed Jun  5 09:22:43 2013
@@ -7,9 +7,9 @@ REM   regarding copyright ownership.  Th
 REM   to you under the Apache License, Version 2.0 (the
 REM   "License"); you may not use this file except in compliance
 REM   with the License.  You may obtain a copy of the License at
-REM  
+REM
 REM     http://www.apache.org/licenses/LICENSE-2.0
-REM  
+REM
 REM   Unless required by applicable law or agreed to in writing,
 REM   software distributed under the License is distributed on an
 REM   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

Modified: subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-build-bindings.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-build-bindings.cmd?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-build-bindings.cmd (original)
+++ subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-build-bindings.cmd Wed Jun  5 09:22:43 2013
@@ -7,9 +7,9 @@ REM   regarding copyright ownership.  Th
 REM   to you under the Apache License, Version 2.0 (the
 REM   "License"); you may not use this file except in compliance
 REM   with the License.  You may obtain a copy of the License at
-REM  
+REM
 REM     http://www.apache.org/licenses/LICENSE-2.0
-REM  
+REM
 REM   Unless required by applicable law or agreed to in writing,
 REM   software distributed under the License is distributed on an
 REM   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -30,7 +30,7 @@ IF ERRORLEVEL 1 (
 )
 
 msbuild subversion_vcnet.sln /p:Configuration=Debug /p:Platform=win32 /t:__JAVAHL__ /t:__JAVAHL_TESTS__
-IF ERRORLEVEL 1 EXIT /B 1 
+IF ERRORLEVEL 1 EXIT /B 1
 
 msbuild subversion_vcnet.sln /p:Configuration=Release /p:Platform=win32 /t:__SWIG_PYTHON__ /t:__SWIG_PERL__
-IF ERRORLEVEL 1 EXIT /B 1 
+IF ERRORLEVEL 1 EXIT /B 1

Modified: subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-build.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-build.cmd?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-build.cmd (original)
+++ subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-build.cmd Wed Jun  5 09:22:43 2013
@@ -7,9 +7,9 @@ REM   regarding copyright ownership.  Th
 REM   to you under the Apache License, Version 2.0 (the
 REM   "License"); you may not use this file except in compliance
 REM   with the License.  You may obtain a copy of the License at
-REM  
+REM
 REM     http://www.apache.org/licenses/LICENSE-2.0
-REM  
+REM
 REM   Unless required by applicable law or agreed to in writing,
 REM   software distributed under the License is distributed on an
 REM   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

Modified: subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd (original)
+++ subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-cleanup.cmd Wed Jun  5 09:22:43 2013
@@ -7,9 +7,9 @@ REM   regarding copyright ownership.  Th
 REM   to you under the Apache License, Version 2.0 (the
 REM   "License"); you may not use this file except in compliance
 REM   with the License.  You may obtain a copy of the License at
-REM  
+REM
 REM     http://www.apache.org/licenses/LICENSE-2.0
-REM  
+REM
 REM   Unless required by applicable law or agreed to in writing,
 REM   software distributed under the License is distributed on an
 REM   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

Modified: subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-template.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-template.cmd?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-template.cmd (original)
+++ subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-template.cmd Wed Jun  5 09:22:43 2013
@@ -7,9 +7,9 @@ REM   regarding copyright ownership.  Th
 REM   to you under the Apache License, Version 2.0 (the
 REM   "License"); you may not use this file except in compliance
 REM   with the License.  You may obtain a copy of the License at
-REM  
+REM
 REM     http://www.apache.org/licenses/LICENSE-2.0
-REM  
+REM
 REM   Unless required by applicable law or agreed to in writing,
 REM   software distributed under the License is distributed on an
 REM   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

Modified: subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-test.cmd
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-test.cmd?rev=1489765&r1=1489764&r2=1489765&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-test.cmd (original)
+++ subversion/branches/verify-keep-going/tools/buildbot/slaves/win32-SharpSvn/svntest-test.cmd Wed Jun  5 09:22:43 2013
@@ -7,9 +7,9 @@ REM   regarding copyright ownership.  Th
 REM   to you under the Apache License, Version 2.0 (the
 REM   "License"); you may not use this file except in compliance
 REM   with the License.  You may obtain a copy of the License at
-REM  
+REM
 REM     http://www.apache.org/licenses/LICENSE-2.0
-REM  
+REM
 REM   Unless required by applicable law or agreed to in writing,
 REM   software distributed under the License is distributed on an
 REM   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY