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()