Cache package.mask files within MaskManager.
authorMichał Górny <mgorny@gentoo.org>
Fri, 29 Oct 2010 19:32:48 +0000 (21:32 +0200)
committerZac Medico <zmedico@gentoo.org>
Fri, 19 Nov 2010 12:51:07 +0000 (04:51 -0800)
As a single repository may be often referenced by others as a 'master',
it is really useful to keep a cache of already-read package.mask files.
Especially if that repo has a large package.mask file like gx86 does.

pym/portage/package/ebuild/_config/MaskManager.py

index ef72aeb8fdafd73b7117e8176671d415df969a23..25d679e9f4bb0bd5fa0fb6e1e0bf0a8184b975f4 100644 (file)
@@ -24,14 +24,23 @@ class MaskManager(object):
                #Add ::repo specs to every atom to make sure atoms only affect
                #packages from the current repo.
 
+               # Cache the repository-wide package.mask files as a particular
+               # repo may be often referenced by others as the master.
+               pmask_cache = {}
+
+               def grab_pmask(loc):
+                       if loc not in pmask_cache:
+                               pmask_cache[loc] = grabfile_package(
+                                               os.path.join(loc, "profiles", "package.mask"),
+                                               recursive=1, remember_source_file=True, verify_eapi=True)
+                       return pmask_cache[loc]
+
                repo_pkgmasklines = []
                for repo in repositories.repos_with_profiles():
                        lines = []
-                       repo_lines = grabfile_package(os.path.join(repo.location, "profiles", "package.mask"), \
-                               recursive=1, remember_source_file=True, verify_eapi=True)
+                       repo_lines = grab_pmask(repo.location)
                        for master in repo.masters:
-                               master_lines = grabfile_package(os.path.join(master.location, "profiles", "package.mask"), \
-                                       recursive=1, remember_source_file=True, verify_eapi=True)
+                               master_lines = grab_pmask(master.location)
                                lines.append(stack_lists([master_lines, repo_lines], incremental=1,
                                        remember_source_file=True, warn_for_unmatched_removal=True,
                                        strict_warn_for_unmatched_removal=strict_umatched_removal))