Author: rhuijben
Date: Wed Feb 25 23:29:25 2015
New Revision: 1662327
URL: http://svn.apache.org/r1662327
Log:
Make the python test framework's standard status and entries processing
capable of handling the few remaining cases where we still used the
old system.
* subversion/tests/cmdline/revert_tests.py
(revert_obstructing_wc): Remove hack, obsoleted by single-db entries-dump.
* subversion/tests/cmdline/svntest/actions.py
(run_and_verify_status,
run_and_verify_unquiet_status): Only accept wc trees.
* subversion/tests/cmdline/svntest/wc.py
(State.add_state):
Add optional strict mode that doesn't follow normal path join rules.
(tweak_for_entries_compare): Allow specifying that a path is a file, to
avoid checking deeper status entries in the comparison. This is needed
for a followup patch.
(from_entries): Properly handle the case where just a Windows drive letter
(e.g. 'H:') is passed as a path, by using special path join rules.
(StateItem.__init__): Declare entry_kind.
* subversion/tests/cmdline/update_tests.py
(update_wc_on_windows_drive): Create proper wc tree.
Modified:
subversion/trunk/subversion/tests/cmdline/revert_tests.py
subversion/trunk/subversion/tests/cmdline/svntest/actions.py
subversion/trunk/subversion/tests/cmdline/svntest/wc.py
subversion/trunk/subversion/tests/cmdline/update_tests.py
Modified: subversion/trunk/subversion/tests/cmdline/revert_tests.py
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/revert_tests.py?rev=1662327&r1=1662326&r2=1662327&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/revert_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/revert_tests.py Wed Feb 25
23:29:25 2015
@@ -1626,10 +1626,9 @@ def revert_obstructing_wc(sbox):
# A is not versioned but exists
})
- # Use expected_status.old_tree() to avoid doing an entries comparion
svntest.actions.run_and_verify_update(wc_dir,
expected_output, None,
- expected_status.old_tree(),
+ expected_status,
None, None, None,
None, None, None,
wc_dir, '--set-depth', 'infinity')
Modified: subversion/trunk/subversion/tests/cmdline/svntest/actions.py
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svntest/actions.py?rev=1662327&r1=1662326&r2=1662327&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svntest/actions.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svntest/actions.py Wed Feb 25
23:29:25 2015
@@ -1510,53 +1510,40 @@ def run_and_verify_commit(wc_dir_name, o
# This function always passes '-q' to the status command, which
# suppresses the printing of any unversioned or nonexistent items.
-def run_and_verify_status(wc_dir_name, status_tree,
- singleton_handler_a = None,
- a_baton = None,
- singleton_handler_b = None,
- b_baton = None):
+def run_and_verify_status(wc_dir_name, status_tree):
"""Run 'status' on WC_DIR_NAME and compare it with the
- expected STATUS_TREE. SINGLETON_HANDLER_A and SINGLETON_HANDLER_B will
- be passed to tree.compare_trees - see that function's doc string for
- more details.
+ expected STATUS_TREE.
Returns on success, raises on failure."""
+ if not isinstance(status_tree, wc.State):
+ raise TypeError('wc.State tree expected')
+
exit_code, output, errput = main.run_svn(None, 'status', '-v', '-u', '-q',
wc_dir_name)
actual_status = svntest.wc.State.from_status(output, wc_dir=wc_dir_name)
# Verify actual output against expected output.
- if isinstance(status_tree, wc.State):
- try:
- status_tree.compare_and_display('status', actual_status)
- except tree.SVNTreeError:
- _log_tree_state("ACTUAL STATUS TREE:", actual_status.old_tree(),
- wc_dir_name)
- raise
- else:
- actual_status = actual_status.old_tree()
- try:
- tree.compare_trees("status", actual_status, status_tree,
- singleton_handler_a, a_baton,
- singleton_handler_b, b_baton)
- except tree.SVNTreeError:
- verify.display_trees(None, 'STATUS OUTPUT TREE', status_tree,
actual_status)
- _log_tree_state("ACTUAL STATUS TREE:", actual_status, wc_dir_name)
- raise
+ try:
+ status_tree.compare_and_display('status', actual_status)
+ except tree.SVNTreeError:
+ _log_tree_state("ACTUAL STATUS TREE:", actual_status.old_tree(),
+ wc_dir_name)
+ raise
# if we have an output State, and we can/are-allowed to create an
# entries-based State, then compare the two.
- if isinstance(status_tree, wc.State):
- actual_entries = wc.State.from_entries(wc_dir_name)
- if actual_entries:
- tweaked = status_tree.copy()
- tweaked.tweak_for_entries_compare()
- try:
- tweaked.compare_and_display('entries', actual_entries)
- except tree.SVNTreeUnequal:
- ### do something more
- raise
+ actual_entries = wc.State.from_entries(wc_dir_name)
+ if actual_entries:
+ tweaked = status_tree.copy()
+ tweaked.tweak_for_entries_compare()
+ try:
+ tweaked.compare_and_display('entries', actual_entries)
+ except tree.SVNTreeUnequal:
+ ### do something more
+ _log_tree_state("ACTUAL ENTRY TREE:", actual_entries.old_tree(),
+ wc_dir_name)
+ raise
# A variant of previous func, but doesn't pass '-q'. This allows us
@@ -1566,27 +1553,21 @@ def run_and_verify_unquiet_status(wc_dir
expected STATUS_TREE.
Returns on success, raises on failure."""
+ if not isinstance(status_tree, wc.State):
+ raise TypeError('wc.State tree expected')
+
exit_code, output, errput = main.run_svn(None, 'status', '-v',
'-u', wc_dir_name)
actual_status = svntest.wc.State.from_status(output, wc_dir=wc_dir_name)
# Verify actual output against expected output.
- if isinstance(status_tree, wc.State):
- try:
- status_tree.compare_and_display('unquiet status', actual_status)
- except tree.SVNTreeError:
- _log_tree_state("ACTUAL STATUS TREE:",
- actual_status.normalize().old_tree(), wc_dir_name)
- raise
- else:
- actual_status = actual_status.old_tree()
- try:
- tree.compare_trees("UNQUIET STATUS", actual_status, status_tree)
- except tree.SVNTreeError:
- _log_tree_state("ACTUAL UNQUIET STATUS TREE:", actual_status,
- wc_dir_name)
- raise
+ try:
+ status_tree.compare_and_display('unquiet status', actual_status)
+ except tree.SVNTreeError:
+ _log_tree_state("ACTUAL STATUS TREE:",
+ actual_status.normalize().old_tree(), wc_dir_name)
+ raise
def run_and_verify_status_xml(expected_entries = [],
*args):
Modified: subversion/trunk/subversion/tests/cmdline/svntest/wc.py
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svntest/wc.py?rev=1662327&r1=1662326&r2=1662327&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svntest/wc.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svntest/wc.py Wed Feb 25 23:29:25
2015
@@ -141,12 +141,14 @@ class State:
self.desc.update(more_desc)
- def add_state(self, parent, state):
+ def add_state(self, parent, state, strict=False):
"Import state items from a State object, reparent the items to PARENT."
assert isinstance(state, State)
for path, item in state.desc.items():
- if path == '':
+ if strict:
+ path = parent + path
+ elif path == '':
path = parent
else:
path = parent + '/' + path
@@ -358,6 +360,11 @@ class State:
for p, i in self.desc.copy().items():
if p.startswith(path + '/'):
del self.desc[p]
+ elif item.entry_kind == 'file':
+ # A file has no descendants in svn_wc_entry_t
+ for p, i in self.desc.copy().items():
+ if p.startswith(path + '/'):
+ del self.desc[p]
else:
# when reading the entry structures, we don't examine for text or
# property mods, so clear those flags. we also do not examine the
@@ -680,8 +687,6 @@ class State:
})
desc = { }
- dot_svn = svntest.main.get_admin_name()
-
dump_data = svntest.main.run_entriesdump_tree(base)
if not dump_data:
@@ -689,6 +694,16 @@ class State:
# ### Improve!
return cls('', desc)
+ dirent_join = repos_join
+ if len(base) == 2 and base[1:]==':' and sys.platform=='win32':
+ # We have a win32 drive relative path... Auch. Fix joining
+ def drive_join(a, b):
+ if len(a) == 2:
+ return a+b
+ else:
+ return repos_join(a,b)
+ dirent_join = drive_join
+
for parent, entries in sorted(dump_data.items()):
parent_url = entries[''].url
@@ -710,11 +725,11 @@ class State:
# that we can't put the status as "! " because that gets tweaked
# out of our expected tree.
item = StateItem(status=' ', wc_rev='?')
- desc[repos_join(parent, name)] = item
+ desc[dirent_join(parent, name)] = item
continue
item = StateItem.from_entry(entry)
if name:
- desc[repos_join(parent, name)] = item
+ desc[dirent_join(parent, name)] = item
implied_url = repos_join(parent_url, svn_uri_quote(name))
else:
item._url = entry.url # attach URL to directory StateItems
@@ -745,7 +760,7 @@ class StateItem:
"""
def __init__(self, contents=None, props=None,
- status=None, verb=None, wc_rev=None,
+ status=None, verb=None, wc_rev=None, entry_kind=None,
entry_rev=None, entry_status=None, entry_copied=None,
locked=None, copied=None, switched=None, writelocked=None,
treeconflict=None, moved_from=None, moved_to=None,
@@ -772,6 +787,9 @@ class StateItem:
self.prev_verb = prev_verb
# The base revision number of the node in the WC, as a string.
self.wc_rev = wc_rev
+ # If 'file' specifies that the node is a file, and as such has no
svn_wc_entry_t
+ # descendants
+ self.entry_kind = None
# These will be set when we expect the wc_rev/status to differ from those
# found in the entries code.
self.entry_rev = entry_rev
Modified: subversion/trunk/subversion/tests/cmdline/update_tests.py
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/update_tests.py?rev=1662327&r1=1662326&r2=1662327&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/update_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/update_tests.py Wed Feb 25
23:29:25 2015
@@ -2445,11 +2445,14 @@ def update_wc_on_windows_drive(sbox):
expected_disk.tweak('A/mu', contents = expected_disk.desc['A/mu'].contents
+ '\nAppended text for mu')
- # Use .old_tree() for status to avoid the entries validation
+ # Create expected status with 'H:iota' style paths
+ expected_status_relative = svntest.wc.State('', {})
+ expected_status_relative.add_state(wc_dir, expected_status, strict=True)
+
svntest.actions.run_and_verify_update(wc_dir,
expected_output,
expected_disk,
- expected_status.old_tree())
+ expected_status_relative)
finally:
os.chdir(was_cwd)