def main(): """Entrypoint""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( '--cpu-arch', metavar='ARCH', default=platform.architecture()[0], choices=('64bit', '32bit'), help=('Filter build outputs by a target CPU. ' 'This is the same as the "arch" key in FILES.cfg. ' 'Default (from platform.architecture()): %(default)s')) args = parser.parse_args() shutil.copyfile( 'build/src/out/Default/mini_installer.exe', 'build/ungoogled-chromium_{}-{}.{}_installer.exe'.format( get_chromium_version(), _get_release_revision(), _get_packaging_revision())) # We need to remove these files, or they'll end up in the zip files that will be generated. os.remove('build/src/out/Default/mini_installer.exe') os.remove('build/src/out/Default/mini_installer_exe_version.rc') os.remove('build/src/out/Default/setup.exe') build_outputs = Path('build/src/out/Default') output = Path('build/ungoogled-chromium_{}-{}.{}_windows.zip'.format( get_chromium_version(), _get_release_revision(), _get_packaging_revision())) files_generator = filescfg.filescfg_generator( Path('build/src/chrome/tools/build/win/FILES.cfg'), build_outputs, args.cpu_arch) filescfg.create_archive(files_generator, tuple(), build_outputs, output)
def _get_last_chromium_modification(): """Returns the last modification date of the chromium-browser-official tar file""" with _get_requests_session() as session: response = session.head( 'https://storage.googleapis.com/chromium-browser-official/chromium-{}.tar.xz'.format( get_chromium_version())) response.raise_for_status() return email.utils.parsedate_to_datetime(response.headers['Last-Modified'])
def _get_last_chromium_modification(): """Returns the last modification date of the chromium-browser-official tar file""" with _get_requests_session() as session: response = session.head( 'https://storage.googleapis.com/chromium-browser-official/chromium-{}.tar.xz'.format( get_chromium_version())) response.raise_for_status() return email.utils.parsedate_to_datetime(response.headers['Last-Modified'])
def _initialize_deps_tree(): """ Initializes and returns a dependency tree for DEPS files The DEPS tree is a dict has the following format: key - pathlib.Path relative to the DEPS file's path value - tuple(repo_url, version, recursive dict here) repo_url is the URL to the dependency's repository root If the recursive dict is a string, then it is a string to the DEPS file to load if needed download_session is an active requests.Session() object """ root_deps_tree = { _SRC_PATH: ('https://chromium.googlesource.com/chromium/src.git', get_chromium_version(), 'DEPS') } return root_deps_tree
def _initialize_deps_tree(): """ Initializes and returns a dependency tree for DEPS files The DEPS tree is a dict has the following format: key - pathlib.Path relative to the DEPS file's path value - tuple(repo_url, version, recursive dict here) repo_url is the URL to the dependency's repository root If the recursive dict is a string, then it is a string to the DEPS file to load if needed download_session is an active requests.Session() object """ root_deps_tree = { _SRC_PATH: ('https://chromium.googlesource.com/chromium/src.git', get_chromium_version(), 'DEPS') } return root_deps_tree
class DownloadInfo: #pylint: disable=too-few-public-methods """Representation of an downloads.ini file for downloading files""" _hashes = ('md5', 'sha1', 'sha256', 'sha512') hash_url_delimiter = '|' _nonempty_keys = ('url', 'download_filename') _optional_keys = ( 'version', 'strip_leading_dirs', ) _passthrough_properties = (*_nonempty_keys, *_optional_keys, 'extractor', 'output_path') _ini_vars = { '_chromium_version': get_chromium_version(), } @staticmethod def _is_hash_url(value): return value.count( DownloadInfo.hash_url_delimiter) == 2 and value.split( DownloadInfo.hash_url_delimiter)[0] in iter(HashesURLEnum) _schema = schema.Schema({ schema.Optional(schema.And(str, len)): { **{x: schema.And(str, len) for x in _nonempty_keys}, 'output_path': (lambda x: str(Path(x).relative_to(''))), **{ schema.Optional(x): schema.And(str, len) for x in _optional_keys }, schema.Optional('extractor'): schema.Or(ExtractorEnum.TAR, ExtractorEnum.SEVENZIP, ExtractorEnum.WINRAR), schema.Optional(schema.Or(*_hashes)): schema.And(str, len), schema.Optional('hash_url'): lambda x: DownloadInfo._is_hash_url(x), #pylint: disable=unnecessary-lambda } }) class _DownloadsProperties: #pylint: disable=too-few-public-methods def __init__(self, section_dict, passthrough_properties, hashes): self._section_dict = section_dict self._passthrough_properties = passthrough_properties self._hashes = hashes def has_hash_url(self): """ Returns a boolean indicating whether the current download has a hash URL""" return 'hash_url' in self._section_dict def __getattr__(self, name): if name in self._passthrough_properties: return self._section_dict.get(name, fallback=None) if name == 'hashes': hashes_dict = dict() for hash_name in (*self._hashes, 'hash_url'): value = self._section_dict.get(hash_name, fallback=None) if value: if hash_name == 'hash_url': value = value.split( DownloadInfo.hash_url_delimiter) hashes_dict[hash_name] = value return hashes_dict raise AttributeError('"{}" has no attribute "{}"'.format( type(self).__name__, name)) def _parse_data(self, path): """ Parses an INI file located at path Raises schema.SchemaError if validation fails """ def _section_generator(data): for section in data: if section == configparser.DEFAULTSECT: continue yield section, dict( filter(lambda x: x[0] not in self._ini_vars, data.items(section))) new_data = configparser.ConfigParser(defaults=self._ini_vars) with path.open(encoding=ENCODING) as ini_file: new_data.read_file(ini_file, source=str(path)) try: self._schema.validate(dict(_section_generator(new_data))) except schema.SchemaError as exc: get_logger().error( 'downloads.ini failed schema validation (located in %s)', path) raise exc return new_data def __init__(self, ini_paths): """Reads an iterable of pathlib.Path to download.ini files""" self._data = configparser.ConfigParser() for path in ini_paths: self._data.read_dict(self._parse_data(path)) def __getitem__(self, section): """ Returns an object with keys as attributes and values already pre-processed strings """ return self._DownloadsProperties(self._data[section], self._passthrough_properties, self._hashes) def __contains__(self, item): """ Returns True if item is a name of a section; False otherwise. """ return self._data.has_section(item) def __iter__(self): """Returns an iterator over the section names""" return iter(self._data.sections()) def properties_iter(self): """Iterator for the download properties sorted by output path""" return sorted(map(lambda x: (x, self[x]), self), key=(lambda x: str(Path(x[1].output_path))))