diff options
Diffstat (limited to 'build/release/sanity.py')
-rw-r--r-- | build/release/sanity.py | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/build/release/sanity.py b/build/release/sanity.py new file mode 100644 index 000000000..aba855989 --- /dev/null +++ b/build/release/sanity.py @@ -0,0 +1,124 @@ +import difflib +import logging +import re +import urllib2 +from util.commands import run_cmd, get_output +from util.hg import get_repo_name, make_hg_url +from subprocess import CalledProcessError + +log = logging.getLogger(__name__) + + +def check_buildbot(): + """check if buildbot command works""" + try: + run_cmd(['buildbot', '--version']) + except CalledProcessError: + log.error("FAIL: buildbot command doesn't work", exc_info=True) + raise + + +def find_version(contents, versionNumber): + """Given an open readable file-handle look for the occurrence + of the version # in the file""" + ret = re.search(re.compile(re.escape(versionNumber), re.DOTALL), contents) + return ret + + +def locale_diff(locales1, locales2): + """ accepts two lists and diffs them both ways, returns any differences + found """ + diff_list = [locale for locale in locales1 if not locale in locales2] + diff_list.extend(locale for locale in locales2 if not locale in locales1) + return diff_list + + +def get_buildbot_username_param(): + cmd = ['buildbot', 'sendchange', '--help'] + output = get_output(cmd) + if "-W, --who=" in output: + return "--who" + else: + return "--username" + + +def sendchange(branch, revision, username, master, products): + """Send the change to buildbot to kick off the release automation""" + if isinstance(products, basestring): + products = [products] + cmd = [ + 'buildbot', + 'sendchange', + get_buildbot_username_param(), + username, + '--master', + master, + '--branch', + branch, + '-p', + 'products:%s' % ','.join(products), + '-p', + 'script_repo_revision:%s' % revision, + 'release_or_beta' + ] + logging.info("Executing: %s" % cmd) + run_cmd(cmd) + + +def verify_mozconfigs(mozconfig_pair, nightly_mozconfig_pair, platform, + mozconfigWhitelist={}): + """Compares mozconfig to nightly_mozconfig and compare to an optional + whitelist of known differences. mozconfig_pair and nightly_mozconfig_pair + are pairs containing the mozconfig's identifier and the list of lines in + the mozconfig.""" + + # unpack the pairs to get the names, the names are just for + # identifying the mozconfigs when logging the error messages + mozconfig_name, mozconfig_lines = mozconfig_pair + nightly_mozconfig_name, nightly_mozconfig_lines = nightly_mozconfig_pair + + missing_args = mozconfig_lines == [] or nightly_mozconfig_lines == [] + if missing_args: + log.info("Missing mozconfigs to compare for %s" % platform) + return False + + success = True + + diffInstance = difflib.Differ() + diff_result = diffInstance.compare(mozconfig_lines, nightly_mozconfig_lines) + diffList = list(diff_result) + + for line in diffList: + clean_line = line[1:].strip() + if (line[0] == '-' or line[0] == '+') and len(clean_line) > 1: + # skip comment lines + if clean_line.startswith('#'): + continue + # compare to whitelist + message = "" + if line[0] == '-': + if platform in mozconfigWhitelist.get('release', {}): + if clean_line in \ + mozconfigWhitelist['release'][platform]: + continue + elif line[0] == '+': + if platform in mozconfigWhitelist.get('nightly', {}): + if clean_line in \ + mozconfigWhitelist['nightly'][platform]: + continue + else: + log.warning("%s not in %s %s!" % ( + clean_line, platform, + mozconfigWhitelist['nightly'][platform])) + else: + log.error("Skipping line %s!" % line) + continue + message = "found in %s but not in %s: %s" + if line[0] == '-': + log.error(message % (mozconfig_name, + nightly_mozconfig_name, clean_line)) + else: + log.error(message % (nightly_mozconfig_name, + mozconfig_name, clean_line)) + success = False + return success |