Index: Tools/Scripts/webkitpy/tool/commands/rebaseline.py |
diff --git a/Tools/Scripts/webkitpy/tool/commands/rebaseline.py b/Tools/Scripts/webkitpy/tool/commands/rebaseline.py |
index d6adf3b1b7e895e72c1e88b9a6a894bd6b66bfc5..07f3b5784665a2f7ab6442ce6dcf57ea6aa1851b 100644 |
--- a/Tools/Scripts/webkitpy/tool/commands/rebaseline.py |
+++ b/Tools/Scripts/webkitpy/tool/commands/rebaseline.py |
@@ -658,65 +658,12 @@ class AutoRebaseline(AbstractParallelRebaselineCommand): |
self.no_optimize_option, |
# FIXME: Remove this option. |
self.results_directory_option, |
- optparse.make_option("--log-server", help="Server to send logs to.") |
]) |
- def _log_to_server(self, log_server, query): |
- if not log_server: |
- return |
- urllib2.urlopen("http://" + log_server + "/updatelog", data=urllib.urlencode(query)) |
- |
- # Logs when there are no NeedsRebaseline lines in TestExpectations. |
- # These entries overwrite the existing log entry if the existing |
- # entry is also a noneedsrebaseline entry. This is special cased |
- # so that the log doesn't get bloated with entries like this |
- # when there are no tests that needs rebaselining. |
- def _log_no_needs_rebaseline_lines(self, log_server): |
- self._log_to_server(log_server, { |
- "noneedsrebaseline": "on", |
- }) |
- |
- # Uploaded log entries append to the existing entry unless the |
- # newentry flag is set. In that case it starts a new entry to |
- # start appending to. So, we need to call this on any fresh run |
- # that is going to end up logging stuff (i.e. any run that isn't |
- # a noneedsrebaseline run). |
- def _start_new_log_entry(self, log_server): |
- self._log_to_server(log_server, { |
- "log": "", |
- "newentry": "on", |
- }) |
- |
- def _configure_logging(self, log_server): |
- if not log_server: |
- return |
- |
- def _log_alias(query): |
- self._log_to_server(log_server, query) |
- |
- class LogHandler(logging.Handler): |
- def __init__(self): |
- logging.Handler.__init__(self) |
- self._records = [] |
- |
- # Since this does not have the newentry flag, it will append |
- # to the most recent log entry (i.e. the one created by |
- # _start_new_log_entry. |
- def emit(self, record): |
- _log_alias({ |
- "log": record.getMessage(), |
- }) |
- |
- handler = LogHandler() |
- _log.setLevel(logging.DEBUG) |
- handler.setLevel(logging.DEBUG) |
- _log.addHandler(handler) |
- |
- def bot_revision_data(self, log_server): |
+ def bot_revision_data(self): |
revisions = [] |
for result in self.builder_data().values(): |
if result.run_was_interrupted(): |
- self._start_new_log_entry(log_server) |
_log.error("Can't rebaseline because the latest run on %s exited early." % result.builder_name()) |
return [] |
revisions.append({ |
@@ -725,7 +672,7 @@ class AutoRebaseline(AbstractParallelRebaselineCommand): |
}) |
return revisions |
- def tests_to_rebaseline(self, tool, min_revision, print_revisions, log_server): |
+ def tests_to_rebaseline(self, tool, min_revision, print_revisions): |
port = tool.port_factory.get() |
expectations_file_path = port.path_to_generic_test_expectations_file() |
@@ -744,8 +691,6 @@ class AutoRebaseline(AbstractParallelRebaselineCommand): |
if "NeedsRebaseline" not in line_without_comments: |
continue |
- if not has_any_needs_rebaseline_lines: |
- self._start_new_log_entry(log_server) |
has_any_needs_rebaseline_lines = True |
parsed_line = re.match("^(\S*)[^(]*\((\S*).*?([^ ]*)\ \[[^[]*$", line_without_comments) |
@@ -816,17 +761,22 @@ class AutoRebaseline(AbstractParallelRebaselineCommand): |
if options.verbose: |
subprocess_command.append('--verbose') |
- process = self._tool.executive.popen(subprocess_command, stdout=self._tool.executive.PIPE) |
+ process = self._tool.executive.popen(subprocess_command, stdout=self._tool.executive.PIPE, stderr=self._tool.executive.PIPE) |
last_output_time = time.time() |
# git cl sometimes completely hangs. Bail if we haven't gotten any output to stdout/stderr in a while. |
while process.poll() == None and time.time() < last_output_time + self.SECONDS_BEFORE_GIVING_UP: |
- # FIXME: Also log stderr. |
+ # FIXME: This isn't awesome. It may improperly interleave stdout and stderr? |
out = process.stdout.readline().rstrip('\n') |
if out: |
last_output_time = time.time() |
_log.info(out) |
+ err = process.stdout.readline().rstrip('\n') |
+ if err: |
+ last_output_time = time.time() |
+ _log.error(err) |
+ |
if process.poll() == None: |
_log.error('Command hung: %s' % subprocess_command) |
return False |
@@ -851,18 +801,12 @@ class AutoRebaseline(AbstractParallelRebaselineCommand): |
_log.error("Cannot proceed with working directory changes. Clean working directory first.") |
return |
- self._configure_logging(options.log_server) |
- |
- revision_data = self.bot_revision_data(options.log_server) |
+ revision_data = self.bot_revision_data() |
if not revision_data: |
return |
min_revision = int(min([item["revision"] for item in revision_data])) |
- tests, revision, author, bugs, has_any_needs_rebaseline_lines = self.tests_to_rebaseline(tool, min_revision, print_revisions=options.verbose, log_server=options.log_server) |
- |
- if not has_any_needs_rebaseline_lines: |
- self._log_no_needs_rebaseline_lines(options.log_server) |
- return |
+ tests, revision, author, bugs, has_any_needs_rebaseline_lines = self.tests_to_rebaseline(tool, min_revision, print_revisions=options.verbose) |
if options.verbose: |
_log.info("Min revision across all bots is %s." % min_revision) |
@@ -919,20 +863,46 @@ class RebaselineOMatic(AbstractDeclarativeCommand): |
show_in_main_help = True |
SLEEP_TIME_IN_SECONDS = 30 |
+ LOG_SERVER = 'blinkrebaseline.appspot.com' |
+ |
+ # Uploaded log entries append to the existing entry unless the |
+ # newentry flag is set. In that case it starts a new entry to |
+ # start appending to. |
+ def _log_to_server(self, log='', is_new_entry=False): |
+ query = { |
+ 'log': log, |
+ } |
+ if is_new_entry: |
+ query['newentry'] = 'on' |
+ urllib2.urlopen("http://" + self.LOG_SERVER + "/updatelog", data=urllib.urlencode(query)) |
+ |
+ def _run_logged_command(self, command): |
+ process = self._tool.executive.popen(command, stdout=self._tool.executive.PIPE, stderr=self._tool.executive.PIPE) |
+ while process.poll() == None: |
+ # FIXME: This should probably batch up lines if they're available and log to the server once. |
+ out = process.stdout.readline() |
+ if out: |
+ self._log_to_server(out) |
+ |
+ err = process.stderr.readline() |
+ if err: |
+ self._log_to_server(err) |
+ |
+ def _do_one_rebaseline(self, verbose): |
+ try: |
+ old_branch_name = self._tool.scm().current_branch() |
+ self._log_to_server(is_new_entry=True) |
+ self._run_logged_command(['git', 'pull']) |
+ rebaseline_command = [self._tool.filesystem.join(self._tool.scm().checkout_root, 'Tools', 'Scripts', 'webkit-patch'), 'auto-rebaseline'] |
+ if verbose: |
+ rebaseline_command.append('--verbose') |
+ self._run_logged_command(rebaseline_command) |
+ except: |
+ traceback.print_exc(file=sys.stderr) |
+ # Sometimes git crashes and leaves us on a detached head. |
+ self._tool.scm().checkout_branch(old_branch_name) |
def execute(self, options, args, tool): |
while True: |
- try: |
- old_branch_name = tool.scm().current_branch() |
- tool.executive.run_command(['git', 'pull']) |
- rebaseline_command = [tool.filesystem.join(tool.scm().checkout_root, 'Tools', 'Scripts', 'webkit-patch'), 'auto-rebaseline', '--log-server', 'blinkrebaseline.appspot.com'] |
- if options.verbose: |
- rebaseline_command.append('--verbose') |
- # Use call instead of run_command so that stdout doesn't get swallowed. |
- tool.executive.call(rebaseline_command) |
- except: |
- traceback.print_exc(file=sys.stderr) |
- # Sometimes git crashes and leaves us on a detached head. |
- tool.scm().checkout_branch(old_branch_name) |
- |
+ self._do_one_rebaseline(options.verbose) |
time.sleep(self.SLEEP_TIME_IN_SECONDS) |