Author: philip
Date: Mon Jun 13 17:14:14 2011
New Revision: 1135180

URL: http://svn.apache.org/viewvc?rev=1135180&view=rev
Log:
Fix issue 3908, status should show directory locks.

* subversion/libsvn_wc/wc_db.h
  (struct svn_wc__db_info_t): Add locked member.

* subversion/libsvn_wc/wc_db.c
  (is_wclocked): Forward declaration.
  (read_children_info): Set locked member.

* subversion/include/svn_wc.h
  (struct svn_wc_status3_t): Add locked member.

* subversion/libsvn_wc/status.c
  (read_info): Set locked member.
  (assemble_status): Treat locked as "interesting", transfer locked status.

* subversion/libsvn_client/status.c
  (svn_client__create_status): Get locked status from structure rather
   than database.

* subversion/tests/cmdline/stat_tests.py
  (wclock_status): New test.
  (test_list): Add new test.

Modified:
    subversion/trunk/subversion/include/svn_wc.h
    subversion/trunk/subversion/libsvn_client/status.c
    subversion/trunk/subversion/libsvn_wc/status.c
    subversion/trunk/subversion/libsvn_wc/wc_db.c
    subversion/trunk/subversion/libsvn_wc/wc_db.h
    subversion/trunk/subversion/tests/cmdline/stat_tests.py

Modified: subversion/trunk/subversion/include/svn_wc.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=1135180&r1=1135179&r2=1135180&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_wc.h (original)
+++ subversion/trunk/subversion/include/svn_wc.h Mon Jun 13 17:14:14 2011
@@ -3517,13 +3517,16 @@ typedef struct svn_wc_status3_t
   /** The in-repository path relative to the repository root. */
   const char *repos_relpath;
 
-    /** a file or directory can be 'switched' if the switch command has been
+  /** a file or directory can be 'switched' if the switch command has been
    * used.  If this is TRUE, then file_external will be FALSE.
    */
   svn_boolean_t switched;
 
-  /** The locally present lock. (Values of path, token, owner, comment and
-   * are available if a lock is present) */
+  /** This directory has a working copy lock */
+  svn_boolean_t locked;
+
+  /** The repository file lock. (Values of path, token, owner, comment
+   * and are available if a lock is present) */
   const svn_lock_t *lock;
 
   /** Which changelist this item is part of, or NULL if not part of any. */

Modified: subversion/trunk/subversion/libsvn_client/status.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/status.c?rev=1135180&r1=1135179&r2=1135180&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/status.c (original)
+++ subversion/trunk/subversion/libsvn_client/status.c Mon Jun 13 17:14:14 2011
@@ -594,8 +594,7 @@ svn_client__create_status(svn_client_sta
   (*cst)->switched = status->switched;
 
   if (status->kind == svn_node_dir)
-    SVN_ERR(svn_wc_locked2(NULL, &(*cst)->locked, wc_ctx, local_abspath,
-                           scratch_pool));
+    (*cst)->locked = status->locked;
 
   (*cst)->copied = status->copied;
   (*cst)->revision = status->revision;

Modified: subversion/trunk/subversion/libsvn_wc/status.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/status.c?rev=1135180&r1=1135179&r2=1135180&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/status.c (original)
+++ subversion/trunk/subversion/libsvn_wc/status.c Mon Jun 13 17:14:14 2011
@@ -259,6 +259,8 @@ read_info(const struct svn_wc__db_info_t
                                db, local_abspath,
                                result_pool, scratch_pool));
 
