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 2010/01/06 18:37:34 UTC

svn commit: r896562 - in /subversion/trunk: ./ subversion/libsvn_client/ subversion/tests/cmdline/

Author: cmpilato
Date: Wed Jan  6 17:37:21 2010
New Revision: 896562

URL: http://svn.apache.org/viewvc?rev=896562&view=rev
Log:
Reintegrate the 'issue-3242-dev' branch into trunk.

Modified:
    subversion/trunk/   (props changed)
    subversion/trunk/subversion/libsvn_client/copy.c
    subversion/trunk/subversion/libsvn_client/delete.c
    subversion/trunk/subversion/libsvn_client/merge.c
    subversion/trunk/subversion/libsvn_client/mergeinfo.c
    subversion/trunk/subversion/libsvn_client/mergeinfo.h
    subversion/trunk/subversion/tests/cmdline/authz_tests.py

Propchange: subversion/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jan  6 17:37:21 2010
@@ -1,34 +1,35 @@
-subversion/branches/1.5.x-r30215:870312
-subversion/branches/bdb-reverse-deltas:872050-872529
-subversion/branches/diff-callbacks3:870059-870761
-subversion/branches/dont-save-plaintext-passwords-by-default:870728-871118
-subversion/branches/double-delete:870511-872970
-subversion/branches/explore-wc:875486,875493,875497,875507,875511,875514,875559,875580-875581,875584,875587,875611,875627,875647,875667-875668,875711-875712,875733-875734,875736,875744-875748,875751,875758,875782,875795-875796,875830,875836,875838,875842,875852,875855,875864,875870,875873,875880,875885-875888,875890,875897-875898,875905,875907-875909,875935,875943-875944,875946,875979,875982-875983,875985-875986,875990,875997
-subversion/branches/file-externals:871779-873302
-subversion/branches/fs-rep-sharing:869036-873803
-subversion/branches/fsfs-pack:873717-874575
-subversion/branches/gnome-keyring:870558-871410
-subversion/branches/http-protocol-v2:874395-876041
-subversion/branches/in-memory-cache:869829-871452
-subversion/branches/issue-2843-dev:871432-874179
-subversion/branches/issue-3000:871713,871716-871719,871721-871726,871728,871734
-subversion/branches/issue-3067-deleted-subtrees:873375-874084
-subversion/branches/issue-3148-dev:875193-875204
-subversion/branches/issue-3220-dev:872210-872226
-subversion/branches/issue-3334-dirs:875156-875867
-subversion/branches/kwallet:870785-871314
-subversion/branches/log-g-performance:870941-871032
-subversion/branches/merge-skips-obstructions:874525-874615
-subversion/branches/ra_serf-digest-authn:875693-876404
-subversion/branches/reintegrate-improvements:873853-874164
-subversion/branches/subtree-mergeinfo:876734-878766
-subversion/branches/svn-mergeinfo-enhancements:870119-870195,870197-870288
-subversion/branches/svnpatch-diff:865738-876477
-subversion/branches/svnraisetc:874709-875149
-subversion/branches/svnserve-logging:869828-870893
-subversion/branches/tc-issue-3334:874697-874773
-subversion/branches/tc-merge-notify:874017-874062
-subversion/branches/tc-resolve:874191-874239
-subversion/branches/tc_url_rev:874351-874483
-subversion/branches/tree-conflicts:868291-873154
-subversion/branches/tree-conflicts-notify:873926-874008
+/subversion/branches/1.5.x-r30215:870312
+/subversion/branches/bdb-reverse-deltas:872050-872529
+/subversion/branches/diff-callbacks3:870059-870761
+/subversion/branches/dont-save-plaintext-passwords-by-default:870728-871118
+/subversion/branches/double-delete:870511-872970
+/subversion/branches/explore-wc:875486,875493,875497,875507,875511,875514,875559,875580-875581,875584,875587,875611,875627,875647,875667-875668,875711-875712,875733-875734,875736,875744-875748,875751,875758,875782,875795-875796,875830,875836,875838,875842,875852,875855,875864,875870,875873,875880,875885-875888,875890,875897-875898,875905,875907-875909,875935,875943-875944,875946,875979,875982-875983,875985-875986,875990,875997
+/subversion/branches/file-externals:871779-873302
+/subversion/branches/fs-rep-sharing:869036-873803
+/subversion/branches/fsfs-pack:873717-874575
+/subversion/branches/gnome-keyring:870558-871410
+/subversion/branches/http-protocol-v2:874395-876041
+/subversion/branches/in-memory-cache:869829-871452
+/subversion/branches/issue-2843-dev:871432-874179
+/subversion/branches/issue-3000:871713,871716-871719,871721-871726,871728,871734
+/subversion/branches/issue-3067-deleted-subtrees:873375-874084
+/subversion/branches/issue-3148-dev:875193-875204
+/subversion/branches/issue-3220-dev:872210-872226
+/subversion/branches/issue-3242-dev:879653-896436
+/subversion/branches/issue-3334-dirs:875156-875867
+/subversion/branches/kwallet:870785-871314
+/subversion/branches/log-g-performance:870941-871032
+/subversion/branches/merge-skips-obstructions:874525-874615
+/subversion/branches/ra_serf-digest-authn:875693-876404
+/subversion/branches/reintegrate-improvements:873853-874164
+/subversion/branches/subtree-mergeinfo:876734-878766
+/subversion/branches/svn-mergeinfo-enhancements:870119-870195,870197-870288
+/subversion/branches/svnpatch-diff:865738-876477
+/subversion/branches/svnraisetc:874709-875149
+/subversion/branches/svnserve-logging:869828-870893
+/subversion/branches/tc-issue-3334:874697-874773
+/subversion/branches/tc-merge-notify:874017-874062
+/subversion/branches/tc-resolve:874191-874239
+/subversion/branches/tc_url_rev:874351-874483
+/subversion/branches/tree-conflicts:868291-873154
+/subversion/branches/tree-conflicts-notify:873926-874008

