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 (...) --- |