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