Modified: subversion/trunk/subversion/libsvn_client/copy.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/copy.c?rev=896562&r1=896561&r2=896562&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/copy.c (original)
+++ subversion/trunk/subversion/libsvn_client/copy.c Wed Jan  6 17:37:21 2010
@@ -73,7 +73,7 @@
    *TARGET_MERGEINFO.  ADM_ACCESS may be NULL, if SRC_PATH_OR_URL is an
    URL.  If NO_REPOS_ACCESS is set, this function is disallowed from
    consulting the repository about anything.  RA_SESSION may be NULL but
-   only if NO_REPOS_ACCESS is true. */
+   only if NO_REPOS_ACCESS is true.  */
 static svn_error_t *
 calculate_target_mergeinfo(svn_ra_session_t *ra_session,
                            apr_hash_t **target_mergeinfo,
@@ -119,20 +119,22 @@
 
   if (! locally_added)
     {
-      const char *mergeinfo_path;
-
       if (! no_repos_access)
         {
-          /* Fetch any existing (explicit) mergeinfo. */
-          SVN_ERR(svn_client__path_relative_to_root(&mergeinfo_path,
-                                                    ctx->wc_ctx, src_url,
-                                                    entry ? entry->repos : NULL,
-                                                    FALSE, ra_session,
-                                                    pool, pool));
+          /* Fetch any existing (explicit) mergeinfo.  We'll temporarily
+             reparent to the target URL here, just to keep the code simple.
+             We could, as an alternative, first see if the target URL was a
+             child of the session URL and use the relative "remainder", 
+             falling back to this reparenting as necessary.  */
+          const char *old_session_url = NULL;
+          SVN_ERR(svn_client__ensure_ra_session_url(&old_session_url,
+                                                    ra_session, src_url, pool));
           SVN_ERR(svn_client__get_repos_mergeinfo(ra_session, &src_mergeinfo,
-                                                  mergeinfo_path, src_revnum,
+                                                  "", src_revnum,
                                                   svn_mergeinfo_inherited,
                                                   TRUE, pool));
+          if (old_session_url)
+            SVN_ERR(svn_ra_reparent(ra_session, old_session_url, pool));
         }
       else
         {
@@ -710,13 +712,15 @@
                     svn_boolean_t is_move,
                     apr_pool_t *pool)
 {
+  svn_error_t *err;
   apr_array_header_t *paths = apr_array_make(pool, 2 * copy_pairs->nelts,
                                              sizeof(const char *));
   apr_hash_t *action_hash = apr_hash_make(pool);
   apr_array_header_t *path_infos;
-  const char *top_url, *message, *repos_root;
-  svn_revnum_t youngest;
-  svn_ra_session_t *ra_session;
+  const char *top_url, *top_url_all, *top_url_dst;
+  const char *message, *repos_root, *ignored_url;
+  svn_revnum_t youngest = SVN_INVALID_REVNUM;
+  svn_ra_session_t *ra_session = NULL;
   const svn_delta_editor_t *editor;
   void *edit_baton;
   void *commit_baton;
@@ -724,25 +728,89 @@
   apr_array_header_t *new_dirs = NULL;
   apr_hash_t *commit_revprops;
   int i;
-  svn_error_t *err;
+  svn_client__copy_pair_t *first_pair =
+    APR_ARRAY_IDX(copy_pairs, 0, svn_client__copy_pair_t *);
 
-  /* Create a path_info struct for each src/dst pair, and initialize it. */
+  /* Open an RA session to the first copy pair's destination.  We'll
+     be verifying that every one of our copy source and destination
+     URLs is or is beneath this sucker's repository root URL as a form
+     of a cheap(ish) sanity check.  */
+  SVN_ERR(svn_client__open_ra_session_internal(&ra_session, first_pair->src,
+                                               NULL, NULL, FALSE, TRUE,
+                                               ctx, pool));
+  SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root, pool));
+
+  /* Verify that sources and destinations are all at or under
+     REPOS_ROOT.  While here, create a path_info struct for each
+     src/dst pair and initialize portions of it with normalized source
+     location information.  */
   path_infos = apr_array_make(pool, copy_pairs->nelts,
                               sizeof(path_driver_info_t *));
   for (i = 0; i < copy_pairs->nelts; i++)
     {
       path_driver_info_t *info = apr_pcalloc(pool, sizeof(*info));
+      svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i,
+                                                    svn_client__copy_pair_t *);
+      apr_hash_t *mergeinfo;
+      svn_opt_revision_t *src_rev, *ignored_rev, dead_end_rev;
+      dead_end_rev.kind = svn_opt_revision_unspecified;
+
+      /* Are the source and destination URLs at or under REPOS_ROOT? */
+      if (! (svn_uri_is_ancestor(repos_root, pair->src)
+             && svn_uri_is_ancestor(repos_root, pair->dst)))
+        return svn_error_create
+          (SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+           _("Source and destination URLs appear not to all point to the "
+             "same repository."));
+
+      /* Resolve revision keywords and such into real revision number,
+         passing NULL for the path (to ensure error if trying to get a
+         revision based on the working copy). */
+      SVN_ERR(svn_client__get_revision_number(&pair->src_revnum, &youngest,
+                                              ctx->wc_ctx, NULL,
+                                              ra_session,
+                                              &pair->src_op_revision, pool));
+
+      /* Run the history function to get the source's URL in the
+         operational revision. */
+      SVN_ERR(svn_client__ensure_ra_session_url(&ignored_url, ra_session,
+                                                pair->src, pool));
+      SVN_ERR(svn_client__repos_locations(&pair->src, &src_rev,
+                                          &ignored_url, &ignored_rev,
+                                          ra_session,
+                                          pair->src, &pair->src_peg_revision,
+                                          &pair->src_op_revision,
+                                          &dead_end_rev, ctx, pool));
+     
+      /* Go ahead and grab mergeinfo from the source, too. */
+      SVN_ERR(svn_client__ensure_ra_session_url(&ignored_url, ra_session,
+                                                pair->src, pool));
+      SVN_ERR(calculate_target_mergeinfo(ra_session, &mergeinfo, NULL, pair->src,
+                                         pair->src_revnum, FALSE, ctx, pool));
+      if (mergeinfo)
+        SVN_ERR(svn_mergeinfo_to_string(&info->mergeinfo, mergeinfo, pool));
+
+      /* Plop an INFO structure onto our array thereof. */
+      info->src_url = pair->src;
+      info->src_revnum = pair->src_revnum;
       info->resurrection = FALSE;
       APR_ARRAY_PUSH(path_infos, path_driver_info_t *) = info;
     }
 
