aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-10-02 17:05:30 -0700
committerZac Medico <zmedico@gentoo.org>2011-10-02 17:05:30 -0700
commitc8cd3a985cc529299411d7343a11004b7d1330ef (patch)
tree38d33f7e5b68d18ee6d8d8465d8c78bbf6334399 /pym/portage
parentManifest.create(): tweak assume-digests code (diff)
downloadportage-c8cd3a985cc529299411d7343a11004b7d1330ef.tar.gz
portage-c8cd3a985cc529299411d7343a11004b7d1330ef.tar.bz2
portage-c8cd3a985cc529299411d7343a11004b7d1330ef.zip
Implement GLEP 59 with control via layout.conf.
The portage.const changes are derived from an earlier patch that was submitted by Robin H. Johnson <robbat2@gentoo.org>: http://archives.gentoo.org/gentoo-portage-dev/msg_911574e7cb615f67e4c21fc75c043f65.xml This patch has no affect on a repository unless it contains a metadata/layout.conf file which contains boolean flags that enable or disable manifest hash types. The plan is to deploy portage with this patch, and once it has been stabilized, add the following metadata/layout.conf settings to gentoo-x86: manifest-rmd160 = false manifest-sha1 = false manifest-whirlpool = true The above settings will become the default settings in a future portage release, making them redundant and eligible for removal from layout.conf (in order to avoid cluttering layout.conf with obsolete information). 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.
Diffstat (limited to 'pym/portage')
-rw-r--r--pym/portage/const.py28
-rw-r--r--pym/portage/manifest.py16
-rw-r--r--pym/portage/repository/config.py22
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