| Index: gm/rebaseline_server/server.py
|
| ===================================================================
|
| --- gm/rebaseline_server/server.py (revision 11711)
|
| +++ gm/rebaseline_server/server.py (working copy)
|
| @@ -13,11 +13,13 @@
|
| import argparse
|
| import BaseHTTPServer
|
| import json
|
| +import logging
|
| import os
|
| import posixpath
|
| import re
|
| import shutil
|
| import sys
|
| +import urlparse
|
|
|
| # Imports from within Skia
|
| #
|
| @@ -91,16 +93,17 @@
|
| the gm-actuals and expectations will automatically be updated every few
|
| minutes. See discussion in https://codereview.chromium.org/24274003/ .
|
| """
|
| - print 'Checking out latest actual GM results from %s into %s ...' % (
|
| - ACTUALS_SVN_REPO, self._actuals_dir)
|
| + logging.info('Checking out latest actual GM results from %s into %s ...' % (
|
| + ACTUALS_SVN_REPO, self._actuals_dir))
|
| actuals_repo = svn.Svn(self._actuals_dir)
|
| if not os.path.isdir(self._actuals_dir):
|
| os.makedirs(self._actuals_dir)
|
| actuals_repo.Checkout(ACTUALS_SVN_REPO, '.')
|
| else:
|
| actuals_repo.Update('.')
|
| - print 'Parsing results from actuals in %s and expectations in %s ...' % (
|
| - self._actuals_dir, self._expectations_dir)
|
| + logging.info(
|
| + 'Parsing results from actuals in %s and expectations in %s ...' % (
|
| + self._actuals_dir, self._expectations_dir))
|
| self.results = results.Results(
|
| actuals_root=self._actuals_dir,
|
| expected_root=self._expectations_dir)
|
| @@ -109,13 +112,13 @@
|
| self.fetch_results()
|
| if self._export:
|
| server_address = ('', self._port)
|
| - print ('WARNING: Running in "export" mode. Users on other machines will '
|
| - 'be able to modify your GM expectations!')
|
| + logging.warning('Running in "export" mode. Users on other machines will '
|
| + 'be able to modify your GM expectations!')
|
| else:
|
| server_address = ('127.0.0.1', self._port)
|
| http_server = BaseHTTPServer.HTTPServer(server_address, HTTPRequestHandler)
|
| - print 'Ready for requests on http://%s:%d' % (
|
| - http_server.server_name, http_server.server_port)
|
| + logging.info('Ready for requests on http://%s:%d' % (
|
| + http_server.server_name, http_server.server_port))
|
| http_server.serve_forever()
|
|
|
|
|
| @@ -127,7 +130,7 @@
|
| """ Handles all GET requests, forwarding them to the appropriate
|
| do_GET_* dispatcher. """
|
| if self.path == '' or self.path == '/' or self.path == '/index.html' :
|
| - self.redirect_to('/static/view.html')
|
| + self.redirect_to('/static/view.html?resultsToLoad=all')
|
| return
|
| if self.path == '/favicon.ico' :
|
| self.redirect_to('/static/favicon.ico')
|
| @@ -146,21 +149,20 @@
|
| dispatcher = dispatchers[dispatcher_name]
|
| dispatcher(remainder)
|
|
|
| - def do_GET_results(self, result_type):
|
| + def do_GET_results(self, type):
|
| """ Handle a GET request for GM results.
|
| - For now, we ignore the remaining path info, because we only know how to
|
| - return all results.
|
|
|
| Args:
|
| - result_type: currently unused
|
| -
|
| - TODO(epoger): Unless we start making use of result_type, remove that
|
| - parameter."""
|
| - print 'do_GET_results: sending results of type "%s"' % result_type
|
| - # TODO(epoger): Cache response_dict rather than the results object, to save
|
| - # time on subsequent fetches (no need to regenerate the header, etc.)
|
| - response_dict = _SERVER.results.GetAll()
|
| - if response_dict:
|
| + type: string indicating which set of results to return;
|
| + must be one of the results.RESULTS_* constants
|
| + """
|
| + logging.debug('do_GET_results: sending results of type "%s"' % type)
|
| + try:
|
| + # TODO(epoger): Rather than using a global variable for the handler
|
| + # to refer to the Server object, make Server a subclass of
|
| + # HTTPServer, and then it could be available to the handler via
|
| + # the handler's .server instance variable.
|
| + response_dict = _SERVER.results.get_results_of_type(type)
|
| response_dict['header'] = {
|
| # Hash of testData, which the client must return with any edits--
|
| # this ensures that the edits were made to a particular dataset.
|
| @@ -176,7 +178,7 @@
|
| 'isExported': _SERVER.is_exported(),
|
| }
|
| self.send_json_dict(response_dict)
|
| - else:
|
| + except:
|
| self.send_error(404)
|
|
|
| def do_GET_static(self, path):
|
| @@ -187,14 +189,18 @@
|
| Args:
|
| path: path to file (under static directory) to retrieve
|
| """
|
| - print 'do_GET_static: sending file "%s"' % path
|
| + # Strip arguments ('?resultsToLoad=all') from the path
|
| + path = urlparse.urlparse(path).path
|
| +
|
| + logging.debug('do_GET_static: sending file "%s"' % path)
|
| static_dir = os.path.realpath(os.path.join(PARENT_DIRECTORY, 'static'))
|
| full_path = os.path.realpath(os.path.join(static_dir, path))
|
| if full_path.startswith(static_dir):
|
| self.send_file(full_path)
|
| else:
|
| - print ('Attempted do_GET_static() of path [%s] outside of static dir [%s]'
|
| - % (full_path, static_dir))
|
| + logging.error(
|
| + 'Attempted do_GET_static() of path [%s] outside of static dir [%s]'
|
| + % (full_path, static_dir))
|
| self.send_error(404)
|
|
|
| def redirect_to(self, url):
|
| @@ -246,6 +252,7 @@
|
|
|
|
|
| def main():
|
| + logging.basicConfig(level=logging.INFO)
|
| parser = argparse.ArgumentParser()
|
| parser.add_argument('--actuals-dir',
|
| help=('Directory into which we will check out the latest '
|
|
|