-  /* We have to open our session to the longest path common to all
-     SRC_URLS and DST_URLS in the repository so we can do existence
-     checks on all paths, and so we can operate on all paths in the
-     case of a move. */
-  get_copy_pair_ancestors(copy_pairs, NULL, NULL, &top_url, pool);
-
-  /* Check each src/dst pair for resurrection. */
+  /* If this is a move, we have to open our session to the longest
+     path common to all SRC_URLS and DST_URLS in the repository so we
+     can do existence checks on all paths, and so we can operate on
+     all paths in the case of a move.  But if this is *not* a move,
+     then opening our session at the longest path common to sources
+     *and* destinations might be an optimization when the user is
+     authorized to access all that stuff, but could cause the
+     operation to fail altogether otherwise.  See issue #3242.  */
+  get_copy_pair_ancestors(copy_pairs, NULL, &top_url_dst, &top_url_all, pool);
+  top_url = is_move ? top_url_all : top_url_dst;
+
+  /* Check each src/dst pair for resurrection, and verify that TOP_URL
+     is anchored high enough to cover all the editor_t activities
+     required for this operation.  */
   for (i = 0; i < copy_pairs->nelts; i++)
     {
       svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i,
@@ -750,97 +818,103 @@
       path_driver_info_t *info = APR_ARRAY_IDX(path_infos, i,
                                                path_driver_info_t *);
 
+      /* Source and destination are the same?  It's a resurrection. */
       if (strcmp(pair->src, pair->dst) == 0)
-        {
-          info->resurrection = TRUE;
+        info->resurrection = TRUE;
 
-          /* Special edge-case!  (issue #683)  If you're resurrecting a
-             deleted item like this:  'svn cp -rN src_URL dst_URL', then
-             it's possible for src_URL == dst_URL == top_url.  In this
-             situation, we want to open an RA session to be at least the
-             *parent* of all three. */
-          if (strcmp(pair->src, top_url) == 0)
-            {
-              top_url = svn_uri_dirname(top_url, pool);
-            }
+      /* We need to add each dst_URL, and (in a move) we'll need to
+         delete each src_URL.  Our selection of TOP_URL so far ensures
+         that all our destination URLs (and source URLs, for moves)
+         are at least as deep as TOP_URL, but we need to make sure
+         that TOP_URL is an *ancestor* of all our to-be-edited paths.
+
+         Issue #683 is demonstrates this scenario.  If you're
+         resurrecting a deleted item like this: 'svn cp -rN src_URL
+         dst_URL', then src_URL == dst_URL == top_url.  In this
+         situation, we want to open an RA session to be at least the
+         *parent* of all three. */
+      if ((strcmp(top_url, pair->dst) == 0)
+          && (strcmp(top_url, repos_root) != 0))
+        {
+          top_url = svn_uri_dirname(top_url, pool);
         }
-    }
-
-  /* Open an RA session for the URL. Note that we don't have a local
-     directory, nor a place to put temp files. */
-  err = svn_client__open_ra_session_internal(&ra_session, top_url,
-                                             NULL, NULL, FALSE, TRUE,
-                                             ctx, pool);
-
-  /* If the two URLs appear not to be in the same repository, then
-     top_url will be empty and the call to svn_ra_open3()
-     above will have failed.  Below we check for that, and propagate a
-     descriptive error back to the user.
-
-     Ideally, we'd contact the repositories and compare their UUIDs to
-     determine whether or not src and dst are in the same repository,
-     instead of depending on an essentially textual comparison.
-     However, it is simpler to assume that if someone is using the
-     same repository, then they will use the same hostname/path to
-     refer to it both times.  Conversely, if the repositories are
-     different, then they can't share a non-empty prefix, so top_url
-     would still be "" and svn_ra_get_library() would still error.
-     Thus we can get this check without extra network turnarounds to
-     fetch the UUIDs.
-   */
-  if (err)
-    {
-      if ((err->apr_err == SVN_ERR_RA_ILLEGAL_URL)
-          && ((top_url == NULL) || (top_url[0] == '\0')))
+      if (is_move
+          && (strcmp(top_url, pair->src) == 0)
+          && (strcmp(top_url, repos_root) != 0))
         {
-          svn_client__copy_pair_t *first_pair =
-            APR_ARRAY_IDX(copy_pairs, 0, svn_client__copy_pair_t *);
-          svn_error_clear(err);
-
-          return svn_error_createf
-            (SVN_ERR_UNSUPPORTED_FEATURE, NULL,
-             _("Source and dest appear not to be in the same repository "
-               "(src: '%s'; dst: '%s')"),
-             first_pair->src, first_pair->dst);
+          top_url = svn_uri_dirname(top_url, pool);
         }
-      else
-        return svn_error_return(err);
     }
 
-  /* Make a list in NEW_DIRS of the parent directories of the destination
-     that don't yet exist.  We do not have to worry about
-     reparenting the ra session because top_url is a common ancestor of the
-     destination and sources.  The sources exist, so therefore top_url must
-     also exist. */
+  /* Point the RA session to our current TOP_URL. */
+  SVN_ERR(svn_client__ensure_ra_session_url(&ignored_url, ra_session,
+                                            top_url, pool));
+
+  /* If we're allowed to create nonexistent parent directories of our
+     destinations, then make a list in NEW_DIRS of the parent
+     directories of the destination that don't yet exist.  */
   if (make_parents)
     {
-      svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, 0,
-                                                    svn_client__copy_pair_t *);
       const char *dir;
 
       new_dirs = apr_array_make(pool, 0, sizeof(const char *));
-      dir = svn_uri_is_child(top_url, svn_uri_dirname(pair->dst, pool),
-                             pool);
-
-      /* Imagine a situation where the user tries to copy an existing source
-         directory to nonexistent directory with --parents options specified:
 
-            svn copy --parents URL/src URL/dst
+      /* If this is a move, TOP_URL is at least the common ancestor of
+         all the paths (sources and destinations) involved.  Assuming
+         the sources exist (which is fair, because if they don't, this
+         whole operation will fail anyway), TOP_URL must also exist.
+         So it's the paths between TOP_URL and the destinations which
+         we have to check for existence.  But here, we take advantage
+         of the knowledge of our caller.  We know that if there are
+         multiple copy/move operations being requested, then the
+         destinations of the copies/moves will all be siblings of one
+         another.  Therefore, we need only to check for the
+         nonexistent paths between TOP_URL and *one* of our
+         destinations to find nonexistent parents of all of them.  */
+      if (is_move)
+        {
+          /* Imagine a situation where the user tries to copy an
+             existing source directory to nonexistent directory with
+             --parents options specified:
+
+                svn copy --parents URL/src URL/dst
+
+             where src exists and dst does not.  The svn_uri_dirname()
+             call above will produce a string equivalent to TOP_URL,
+             which means svn_uri_is_child() will return NULL.  In this
+             case, do not try to add dst to the NEW_DIRS list since it
+             will be added to the commit items array later in this
+             function. */
+          dir = svn_uri_is_child(top_url,
+                                 svn_uri_dirname(first_pair->dst, pool),
+                                 pool);
+          if (dir)
+            SVN_ERR(find_absent_parents1(ra_session,
+                                         svn_path_uri_decode(dir, pool),
+                                         new_dirs, pool));
+        }
+      /* If, however, this is *not* a move, TOP_URL only points to the
+         common ancestor of our destination path(s), or possibly one
+         level higher.  We'll need to do an existence crawl toward the
+         root of the repository, starting with one of our destinations
+         (see "... take advantage of the knowledge of our caller ..."
+         above), and possibly adjusting TOP_URL as we go. */
+      else
+        {
+          apr_array_header_t *new_urls =
+            apr_array_make(pool, 0, sizeof(const char *));
+          SVN_ERR(find_absent_parents2(ra_session, &top_url, new_urls, pool));
 
-         where src exists and dst does not.  The svn_uri_dirname() call above
-         will produce a string equivalent to top_url, which means
-         svn_uri_is_child() will return NULL.  In this case, do not try to add
-         dst to the new_dirs list since it will be added to the commit items
-         array later in this function. */
-
-      if (dir)
-        SVN_ERR(find_absent_parents1(ra_session,
-                                     svn_path_uri_decode(dir, pool),
-                                     new_dirs, pool));
+          /* Convert absolute URLs into URLs relative to TOP_URL. */
+          for (i = 0; i < new_urls->nelts; i++)
+            {
+              const char *new_url = APR_ARRAY_IDX(new_urls, i, const char *);
+              dir = svn_uri_is_child(top_url, new_url, pool);
+              APR_ARRAY_PUSH(new_dirs, const char *) = dir ? dir : "";
+            }
+        }
     }
 