+  SVN_ERR(svn_wc__db_wclocked(&mtb->locked, db, local_abspath, scratch_pool));
+
   /* Maybe we have to get some shadowed lock from BASE to make our test suite
      happy... (It might be completely unrelated, but...) */
   if (mtb->have_base
@@ -608,6 +610,7 @@ assemble_status(svn_wc_status3_t **statu
          || (node_status == svn_wc_status_normal))
 
         && (! switched_p)
+        && (! info->locked )
         && (! info->lock)
         && (! repos_lock)
         && (! info->changelist)
@@ -673,6 +676,7 @@ assemble_status(svn_wc_status3_t **statu
   else
     stat->lock = NULL;
 
+  stat->locked = info->locked;
   stat->conflicted = conflicted;
   stat->versioned = TRUE;
   stat->changelist = info->changelist;

Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1135180&r1=1135179&r2=1135180&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Mon Jun 13 17:14:14 2011
@@ -6644,6 +6644,12 @@ svn_wc__db_read_info(svn_wc__db_status_t
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+is_wclocked(void *baton,
+            svn_wc__db_wcroot_t *wcroot,
+            const char *dir_relpath,
+            apr_pool_t *scratch_pool);
+
 /* baton for read_children_info() */
 struct read_children_info_baton_t
 {
@@ -6769,6 +6775,10 @@ read_children_info(void *baton,
                 child->depth = svn_depth_from_word(depth);
               else
                 child->depth = svn_depth_unknown;
+
+              if (new_child)
+                SVN_ERR(is_wclocked(&child->locked, wcroot, child_relpath,
+                                    scratch_pool));
             }
 
           child->recorded_mod_time = svn_sqlite__column_int64(stmt, 13);

Modified: subversion/trunk/subversion/libsvn_wc/wc_db.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.h?rev=1135180&r1=1135179&r2=1135180&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.h Mon Jun 13 17:14:14 2011
@@ -1839,7 +1839,8 @@ struct svn_wc__db_info_t {
   svn_boolean_t have_base;
   svn_boolean_t have_more_work;
 
-  svn_wc__db_lock_t *lock;
+  svn_boolean_t locked;     /* WC directory lock */
+  svn_wc__db_lock_t *lock;  /* Repository file lock */
 };
 
 /* Return in *NODES a hash mapping name->struct svn_wc__db_info_t for

Modified: subversion/trunk/subversion/tests/cmdline/stat_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/stat_tests.py?rev=1135180&r1=1135179&r2=1135180&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/stat_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/stat_tests.py Mon Jun 13 17:14:14 
2011
@@ -1884,6 +1884,44 @@ def wc_wc_copy_timestamp(sbox):
 
   svntest.actions.run_and_verify_status(wc_dir, expected_output)
 
+@Issue(3908)
+def wclock_status(sbox):
+  "verbose/non-verbose on locked working copy"
+
+  sbox.build(read_only=True)
+  wc_dir = sbox.wc_dir
+
+  # Recursive lock
+  svntest.actions.lock_admin_dir(sbox.ospath('A/D'), True)
+
+  # Verbose status
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('A/D', 'A/D/G', 'A/D/H', locked='L')
+  svntest.actions.run_and_verify_status(wc_dir, expected_status)
+
+  # Non-verbose status
+  expected_output = svntest.verify.UnorderedOutput([
+      '  L     %s\n' % sbox.ospath(path) for path in ['A/D',
+                                                      'A/D/G',
+                                                      'A/D/H']
+      ])
+  svntest.actions.run_and_verify_svn(None, expected_output, [],
+                                     'status', wc_dir)
+
+  # Second non-recursive lock
+  svntest.actions.lock_admin_dir(sbox.ospath('A/B'))
+
+  expected_status.tweak('A/B', locked='L')
+  svntest.actions.run_and_verify_status(wc_dir, expected_status)
+  expected_output = svntest.verify.UnorderedOutput([
+      '  L     %s\n' % sbox.ospath(path) for path in ['A/B',
+                                                      'A/D',
+                                                      'A/D/G',
+                                                      'A/D/H']
+      ])
+  svntest.actions.run_and_verify_svn(None, expected_output, [],
+                                     'status', wc_dir)
+
 
 ########################################################################
 # Run the tests
@@ -1925,6 +1963,7 @@ test_list = [ None,
               status_nested_wc_old_format,
               status_locked_deleted,
               wc_wc_copy_timestamp,
+              wclock_status,
              ]
 
 if __name__ == '__main__':


Reply via email to