2010-09-10 Tony Chang <tony@chromium.org>
authortony@chromium.org <tony@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Sep 2010 18:10:44 +0000 (18:10 +0000)
committertony@chromium.org <tony@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Sep 2010 18:10:44 +0000 (18:10 +0000)
        Reviewed by Ojan Vafai.

        deduplicate-tests should be runnable from any WebKit directory
        https://bugs.webkit.org/show_bug.cgi?id=44709

        * Scripts/webkitpy/layout_tests/deduplicate_tests.py:
        * Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@67216 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKitTools/ChangeLog
WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py
WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py

index aa525b5b4a61c557ceb6ec069d5ef29d2bf645b9..72d6ff186f7de2b9347ca98cc92dad415659ca6a 100644 (file)
@@ -1,3 +1,13 @@
+2010-09-10  Tony Chang  <tony@chromium.org>
+
+        Reviewed by Ojan Vafai.
+
+        deduplicate-tests should be runnable from any WebKit directory
+        https://bugs.webkit.org/show_bug.cgi?id=44709
+
+        * Scripts/webkitpy/layout_tests/deduplicate_tests.py:
+        * Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:
+
 2010-09-09  Hans Wennborg  <hans@chromium.org>
 
         Reviewed by Jeremy Orlow.
index c543d9183a406e78714202e83c99565452357409..39b94313c0f0d9e15b207739d7e6bffc1e40b476 100644 (file)
@@ -36,6 +36,7 @@ import os
 import subprocess
 import sys
 import re
+import webkitpy.common.checkout.scm as scm
 import webkitpy.common.system.executive as executive
 import webkitpy.common.system.logutils as logutils
 import webkitpy.layout_tests.port.factory as port_factory
@@ -56,7 +57,8 @@ def port_fallbacks():
         try:
             platforms = port_factory.get(port_name).baseline_search_path()
         except NotImplementedError:
-            _log.error("'%s' lacks baseline_search_path(), please fix." % port_name)
+            _log.error("'%s' lacks baseline_search_path(), please fix."
+                       % port_name)
             fallbacks[port_name] = [_BASE_PLATFORM]
             continue
         fallbacks[port_name] = [os.path.basename(p) for p in platforms][1:]
@@ -156,11 +158,35 @@ def has_intermediate_results(test, fallbacks, matching_platform,
     return False
 
 
-def find_dups(hashes, port_fallbacks):
+def get_relative_test_path(filename, relative_to):
+    """Constructs a relative path to |filename| from |relative_to|.  Also, if
+    |relative_to| is a sub directory of the layout test directory and
+    |filename| is not in |relative_to|, return None.  This lets us filter
+    the results to only show results that are under where the script was run
+    from.
+    Args:
+        filename: The test file we're trying to get a relative path to.
+        relative_to: The absolute path we're relative to.
+    Returns:
+        A relative path to filename or None.
+    """
+    layout_test_dir = os.path.join(scm.find_checkout_root(), 'LayoutTests')
+    abs_path = os.path.join(layout_test_dir, filename)
+    path = os.path.relpath(abs_path, relative_to)
+    # If we're in the layout test directory, only return results that are below
+    # where the tool was run from.
+    if (relative_to.startswith(layout_test_dir) and path.startswith('..')):
+        return None
+    return path
+
+
+def find_dups(hashes, port_fallbacks, relative_to):
     """Yields info about redundant test expectations.
     Args:
         hashes: a list of hashes as returned by cluster_file_hashes.
-        port_fallbacks: a list of fallback information as returned by get_port_fallbacks.
+        port_fallbacks: a list of fallback information as returned by
+            get_port_fallbacks.
+        relative_to: the directory that we want the results relative to
     Returns:
         a tuple containing (test, platform, fallback, platforms)
     """
@@ -176,13 +202,20 @@ def find_dups(hashes, port_fallbacks):
         # See if any of the platforms are redundant with each other.
         for platform in platforms.keys():
             for fallback in port_fallbacks[platform]:
-                if fallback in platforms.keys():
-                    # We have to verify that there isn't an intermediate result
-                    # that causes this duplicate hash to exist.
-                    if not has_intermediate_results(test,
-                            port_fallbacks[platform], fallback):
-                        path = os.path.join('LayoutTests', platforms[platform])
-                        yield test, platform, fallback, path
+                if fallback not in platforms.keys():
+                    continue
+                # We have to verify that there isn't an intermediate result
+                # that causes this duplicate hash to exist.
+                if has_intermediate_results(test, port_fallbacks[platform],
+                                            fallback):
+                    continue
+                # We print the relative path so it's easy to pipe the results
+                # to xargs rm.
+                path = get_relative_test_path(platforms[platform], relative_to)
+                if not path:
+                    continue
+                yield {'test': test, 'platform': platform,
+                       'fallback': fallback, 'path': path}
 
 
 def deduplicate(glob_pattern):
@@ -192,7 +225,11 @@ def deduplicate(glob_pattern):
     Returns:
         a dictionary containing test, path, platform and fallback.
     """
-    fallbacks = port_fallbacks()
-    hashes = cluster_file_hashes(glob_pattern)
-    return [{'test': test, 'path': path, 'platform': platform, 'fallback': fallback}
-             for test, platform, fallback, path in find_dups(hashes, fallbacks)]
+    current_dir = os.getcwd()
+    try:
+        os.chdir(scm.find_checkout_root())
+        fallbacks = port_fallbacks()
+        hashes = cluster_file_hashes(glob_pattern)
+        return list(find_dups(hashes, fallbacks, current_dir))
+    finally:
+        os.chdir(current_dir)
index be2e3812ec91f87293a04c5844714c721ca80956..30444871b9c2d0441e539f74b07b1d1831ea965b 100644 (file)
@@ -186,3 +186,22 @@ class ListDuplicatesTest(unittest.TestCase):
                            'fallback': 'chromium-win',
                            'platform': 'chromium-linux'},
                           result[0])
+
+    def test_get_relative_test_path(self):
+        checkout_root = scm.find_checkout_root()
+        layout_test_dir = os.path.join(checkout_root, 'LayoutTests')
+        test_cases = (
+            ('platform/mac/test.html',
+             ('platform/mac/test.html', layout_test_dir)),
+            ('LayoutTests/platform/mac/test.html',
+             ('platform/mac/test.html', checkout_root)),
+            ('../LayoutTests/platform/mac/test.html',
+             ('platform/mac/test.html', os.path.join(checkout_root, 'WebCore'))),
+            ('test.html',
+             ('platform/mac/test.html', os.path.join(layout_test_dir, 'platform/mac'))),
+            (None,
+             ('platform/mac/test.html', os.path.join(layout_test_dir, 'platform/win'))),
+        )
+        for expected, inputs in test_cases:
+            self.assertEquals(expected,
+                              deduplicate_tests.get_relative_test_path(*inputs))