forked from mirrors/gecko-dev
		
	 02a7b4ebdf
			
		
	
	
		02a7b4ebdf
		
	
	
	
	
		
			
			Allow-list all Python code in tree for use with the black linter, and re-format all code in-tree accordingly. To produce this patch I did all of the following: 1. Make changes to tools/lint/black.yml to remove include: stanza and update list of source extensions. 2. Run ./mach lint --linter black --fix 3. Make some ad-hoc manual updates to python/mozbuild/mozbuild/test/configure/test_configure.py -- it has some hard-coded line numbers that the reformat breaks. 4. Make some ad-hoc manual updates to `testing/marionette/client/setup.py`, `testing/marionette/harness/setup.py`, and `testing/firefox-ui/harness/setup.py`, which have hard-coded regexes that break after the reformat. 5. Add a set of exclusions to black.yml. These will be deleted in a follow-up bug (1672023). # ignore-this-changeset Differential Revision: https://phabricator.services.mozilla.com/D94045
		
			
				
	
	
		
			263 lines
		
	
	
	
		
			7.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
	
		
			7.7 KiB
		
	
	
	
		
			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/.
 | |
| 
 | |
| import argparse
 | |
| import errno
 | |
| import hashlib
 | |
| import imp
 | |
| import os
 | |
| import six
 | |
| import sys
 | |
| 
 | |
| from six.moves import configparser
 | |
| 
 | |
| from mozboot.util import get_state_dir
 | |
| 
 | |
| from mozlog.structured import commandline
 | |
| 
 | |
| import manifestdownload
 | |
| from wptrunner import wptcommandline
 | |
| 
 | |
| manifest = None
 | |
| 
 | |
| 
 | |
| def do_delayed_imports(wpt_dir):
 | |
|     global manifest
 | |
|     imp.load_source(
 | |
|         "localpaths", os.path.join(wpt_dir, "tests", "tools", "localpaths.py")
 | |
|     )
 | |
|     sys.path.insert(0, os.path.join(wpt_dir, "tools", "manifest"))
 | |
|     import manifest
 | |
| 
 | |
| 
 | |
| def create_parser():
 | |
|     p = argparse.ArgumentParser()
 | |
|     p.add_argument(
 | |
|         "--rebuild", action="store_true", help="Rebuild manifest from scratch"
 | |
|     )
 | |
|     download_group = p.add_mutually_exclusive_group()
 | |
|     download_group.add_argument(
 | |
|         "--download",
 | |
|         dest="download",
 | |
|         action="store_true",
 | |
|         default=None,
 | |
|         help="Always download even if the local manifest is recent",
 | |
|     )
 | |
|     download_group.add_argument(
 | |
|         "--no-download",
 | |
|         dest="download",
 | |
|         action="store_false",
 | |
|         help="Don't try to download the manifest",
 | |
|     )
 | |
|     p.add_argument(
 | |
|         "--no-update",
 | |
|         action="store_false",
 | |
|         dest="update",
 | |
|         default=True,
 | |
|         help="Just download the manifest, don't update",
 | |
|     )
 | |
|     p.add_argument(
 | |
|         "--config",
 | |
|         action="store",
 | |
|         dest="config_path",
 | |
|         default=None,
 | |
|         help="Path to wptrunner config file",
 | |
|     )
 | |
|     p.add_argument(
 | |
|         "--rewrite-config",
 | |
|         action="store_true",
 | |
|         default=False,
 | |
|         help="Force the local configuration to be regenerated",
 | |
|     )
 | |
|     p.add_argument(
 | |
|         "--cache-root",
 | |
|         action="store",
 | |
|         default=os.path.join(get_state_dir(), "cache", "wpt"),
 | |
|         help="Path to use for the metadata cache",
 | |
|     )
 | |
|     commandline.add_logging_group(p)
 | |
| 
 | |
|     return p
 | |
| 
 | |
| 
 | |
| def ensure_kwargs(kwargs):
 | |
|     _kwargs = vars(create_parser().parse_args([]))
 | |