-  SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root, pool));
-
   /* For each src/dst pair, check to see if that SRC_URL is a child of
      the DST_URL (excepting the case where DST_URL is the repo root).
      If it is, and the parent of DST_URL is the current TOP_URL, then we
@@ -853,90 +927,80 @@
       path_driver_info_t *info = APR_ARRAY_IDX(path_infos, i,
                                                path_driver_info_t *);
 
-      if (strcmp(pair->dst, repos_root) != 0
-          && svn_uri_is_child(pair->dst, pair->src, pool) != NULL)
+      if ((strcmp(pair->dst, repos_root) != 0)
+          && (svn_uri_is_child(pair->dst, pair->src, pool) != NULL))
         {
           info->resurrection = TRUE;
           top_url = svn_uri_dirname(top_url, pool);
-
           SVN_ERR(svn_ra_reparent(ra_session, top_url, pool));
         }
     }
 
-  /* Fetch the youngest revision. */
-  SVN_ERR(svn_ra_get_latest_revnum(ra_session, &youngest, pool));
-
+  /* Get the portions of the SRC and DST URLs that are relative to
+     TOP_URL (URI-decoding them while we're at it), verify that the
+     source exists and the proposed destination does not, and toss
+     what we've learned into the INFO array.  (For copies -- that is,
+     non-moves -- the relative source URL NULL because it isn't a
+     child of the TOP_URL at all.  That's okay, we'll deal with
+     it.)  */
   for (i = 0; i < copy_pairs->nelts; i++)
     {
-      svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i,
-                                                    svn_client__copy_pair_t *);
-      path_driver_info_t *info = APR_ARRAY_IDX(path_infos, i,
-                                               path_driver_info_t *);
+      svn_client__copy_pair_t *pair =
+        APR_ARRAY_IDX(copy_pairs, i, svn_client__copy_pair_t *);
+      path_driver_info_t *info =
+        APR_ARRAY_IDX(path_infos, i, path_driver_info_t *);
       svn_node_kind_t dst_kind;
       const char *src_rel, *dst_rel;
-      svn_opt_revision_t *new_rev, *ignored_rev, dead_end_rev;
-      const char *ignored_url;
-
-      /* Pass NULL for the path, to ensure error if trying to get a
-         revision based on the working copy. */
-      SVN_ERR(svn_client__get_revision_number(&pair->src_revnum, NULL,
-                                              ctx->wc_ctx, NULL,
-                                              ra_session,
-                                              &pair->src_op_revision, pool));
-
-      info->src_revnum = pair->src_revnum;
-
-      dead_end_rev.kind = svn_opt_revision_unspecified;
-
-      /* Run the history function to get the object's url in the operational
-         revision. */
-      SVN_ERR(svn_client__repos_locations(&pair->src, &new_rev,
-                                          &ignored_url, &ignored_rev,
-                                          NULL,
-                                          pair->src, &pair->src_peg_revision,
-                                          &pair->src_op_revision,
-                                          &dead_end_rev, ctx, pool));
 
-      /* Get the portions of the SRC and DST URLs that are relative to
-         TOP_URL, and URI-decode those sections. */
       src_rel = svn_uri_is_child(top_url, pair->src, pool);
       if (src_rel)
