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 2011/05/04 00:52:48 UTC

svn commit: r1099290 - in /subversion/trunk/subversion: include/svn_client.h libsvn_client/commit_util.c libsvn_client/ra.c

Author: rhuijben
Date: Tue May  3 22:52:47 2011
New Revision: 1099290

URL: http://svn.apache.org/viewvc?rev=1099290&view=rev
Log:
Store commit paths as normal relpaths instead of as uri encoded partial uris.
Its easier to decode once, then to decode everywhere.

* subversion/include/svn_client.h
  (svn_client_commit_item3_t): Add session_relpath.

* subversion/libsvn_client/commit_util.c
  (svn_client__condense_commit_items): Store decoded relative path in
    session_relpath instead of undecoded in url.
  (do_item_commit): Hash on decoded path.
  (svn_client__do_commit): Don't decode paths.

* subversion/libsvn_client/ra.c
  (get_wc_prop,
   push_wc_prop): Don't uri decode for every item in the loop. Just assume
     item->path is an abspath.

Modified:
    subversion/trunk/subversion/include/svn_client.h
    subversion/trunk/subversion/libsvn_client/commit_util.c
    subversion/trunk/subversion/libsvn_client/ra.c

Modified: subversion/trunk/subversion/include/svn_client.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_client.h?rev=1099290&r1=1099289&r2=1099290&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_client.h (original)
+++ subversion/trunk/subversion/include/svn_client.h Tue May  3 22:52:47 2011
@@ -473,6 +473,12 @@ typedef struct svn_client_commit_item3_t
    * same lifetime as this data structure.
    */
   apr_array_header_t *outgoing_prop_changes;
+
+  /**
+   * When processing the commit this contains the relative path for
+   * the commit session. #NULL until the commit item is preprocessed.
+   */
+  const char *session_relpath;
 } svn_client_commit_item3_t;
 
 /** The commit candidate structure.

Modified: subversion/trunk/subversion/libsvn_client/commit_util.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/commit_util.c?rev=1099290&r1=1099289&r2=1099290&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/commit_util.c (original)
+++ subversion/trunk/subversion/libsvn_client/commit_util.c Tue May  3 22:52:47 2011
@@ -1076,7 +1076,7 @@ svn_client__condense_commit_items(const 
     }
 
   /* Now that we've settled on a *BASE_URL, go hack that base off
-     of all of our URLs. */
+     of all of our URLs and store it as session_relpath. */
   for (i = 0; i < ci->nelts; i++)
     {
       svn_client_commit_item3_t *this_item
@@ -1085,9 +1085,10 @@ svn_client__condense_commit_items(const 
       size_t base_url_len = strlen(*base_url);
 
       if (url_len > base_url_len)
-        this_item->url = apr_pstrdup(pool, this_item->url + base_url_len + 1);
+        this_item->session_relpath = svn_uri_is_child(*base_url,
+                                                      this_item->url, pool);
       else
-        this_item->url = "";
+        this_item->session_relpath = "";
     }
 
 #ifdef SVN_CLIENT_COMMIT_DEBUG
@@ -1432,7 +1433,7 @@ do_item_commit(void **dir_baton,
       /* Add this file mod to the FILE_MODS hash. */
       mod->item = item;
       mod->file_baton = file_baton;
-      apr_hash_set(file_mods, item->url, APR_HASH_KEY_STRING, mod);
+      apr_hash_set(file_mods, item->session_relpath, APR_HASH_KEY_STRING, mod);
     }
   else if (file_baton)
     {
@@ -1491,13 +1492,13 @@ svn_client__do_commit(const char *base_u
     *sha1_checksums = apr_hash_make(result_pool);
 
   /* Build a hash from our COMMIT_ITEMS array, keyed on the
-     URI-decoded relative paths (which come from the item URLs).  And
+     relative paths (which come from the item URLs).  And
      keep an array of those decoded paths, too.  */
   for (i = 0; i < commit_items->nelts; i++)
     {
       svn_client_commit_item3_t *item =
         APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *);
-      const char *path = svn_path_uri_decode(item->url, scratch_pool);
+      const char *path = item->session_relpath;
       apr_hash_set(items_hash, path, APR_HASH_KEY_STRING, item);
       APR_ARRAY_PUSH(paths, const char *) = path;
     }

Modified: subversion/trunk/subversion/libsvn_client/ra.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/ra.c?rev=1099290&r1=1099289&r2=1099290&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/ra.c (original)
+++ subversion/trunk/subversion/libsvn_client/ra.c Tue May  3 22:52:47 2011
@@ -104,13 +104,13 @@ get_wc_prop(void *baton,
             = APR_ARRAY_IDX(cb->commit_items, i,
                             svn_client_commit_item3_t *);
 
-          SVN_ERR(svn_dirent_get_absolute(&local_abspath, item->path, pool));
-
-          if (! strcmp(relpath,
-                       svn_path_uri_decode(item->url, pool)))
-            return svn_error_return(svn_wc_prop_get2(value, cb->ctx->wc_ctx,
-                                                     local_abspath, name,
-                                                     pool, pool));
+          if (! strcmp(relpath, item->session_relpath))
+            {
+              SVN_ERR_ASSERT(svn_dirent_is_absolute(item->path));
+              return svn_error_return(svn_wc_prop_get2(value, cb->ctx->wc_ctx,
+                                                       item->path, name,
+                                                       pool, pool));
+            }
         }
 
       return SVN_NO_ERROR;
@@ -150,17 +150,14 @@ push_wc_prop(void *baton,
       svn_client_commit_item3_t *item
         = APR_ARRAY_IDX(cb->commit_items, i, svn_client_commit_item3_t *);
 
-      if (strcmp(relpath, svn_path_uri_decode(item->url, pool)) == 0)
+      if (strcmp(relpath, item->session_relpath) == 0)
         {
           apr_pool_t *cpool = item->incoming_prop_changes->pool;
           svn_prop_t *prop = apr_palloc(cpool, sizeof(*prop));
 
           prop->name = apr_pstrdup(cpool, name);
           if (value)
-            {
-              prop->value
-                = svn_string_ncreate(value->data, value->len, cpool);
-            }
+            prop->value = svn_string_dup(value, pool);
           else
             prop->value = NULL;