|     _kwargs.update(kwargs)
 | |
|     return _kwargs
 | |
| 
 | |
| 
 | |
| def run(src_root, obj_root, logger=None, **kwargs):
 | |
|     kwargs = ensure_kwargs(kwargs)
 | |
| 
 | |
|     if logger is None:
 | |
|         from wptrunner import wptlogging
 | |
| 
 | |
|         logger = wptlogging.setup(kwargs, {"mach": sys.stdout})
 | |
| 
 | |
|     src_wpt_dir = os.path.join(src_root, "testing", "web-platform")
 | |
| 
 | |
|     do_delayed_imports(src_wpt_dir)
 | |
| 
 | |
|     if not kwargs["config_path"]:
 | |
|         config_path = generate_config(
 | |
|             logger,
 | |
|             src_root,
 | |
|             src_wpt_dir,
 | |
|             os.path.join(obj_root, "_tests", "web-platform"),
 | |
|             kwargs["rewrite_config"],
 | |
|         )
 | |
|     else:
 | |
|         config_path = kwargs["config_path"]
 | |
| 
 | |
|     if not os.path.exists(config_path):
 | |
|         logger.critical("Config file %s does not exist" % config_path)
 | |
|         return None
 | |
| 
 | |
|     logger.debug("Using config path %s" % config_path)
 | |
| 
 | |
|     test_paths = wptcommandline.get_test_paths(wptcommandline.config.read(config_path))
 | |
| 
 | |
|     for paths in six.itervalues(test_paths):
 | |
|         if "manifest_path" not in paths:
 | |
|             paths["manifest_path"] = os.path.join(
 | |
|                 paths["metadata_path"], "MANIFEST.json"
 | |
|             )
 | |
| 
 | |
|     ensure_manifest_directories(logger, test_paths)
 | |
| 
 | |
|     local_config = read_local_config(src_wpt_dir)
 | |
|     for section in ["manifest:upstream", "manifest:mozilla"]:
 | |
|         url_base = local_config.get(section, "url_base")
 | |
|         manifest_rel_path = os.path.join(
 | |
|             local_config.get(section, "metadata"), "MANIFEST.json"
 | |
|         )
 | |
|         test_paths[url_base]["manifest_rel_path"] = manifest_rel_path
 | |
| 
 | |
|     if not kwargs["rebuild"] and kwargs["download"] is not False:
 | |
|         force_download = False if kwargs["download"] is None else True
 | |
|         manifestdownload.download_from_taskcluster(
 | |
|             logger, src_root, test_paths, force=force_download
 | |
|         )
 | |
|     else:
 | |
|         logger.debug("Skipping manifest download")
 | |
| 
 | |
|     update = kwargs["update"] or kwargs["rebuild"]
 | |
|     manifests = load_and_update(
 | |
|         logger,
 | |
|         src_wpt_dir,
 | |
|         test_paths,
 | |
|         update=update,
 | |
|         rebuild=kwargs["rebuild"],
 | |
|         cache_root=kwargs["cache_root"],
 | |
|     )
 | |
| 
 | |
|     return manifests
 | |
| 
 | |
| 
 | |
| def ensure_manifest_directories(logger, test_paths):
 | |
|     for paths in six.itervalues(test_paths):
 | |
|         manifest_dir = os.path.dirname(paths["manifest_path"])
 | |
|         if not os.path.exists(manifest_dir):
 | |
|             logger.info("Creating directory %s" % manifest_dir)
 | |
|             # Even though we just checked the path doesn't exist, there's a chance
 | |
|             # of race condition with another process or thread having created it in
 | |
|             # between. This happens during tests.
 | |
|             try:
 | |
|                 os.makedirs(manifest_dir)
 | |
|             except OSError as e:
 | |
|                 if e.errno != errno.EEXIST:
 | |
|                     raise
 | |
|         elif not os.path.isdir(manifest_dir):
 | |
|             raise IOError("Manifest directory is a file")
 | |
| 
 | |
