summaryrefslogtreecommitdiffstats
path: root/build/release/sanity.py
diff options
context:
space:
mode:
Diffstat (limited to 'build/release/sanity.py')
-rw-r--r--build/release/sanity.py124
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