You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2010/08/10 20:06:33 UTC

svn commit: r984153 [32/39] - in /subversion/branches/ignore-mergeinfo: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ build/hudson/ build/hudson/jobs/subversion-1.6.x-solaris/ build/hudson/jobs/subversion-1.6.x-ubuntu/ build/hu...

Modified: subversion/branches/ignore-mergeinfo/subversion/svnserve/serve.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/svnserve/serve.c?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/svnserve/serve.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/svnserve/serve.c Tue Aug 10 18:06:17 2010
@@ -226,7 +226,7 @@ svn_error_t *load_configs(svn_config_t *
   *pwdb = NULL;
   if (pwdb_path)
     {
-      pwdb_path = svn_path_join(base, pwdb_path, pool);
+      pwdb_path = svn_dirent_join(base, pwdb_path, pool);
 
       err = svn_config_read(pwdb, pwdb_path, TRUE, pool);
       if (err)
@@ -271,7 +271,7 @@ svn_error_t *load_configs(svn_config_t *
                  SVN_CONFIG_OPTION_AUTHZ_DB, NULL);
   if (authzdb_path)
     {
-      authzdb_path = svn_path_join(base, authzdb_path, pool);
+      authzdb_path = svn_dirent_join(base, authzdb_path, pool);
       err = svn_repos_authz_read(authzdb, authzdb_path, TRUE, pool);
       if (err)
         {
@@ -352,7 +352,7 @@ static svn_error_t *authz_check_access(s
      routines throws them into an infinite loop and makes them miss
      ACLs. */
   if (path && *path != '/')
-    path = svn_path_join("/", path, pool);
+    path = svn_uri_join("/", path, pool);
 
   return svn_repos_authz_check_access(b->authzdb, b->authz_repos_name,
                                       path, b->user, required,
@@ -707,7 +707,7 @@ static svn_error_t *set_path(svn_ra_svn_
                                  &depth_word));
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
-  path = svn_path_canonicalize(path, pool);
+  path = svn_uri_canonicalize(path, pool);
   if (b->from_rev && strcmp(path, "") == 0)
     *b->from_rev = rev;
   if (!b->err)
@@ -726,7 +726,7 @@ static svn_error_t *delete_path(svn_ra_s
   const char *path;
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c", &path));
-  path = svn_path_canonicalize(path, pool);
+  path = svn_uri_canonicalize(path, pool);
   if (!b->err)
     b->err = svn_repos_delete_path(b->report_baton, path, pool);
   return SVN_NO_ERROR;
@@ -745,8 +745,8 @@ static svn_error_t *link_path(svn_ra_svn
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "ccrb?(?c)?w",
                                  &path, &url, &rev, &start_empty,
                                  &lock_token, &depth_word));
-  path = svn_path_canonicalize(path, pool);
-  url = svn_path_uri_decode(svn_path_canonicalize(url, pool), pool);
+  path = svn_uri_canonicalize(path, pool);
+  url = svn_path_uri_decode(svn_uri_canonicalize(url, pool), pool);
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
   if (!b->err)
@@ -772,7 +772,7 @@ static svn_error_t *finish_report(svn_ra
 }
 
 static svn_error_t *abort_report(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
-                                   apr_array_header_t *params, void *baton)
+                                 apr_array_header_t *params, void *baton)
 {
   report_driver_baton_t *b = baton;
 
@@ -864,7 +864,7 @@ static svn_error_t *accept_report(svn_bo
  * values. */
 static svn_error_t *write_prop_diffs(svn_ra_svn_conn_t *conn,
                                      apr_pool_t *pool,
-                                     apr_array_header_t *propdiffs)
+                                     const apr_array_header_t *propdiffs)
 {
   int i;
 
@@ -937,7 +937,7 @@ static svn_error_t *reparent(svn_ra_svn_
   const char *fs_path;
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c", &url));
-  url = svn_path_uri_decode(svn_path_canonicalize(url, pool), pool);
+  url = svn_path_uri_decode(svn_uri_canonicalize(url, pool), pool);
   SVN_ERR(trivial_auth_request(conn, pool, b));
   SVN_CMD_ERR(get_fs_path(svn_path_uri_decode(b->repos_url, pool),
                           url, &fs_path));
@@ -1065,7 +1065,7 @@ static svn_error_t *commit_done(const sv
  * to the client.  Use POOL for temporary allocations only.
  */
 static svn_error_t *add_lock_tokens(svn_ra_svn_conn_t *conn,
-                                    apr_array_header_t *lock_tokens,
+                                    const apr_array_header_t *lock_tokens,
                                     server_baton_t *sb,
                                     apr_pool_t *pool)
 {
@@ -1099,9 +1099,9 @@ static svn_error_t *add_lock_tokens(svn_
                                 "Lock token isn't a string");
 
       path = path_item->u.string->data;
-      full_path = svn_path_join(sb->fs_path->data,
-                                svn_path_canonicalize(path, pool),
-                                pool);
+      full_path = svn_uri_join(sb->fs_path->data,
+                               svn_uri_canonicalize(path, pool),
+                               pool);
 
       if (! lookup_access(pool, sb, conn, svn_authz_write,
                           full_path, TRUE))
@@ -1117,7 +1117,7 @@ static svn_error_t *add_lock_tokens(svn_
 
 /* Unlock the paths with lock tokens in LOCK_TOKENS, ignoring any errors.
    LOCK_TOKENS contains svn_ra_svn_item_t elements, assumed to be lists. */
-static svn_error_t *unlock_paths(apr_array_header_t *lock_tokens,
+static svn_error_t *unlock_paths(const apr_array_header_t *lock_tokens,
                                  server_baton_t *sb,
                                  svn_ra_svn_conn_t *conn,
                                  apr_pool_t *pool)
@@ -1141,9 +1141,9 @@ static svn_error_t *unlock_paths(apr_arr
       path = path_item->u.string->data;
       token = token_item->u.string->data;
 
-      full_path = svn_path_join(sb->fs_path->data,
-                                svn_path_canonicalize(path, iterpool),
-                                iterpool);
+      full_path = svn_uri_join(sb->fs_path->data,
+                               svn_uri_canonicalize(path, iterpool),
+                               iterpool);
 
       /* The lock may have become defunct after the commit, so ignore such
          errors. */
@@ -1282,8 +1282,8 @@ static svn_error_t *get_file(svn_ra_svn_
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)bb", &path, &rev,
                                  &want_props, &want_contents));
 
-  full_path = svn_path_join(b->fs_path->data,
-                            svn_path_canonicalize(path, pool), pool);
+  full_path = svn_uri_join(b->fs_path->data,
+                           svn_uri_canonicalize(path, pool), pool);
 
   /* Check authorizations */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
@@ -1398,8 +1398,8 @@ static svn_error_t *get_dir(svn_ra_svn_c
         }
     }
 
-  full_path = svn_path_join(b->fs_path->data,
-                            svn_path_canonicalize(path, pool), pool);
+  full_path = svn_uri_join(b->fs_path->data,
+                           svn_uri_canonicalize(path, pool), pool);
 
   /* Check authorizations */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
@@ -1430,13 +1430,13 @@ static svn_error_t *get_dir(svn_ra_svn_c
       subpool = svn_pool_create(pool);
       for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
         {
-          const char *name = svn_apr_hash_index_key(hi);
-          svn_fs_dirent_t *fsent = svn_apr_hash_index_val(hi);
+          const char *name = svn__apr_hash_index_key(hi);
+          svn_fs_dirent_t *fsent = svn__apr_hash_index_val(hi);
           svn_dirent_t *entry;
 
           svn_pool_clear(subpool);
 
-          file_path = svn_path_join(full_path, name, subpool);
+          file_path = svn_uri_join(full_path, name, subpool);
           entry = apr_pcalloc(pool, sizeof(*entry));
 
           if (dirent_fields & SVN_DIRENT_KIND)
@@ -1495,8 +1495,8 @@ static svn_error_t *get_dir(svn_ra_svn_c
     {
       for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
         {
-          const char *name = svn_apr_hash_index_key(hi);
-          svn_dirent_t *entry = svn_apr_hash_index_val(hi);
+          const char *name = svn__apr_hash_index_key(hi);
+          svn_dirent_t *entry = svn__apr_hash_index_val(hi);
 
           cdate = (entry->time == (time_t) -1) ? NULL
             : svn_time_to_cstring(entry->time, pool);
@@ -1528,7 +1528,7 @@ static svn_error_t *update(svn_ra_svn_co
   /* Parse the arguments. */
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "(?r)cb?wB", &rev, &target,
                                  &recurse, &depth_word, &send_copyfrom_param));
-  target = svn_path_canonicalize(target, pool);
+  target = svn_uri_canonicalize(target, pool);
 
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
@@ -1538,7 +1538,7 @@ static svn_error_t *update(svn_ra_svn_co
   send_copyfrom_args = (send_copyfrom_param == SVN_RA_SVN_UNSPECIFIED_NUMBER) ?
       FALSE : (svn_boolean_t) send_copyfrom_param;
 
-  full_path = svn_path_join(b->fs_path->data, target, pool);
+  full_path = svn_uri_join(b->fs_path->data, target, pool);
   /* Check authorization and authenticate the user if necessary. */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read, full_path, FALSE));
 
@@ -1579,8 +1579,8 @@ static svn_error_t *switch_cmd(svn_ra_sv
   /* Parse the arguments. */
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "(?r)cbc?w", &rev, &target,
                                  &recurse, &switch_url, &depth_word));
-  target = svn_path_canonicalize(target, pool);
-  switch_url = svn_path_canonicalize(switch_url, pool);
+  target = svn_uri_canonicalize(target, pool);
+  switch_url = svn_uri_canonicalize(switch_url, pool);
 
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
@@ -1596,7 +1596,7 @@ static svn_error_t *switch_cmd(svn_ra_sv
                           &switch_path));
 
   {
-    const char *full_path = svn_path_join(b->fs_path->data, target, pool);
+    const char *full_path = svn_uri_join(b->fs_path->data, target, pool);
     SVN_ERR(log_command(b, conn, pool, "%s",
                         svn_log__switch(full_path, switch_path, rev,
                                         depth, pool)));
@@ -1623,7 +1623,7 @@ static svn_error_t *status(svn_ra_svn_co
   /* Parse the arguments. */
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "cb?(?r)?w",
                                  &target, &recurse, &rev, &depth_word));
-  target = svn_path_canonicalize(target, pool);
+  target = svn_uri_canonicalize(target, pool);
 
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
@@ -1635,7 +1635,7 @@ static svn_error_t *status(svn_ra_svn_co
     SVN_CMD_ERR(svn_fs_youngest_rev(&rev, b->fs, pool));
 
   {
-    const char *full_path = svn_path_join(b->fs_path->data, target, pool);
+    const char *full_path = svn_uri_join(b->fs_path->data, target, pool);
     SVN_ERR(log_command(b, conn, pool, "%s",
                         svn_log__status(full_path, rev, depth, pool)));
   }
@@ -1672,8 +1672,8 @@ static svn_error_t *diff(svn_ra_svn_conn
                                      &ignore_ancestry, &versus_url,
                                      &text_deltas, &depth_word));
     }
-  target = svn_path_canonicalize(target, pool);
-  versus_url = svn_path_canonicalize(versus_url, pool);
+  target = svn_uri_canonicalize(target, pool);
+  versus_url = svn_uri_canonicalize(versus_url, pool);
 
   if (depth_word)
     depth = svn_depth_from_word(depth_word);
@@ -1689,7 +1689,7 @@ static svn_error_t *diff(svn_ra_svn_conn
                           &versus_path));
 
   {
-    const char *full_path = svn_path_join(b->fs_path->data, target, pool);
+    const char *full_path = svn_uri_join(b->fs_path->data, target, pool);
     svn_revnum_t from_rev;
     SVN_ERR(accept_report(NULL, &from_rev,
                           conn, pool, b, rev, target, versus_path,
@@ -1736,10 +1736,10 @@ static svn_error_t *get_mergeinfo(svn_ra
         if (item->kind != SVN_RA_SVN_STRING)
           return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
                                   _("Path is not a string"));
-        full_path = svn_path_join(b->fs_path->data,
-                                  svn_path_canonicalize(item->u.string->data,
-                                                        pool),
-                                  pool);
+        full_path = svn_uri_join(b->fs_path->data,
+                                 svn_uri_canonicalize(item->u.string->data,
+                                                      pool),
+                                 pool);
         APR_ARRAY_PUSH(canonical_paths, const char *) = full_path;
      }
 
@@ -1761,8 +1761,8 @@ static svn_error_t *get_mergeinfo(svn_ra
   iterpool = svn_pool_create(pool);
   for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
     {
-      const char *key = svn_apr_hash_index_key(hi);
-      svn_mergeinfo_t value = svn_apr_hash_index_val(hi);
+      const char *key = svn__apr_hash_index_key(hi);
+      svn_mergeinfo_t value = svn__apr_hash_index_val(hi);
       svn_string_t *mergeinfo_string;
 
       svn_pool_clear(iterpool);
@@ -1810,8 +1810,8 @@ static svn_error_t *log_receiver(void *b
       for (h = apr_hash_first(pool, log_entry->changed_paths2); h;
                                                         h = apr_hash_next(h))
         {
-          const char *path = svn_apr_hash_index_key(h);
-          svn_log_changed_path2_t *change = svn_apr_hash_index_val(h);
+          const char *path = svn__apr_hash_index_key(h);
+          svn_log_changed_path2_t *change = svn__apr_hash_index_val(h);
 
           action[0] = change->action;
           action[1] = '\0';
@@ -1913,10 +1913,10 @@ static svn_error_t *log_cmd(svn_ra_svn_c
       if (elt->kind != SVN_RA_SVN_STRING)
         return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
                                 _("Log path entry not a string"));
-      full_path = svn_path_join(b->fs_path->data,
-                                svn_path_canonicalize(elt->u.string->data,
-                                                      pool),
-                                pool);
+      full_path = svn_uri_join(b->fs_path->data,
+                               svn_uri_canonicalize(elt->u.string->data,
+                                                    pool),
+                               pool);
       APR_ARRAY_PUSH(full_paths, const char *) = full_path;
     }
   SVN_ERR(trivial_auth_request(conn, pool, b));
@@ -1958,8 +1958,8 @@ static svn_error_t *check_path(svn_ra_sv
   svn_node_kind_t kind;
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)", &path, &rev));
-  full_path = svn_path_join(b->fs_path->data,
-                            svn_path_canonicalize(path, pool), pool);
+  full_path = svn_uri_join(b->fs_path->data,
+                           svn_uri_canonicalize(path, pool), pool);
 
   /* Check authorizations */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
@@ -1988,8 +1988,8 @@ static svn_error_t *stat_cmd(svn_ra_svn_
   svn_dirent_t *dirent;
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)", &path, &rev));
-  full_path = svn_path_join(b->fs_path->data,
-                            svn_path_canonicalize(path, pool), pool);
+  full_path = svn_uri_join(b->fs_path->data,
+                           svn_uri_canonicalize(path, pool), pool);
 
   /* Check authorizations */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
@@ -2043,9 +2043,9 @@ static svn_error_t *get_locations(svn_ra
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "crl", &relative_path,
                                  &peg_revision,
                                  &loc_revs_proto));
-  relative_path = svn_path_canonicalize(relative_path, pool);
+  relative_path = svn_uri_canonicalize(relative_path, pool);
 
-  abs_path = svn_path_join(b->fs_path->data, relative_path, pool);
+  abs_path = svn_uri_join(b->fs_path->data, relative_path, pool);
 
   location_revisions = apr_array_make(pool, loc_revs_proto->nelts,
                                       sizeof(svn_revnum_t));
@@ -2084,8 +2084,8 @@ static svn_error_t *get_locations(svn_ra
           for (iter = apr_hash_first(pool, fs_locations); iter;
               iter = apr_hash_next(iter))
             {
-              const svn_revnum_t *iter_key = svn_apr_hash_index_key(iter);
-              const char *iter_value = svn_apr_hash_index_val(iter);
+              const svn_revnum_t *iter_key = svn__apr_hash_index_key(iter);
+              const char *iter_value = svn__apr_hash_index_val(iter);
 
               SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "rc",
                                              *iter_key, iter_value));
@@ -2132,9 +2132,9 @@ static svn_error_t *get_location_segment
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)(?r)(?r)",
                                  &relative_path, &peg_revision,
                                  &start_rev, &end_rev));
-  relative_path = svn_path_canonicalize(relative_path, pool);
+  relative_path = svn_uri_canonicalize(relative_path, pool);
 
-  abs_path = svn_path_join(b->fs_path->data, relative_path, pool);
+  abs_path = svn_uri_join(b->fs_path->data, relative_path, pool);
 
   if (SVN_IS_VALID_REVNUM(start_rev)
       && SVN_IS_VALID_REVNUM(end_rev)
@@ -2259,9 +2259,9 @@ static svn_error_t *get_file_revs(svn_ra
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)(?r)?B",
                                  &path, &start_rev, &end_rev,
                                  &include_merged_revs_param));
-  path = svn_path_canonicalize(path, pool);
+  path = svn_uri_canonicalize(path, pool);
   SVN_ERR(trivial_auth_request(conn, pool, b));
-  full_path = svn_path_join(b->fs_path->data, path, pool);
+  full_path = svn_uri_join(b->fs_path->data, path, pool);
 
   if (include_merged_revs_param == SVN_RA_SVN_UNSPECIFIED_NUMBER)
     include_merged_revisions = FALSE;
@@ -2305,8 +2305,8 @@ static svn_error_t *lock(svn_ra_svn_conn
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?c)b(?r)", &path, &comment,
                                  &steal_lock, &current_rev));
-  full_path = svn_path_join(b->fs_path->data,
-                            svn_path_canonicalize(path, pool), pool);
+  full_path = svn_uri_join(b->fs_path->data,
+                           svn_uri_canonicalize(path, pool), pool);
 
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_write,
                            full_path, TRUE));
@@ -2369,9 +2369,9 @@ static svn_error_t *lock_many(svn_ra_svn
 
       /* Allocate the full_path out of pool so it will survive for use
        * by operational logging, after this loop. */
-      full_path = svn_path_join(b->fs_path->data,
-                                svn_path_canonicalize(path, subpool),
-                                pool);
+      full_path = svn_uri_join(b->fs_path->data,
+                               svn_uri_canonicalize(path, subpool),
+                               pool);
       APR_ARRAY_PUSH(log_paths, const char *) = full_path;
 
       if (! lookup_access(pool, b, conn, svn_authz_write, full_path, TRUE))
@@ -2433,8 +2433,8 @@ static svn_error_t *unlock(svn_ra_svn_co
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?c)b", &path, &token,
                                  &break_lock));
 
-  full_path = svn_path_join(b->fs_path->data, svn_path_canonicalize(path, pool),
-                            pool);
+  full_path = svn_uri_join(b->fs_path->data, svn_uri_canonicalize(path, pool),
+                           pool);
 
   /* Username required unless break_lock was specified. */
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_write,
@@ -2490,9 +2490,9 @@ static svn_error_t *unlock_many(svn_ra_s
 
       /* Allocate the full_path out of pool so it will survive for use
        * by operational logging, after this loop. */
-      full_path = svn_path_join(b->fs_path->data,
-                                svn_path_canonicalize(path, subpool),
-                                pool);
+      full_path = svn_uri_join(b->fs_path->data,
+                               svn_uri_canonicalize(path, subpool),
+                               pool);
       APR_ARRAY_PUSH(log_paths, const char *) = full_path;
 
       if (! lookup_access(subpool, b, conn, svn_authz_write, full_path,
@@ -2547,9 +2547,9 @@ static svn_error_t *get_lock(svn_ra_svn_
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c", &path));
 
-  full_path = svn_path_join(b->fs_path->data, svn_path_canonicalize(path,
-                                                                    pool),
-                            pool);
+  full_path = svn_uri_join(b->fs_path->data, svn_uri_canonicalize(path,
+                                                                  pool),
+                           pool);
 
   SVN_ERR(must_have_access(conn, pool, b, svn_authz_read,
                            full_path, FALSE));
@@ -2577,9 +2577,9 @@ static svn_error_t *get_locks(svn_ra_svn
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c", &path));
 
-  full_path = svn_path_join(b->fs_path->data, svn_path_canonicalize(path,
-                                                                    pool),
-                            pool);
+  full_path = svn_uri_join(b->fs_path->data, svn_uri_canonicalize(path,
+                                                                  pool),
+                           pool);
 
   SVN_ERR(trivial_auth_request(conn, pool, b));
 
@@ -2591,7 +2591,7 @@ static svn_error_t *get_locks(svn_ra_svn
   SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "w((!", "success"));
   for (hi = apr_hash_first(pool, locks); hi; hi = apr_hash_next(hi))
     {
-      svn_lock_t *l = svn_apr_hash_index_val(hi);
+      svn_lock_t *l = svn__apr_hash_index_val(hi);
 
       SVN_ERR(write_lock(conn, pool, l));
     }
@@ -2706,8 +2706,8 @@ get_deleted_rev(svn_ra_svn_conn_t *conn,
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "crr",
                                  &path, &peg_revision, &end_revision));
-  full_path = svn_path_join(b->fs_path->data,
-                            svn_path_canonicalize(path, pool), pool);
+  full_path = svn_uri_join(b->fs_path->data,
+                           svn_uri_canonicalize(path, pool), pool);
   SVN_ERR(log_command(b, conn, pool, "get-deleted-rev"));
   SVN_ERR(trivial_auth_request(conn, pool, b));
   SVN_ERR(svn_repos_deleted_rev(b->fs, full_path, peg_revision, end_revision,
@@ -2810,7 +2810,7 @@ repos_path_valid(const char *path)
 static svn_error_t *find_repos(const char *url, const char *root,
                                server_baton_t *b,
                                svn_ra_svn_conn_t *conn,
-                               apr_array_header_t *capabilities,
+                               const apr_array_header_t *capabilities,
                                apr_pool_t *pool)
 {
   const char *path, *full_path, *repos_root, *fs_path;
@@ -2836,8 +2836,8 @@ static svn_error_t *find_repos(const cha
                             "Couldn't determine repository path");
 
   /* Join the server-configured root with the client path. */
-  full_path = svn_path_join(svn_path_canonicalize(root, pool),
-                            svn_path_canonicalize(path, pool), pool);
+  full_path = svn_uri_join(svn_uri_canonicalize(root, pool),
+                           svn_uri_canonicalize(path, pool), pool);
 
   /* Search for a repository in the full path. */
   repos_root = svn_repos_find_root_path(full_path, pool);
@@ -2855,7 +2855,7 @@ static svn_error_t *find_repos(const cha
   svn_path_remove_components(url_buf,
                              svn_path_component_count(b->fs_path->data));
   b->repos_url = url_buf->data;
-  b->authz_repos_name = svn_path_is_child(root, repos_root, pool);
+  b->authz_repos_name = svn_uri_is_child(root, repos_root, pool);
   if (b->authz_repos_name == NULL)
     b->repos_name = svn_uri_basename(repos_root, pool);
   else
@@ -2964,7 +2964,7 @@ svn_error_t *serve(svn_ra_svn_conn_t *co
   if (ver != 2)
     return SVN_NO_ERROR;
 
-  client_url = svn_path_canonicalize(client_url, pool);
+  client_url = svn_uri_canonicalize(client_url, pool);
   SVN_ERR(svn_ra_svn_set_capabilities(conn, caplist));
 
   /* All released versions of Subversion support edit-pipeline,

Modified: subversion/branches/ignore-mergeinfo/subversion/svnsync/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/svnsync/main.c?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/svnsync/main.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/svnsync/main.c Tue Aug 10 18:06:17 2010
@@ -61,6 +61,7 @@ enum svnsync__opt {
   svnsync_opt_sync_password,
   svnsync_opt_config_dir,
   svnsync_opt_config_options,
+  svnsync_opt_disable_locking,
   svnsync_opt_version,
   svnsync_opt_trust_server_cert,
   svnsync_opt_allow_non_empty,
@@ -103,13 +104,14 @@ static const svn_opt_subcommand_desc2_t 
          "the destination repository by any method other than 'svnsync'.\n"
          "In other words, the destination repository should be a read-only\n"
          "mirror of the source repository.\n"),
-      { SVNSYNC_OPTS_DEFAULT, 'q', svnsync_opt_allow_non_empty } },
+      { SVNSYNC_OPTS_DEFAULT, 'q', svnsync_opt_allow_non_empty,
+        svnsync_opt_disable_locking } },
     { "synchronize", synchronize_cmd, { "sync" },
       N_("usage: svnsync synchronize DEST_URL\n"
          "\n"
          "Transfer all pending revisions to the destination from the source\n"
          "with which it was initialized.\n"),
-      { SVNSYNC_OPTS_DEFAULT, 'q' } },
+      { SVNSYNC_OPTS_DEFAULT, 'q', svnsync_opt_disable_locking } },
     { "copy-revprops", copy_revprops_cmd, { 0 },
       N_("usage: svnsync copy-revprops DEST_URL [REV[:REV2]]\n"
          "\n"
@@ -125,7 +127,7 @@ static const svn_opt_subcommand_desc2_t 
          "REV and REV2 must be revisions which were previously transferred\n"
          "to the destination.  You may use \"HEAD\" for either revision to\n"
          "mean \"the last revision transferred\".\n"),
-      { SVNSYNC_OPTS_DEFAULT, 'q' } },
+      { SVNSYNC_OPTS_DEFAULT, 'q', svnsync_opt_disable_locking } },
     { "info", info_cmd, { 0 },
       N_("usage: svnsync info DEST_URL\n"
          "\n"
@@ -180,6 +182,12 @@ static const apr_getopt_option_t svnsync
                           "For example:\n"
                           "                             "
                           "    servers:global:http-library=serf")},
+    {"disable-locking",  svnsync_opt_disable_locking, 0,
+                       N_("Disable built-in locking. Use of this option can\n"
+                          "                             "
+                          "corrupt the mirror unless you ensure that no other\n"
+                          "                             "
+                          "instance of svnsync is running concurrently.")},
     {"version",        svnsync_opt_version, 0,
                        N_("show program version information")},
     {"help",           'h', 0,
@@ -201,6 +209,7 @@ typedef struct {
   const char *sync_password;
   const char *config_dir;
   apr_hash_t *config;
+  svn_boolean_t disable_locking;
   svn_boolean_t quiet;
   svn_boolean_t allow_non_empty;
   svn_boolean_t version;
@@ -428,7 +437,7 @@ remove_props_not_in_source(svn_ra_sessio
        hi;
        hi = apr_hash_next(hi))
     {
-      const char *propname = svn_apr_hash_index_key(hi);
+      const char *propname = svn__apr_hash_index_key(hi);
 
       svn_pool_clear(subpool);
 
@@ -468,8 +477,8 @@ filter_props(int *filtered_count, apr_ha
 
   for (hi = apr_hash_first(pool, props); hi ; hi = apr_hash_next(hi))
     {
-      const char *propname = svn_apr_hash_index_key(hi);
-      void *propval = svn_apr_hash_index_val(hi);
+      const char *propname = svn__apr_hash_index_key(hi);
+      void *propval = svn__apr_hash_index_val(hi);
 
       /* Copy all properties:
           - not matching the exclude pattern if provided OR
@@ -510,8 +519,8 @@ write_revprops(int *filtered_count,
 
   for (hi = apr_hash_first(pool, rev_props); hi; hi = apr_hash_next(hi))
     {
-      const char *propname = svn_apr_hash_index_key(hi);
-      const svn_string_t *propval = svn_apr_hash_index_val(hi);
+      const char *propname = svn__apr_hash_index_key(hi);
+      const svn_string_t *propval = svn__apr_hash_index_val(hi);
 
       svn_pool_clear(subpool);
 
@@ -798,7 +807,10 @@ initialize_cmd(apr_getopt_t *os, void *b
   SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL,
                        &(baton->sync_callbacks), baton, baton->config, pool));
   SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, pool));
-  SVN_ERR(with_locked(to_session, do_initialize, baton, pool));
+  if (opt_baton->disable_locking)
+    SVN_ERR(do_initialize(to_session, baton, pool));
+  else
+    SVN_ERR(with_locked(to_session, do_initialize, baton, pool));
 
   return SVN_NO_ERROR;
 }
@@ -1276,7 +1288,10 @@ synchronize_cmd(apr_getopt_t *os, void *
   SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL,
                        &(baton->sync_callbacks), baton, baton->config, pool));
   SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, pool));
-  SVN_ERR(with_locked(to_session, do_synchronize, baton, pool));
+  if (opt_baton->disable_locking)
+    SVN_ERR(do_synchronize(to_session, baton, pool));
+  else
+    SVN_ERR(with_locked(to_session, do_synchronize, baton, pool));
 
   return SVN_NO_ERROR;
 }
@@ -1433,7 +1448,10 @@ copy_revprops_cmd(apr_getopt_t *os, void
   SVN_ERR(svn_ra_open3(&to_session, baton->to_url, NULL,
                        &(baton->sync_callbacks), baton, baton->config, pool));
   SVN_ERR(check_if_session_is_at_repos_root(to_session, baton->to_url, pool));
-  SVN_ERR(with_locked(to_session, do_copy_revprops, baton, pool));
+  if (opt_baton->disable_locking)
+    SVN_ERR(do_copy_revprops(to_session, baton, pool));
+  else
+    SVN_ERR(with_locked(to_session, do_copy_revprops, baton, pool));
 
   return SVN_NO_ERROR;
 }
@@ -1664,6 +1682,11 @@ main(int argc, const char *argv[])
             if (err)
               return svn_cmdline_handle_exit_error(err, pool, "svnsync: ");
             break;
+
+          case svnsync_opt_disable_locking:
+            opt_baton.disable_locking = TRUE;
+            break;
+
           case svnsync_opt_version:
             opt_baton.version = TRUE;
             break;

Modified: subversion/branches/ignore-mergeinfo/subversion/svnsync/svnsync.1
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/svnsync/svnsync.1?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/svnsync/svnsync.1 (original)
+++ subversion/branches/ignore-mergeinfo/subversion/svnsync/svnsync.1 Tue Aug 10 18:06:17 2010
@@ -36,7 +36,7 @@ is called the source ``repository''; it 
 to permit extracting previous versions of those files at any time.
 
 For more information about the Subversion project, visit 
-http://subversion.tigris.org.
+http://subversion.apache.org.
 
 Documentation for Subversion and its tools, including detailed usage
 explanations of the \fBsvn\fP, \fBsvnadmin\fP, \fBsvnserve\fP and

Modified: subversion/branches/ignore-mergeinfo/subversion/svnsync/sync.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/svnsync/sync.c?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/svnsync/sync.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/svnsync/sync.c Tue Aug 10 18:06:17 2010
@@ -100,8 +100,8 @@ svnsync_normalize_revprops(apr_hash_t *r
        hi;
        hi = apr_hash_next(hi))
     {
-      const char *propname = svn_apr_hash_index_key(hi);
-      const svn_string_t *propval = svn_apr_hash_index_val(hi);
+      const char *propname = svn__apr_hash_index_key(hi);
+      const svn_string_t *propval = svn__apr_hash_index_val(hi);
 
       if (svn_prop_needs_translation(propname))
         {

Modified: subversion/branches/ignore-mergeinfo/subversion/svnversion/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/svnversion/main.c?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/svnversion/main.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/svnversion/main.c Tue Aug 10 18:06:17 2010
@@ -253,18 +253,25 @@ main(int argc, const char *argv[])
           return EXIT_SUCCESS;
         }
 
-      SVN_INT_ERR(svn_wc_revision_status2(&res, wc_ctx, local_abspath,
-                                          trail_url, committed, NULL, NULL,
-                                          pool, pool));
+      err = svn_wc_revision_status2(&res, wc_ctx, local_abspath,
+                                    trail_url, committed, NULL, NULL,
+                                    pool, pool);
 
-      /* Unversioned file in versioned directory */
-      if (res->min_rev == -1)
+      if (err)
         {
-          SVN_INT_ERR(svn_cmdline_printf(pool, _("Unversioned file%s"),
-                                         no_newline ? "" : "\n"));
-          svn_pool_destroy(pool);
-          return EXIT_SUCCESS;
+          /* Unversioned file in versioned directory */
+          if (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+            {
+              svn_error_clear(err);
+              SVN_INT_ERR(svn_cmdline_printf(pool, _("Unversioned file%s"),
+                                             no_newline ? "" : "\n"));
+              svn_pool_destroy(pool);
+              return EXIT_SUCCESS;
+            }
+          else
+              SVN_INT_ERR(err);
         }
+
     }
   else if (kind == svn_node_none)
     {

Modified: subversion/branches/ignore-mergeinfo/subversion/svnversion/svnversion.1
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/svnversion/svnversion.1?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/svnversion/svnversion.1 (original)
+++ subversion/branches/ignore-mergeinfo/subversion/svnversion/svnversion.1 Tue Aug 10 18:06:17 2010
@@ -36,7 +36,7 @@ is called the source ``repository''; it 
 to permit extracting previous versions of those files at any time.
 
 For more information about the Subversion project, visit 
-http://subversion.tigris.org.
+http://subversion.apache.org.
 
 Documentation for Subversion and its tools, including detailed usage
 explanations of the \fBsvn\fP, \fBsvnadmin\fP, \fBsvnserve\fP and

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/README
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/README?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/README (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/README Tue Aug 10 18:06:17 2010
@@ -86,7 +86,7 @@ correctly, nor as a place-holder for a t
 
 Each test function conforms to the svn_test_driver_t prototype:
 
-	svn_error_t *f (const char **MSG,
+        svn_error_t *f (const char **MSG,
                         svn_boolean_t MSG_ONLY
                         apr_pool_t *POOL);
 

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/authz_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/authz_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/authz_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  authz_tests.py:  testing authentication.
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -903,6 +903,40 @@ def authz_access_required_at_repo_root(s
                        root_url + '/A-copy/B/E/beta',
                        root_url + '/A-copy/C')
 
+
+def multiple_matches(sbox):
+  "multiple lines matching a user"
+
+  sbox.build(create_wc = False)
+  root_url = sbox.repo_url
+  write_restrictive_svnserve_conf(sbox.repo_dir)
+  if sbox.repo_url.startswith("http"):
+    expected_err = ".*[Ff]orbidden.*"
+  else:
+    expected_err = ".*svn: Authorization failed.*"
+
+  # Prohibit access and commit fails
+  write_authz_file(sbox, {'/': 'jrandom ='})
+  svntest.actions.run_and_verify_svn(None, None, expected_err,
+                                     'cp', '-m', 'fail copy',
+                                     root_url, root_url + '/fail')
+
+  # At present if multiple lines match the permissions of all the
+  # matching lines are amalgamated.  So jrandom gets access regardless
+  # of the line prohibiting access and regardless of the  order of the
+  # lines.  This might be a bug, but we probably can't simply fix it as
+  # that would change the behaviour of lots of existing authz files.
+
+  write_authz_file(sbox, {'/': 'jrandom =' + '\n' + '* = rw'})
+  svntest.main.run_svn(None, 'cp',
+                       '-m', 'first copy',
+                       root_url, root_url + '/first')
+
+  write_authz_file(sbox, {'/': '* = rw' + '\n' + 'jrandom ='})
+  svntest.main.run_svn(None, 'cp',
+                       '-m', 'second copy',
+                       root_url, root_url + '/second')
+
 ########################################################################
 # Run the tests
 
@@ -928,6 +962,7 @@ test_list = [ None,
                          svntest.main.is_ra_type_file)),
               Skip(authz_access_required_at_repo_root,
                    svntest.main.is_ra_type_file),
+              Skip(multiple_matches, svntest.main.is_ra_type_file),
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/autoprop_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/autoprop_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/autoprop_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/autoprop_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  autoprop_tests.py:  testing automatic properties
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/basic_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/basic_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/basic_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/basic_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  basic_tests.py:  testing working-copy interactions with ra_local
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/blame_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/blame_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/blame_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/blame_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  blame_tests.py:  testing line-by-line annotation.
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/cat_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/cat_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/cat_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/cat_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  cat_tests.py:  testing cat cases.
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -146,6 +146,33 @@ def cat_skip_uncattable(sbox):
                                       'cat', rho_path, G_path, new_file_path)
 
 
+# Test for issue #3560 'svn_wc_status3() returns incorrect status for
+# unversioned files'.
+def cat_unversioned_file(sbox):
+  "cat an unversioned file parent dir thinks exists"
+  sbox.build()
+  wc_dir = sbox.wc_dir
+  iota_path = os.path.join(wc_dir, 'iota')
+
+  # Delete a file an commit the deletion.
+  svntest.actions.run_and_verify_svn2(None, None, [], 0,
+                                      'delete', iota_path)
+  svntest.actions.run_and_verify_svn2(None, None, [], 0,
+                                      'commit', '-m', 'delete a file',
+                                      iota_path)
+
+  # Now try to cat the deleted file, it should be reported as unversioned.
+  expected_error = ["svn: warning: '" + os.path.abspath(iota_path) + "'"
+                    + " is not under version control\n"]
+  svntest.actions.run_and_verify_svn2(None, [], expected_error, 0,
+                                      'cat', iota_path)
+
+  # Put an unversioned file at 'iota' and try to cat it again, the result
+  # should still be the same.
+  svntest.main.file_write(iota_path, "This the unversioned file 'iota'.\n")
+  svntest.actions.run_and_verify_svn2(None, [], expected_error, 0,
+                                      'cat', iota_path)
+
 ########################################################################
 # Run the tests
 
@@ -157,6 +184,7 @@ test_list = [ None,
               cat_base,
               cat_nonexistent_file,
               cat_skip_uncattable,
+              cat_unversioned_file,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/changelist_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/changelist_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/changelist_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/changelist_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  changelist_tests.py:  testing changelist uses.
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/checkout_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/checkout_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/checkout_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/checkout_tests.py Tue Aug 10 18:06:17 2010
@@ -4,7 +4,7 @@
 #                      tree already exits.
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -26,7 +26,7 @@
 ######################################################################
 
 # General modules
-import sys, re, os, time
+import sys, re, os, time, subprocess
 
 # Our testing module
 import svntest
@@ -824,6 +824,87 @@ def co_with_obstructing_local_adds(sbox)
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
 #----------------------------------------------------------------------
+# Test if checking out from a Windows driveroot is supported.
+def checkout_wc_from_drive(sbox):
+  "checkout from the root of a Windows drive"
+
+  def find_the_next_available_drive_letter():
+    "find the first available drive"
+
+    # get the list of used drive letters, use some Windows specific function.
+    try:
+      import win32api
+
+      drives=win32api.GetLogicalDriveStrings()
+      drives=drives.split('\000')
+
+      for d in range(ord('G'), ord('Z')+1):
+        drive = chr(d)
+        if not drive + ':\\' in drives:
+          return drive
+    except ImportError:
+      # In ActiveState python x64 win32api is not available
+      for d in range(ord('G'), ord('Z')+1):
+        drive = chr(d)
+        if not os.path.isdir(drive + ':\\'):
+          return drive
+
+    return None
+
+  # Skip the test if not on Windows
+  if not svntest.main.windows:
+    raise svntest.Skip
+
+  # just create an empty folder, we'll checkout later.
+  sbox.build(create_wc = False)
+  svntest.main.safe_rmtree(sbox.wc_dir)
+  os.mkdir(sbox.wc_dir)
+
+  # create a virtual drive to the working copy folder
+  drive = find_the_next_available_drive_letter()
+  if drive is None:
+    raise svntest.Skip
+
+  subprocess.call(['subst', drive +':', sbox.repo_dir])
+  repo_url = 'file:///' + drive + ':/'
+  wc_dir = sbox.wc_dir
+  was_cwd = os.getcwd()
+
+  try:
+    expected_wc = svntest.main.greek_state.copy()
+    expected_output = wc.State(wc_dir, {
+      'A'                 : Item(status='A '),
+      'A/D'               : Item(status='A '),
+      'A/D/H'             : Item(status='A '),
+      'A/D/H/psi'         : Item(status='A '),
+      'A/D/H/chi'         : Item(status='A '),
+      'A/D/H/omega'       : Item(status='A '),
+      'A/D/G'             : Item(status='A '),
+      'A/D/G/tau'         : Item(status='A '),
+      'A/D/G/pi'          : Item(status='A '),
+      'A/D/G/rho'         : Item(status='A '),
+      'A/D/gamma'         : Item(status='A '),
+      'A/C'               : Item(status='A '),
+      'A/mu'              : Item(status='A '),
+      'A/B'               : Item(status='A '),
+      'A/B/E'             : Item(status='A '),
+      'A/B/E/alpha'       : Item(status='A '),
+      'A/B/E/beta'        : Item(status='A '),
+      'A/B/F'             : Item(status='A '),
+      'A/B/lambda'        : Item(status='A '),
+      'iota'              : Item(status='A '),
+    })
+    svntest.actions.run_and_verify_checkout(repo_url, wc_dir,
+                                            expected_output, expected_wc,
+                                            None, None, None, None,
+                                            '--force')
+
+  finally:
+    os.chdir(was_cwd)
+    # cleanup the virtual drive
+    subprocess.call(['subst', '/D', drive +':'])
+
+#----------------------------------------------------------------------
 
 # list all tests here, starting with None:
 test_list = [ None,
@@ -840,6 +921,7 @@ test_list = [ None,
               checkout_peg_rev,
               checkout_peg_rev_date,
               co_with_obstructing_local_adds,
+              checkout_wc_from_drive
             ]
 
 if __name__ == "__main__":

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/commit_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/commit_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/commit_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/commit_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  commit_tests.py:  testing fancy commit cases.
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -1496,8 +1496,11 @@ def commit_multiple_wc_multiple_repos(sb
   svntest.actions.run_and_verify_status(wc2_dir, expected_status2)
 
   # Commit should fail, since WCs come from different repositories.
+  # The exact error message depends on whether or not the tests are
+  # run below a 1.7 working copy
+  error_re = ".*(is not a|Are all targets part of the same) working copy.*"
   svntest.actions.run_and_verify_svn("Expected output on stderr doesn't match",
-                                     [], ".*is not a working copy.*",
+                                     [], error_re,
                                      'commit', '-m', 'log',
                                      wc1_dir, wc2_dir)
 
@@ -2430,7 +2433,7 @@ def set_invalid_revprops(sbox):
   svntest.actions.run_and_verify_svn(None, [],
                                      'svn: Revision property pair is empty',
                                      'mkdir', '-m', 'msg',
-				     '--with-revprop', '',
+                                     '--with-revprop', '',
                                      remote_dir)
 
 #----------------------------------------------------------------------

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/copy_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/copy_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/copy_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/copy_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  copy_tests.py:  testing the many uses of 'svn cp' and 'svn mv'
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -29,7 +29,7 @@ import stat, os, re, shutil
 
 # Our testing module
 import svntest
-
+from svntest import main
 from svntest.main import SVN_PROP_MERGEINFO
 
 # (abbreviation)
@@ -702,13 +702,16 @@ def copy_delete_commit(sbox):
   svntest.actions.run_and_verify_svn(None, None, [], 'cp',
                                      B_path, B2_path)
 
-  # delete a file
+  # delete two files
+  lambda_path = os.path.join(wc_dir, 'A', 'B2', 'lambda')
   alpha_path = os.path.join(wc_dir, 'A', 'B2', 'E', 'alpha')
-  svntest.actions.run_and_verify_svn(None, None, [], 'rm', alpha_path)
+  svntest.actions.run_and_verify_svn(None, None, [],
+                                     'rm', alpha_path, lambda_path)
 
   # commit copied tree containing a deleted file
   expected_output = svntest.wc.State(wc_dir, {
     'A/B2' : Item(verb='Adding'),
+    'A/B2/lambda' : Item(verb='Deleting'),
     'A/B2/E/alpha' : Item(verb='Deleting'),
     })
   svntest.actions.run_and_verify_commit(wc_dir,
@@ -4266,6 +4269,127 @@ def move_below_move(sbox):
                                         None, sbox.wc_dir)
 
 
+def reverse_merge_move(sbox):
+  """reverse merge move"""
+
+  # Alias for svntest.actions.run_and_verify_svn
+  rav_svn = svntest.actions.run_and_verify_svn
+
+  wc_dir = sbox.wc_dir
+  a_dir = os.path.join(wc_dir, 'A')
+  a_repo_url = sbox.repo_url + '/A'
+  sbox.build()
+
+  # Create another working copy path and checkout.
+  wc2_dir = sbox.add_wc_path('2')
+  rav_svn(None, None, [], 'co', sbox.repo_url, wc2_dir)
+
+  # Update working directory and ensure that we are at revision 1.
+  rav_svn(None, ["At revision 1.\n"], [], 'up', wc_dir)
+
+  # Add new folder and file, later commit
+  new_path = os.path.join(a_dir, 'New')
+  os.mkdir(new_path)
+  first_path = os.path.join(new_path, 'first')
+  svntest.main.file_append(first_path, 'appended first text')
+  svntest.main.run_svn(None, "add", new_path)
+  rav_svn(None, None, [], 'ci', wc_dir, '-m', 'Add new folder %s' % new_path)
+  rav_svn(None, ["At revision 2.\n"], [], 'up', wc_dir)
+
+  # Reverse merge to revert previous changes and commit
+  rav_svn(None, None, [], 'merge', '-c', '-2', a_repo_url, a_dir)
+  rav_svn(None, None, [], 'ci', '-m', 'Reverting svn merge -c -2.', a_dir)
+  rav_svn(None, ["At revision 3.\n"], [], 'up', wc_dir)
+
+  # Reverse merge again to undo last revert.
+  rav_svn(None, None, [], 'merge', '-c', '-3', a_repo_url, a_dir)
+
+  # Move new added file to another one and commit.
+  second_path = os.path.join(new_path, 'second')
+  rav_svn(None, None, [], 'move', first_path, second_path)
+  rav_svn(None, "Adding.*New|Adding.*first||Committed revision 4.", [],
+          'ci', '-m',
+          'Revert svn merge. svn mv %s %s.' % (first_path, second_path), a_dir)
+
+  # Update second working copy. There was a bug (at least on the 1.6.x
+  # branch) in which this update received both "first" and "second".
+  expected_output = svntest.wc.State(wc2_dir, {
+      'A/New'         : Item(status='A '),
+      'A/New/second'  : Item(status='A '),
+      })
+  svntest.actions.run_and_verify_update(wc2_dir,
+                                        expected_output,
+                                        None,
+                                        None)
+
+def nonrecursive_commit_of_copy(sbox):
+  """commit only top of copy; check child behavior"""
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  main.run_svn(None, 'cp', os.path.join(wc_dir, 'A'),
+               os.path.join(wc_dir, 'A_new'))
+  main.run_svn(None, 'cp', os.path.join(wc_dir, 'A/D/G'),
+               os.path.join(wc_dir, 'A_new/G_new'))
+  main.run_svn(None, 'rm', os.path.join(wc_dir, 'A_new/C'))
+  main.run_svn(None, 'rm', os.path.join(wc_dir, 'A_new/B/E'))
+
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.add({
+      'A_new'             : Item(status='A ', copied='+', wc_rev='-'),
+      'A_new/D'           : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/D/G'         : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/D/G/pi'      : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/D/G/rho'     : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/D/G/tau'     : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/D/H'         : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/D/H/psi'     : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/D/H/chi'     : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/D/H/omega'   : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/D/gamma'     : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/B'           : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/B/lambda'    : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/B/E'         : Item(status='D ', wc_rev='?'),
+      'A_new/B/E/alpha'   : Item(status='D ', wc_rev='?'),
+      'A_new/B/E/beta'    : Item(status='D ', wc_rev='?'),
+      'A_new/B/F'         : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/mu'          : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/C'           : Item(status='D ', wc_rev='?'),
+      'A_new/G_new'       : Item(status='A ', copied='+', wc_rev='-'),
+      'A_new/G_new/pi'    : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/G_new/rho'   : Item(status='  ', copied='+', wc_rev='-'),
+      'A_new/G_new/tau'   : Item(status='  ', copied='+', wc_rev='-'),
+    })
+
+
+  svntest.actions.run_and_verify_status(wc_dir, expected_status)
+  
+  expected_output = svntest.wc.State(wc_dir, {
+    'A_new': Item(verb='Adding'),
+    })
+  
+  # These nodes are added by the commit
+  expected_status.tweak('A_new', 'A_new/D', 'A_new/D/G', 'A_new/D/G/pi',
+                        'A_new/D/G/rho', 'A_new/D/G/tau', 'A_new/D/H',
+                        'A_new/D/H/psi', 'A_new/D/H/chi', 'A_new/D/H/omega',
+                        'A_new/D/gamma', 'A_new/B', 'A_new/B/lambda',
+                        'A_new/B/F', 'A_new/mu',
+                        status='  ', copied=None, wc_rev='2')
+
+  # And these are deleted with their parent (not sure if this is ok)
+  expected_status.remove('A_new/C', 'A_new/B/E', 'A_new/B/E/alpha',
+                         'A_new/B/E/beta')
+
+  # 'A_new/G_new' and everything below should still be added
+  # as their operation root was not committed
+  svntest.actions.run_and_verify_commit(wc_dir,
+                                        expected_output,
+                                        expected_status,
+                                        None,
+                                        wc_dir, '--depth', 'immediates')
+
+
 ########################################################################
 # Run the tests
 
@@ -4352,7 +4476,9 @@ test_list = [ None,
               path_copy_in_repo_2475,
               commit_copy_depth_empty,
               copy_below_copy,
-              XFail(move_below_move)
+              XFail(move_below_move),
+              reverse_merge_move,
+              XFail(nonrecursive_commit_of_copy),
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/davautocheck.sh
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/davautocheck.sh?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/davautocheck.sh (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/davautocheck.sh Tue Aug 10 18:06:17 2010
@@ -144,12 +144,15 @@ unset HTTPS_PROXY
 
 say "Using '$APXS'..."
 
+# Find the source and build directories. The build dir can be found if it is
+# the current working dir or the source dir.
+pushd ${SCRIPTDIR}/../../../ > /dev/null
+ABS_SRCDIR=$(pwd)
+popd > /dev/null
 if [ -x subversion/svn/svn ]; then
   ABS_BUILDDIR=$(pwd)
-elif [ -x $SCRIPTDIR/../../svn/svn ]; then
-  pushd $SCRIPTDIR/../../../ >/dev/null
-  ABS_BUILDDIR=$(pwd)
-  popd >/dev/null
+elif [ -x $ABS_SRCDIR/subversion/svn/svn ]; then
+  ABS_BUILDDIR=$ABS_SRCDIR
 else
   fail "Run this script from the root of Subversion's build tree!"
 fi
@@ -269,7 +272,7 @@ LoadModule          authz_svn_module "$M
 LockFile            lock
 User                $(id -un)
 Group               $(id -gn)
-Listen              localhost:$HTTPD_PORT
+Listen              $HTTPD_PORT
 ServerName          localhost
 PidFile             "$HTTPD_PID"
 LogFormat           "%h %l %u %t \"%r\" %>s %b" common
@@ -355,6 +358,12 @@ rm "$HTTPD_CFG-copy"
 
 say "HTTPD is good"
 
+if [ "$HTTP_LIBRARY" = "" ]; then
+  say "Using default dav library"
+else
+  say "Using dav library '$HTTP_LIBRARY'"
+fi
+
 if [ $# -eq 1 ] && [ "x$1" = 'x--no-tests' ]; then
   exit
 fi
@@ -368,7 +377,7 @@ else
   pushd "$ABS_BUILDDIR/subversion/tests/cmdline/" >/dev/null
   TEST="$1"
   shift
-  time "./${TEST}_tests.py" "--url=$BASE_URL" "$@"
+  time "$ABS_SRCDIR/subversion/tests/cmdline/${TEST}_tests.py" "--url=$BASE_URL" "$@"
   r=$?
   popd >/dev/null
 fi

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/depth_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/depth_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/depth_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/depth_tests.py Tue Aug 10 18:06:17 2010
@@ -5,7 +5,7 @@
 #                   depth-immediates, depth-infinity).
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -104,8 +104,10 @@ def verify_depth(msg, depth, path="."):
       if line.startswith("Depth:"):
         raise svntest.failure(msg)
   else:
-    svntest.actions.run_and_verify_svn_match_any(
-      msg, "^Depth: %s\n$" % depth, [], "info", path)
+    expected_stdout = svntest.verify.ExpectedOutput("Depth: %s\n" % depth,
+                                                    match_all=False)
+    svntest.actions.run_and_verify_svn(
+      msg, expected_stdout, [], "info", path)
 
 #----------------------------------------------------------------------
 # Ensure that 'checkout --depth=empty' results in a depth-empty working copy.
@@ -2226,8 +2228,8 @@ def excluded_path_misc_operation(sbox):
   svntest.actions.run_and_verify_commit(wc_dir,
                                         expected_output,
                                         expected_status,
-					None,
-					wc_dir)
+                                        None,
+                                        wc_dir)
 
   # Relocate wc, with excluded items in it.
   repo_dir = sbox.repo_dir

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/diff_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/diff_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/diff_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/diff_tests.py Tue Aug 10 18:06:17 2010
@@ -4,7 +4,7 @@
 #  diff_tests.py:  some basic diff tests
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/entries_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/entries_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/entries_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/entries_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  entries_tests.py:  test the old entries API using entries-dump
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/export_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/export_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/export_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/export_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  export_tests.py:  testing export cases.
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -409,12 +409,12 @@ def export_to_explicit_cwd(sbox):
   sbox.build(create_wc = False, read_only = True)
 
   svntest.main.safe_rmtree(sbox.wc_dir)
-  expected_output = svntest.tree.build_generic_tree([
-      Item(status='A ').as_node_tuple('iota'),
-    ]).as_state()
-  expected_disk = svntest.tree.build_generic_tree([
-      Item(contents="This is the file 'iota'.\n").as_node_tuple('iota'),
-    ]).as_state()
+  expected_output = svntest.wc.State('', {
+      'iota': Item(status='A '),
+      })
+  expected_disk = svntest.wc.State('', {
+      'iota': Item(contents="This is the file 'iota'.\n"),
+      })
 
   os.mkdir(sbox.wc_dir)
   os.chdir(sbox.wc_dir)

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/externals_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/externals_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/externals_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/externals_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  module_tests.py:  testing modules / external sources.
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -1348,7 +1348,7 @@ def switch_relative_external(sbox):
                                      '--quiet', wc_dir)
 
   # Okay.  We now want to switch A to A_copy, which *should* cause
-  # A/D/ext to point to the URL for A_copy/D/ext.
+  # A/D/ext to point to the URL for A_copy/B (instead of A/B).
   svntest.actions.run_and_verify_svn(None, None, [], 'sw',
                                      '--quiet', A_copy_url, A_path)
 
@@ -1583,7 +1583,7 @@ test_list = [ None,
               external_into_path_with_spaces,
               binary_file_externals,
               XFail(update_lose_file_external),
-              XFail(switch_relative_external),
+              switch_relative_external,
               export_sparse_wc_with_externals,
               relegate_external,
               wc_repos_file_externals,

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/getopt_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/getopt_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/getopt_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/getopt_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  getopt_tests.py:  testing the svn command line processing
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -205,7 +205,7 @@ test_list = [ None,
               getopt__help,
               getopt_help,
               getopt_help_bogus_cmd,
-              getopt_help_log_switch
+              getopt_help_log_switch,
             ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/history_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/history_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/history_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/history_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  history_tests.py:  testing history-tracing code
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/import_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/import_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/import_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/import_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  import_tests.py:  import tests
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/info_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/info_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/info_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/info_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  info_tests.py:  testing the svn info command
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -292,7 +292,7 @@ def info_on_mkdir(sbox):
 test_list = [ None,
               info_with_tree_conflicts,
               info_on_added_file,
-              info_on_mkdir
+              info_on_mkdir,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/lock_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/lock_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/lock_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/lock_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  lock_tests.py:  testing versioned properties
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -1451,7 +1451,7 @@ def lock_path_not_in_head(sbox):
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'delete', lambda_path, D_path)
   svntest.actions.run_and_verify_svn(None, None, [], 'commit',
-                                     '-m', 'Some deletions', wc_dir)  
+                                     '-m', 'Some deletions', wc_dir)
   svntest.actions.run_and_verify_svn(None, None, [], 'up', '-r1', wc_dir)
   expected_lock_fail_err_re = "svn: warning:.*" \
   "((Path .* doesn't exist in HEAD revision)" \

Modified: subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/log_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/log_tests.py?rev=984153&r1=984152&r2=984153&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/log_tests.py (original)
+++ subversion/branches/ignore-mergeinfo/subversion/tests/cmdline/log_tests.py Tue Aug 10 18:06:17 2010
@@ -3,7 +3,7 @@
 #  log_tests.py:  testing "svn log"
 #
 #  Subversion is a tool for revision control.
-#  See http://subversion.tigris.org for more information.
+#  See http://subversion.apache.org for more information.
 #
 # ====================================================================
 #    Licensed to the Apache Software Foundation (ASF) under one
@@ -68,6 +68,7 @@ msg_separator = '-----------------------
 Skip = svntest.testcase.Skip
 SkipUnless = svntest.testcase.SkipUnless
 XFail = svntest.testcase.XFail
+Wimp = svntest.testcase.Wimp
 Item = svntest.wc.StateItem
 
 
@@ -1432,22 +1433,35 @@ def log_xml_with_bad_data(sbox):
 
 def merge_sensitive_log_target_with_bogus_mergeinfo(sbox):
   "'svn log -g target_with_bogus_mergeinfo'"
-  #Refer issue 3172 for details.
-  #Create greek tree
-  #svn ps 'svn:mergeinfo' '/A/B:0' A/D
-  #svn ci -m 'setting bogus mergeinfo'
-  #svn log -g -r2
+  # A test for issue #3172 'svn log -g' seems to encounter error on server':
+  # 'log -g' fails the moment it encounters a bogus mergeinfo which claims a
+  # merge from a non-existentpath@REV1-REV2.
+  #
+  # ### Present test: test that 'svn log -g' does not report an error.
+  # ### Desirable test: test that 'svn log -g' produces the results expected
+  #     from ignoring all such revisions and reporting on all revisions that
+  #     are valid.
+
+  # In r2, create /A/B-copied as a copy of something that existed at r1, and
+  # /A/B-new as something new.  Manually set mergeinfo on /A/C@2 saying it
+  # was merged from the non-existent r1 of /A/B-copied, and on /A/D@2 saying
+  # it was merged from the non-existent r1 of /A/B-new.
   sbox.build()
   wc_path = sbox.wc_dir
+  B_copied_path = os.path.join(wc_path, 'A', 'B-copied')
+  B_new_path = os.path.join(wc_path, 'A', 'B-new')
+  B_path = os.path.join(wc_path, 'A', 'B')
+  C_path = os.path.join(wc_path, 'A', 'C')
   D_path = os.path.join(wc_path, 'A', 'D')
-  svntest.main.run_svn(None, 'ps', SVN_PROP_MERGEINFO, '/A/B:0', D_path)
-  #commit at r2
-  svntest.main.run_svn(None, 'ci', '-m', 'setting bogus mergeinfo', D_path)
-  exit_code, output, err = svntest.actions.run_and_verify_svn(None, None,
-                                                              [], 'log',
-                                                              '-g', D_path)
-  if len(err):
-    raise svntest.Failure("svn log -g target_with_bogus_mergeinfo fails")
+  svntest.main.run_svn(None, 'cp', B_path, B_copied_path)
+  svntest.main.run_svn(None, 'ps', SVN_PROP_MERGEINFO, '/A/B-copied:1', C_path)
+  svntest.main.run_svn(None, 'mkdir', B_new_path)
+  svntest.main.run_svn(None, 'ps', SVN_PROP_MERGEINFO, '/A/B-new:1', D_path)
+  svntest.main.run_svn(None, 'ci', '-m', 'setting bogus mergeinfo', wc_path)
+
+  # The tests: Check that 'svn log -g' doesn't error on these.
+  svntest.actions.run_and_verify_svn(None, None, [], 'log', '-g', C_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'log', '-g', D_path)
 
 def merge_sensitive_log_added_mergeinfo_replaces_inherited(sbox):
   "log -g and explicit mergeinfo replacing inherited"
@@ -1472,6 +1486,11 @@ def merge_sensitive_log_added_mergeinfo_
     'G/rho'   : Item(status='U '),
     'H/omega' : Item(status='U '),
     })
+  expected_mergeinfo_output = wc.State(D_COPY_path, {
+    ''        : Item(status=' U'),
+    })
+  expected_elision_output = wc.State(D_COPY_path, {
+    })
   expected_status = wc.State(D_COPY_path, {
     ''        : Item(status=' M', wc_rev=2),
     'G'       : Item(status='  ', wc_rev=2),
@@ -1498,8 +1517,10 @@ def merge_sensitive_log_added_mergeinfo_
     })
   expected_skip = wc.State(D_COPY_path, { })
   svntest.actions.run_and_verify_merge(D_COPY_path, None, None,
-                                       sbox.repo_url + '/A/D',
+                                       sbox.repo_url + '/A/D', None,
                                        expected_output,
+                                       expected_mergeinfo_output,
+                                       expected_elision_output,
                                        expected_disk,
                                        expected_status,
                                        expected_skip,
@@ -1534,6 +1555,11 @@ def merge_sensitive_log_added_mergeinfo_
   expected_output = wc.State(H_COPY_path, {
     'psi' : Item(status='U ')
     })
+  expected_mergeinfo_output = wc.State(H_COPY_path, {
+    ''    : Item(status=' G'),
+    })
+  expected_elision_output = wc.State(H_COPY_path, {
+    })
   expected_status = wc.State(H_COPY_path, {
     ''      : Item(status=' M', wc_rev=7),
     'psi'   : Item(status='M ', wc_rev=7),
@@ -1548,8 +1574,11 @@ def merge_sensitive_log_added_mergeinfo_
     })
   expected_skip = wc.State(H_COPY_path, { })
   svntest.actions.run_and_verify_merge(H_COPY_path, '3', '2',
-                                       sbox.repo_url + '/A/D/H',
-                                       expected_output, expected_disk,
+                                       sbox.repo_url + '/A/D/H', None,
+                                       expected_output,
+                                       expected_mergeinfo_output,
+                                       expected_elision_output,
+                                       expected_disk,
                                        expected_status, expected_skip,
                                        None, None, None, None, None, 1)
 
@@ -1650,6 +1679,57 @@ def merge_sensitive_log_propmod_merge_in
   run_log_g_r8(A_COPY_path)
   run_log_g_r8(A_COPY_psi_path)
 
+#----------------------------------------------------------------------
+# Should be able to run 'svn log' against an uncommitted copy or move
+# destination.  See http://svn.haxx.se/dev/archive-2010-01/0492.shtml.
+def log_of_local_copy(sbox):
+  "svn log on an uncommitted copy"
+
+  guarantee_repos_and_wc(sbox)
+
+  C_path         = os.path.join(sbox.wc_dir, "A", "C")
+  C_moved_path   = os.path.join(sbox.wc_dir, "A", "C_MOVED")
+  psi_path       = os.path.join(sbox.wc_dir, "A", "D", "H", "psi")
+  psi_moved_path = os.path.join(sbox.wc_dir, "A", "D", "H", "psi_moved")
+
+  # Get the logs for a directory and a file.
+  exit_code, C_log_out, err = svntest.actions.run_and_verify_svn(
+    None, None, [], 'log', '-v', C_path)
+  exit_code, psi_log_out, err = svntest.actions.run_and_verify_svn(
+    None, None, [], 'log', '-v', psi_path)
+
+  # Move that directory and file.
+  svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+                                     C_path, C_moved_path)
+  svntest.actions.run_and_verify_svn(None, None, [], 'mv',
+                                     psi_path, psi_moved_path)
+
+  # Get the logs for the move destinations.
+  #
+  # This was failing with:
+  #
+  #   svn log -v log_tests-29\A\C_MOVED
+  #    ..\..\..\subversion\svn\log-cmd.c:600: (apr_err=160013)
+  #    ..\..\..\subversion\libsvn_client\log.c:627: (apr_err=160013)
+  #    ..\..\..\subversion\libsvn_repos\log.c:1449: (apr_err=160013)
+  #    ..\..\..\subversion\libsvn_repos\log.c:1092: (apr_err=160013)
+  #    ..\..\..\subversion\libsvn_fs_fs\tree.c:2818: (apr_err=160013)
+  #    svn: File not found: revision 9, path '/A/C_MOVED'
+  #
+  exit_code, C_moved_log_out, err = svntest.actions.run_and_verify_svn(
+    None, None, [], 'log', '-v', C_moved_path)
+  exit_code, psi_moved_log_out, err = svntest.actions.run_and_verify_svn(
+    None, None, [], 'log', '-v', psi_moved_path)
+
+  # The logs of the move source and destinations should be the same.
+  if C_log_out != C_moved_log_out:
+    raise svntest.Failure("Log on uncommitted move destination '%s' " \
+                          "differs from that on move source '%s'"
+                          % (C_moved_path, C_path))
+  if psi_log_out != psi_moved_log_out:
+    raise svntest.Failure("Log on uncommitted move destination '%s' " \
+                          "differs from that on move source '%s'"
+                          % (psi_moved_path, psi_path))
 
 ########################################################################
 # Run the tests
@@ -1686,11 +1766,12 @@ test_list = [ None,
               retrieve_revprops,
               log_xml_with_bad_data,
               SkipUnless(merge_sensitive_log_target_with_bogus_mergeinfo,
-                         server_has_mergeinfo),
+                              server_has_mergeinfo),
               SkipUnless(merge_sensitive_log_added_mergeinfo_replaces_inherited,
                          server_has_mergeinfo),
               SkipUnless(merge_sensitive_log_propmod_merge_inheriting_path,
                          server_has_mergeinfo),
+              log_of_local_copy,
              ]
 
 if __name__ == '__main__':