Gentoo Archives: gentoo-commits

From: "André Erdmann" <dywi@×××××××.de>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/depres/simpledeprule/, roverlay/depres/
Date: Mon, 30 Jul 2012 08:54:53
Message-Id: 1342800489.464b87572270d1ba7a792e6bb3abaa3e93bcf2c8.dywi@gentoo
1 commit: 464b87572270d1ba7a792e6bb3abaa3e93bcf2c8
2 Author: André Erdmann <dywi <AT> mailerd <DOT> de>
3 AuthorDate: Fri Jul 20 16:08:09 2012 +0000
4 Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
5 CommitDate: Fri Jul 20 16:08:09 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=464b8757
7
8 add DynamicSelfdepPool to dependency resolution
9
10 geändert: roverlay/depres/depresolver.py
11 geändert: roverlay/depres/deprule.py
12 geändert: roverlay/depres/simpledeprule/abstractrules.py
13 neue Datei: roverlay/depres/simpledeprule/dynpool.py
14
15 ---
16 roverlay/depres/depresolver.py | 56 +++++++++++++++++++++---
17 roverlay/depres/deprule.py | 5 ++
18 roverlay/depres/simpledeprule/abstractrules.py | 5 +-
19 roverlay/depres/simpledeprule/dynpool.py | 40 +++++++++++++++++
20 4 files changed, 97 insertions(+), 9 deletions(-)
21
22 diff --git a/roverlay/depres/depresolver.py b/roverlay/depres/depresolver.py
23 index 06ba6fc..a399454 100644
24 --- a/roverlay/depres/depresolver.py
25 +++ b/roverlay/depres/depresolver.py
26 @@ -15,6 +15,7 @@ except ImportError:
27 from roverlay import config
28 from roverlay.depres import communication, deptype, events
29 import roverlay.depres.simpledeprule.reader
30 +import roverlay.depres.simpledeprule.dynpool
31
32
33 # if false: do not use the "negative" result caching which stores
34 @@ -78,7 +79,9 @@ class DependencyResolver ( object ):
35 self._depqueue_done = dict ()
36
37 # list of rule pools that have been created from reading files
38 - self.static_rule_pools = list ()
39 + self.static_rule_pools = list()
40 + # list of rule pools that are recreatable (at runtime)
41 + self.dynamic_rule_pools = list()
42
43 if SAFE_CHANNEL_IDS:
44 # this lock is used in register_channel
45 @@ -91,7 +94,8 @@ class DependencyResolver ( object ):
46 """Sorts the rule pools of this resolver."""
47 for pool in self.static_rule_pools: pool.sort()
48 poolsort = lambda pool : ( pool.priority, pool.rule_weight )
49 - self.static_rule_pools.sort ( key=poolsort )
50 + self.static_rule_pools.sort ( key=poolsort )
51 + self.dynamic_rule_pools.sort ( key=poolsort )
52 # --- end of sort (...) ---
53
54 def _reset_unresolvable ( self ):
55 @@ -112,18 +116,46 @@ class DependencyResolver ( object ):
56 )
57 # --- end of get_reader (...) ---
58
59 + def make_selfdep_pool ( self, rule_kw_function, reload_now=False ):
60 + """Creates an dynamic selfdep pool and adds it to this resolver.
61 +
62 + arguments:
63 + * rule_kw_function -- function that returns an rule creation keyword
64 + generator (basically, it has to return a list
65 + of dicts)
66 + """
67 + pool = roverlay.depres.simpledeprule.dynpool.get ( rule_kw_function )
68 + self.dynamic_rule_pools.append ( pool )
69 + if reload_now:
70 + pool.reload()
71 + self._new_rulepools_added()
72 + # --- end of make_selfdep_pool (...) ---
73 +
74 def add_rulepool ( self, rulepool, pool_type=None ):
75 """Adds a (static) rule pool to this resolver.
76 Calls self.sort() afterwards.
77
78 arguments:
79 - * rulepool --
80 + * rulepool -- rule pool type, 1 for dynamic, else static
81 * pool_type -- ignored.
82 """
83 - self.static_rule_pools.append ( rulepool )
84 + if pool_type == 1:
85 + self.dynamic_rule_pools.append ( rulepool )
86 + else:
87 + self.static_rule_pools.append ( rulepool )
88 self._new_rulepools_added()
89 # --- end of add_rulepool (...) ---
90
91 + def reload_pools ( self ):
92 + one = False
93 + for pool in self.dynamic_rule_pools:
94 + one = True
95 + pool.reload()
96 +
97 + if one:
98 + self._new_rulepools_added()
99 + # --- end of reload_pools (...) ---
100 +
101 def _report_event ( self, event, dep_env=None, pkg_env=None, msg=None ):
102 """Reports an event to the log and listeners.
103
104 @@ -335,10 +367,22 @@ class DependencyResolver ( object ):
105 is_resolved = 1
106
107 else:
108 + for rulepool in (
109 + p for p in self.dynamic_rule_pools \
110 + if p.accepts ( dep_env.deptype_mask, try_other=False )
111 + ):
112 + result = rulepool.matches ( dep_env )
113 + if result [0] > 0:
114 + resolved = result [1]
115 + is_resolved = 2
116 + break
117 + # TRY_OTHER searching is disabled for dynamic rule pools,
118 + # (a) no dyn pool uses it, (b) probably not useful
119 +
120 # search for a match in the rule pools that accept the dep type
121 for rulepool in (
122 p for p in self.static_rule_pools \
123 - if p.deptype_mask & dep_env.deptype_mask
124 + if p.accepts ( dep_env.deptype_mask, try_other=False )
125 ):
126 result = rulepool.matches ( dep_env )
127 if result [0] > 0:
128 @@ -352,7 +396,7 @@ class DependencyResolver ( object ):
129 # that (normally) don't accept the dep type
130 for rulepool in (
131 p for p in self.static_rule_pools \
132 - if p.deptype_mask & ~dep_env.deptype_mask
133 + if p.accepts ( ~dep_env.deptype_mask, try_other=True )
134 ):
135 result = rulepool.matches ( dep_env )
136 if result [0] > 0:
137
138 diff --git a/roverlay/depres/deprule.py b/roverlay/depres/deprule.py
139 index 50b921a..8c63987 100644
140 --- a/roverlay/depres/deprule.py
141 +++ b/roverlay/depres/deprule.py
142 @@ -70,6 +70,11 @@ class DependencyRulePool ( object ):
143 return None
144 # --- end of sort (...) ---
145
146 + def accepts ( self, deptype_mask, try_other=False ):
147 + """Returns True if this pool accepts the given deptype_mask."""
148 + return bool ( self.deptype_mask & deptype_mask )
149 + # --- end of accepts (...) ---
150 +
151 def add ( self, rule ):
152 """Adds a DependencyRule to this rule pool.
153
154
155 diff --git a/roverlay/depres/simpledeprule/abstractrules.py b/roverlay/depres/simpledeprule/abstractrules.py
156 index 1f0ba28..e4aa7b2 100644
157 --- a/roverlay/depres/simpledeprule/abstractrules.py
158 +++ b/roverlay/depres/simpledeprule/abstractrules.py
159 @@ -151,9 +151,8 @@ class FuzzySimpleRule ( SimpleRule ):
160
161 elif 'version' in fuzzy:
162
163 - ver_pkg = '-'.join ( (
164 - self.resolving_package, fuzzy ['version']
165 - ) )
166 + ver_pkg = \
167 + self.resolving_package + '-' + fuzzy ['version']
168
169 vmod = fuzzy ['version_modifier'] \
170 if 'version_modifier' in fuzzy \
171
172 diff --git a/roverlay/depres/simpledeprule/dynpool.py b/roverlay/depres/simpledeprule/dynpool.py
173 new file mode 100644
174 index 0000000..eea146d
175 --- /dev/null
176 +++ b/roverlay/depres/simpledeprule/dynpool.py
177 @@ -0,0 +1,40 @@
178 +from roverlay.depres import deptype
179 +from roverlay.depres.simpledeprule.pool import SimpleDependencyRulePool
180 +from roverlay.depres.simpledeprule.rules import SimpleFuzzyDependencyRule
181 +
182 +class DynamicSelfdepRulePool ( SimpleDependencyRulePool ):
183 + """A rule pool that gets its rules from a function."""
184 +
185 + def __init__ ( self, rule_kw_function, rule_class, priority=120, **kwargs ):
186 + super ( DynamicSelfdepRulePool, self ). __init__ (
187 + name='dynamic selfdeps', priority=priority,
188 + deptype_mask=deptype.internal,
189 + **kwargs
190 + )
191 +
192 + self._rule_class = rule_class
193 + self._rule_kw_function = rule_kw_function
194 + # --- end of __init__ (...) ---
195 +
196 + def accepts ( self, deptype_mask, try_other=False ):
197 + if try_other:
198 + # never resolve external deps as selfdeps
199 + return False
200 + else:
201 + return self.deptype_mask & deptype_mask
202 + # --- end of accepts (...) ---
203 +
204 + def reload ( self ):
205 + self.rules = list (
206 + self._rule_class ( is_selfdep=True, **kwargs ) \
207 + for kwargs in self._rule_kw_function()
208 + )
209 + # --- end of reload (...) ---
210 +
211 +
212 +def get ( rule_kw_function ):
213 + """Returns a default DynamicSelfdepRulePool for rule_kw_function."""
214 + return DynamicSelfdepRulePool (
215 + rule_kw_function, SimpleFuzzyDependencyRule
216 + )
217 +# --- end of get (...) ---