| 
 | |
| def read_local_config(wpt_dir):
 | |
|     src_config_path = os.path.join(wpt_dir, "wptrunner.ini")
 | |
| 
 | |
|     parser = configparser.SafeConfigParser()
 | |
|     success = parser.read(src_config_path)
 | |
|     assert src_config_path in success
 | |
|     return parser
 | |
| 
 | |
| 
 | |
| def generate_config(logger, repo_root, wpt_dir, dest_path, force_rewrite=False):
 | |
|     """Generate the local wptrunner.ini file to use locally"""
 | |
|     if not os.path.exists(dest_path):
 | |
|         # Even though we just checked the path doesn't exist, there's a chance
 | |
|         # of race condition with another process or thread having created it in
 | |
|         # between. This happens during tests.
 | |
|         try:
 | |
|             os.makedirs(dest_path)
 | |
|         except OSError as e:
 | |
|             if e.errno != errno.EEXIST:
 | |
|                 raise
 | |
| 
 | |
|     dest_config_path = os.path.join(dest_path, "wptrunner.local.ini")
 | |
| 
 | |
|     if not force_rewrite and os.path.exists(dest_config_path):
 | |
|         logger.debug("Config is up to date, not regenerating")
 | |
|         return dest_config_path
 | |
| 
 | |
|     logger.info("Creating config file %s" % dest_config_path)
 | |
| 
 | |
|     parser = read_local_config(wpt_dir)
 | |
| 
 | |
|     for section in ["manifest:upstream", "manifest:mozilla"]:
 | |
|         meta_rel_path = parser.get(section, "metadata")
 | |
|         tests_rel_path = parser.get(section, "tests")
 | |
| 
 | |
|         parser.set(
 | |
|             section, "manifest", os.path.join(dest_path, meta_rel_path, "MANIFEST.json")
 | |
|         )
 | |
|         parser.set(section, "metadata", os.path.join(wpt_dir, meta_rel_path))
 | |
|         parser.set(section, "tests", os.path.join(wpt_dir, tests_rel_path))
 | |
| 
 | |
|     parser.set(
 | |
|         "paths",
 | |
|         "prefs",
 | |
|         os.path.abspath(os.path.join(wpt_dir, parser.get("paths", "prefs"))),
 | |
|     )
 | |
| 
 | |
|     with open(dest_config_path, "wt") as config_file:
 | |
|         parser.write(config_file)
 | |
| 
 | |
|     return dest_config_path
 | |
| 
 | |
| 
 | |
| def load_and_update(
 | |
|     logger,
 | |
|     wpt_dir,
 | |
|     test_paths,
 | |
|     rebuild=False,
 | |
|     config_dir=None,
 | |
|     cache_root=None,
 | |
|     update=True,
 | |
| ):
 | |
|     rv = {}
 | |
|     wptdir_hash = hashlib.sha256(os.path.abspath(wpt_dir).encode()).hexdigest()
 | |
|     for url_base, paths in six.iteritems(test_paths):
 | |
|         manifest_path = paths["manifest_path"]
 | |
|         this_cache_root = os.path.join(
 | |
|             cache_root, wptdir_hash, os.path.dirname(paths["manifest_rel_path"])
 | |
|         )
 | |
|         m = manifest.manifest.load_and_update(
 | |
|             paths["tests_path"],
 | |
|             manifest_path,
 | |
|             url_base,
 | |
|             update=update,
 | |
|             rebuild=rebuild,
 | |
|             working_copy=True,
 | |
|             cache_root=this_cache_root,
 | |
|         )
 | |
|         path_data = {"url_base": url_base}
 | |
|         path_data.update(paths)
 | |
|         rv[m] = path_data
 | |
| 
 | |
|     return rv
 | |
| 
 | |
| 
 | |
| def log_error(logger, manifest_path, msg):
 | |
|     logger.lint_error(
 | |
|         path=manifest_path, message=msg, lineno=0, source="", linter="wpt-manifest"
 | |
|     )
 |