2013-08-20 16:21:55 +00:00
|
|
|
#!/usr/bin/python
|
|
|
|
|
|
|
|
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
|
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
|
|
# found in the LICENSE file.
|
|
|
|
|
|
|
|
"""
|
|
|
|
Provides read access to buildbot's global_variables.json .
|
|
|
|
"""
|
|
|
|
|
2014-01-09 21:41:39 +00:00
|
|
|
|
|
|
|
from contextlib import closing
|
|
|
|
|
|
|
|
import HTMLParser
|
2013-08-20 16:21:55 +00:00
|
|
|
import json
|
2014-01-14 19:18:45 +00:00
|
|
|
import re
|
2013-08-20 16:21:55 +00:00
|
|
|
import svn
|
2014-01-09 21:41:39 +00:00
|
|
|
import sys
|
|
|
|
import urllib2
|
|
|
|
|
2013-08-20 16:21:55 +00:00
|
|
|
|
|
|
|
_global_vars = None
|
|
|
|
|
2013-12-02 20:27:16 +00:00
|
|
|
|
2014-01-09 21:41:39 +00:00
|
|
|
GLOBAL_VARS_JSON_URL = ('https://skia.googlesource.com/buildbot/+'
|
|
|
|
'/master/site_config/global_variables.json')
|
2013-12-02 20:27:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
class GlobalVarsRetrievalError(Exception):
|
|
|
|
"""Exception which is raised when the global_variables.json file cannot be
|
|
|
|
retrieved from the Skia buildbot repository."""
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
class JsonDecodeError(Exception):
|
|
|
|
"""Exception which is raised when the global_variables.json file cannot be
|
|
|
|
interpreted as JSON. This may be due to the file itself being incorrectly
|
|
|
|
formatted or due to an incomplete or corrupted downloaded version of the file.
|
|
|
|
"""
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2013-08-20 16:21:55 +00:00
|
|
|
class NoSuchGlobalVariable(KeyError):
|
2013-12-02 20:27:16 +00:00
|
|
|
"""Exception which is raised when a given variable is not found in the
|
|
|
|
global_variables.json file."""
|
2013-08-20 16:21:55 +00:00
|
|
|
pass
|
|
|
|
|
2013-12-02 20:27:16 +00:00
|
|
|
|
2014-01-09 21:41:39 +00:00
|
|
|
def retrieve_from_googlesource(url):
|
|
|
|
"""Retrieve the given file from GoogleSource's HTTP interface, trimming the
|
|
|
|
extraneous HTML. Intended to be a GoogleSource equivalent of "svn cat".
|
|
|
|
|
|
|
|
This just returns the unescaped contents of the first <pre> tag which matches
|
|
|
|
our expectations for GoogleSource's HTTP interface. If that interface changes,
|
|
|
|
this function will almost surely break.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
url: string; the URL of the file to retrieve.
|
|
|
|
Returns:
|
|
|
|
The contents of the file in GoogleSource, stripped of the extra HTML from
|
|
|
|
the HTML interface.
|
|
|
|
"""
|
|
|
|
with closing(urllib2.urlopen(url)) as f:
|
|
|
|
contents = f.read()
|
2014-01-14 19:18:45 +00:00
|
|
|
pre_open = '<pre class="git-blob prettyprint linenums lang-(\w+)">'
|
2014-01-09 21:41:39 +00:00
|
|
|
pre_close = '</pre>'
|
2014-01-14 19:18:45 +00:00
|
|
|
matched_tag = re.search(pre_open, contents).group()
|
|
|
|
start_index = contents.find(matched_tag)
|
2014-01-09 21:41:39 +00:00
|
|
|
end_index = contents.find(pre_close)
|
|
|
|
parser = HTMLParser.HTMLParser()
|
2014-01-14 19:18:45 +00:00
|
|
|
return parser.unescape(contents[start_index + len(matched_tag):end_index])
|
2014-01-09 21:41:39 +00:00
|
|
|
|
|
|
|
|
2013-08-20 16:21:55 +00:00
|
|
|
def Get(var_name):
|
2014-01-09 21:41:39 +00:00
|
|
|
"""Return the value associated with this name in global_variables.json.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
var_name: string; the variable to look up.
|
|
|
|
Returns:
|
|
|
|
The value of the variable.
|
|
|
|
Raises:
|
|
|
|
NoSuchGlobalVariable if there is no variable with that name.
|
|
|
|
"""
|
2013-08-20 16:21:55 +00:00
|
|
|
global _global_vars
|
|
|
|
if not _global_vars:
|
2013-12-02 20:27:16 +00:00
|
|
|
try:
|
2014-01-09 21:41:39 +00:00
|
|
|
global_vars_text = retrieve_from_googlesource(GLOBAL_VARS_JSON_URL)
|
2013-12-02 20:27:16 +00:00
|
|
|
except Exception:
|
|
|
|
raise GlobalVarsRetrievalError('Failed to retrieve %s.' %
|
|
|
|
GLOBAL_VARS_JSON_URL)
|
|
|
|
try:
|
|
|
|
_global_vars = json.loads(global_vars_text)
|
|
|
|
except ValueError as e:
|
|
|
|
raise JsonDecodeError(e.message + '\n' + global_vars_text)
|
2013-08-20 16:21:55 +00:00
|
|
|
try:
|
|
|
|
return _global_vars[var_name]['value']
|
|
|
|
except KeyError:
|
|
|
|
raise NoSuchGlobalVariable(var_name)
|
2014-01-09 21:41:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
print Get(sys.argv[1])
|