You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2013/01/02 21:02:29 UTC

svn commit: r1427987 - /subversion/trunk/subversion/libsvn_client/diff.c

Author: rhuijben
Date: Wed Jan  2 20:02:29 2013
New Revision: 1427987

URL: http://svn.apache.org/viewvc?rev=1427987&view=rev
Log:
* subversion/libsvn_client/diff.c
  (make_repos_relpath): Following up on r1427912, always use the anchor for
    repos-wc diff relative path processing when we can. Simplify the ra
    based calculation for all other cases.

Modified:
    subversion/trunk/subversion/libsvn_client/diff.c

Modified: subversion/trunk/subversion/libsvn_client/diff.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/diff.c?rev=1427987&r1=1427986&r2=1427987&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/diff.c (original)
+++ subversion/trunk/subversion/libsvn_client/diff.c Wed Jan  2 20:02:29 2013
@@ -67,9 +67,9 @@
 
 /* Calculate the repository relative path of PATH, using RA_SESSION and
  * WC_CTX, and return the result in *REPOS_RELPATH.
- * ORIG_TARGET is one of the original targets passed to the diff command,
+ * ORIG_TARGET is the related original target passed to the diff command,
  * and may be used to derive leading path components missing from PATH.
- *  ANCHOR is the local path where the diff editor is anchored. 
+ * ANCHOR is the local path where the diff editor is anchored. 
  * Do all allocations in POOL. */
 static svn_error_t *
 make_repos_relpath(const char **repos_relpath,
@@ -82,42 +82,54 @@ make_repos_relpath(const char **repos_re
                    apr_pool_t *scratch_pool)
 {
   const char *local_abspath;
-  const char *orig_repos_relpath;
+  const char *orig_repos_relpath = NULL;
 
-  if (! ra_session)
+  if (! ra_session
+      || (anchor && !svn_path_is_url(orig_target)))
     {
+      svn_error_t *err;
       /* We're doing a WC-WC diff, so we can retrieve all information we
        * need from the working copy. */
       SVN_ERR(svn_dirent_get_absolute(&local_abspath,
                                       svn_dirent_join(anchor, path,
                                                       scratch_pool),
                                       scratch_pool));
-      SVN_ERR(svn_wc__node_get_repos_relpath(repos_relpath, wc_ctx,
-                                             local_abspath,
-                                             result_pool, scratch_pool));
-      return SVN_NO_ERROR;
-    }
 
-  /* Now deal with the repos-repos and repos-wc diff cases.
-   * We need to make PATH appear as a child of ORIG_TARGET.
-   * ORIG_TARGET is either a URL or a path to a working copy. First,
-   * find out what ORIG_TARGET looks like relative to the repository root.*/
-  if (svn_path_is_url(orig_target))
-    SVN_ERR(svn_ra_get_path_relative_to_root(ra_session,
-                                             &orig_repos_relpath,
-                                             orig_target, scratch_pool));
-  else
-    {
-      const char *orig_abspath;
+      err = svn_wc__node_get_repos_relpath(repos_relpath, wc_ctx,
+                                           local_abspath,
+                                           result_pool, scratch_pool);
 
-      SVN_ERR(svn_dirent_get_absolute(&orig_abspath, orig_target,
-                                      scratch_pool));
-      SVN_ERR(svn_wc__node_get_repos_relpath(&orig_repos_relpath, wc_ctx,
-                                             orig_abspath,
-                                             scratch_pool, scratch_pool));
+      if (!ra_session
+          || ! err
+          || (err && err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND))
+        {
+           return svn_error_trace(err);
+        }
+
+      /* The path represents a local working copy path, but does not
+         exist. Fall through to calculate an in-repository location
+         based on the ra session */
+
+      /* ### Maybe we should use the nearest existing ancestor instead? */
+      svn_error_clear(err);
     }
 
-  *repos_relpath = svn_relpath_join(orig_repos_relpath, path, scratch_pool);
+  {
+    const char *url;
+    const char *repos_root_url;
+
+    /* Would be nice if the RA layer could just provide the parent
+       repos_relpath of the ra session */
+      SVN_ERR(svn_ra_get_session_url(ra_session, &url, scratch_pool));
+
+      SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url,
+                                     scratch_pool));
+
+      orig_repos_relpath = svn_uri_skip_ancestor(repos_root_url, url,
+                                                 scratch_pool);
+
+      *repos_relpath = svn_relpath_join(orig_repos_relpath, path, result_pool);
+  }
 
   return SVN_NO_ERROR;
 }