Gentoo Archives: gentoo-commits

From: Virgil Dupras <vdupras@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoolkit:master commit in: pym/gentoolkit/
Date: Mon, 17 Sep 2018 23:32:18
Message-Id: 1537227087.52ec462b8d529682d688c38fcd724d1894188e65.vdupras@gentoo
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: