mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-01-24 05:44:10 +00:00
bug 763903: regularly run mozconfig comparisons. r=gps/bhearsum
--HG-- extra : rebase_source : bce7ca1529dd139f92ddb42f898aea3842ae0689
This commit is contained in:
parent
f76a4b028f
commit
7eb08ca2c3
@ -3,18 +3,23 @@
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
from os import path
|
||||
from buildconfig import substs
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
def determine_platform():
|
||||
platform_mapping = {'WINNT': {'x86_64': 'win64',
|
||||
'i386': 'win32'},
|
||||
'i686': 'win32'},
|
||||
'Darwin': {'x86_64': 'macosx-universal',
|
||||
'i386':'macosx-universal'},
|
||||
'Linux': {'x86_64': 'linux64',
|
||||
'i386': 'linux32'}}
|
||||
'i686': 'linux32'}}
|
||||
|
||||
os_type = substs['OS_TARGET']
|
||||
cpu_type = substs['TARGET_CPU']
|
||||
@ -37,17 +42,22 @@ def main():
|
||||
release_mozconfig_path = path.join(browser_dir, 'config/mozconfigs', platform, 'release')
|
||||
nightly_mozconfig_path = path.join(browser_dir, 'config/mozconfigs', platform, 'nightly')
|
||||
|
||||
# compare beta vs nightly
|
||||
log.info("Comparing beta against nightly mozconfigs")
|
||||
ret_code = subprocess.call([python_exe, script_path, '--whitelist',
|
||||
whitelist_path, '--no-download',
|
||||
platform + ',' + beta_mozconfig_path +
|
||||
',' + nightly_mozconfig_path])
|
||||
|
||||
if ret_code > 0:
|
||||
sys.exit(ret_code)
|
||||
return ret_code
|
||||
|
||||
# compare release vs nightly
|
||||
log.info("Comparing release against nightly mozconfigs")
|
||||
ret_code = subprocess.call([python_exe, script_path, '--whitelist',
|
||||
whitelist_path, '--no-download',
|
||||
platform + ',' + release_mozconfig_path +
|
||||
',' + nightly_mozconfig_path])
|
||||
|
||||
return ret_code
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
|
@ -1,19 +1,116 @@
|
||||
#!/usr/bin/python
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
# originally from http://hg.mozilla.org/build/tools/file/4ab9c1a4e05b/scripts/release/compare-mozconfigs.py
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import logging
|
||||
import os
|
||||
import site
|
||||
import sys
|
||||
import urllib2
|
||||
|
||||
site.addsitedir(os.path.join(os.path.dirname(__file__), "../../lib/python"))
|
||||
|
||||
from release.sanity import verify_mozconfigs
|
||||
from release.info import readConfig
|
||||
from util.hg import make_hg_url
|
||||
import difflib
|
||||
|
||||
FAILURE_CODE = 1
|
||||
SUCCESS_CODE = 0
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class ConfigError(Exception):
|
||||
pass
|
||||
|
||||
def make_hg_url(hgHost, repoPath, protocol='https', revision=None,
|
||||
filename=None):
|
||||
"""construct a valid hg url from a base hg url (hg.mozilla.org),
|
||||
repoPath, revision and possible filename"""
|
||||
base = '%s://%s' % (protocol, hgHost)
|
||||
repo = '/'.join(p.strip('/') for p in [base, repoPath])
|
||||
if not filename:
|
||||
if not revision:
|
||||
return repo
|
||||
else:
|
||||
return '/'.join([p.strip('/') for p in [repo, 'rev', revision]])
|
||||
else:
|
||||
assert revision
|
||||
return '/'.join([p.strip('/') for p in [repo, 'raw-file', revision,
|
||||
filename]])
|
||||
|
||||
def readConfig(configfile, keys=[], required=[]):
|
||||
c = {}
|
||||
execfile(configfile, c)
|
||||
for k in keys:
|
||||
c = c[k]
|
||||
items = c.keys()
|
||||
err = False
|
||||
for key in required:
|
||||
if key not in items:
|
||||
err = True
|
||||
log.error("Required item `%s' missing from %s" % (key, c))
|
||||
if err:
|
||||
raise ConfigError("Missing at least one item in config, see above")
|
||||
return c
|
||||
|
||||
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
|
||||
|
||||
diff_instance = difflib.Differ()
|
||||
diff_result = diff_instance.compare(mozconfig_lines, nightly_mozconfig_lines)
|
||||
diff_list = list(diff_result)
|
||||
|
||||
for line in diff_list:
|
||||
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
|
||||
|
||||
def get_mozconfig(path, options):
|
||||
"""Consumes a path and returns a list of lines from
|
||||
the mozconfig file. If download is required, the path
|
||||
|
Loading…
x
Reference in New Issue
Block a user