1 |
commit: 52ec462b8d529682d688c38fcd724d1894188e65 |
2 |
Author: Virgil Dupras <vdupras <AT> gentoo <DOT> org> |
3 |
AuthorDate: Mon Sep 17 23:31:27 2018 +0000 |
4 |
Commit: Virgil Dupras <vdupras <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Sep 17 23:31:27 2018 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/gentoolkit.git/commit/?id=52ec462b |
7 |
|
8 |
Greatly speed up "equery depends" |
9 |
|
10 |
Avoid `Atom` instanciation in obvious non-matches (`.cp` not matching) |
11 |
when search for revdeps. On my machine, it made `equery d -a |
12 |
dev-python/pillow` go from `1m3s` to `0m19s`. |
13 |
|
14 |
pym/gentoolkit/dependencies.py | 43 +++++++++++++++++++++--------------------- |
15 |
1 file changed, 21 insertions(+), 22 deletions(-) |
16 |
|
17 |
diff --git a/pym/gentoolkit/dependencies.py b/pym/gentoolkit/dependencies.py |
18 |
index 117342a..bb9ab0b 100644 |
19 |
--- a/pym/gentoolkit/dependencies.py |
20 |
+++ b/pym/gentoolkit/dependencies.py |
21 |
@@ -77,38 +77,31 @@ class Dependencies(Query): |
22 |
return [] |
23 |
return result |
24 |
|
25 |
- def get_depend(self): |
26 |
- """Get the contents of DEPEND and parse it with self.parser.""" |
27 |
- |
28 |
+ def _get_depend(self, env_vars, raw=False): |
29 |
+ raw_depend = ' '.join(self.environment(env_vars)) |
30 |
+ if raw: |
31 |
+ return raw_depend |
32 |
try: |
33 |
- return self.parser(self.environment(('DEPEND',))[0]) |
34 |
+ return self.parser(raw_depend) |
35 |
except portage.exception.InvalidPackageName as err: |
36 |
raise errors.GentoolkitInvalidCPV(err) |
37 |
|
38 |
- def get_pdepend(self): |
39 |
- """Get the contents of PDEPEND and parse it with self.parser.""" |
40 |
+ def get_depend(self, **kwargs): |
41 |
+ """Get the contents of DEPEND and parse it with self.parser.""" |
42 |
+ return self._get_depend(('DEPEND', ), **kwargs) |
43 |
|
44 |
- try: |
45 |
- return self.parser(self.environment(('PDEPEND',))[0]) |
46 |
- except portage.exception.InvalidPackageName as err: |
47 |
- raise errors.GentoolkitInvalidCPV(err) |
48 |
+ def get_pdepend(self, **kwargs): |
49 |
+ """Get the contents of PDEPEND and parse it with self.parser.""" |
50 |
+ return self._get_depend(('PDEPEND', ), **kwargs) |
51 |
|
52 |
- def get_rdepend(self): |
53 |
+ def get_rdepend(self, **kwargs): |
54 |
"""Get the contents of RDEPEND and parse it with self.parser.""" |
55 |
+ return self._get_depend(('RDEPEND', ), **kwargs) |
56 |
|
57 |
- try: |
58 |
- return self.parser(self.environment(('RDEPEND',))[0]) |
59 |
- except portage.exception.InvalidPackageName as err: |
60 |
- raise errors.GentoolkitInvalidCPV(err) |
61 |
- |
62 |
- def get_all_depends(self): |
63 |
+ def get_all_depends(self, **kwargs): |
64 |
"""Get the contents of ?DEPEND and parse it with self.parser.""" |
65 |
- |
66 |
env_vars = ('DEPEND', 'PDEPEND', 'RDEPEND') |
67 |
- try: |
68 |
- return self.parser(' '.join(self.environment(env_vars))) |
69 |
- except portage.exception.InvalidPackageName as err: |
70 |
- raise errors.GentoolkitInvalidCPV(err) |
71 |
+ return self._get_depend(env_vars, **kwargs) |
72 |
|
73 |
def graph_depends( |
74 |
self, |
75 |
@@ -237,6 +230,12 @@ class Dependencies(Query): |
76 |
|
77 |
pkgdep = None |
78 |
for pkgdep in pkgset: |
79 |
+ raw_depends = pkgdep.get_all_depends(raw=True) |
80 |
+ if self.cp not in raw_depends: |
81 |
+ # fast path for obviously non-matching packages. This saves |
82 |
+ # us the work of instantiating a whole Atom() for *every* |
83 |
+ # dependency of *every* package in pkgset. |
84 |
+ continue |
85 |
try: |
86 |
all_depends = depcache[pkgdep] |
87 |
except KeyError: |