summaryrefslogtreecommitdiff
path: root/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py')
-rw-r--r--Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py67
1 files changed, 43 insertions, 24 deletions
diff --git a/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py b/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py
index 562d19ec8..d2d53a568 100644
--- a/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py
+++ b/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py
@@ -32,10 +32,11 @@ import logging
_log = logging.getLogger(__name__)
+
# Yes, it's a hypergraph.
# FIXME: Should this function live with the ports somewhere?
# Perhaps this should move onto PortFactory?
-def _baseline_search_hypergraph(host):
+def _baseline_search_hypergraph(host, port_names):
hypergraph = {}
# These edges in the hypergraph aren't visible on build.webkit.org,
@@ -46,7 +47,7 @@ def _baseline_search_hypergraph(host):
fallback_path = ['LayoutTests']
port_factory = host.port_factory
- for port_name in port_factory.all_port_names():
+ for port_name in port_names:
port = port_factory.get(port_name)
webkit_base = port.webkit_base()
search_path = port.baseline_search_path()
@@ -74,14 +75,14 @@ def _invert_dictionary(dictionary):
class BaselineOptimizer(object):
- def __init__(self, host):
+ def __init__(self, host, port_names):
self._host = host
self._filesystem = self._host.filesystem
self._scm = self._host.scm()
- self._hypergraph = _baseline_search_hypergraph(host)
+ self._hypergraph = _baseline_search_hypergraph(host, port_names)
self._directories = reduce(set.union, map(set, self._hypergraph.values()))
- def _read_results_by_directory(self, baseline_name):
+ def read_results_by_directory(self, baseline_name):
results_by_directory = {}
for directory in self._directories:
path = self._filesystem.join(self._scm.checkout_root, directory, baseline_name)
@@ -122,7 +123,7 @@ class BaselineOptimizer(object):
results_by_directory[directory] = result
def _find_optimal_result_placement(self, baseline_name):
- results_by_directory = self._read_results_by_directory(baseline_name)
+ results_by_directory = self.read_results_by_directory(baseline_name)
results_by_port_name = self._results_by_port_name(results_by_directory)
port_names_by_result = _invert_dictionary(results_by_port_name)
@@ -181,7 +182,7 @@ class BaselineOptimizer(object):
return best_so_far
except KeyError as e:
# FIXME: KeyErrors get raised if we're missing baselines. We should handle this better.
- return results_by_directory
+ return {}
def _find_in_fallbackpath(self, fallback_path, current_result, results_by_directory):
for index, directory in enumerate(fallback_path):
@@ -196,6 +197,15 @@ class BaselineOptimizer(object):
del results_by_port_name[port_name]
return results_by_port_name
+ def _platform(self, filename):
+ platform_dir = 'LayoutTests' + self._filesystem.sep + 'platform' + self._filesystem.sep
+ if filename.startswith(platform_dir):
+ return filename.replace(platform_dir, '').split(self._filesystem.sep)[0]
+ platform_dir = self._filesystem.join(self._scm.checkout_root, platform_dir)
+ if filename.startswith(platform_dir):
+ return filename.replace(platform_dir, '').split(self._filesystem.sep)[0]
+ return '(generic)'
+
def _move_baselines(self, baseline_name, results_by_directory, new_results_by_directory):
data_for_result = {}
for directory, result in results_by_directory.items():
@@ -208,12 +218,12 @@ class BaselineOptimizer(object):
if new_results_by_directory.get(directory) != result:
file_names.append(self._filesystem.join(self._scm.checkout_root, directory, baseline_name))
if file_names:
- _log.debug("deleting:")
- for filename in file_names:
- _log.debug(" " + self._filesystem.relpath(filename, self._scm.checkout_root).replace(baseline_name, ''))
+ _log.debug(" Deleting:")
+ for platform_dir in sorted(self._platform(filename) for filename in file_names):
+ _log.debug(" " + platform_dir)
self._scm.delete_list(file_names)
else:
- _log.debug("nothing to delete")
+ _log.debug(" (Nothing to delete)")
file_names = []
for directory, result in new_results_by_directory.items():
@@ -223,33 +233,42 @@ class BaselineOptimizer(object):
self._filesystem.write_binary_file(destination, data_for_result[result])
file_names.append(destination)
if file_names:
- _log.debug("adding:")
- for filename in file_names:
- _log.debug(" " + self._filesystem.relpath(filename, self._scm.checkout_root).replace(baseline_name, ''))
+ _log.debug(" Adding:")
+ for platform_dir in sorted(self._platform(filename) for filename in file_names):
+ _log.debug(" " + platform_dir)
self._scm.add_list(file_names)
else:
- _log.debug("nothing to add")
+ _log.debug(" (Nothing to add)")
def directories_by_result(self, baseline_name):
- results_by_directory = self._read_results_by_directory(baseline_name)
+ results_by_directory = self.read_results_by_directory(baseline_name)
return _invert_dictionary(results_by_directory)
+ def write_by_directory(self, results_by_directory, writer, indent):
+ for path in sorted(results_by_directory):
+ writer("%s%s: %s" % (indent, self._platform(path), results_by_directory[path][0:6]))
+
def optimize(self, baseline_name):
+ basename = self._filesystem.basename(baseline_name)
results_by_directory, new_results_by_directory = self._find_optimal_result_placement(baseline_name)
self.new_results_by_directory = new_results_by_directory
if new_results_by_directory == results_by_directory:
- _log.debug("No optimization found, optimal?")
+ if new_results_by_directory:
+ _log.debug(" %s: (already optimal)" % basename)
+ self.write_by_directory(results_by_directory, _log.debug, " ")
+ else:
+ _log.debug(" %s: (no baselines found)" % basename)
return True
if self._filtered_results_by_port_name(results_by_directory) != self._filtered_results_by_port_name(new_results_by_directory):
- _log.warning("Optimization failed")
+ _log.warning(" %s: optimization failed" % basename)
+ self.write_by_directory(results_by_directory, _log.warning, " ")
return False
- _log.debug("before: ")
- for path, result in results_by_directory.items():
- _log.debug(" %s: %s" % (self._filesystem.relpath(path, self._scm.checkout_root).replace(baseline_name, ''), result[0:6]))
- _log.debug("after: ")
- for path, result in new_results_by_directory.items():
- _log.debug(" %s: %s" % (self._filesystem.relpath(path, self._scm.checkout_root).replace(baseline_name, ''), result[0:6]))
+ _log.debug(" %s:" % basename)
+ _log.debug(" Before: ")
+ self.write_by_directory(results_by_directory, _log.debug, " ")
+ _log.debug(" After: ")
+ self.write_by_directory(new_results_by_directory, _log.debug, " ")
self._move_baselines(baseline_name, results_by_directory, new_results_by_directory)
return True