blob: caae84562108ad7dcf489a3c6af12349f93d4333 [file] [log] [blame]
import difflib
import logging
import re
from release.info import readConfig
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_build'
]
log.info("Executing: %s" % cmd)
run_cmd(cmd)
def verify_mozconfigs(branch, revision, hghost, product, mozconfigs,
nightly_mozconfigs, whitelist=None):
"""Compare nightly mozconfigs for branch to release mozconfigs and
compare to whitelist of known differences"""
branch_name = get_repo_name(branch)
if whitelist:
mozconfigWhitelist = readConfig(whitelist, ['whitelist'])
else:
mozconfigWhitelist = {}
log.info("Comparing %s mozconfigs to nightly mozconfigs..." % product)
success = True
for platform, mozconfig in mozconfigs.items():
urls = []
mozconfigs = []
nightly_mozconfig = nightly_mozconfigs[platform]
mozconfig_paths = [mozconfig, nightly_mozconfig]
# Create links to the two mozconfigs.
releaseConfig = make_hg_url(hghost, branch, 'http', revision,
mozconfig)
for c in mozconfig, nightly_mozconfig:
urls.append(make_hg_url(hghost, branch, 'http', revision, c))
for url in urls:
try:
mozconfigs.append(urllib2.urlopen(url).readlines())
except urllib2.HTTPError as e:
log.error("MISSING: %s - ERROR: %s" % (url, e.msg))
# Nothing to compare against
return False
diffInstance = difflib.Differ()
if len(mozconfigs) == 2:
diffList = list(diffInstance.compare(mozconfigs[0], mozconfigs[1]))
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(branch_name, {}):
if clean_line in \
mozconfigWhitelist[branch_name][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_paths[0],
mozconfig_paths[1], clean_line))
else:
log.error(message % (mozconfig_paths[1],
mozconfig_paths[0], clean_line))
success = False
else:
log.info("Missing mozconfigs to compare for %s" % platform)
return False
return success