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__':