aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVirgil Dupras <vdupras@gentoo.org>2018-09-17 19:31:27 -0400
committerVirgil Dupras <vdupras@gentoo.org>2018-09-17 19:31:27 -0400
commit52ec462b8d529682d688c38fcd724d1894188e65 (patch)
treea6586209baf891c622716f665aa12b33c34c5b13
parentAtom.intersects: add repo comparison (diff)
downloadgentoolkit-52ec462b8d529682d688c38fcd724d1894188e65.tar.gz
gentoolkit-52ec462b8d529682d688c38fcd724d1894188e65.tar.bz2
gentoolkit-52ec462b8d529682d688c38fcd724d1894188e65.zip
Greatly speed up "equery depends"
Avoid `Atom` instanciation in obvious non-matches (`.cp` not matching) when search for revdeps. On my machine, it made `equery d -a dev-python/pillow` go from `1m3s` to `0m19s`.
-rw-r--r--pym/gentoolkit/dependencies.py43
1 files changed, 21 insertions, 22 deletions
diff --git a/pym/gentoolkit/dependencies.py b/pym/gentoolkit/dependencies.py
index 117342a..bb9ab0b 100644
--- a/pym/gentoolkit/dependencies.py
+++ b/pym/gentoolkit/dependencies.py
@@ -77,38 +77,31 @@ class Dependencies(Query):
return []
return result
- def get_depend(self):
- """Get the contents of DEPEND and parse it with self.parser."""
-
+ def _get_depend(self, env_vars, raw=False):
+ raw_depend = ' '.join(self.environment(env_vars))
+ if raw:
+ return raw_depend
try:
- return self.parser(self.environment(('DEPEND',))[0])
+ return self.parser(raw_depend)
except portage.exception.InvalidPackageName as err:
raise errors.GentoolkitInvalidCPV(err)
- def get_pdepend(self):
- """Get the contents of PDEPEND and parse it with self.parser."""
+ def get_depend(self, **kwargs):
+ """Get the contents of DEPEND and parse it with self.parser."""
+ return self._get_depend(('DEPEND', ), **kwargs)
- try:
- return self.parser(self.environment(('PDEPEND',))[0])
- except portage.exception.InvalidPackageName as err:
- raise errors.GentoolkitInvalidCPV(err)
+ def get_pdepend(self, **kwargs):
+ """Get the contents of PDEPEND and parse it with self.parser."""
+ return self._get_depend(('PDEPEND', ), **kwargs)
- def get_rdepend(self):
+ def get_rdepend(self, **kwargs):
"""Get the contents of RDEPEND and parse it with self.parser."""
+ return self._get_depend(('RDEPEND', ), **kwargs)
- try:
- return self.parser(self.environment(('RDEPEND',))[0])
- except portage.exception.InvalidPackageName as err:
- raise errors.GentoolkitInvalidCPV(err)
-
- def get_all_depends(self):
+ def get_all_depends(self, **kwargs):
"""Get the contents of ?DEPEND and parse it with self.parser."""
-
env_vars = ('DEPEND', 'PDEPEND', 'RDEPEND')
- try:
- return self.parser(' '.join(self.environment(env_vars)))
- except portage.exception.InvalidPackageName as err:
- raise errors.GentoolkitInvalidCPV(err)
+ return self._get_depend(env_vars, **kwargs)
def graph_depends(
self,
@@ -237,6 +230,12 @@ class Dependencies(Query):
pkgdep = None
for pkgdep in pkgset:
+ raw_depends = pkgdep.get_all_depends(raw=True)
+ if self.cp not in raw_depends:
+ # fast path for obviously non-matching packages. This saves
+ # us the work of instantiating a whole Atom() for *every*
+ # dependency of *every* package in pkgset.
+ continue
try:
all_depends = depcache[pkgdep]
except KeyError: