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")
# ===========================================================================
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):
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
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")
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()
__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
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')
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)
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