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)


Reply via email to