diff options
-rw-r--r-- | pym/portage/const.py | 28 | ||||
-rw-r--r-- | pym/portage/manifest.py | 16 | ||||
-rw-r--r-- | pym/portage/repository/config.py | 22 |
3 files changed, 59 insertions, 7 deletions
diff --git a/pym/portage/const.py b/pym/portage/const.py index 8b5f4acab..e7eac62fb 100644 --- a/pym/portage/const.py +++ b/pym/portage/const.py @@ -109,10 +109,32 @@ EAPI = 4 HASHING_BLOCKSIZE = 32768 MANIFEST1_HASH_FUNCTIONS = ("MD5", "SHA256", "RMD160") -MANIFEST2_HASH_FUNCTIONS = ("SHA1", "SHA256", "RMD160") - MANIFEST1_REQUIRED_HASH = "MD5" -MANIFEST2_REQUIRED_HASH = "SHA1" + +# Future events: +# +# After WHIRLPOOL is supported in stable portage: +# - Add WHIRLPOOL to MANIFEST2_HASH_DEFAULTS. +# - Remove SHA1 and RMD160 from MANIFEST2_HASH_*. +# - Toggle gentoo-x86/metadata/layout.conf settings to match. +# +# After WHIRLPOOL is supported in stable portage for at least 1 year: +# - Change MANIFEST2_REQUIRED_HASH to WHIRLPOOL. +# - Remove SHA256 from MANIFEST2_HASH_*. +# - Toggle gentoo-x86/metadata/layout.conf settings to match. +# +# After SHA-3 is approved: +# - Add new hashes to MANIFEST2_HASH_*. +# +# After SHA-3 is supported in stable portage: +# - Toggle gentoo-x86/metadata/layout.conf settings to match. +# +# After layout.conf settings correspond to defaults in stable portage: +# - Remove redundant settings from gentoo-x86/metadata/layout.conf. + +MANIFEST2_HASH_FUNCTIONS = ("RMD160", "SHA1", "SHA256", "SHA512", "WHIRLPOOL") +MANIFEST2_HASH_DEFAULTS = frozenset(["SHA1", "SHA256", "RMD160"]) +MANIFEST2_REQUIRED_HASH = "SHA256" MANIFEST2_IDENTIFIERS = ("AUX", "MISC", "DIST", "EBUILD") # =========================================================================== diff --git a/pym/portage/manifest.py b/pym/portage/manifest.py index d09de2606..eaea0bdf6 100644 --- a/pym/portage/manifest.py +++ b/pym/portage/manifest.py @@ -18,6 +18,8 @@ from portage import _unicode_encode from portage.exception import DigestException, FileNotFound, \ InvalidDataType, MissingParameter, PermissionDenied, \ PortageException, PortagePackageException +from portage.const import (MANIFEST2_HASH_DEFAULTS, + MANIFEST2_HASH_FUNCTIONS, MANIFEST2_REQUIRED_HASH) from portage.localization import _ class FileNotInManifestException(PortageException): @@ -101,7 +103,7 @@ class Manifest(object): parsers = (parseManifest2,) def __init__(self, pkgdir, distdir, fetchlist_dict=None, manifest1_compat=DeprecationWarning, from_scratch=False, thin=False, - allow_missing=False, allow_create=True): + allow_missing=False, allow_create=True, hash_flags=None): """ Create new Manifest instance for package in pkgdir. Do not parse Manifest file if from_scratch == True (only for internal use) The fetchlist_dict parameter is required only for generation of @@ -117,7 +119,15 @@ class Manifest(object): self.pkgdir = _unicode_decode(pkgdir).rstrip(os.sep) + os.sep self.fhashdict = {} self.hashes = set() - self.hashes.update(portage.const.MANIFEST2_HASH_FUNCTIONS) + + if hash_flags is None: + hash_flags = {} + self.hash_flags = hash_flags + for hash_type in MANIFEST2_HASH_FUNCTIONS: + default_state = hash_type in MANIFEST2_HASH_DEFAULTS + if hash_flags.get(hash_type, default_state): + self.hashes.add(hash_type) + self.hashes.difference_update(hashname for hashname in \ list(self.hashes) if hashname not in hashfunc_map) self.hashes.add("size") @@ -350,7 +360,7 @@ class Manifest(object): self.__init__(self.pkgdir, self.distdir, fetchlist_dict=self.fetchlist_dict, from_scratch=True, thin=self.thin, allow_missing=self.allow_missing, - allow_create=self.allow_create) + allow_create=self.allow_create, hash_flags=self.hash_flags) pn = os.path.basename(self.pkgdir.rstrip(os.path.sep)) cat = self._pkgdir_category() diff --git a/pym/portage/repository/config.py b/pym/portage/repository/config.py index 846de3908..c201fe751 100644 --- a/pym/portage/repository/config.py +++ b/pym/portage/repository/config.py @@ -44,7 +44,7 @@ class RepoConfig(object): __slots__ = ['aliases', 'eclass_overrides', 'eclass_locations', 'location', 'user_location', 'masters', 'main_repo', 'missing_repo_name', 'name', 'priority', 'sync', 'format', 'sign_manifest', 'thin_manifest', 'allow_missing_manifest', 'create_manifest', 'disable_manifest', 'cache_is_authoritative', - 'trust_authoritative_cache'] + 'trust_authoritative_cache', 'manifest_hash_flags'] def __init__(self, name, repo_opts): """Build a RepoConfig with options in repo_opts @@ -118,6 +118,8 @@ class RepoConfig(object): self.allow_missing_manifest = False self.create_manifest = True self.disable_manifest = False + self.manifest_hash_flags = {} + self.cache_is_authoritative = False trust_authoritative_cache = repo_opts.get('trust-authoritative-cache') @@ -129,6 +131,7 @@ class RepoConfig(object): kwds['thin'] = self.thin_manifest kwds['allow_missing'] = self.allow_missing_manifest kwds['allow_create'] = self.create_manifest + kwds['hash_flags'] = self.manifest_hash_flags if self.disable_manifest: kwds['from_scratch'] = True return manifest.Manifest(*args, **kwds) @@ -378,6 +381,23 @@ class RepoConfigLoader(object): repo.allow_missing_manifest = manifest_policy != 'strict' repo.create_manifest = manifest_policy != 'false' repo.disable_manifest = manifest_policy == 'false' + + if 'manifest-rmd160' in layout_data: + repo.manifest_hash_flags["RMD160"] = \ + layout_data['manifest-rmd160'].lower() == 'true' + + if 'manifest-sha1' in layout_data: + repo.manifest_hash_flags["SHA1"] = \ + layout_data['manifest-sha1'].lower() == 'true' + + if 'manifest-sha256' in layout_data: + repo.manifest_hash_flags["SHA256"] = \ + layout_data['manifest-sha256'].lower() == 'true' + + if 'manifest-whirlpool' in layout_data: + repo.manifest_hash_flags["WHIRLPOOL"] = \ + layout_data['manifest-whirlpool'].lower() == 'true' + repo.cache_is_authoritative = layout_data.get('authoritative-cache', 'false').lower() == 'true' if not repo.trust_authoritative_cache: repo.cache_is_authoritative = False |