You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2009/12/04 20:55:34 UTC
svn commit: r887335 - in /subversion/trunk/subversion:
libsvn_wc/wc-queries.sql libsvn_wc/wc_db.c tests/cmdline/svntest/actions.py
Author: hwright
Date: Fri Dec 4 19:55:34 2009
New Revision: 887335
URL: http://svn.apache.org/viewvc?rev=887335&view=rev
Log:
When answering the question "is this directory locked in the working copy?"
recurse up the tree looking for an explicit lock.
* subversion/tests/cmdline/svntest/actions.py
(log_admin_dir): Insert a zero-depth lock, since that's what the tests
expect.
* subversion/libsvn_wc/wc-queries.sql
(STMT_SELECT_WC_LOCK): Select the locked_levels in place of the
local_dir_relpath.
* subversion/libsvn_wc/wc_db.c
(is_wclocked): New. Recursive tree walking function.
(svn_wc__db_wclocked): Call the recursive function, with the appropriate
initial conditions.
Modified:
subversion/trunk/subversion/libsvn_wc/wc-queries.sql
subversion/trunk/subversion/libsvn_wc/wc_db.c
subversion/trunk/subversion/tests/cmdline/svntest/actions.py
Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=887335&r1=887334&r2=887335&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Fri Dec 4 19:55:34 2009
@@ -285,7 +285,7 @@
VALUES (?1, ?2, ?3);
-- STMT_SELECT_WC_LOCK
-SELECT local_dir_relpath FROM WC_LOCK
+SELECT locked_levels FROM WC_LOCK
WHERE wc_id = ?1 AND local_dir_relpath = ?2;
-- STMT_DELETE_WC_LOCK
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=887335&r1=887334&r2=887335&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Fri Dec 4 19:55:34 2009
@@ -5600,23 +5600,56 @@
}
-svn_error_t *
-svn_wc__db_wclocked(svn_boolean_t *locked,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *scratch_pool)
+static svn_error_t *
+is_wclocked(svn_boolean_t *locked,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_int64_t recurse_depth,
+ apr_pool_t *scratch_pool)
{
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
+ svn_error_t *err;
+
+ err = get_statement_for_path(&stmt, db, local_abspath,
+ STMT_SELECT_WC_LOCK, scratch_pool);
+ if (err && err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY)
+ {
+ svn_error_clear(err);
+ *locked = FALSE;
+ return SVN_NO_ERROR;
+ }
- SVN_ERR(get_statement_for_path(&stmt, db, local_abspath,
- STMT_SELECT_WC_LOCK, scratch_pool));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
+
+ if (have_row)
+ {
+ apr_int64_t locked_levels = svn_sqlite__column_int64(stmt, 0);
+
+ /* The directory in question is considered locked if we find a lock
+ with depth -1 or the depth of the lock is greater than or equal to
+ the depth we've recursed. */
+ *locked = (locked_levels == -1 || locked_levels >= recurse_depth);
+ return svn_error_return(svn_sqlite__reset(stmt));
+ }
+
SVN_ERR(svn_sqlite__reset(stmt));
- *locked = have_row;
+ return svn_error_return(is_wclocked(locked, db,
+ svn_dirent_dirname(local_abspath,
+ scratch_pool),
+ recurse_depth + 1, scratch_pool));
+}
- return SVN_NO_ERROR;
+
+svn_error_t *
+svn_wc__db_wclocked(svn_boolean_t *locked,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_return(is_wclocked(locked, db, local_abspath, 0,
+ scratch_pool));
}
Modified: subversion/trunk/subversion/tests/cmdline/svntest/actions.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svntest/actions.py?rev=887335&r1=887334&r2=887335&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svntest/actions.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svntest/actions.py Fri Dec 4 19:55:34 2009
@@ -1547,8 +1547,9 @@
db = svntest.sqlite3.connect(os.path.join(wc_dir, main.get_admin_name(),
'wc.db'))
- db.execute('insert into wc_lock (wc_id, local_dir_relpath) values (?, ?)',
- (1, ''))
+ db.execute('insert into wc_lock (wc_id, local_dir_relpath, locked_levels) '
+ + 'values (?, ?, ?)',
+ (1, '', 0))
db.commit()
db.close()