-        src_rel = svn_path_uri_decode(src_rel, pool);
+        {
+          src_rel = svn_path_uri_decode(src_rel, pool);
+          SVN_ERR(svn_ra_check_path(ra_session, src_rel, pair->src_revnum,
+                                    &info->src_kind, pool));
+        }
+      else if (strcmp(pair->src, top_url) == 0)
+        {
+          if (is_move)
+            return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+                                     _("Cannot move URL '%s' into itself"),
+                                     pair->src);
+          src_rel = "";
+          SVN_ERR(svn_ra_check_path(ra_session, src_rel, pair->src_revnum,
+                                    &info->src_kind, pool));
+        }
       else
-        src_rel = "";
+        {
+          const char *old_url = NULL;
+
+          src_rel = NULL;
+          SVN_ERR_ASSERT(! is_move);
+
+          SVN_ERR(svn_client__ensure_ra_session_url(&old_url, ra_session,
+                                                    pair->src, pool));
+          SVN_ERR(svn_ra_check_path(ra_session, "", pair->src_revnum,
+                                    &info->src_kind, pool));
+          SVN_ERR(svn_ra_reparent(ra_session, old_url, pool));
+        }
+      if (info->src_kind == svn_node_none)
+        return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
+                                 _("Path '%s' does not exist in revision %ld"),
+                                 pair->src, pair->src_revnum);
 
+      /* Figure out the basename that will result from this operation,
+         and ensure that we aren't trying to overwrite existing paths.  */
       dst_rel = svn_uri_is_child(top_url, pair->dst, pool);
       if (dst_rel)
         dst_rel = svn_path_uri_decode(dst_rel, pool);
       else
         dst_rel = "";
-
-      /* We can't move something into itself, period. */
-      if (svn_path_is_empty(src_rel) && is_move)
-        return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
-                                 _("Cannot move URL '%s' into itself"),
-                                 pair->src);
-
-      /* Verify that SRC_URL exists in the repository. */
-      SVN_ERR(svn_ra_check_path(ra_session, src_rel, pair->src_revnum,
-                                &info->src_kind, pool));
-      if (info->src_kind == svn_node_none)
-        return svn_error_createf
-          (SVN_ERR_FS_NOT_FOUND, NULL,
-           _("Path '%s' does not exist in revision %ld"),
-           pair->src, pair->src_revnum);
-
-      /* Figure out the basename that will result from this operation. */
-      SVN_ERR(svn_ra_check_path(ra_session, dst_rel, youngest, &dst_kind,
-                                pool));
+      SVN_ERR(svn_ra_check_path(ra_session, dst_rel, youngest,
+                                &dst_kind, pool));
       if (dst_kind != svn_node_none)
-        {
-          /* We disallow the overwriting of existing paths. */
-          return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
-                                   _("Path '%s' already exists"), dst_rel);
-        }
+        return svn_error_createf(SVN_ERR_FS_ALREADY_EXISTS, NULL,
+                                 _("Path '%s' already exists"), dst_rel);
 
-      info->src_url = pair->src;
+      /* More info for our INFO structure.  */
       info->src_path = src_rel;
       info->dst_path = dst_rel;
     }
@@ -1012,17 +1076,11 @@
         }
     }
 
-  /* Then, copy destinations, and possibly move sources. */
+  /* Then our copy destinations and move sources (if any). */
   for (i = 0; i < path_infos->nelts; i++)
     {
       path_driver_info_t *info = APR_ARRAY_IDX(path_infos, i,
                                                path_driver_info_t *);
-      apr_hash_t *mergeinfo;
-      SVN_ERR(calculate_target_mergeinfo(ra_session, &mergeinfo, NULL,
-                                         info->src_url, info->src_revnum,
-                                         FALSE, ctx, pool));
-      if (mergeinfo)
-        SVN_ERR(svn_mergeinfo_to_string(&info->mergeinfo, mergeinfo, pool));
 
       APR_ARRAY_PUSH(paths, const char *) = info->dst_path;
       if (is_move && (! info->resurrection))
@@ -1077,7 +1135,7 @@
                  apr_pool_t *pool)
 {
   const char *message;
-  const char *top_src_path, *top_dst_url, *repos_root;
+  const char *top_src_path, *top_dst_url;
   svn_ra_session_t *ra_session;
   const svn_delta_editor_t *editor;
   void *edit_baton;
@@ -1144,13 +1202,7 @@
   if (make_parents)
     {
       new_dirs = apr_array_make(pool, 0, sizeof(const char *));
-
-      /* Starting at TOP_DST_URL which is also the session root, work up the
-       * directory hierarchy until an existing node is found. Push each
-       * nonexistent URL onto the array NEW_DIRS.  Leave TOP_DST_URL and the
-       * RA session parented at the existing node; error if it isn't a dir. */
       SVN_ERR(find_absent_parents2(ra_session, &top_dst_url, new_dirs, pool));
-      /* ### SVN_ERR(svn_ra_reparent(ra_session, top_dst_url, pool)); */
     }
 
   /* Figure out the basename that will result from each copy and check to make
@@ -1264,11 +1316,6 @@
         }
     }
 
-  /* Reparent the ra_session to repos_root. So that 'svn_ra_get_log'
-     on paths relative to repos_root would work fine. */
-  SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root, pool));
-  SVN_ERR(svn_ra_reparent(ra_session, repos_root, pool));
-
   /* ### TODO: This extra loop would be unnecessary if this code lived
      ### in svn_client__get_copy_committables(), which is incidentally
      ### only used above (so should really be in this source file). */
@@ -1747,16 +1794,16 @@
   svn_boolean_t srcs_are_urls, dst_is_url;
   int i;
 
-  /* Are either of our paths URLs?
-   * Just check the first src_path.  If there are more than one, we'll check
-   * for homogeneity among them down below. */
+  /* Are either of our paths URLs?  Just check the first src_path.  If
+     there are more than one, we'll check for homogeneity among them
+     down below. */
   srcs_are_urls = svn_path_is_url(APR_ARRAY_IDX(sources, 0,
                                   svn_client_copy_source_t *)->path);
   dst_is_url = svn_path_is_url(dst_path_in);
 
