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 2010/06/07 00:31:37 UTC
svn commit: r952016 - in /subversion/trunk/subversion/libsvn_wc:
deprecated.c update_editor.c wc-queries.sql wc_db.c wc_db.h
Author: rhuijben
Date: Sun Jun 6 22:31:37 2010
New Revision: 952016
URL: http://svn.apache.org/viewvc?rev=952016&view=rev
Log:
As a tiny bit of help in resolving issue #3499, stop retrieving all children
from a parent directory to just to find if a directory is recorded in the
parent.
* subversion/libsvn_wc/deprecated.c
(svn_wc_is_wc_root): Keep historic behavior.
* subversion/libsvn_wc/update_editor.c
(already_in_a_tree_conflict): Don't bail if an ancestor is not a working
copy. (Triggered by externals_tests.py 3)
* subversion/libsvn_wc/wc-queries.sql
(STMT_SELECT_SUBDIR): New statement.
* subversion/libsvn_wc/wc_db.c
(navigate_to_parent): Add assertion.
(svn_wc__db_is_wcroot): New function.
* subversion/libsvn_wc/wc_db.h
(svn_wc__db_is_wcroot): New function.
Modified:
subversion/trunk/subversion/libsvn_wc/deprecated.c
subversion/trunk/subversion/libsvn_wc/update_editor.c
subversion/trunk/subversion/libsvn_wc/wc-queries.sql
subversion/trunk/subversion/libsvn_wc/wc_db.c
subversion/trunk/subversion/libsvn_wc/wc_db.h
Modified: subversion/trunk/subversion/libsvn_wc/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/deprecated.c?rev=952016&r1=952015&r2=952016&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/deprecated.c (original)
+++ subversion/trunk/subversion/libsvn_wc/deprecated.c Sun Jun 6 22:31:37 2010
@@ -2746,13 +2746,25 @@ svn_wc_is_wc_root(svn_boolean_t *wc_root
{
svn_wc_context_t *wc_ctx;
const char *local_abspath;
+ svn_error_t *err;
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
svn_wc__adm_get_db(adm_access),
pool));
- SVN_ERR(svn_wc_is_wc_root2(wc_root, wc_ctx, local_abspath, pool));
+ err = svn_wc_is_wc_root2(wc_root, wc_ctx, local_abspath, pool);
+
+ if (err
+ && (err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY
+ || err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND))
+ {
+ /* Subversion <= 1.6 just said that a not versioned path is not a root */
+ svn_error_clear(err);
+ *wc_root = FALSE;
+ }
+ else
+ SVN_ERR(err);
return svn_error_return(svn_wc_context_destroy(wc_ctx));
}
Modified: subversion/trunk/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/update_editor.c?rev=952016&r1=952015&r2=952016&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/trunk/subversion/libsvn_wc/update_editor.c Sun Jun 6 22:31:37 2010
@@ -1965,8 +1965,18 @@ already_in_a_tree_conflict(svn_boolean_t
if (svn_dirent_is_root(ancestor_abspath, strlen(ancestor_abspath)))
break;
- SVN_ERR(svn_wc__check_wc_root(&is_wc_root, NULL, NULL,
- db, ancestor_abspath, iterpool));
+ err = svn_wc__check_wc_root(&is_wc_root, NULL, NULL,
+ db, ancestor_abspath, iterpool);
+
+ if (err
+ && (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND
+ || err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY))
+ {
+ svn_error_clear(err);
+ return SVN_NO_ERROR;
+ }
+ else
+ SVN_ERR(err);
ancestor_abspath = svn_dirent_dirname(ancestor_abspath, scratch_pool);
}
@@ -5525,7 +5535,6 @@ svn_wc__check_wc_root(svn_boolean_t *wc_
{
const char *parent_abspath, *name;
const char *repos_relpath, *repos_root, *repos_uuid;
- svn_error_t *err;
svn_wc__db_status_t status;
svn_wc__db_kind_t my_kind;
@@ -5535,7 +5544,6 @@ svn_wc__check_wc_root(svn_boolean_t *wc_
kind = &my_kind;
*wc_root = TRUE;
- *kind = svn_node_dir;
if (switched)
*switched = FALSE;
@@ -5580,71 +5588,49 @@ svn_wc__check_wc_root(svn_boolean_t *wc_
svn_dirent_split(local_abspath, &parent_abspath, &name, scratch_pool);
/* Check if the node is recorded in the parent */
- {
- const apr_array_header_t *children;
- svn_boolean_t found = FALSE;
- int i;
-
- err = svn_wc__db_read_children(&children, db, parent_abspath,
- scratch_pool, scratch_pool);
- if (err)
- {
- if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND
- && err->apr_err != SVN_ERR_WC_NOT_WORKING_COPY
- && err->apr_err != SVN_ERR_WC_UPGRADE_REQUIRED)
- return svn_error_return(err);
+ if (*wc_root)
+ {
+ svn_boolean_t is_root;
+ SVN_ERR(svn_wc__db_is_wcroot(&is_root, db, local_abspath, scratch_pool));
- svn_error_clear(err);
- return SVN_NO_ERROR;
- }
- else
- for (i = 0; i < children->nelts; i++)
+ if (is_root)
{
- if (strcmp(APR_ARRAY_IDX(children, i, const char *), name) == 0)
- {
- found = TRUE;
- break;
- }
+ /* We're not in the (versioned) parent directory's list of
+ children, so we must be the root of a distinct working copy. */
+ return SVN_NO_ERROR;
}
+ }
+
+ {
+ const char *parent_repos_root;
+ const char *parent_repos_relpath;
+ const char *parent_repos_uuid;
+
+ SVN_ERR(svn_wc__db_scan_base_repos(&parent_repos_relpath,
+ &parent_repos_root,
+ &parent_repos_uuid,
+ db, parent_abspath,
+ scratch_pool, scratch_pool));
- if (!found)
+ if (strcmp(repos_root, parent_repos_root) != 0
+ || strcmp(repos_uuid, parent_repos_uuid) != 0)
{
- /* We're not in the (versioned) parent directory's list of
- children, so we must be the root of a distinct working copy. */
+ /* This should never happen (### until we get mixed-repos working
+ copies). If we're in the parent, then we should be from the
+ same repository. For this situation, just declare us the root
+ of a separate, unswitched working copy. */
return SVN_NO_ERROR;
}
- }
-
- {
- const char *parent_repos_root;
- const char *parent_repos_relpath;
- const char *parent_repos_uuid;
-
- SVN_ERR(svn_wc__db_scan_base_repos(&parent_repos_relpath,
- &parent_repos_root,
- &parent_repos_uuid,
- db, parent_abspath,
- scratch_pool, scratch_pool));
-
- if (strcmp(repos_root, parent_repos_root) != 0
- || strcmp(repos_uuid, parent_repos_uuid) != 0)
- {
- /* This should never happen (### until we get mixed-repos working
- copies). If we're in the parent, then we should be from the
- same repository. For this situation, just declare us the root
- of a separate, unswitched working copy. */
- return SVN_NO_ERROR;
- }
- *wc_root = FALSE;
+ *wc_root = FALSE;
- if (switched)
- {
- const char *expected_relpath = svn_relpath_join(parent_repos_relpath,
- name, scratch_pool);
+ if (switched)
+ {
+ const char *expected_relpath = svn_relpath_join(parent_repos_relpath,
+ name, scratch_pool);
- *switched = (strcmp(expected_relpath, repos_relpath) != 0);
- }
+ *switched = (strcmp(expected_relpath, repos_relpath) != 0);
+ }
}
return SVN_NO_ERROR;
Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=952016&r1=952015&r2=952016&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Sun Jun 6 22:31:37 2010
@@ -446,6 +446,11 @@ SELECT wc_id, ?3 AS local_relpath, ?4 AS
prop_reject, changelist, text_mod, tree_conflict_data FROM ACTUAL_NODE
WHERE wc_id = ?1 AND local_relpath = ?2;
+-- STMT_SELECT_SUBDIR
+SELECT 1 FROM BASE_NODE WHERE wc_id = ?1 and local_relpath = ?2 and kind = 'subdir'
+UNION
+SELECT 0 FROM WORKING_NODE WHERE wc_id = ?1 and local_relpath = ?2 and kind = 'subdir';
+
/* ------------------------------------------------------------------------- */
/* these are used in entries.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=952016&r1=952015&r2=952016&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Sun Jun 6 22:31:37 2010
@@ -531,6 +531,10 @@ navigate_to_parent(svn_wc__db_pdh_t **pa
&& (*parent_pdh)->wcroot != NULL)
return SVN_NO_ERROR;
+ /* Make sure we don't see the root as its own parent */
+ SVN_ERR_ASSERT(!svn_dirent_is_root(child_pdh->local_abspath,
+ strlen(child_pdh->local_abspath)));
+
parent_abspath = svn_dirent_dirname(child_pdh->local_abspath, scratch_pool);
SVN_ERR(svn_wc__db_pdh_parse_local_abspath(parent_pdh, &local_relpath, db,
parent_abspath, smode,
@@ -6825,6 +6829,68 @@ svn_wc__db_node_hidden(svn_boolean_t *hi
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_wc__db_is_wcroot(svn_boolean_t *is_root,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_pdh_t *pdh;
+ const char *local_relpath;
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t got_row;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+
+ SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
+ local_abspath, svn_sqlite__mode_readwrite,
+ scratch_pool, scratch_pool));
+ VERIFY_USABLE_PDH(pdh);
+
+ if (*local_relpath != '\0')
+ {
+ *is_root = FALSE; /* Node is a file, or has a parent directory within
+ the same wcroot */
+ return SVN_NO_ERROR;
+ }
+
+#ifndef SINGLE_DB
+ if (!svn_dirent_is_root(local_abspath, strlen(local_abspath)))
+ {
+ svn_error_t *err = navigate_to_parent(&pdh, db, pdh,
+ svn_sqlite__mode_readwrite,
+ scratch_pool);
+
+ if (err && err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY)
+ {
+ svn_error_clear(err);
+ *is_root = TRUE;
+ return SVN_NO_ERROR;
+ }
+ SVN_ERR(err);
+
+ VERIFY_USABLE_PDH(pdh);
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, pdh->wcroot->sdb,
+ STMT_SELECT_SUBDIR));
+
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", pdh->wcroot->wc_id,
+ svn_dirent_basename(local_abspath, NULL)));
+
+ SVN_ERR(svn_sqlite__step(&got_row, stmt));
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ if (got_row)
+ {
+ *is_root = FALSE;
+ return SVN_NO_ERROR;
+ }
+ }
+#endif
+ *is_root = TRUE;
+
+ return SVN_NO_ERROR;
+}
svn_error_t *
svn_wc__db_temp_wcroot_tempdir(const char **temp_dir_abspath,
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.h?rev=952016&r1=952015&r2=952016&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.h Sun Jun 6 22:31:37 2010
@@ -1613,6 +1613,17 @@ svn_wc__db_node_hidden(svn_boolean_t *hi
### changelist usage -- we may already assume the list fits in memory.
*/
+/* Checks if LOCAL_ABSPATH has a parent directory that knows about its
+ * existance. Set *IS_ROOT to FALSE if a parent is found, and to TRUE
+ * if there is no such parent.
+ */
+svn_error_t *
+svn_wc__db_is_wcroot(svn_boolean_t *is_root,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool);
+
+
/* @} */
Re: svn commit: r952016 - in /subversion/trunk/subversion/libsvn_wc:
deprecated.c update_editor.c wc-queries.sql wc_db.c wc_db.h
Posted by Greg Stein <gs...@gmail.com>.
On Sun, Jun 6, 2010 at 18:31, <rh...@apache.org> wrote:
>...
> +++ subversion/trunk/subversion/libsvn_wc/wc_db.c Sun Jun 6 22:31:37 2010
>...
> +svn_error_t *
> +svn_wc__db_is_wcroot(svn_boolean_t *is_root,
> + svn_wc__db_t *db,
> + const char *local_abspath,
> + apr_pool_t *scratch_pool)
> +{
> + svn_wc__db_pdh_t *pdh;
> + const char *local_relpath;
> + svn_sqlite__stmt_t *stmt;
> + svn_boolean_t got_row;
> +
> + SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
> +
> + SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
> + local_abspath, svn_sqlite__mode_readwrite,
mode_readonly
> + scratch_pool, scratch_pool));
> + VERIFY_USABLE_PDH(pdh);
> +
> + if (*local_relpath != '\0')
> + {
> + *is_root = FALSE; /* Node is a file, or has a parent directory within
> + the same wcroot */
> + return SVN_NO_ERROR;
> + }
> +
> +#ifndef SINGLE_DB
> + if (!svn_dirent_is_root(local_abspath, strlen(local_abspath)))
> + {
> + svn_error_t *err = navigate_to_parent(&pdh, db, pdh,
> + svn_sqlite__mode_readwrite,
> + scratch_pool);
same.
>...
Cheers,
-g