| Index: gm/rebaseline_server/server.py
|
| diff --git a/gm/rebaseline_server/server.py b/gm/rebaseline_server/server.py
|
| index 0906c4e7ee075a73ce098b5250b75f910c6452e0..bbce2d0a7d5bf40a8fe805d8e6af604e0cbbc3ea 100755
|
| --- a/gm/rebaseline_server/server.py
|
| +++ b/gm/rebaseline_server/server.py
|
| @@ -40,6 +40,7 @@ if TOOLS_DIRECTORY not in sys.path:
|
| import svn
|
|
|
| # Imports from local dir
|
| +import imagepairset
|
| import results
|
|
|
| ACTUALS_SVN_REPO = 'http://skia-autogen.googlecode.com/svn/gm-actual'
|
| @@ -59,6 +60,20 @@ MIME_TYPE_MAP = {'': 'application/octet-stream',
|
| 'json': 'application/json'
|
| }
|
|
|
| +# Keys that server.py uses to create the toplevel content header.
|
| +# NOTE: Keep these in sync with static/constants.js
|
| +KEY__EDITS__MODIFICATIONS = 'modifications'
|
| +KEY__EDITS__OLD_RESULTS_HASH = 'oldResultsHash'
|
| +KEY__EDITS__OLD_RESULTS_TYPE = 'oldResultsType'
|
| +KEY__HEADER = 'header'
|
| +KEY__HEADER__DATAHASH = 'dataHash'
|
| +KEY__HEADER__IS_EDITABLE = 'isEditable'
|
| +KEY__HEADER__IS_EXPORTED = 'isExported'
|
| +KEY__HEADER__IS_STILL_LOADING = 'resultsStillLoading'
|
| +KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE = 'timeNextUpdateAvailable'
|
| +KEY__HEADER__TIME_UPDATED = 'timeUpdated'
|
| +KEY__HEADER__TYPE = 'type'
|
| +
|
| DEFAULT_ACTUALS_DIR = '.gm-actuals'
|
| DEFAULT_PORT = 8888
|
|
|
| @@ -313,10 +328,11 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
| else:
|
| now = int(time.time())
|
| response_dict = {
|
| - 'header': {
|
| - 'resultsStillLoading': True,
|
| - 'timeUpdated': now,
|
| - 'timeNextUpdateAvailable': now + RELOAD_INTERVAL_UNTIL_READY,
|
| + KEY__HEADER: {
|
| + KEY__HEADER__IS_STILL_LOADING: True,
|
| + KEY__HEADER__TIME_UPDATED: now,
|
| + KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE:
|
| + now + RELOAD_INTERVAL_UNTIL_READY,
|
| },
|
| }
|
| self.send_json_dict(response_dict)
|
| @@ -332,7 +348,7 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
| """
|
| response_dict = results_obj.get_results_of_type(type)
|
| time_updated = results_obj.get_timestamp()
|
| - response_dict['header'] = {
|
| + response_dict[KEY__HEADER] = {
|
| # Timestamps:
|
| # 1. when this data was last updated
|
| # 2. when the caller should check back for new data (if ever)
|
| @@ -340,23 +356,25 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
| # We only return these timestamps if the --reload argument was passed;
|
| # otherwise, we have no idea when the expectations were last updated
|
| # (we allow the user to maintain her own expectations as she sees fit).
|
| - 'timeUpdated': time_updated if _SERVER.reload_seconds else None,
|
| - 'timeNextUpdateAvailable': (
|
| + KEY__HEADER__TIME_UPDATED:
|
| + time_updated if _SERVER.reload_seconds else None,
|
| + KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE:
|
| (time_updated+_SERVER.reload_seconds) if _SERVER.reload_seconds
|
| - else None),
|
| + else None,
|
|
|
| # The type we passed to get_results_of_type()
|
| - 'type': type,
|
| + KEY__HEADER__TYPE: type,
|
|
|
| - # Hash of testData, which the client must return with any edits--
|
| + # Hash of dataset, which the client must return with any edits--
|
| # this ensures that the edits were made to a particular dataset.
|
| - 'dataHash': str(hash(repr(response_dict['testData']))),
|
| + KEY__HEADER__DATAHASH: str(hash(repr(
|
| + response_dict[imagepairset.KEY__IMAGEPAIRS]))),
|
|
|
| # Whether the server will accept edits back.
|
| - 'isEditable': _SERVER.is_editable,
|
| + KEY__HEADER__IS_EDITABLE: _SERVER.is_editable,
|
|
|
| # Whether the service is accessible from other hosts.
|
| - 'isExported': _SERVER.is_exported,
|
| + KEY__HEADER__IS_EXPORTED: _SERVER.is_exported,
|
| }
|
| return response_dict
|
|
|
| @@ -406,19 +424,15 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
| format:
|
|
|
| {
|
| - 'oldResultsType': 'all', # type of results that the client loaded
|
| - # and then made modifications to
|
| - 'oldResultsHash': 39850913, # hash of results when the client loaded them
|
| - # (ensures that the client and server apply
|
| - # modifications to the same base)
|
| - 'modifications': [
|
| - {
|
| - 'builder': 'Test-Android-Nexus10-MaliT604-Arm7-Debug',
|
| - 'test': 'strokerect',
|
| - 'config': 'gpu',
|
| - 'expectedHashType': 'bitmap-64bitMD5',
|
| - 'expectedHashDigest': '1707359671708613629',
|
| - },
|
| + KEY__EDITS__OLD_RESULTS_TYPE: 'all', # type of results that the client
|
| + # loaded and then made
|
| + # modifications to
|
| + KEY__EDITS__OLD_RESULTS_HASH: 39850913, # hash of results when the client
|
| + # loaded them (ensures that the
|
| + # client and server apply
|
| + # modifications to the same base)
|
| + KEY__EDITS__MODIFICATIONS: [
|
| + # as needed by results.edit_expectations()
|
| ...
|
| ],
|
| }
|
| @@ -445,15 +459,15 @@ class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
| # no other thread updates expectations (from the Skia repo) while we are
|
| # updating them (using the info we received from the client).
|
| with _SERVER.results_rlock:
|
| - oldResultsType = data['oldResultsType']
|
| + oldResultsType = data[KEY__EDITS__OLD_RESULTS_TYPE]
|
| oldResults = _SERVER.results.get_results_of_type(oldResultsType)
|
| - oldResultsHash = str(hash(repr(oldResults['testData'])))
|
| - if oldResultsHash != data['oldResultsHash']:
|
| + oldResultsHash = str(hash(repr(oldResults[imagepairset.KEY__IMAGEPAIRS])))
|
| + if oldResultsHash != data[KEY__EDITS__OLD_RESULTS_HASH]:
|
| raise Exception('results of type "%s" changed while the client was '
|
| 'making modifications. The client should reload the '
|
| 'results and submit the modifications again.' %
|
| oldResultsType)
|
| - _SERVER.results.edit_expectations(data['modifications'])
|
| + _SERVER.results.edit_expectations(data[KEY__EDITS__MODIFICATIONS])
|
|
|
| # Read the updated results back from disk.
|
| # We can do this in a separate thread; we should return our success message
|
|
|