-  /* If we have multiple source paths, it implies the dst_path is a directory
-   * we are moving or copying into.  Populate the dst_paths array to contain
-   * a destination path for each of the source paths. */
+  /* If we have multiple source paths, it implies the dst_path is a
+     directory we are moving or copying into.  Populate the COPY_PAIRS
+     array to contain a destination path for each of the source paths. */
   if (sources->nelts > 1)
     {
       apr_pool_t *iterpool = svn_pool_create(pool);

Modified: subversion/trunk/subversion/libsvn_client/delete.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/delete.c?rev=896562&r1=896561&r2=896562&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/delete.c (original)
+++ subversion/trunk/subversion/libsvn_client/delete.c Wed Jan  6 17:37:21 2010
@@ -140,7 +140,7 @@
             svn_client_ctx_t *ctx,
             apr_pool_t *pool)
 {
-  svn_ra_session_t *ra_session;
+  svn_ra_session_t *ra_session = NULL;
   const svn_delta_editor_t *editor;
   void *edit_baton;
   void *commit_baton;
@@ -194,29 +194,47 @@
   SVN_ERR(svn_client__ensure_revprop_table(&commit_revprops, revprop_table,
                                            log_msg, ctx, pool));
 
-  /* Open an RA session for the URL. Note that we don't have a local
-     directory, nor a place to put temp files. */
-  SVN_ERR(svn_client__open_ra_session_internal(&ra_session, common, NULL,
-                                               NULL, FALSE, TRUE, ctx, pool));
-
   /* Verify that each thing to be deleted actually exists (to prevent
      the creation of a revision that has no changes, since the
-     filesystem allows for no-op deletes). */
+     filesystem allows for no-op deletes).  While here, we'll
+     URI-decode our targets.  */
   for (i = 0; i < targets->nelts; i++)
     {
       const char *path = APR_ARRAY_IDX(targets, i, const char *);
+      const char *item_url;
+
       svn_pool_clear(subpool);
+      item_url = svn_path_url_add_component2(common, path, subpool);
       path = svn_path_uri_decode(path, pool);
       APR_ARRAY_IDX(targets, i, const char *) = path;
-      SVN_ERR(svn_ra_check_path(ra_session, path, SVN_INVALID_REVNUM,
+
+      /* If we've not yet done so, open an RA session for the
+         URL. Note that we don't have a local directory, nor a place
+         to put temp files.  Otherwise, reparent our existing
+         session.  */
+      if (! ra_session)
+        {
+          SVN_ERR(svn_client__open_ra_session_internal(&ra_session, item_url,
+                                                       NULL, NULL, FALSE,
+                                                       TRUE, ctx, pool));
+        }
+      else
+        {
+          SVN_ERR(svn_ra_reparent(ra_session, item_url, subpool));
+        }
+
+      SVN_ERR(svn_ra_check_path(ra_session, "", SVN_INVALID_REVNUM,
                                 &kind, subpool));
       if (kind == svn_node_none)
         return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
                                  "URL '%s' does not exist",
-                                 svn_dirent_local_style(path, pool));
+                                 svn_dirent_local_style(item_url, pool));
     }
   svn_pool_destroy(subpool);
 
+  /* Reparent the RA_session to the common parent of our deletees. */
+  SVN_ERR(svn_ra_reparent(ra_session, common, pool));
+
   /* Fetch RA commit editor */
   SVN_ERR(svn_client__commit_get_baton(&commit_baton, commit_info_p, pool));
   SVN_ERR(svn_ra_get_commit_editor3(ra_session, &editor, &edit_baton,

Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=896562&r1=896561&r2=896562&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Wed Jan  6 17:37:21 2010
@@ -3246,7 +3246,7 @@
       svn_boolean_t inherited;
       SVN_ERR(svn_client__get_wc_or_repos_mergeinfo(recorded_mergeinfo,
                                                     &inherited, FALSE,
-                                                    inherit, ra_session,
+                                                    inherit, NULL,
                                                     target_abspath,
                                                     ctx, result_pool));
       if (indirect)

Modified: subversion/trunk/subversion/libsvn_client/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/mergeinfo.c?rev=896562&r1=896561&r2=896562&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/mergeinfo.c (original)
+++ subversion/trunk/subversion/libsvn_client/mergeinfo.c Wed Jan  6 17:37:21 2010
@@ -457,36 +457,23 @@
 }
 
 svn_error_t *
-svn_client__get_repos_mergeinfo_catalog(
-  svn_mergeinfo_catalog_t *target_mergeinfo_cat,
-  svn_ra_session_t *ra_session,
-  const char *rel_path,
-  svn_revnum_t rev,
-  svn_mergeinfo_inheritance_t inherit,
-  svn_boolean_t squelch_incapable,
-  svn_boolean_t include_descendants,
-  apr_pool_t *result_pool,
-  apr_pool_t *scratch_pool)
+svn_client__get_repos_mergeinfo_catalog(svn_mergeinfo_catalog_t *mergeinfo_cat,
+                                        svn_ra_session_t *ra_session,
+                                        const char *rel_path,
+                                        svn_revnum_t rev,
+                                        svn_mergeinfo_inheritance_t inherit,
+                                        svn_boolean_t squelch_incapable,
+                                        svn_boolean_t include_descendants,
+                                        apr_pool_t *result_pool,
+                                        apr_pool_t *scratch_pool)
 {
   svn_error_t *err;
   svn_mergeinfo_t repos_mergeinfo;
-  const char *old_session_url;
   apr_array_header_t *rel_paths = apr_array_make(scratch_pool, 1,
                                                  sizeof(rel_path));
 
   APR_ARRAY_PUSH(rel_paths, const char *) = rel_path;
 
-  /* Temporarily point the session at the root of the repository.
-
-     ### BH: This is called from 'svn cp URL1 [URL2..] TOURL' and causes issue
-             #3242. As far as I can tell this is the only place in this
-             scenario that really needs access to the repository root instead
-             of the common parent. If there is any way to handle this via the
-             common parent, we should implement this here and we reduce the
-             problems caused by issue #3242. */
-  SVN_ERR(svn_client__ensure_ra_session_url(&old_session_url, ra_session,
-                                            NULL, scratch_pool));
-
   /* Fetch the mergeinfo. */
   err = svn_ra_get_mergeinfo(ra_session, &repos_mergeinfo, rel_paths, rev,
                              inherit, include_descendants, result_pool);
@@ -501,16 +488,7 @@
         return svn_error_return(err);
     }
 
-  /* If we reparented the session, put it back where our caller had it. */
-  if (old_session_url)
-    SVN_ERR(svn_ra_reparent(ra_session, old_session_url, scratch_pool));
-
-  /* Grab only the mergeinfo provided for REL_PATH. */
-  if (repos_mergeinfo)
-    *target_mergeinfo_cat = repos_mergeinfo;
-  else
-    *target_mergeinfo_cat = NULL;
-
+  *mergeinfo_cat = repos_mergeinfo;
   return SVN_NO_ERROR;
 }
 
