Author: rhuijben
Date: Fri Jun 10 12:22:34 2011
New Revision: 1134290

URL: http://svn.apache.org/viewvc?rev=1134290&view=rev
Log:
Properly calculate the url of deleted and working-excluded nodes. Inside a
deleted subtree the information on whether a node was a copy before deleting
or a switched base node wasn't properly interpreted.

* subversion/libsvn_wc/wc_db.c
  (read_url_txn): Handle svn_wc__db_status_deleted via layering and fix
    the fallback case which is now only used for excluded in op_depth > 0.

Modified:
    subversion/trunk/subversion/libsvn_wc/wc_db.c

Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1134290&r1=1134289&r2=1134290&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Fri Jun 10 12:22:34 2011
@@ -7249,39 +7249,74 @@ read_url_txn(void *baton,
                                 NULL, NULL, wcroot, local_relpath,
                                 scratch_pool, scratch_pool));
         }
-      else if (have_base)
+      else if (status == svn_wc__db_status_deleted)
         {
-          SVN_ERR(base_get_info(NULL, NULL, NULL, &repos_relpath, &repos_id,
-                                NULL, NULL, NULL, NULL, NULL,
-                                NULL, NULL, NULL, NULL,
+          const char *base_del_relpath;
+          const char *work_del_relpath;
+
+          SVN_ERR(scan_deletion(&base_del_relpath, NULL, &work_del_relpath,
                                 wcroot, local_relpath,
                                 scratch_pool, scratch_pool));
+
+          if (base_del_relpath)
+            {
+              SVN_ERR(base_get_info(NULL, NULL, NULL, &repos_relpath,
+                                    &repos_id, NULL, NULL, NULL, NULL, NULL,
+                                    NULL, NULL, NULL, NULL,
+                                    wcroot, base_del_relpath,
+                                    scratch_pool, scratch_pool));
+
+              repos_relpath = svn_relpath_join(
+                                    repos_relpath,
+                                    svn_dirent_skip_ancestor(base_del_relpath,
+                                                             local_relpath),
+                                    scratch_pool);
+            }
+          else
+            {
+              /* The parent of the WORKING delete, must be an addition */
+              const char *work_relpath = svn_relpath_dirname(work_del_relpath,
+                                                             scratch_pool);
+
+              SVN_ERR(scan_addition(NULL, NULL, &repos_relpath, &repos_id,
+                                    NULL, NULL, NULL,
+                                    wcroot, work_relpath,
+                                    scratch_pool, scratch_pool));
+
+              repos_relpath = svn_relpath_join(
+                                    repos_relpath,
+                                    svn_dirent_skip_ancestor(work_relpath,
+                                                             local_relpath),
+                                    scratch_pool);
+            }
         }
-      else if (status == svn_wc__db_status_absent
-               || status == svn_wc__db_status_excluded
-               || status == svn_wc__db_status_not_present
-               || (!have_base && (status == svn_wc__db_status_deleted)))
+      else if (status == svn_wc__db_status_excluded)
         {
           const char *parent_relpath;
+          const char *name;
           struct read_url_baton_t new_rub;
           const char *url;
 
-          /* Set 'repos_root_url' to the *full URL* of the parent WC dir,
-           * and 'repos_relpath' to the *single path component* that is the
+          /* Set 'url' to the *full URL* of the parent WC dir,
+           * and 'name' to the *single path component* that is the
            * basename of this WC directory, so that joining them will result
            * in the correct full URL. */
-          svn_relpath_split(&parent_relpath, &repos_relpath, local_relpath,
+          svn_relpath_split(&parent_relpath, &name, local_relpath,
                             scratch_pool);
           new_rub.result_pool = scratch_pool;
           new_rub.url = &url;
           SVN_ERR(read_url_txn(&new_rub, wcroot, parent_relpath,
                                scratch_pool));
+
+          *rub->url = svn_path_url_add_component2(url, name, rub->result_pool);
+
+          return SVN_NO_ERROR;
         }
       else
         {
-          /* Status: obstructed, obstructed_add */
-          *rub->url = NULL;
-          return SVN_NO_ERROR;
+          /* All working statee are explicitly handled and all base statee
+             have a repos_relpath */
+          SVN_ERR_MALFUNCTION();
         }
     }
 


Reply via email to