You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by cm...@apache.org on 2012/06/27 17:13:42 UTC

svn commit: r1354571 [28/37] - in /subversion/branches/master-passphrase: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ build/win32/ contrib/client-side/emacs/ contrib/server-side/ notes/ notes/api-errata/1.8/ notes/directory-i...

Modified: subversion/branches/master-passphrase/subversion/svnrdump/dump_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnrdump/dump_editor.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnrdump/dump_editor.c (original)
+++ subversion/branches/master-passphrase/subversion/svnrdump/dump_editor.c Wed Jun 27 15:12:37 2012
@@ -31,6 +31,7 @@
 #include "svn_dirent_uri.h"
 
 #include "private/svn_fspath.h"
+#include "private/svn_subr_private.h"
 
 #include "svnrdump.h"
 
@@ -248,7 +249,7 @@ do_dump_props(svn_stringbuf_t **propstri
 
       /* No text is going to be dumped. Write a couple of newlines and
          wait for the next node/ revision. */
-      SVN_ERR(svn_stream_printf(stream, scratch_pool, "\n\n"));
+      SVN_ERR(svn_stream_puts(stream, "\n\n"));
 
       /* Cleanup so that data is never dumped twice. */
       SVN_ERR(svn_hash__clear(props, scratch_pool));
@@ -267,7 +268,7 @@ do_dump_newlines(struct dump_edit_baton 
 {
   if (trigger_var && *trigger_var)
     {
-      SVN_ERR(svn_stream_printf(eb->stream, pool, "\n\n"));
+      SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
       *trigger_var = FALSE;
     }
   return SVN_NO_ERROR;
@@ -321,18 +322,17 @@ dump_node(struct dump_edit_baton *eb,
       /* We are here after a change_file_prop or change_dir_prop. They
          set up whatever dump_props they needed to- nothing to
          do here but print node action information */
-      SVN_ERR(svn_stream_printf(eb->stream, pool,
-                                SVN_REPOS_DUMPFILE_NODE_ACTION
-                                ": change\n"));
+      SVN_ERR(svn_stream_puts(eb->stream,
+                              SVN_REPOS_DUMPFILE_NODE_ACTION ": change\n"));
       break;
 
     case svn_node_action_replace:
       if (!is_copy)
         {
           /* Node-action: replace */
-          SVN_ERR(svn_stream_printf(eb->stream, pool,
-                                    SVN_REPOS_DUMPFILE_NODE_ACTION
-                                    ": replace\n"));
+          SVN_ERR(svn_stream_puts(eb->stream,
+                                  SVN_REPOS_DUMPFILE_NODE_ACTION
+                                  ": replace\n"));
 
           /* Wait for a change_*_prop to be called before dumping
              anything */
@@ -343,9 +343,8 @@ dump_node(struct dump_edit_baton *eb,
          copyfrom_rev are present: delete the original, and then re-add
          it */
 
-      SVN_ERR(svn_stream_printf(eb->stream, pool,
-                                SVN_REPOS_DUMPFILE_NODE_ACTION
-                                ": delete\n\n"));
+      SVN_ERR(svn_stream_puts(eb->stream,
+                              SVN_REPOS_DUMPFILE_NODE_ACTION ": delete\n\n"));
 
       /* Recurse: Print an additional add-with-history record. */
       SVN_ERR(dump_node(eb, path, kind, svn_node_action_add,
@@ -356,19 +355,18 @@ dump_node(struct dump_edit_baton *eb,
       break;
 
     case svn_node_action_delete:
-      SVN_ERR(svn_stream_printf(eb->stream, pool,
-                                SVN_REPOS_DUMPFILE_NODE_ACTION
-                                ": delete\n"));
+      SVN_ERR(svn_stream_puts(eb->stream,
+                              SVN_REPOS_DUMPFILE_NODE_ACTION ": delete\n"));
 
       /* We can leave this routine quietly now. Nothing more to do-
          print a couple of newlines because we're not dumping props or
          text. */
-      SVN_ERR(svn_stream_printf(eb->stream, pool, "\n\n"));
+      SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
       break;
 
     case svn_node_action_add:
-      SVN_ERR(svn_stream_printf(eb->stream, pool,
-                                SVN_REPOS_DUMPFILE_NODE_ACTION ": add\n"));
+      SVN_ERR(svn_stream_puts(eb->stream,
+                              SVN_REPOS_DUMPFILE_NODE_ACTION ": add\n"));
 
       if (!is_copy)
         {
@@ -811,9 +809,9 @@ close_file(void *file_baton,
       apr_status_t err;
 
       /* Text-delta: true */
-      SVN_ERR(svn_stream_printf(eb->stream, pool,
-                                SVN_REPOS_DUMPFILE_TEXT_DELTA
-                                ": true\n"));
+      SVN_ERR(svn_stream_puts(eb->stream,
+                              SVN_REPOS_DUMPFILE_TEXT_DELTA
+                              ": true\n"));
 
       err = apr_file_info_get(info, APR_FINFO_SIZE, eb->delta_file);
       if (err)
@@ -887,7 +885,7 @@ close_file(void *file_baton,
 
   /* Write a couple of blank lines for matching output with `svnadmin
      dump` */
-  SVN_ERR(svn_stream_printf(eb->stream, pool, "\n\n"));
+  SVN_ERR(svn_stream_puts(eb->stream, "\n\n"));
 
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/master-passphrase/subversion/svnrdump/load_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnrdump/load_editor.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnrdump/load_editor.c (original)
+++ subversion/branches/master-passphrase/subversion/svnrdump/load_editor.c Wed Jun 27 15:12:37 2012
@@ -397,11 +397,6 @@ fetch_base_func(const char **filename,
   svn_stream_t *fstream;
   svn_error_t *err;
 
-  if (svn_path_is_url(path))
-    path = svn_uri_skip_ancestor(rb->pb->root_url, path, scratch_pool);
-  else if (path[0] == '/')
-    path += 1;
-
   if (! SVN_IS_VALID_REVNUM(base_revision))
     base_revision = rb->rev - 1;
 
@@ -438,11 +433,6 @@ fetch_props_func(apr_hash_t **props,
   struct revision_baton *rb = baton;
   svn_node_kind_t node_kind;
 
-  if (svn_path_is_url(path))
-    path = svn_uri_skip_ancestor(rb->pb->root_url, path, scratch_pool);
-  else if (path[0] == '/')
-    path += 1;
-
   if (! SVN_IS_VALID_REVNUM(base_revision))
     base_revision = rb->rev - 1;
 
@@ -484,11 +474,6 @@ fetch_kind_func(svn_kind_t *kind,
   struct revision_baton *rb = baton;
   svn_node_kind_t node_kind;
 
-  if (svn_path_is_url(path))
-    path = svn_uri_skip_ancestor(rb->pb->root_url, path, scratch_pool);
-  else if (path[0] == '/')
-    path += 1;
-
   if (! SVN_IS_VALID_REVNUM(base_revision))
     base_revision = rb->rev - 1;
 
@@ -582,7 +567,7 @@ new_revision_record(void **revision_bato
      several separate operations. It is highly susceptible to race conditions.
      Calculate the revision 'offset' for finding copyfrom sources.
      It might be positive or negative. */
-  rb->rev_offset = (apr_int32_t) (rb->rev) - (head_rev + 1);
+  rb->rev_offset = (apr_int32_t) ((rb->rev) - (head_rev + 1));
 
   /* Stash the oldest (non-zero) dumpstream revision seen. */
   if ((rb->rev > 0) && (!SVN_IS_VALID_REVNUM(pb->oldest_dumpstream_rev)))
@@ -599,6 +584,14 @@ new_revision_record(void **revision_bato
 }
 
 static svn_error_t *
+magic_header_record(int version,
+            void *parse_baton,
+            apr_pool_t *pool)
+{
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
 uuid_record(const char *uuid,
             void *parse_baton,
             apr_pool_t *pool)
@@ -1161,7 +1154,7 @@ svn_rdump__load_dumpstream(svn_stream_t 
                            void *cancel_baton,
                            apr_pool_t *pool)
 {
-  svn_repos_parse_fns2_t *parser;
+  svn_repos_parse_fns3_t *parser;
   struct parse_baton *parse_baton;
   const svn_string_t *lock_string;
   svn_boolean_t be_atomic;
@@ -1178,8 +1171,9 @@ svn_rdump__load_dumpstream(svn_stream_t 
                                            session_url, pool));
 
   parser = apr_pcalloc(pool, sizeof(*parser));
-  parser->new_revision_record = new_revision_record;
+  parser->magic_header_record = magic_header_record;
   parser->uuid_record = uuid_record;
+  parser->new_revision_record = new_revision_record;
   parser->new_node_record = new_node_record;
   parser->set_revision_property = set_revision_property;
   parser->set_node_property = set_node_property;
@@ -1200,7 +1194,7 @@ svn_rdump__load_dumpstream(svn_stream_t 
   parse_baton->last_rev_mapped = SVN_INVALID_REVNUM;
   parse_baton->oldest_dumpstream_rev = SVN_INVALID_REVNUM;
 
-  err = svn_repos_parse_dumpstream2(stream, parser, parse_baton,
+  err = svn_repos_parse_dumpstream3(stream, parser, parse_baton, FALSE,
                                     cancel_func, cancel_baton, pool);
 
   /* If all goes well, or if we're cancelled cleanly, don't leave a

Modified: subversion/branches/master-passphrase/subversion/svnrdump/svnrdump.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnrdump/svnrdump.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnrdump/svnrdump.c (original)
+++ subversion/branches/master-passphrase/subversion/svnrdump/svnrdump.c Wed Jun 27 15:12:37 2012
@@ -217,7 +217,7 @@ replay_revstart(svn_revnum_t revision,
   SVN_ERR(svn_stream_write(stdout_stream, propstring->data,
                            &(propstring->len)));
 
-  SVN_ERR(svn_stream_printf(stdout_stream, pool, "\n"));
+  SVN_ERR(svn_stream_puts(stdout_stream, "\n"));
   SVN_ERR(svn_stream_close(stdout_stream));
 
   SVN_ERR(svn_rdump__get_dump_editor(editor, edit_baton, revision,
@@ -332,7 +332,7 @@ dump_revision_header(svn_ra_session_t *s
   /* The properties */
   SVN_ERR(svn_stream_write(stdout_stream, propstring->data,
                            &(propstring->len)));
-  SVN_ERR(svn_stream_printf(stdout_stream, pool, "\n"));
+  SVN_ERR(svn_stream_puts(stdout_stream, "\n"));
 
   return SVN_NO_ERROR;
 }
@@ -694,7 +694,6 @@ main(int argc, const char **argv)
   apr_getopt_t *os;
   const char *first_arg;
   apr_array_header_t *received_opts;
-  apr_allocator_t *allocator;
   int i;
 
   if (svn_cmdline_init ("svnrdump", stderr) != EXIT_SUCCESS)
@@ -703,13 +702,7 @@ main(int argc, const char **argv)
   /* Create our top-level pool.  Use a separate mutexless allocator,
    * given this application is single threaded.
    */
-  if (apr_allocator_create(&allocator))
-    return EXIT_FAILURE;
-
-  apr_allocator_max_free_set(allocator, SVN_ALLOCATOR_RECOMMENDED_MAX_FREE);
-
-  pool = svn_pool_create_ex(NULL, allocator);
-  apr_allocator_owner_set(allocator, pool);
+  pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
 
   opt_baton = apr_pcalloc(pool, sizeof(*opt_baton));
   opt_baton->start_revision.kind = svn_opt_revision_unspecified;

Modified: subversion/branches/master-passphrase/subversion/svnserve/cyrus_auth.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnserve/cyrus_auth.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnserve/cyrus_auth.c (original)
+++ subversion/branches/master-passphrase/subversion/svnserve/cyrus_auth.c Wed Jun 27 15:12:37 2012
@@ -61,7 +61,7 @@ static int canonicalize_username(sasl_co
                                  char *out, /* the output buffer */
                                  unsigned out_max, unsigned *out_len)
 {
-  int realm_len = strlen(user_realm);
+  size_t realm_len = strlen(user_realm);
   char *pos;
 
   *out_len = inlen;

Modified: subversion/branches/master-passphrase/subversion/svnserve/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnserve/main.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnserve/main.c (original)
+++ subversion/branches/master-passphrase/subversion/svnserve/main.c Wed Jun 27 15:12:37 2012
@@ -147,7 +147,8 @@ void winservice_notify_stop(void)
 #define SVNSERVE_OPT_LOG_FILE        264
 #define SVNSERVE_OPT_CACHE_TXDELTAS  265
 #define SVNSERVE_OPT_CACHE_FULLTEXTS 266
-#define SVNSERVE_OPT_SINGLE_CONN     267
+#define SVNSERVE_OPT_CACHE_REVPROPS  267
+#define SVNSERVE_OPT_SINGLE_CONN     268
 
 static const apr_getopt_option_t svnserve__options[] =
   {
@@ -166,11 +167,11 @@ static const apr_getopt_option_t svnserv
      N_("read configuration from file ARG")},
     {"listen-port",       SVNSERVE_OPT_LISTEN_PORT, 1,
 #ifdef WIN32
-     N_("listen port\n"
+     N_("listen port. The default port is " APR_STRINGIFY(SVN_RA_SVN_PORT) ".\n"
         "                             "
         "[mode: daemon, service, listen-once]")},
 #else
-     N_("listen port\n"
+     N_("listen port. The default port is " APR_STRINGIFY(SVN_RA_SVN_PORT) ".\n"
         "                             "
         "[mode: daemon, listen-once]")},
 #endif
@@ -178,10 +179,14 @@ static const apr_getopt_option_t svnserv
 #ifdef WIN32
      N_("listen hostname or IP address\n"
         "                             "
+        "By default svnserve listens on all addresses.\n"
+        "                             "
         "[mode: daemon, service, listen-once]")},
 #else
      N_("listen hostname or IP address\n"
         "                             "
+        "By default svnserve listens on all addresses.\n"
+        "                             "
         "[mode: daemon, listen-once]")},
 #endif
     {"prefer-ipv6",      '6', 0,
@@ -222,6 +227,14 @@ static const apr_getopt_option_t svnserv
         "Default is yes.\n"
         "                             "
         "[used for FSFS repositories only]")},
+    {"cache-revprops", SVNSERVE_OPT_CACHE_REVPROPS, 1,
+     N_("enable or disable caching of revision properties.\n"
+        "                             "
+        "Consult the documentation before activating this.\n"
+        "                             "
+        "Default is no.\n"
+        "                             "
+        "[used for FSFS repositories only]")},
 #ifdef CONNECTION_HAVE_THREAD_OPTION
     /* ### Making the assumption here that WIN32 never has fork and so
      * ### this option never exists when --service exists. */
@@ -413,7 +426,6 @@ int main(int argc, const char *argv[])
   apr_sockaddr_t *sa;
   apr_pool_t *pool;
   apr_pool_t *connection_pool;
-  apr_allocator_t *allocator;
   svn_error_t *err;
   apr_getopt_t *os;
   int opt;
@@ -483,6 +495,7 @@ int main(int argc, const char *argv[])
   params.memory_cache_size = (apr_uint64_t)-1;
   params.cache_fulltexts = TRUE;
   params.cache_txdeltas = FALSE;
+  params.cache_revprops = FALSE;
 
   while (1)
     {
@@ -626,6 +639,11 @@ int main(int argc, const char *argv[])
              = svn_tristate__from_word(arg) == svn_tristate_true;
           break;
 
+        case SVNSERVE_OPT_CACHE_REVPROPS:
+          params.cache_revprops
+             = svn_tristate__from_word(arg) == svn_tristate_true;
+          break;
+
 #ifdef WIN32
         case SVNSERVE_OPT_SERVICE:
           if (run_mode != run_mode_service)
@@ -928,22 +946,12 @@ int main(int argc, const char *argv[])
         return ERROR_SUCCESS;
 #endif
 
-      /* If we are using fulltext caches etc. we will allocate many large
-         chunks of memory of various sizes outside the cache for those
-         fulltexts. Make sure we use the memory wisely: use an allocator
-         that causes memory fragments to be given back to the OS early. */
-
-      if (apr_allocator_create(&allocator))
-        return EXIT_FAILURE;
-
-      apr_allocator_max_free_set(allocator, SVN_ALLOCATOR_RECOMMENDED_MAX_FREE);
-
       /* Non-standard pool handling.  The main thread never blocks to join
          the connection threads so it cannot clean up after each one.  So
          separate pools that can be cleared at thread exit are used. */
 
-      connection_pool = svn_pool_create_ex(NULL, allocator);
-      apr_allocator_owner_set(allocator, connection_pool);
+      connection_pool
+          = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
 
       status = apr_socket_accept(&usock, sock, connection_pool);
       if (handling_mode == connection_mode_fork)

Modified: subversion/branches/master-passphrase/subversion/svnserve/serve.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnserve/serve.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnserve/serve.c (original)
+++ subversion/branches/master-passphrase/subversion/svnserve/serve.c Wed Jun 27 15:12:37 2012
@@ -1566,7 +1566,12 @@ static svn_error_t *get_dir(svn_ra_svn_c
           svn_node_kind_t entry_kind = svn_node_none;
           svn_filesize_t entry_size = 0;
           svn_boolean_t has_props = FALSE;
-          svn_revnum_t created_rev = 0; /* ### SVN_INVALID_REVNUM  */
+          /* If 'created rev' was not requested, send 0.  We can't use
+           * SVN_INVALID_REVNUM as the tuple field is not optional.
+           * See the email thread on dev@, 2012-03-28, subject
+           * "buildbot failure in ASF Buildbot on svn-slik-w2k3-x64-ra",
+           * <http://svn.haxx.se/dev/archive-2012-03/0655.shtml>. */
+          svn_revnum_t created_rev = 0;
           const char *cdate = NULL;
           const char *last_author = NULL;
 
@@ -1602,7 +1607,7 @@ static svn_error_t *get_dir(svn_ra_svn_c
               /* created_rev, last_author, time */
               SVN_CMD_ERR(svn_repos_get_committed_info(&created_rev,
                                                        &cdate,
-                                                       &last_author, 
+                                                       &last_author,
                                                        root,
                                                        file_path,
                                                        subpool));
@@ -2037,9 +2042,9 @@ static svn_error_t *log_cmd(svn_ra_svn_c
 
   SVN_ERR(log_command(b, conn, pool, "%s",
                       svn_log__log(full_paths, start_rev, end_rev,
-                                   limit, send_changed_paths, strict_node,
-                                   include_merged_revisions, revprops,
-                                   pool)));
+                                   (int) limit, send_changed_paths,
+                                   strict_node, include_merged_revisions,
+                                   revprops, pool)));
 
   /* Get logs.  (Can't report errors back to the client at this point.) */
   lb.fs_path = b->fs_path->data;
@@ -2923,7 +2928,7 @@ repos_path_valid(const char *path)
          consisting of just dots and spaces.  Win32 functions treat
          paths such as ".. " and "......." inconsistently.  Make sure
          no one can escape out of the root. */
-      if (path - s >= 2 && strspn(s, ". ") == path - s)
+      if (path - s >= 2 && strspn(s, ". ") == (size_t)(path - s))
         return FALSE;
 #else  /* ! WIN32 */
       if (path - s == 2 && s[0] == '.' && s[1] == '.')
@@ -3249,6 +3254,8 @@ svn_error_t *serve(svn_ra_svn_conn_t *co
                APR_HASH_KEY_STRING, params->cache_txdeltas ? "1" : "0");
   apr_hash_set(b.fs_config, SVN_FS_CONFIG_FSFS_CACHE_FULLTEXTS,
                APR_HASH_KEY_STRING, params->cache_fulltexts ? "1" : "0");
+  apr_hash_set(b.fs_config, SVN_FS_CONFIG_FSFS_CACHE_REVPROPS,
+               APR_HASH_KEY_STRING, params->cache_revprops ? "1" : "0");
 
   /* Send greeting.  We don't support version 1 any more, so we can
    * send an empty mechlist. */

Modified: subversion/branches/master-passphrase/subversion/svnserve/server.h
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnserve/server.h?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnserve/server.h (original)
+++ subversion/branches/master-passphrase/subversion/svnserve/server.h Wed Jun 27 15:12:37 2012
@@ -116,6 +116,9 @@ typedef struct serve_params_t {
   /* Enable full-text caching for all FSFS repositories. */
   svn_boolean_t cache_fulltexts;
 
+  /* Enable revprop caching for all FSFS repositories. */
+  svn_boolean_t cache_revprops;
+
   /* Size of the in-memory cache (used by FSFS only). */
   apr_uint64_t memory_cache_size;
 

Modified: subversion/branches/master-passphrase/subversion/svnsync/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnsync/main.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnsync/main.c (original)
+++ subversion/branches/master-passphrase/subversion/svnsync/main.c Wed Jun 27 15:12:37 2012
@@ -1888,7 +1888,6 @@ main(int argc, const char *argv[])
   const char *password = NULL, *source_password = NULL, *sync_password = NULL;
   apr_array_header_t *config_options = NULL;
   const char *source_prop_encoding = NULL;
-  apr_allocator_t *allocator;
 
   if (svn_cmdline_init("svnsync", stderr) != EXIT_SUCCESS)
     {
@@ -1902,13 +1901,7 @@ main(int argc, const char *argv[])
   /* Create our top-level pool.  Use a separate mutexless allocator,
    * given this application is single threaded.
    */
-  if (apr_allocator_create(&allocator))
-    return EXIT_FAILURE;
-
-  apr_allocator_max_free_set(allocator, SVN_ALLOCATOR_RECOMMENDED_MAX_FREE);
-
-  pool = svn_pool_create_ex(NULL, allocator);
-  apr_allocator_owner_set(allocator, pool);
+  pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
 
   err = svn_ra_initialize(pool);
   if (err)

Modified: subversion/branches/master-passphrase/subversion/svnsync/sync.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnsync/sync.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnsync/sync.c (original)
+++ subversion/branches/master-passphrase/subversion/svnsync/sync.c Wed Jun 27 15:12:37 2012
@@ -225,9 +225,7 @@ add_directory(const char *path,
   edit_baton_t *eb = pb->edit_baton;
   node_baton_t *b = apr_palloc(pool, sizeof(*b));
 
-  /* if copyfrom_path starts with '/' join rest of copyfrom_path leaving
-   * leading '/' with canonicalized url eb->to_url.
-   */
+  /* if copyfrom_path is an fspath create a proper uri */
   if (copyfrom_path && copyfrom_path[0] == '/')
     copyfrom_path = svn_path_url_add_component2(eb->to_url,
                                                 copyfrom_path + 1, pool);
@@ -276,9 +274,10 @@ add_file(const char *path,
   edit_baton_t *eb = pb->edit_baton;
   node_baton_t *fb = apr_palloc(pool, sizeof(*fb));
 
-  if (copyfrom_path)
-    copyfrom_path = apr_psprintf(pool, "%s%s", eb->to_url,
-                                 svn_path_uri_encode(copyfrom_path, pool));
+  /* if copyfrom_path is an fspath create a proper uri */
+  if (copyfrom_path && copyfrom_path[0] == '/')
+    copyfrom_path = svn_path_url_add_component2(eb->to_url,
+                                                copyfrom_path + 1, pool);
 
   SVN_ERR(eb->wrapped_editor->add_file(path, pb->wrapped_node_baton,
                                        copyfrom_path, copyfrom_rev,

Modified: subversion/branches/master-passphrase/subversion/svnversion/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/svnversion/main.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/svnversion/main.c (original)
+++ subversion/branches/master-passphrase/subversion/svnversion/main.c Wed Jun 27 15:12:37 2012
@@ -122,7 +122,6 @@ main(int argc, const char *argv[])
 {
   const char *wc_path, *trail_url;
   const char *local_abspath;
-  apr_allocator_t *allocator;
   apr_pool_t *pool;
   svn_wc_revision_status_t *res;
   svn_boolean_t no_newline = FALSE, committed = FALSE;
@@ -150,13 +149,7 @@ main(int argc, const char *argv[])
   /* Create our top-level pool.  Use a separate mutexless allocator,
    * given this application is single threaded.
    */
-  if (apr_allocator_create(&allocator))
-    return EXIT_FAILURE;
-
-  apr_allocator_max_free_set(allocator, SVN_ALLOCATOR_RECOMMENDED_MAX_FREE);
-
-  pool = svn_pool_create_ex(NULL, allocator);
-  apr_allocator_owner_set(allocator, pool);
+  pool = apr_allocator_owner_get(svn_pool_create_allocator(FALSE));
 
   /* Check library versions */
   err = check_lib_versions();
@@ -186,10 +179,8 @@ main(int argc, const char *argv[])
       if (APR_STATUS_IS_EOF(status))
         break;
       if (status != APR_SUCCESS)
-        {
-          usage(pool);
-          return EXIT_FAILURE;
-        }
+        usage(pool);  /* this will exit() */
+
       switch (opt)
         {
         case 'n':
@@ -208,8 +199,7 @@ main(int argc, const char *argv[])
           is_version = TRUE;
           break;
         default:
-          usage(pool);
-          return EXIT_FAILURE;
+          usage(pool);  /* this will exit() */
         }
     }
 
@@ -219,10 +209,7 @@ main(int argc, const char *argv[])
       exit(0);
     }
   if (os->ind > argc || os->ind < argc - 2)
-    {
-      usage(pool);
-      return EXIT_FAILURE;
-    }
+    usage(pool);  /* this will exit() */
 
   SVN_INT_ERR(svn_utf_cstring_to_utf8(&wc_path,
                                       (os->ind < argc) ? os->argv[os->ind]

Modified: subversion/branches/master-passphrase/subversion/tests/cmdline/atomic-ra-revprop-change.c
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/tests/cmdline/atomic-ra-revprop-change.c?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/tests/cmdline/atomic-ra-revprop-change.c (original)
+++ subversion/branches/master-passphrase/subversion/tests/cmdline/atomic-ra-revprop-change.c Wed Jun 27 15:12:37 2012
@@ -31,6 +31,7 @@
 #include "svn_pools.h"
 #include "svn_dirent_uri.h"
 #include "svn_ra.h"
+#include "svn_cmdline.h"
 
 #include "private/svn_skel.h"
 
@@ -41,7 +42,7 @@
 #define KEY_NEW_PROPVAL "value"
 
 #define USAGE_MSG \
-  "Usage: %s URL REVISION PROPNAME VALUES_SKEL HTTP_LIBRARY WANT_ERROR\n" \
+  "Usage: %s URL REVISION PROPNAME VALUES_SKEL WANT_ERROR CONFIG_DIR\n" \
   "\n" \
   "VALUES_SKEL is a proplist skel containing pseudo-properties '%s' \n" \
   "and '%s'.  A pseudo-property missing from the skel is interpreted \n" \
@@ -52,83 +53,28 @@
   "the exit code shall be zero.\n"
 
 
-
-/* implements svn_auth_simple_prompt_func_t */
-static svn_error_t *
-aborting_simple_prompt_func(svn_auth_cred_simple_t **cred,
-                            void *baton,
-                            const char *realm,
-                            const char *username,
-                            svn_boolean_t may_save,
-                            apr_pool_t *pool)
-{
-  /* Oops, the jrandom:rayjandom we passed for SVN_AUTH_PARAM_DEFAULT_* failed,
-     and the prompt provider has retried.
-   */
-  SVN_ERR_MALFUNCTION();
-}
-
-/* implements svn_auth_username_prompt_func_t */
-static svn_error_t *
-aborting_username_prompt_func(svn_auth_cred_username_t **cred,
-                              void *baton,
-                              const char *realm,
-                              svn_boolean_t may_save,
-                              apr_pool_t *pool)
-{
-  /* Oops, the jrandom:rayjandom we passed for SVN_AUTH_PARAM_DEFAULT_* failed,
-     and the prompt provider has retried.
-   */
-  SVN_ERR_MALFUNCTION();
-}
-
 static svn_error_t *
 construct_auth_baton(svn_auth_baton_t **auth_baton_p,
+                     const char *config_dir,
                      apr_pool_t *pool)
 {
-  apr_array_header_t *providers;
-  svn_auth_provider_object_t *simple_provider;
-  svn_auth_baton_t *auth_baton;
-
-  /* A bit of dancing just to pass jrandom:rayjandom. */
-  providers = apr_array_make(pool, 2, sizeof(svn_auth_provider_object_t *)),
-  svn_auth_get_simple_prompt_provider(&simple_provider,
-                                      aborting_simple_prompt_func, NULL,
-                                      0, pool);
-  APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = simple_provider;
-  svn_auth_get_username_prompt_provider(&simple_provider,
-                                        aborting_username_prompt_func, NULL,
-                                        0, pool);
-  APR_ARRAY_PUSH(providers, svn_auth_provider_object_t *) = simple_provider;
-  svn_auth_open(&auth_baton, providers, pool);
-  svn_auth_set_parameter(auth_baton,
-                         SVN_AUTH_PARAM_DEFAULT_USERNAME, "jrandom");
-  svn_auth_set_parameter(auth_baton,
-                         SVN_AUTH_PARAM_DEFAULT_PASSWORD, "rayjandom");
-
-  *auth_baton_p = auth_baton;
+  SVN_ERR(svn_cmdline_create_auth_baton(auth_baton_p,
+                                        TRUE  /* non_interactive */,
+                                        "jrandom", "rayjandom",
+                                        config_dir,
+                                        TRUE  /* no_auth_cache */,
+                                        FALSE /* trust_server_cert */,
+                                        NULL, NULL, NULL, pool));
   return SVN_NO_ERROR;
 }
 
 static svn_error_t *
 construct_config(apr_hash_t **config_p,
-                 const char *http_library,
+                 const char *config_dir,
                  apr_pool_t *pool)
 {
-  apr_hash_t *config;
-  svn_config_t *servers;
-
-  /* Populate SERVERS. */
-  SVN_ERR(svn_config_create(&servers, FALSE,  pool));
-  svn_config_set(servers, SVN_CONFIG_SECTION_GLOBAL,
-                 SVN_CONFIG_OPTION_HTTP_LIBRARY, http_library);
-
-  /* Populate CONFIG. */
-  config = apr_hash_make(pool);
-  apr_hash_set(config, SVN_CONFIG_CATEGORY_SERVERS,
-               APR_HASH_KEY_STRING, servers);
+  SVN_ERR(svn_config_get_config(config_p, config_dir, pool));
 
-  *config_p = config;
   return SVN_NO_ERROR;
 }
 
@@ -138,8 +84,8 @@ change_rev_prop(const char *url,
                 const char *propname,
                 const svn_string_t *propval,
                 const svn_string_t *old_value,
-                const char *http_library,
                 svn_boolean_t want_error,
+                const char *config_dir,
                 apr_pool_t *pool)
 {
   svn_ra_callbacks2_t *callbacks;
@@ -149,8 +95,8 @@ change_rev_prop(const char *url,
   svn_error_t *err;
 
   SVN_ERR(svn_ra_create_callbacks(&callbacks, pool));
-  SVN_ERR(construct_auth_baton(&callbacks->auth_baton, pool));
-  SVN_ERR(construct_config(&config, http_library, pool));
+  SVN_ERR(construct_auth_baton(&callbacks->auth_baton, config_dir, pool));
+  SVN_ERR(construct_config(&config, config_dir, pool));
 
   SVN_ERR(svn_ra_open4(&sess, NULL, url, NULL, callbacks, NULL /* baton */,
                        config, pool));
@@ -216,9 +162,9 @@ main(int argc, const char *argv[])
   const char *propname;
   svn_string_t *propval;
   svn_string_t *old_propval;
-  const char *http_library;
   char *digits_end = NULL;
   svn_boolean_t want_error;
+  const char *config_dir;
 
   if (argc != 7)
     {
@@ -240,8 +186,9 @@ main(int argc, const char *argv[])
   revision = strtol(argv[2], &digits_end, 10);
   propname = argv[3];
   SVN_INT_ERR(extract_values_from_skel(&old_propval, &propval, argv[4], pool));
-  http_library = argv[5];
-  want_error = !strcmp(argv[6], "1");
+  want_error = !strcmp(argv[5], "1");
+  config_dir = svn_dirent_canonicalize(argv[6], pool);
+
 
   if ((! SVN_IS_VALID_REVNUM(revision)) || (! digits_end) || *digits_end)
     SVN_INT_ERR(svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
@@ -249,7 +196,7 @@ main(int argc, const char *argv[])
 
   /* Do something. */
   err = change_rev_prop(url, revision, propname, propval, old_propval,
-                        http_library, want_error, pool);
+                        want_error, config_dir, pool);
   if (err)
     {
       svn_handle_error2(err, stderr, FALSE, "atomic-ra-revprop-change: ");

Modified: subversion/branches/master-passphrase/subversion/tests/cmdline/authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/tests/cmdline/authz_tests.py?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/tests/cmdline/authz_tests.py (original)
+++ subversion/branches/master-passphrase/subversion/tests/cmdline/authz_tests.py Wed Jun 27 15:12:37 2012
@@ -1398,6 +1398,59 @@ def upgrade_absent(sbox):
   svntest.actions.run_and_verify_update(sbox.wc_dir, expected_output,
                                         None, None)
 
+@Issue(4183)
+@XFail()
+@Skip(svntest.main.is_ra_type_file)
+def remove_subdir_with_authz_and_tc(sbox):
+  "remove a subdir with authz file"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  sbox.simple_rm('A/B')
+  sbox.simple_commit()
+
+  svntest.main.write_restrictive_svnserve_conf(sbox.repo_dir)
+  svntest.main.write_authz_file(sbox, { "/"      : "*=rw",
+                                        "/A/B/E" : "*="})
+
+  # Now update back to r1. This will reintroduce A/B except A/B/E.
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.remove('A/B/E', 'A/B/E/alpha', 'A/B/E/beta')
+
+  expected_output = svntest.wc.State(wc_dir, {
+    'A/B'               : Item(status='A '),
+    'A/B/F'             : Item(status='A '),
+    'A/B/lambda'        : Item(status='A '),
+  })
+
+  svntest.actions.run_and_verify_update(wc_dir,
+                                        expected_output,
+                                        None,
+                                        expected_status,
+                                        None,
+                                        None, None,
+                                        None, None, False,
+                                        wc_dir, '-r', '1')
+
+  # Perform some edit operation to introduce a tree conflict
+  svntest.main.file_write(sbox.ospath('A/B/lambda'), 'qq')
+
+  # And now update to r2. This tries to delete A/B and causes a tree conflict
+  # ### But is also causes an error in creating the copied state
+  # ###  svn: E220001: Cannot copy '<snip>\A\B\E' excluded by server
+  expected_output = svntest.wc.State(wc_dir, {
+    'A/B'               : Item(status='  ', treeconflict='C'),
+  })
+  svntest.actions.run_and_verify_update(wc_dir,
+                                        expected_output,
+                                        None,
+                                        None,
+                                        None,
+                                        None, None,
+                                        None, None, False,
+                                        wc_dir)
+
 ########################################################################
 # Run the tests
 
@@ -1427,6 +1480,7 @@ test_list = [ None,
               wc_delete,
               wc_commit_error_handling,
               upgrade_absent,
+              remove_subdir_with_authz_and_tc
              ]
 serial_only = True
 

Modified: subversion/branches/master-passphrase/subversion/tests/cmdline/autoprop_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/tests/cmdline/autoprop_tests.py?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/tests/cmdline/autoprop_tests.py (original)
+++ subversion/branches/master-passphrase/subversion/tests/cmdline/autoprop_tests.py Wed Jun 27 15:12:37 2012
@@ -25,7 +25,9 @@
 ######################################################################
 
 # General modules
-import os
+import os, logging
+
+logger = logging.getLogger()
 
 # Our testing module
 import svntest
@@ -47,8 +49,8 @@ def check_proplist(path, exp_out):
 
   props = svntest.tree.get_props([path]).get(path, {})
   if props != exp_out:
-    print("Expected properties: %s" % exp_out)
-    print("Actual properties:   %s" % props)
+    logger.warn("Expected properties: %s", exp_out)
+    logger.warn("Actual properties:   %s", props)
     raise svntest.Failure
 
 

Modified: subversion/branches/master-passphrase/subversion/tests/cmdline/basic_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/tests/cmdline/basic_tests.py?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/tests/cmdline/basic_tests.py (original)
+++ subversion/branches/master-passphrase/subversion/tests/cmdline/basic_tests.py Wed Jun 27 15:12:37 2012
@@ -67,11 +67,11 @@ def basic_checkout(sbox):
                                      wc_dir)
 
   # Make some changes to the working copy
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  mu_path = sbox.ospath('A/mu')
   svntest.main.file_append(mu_path, 'appended mu text')
-  lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
+  lambda_path = sbox.ospath('A/B/lambda')
   os.remove(lambda_path)
-  G_path = os.path.join(wc_dir, 'A', 'D', 'G')
+  G_path = sbox.ospath('A/D/G')
 
   svntest.actions.run_and_verify_svn(None, None, [], 'rm', G_path)
 
@@ -110,7 +110,7 @@ def basic_status(sbox):
 
   svntest.actions.run_and_verify_status(wc_dir, output)
 
-  os.chdir(os.path.join(wc_dir, 'A'))
+  os.chdir(sbox.ospath('A'))
   output = svntest.actions.get_virginal_state("..", 1)
   svntest.actions.run_and_verify_status("..", output)
 
@@ -123,8 +123,8 @@ def basic_commit(sbox):
   wc_dir = sbox.wc_dir
 
   # Make a couple of local mods to files
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
+  mu_path = sbox.ospath('A/mu')
+  rho_path = sbox.ospath('A/D/G/rho')
   svntest.main.file_append(mu_path, 'appended mu text')
   svntest.main.file_append(rho_path, 'new appended text for rho')
 
@@ -159,8 +159,8 @@ def basic_update(sbox):
   svntest.actions.duplicate_dir(wc_dir, wc_backup)
 
   # Make a couple of local mods to files
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
+  mu_path = sbox.ospath('A/mu')
+  rho_path = sbox.ospath('A/D/G/rho')
   svntest.main.file_append(mu_path, 'appended mu text')
   svntest.main.file_append(rho_path, 'new appended text for rho')
 
@@ -205,7 +205,7 @@ def basic_update(sbox):
 
   # Unversioned paths, those that are not immediate children of a versioned
   # path, are skipped and do not raise an error
-  xx_path = os.path.join(wc_dir, 'xx', 'xx')
+  xx_path = sbox.ospath('xx/xx')
   exit_code, out, err = svntest.actions.run_and_verify_svn(
     "update xx/xx",
     ["Skipped '"+xx_path+"'\n",
@@ -326,7 +326,7 @@ def basic_mkdir_wc_with_parents(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  Y_Z_path = os.path.join(wc_dir, 'Y', 'Z')
+  Y_Z_path = sbox.ospath('Y/Z')
 
   svntest.actions.run_and_verify_svn("erroneous mkdir dir/subdir", [],
                                      ".*Try 'svn mkdir --parents' instead.*",
@@ -346,8 +346,8 @@ def basic_mkdir_wc_with_parents(sbox):
 
 
 #----------------------------------------------------------------------
-def basic_corruption(sbox):
-  "basic corruption detection"
+def basic_commit_corruption(sbox):
+  "basic corruption detection on commit"
 
   ## I always wanted a test named "basic_corruption". :-)
   ## Here's how it works:
@@ -358,21 +358,14 @@ def basic_corruption(sbox):
   ##    3. Intentionally corrupt `first/A/.svn/text-base/mu.svn-base'.
   ##    4. Try to commit, expect a failure.
   ##    5. Repair the text-base, commit again, expect success.
-  ##    6. Intentionally corrupt `second/A/.svn/text-base/mu.svn-base'.
-  ##    7. Try to update `second', expect failure.
-  ##    8. Repair the text-base, update again, expect success.
   ##
   ## Here we go...
 
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  # Make the "other" working copy
-  other_wc = sbox.add_wc_path('other')
-  svntest.actions.duplicate_dir(wc_dir, other_wc)
-
   # Make a local mod to mu
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  mu_path = sbox.ospath('A/mu')
   svntest.main.file_append(mu_path, 'appended mu text')
 
   # Created expected output tree for 'svn ci'
@@ -417,6 +410,48 @@ def basic_corruption(sbox):
   svntest.actions.run_and_verify_commit(wc_dir, expected_output,
                                         expected_status, None, wc_dir)
 
+#----------------------------------------------------------------------
+def basic_update_corruption(sbox):
+  "basic corruption detection on update"
+
+  ## I always wanted a test named "basic_corruption". :-)
+  ## Here's how it works:
+  ##
+  ##    1. Make a working copy at rev 1, duplicate it.  Now we have
+  ##        two working copies at rev 1.  Call them first and second.
+  ##    2. Make a local mod to `first/A/mu'.
+  ##    3. Repair the text-base, commit again, expect success.
+  ##    4. Intentionally corrupt `second/A/.svn/text-base/mu.svn-base'.
+  ##    5. Try to update `second', expect failure.
+  ##    6. Repair the text-base, update again, expect success.
+  ##
+  ## Here we go...
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  # Make the "other" working copy
+  other_wc = sbox.add_wc_path('other')
+  svntest.actions.duplicate_dir(wc_dir, other_wc)
+
+  # Make a local mod to mu
+  mu_path = sbox.ospath('A/mu')
+  svntest.main.file_append(mu_path, 'appended mu text')
+
+  # Created expected output tree for 'svn ci'
+  expected_output = wc.State(wc_dir, {
+    'A/mu' : Item(verb='Sending'),
+    })
+
+  # Create expected status tree; all local revisions should be at 1,
+  # but mu should be at revision 2.
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('A/mu', wc_rev=2)
+
+  # This commit should succeed.
+  svntest.actions.run_and_verify_commit(wc_dir, expected_output,
+                                        expected_status, None, wc_dir)
+
   # Create expected output tree for an update of the other_wc.
   expected_output = wc.State(other_wc, {
     'A/mu' : Item(status='U '),
@@ -476,8 +511,8 @@ def basic_merging_update(sbox):
   wc_dir = sbox.wc_dir
 
   # First change the greek tree to make two files 10 lines long
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
+  mu_path = sbox.ospath('A/mu')
+  rho_path = sbox.ospath('A/D/G/rho')
   mu_text = ""
   rho_text = ""
   for x in range(2,11):
@@ -582,8 +617,8 @@ def basic_conflict(sbox):
   svntest.actions.duplicate_dir(wc_dir, wc_backup)
 
   # Make a couple of local mods to files which will be committed
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
+  mu_path = sbox.ospath('A/mu')
+  rho_path = sbox.ospath('A/D/G/rho')
   svntest.main.file_append(mu_path, 'Original appended text for mu\n')
   svntest.main.file_append(rho_path, 'Original appended text for rho\n')
 
@@ -689,9 +724,9 @@ def basic_cleanup(sbox):
   wc_dir = sbox.wc_dir
 
   # Lock some directories.
-  B_path = os.path.join(wc_dir, 'A', 'B')
-  G_path = os.path.join(wc_dir, 'A', 'D', 'G')
-  C_path = os.path.join(wc_dir, 'A', 'C')
+  B_path = sbox.ospath('A/B')
+  G_path = sbox.ospath('A/D/G')
+  C_path = sbox.ospath('A/C')
   svntest.actions.lock_admin_dir(B_path)
   svntest.actions.lock_admin_dir(G_path)
   svntest.actions.lock_admin_dir(C_path)
@@ -727,11 +762,11 @@ def basic_revert(sbox):
   wc_dir = sbox.wc_dir
 
   # Modify some files and props.
-  beta_path = os.path.join(wc_dir, 'A', 'B', 'E', 'beta')
-  gamma_path = os.path.join(wc_dir, 'A', 'D', 'gamma')
-  iota_path = os.path.join(wc_dir, 'iota')
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
-  zeta_path = os.path.join(wc_dir, 'A', 'D', 'H', 'zeta')
+  beta_path = sbox.ospath('A/B/E/beta')
+  gamma_path = sbox.ospath('A/D/gamma')
+  iota_path = sbox.ospath('iota')
+  rho_path = sbox.ospath('A/D/G/rho')
+  zeta_path = sbox.ospath('A/D/H/zeta')
   svntest.main.file_append(beta_path, "Added some text to 'beta'.\n")
   svntest.main.file_append(iota_path, "Added some text to 'iota'.\n")
   svntest.main.file_append(rho_path, "Added some text to 'rho'.\n")
@@ -808,7 +843,7 @@ def basic_revert(sbox):
 
   # Check that a directory scheduled to be added, but physically
   # removed, can be reverted.
-  X_path = os.path.join(wc_dir, 'X')
+  X_path = sbox.ospath('X')
 
   svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', X_path)
 
@@ -826,7 +861,7 @@ def basic_revert(sbox):
 
   # Check that a directory scheduled for deletion, but physically
   # removed, can be reverted.
-  E_path = os.path.join(wc_dir, 'A', 'B', 'E')
+  E_path = sbox.ospath('A/B/E')
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
 
   ### Most of the rest of this test is ineffective, due to the
@@ -892,7 +927,7 @@ def basic_switch(sbox):
   ### Switch the file `iota' to `A/D/gamma'.
 
   # Construct some paths for convenience
-  iota_path = os.path.join(wc_dir, 'iota')
+  iota_path = sbox.ospath('iota')
   gamma_url = sbox.repo_url + '/A/D/gamma'
 
   # Create expected output tree
@@ -926,7 +961,7 @@ def basic_switch(sbox):
   ### Switch the directory `A/D/H' to `A/D/G'.
 
   # Construct some paths for convenience
-  ADH_path = os.path.join(wc_dir, 'A', 'D', 'H')
+  ADH_path = sbox.ospath('A/D/H')
   chi_path = os.path.join(ADH_path, 'chi')
   omega_path = os.path.join(ADH_path, 'omega')
   psi_path = os.path.join(ADH_path, 'psi')
@@ -1009,22 +1044,22 @@ def basic_delete(sbox):
   wc_dir = sbox.wc_dir
 
   # modify text of chi
-  chi_parent_path = os.path.join(wc_dir, 'A', 'D', 'H')
+  chi_parent_path = sbox.ospath('A/D/H')
   chi_path = os.path.join(chi_parent_path, 'chi')
   svntest.main.file_append(chi_path, 'added to chi')
 
   # modify props of rho (file)
-  rho_parent_path = os.path.join(wc_dir, 'A', 'D', 'G')
+  rho_parent_path = sbox.ospath('A/D/G')
   rho_path = os.path.join(rho_parent_path, 'rho')
   svntest.main.run_svn(None, 'ps', 'abc', 'def', rho_path)
 
   # modify props of F (dir)
-  F_parent_path = os.path.join(wc_dir, 'A', 'B')
+  F_parent_path = sbox.ospath('A/B')
   F_path = os.path.join(F_parent_path, 'F')
   svntest.main.run_svn(None, 'ps', 'abc', 'def', F_path)
 
   # unversioned file
-  sigma_parent_path = os.path.join(wc_dir, 'A', 'C')
+  sigma_parent_path = sbox.ospath('A/C')
   sigma_path = os.path.join(sigma_parent_path, 'sigma')
   svntest.main.file_append(sigma_path, 'unversioned sigma')
 
@@ -1034,13 +1069,13 @@ def basic_delete(sbox):
   os.mkdir(Q_path)
 
   # added directory hierarchies
-  X_parent_path =  os.path.join(wc_dir, 'A', 'B')
+  X_parent_path =  sbox.ospath('A/B')
   X_path = os.path.join(X_parent_path, 'X')
   svntest.main.run_svn(None, 'mkdir', X_path)
   X_child_path = os.path.join(X_path, 'xi')
   svntest.main.file_append(X_child_path, 'added xi')
   svntest.main.run_svn(None, 'add', X_child_path)
-  Y_parent_path = os.path.join(wc_dir, 'A', 'D')
+  Y_parent_path = sbox.ospath('A/D')
   Y_path = os.path.join(Y_parent_path, 'Y')
   svntest.main.run_svn(None, 'mkdir', Y_path)
 
@@ -1089,7 +1124,7 @@ def basic_delete(sbox):
   svntest.actions.run_and_verify_status(wc_dir, expected_output)
 
   # 'svn rm' that should work
-  E_path =  os.path.join(wc_dir, 'A', 'B', 'E')
+  E_path =  sbox.ospath('A/B/E')
   svntest.actions.run_and_verify_svn(None, None, [], 'rm', E_path)
 
   # 'svn rm --force' that should work
@@ -1109,13 +1144,13 @@ def basic_delete(sbox):
                                      'rm', '--force', X_path)
 
   # Deleting already removed from wc versioned item with --force
-  iota_path = os.path.join(wc_dir, 'iota')
+  iota_path = sbox.ospath('iota')
   os.remove(iota_path)
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'rm', '--force', iota_path)
 
   # and without --force
-  gamma_path = os.path.join(wc_dir, 'A', 'D', 'gamma')
+  gamma_path = sbox.ospath('A/D/gamma')
   os.remove(gamma_path)
   svntest.actions.run_and_verify_svn(None, None, [], 'rm', gamma_path)
 
@@ -1179,7 +1214,7 @@ def basic_delete(sbox):
     raise svntest.Failure
 
   # Deleting unversioned file explicitly
-  foo_path = os.path.join(wc_dir, 'foo')
+  foo_path = sbox.ospath('foo')
   svntest.main.file_append(foo_path, 'unversioned foo')
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'rm', '--force', foo_path)
@@ -1208,7 +1243,7 @@ def basic_checkout_deleted(sbox):
   wc_dir = sbox.wc_dir
 
   # Delete A/D and commit.
-  D_path = os.path.join(wc_dir, 'A', 'D')
+  D_path = sbox.ospath('A/D')
   svntest.actions.run_and_verify_svn("error scheduling A/D for deletion",
                                      None, [], 'rm', '--force', D_path)
 
@@ -1227,7 +1262,7 @@ def basic_checkout_deleted(sbox):
 
   # Now try to checkout revision 1 of A/D.
   url = sbox.repo_url + '/A/D'
-  wc2 = os.path.join(sbox.wc_dir, 'new_D')
+  wc2 = sbox.ospath('new_D')
   svntest.actions.run_and_verify_svn("error checking out r1 of A/D",
                                      None, [], 'co', '-r', '1',
                                      url + "@1", wc2)
@@ -1244,7 +1279,7 @@ def basic_node_kind_change(sbox):
   wc_dir = sbox.wc_dir
 
   # Schedule a file for deletion
-  gamma_path = os.path.join(wc_dir, 'A', 'D', 'gamma')
+  gamma_path = sbox.ospath('A/D/gamma')
   svntest.main.run_svn(None, 'rm', gamma_path)
 
   # Status shows deleted file
@@ -1299,7 +1334,7 @@ def basic_import(sbox):
   wc_dir = sbox.wc_dir
 
   # create a new directory with files of various permissions
-  new_path = os.path.join(wc_dir, 'new_file')
+  new_path = sbox.ospath('new_file')
 
   svntest.main.file_append(new_path, "some text")
 
@@ -1357,7 +1392,7 @@ def basic_cat(sbox):
   sbox.build(read_only = True)
   wc_dir = sbox.wc_dir
 
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
+  mu_path = sbox.ospath('A/mu')
 
   # Get repository text even if wc is modified
   svntest.main.file_append(mu_path, "some text")
@@ -1393,22 +1428,22 @@ def basic_ls(sbox):
   svntest.actions.run_and_verify_svn('ls a working copy directory',
                                      ['B/\n', 'C/\n', 'D/\n', 'mu\n'],
                                      [], 'ls',
-                                     os.path.join(wc_dir, 'A'))
+                                     sbox.ospath('A'))
 
   svntest.actions.run_and_verify_svn('ls working copy directory with -r BASE',
                                      ['B/\n', 'C/\n', 'D/\n', 'mu\n'],
                                      [], 'ls', '-r', 'BASE',
-                                     os.path.join(wc_dir, 'A'))
+                                     sbox.ospath('A'))
 
   svntest.actions.run_and_verify_svn('ls a single file',
                                      ['mu\n'],
                                      [], 'ls',
-                                     os.path.join(wc_dir, 'A', 'mu'))
+                                     sbox.ospath('A/mu'))
 
   svntest.actions.run_and_verify_svn('recursive ls',
                                      ['E/\n', 'E/alpha\n', 'E/beta\n', 'F/\n',
                                       'lambda\n' ], [], 'ls', '-R',
-                                     os.path.join(wc_dir, 'A', 'B'))
+                                     sbox.ospath('A/B'))
 
 
 #----------------------------------------------------------------------
@@ -1474,16 +1509,16 @@ def basic_auth_cache(sbox):
                                      repo_url, wc_dir)
 
   # Failed with "not locked" error on missing directory
-  svntest.main.safe_rmtree(os.path.join(wc_dir, 'A', 'B', 'E'))
+  svntest.main.safe_rmtree(sbox.ospath('A/B/E'))
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'status', '-u',
-                                     os.path.join(wc_dir, 'A', 'B'))
+                                     sbox.ospath('A/B'))
 
   # Failed with "already locked" error on new dir
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'copy',
                                      repo_url + '/A/B/E',
-                                     os.path.join(wc_dir, 'A', 'D', 'G'))
+                                     sbox.ospath('A/D/G'))
 
 
 #----------------------------------------------------------------------
@@ -1500,7 +1535,7 @@ def basic_add_ignores(sbox):
   sbox.build(read_only = True)
   wc_dir = sbox.wc_dir
 
-  dir_path = os.path.join(wc_dir, 'dir')
+  dir_path = sbox.ospath('dir')
   foo_c_path = os.path.join(dir_path, 'foo.c')
   foo_o_path = os.path.join(dir_path, 'foo.o')
 
@@ -1530,7 +1565,7 @@ def basic_add_local_ignores(sbox):
   sbox.build(read_only = True)
   wc_dir = sbox.wc_dir
 
-  dir_path = os.path.join(wc_dir, 'dir')
+  dir_path = sbox.ospath('dir')
   file_path = os.path.join(dir_path, 'app.lock')
 
   svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput, [],
@@ -1548,7 +1583,7 @@ def basic_add_no_ignores(sbox):
   sbox.build(read_only = True)
   wc_dir = sbox.wc_dir
 
-  dir_path = os.path.join(wc_dir, 'dir')
+  dir_path = sbox.ospath('dir')
   foo_c_path = os.path.join(dir_path, 'foo.c')
   # add a few files that match the default ignore patterns
   foo_o_path = os.path.join(dir_path, 'foo.o')
@@ -1577,7 +1612,7 @@ def basic_add_parents(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  X_path = os.path.join(wc_dir, 'X')
+  X_path = sbox.ospath('X')
   Y_path = os.path.join(X_path, 'Y')
   Z_path = os.path.join(Y_path, 'Z')
   zeta_path = os.path.join(Z_path, 'zeta')
@@ -1778,7 +1813,7 @@ def info_nonhead(sbox):
 
   wc_dir = sbox.wc_dir
   repo_url = sbox.repo_url
-  fname = os.path.join(wc_dir, 'iota')
+  fname = sbox.ospath('iota')
   furl = repo_url + "/iota"
 
   # Remove iota and commit.
@@ -1811,7 +1846,7 @@ def ls_nonhead(sbox):
   wc_dir = sbox.wc_dir
 
   # Delete A/D/rho and commit.
-  G_path = os.path.join(wc_dir, 'A', 'D', 'G')
+  G_path = sbox.ospath('A/D/G')
   svntest.actions.run_and_verify_svn("error scheduling A/D/G for deletion",
                                      None, [], 'rm', G_path)
 
@@ -1840,7 +1875,7 @@ def cat_added_PREV(sbox):
 
   sbox.build(read_only = True)
   wc_dir = sbox.wc_dir
-  f_path = os.path.join(wc_dir, 'f')
+  f_path = sbox.ospath('f')
 
   # Create and add a file.
   svntest.main.file_append(f_path, 'new text')
@@ -1871,8 +1906,8 @@ def delete_keep_local(sbox):
 
   sbox.build()
   wc_dir = sbox.wc_dir
-  iota_path = os.path.join(wc_dir, 'iota')
-  C_path = os.path.join(wc_dir, 'A', 'C')
+  iota_path = sbox.ospath('iota')
+  C_path = sbox.ospath('A/C')
 
   # Remove file iota
   svntest.actions.run_and_verify_svn(None, None, [], 'rm', '--keep-local',
@@ -1914,7 +1949,7 @@ def delete_keep_local_twice(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
-  dir = os.path.join(wc_dir, 'dir')
+  dir = sbox.ospath('dir')
 
   svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', dir)
 
@@ -2066,11 +2101,11 @@ def automatic_conflict_resolution(sbox):
   svntest.actions.duplicate_dir(wc_dir, wc_backup)
 
   # Make a couple of local mods to files which will be committed
-  mu_path = os.path.join(wc_dir, 'A', 'mu')
-  lambda_path = os.path.join(wc_dir, 'A', 'B', 'lambda')
-  rho_path = os.path.join(wc_dir, 'A', 'D', 'G', 'rho')
-  tau_path = os.path.join(wc_dir, 'A', 'D', 'G', 'tau')
-  omega_path = os.path.join(wc_dir, 'A', 'D', 'H', 'omega')
+  mu_path = sbox.ospath('A/mu')
+  lambda_path = sbox.ospath('A/B/lambda')
+  rho_path = sbox.ospath('A/D/G/rho')
+  tau_path = sbox.ospath('A/D/G/tau')
+  omega_path = sbox.ospath('A/D/H/omega')
   svntest.main.file_append(mu_path, 'Original appended text for mu\n')
   svntest.main.file_append(lambda_path, 'Original appended text for lambda\n')
   svntest.main.file_append(rho_path, 'Original appended text for rho\n')
@@ -2319,7 +2354,7 @@ def basic_relative_url_using_current_dir
   sbox.build()
 
   # First, make a new revision of iota.
-  iota = os.path.join(sbox.wc_dir, 'iota')
+  iota = sbox.ospath('iota')
   svntest.main.file_append(iota, "New contents for iota\n")
   svntest.main.run_svn(None, 'ci',
                        '-m', '', iota)
@@ -2344,13 +2379,13 @@ def basic_relative_url_using_other_targe
   sbox.build()
 
   # First, make a new revision of iota.
-  iota = os.path.join(sbox.wc_dir, 'iota')
+  iota = sbox.ospath('iota')
   svntest.main.file_append(iota, "New contents for iota\n")
   svntest.main.run_svn(None, 'ci',
                        '-m', '', iota)
 
   # Now, make a new revision of A/mu .
-  mu = os.path.join(sbox.wc_dir, 'A', 'mu')
+  mu = sbox.ospath('A/mu')
   mu_url = sbox.repo_url + '/A/mu'
 
   svntest.main.file_append(mu, "New contents for mu\n")
@@ -2422,7 +2457,7 @@ def basic_relative_url_with_peg_revision
   sbox.build()
 
   # First, make a new revision of iota.
-  iota = os.path.join(sbox.wc_dir, 'iota')
+  iota = sbox.ospath('iota')
   svntest.main.file_append(iota, "New contents for iota\n")
   svntest.main.run_svn(None, 'ci',
                        '-m', '', iota)
@@ -2430,7 +2465,7 @@ def basic_relative_url_with_peg_revision
   iota_url = sbox.repo_url + '/iota'
 
   # Now, make a new revision of A/mu .
-  mu = os.path.join(sbox.wc_dir, 'A', 'mu')
+  mu = sbox.ospath('A/mu')
   mu_url = sbox.repo_url + '/A/mu'
 
   svntest.main.file_append(mu, "New contents for mu\n")
@@ -2565,8 +2600,8 @@ def delete_and_add_same_file(sbox):
 
   wc_dir = sbox.wc_dir
 
-  iota = os.path.join(wc_dir, 'iota')
-  iota2 = os.path.join(wc_dir, 'iota2')
+  iota = sbox.ospath('iota')
+  iota2 = sbox.ospath('iota2')
 
   shutil.copyfile(iota, iota2)
 
@@ -2727,7 +2762,7 @@ def ls_multiple_and_non_existent_targets
 
   def non_existent_wc_target():
     "non-existent wc target"
-    non_existent_path = os.path.join(wc_dir, 'non-existent')
+    non_existent_path = sbox.ospath('non-existent')
 
     expected_err = ".*W155010.*"
     svntest.actions.run_and_verify_svn2(None, None, expected_err,
@@ -2745,7 +2780,7 @@ def ls_multiple_and_non_existent_targets
 
     alpha = sbox.ospath('A/B/E/alpha')
     beta = sbox.ospath('A/B/E/beta')
-    non_existent_path = os.path.join(wc_dir, 'non-existent')
+    non_existent_path = sbox.ospath('non-existent')
 
     # All targets are existing
     svntest.actions.run_and_verify_svn2(None, None, [],
@@ -2799,7 +2834,7 @@ def add_multiple_targets(sbox):
 
   file1 = sbox.ospath('file1')
   file2 = sbox.ospath('file2')
-  non_existent_path = os.path.join(wc_dir, 'non-existent')
+  non_existent_path = sbox.ospath('non-existent')
 
   svntest.main.file_write(file1, "file1 contents", 'w+')
   svntest.main.file_write(file2, "file2 contents", 'w+')
@@ -2898,8 +2933,8 @@ def rm_missing_with_case_clashing_ondisk
   sbox.build(read_only = True)
   wc_dir = sbox.wc_dir
 
-  iota_path = os.path.join(wc_dir, 'iota')
-  IOTA_path = os.path.join(wc_dir, 'IOTA')
+  iota_path = sbox.ospath('iota')
+  IOTA_path = sbox.ospath('IOTA')
 
   # Out-of-svn move, to make iota missing, while IOTA appears as unversioned.
   os.rename(iota_path, IOTA_path)
@@ -2960,7 +2995,8 @@ test_list = [ None,
               basic_mkdir_url,
               basic_mkdir_url_with_parents,
               basic_mkdir_wc_with_parents,
-              basic_corruption,
+              basic_commit_corruption,
+              basic_update_corruption,
               basic_merging_update,
               basic_conflict,
               basic_cleanup,

Modified: subversion/branches/master-passphrase/subversion/tests/cmdline/blame_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/tests/cmdline/blame_tests.py?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/tests/cmdline/blame_tests.py (original)
+++ subversion/branches/master-passphrase/subversion/tests/cmdline/blame_tests.py Wed Jun 27 15:12:37 2012
@@ -333,6 +333,7 @@ def blame_eol_styles(sbox):
 
   # do the test for each eol-style
   for eol in ['CR', 'LF', 'CRLF', 'native']:
+    svntest.main.run_svn(None, 'propdel', 'svn:eol-style', file_path)
     svntest.main.file_write(file_path, "This is no longer the file 'iota'.\n")
 
     for i in range(1,3):

Modified: subversion/branches/master-passphrase/subversion/tests/cmdline/changelist_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/master-passphrase/subversion/tests/cmdline/changelist_tests.py?rev=1354571&r1=1354570&r2=1354571&view=diff
==============================================================================
--- subversion/branches/master-passphrase/subversion/tests/cmdline/changelist_tests.py (original)
+++ subversion/branches/master-passphrase/subversion/tests/cmdline/changelist_tests.py Wed Jun 27 15:12:37 2012
@@ -129,9 +129,6 @@ def verify_changelist_output(output, exp
   if not expected_skips:
     output = [line for line in output if (not _re_cl_skip.match(line))]
 
-  if len(output) != num_expected:
-    raise svntest.Failure("Unexpected number of 'svn changelist' output lines")
-
   for line in output:
     line = line.rstrip()
     match = _re_cl_rem.match(line)
@@ -157,6 +154,10 @@ def verify_changelist_output(output, exp
       raise svntest.Failure("Unexpected changelist skip line: " + line)
     raise svntest.Failure("Unexpected line: " + line)
 
+  if len(output) != num_expected:
+    raise svntest.Failure("Unexpected number of 'svn changelist' output " +
+                          "lines (%d vs %d)" % (len(output), num_expected))
+
 def verify_pget_output(output, expected_props):
   """Compare lines of OUTPUT from 'svn propget' against EXPECTED_PROPS
   (a dictionary mapping paths to property values)."""
@@ -220,15 +221,15 @@ def add_remove_changelists(sbox):
 
   # all dirs in the Greek tree
   expected_skips_all = dict([(x, None) for x in [
-        os.path.join(wc_dir),
-    os.path.join(wc_dir, 'A'),
-    os.path.join(wc_dir, 'A', 'B'),
-    os.path.join(wc_dir, 'A', 'B', 'E'),
-    os.path.join(wc_dir, 'A', 'B', 'F'),
-    os.path.join(wc_dir, 'A', 'C'),
-    os.path.join(wc_dir, 'A', 'D'),
-    os.path.join(wc_dir, 'A', 'D', 'G'),
-    os.path.join(wc_dir, 'A', 'D', 'H'),
+    sbox.ospath(''),
+    sbox.ospath('A'),
+    sbox.ospath('A/B'),
+    sbox.ospath('A/B/E'),
+    sbox.ospath('A/B/F'),
+    sbox.ospath('A/C'),
+    sbox.ospath('A/D'),
+    sbox.ospath('A/D/G'),
+    sbox.ospath('A/D/H'),
     ]])
 
   expected_skips_wc_dir = { wc_dir : None }
@@ -254,17 +255,17 @@ def add_remove_changelists(sbox):
                                                    "--depth", "infinity",
                                                    wc_dir)
   expected_adds = {
-    os.path.join(wc_dir, 'A', 'B', 'E', 'alpha') : 'foo',
-    os.path.join(wc_dir, 'A', 'B', 'E', 'beta') : 'foo',
-    os.path.join(wc_dir, 'A', 'B', 'lambda') : 'foo',
-    os.path.join(wc_dir, 'A', 'D', 'G', 'pi') : 'foo',
-    os.path.join(wc_dir, 'A', 'D', 'G', 'rho') : 'foo',
-    os.path.join(wc_dir, 'A', 'D', 'G', 'tau') : 'foo',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'chi') : 'foo',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'omega') : 'foo',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'psi') : 'foo',
-    os.path.join(wc_dir, 'A', 'D', 'gamma') : 'foo',
-    os.path.join(wc_dir, 'A', 'mu') : 'foo',
+      sbox.ospath('A/B/E/alpha') : 'foo',
+      sbox.ospath('A/B/E/beta') : 'foo',
+      sbox.ospath('A/B/lambda') : 'foo',
+      sbox.ospath('A/D/G/pi') : 'foo',
+      sbox.ospath('A/D/G/rho') : 'foo',
+      sbox.ospath('A/D/G/tau') : 'foo',
+      sbox.ospath('A/D/H/chi') : 'foo',
+      sbox.ospath('A/D/H/omega') : 'foo',
+      sbox.ospath('A/D/H/psi') : 'foo',
+      sbox.ospath('A/D/gamma') : 'foo',
+      sbox.ospath('A/mu') : 'foo',
     }
   verify_changelist_output(output, expected_adds)
 
@@ -273,16 +274,15 @@ def add_remove_changelists(sbox):
   # svn changelist bar WC_DIR/A/D --depth infinity
   exit_code, output, errput = svntest.main.run_svn(".*", "changelist", "bar",
                                                    "--depth", "infinity",
-                                                   os.path.join(wc_dir,
-                                                                'A', 'D'))
+                                                   sbox.ospath('A/D'))
   expected_adds = {
-    os.path.join(wc_dir, 'A', 'D', 'G', 'pi') : 'bar',
-    os.path.join(wc_dir, 'A', 'D', 'G', 'rho') : 'bar',
-    os.path.join(wc_dir, 'A', 'D', 'G', 'tau') : 'bar',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'chi') : 'bar',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'omega') : 'bar',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'psi') : 'bar',
-    os.path.join(wc_dir, 'A', 'D', 'gamma') : 'bar',
+      sbox.ospath('A/D/G/pi') : 'bar',
+      sbox.ospath('A/D/G/rho') : 'bar',
+      sbox.ospath('A/D/G/tau') : 'bar',
+      sbox.ospath('A/D/H/chi') : 'bar',
+      sbox.ospath('A/D/H/omega') : 'bar',
+      sbox.ospath('A/D/H/psi') : 'bar',
+      sbox.ospath('A/D/gamma') : 'bar',
     }
   expected_removals = expected_adds
   verify_changelist_output(output, expected_adds, expected_removals)
@@ -290,12 +290,11 @@ def add_remove_changelists(sbox):
   # svn changelist baz WC_DIR/A/D/H --depth infinity
   exit_code, output, errput = svntest.main.run_svn(".*", "changelist", "baz",
                                                    "--depth", "infinity",
-                                                   os.path.join(wc_dir, 'A',
-                                                                'D', 'H'))
+                                                   sbox.ospath('A/D/H'))
   expected_adds = {
-    os.path.join(wc_dir, 'A', 'D', 'H', 'chi') : 'baz',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'omega') : 'baz',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'psi') : 'baz',
+      sbox.ospath('A/D/H/chi') : 'baz',
+      sbox.ospath('A/D/H/omega') : 'baz',
+      sbox.ospath('A/D/H/psi') : 'baz',
     }
   expected_removals = expected_adds
   verify_changelist_output(output, expected_adds, expected_removals)
@@ -309,11 +308,11 @@ def add_remove_changelists(sbox):
                                                    "--changelist", "foo",
                                                    wc_dir)
   expected_adds = {
-    os.path.join(wc_dir, 'A', 'B', 'E', 'alpha') : 'foo-rename',
-    os.path.join(wc_dir, 'A', 'B', 'E', 'beta') : 'foo-rename',
-    os.path.join(wc_dir, 'A', 'B', 'lambda') : 'foo-rename',
-    os.path.join(wc_dir, 'A', 'mu') : 'foo-rename',
-    os.path.join(wc_dir, 'iota') : 'foo-rename',
+      sbox.ospath('A/B/E/alpha') : 'foo-rename',
+      sbox.ospath('A/B/E/beta') : 'foo-rename',
+      sbox.ospath('A/B/lambda') : 'foo-rename',
+      sbox.ospath('A/mu') : 'foo-rename',
+      sbox.ospath('iota') : 'foo-rename',
     }
   expected_removals = expected_adds
   verify_changelist_output(output, expected_adds, expected_removals)
@@ -325,14 +324,14 @@ def add_remove_changelists(sbox):
     "--changelist", "foo-rename", "--changelist", "baz", wc_dir)
 
   expected_adds = {
-    os.path.join(wc_dir, 'A', 'B', 'E', 'alpha') : 'bar',
-    os.path.join(wc_dir, 'A', 'B', 'E', 'beta') : 'bar',
-    os.path.join(wc_dir, 'A', 'B', 'lambda') : 'bar',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'chi') : 'bar',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'omega') : 'bar',
-    os.path.join(wc_dir, 'A', 'D', 'H', 'psi') : 'bar',
-    os.path.join(wc_dir, 'A', 'mu') : 'bar',
-    os.path.join(wc_dir, 'iota') : 'bar',
+      sbox.ospath('A/B/E/alpha') : 'bar',
+      sbox.ospath('A/B/E/beta') : 'bar',
+      sbox.ospath('A/B/lambda') : 'bar',
+      sbox.ospath('A/D/H/chi') : 'bar',
+      sbox.ospath('A/D/H/omega') : 'bar',
+      sbox.ospath('A/D/H/psi') : 'bar',
+      sbox.ospath('A/mu') : 'bar',
+      sbox.ospath('iota') : 'bar',
     }
   expected_removals = expected_adds
   verify_changelist_output(output, expected_adds, expected_removals)
@@ -360,17 +359,17 @@ def add_remove_changelists(sbox):
                                                    "--depth", "infinity",
                                                    wc_dir)
   expected_removals = {
-    os.path.join(wc_dir, 'A', 'B', 'E', 'alpha') : None,
-    os.path.join(wc_dir, 'A', 'B', 'E', 'beta') : None,
-    os.path.join(wc_dir, 'A', 'B', 'lambda') : None,
-    os.path.join(wc_dir, 'A', 'D', 'G', 'pi') : None,
-    os.path.join(wc_dir, 'A', 'D', 'G', 'rho') : None,
-    os.path.join(wc_dir, 'A', 'D', 'G', 'tau') : None,
-    os.path.join(wc_dir, 'A', 'D', 'H', 'chi') : None,
-    os.path.join(wc_dir, 'A', 'D', 'H', 'omega') : None,
-    os.path.join(wc_dir, 'A', 'D', 'H', 'psi') : None,
-    os.path.join(wc_dir, 'A', 'D', 'gamma') : None,
-    os.path.join(wc_dir, 'A', 'mu') : None,
+      sbox.ospath('A/B/E/alpha') : None,
+      sbox.ospath('A/B/E/beta') : None,
+      sbox.ospath('A/B/lambda') : None,
+      sbox.ospath('A/D/G/pi') : None,
+      sbox.ospath('A/D/G/rho') : None,
+      sbox.ospath('A/D/G/tau') : None,
+      sbox.ospath('A/D/H/chi') : None,
+      sbox.ospath('A/D/H/omega') : None,
+      sbox.ospath('A/D/H/psi') : None,
+      sbox.ospath('A/D/gamma') : None,
+      sbox.ospath('A/mu') : None,
     }
   verify_changelist_output(output, None, expected_removals)
 
@@ -387,12 +386,12 @@ def add_remove_changelists(sbox):
                                                    "--changelist", "a",
                                                    wc_dir)
   expected_removals = {
-    os.path.join(wc_dir, 'A', 'B', 'E', 'alpha') : None,
-    os.path.join(wc_dir, 'A', 'B', 'E', 'beta') : None,
-    os.path.join(wc_dir, 'A', 'B', 'lambda') : None,
-    os.path.join(wc_dir, 'A', 'D', 'H', 'omega') : None,
-    os.path.join(wc_dir, 'A', 'D', 'gamma') : None,
-    os.path.join(wc_dir, 'iota') : None,
+      sbox.ospath('A/B/E/alpha') : None,
+      sbox.ospath('A/B/E/beta') : None,
+      sbox.ospath('A/B/lambda') : None,
+      sbox.ospath('A/D/H/omega') : None,
+      sbox.ospath('A/D/gamma') : None,
+      sbox.ospath('iota') : None,
     }
   verify_changelist_output(output, None, expected_removals)
 
@@ -405,10 +404,10 @@ def add_remove_changelists(sbox):
                                                    "--changelist", "o",
                                                    wc_dir)
   expected_removals = {
-    os.path.join(wc_dir, 'A', 'D', 'G', 'pi') : None,
-    os.path.join(wc_dir, 'A', 'D', 'G', 'rho') : None,
-    os.path.join(wc_dir, 'A', 'D', 'H', 'chi') : None,
-    os.path.join(wc_dir, 'A', 'D', 'H', 'psi') : None,
+      sbox.ospath('A/D/G/pi') : None,
+      sbox.ospath('A/D/G/rho') : None,
+      sbox.ospath('A/D/H/chi') : None,
+      sbox.ospath('A/D/H/psi') : None,
     }
   verify_changelist_output(output, None, expected_removals)