@@ -615,29 +593,47 @@
           if (!apr_hash_get(original_props, SVN_PROP_MERGEINFO,
                             APR_HASH_KEY_STRING))
             {
-              const char *repos_rel_path;
+              const char *session_url = NULL;
+              apr_pool_t *sesspool = NULL;
+
+              if (ra_session)
+                {
+                  SVN_ERR(svn_client__ensure_ra_session_url(&session_url,
+                                                            ra_session,
+                                                            url, result_pool));
+                }
+              else
+                {
+                  sesspool = svn_pool_create(scratch_pool);
+                  SVN_ERR(svn_client__open_ra_session_internal(&ra_session,
+                                                               url, NULL, NULL,
+                                                               FALSE, TRUE,
+                                                               ctx,
+                                                               sesspool));
+                }
 
-              if (ra_session == NULL)
-                SVN_ERR(svn_client__open_ra_session_internal(&ra_session, url,
-                                                             NULL, NULL,
-                                                             FALSE, TRUE, ctx,
-                                                             scratch_pool));
-
-              SVN_ERR(svn_client__path_relative_to_root(&repos_rel_path,
-                                                        ctx->wc_ctx, url,
-                                                        repos_root, FALSE,
-                                                        ra_session,
-                                                        result_pool,
-                                                        scratch_pool));
               SVN_ERR(svn_client__get_repos_mergeinfo_catalog(
-                target_mergeinfo_catalog, ra_session,
-                repos_rel_path, target_rev, inherit,
-                TRUE, FALSE, result_pool, scratch_pool));
+                        target_mergeinfo_catalog, ra_session,
+                        "", target_rev, inherit,
+                        TRUE, FALSE, result_pool, scratch_pool));
 
               if (*target_mergeinfo_catalog
-                  && apr_hash_get(*target_mergeinfo_catalog, repos_rel_path,
+                  && apr_hash_get(*target_mergeinfo_catalog, "",
                                   APR_HASH_KEY_STRING))
                 *indirect = TRUE;
+
+              /* If we created an RA_SESSION above, destroy it.
+                 Otherwise, if reparented an existing session, point
+                 it back where it was when we were called. */
+              if (sesspool)
+                {
+                  svn_pool_destroy(sesspool);
+                }
+              else if (session_url)
+                {
+                  SVN_ERR(svn_ra_reparent(ra_session, session_url,
+                                          result_pool));
+                }
             }
         }
     }
