[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

[PATCH] wc-ng, get node's URL

From: Neels J Hofmeyr <neels_at_elego.de>
Date: Thu, 24 Dec 2009 18:43:12 +0100

Hi,

maybe you remember that patch of mine with a function gstein said looks like
a duplicate of svn_wc__internal_node_get_url().
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=2415782

It almost *is* a duplicate, but there's a difference...

svn_wc__internal_node_get_url() *combines* the repos_root_url and
repos_relpath to a URL. But I need them *separate*. If you want to see why,
look at get_node_uri(), which I want to eliminate, in the output of:

  svn diff -c-880555 ^/subversion/trunk | less

(This had been committed before and reverted in r880555, and now I'm giving
it some review to be able to commit it again. It "wc-ng"s the tree-conflict
detection during update.)

So, I split functionality off svn_wc__internal_node_get_url() to get a
function that does everything except combining the two URL parts into a
single string.

See attached patch that does the function split I'd like to do, so I can
then fix and commit -c-880555. -- if you like attached patch, feel free to
commit. I don't have an apache account yet.

Thanks,
~Neels

Split a function off svn_wc__internal_node_get_url() that returns the same
result, but still separated in REPOS_RELPATH and REPOS_ROOT_URL.
The new function is published in wc.h, because it is going to be used in
update_editor.c in a subsequent patch.

* subversion/libsvn_wc/node.c
   (svn_wc__internal_node_get_relpath_and_root_url): New function.
   (svn_wc__internal_node_get_url): Move some code into above function.
* subversion/libsvn_wc/wc.h:
   (svn_wc__internal_node_get_relpath_and_root_url): New function.
   (svn_wc__internal_node_get_url): Add comment.

--This line, and those below, will be ignored--
Index: subversion/libsvn_wc/node.c
===================================================================
--- subversion/libsvn_wc/node.c (revision 893783)
+++ subversion/libsvn_wc/node.c (working copy)
@@ -274,29 +274,28 @@ svn_wc__node_get_changelist(const char *
 }
 
 svn_error_t *
-svn_wc__internal_node_get_url(const char **url,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+svn_wc__internal_node_get_relpath_and_root_url(const char **repos_relpath,
+ const char **repos_root_url,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
 {
   svn_wc__db_status_t status;
- const char *repos_relpath;
- const char *repos_root_url;
 
- SVN_ERR(svn_wc__db_read_info(&status, NULL, NULL, &repos_relpath,
- &repos_root_url,
+ SVN_ERR(svn_wc__db_read_info(&status, NULL, NULL, repos_relpath,
+ repos_root_url,
                                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                                NULL, NULL, NULL,
                                db, local_abspath,
                                scratch_pool, scratch_pool));
- if (repos_relpath == NULL)
+ if (*repos_relpath == NULL)
     {
       if (status == svn_wc__db_status_normal
           || status == svn_wc__db_status_incomplete)
         {
- SVN_ERR(svn_wc__db_scan_base_repos(&repos_relpath, &repos_root_url,
+ SVN_ERR(svn_wc__db_scan_base_repos(repos_relpath, repos_root_url,
                                              NULL,
                                              db, local_abspath,
                                              scratch_pool, scratch_pool));
@@ -304,22 +303,46 @@ svn_wc__internal_node_get_url(const char
       else if (status == svn_wc__db_status_added
                || status == svn_wc__db_status_obstructed_add)
         {
- SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, &repos_relpath,
- &repos_root_url, NULL, NULL, NULL,
+ SVN_ERR(svn_wc__db_scan_addition(NULL, NULL, repos_relpath,
+ repos_root_url, NULL, NULL, NULL,
                                            NULL, NULL,
                                            db, local_abspath,
                                            scratch_pool, scratch_pool));
         }
       else
         {
- *url = NULL;
+ *repos_relpath = NULL;
+ *repos_root_url = NULL;
           return SVN_NO_ERROR;
         }
     }
 
- SVN_ERR_ASSERT(repos_root_url != NULL && repos_relpath != NULL);
- *url = svn_path_url_add_component2(repos_root_url, repos_relpath,
- result_pool);
+ SVN_ERR_ASSERT(*repos_root_url != NULL && *repos_relpath != NULL);
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_wc__internal_node_get_url(const char **url,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ const char *repos_relpath;
+ const char *repos_root_url;
+
+ SVN_ERR(svn_wc__internal_node_get_relpath_and_root_url(&repos_relpath,
+ &repos_root_url,
+ db,
+ local_abspath,
+ scratch_pool,
+ scratch_pool));
+
+ if (repos_relpath != NULL && repos_root_url != NULL)
+ *url = svn_path_url_add_component2(repos_root_url, repos_relpath,
+ result_pool);
+ else
+ *url = NULL;
 
   return SVN_NO_ERROR;
 }
Index: subversion/libsvn_wc/wc.h
===================================================================
--- subversion/libsvn_wc/wc.h (revision 893783)
+++ subversion/libsvn_wc/wc.h (working copy)
@@ -515,6 +515,28 @@ svn_wc__internal_is_replaced(svn_boolean
                              apr_pool_t *scratch_pool);
 
 
+/* Try to return LOCAL_ABSPATH's corresponding Subversion URL,
+ * split in *REPOS_RELPATH and *REPOS_ROOT_URL, considering the status of
+ * the node looked up in DB. Allocate *REPOS_RELPATH and *REPOS_ROOT_URL in
+ * RESULT_POOL, do all other allocations in SCRATCH_POOL.
+ * If nothing can be found about LOCAL_ABSPATH, return *REPOS_RELPATH and
+ * *REPOS_ROOT_URL as NULL.
+ * See also: svn_wc__internal_node_get_url().
+ */
+svn_error_t *
+svn_wc__internal_node_get_relpath_and_root_url(const char **repos_relpath,
+ const char **repos_root_url,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Try to return LOCAL_ABSPATH's corresponding Subversion URL in *URL,
+ * considering the status of the node looked up in DB. Allocate *URL in
+ * RESULT_POOL, do all other allocations in SCRATCH_POOL.
+ * If nothing can be found about LOCAL_ABSPATH, return *URL as NULL.
+ * See also: svn_wc__internal_node_get_relpath_and_root_url().
+ */
 svn_error_t *
 svn_wc__internal_node_get_url(const char **url,
                               svn_wc__db_t *db,

Received on 2009-12-24 19:50:26 CET

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.