aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Dolbec <dolsen@gentoo.org>2015-03-22 19:55:33 -0700
committerBrian Dolbec <dolsen@gentoo.org>2015-04-03 17:47:00 -0700
commite87284dd496e21bcf0d6540921f0fadecc704044 (patch)
tree48f8d19a04ac37adde287c24226002bdded2db64
parentWIP add the gkeys repo to the testpath (diff)
downloadportage-e87284dd496e21bcf0d6540921f0fadecc704044.tar.gz
portage-e87284dd496e21bcf0d6540921f0fadecc704044.tar.bz2
portage-e87284dd496e21bcf0d6540921f0fadecc704044.zip
Initial refactor moving gkeys to repository/config RepoConfig class
Move digestcheck to the Manifest class Create portage/package/ebuild/manifest.py: getManifest() to replace digestcheck.py Cache the digestcheck result. Cache the Manifest instances at the repo level.
-rw-r--r--pym/_emerge/EbuildBuild.py5
-rw-r--r--pym/_emerge/Scheduler.py5
-rw-r--r--pym/portage/__init__.py1
-rw-r--r--pym/portage/manifest.py164
-rw-r--r--pym/portage/package/ebuild/digestcheck.py177
-rw-r--r--pym/portage/package/ebuild/doebuild.py3
-rw-r--r--pym/portage/repository/config.py36
7 files changed, 193 insertions, 198 deletions
diff --git a/pym/_emerge/EbuildBuild.py b/pym/_emerge/EbuildBuild.py
index 0e9860210..a5eb4dacc 100644
--- a/pym/_emerge/EbuildBuild.py
+++ b/pym/_emerge/EbuildBuild.py
@@ -21,7 +21,7 @@ from portage.util import writemsg
import portage
from portage import _encodings, _unicode_decode, _unicode_encode, os
from portage.output import colorize
-from portage.package.ebuild.digestcheck import digestcheck
+from portage.package.ebuild.manifest import getManifest
from portage.package.ebuild.digestgen import digestgen
from portage.package.ebuild.doebuild import _check_temp_dir
from portage.package.ebuild._spawn_nofetch import spawn_nofetch
@@ -104,7 +104,8 @@ class EbuildBuild(CompositeTask):
quiet_setting = settings.get('PORTAGE_QUIET')
settings['PORTAGE_QUIET'] = '1'
try:
- success = digestcheck([], settings, strict=True)
+ mf = getManifest(settings)
+ success = mf.digestcheck([], settings, strict=True)
finally:
if quiet_setting:
settings['PORTAGE_QUIET'] = quiet_setting
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py
index 6b39e3b30..10997c845 100644
--- a/pym/_emerge/Scheduler.py
+++ b/pym/_emerge/Scheduler.py
@@ -30,7 +30,7 @@ from portage.util import ensure_dirs, writemsg, writemsg_level
from portage.util.SlotObject import SlotObject
from portage.util._async.SchedulerInterface import SchedulerInterface
from portage.util._eventloop.EventLoop import EventLoop
-from portage.package.ebuild.digestcheck import digestcheck
+from portage.package.ebuild.manifest import getManifest
from portage.package.ebuild.digestgen import digestgen
from portage.package.ebuild.doebuild import (_check_temp_dir,
_prepare_self_update)
@@ -714,7 +714,8 @@ class Scheduler(PollScheduler):
if ebuild_path is None:
raise AssertionError("ebuild not found for '%s'" % x.cpv)
quiet_config["O"] = os.path.dirname(ebuild_path)
- if not digestcheck([], quiet_config, strict=True):
+ mf = getManifest(quiet_config)
+ if not mf.digestcheck([], quiet_config, strict=True):
failures |= 1
if failures:
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index 1c85042c5..3bcb9adbe 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -78,7 +78,6 @@ try:
'check_config_instance,config',
'portage.package.ebuild.deprecated_profile_check:' + \
'deprecated_profile_check',
- 'portage.package.ebuild.digestcheck:digestcheck',
'portage.package.ebuild.digestgen:digestgen',
'portage.package.ebuild.fetch:fetch',
'portage.package.ebuild.getmaskingreason:getmaskingreason',
diff --git a/pym/portage/manifest.py b/pym/portage/manifest.py
index 86b9b611d..a2d975699 100644
--- a/pym/portage/manifest.py
+++ b/pym/portage/manifest.py
@@ -14,7 +14,7 @@ portage.proxy.lazyimport.lazyimport(globals(),
'portage.checksum:hashfunc_map,perform_multiple_checksums,' + \
'verify_all,_apply_hash_filter,_filter_unaccelarated_hashes',
'portage.repository.config:_find_invalid_path_char',
- 'portage.util:write_atomic', 'gkeys.gkeysinterface:GkeysInterface',
+ 'portage.util:write_atomic',
)
from portage import os
@@ -28,6 +28,9 @@ from portage.exception import DigestException, FileNotFound, \
from portage.const import (MANIFEST1_HASH_FUNCTIONS, MANIFEST2_HASH_DEFAULTS,
MANIFEST2_HASH_FUNCTIONS, MANIFEST2_IDENTIFIERS, MANIFEST2_REQUIRED_HASH)
from portage.localization import _
+from portage.checksum import _hash_filter
+from portage.output import EOutput
+from portage.util import writemsg
_manifest_re = re.compile(
r'^(' + '|'.join(MANIFEST2_IDENTIFIERS) + r') (.*)( \d+( \S+ \S+)+)$',
@@ -128,7 +131,7 @@ class Manifest(object):
def __init__(self, pkgdir, distdir=None, fetchlist_dict=None,
manifest1_compat=DeprecationWarning, from_scratch=False, thin=False,
allow_missing=False, allow_create=True, hashes=None,
- find_invalid_path_char=None, sign_manifest=True):
+ find_invalid_path_char=None, sign_manifest=True, gkeys=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
@@ -173,7 +176,8 @@ class Manifest(object):
self.allow_missing = allow_missing
self.allow_create = allow_create
self.sign_manifest = sign_manifest
- self.gkeys = None
+ self.gkeys = gkeys
+ self._digestcheck = False
def getFullname(self):
""" Returns the absolute path to the Manifest file for this instance """
@@ -335,11 +339,8 @@ class Manifest(object):
""" Sign the Manifest """
raise NotImplementedError()
- def validateSignature(self, root):
+ def validateSignature(self):
""" Validate signature on Manifest """
- #raise NotImplementedError()
- if not self.gkeys:
- self.gkeys = GkeysInterface('portage', root)
is_good, has_sig = self.gkeys.verify_file(self.getFullname())
if not has_sig and not self.sign_manifest and not self.allow_missing:
raise MissingSignature(self.getFullname())
@@ -659,3 +660,152 @@ class Manifest(object):
"""Split a category and package, returning a list of [cat, pkg].
This is compatible with portage.catsplit()"""
return pkg_key.split("/", 1)
+
+ def digestcheck(self, myfiles, mysettings, strict=False):
+ """
+ Verifies checksums. Assumes all files have been downloaded.
+ @rtype: int
+ @return: 1 on success and 0 on failure
+ """
+
+ if mysettings.get("EBUILD_SKIP_MANIFEST") == "1":
+ return 1
+
+ if self._digestcheck:
+ return 1
+
+ hash_filter = _hash_filter(mysettings.get("PORTAGE_CHECKSUM_FILTER", ""))
+ if hash_filter.transparent:
+ hash_filter = None
+ eout = EOutput()
+ eout.quiet = mysettings.get("PORTAGE_QUIET", None) == "1"
+ try:
+ #eout.ebegin(_("checking Manifest gpg signature ;-)"))
+ #mf.validateSignature(mysettings['ROOT'])
+ #eout.eend(0)
+ if not self.thin and strict and "PORTAGE_PARALLEL_FETCHONLY" not in mysettings:
+ if self.fhashdict.get("EBUILD"):
+ eout.ebegin(_("checking ebuild checksums ;-)"))
+ self.checkTypeHashes("EBUILD", hash_filter=hash_filter)
+ eout.eend(0)
+ if self.fhashdict.get("AUX"):
+ eout.ebegin(_("checking auxfile checksums ;-)"))
+ self.checkTypeHashes("AUX", hash_filter=hash_filter)
+ eout.eend(0)
+ if self.fhashdict.get("MISC"):
+ eout.ebegin(_("checking miscfile checksums ;-)"))
+ self.checkTypeHashes("MISC", ignoreMissingFiles=True,
+ hash_filter=hash_filter)
+ eout.eend(0)
+ for f in myfiles:
+ eout.ebegin(_("checking %s ;-)") % f)
+ ftype = self.findFile(f)
+ if ftype is None:
+ if self.allow_missing:
+ continue
+ eout.eend(1)
+ writemsg(_("\n!!! Missing digest for '%s'\n") % (f,),
+ noiselevel=-1)
+ return 0
+ self.checkFileHashes(ftype, f, hash_filter=hash_filter)
+ eout.eend(0)
+ except InvalidSignature as e:
+ eout.eend(1)
+ writemsg(_("\n!!! The Manifest signature verification failed: %s\n") % str(e),
+ noiselevel=-1)
+ return 0
+ except MissingSignature as e:
+ eout.eend(1)
+ writemsg(_("\n!!! The Manifest was not signed: %s\n") % str(e),
+ noiselevel=-1)
+ return 0
+ except FileNotFound as e:
+ eout.eend(1)
+ writemsg(_("\n!!! A file listed in the Manifest could not be found: %s\n") % str(e),
+ noiselevel=-1)
+ return 0
+ except DigestException as e:
+ eout.eend(1)
+ writemsg(_("\n!!! Digest verification failed:\n"), noiselevel=-1)
+ writemsg("!!! %s\n" % e.value[0], noiselevel=-1)
+ writemsg(_("!!! Reason: %s\n") % e.value[1], noiselevel=-1)
+ writemsg(_("!!! Got: %s\n") % e.value[2], noiselevel=-1)
+ writemsg(_("!!! Expected: %s\n") % e.value[3], noiselevel=-1)
+ return 0
+ if self.thin or self.allow_missing:
+ # In this case we ignore any missing digests that
+ # would otherwise be detected below.
+ self._digestcheck = True
+ return 1
+ # Make sure that all of the ebuilds are actually listed in the Manifest.
+ for f in os.listdir(self.pkgdir):
+ pf = None
+ if f[-7:] == '.ebuild':
+ pf = f[:-7]
+ if pf is not None and not self.hasFile("EBUILD", f):
+ writemsg(_("!!! A file is not listed in the Manifest: '%s'\n") % \
+ os.path.join(self.pkgdir, f), noiselevel=-1)
+ if strict:
+ return 0
+ # epatch will just grab all the patches out of a directory, so we have to
+ # make sure there aren't any foreign files that it might grab.
+ filesdir = os.path.join(self.pkgdir, "files")
+
+ for parent, dirs, files in os.walk(filesdir):
+ try:
+ parent = _unicode_decode(parent,
+ encoding=_encodings['fs'], errors='strict')
+ except UnicodeDecodeError:
+ parent = _unicode_decode(parent,
+ encoding=_encodings['fs'], errors='replace')
+ writemsg(_("!!! Path contains invalid "
+ "character(s) for encoding '%s': '%s'") \
+ % (_encodings['fs'], parent), noiselevel=-1)
+ if strict:
+ return 0
+ continue
+ for d in dirs:
+ d_bytes = d
+ try:
+ d = _unicode_decode(d,
+ encoding=_encodings['fs'], errors='strict')
+ except UnicodeDecodeError:
+ d = _unicode_decode(d,
+ encoding=_encodings['fs'], errors='replace')
+ writemsg(_("!!! Path contains invalid "
+ "character(s) for encoding '%s': '%s'") \
+ % (_encodings['fs'], os.path.join(parent, d)),
+ noiselevel=-1)
+ if strict:
+ return 0
+ dirs.remove(d_bytes)
+ continue
+ if d.startswith(".") or d == "CVS":
+ dirs.remove(d_bytes)
+ for f in files:
+ try:
+ f = _unicode_decode(f,
+ encoding=_encodings['fs'], errors='strict')
+ except UnicodeDecodeError:
+ f = _unicode_decode(f,
+ encoding=_encodings['fs'], errors='replace')
+ if f.startswith("."):
+ continue
+ f = os.path.join(parent, f)[len(filesdir) + 1:]
+ writemsg(_("!!! File name contains invalid "
+ "character(s) for encoding '%s': '%s'") \
+ % (_encodings['fs'], f), noiselevel=-1)
+ if strict:
+ return 0
+ continue
+ if f.startswith("."):
+ continue
+ f = os.path.join(parent, f)[len(filesdir) + 1:]
+ file_type = self.findFile(f)
+ if file_type != "AUX" and not f.startswith("digest-"):
+ writemsg(_("!!! A file is not listed in the Manifest: '%s'\n") % \
+ os.path.join(filesdir, f), noiselevel=-1)
+ if strict:
+ return 0
+ self._digestcheck = True
+ return 1
diff --git a/pym/portage/package/ebuild/digestcheck.py b/pym/portage/package/ebuild/digestcheck.py
deleted file mode 100644
index c97211929..000000000
--- a/pym/portage/package/ebuild/digestcheck.py
+++ /dev/null
@@ -1,177 +0,0 @@
-# Copyright 2010-2012 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-__all__ = ['digestcheck']
-
-import warnings
-
-from portage import os, _encodings, _unicode_decode
-from portage.checksum import _hash_filter
-from portage.exception import (DigestException, FileNotFound, InvalidSignature,
- MissingSignature)
-from portage.localization import _
-from portage.output import EOutput
-from portage.util import writemsg
-
-_digestcheck_cache = set()
-
-def digestcheck(myfiles, mysettings, strict=False, justmanifest=None, mf=None):
- """
- Verifies checksums. Assumes all files have been downloaded.
- @rtype: int
- @return: 1 on success and 0 on failure
- """
-
- if justmanifest is not None:
- warnings.warn("The justmanifest parameter of the " + \
- "portage.package.ebuild.digestcheck.digestcheck()" + \
- " function is now unused.",
- DeprecationWarning, stacklevel=2)
- justmanifest = None
-
- if mysettings.get("EBUILD_SKIP_MANIFEST") == "1":
- return 1
-
- pkgdir = mysettings["O"]
- if pkgdir in _digestcheck_cache:
- return 1
-
- hash_filter = _hash_filter(mysettings.get("PORTAGE_CHECKSUM_FILTER", ""))
- if hash_filter.transparent:
- hash_filter = None
- if mf is None:
- mf = mysettings.repositories.get_repo_for_location(
- os.path.dirname(os.path.dirname(pkgdir)))
- mf = mf.load_manifest(pkgdir, mysettings["DISTDIR"])
- eout = EOutput()
- eout.quiet = mysettings.get("PORTAGE_QUIET", None) == "1"
- try:
- eout.ebegin(_("checking Manifest gpg signature ;-)"))
- mf.validateSignature(mysettings['ROOT'])
- eout.eend(0)
- if not mf.thin and strict and "PORTAGE_PARALLEL_FETCHONLY" not in mysettings:
- if mf.fhashdict.get("EBUILD"):
- eout.ebegin(_("checking ebuild checksums ;-)"))
- mf.checkTypeHashes("EBUILD", hash_filter=hash_filter)
- eout.eend(0)
- if mf.fhashdict.get("AUX"):
- eout.ebegin(_("checking auxfile checksums ;-)"))
- mf.checkTypeHashes("AUX", hash_filter=hash_filter)
- eout.eend(0)
- if mf.fhashdict.get("MISC"):
- eout.ebegin(_("checking miscfile checksums ;-)"))
- mf.checkTypeHashes("MISC", ignoreMissingFiles=True,
- hash_filter=hash_filter)
- eout.eend(0)
- for f in myfiles:
- eout.ebegin(_("checking %s ;-)") % f)
- ftype = mf.findFile(f)
- if ftype is None:
- if mf.allow_missing:
- continue
- eout.eend(1)
- writemsg(_("\n!!! Missing digest for '%s'\n") % (f,),
- noiselevel=-1)
- return 0
- mf.checkFileHashes(ftype, f, hash_filter=hash_filter)
- eout.eend(0)
- except InvalidSignature as e:
- eout.eend(1)
- writemsg(_("\n!!! The Manifest signature verification failed: %s\n") % str(e),
- noiselevel=-1)
- return 0
- except MissingSignature as e:
- eout.eend(1)
- writemsg(_("\n!!! The Manifest was not signed: %s\n") % str(e),
- noiselevel=-1)
- return 0
- except FileNotFound as e:
- eout.eend(1)
- writemsg(_("\n!!! A file listed in the Manifest could not be found: %s\n") % str(e),
- noiselevel=-1)
- return 0
- except DigestException as e:
- eout.eend(1)
- writemsg(_("\n!!! Digest verification failed:\n"), noiselevel=-1)
- writemsg("!!! %s\n" % e.value[0], noiselevel=-1)
- writemsg(_("!!! Reason: %s\n") % e.value[1], noiselevel=-1)
- writemsg(_("!!! Got: %s\n") % e.value[2], noiselevel=-1)
- writemsg(_("!!! Expected: %s\n") % e.value[3], noiselevel=-1)
- return 0
- if mf.thin or mf.allow_missing:
- # In this case we ignore any missing digests that
- # would otherwise be detected below.
- _digestcheck_cache.add(pkgdir)
- return 1
- # Make sure that all of the ebuilds are actually listed in the Manifest.
- for f in os.listdir(pkgdir):
- pf = None
- if f[-7:] == '.ebuild':
- pf = f[:-7]
- if pf is not None and not mf.hasFile("EBUILD", f):
- writemsg(_("!!! A file is not listed in the Manifest: '%s'\n") % \
- os.path.join(pkgdir, f), noiselevel=-1)
- if strict:
- return 0
- # epatch will just grab all the patches out of a directory, so we have to
- # make sure there aren't any foreign files that it might grab.
- filesdir = os.path.join(pkgdir, "files")
-
- for parent, dirs, files in os.walk(filesdir):
- try:
- parent = _unicode_decode(parent,
- encoding=_encodings['fs'], errors='strict')
- except UnicodeDecodeError:
- parent = _unicode_decode(parent,
- encoding=_encodings['fs'], errors='replace')
- writemsg(_("!!! Path contains invalid "
- "character(s) for encoding '%s': '%s'") \
- % (_encodings['fs'], parent), noiselevel=-1)
- if strict:
- return 0
- continue
- for d in dirs:
- d_bytes = d
- try:
- d = _unicode_decode(d,
- encoding=_encodings['fs'], errors='strict')
- except UnicodeDecodeError:
- d = _unicode_decode(d,
- encoding=_encodings['fs'], errors='replace')
- writemsg(_("!!! Path contains invalid "
- "character(s) for encoding '%s': '%s'") \
- % (_encodings['fs'], os.path.join(parent, d)),
- noiselevel=-1)
- if strict:
- return 0
- dirs.remove(d_bytes)
- continue
- if d.startswith(".") or d == "CVS":
- dirs.remove(d_bytes)
- for f in files:
- try:
- f = _unicode_decode(f,
- encoding=_encodings['fs'], errors='strict')
- except UnicodeDecodeError:
- f = _unicode_decode(f,
- encoding=_encodings['fs'], errors='replace')
- if f.startswith("."):
- continue
- f = os.path.join(parent, f)[len(filesdir) + 1:]
- writemsg(_("!!! File name contains invalid "
- "character(s) for encoding '%s': '%s'") \
- % (_encodings['fs'], f), noiselevel=-1)
- if strict:
- return 0
- continue
- if f.startswith("."):
- continue
- f = os.path.join(parent, f)[len(filesdir) + 1:]
- file_type = mf.findFile(f)
- if file_type != "AUX" and not f.startswith("digest-"):
- writemsg(_("!!! A file is not listed in the Manifest: '%s'\n") % \
- os.path.join(filesdir, f), noiselevel=-1)
- if strict:
- return 0
- _digestcheck_cache.add(pkgdir)
- return 1
diff --git a/pym/portage/package/ebuild/doebuild.py b/pym/portage/package/ebuild/doebuild.py
index 1be83ad06..7c219d5f2 100644
--- a/pym/portage/package/ebuild/doebuild.py
+++ b/pym/portage/package/ebuild/doebuild.py
@@ -28,7 +28,6 @@ import zlib
import portage
portage.proxy.lazyimport.lazyimport(globals(),
'portage.package.ebuild.config:check_config_instance',
- 'portage.package.ebuild.digestcheck:digestcheck',
'portage.package.ebuild.digestgen:digestgen',
'portage.package.ebuild.fetch:fetch',
'portage.package.ebuild._ipc.QueryCommand:QueryCommand',
@@ -1065,7 +1064,7 @@ def doebuild(myebuild, mydo, _unused=DeprecationWarning, settings=None, debug=0,
# See above comment about fetching only when needed
if tree == 'porttree' and \
- not digestcheck(checkme, mysettings, "strict" in features, mf=mf):
+ not mf.digestcheck(checkme, mysettings, "strict" in features):
return 1
# remove PORTAGE_ACTUAL_DISTDIR once cvs/svn is supported via SRC_URI
diff --git a/pym/portage/repository/config.py b/pym/portage/repository/config.py
index a5e0cc4dd..ca21df322 100644
--- a/pym/portage/repository/config.py
+++ b/pym/portage/repository/config.py
@@ -33,6 +33,9 @@ from portage import _encodings
from portage import manifest
import portage.sync
+from gkeys.config import GKeysConfig
+from gkeys.gkeysinterface import GkeysInterface
+
if sys.hexversion >= 0x3000000:
# pylint: disable=W0622
basestring = str
@@ -82,14 +85,14 @@ class RepoConfig(object):
__slots__ = ('aliases', 'allow_missing_manifest', 'allow_provide_virtual',
'auto_sync', 'cache_formats', 'create_manifest', 'disable_manifest',
'eapi', 'eclass_db', 'eclass_locations', 'eclass_overrides',
- 'find_invalid_path_char', 'force', 'format', 'local_config', 'location',
- 'main_repo', 'manifest_hashes', 'masters', 'missing_repo_name',
- 'name', 'portage1_profiles', 'portage1_profiles_compat', 'priority',
- 'profile_formats', 'sign_commit', 'sign_manifest', 'sync_cvs_repo',
- 'sync_depth',
+ 'find_invalid_path_char', 'force', 'format', '_gkeys', '_gkeysConfig',
+ 'local_config', 'location', 'main_repo', 'manifest_hashes', 'masters',
+ 'missing_repo_name', 'name', 'portage1_profiles',
+ 'portage1_profiles_compat', 'priority', 'profile_formats',
+ 'sign_commit', 'sign_manifest', 'sync_cvs_repo', 'sync_depth',
'sync_type', 'sync_umask', 'sync_uri', 'sync_user', 'thin_manifest',
'update_changelog', 'user_location', '_eapis_banned',
- '_eapis_deprecated', '_masters_orig')
+ '_eapis_deprecated', '_masters_orig', '_manifest_cache')
def __init__(self, name, repo_opts, local_config=True):
"""Build a RepoConfig with options in repo_opts
@@ -228,6 +231,9 @@ class RepoConfig(object):
self.portage1_profiles_compat = False
self.find_invalid_path_char = _find_invalid_path_char
self._masters_orig = None
+ self._manifest_cache = {}
+ self._gkeys = None
+ self._gkeysConfig = None
# Parse layout.conf.
if self.location:
@@ -323,7 +329,17 @@ class RepoConfig(object):
return next(self.iter_pregenerated_caches(
auxdbkeys, readonly=readonly, force=force), None)
+ @property
+ def gkeys(self):
+ if not self._gkeys:
+ root = '/'
+ self._gkeysConfig = GKeysConfig(root=root, read_configfile=True)
+ self._gkeys = GkeysInterface('portage', root)
+ return self._gkeys
+
def load_manifest(self, *args, **kwds):
+ if args[0] in self._manifest_cache:
+ return self._manifest_cache[args[0]]
kwds['thin'] = self.thin_manifest
kwds['allow_missing'] = self.allow_missing_manifest
kwds['allow_create'] = self.create_manifest
@@ -332,7 +348,13 @@ class RepoConfig(object):
kwds['from_scratch'] = True
kwds['find_invalid_path_char'] = self.find_invalid_path_char
kwds['sign_manifest'] = self.sign_manifest
- return manifest.Manifest(*args, **portage._native_kwargs(kwds))
+ kwds['gkeys'] = self.gkeys
+ mf = manifest.Manifest(*args, **portage._native_kwargs(kwds))
+ mf.validateSignature()
+ self._manifest_cache[args[0]] = mf
+ return mf
+
+
def update(self, new_repo):
"""Update repository with options in another RepoConfig"""