@@ -1015,6 +1011,7 @@
   if (is_url)
     {
       const char *repos_rel_path;
+      const char *old_session_url;
 
       SVN_ERR(svn_dirent_get_absolute(&local_abspath, "", scratch_pool));
       SVN_ERR(svn_client__open_ra_session_internal(&ra_session, path_or_url,
@@ -1029,6 +1026,8 @@
                                                 FALSE, NULL,
                                                 scratch_pool,
                                                 scratch_pool));
+      SVN_ERR(svn_client__ensure_ra_session_url(&old_session_url, ra_session,
+                                                *repos_root, scratch_pool));
       SVN_ERR(svn_client__get_repos_mergeinfo_catalog(mergeinfo_catalog,
                                                       ra_session,
                                                       repos_rel_path, rev,

Modified: subversion/trunk/subversion/libsvn_client/mergeinfo.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/mergeinfo.h?rev=896562&r1=896561&r2=896562&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/mergeinfo.h (original)
+++ subversion/trunk/subversion/libsvn_client/mergeinfo.h Wed Jan  6 17:37:21 2010
@@ -115,14 +115,15 @@
                              apr_pool_t *result_pool,
                              apr_pool_t *scratch_pool);
 
-/* If INCLUDE_DESCENDANTS is false then behaves exactly like
-   svn_client__get_wc_mergeinfo except the mergeinfo for LOCAL_ABSPATH is
+/* If INCLUDE_DESCENDANTS is FALSE, behave exactly like
+   svn_client__get_wc_mergeinfo() except the mergeinfo for LOCAL_ABSPATH is
    put in the mergeinfo catalog MERGEINFO_CAT, mapped from LOCAL_ABSPATH's
-   repository root-relative path.  If INCLUDE_DESCENDANTS is true, then any
-   subtrees under LOCAL_ABSPATH with explicit mergeinfo are also included in
-   MERGEINFO_CAT and again the keys are the repository root-relative paths
-   of the subtrees.  If no mergeinfo is found, then *MERGEINFO_CAT is set to
-   NULL. */
+   repository root-relative path.
+
+   If INCLUDE_DESCENDANTS is true, then any subtrees under LOCAL_ABSPATH with
+   explicit mergeinfo are also included in MERGEINFO_CAT and again the
+   keys are the repository root-relative paths of the subtrees.  If no
+   mergeinfo is found, then *MERGEINFO_CAT is set to NULL. */
 svn_error_t *
 svn_client__get_wc_mergeinfo_catalog(svn_mergeinfo_catalog_t *mergeinfo_cat,
                                      svn_boolean_t *inherited,
@@ -135,11 +136,9 @@
                                      apr_pool_t *result_pool,
                                      apr_pool_t *scratch_pool);
 
-/* Obtain any mergeinfo for the root-relative repository filesystem path
-   REL_PATH from the repository, and set it in *TARGET_MERGEINFO.
-   RA_SESSION should be an open RA session pointing at the URL that REL_PATH
-   is relative to, or NULL, in which case this function will open its own
-   temporary session.
+/* Obtain any mergeinfo for repository filesystem path REL_PATH
+   (relative to RA_SESSION's session URL) from the repository, and set
+   it in *TARGET_MERGEINFO.
 
    INHERIT indicates whether explicit, explicit or inherited, or only
    inherited mergeinfo for REL_PATH is obtained.
@@ -160,41 +159,43 @@
                                 svn_boolean_t squelch_incapable,
                                 apr_pool_t *pool);
 
-/* If INCLUDE_DESCENDANTS is false then behaves exactly like
-   svn_client__get_repos_mergeinfo except the mergeinfo for REL_PATH is put
-   in the mergeinfo catalog TARGET_MERGEINFO_CAT, with the key being REL_PATH
-   itself.  If INCLUDE_DESCENDANTS is true, then any subtrees under
-   REL_PATH with explicit mergeinfo are also included in MERGEINFO_CAT.  The
-   keys for the subtree mergeinfo are the repository root-relative paths of
-   the subtrees.  If no mergeinfo is found, then *TARGET_MERGEINFO_CAT is set
-   to NULL. */
-svn_error_t *
-svn_client__get_repos_mergeinfo_catalog(
-  svn_mergeinfo_catalog_t *target_mergeinfo_cat,
-  svn_ra_session_t *ra_session,
-  const char *rel_path,
-  svn_revnum_t rev,
-  svn_mergeinfo_inheritance_t inherit,
-  svn_boolean_t squelch_incapable,
-  svn_boolean_t include_descendants,
-  apr_pool_t *result_pool,
-  apr_pool_t *scratch_pool);
+/* If INCLUDE_DESCENDANTS is FALSE, behave exactly like
+   svn_client__get_repos_mergeinfo() except the mergeinfo for REL_PATH
+   is put in the mergeinfo catalog MERGEINFO_CAT, with the key being
+   REL_PATH itself.
+
+   If INCLUDE_DESCENDANTS is true, then any subtrees under REL_PATH
+   with explicit mergeinfo are also included in MERGEINFO_CAT.  The
+   keys for the subtree mergeinfo are the repository root-relative
+   paths of the subtrees.  If no mergeinfo is found, then
+   *TARGET_MERGEINFO_CAT is set to NULL. */
+svn_error_t *
+svn_client__get_repos_mergeinfo_catalog(svn_mergeinfo_catalog_t *mergeinfo_cat,
+                                        svn_ra_session_t *ra_session,
+                                        const char *rel_path,
+                                        svn_revnum_t rev,
+                                        svn_mergeinfo_inheritance_t inherit,
+                                        svn_boolean_t squelch_incapable,
+                                        svn_boolean_t include_descendants,
+                                        apr_pool_t *result_pool,
+                                        apr_pool_t *scratch_pool);
 
 /* Retrieve the direct mergeinfo for the TARGET_WCPATH from the WC's
    mergeinfo prop, or that inherited from its nearest ancestor if the
    target has no info of its own.
 
    If no mergeinfo can be obtained from the WC or REPOS_ONLY is TRUE,
-   get it from the repository.  RA_SESSION should be an open RA session
-   pointing at TARGET_WCPATH's URL, or NULL, in which case this function
-   will open its own temporary session.
-
-   Store any mergeinfo obtained for TARGET_WCPATH in *TARGET_MERGEINFO, if
-   no mergeinfo is found *TARGET_MERGEINFO is NULL.
-
-   Like svn_client__get_wc_mergeinfo, this function considers no inherited
-   mergeinfo to be found in the WC when trying to crawl into a parent path
-   with a different working revision.
+   get it from the repository.  RA_SESSION should be an open RA
+   session pointing at TARGET_WCPATH's URL, or NULL, in which case this
+   function will open its own temporary session.
+
+   Store any mergeinfo obtained for TARGET_WCPATH in
+   *TARGET_MERGEINFO, if no mergeinfo is found *TARGET_MERGEINFO is
+   NULL.
+
+   Like svn_client__get_wc_mergeinfo(), this function considers no
+   inherited mergeinfo to be found in the WC when trying to crawl into
+   a parent path with a different working revision.
 
    INHERIT indicates whether explicit, explicit or inherited, or only
    inherited mergeinfo for TARGET_WCPATH is retrieved.
@@ -213,13 +214,16 @@
                                       apr_pool_t *pool);
 
 /* If INCLUDE_DESCENDANTS is false then behaves exactly like
-   svn_client__get_wc_or_repos_mergeinfo except the mergeinfo for
-   TARGET_WCPATH is put in the mergeinfo catalog TARGET_MERGEINFO_CATALOG,
-   mapped from TARGET_WCPATH's repository root-relative path.  If
-   INCLUDE_DESCENDANTS is true, then any subtrees under TARGET_WCPATH with
-   explicit mergeinfo are also included in TARGET_MERGEINFO_CATALOG and
-   again the keys are the repository root-relative paths of the subtrees.
-   If no mergeinfo is found, then  *TARGET_MERGEINFO_CAT is set to NULL. */
+   svn_client__get_wc_or_repos_mergeinfo() except the mergeinfo for
+   TARGET_WCPATH is put in the mergeinfo catalog
+   TARGET_MERGEINFO_CATALOG, mapped from TARGET_WCPATH's repository
+   root-relative path.
+
+   If INCLUDE_DESCENDANTS is true, then any subtrees under
+   TARGET_WCPATH with explicit mergeinfo are also included in
+   TARGET_MERGEINFO_CATALOG and again the keys are the repository
+   root-relative paths of the subtrees.  If no mergeinfo is found,
+   then *TARGET_MERGEINFO_CAT is set to NULL. */
 svn_error_t *
 svn_client__get_wc_or_repos_mergeinfo_catalog(
   svn_mergeinfo_catalog_t *target_mergeinfo_catalog,

Modified: subversion/trunk/subversion/tests/cmdline/authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/authz_tests.py?rev=896562&r1=896561&r2=896562&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/authz_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/authz_tests.py Wed Jan  6 17:37:21 2010
@@ -926,8 +926,7 @@
                                svntest.main.is_ra_type_svn)),
               XFail(Skip(authz_switch_to_directory,
                          svntest.main.is_ra_type_file)),
-              Skip(XFail(authz_access_required_at_repo_root,
-                         svntest.main.is_ra_type_dav),
+              Skip(authz_access_required_at_repo_root,
                    svntest.main.is_ra_type_file),
              ]