1 |
commit: bc06adb9f7fc906c5ee11ad9dfa636255a37266d |
2 |
Author: André Erdmann <dywi <AT> mailerd <DOT> de> |
3 |
AuthorDate: Mon Sep 2 13:15:51 2013 +0000 |
4 |
Commit: André Erdmann <dywi <AT> mailerd <DOT> de> |
5 |
CommitDate: Mon Sep 2 13:15:51 2013 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=bc06adb9 |
7 |
|
8 |
depres, dep env: provide a ref to the package info |
9 |
|
10 |
DepEnv objects can now (optionally) contain a reference to "their" PackageInfo |
11 |
object. This allows the dynamic selfdep pool to decide which rules to try (and |
12 |
in which order) based on the package being processed. |
13 |
(I've chosen a (weak) reference because DepEnv objects should not keep |
14 |
PackageInfos in memory.) |
15 |
|
16 |
The actual PackageInfo can then be accessed via <DepEnv>.get_package_info(). |
17 |
|
18 |
--- |
19 |
roverlay/depres/channels.py | 4 +++- |
20 |
roverlay/depres/depenv.py | 25 ++++++++++++++++++++++--- |
21 |
roverlay/ebuild/creation.py | 10 +++++++++- |
22 |
3 files changed, 34 insertions(+), 5 deletions(-) |
23 |
|
24 |
diff --git a/roverlay/depres/channels.py b/roverlay/depres/channels.py |
25 |
index ed51df4..30eed5b 100644 |
26 |
--- a/roverlay/depres/channels.py |
27 |
+++ b/roverlay/depres/channels.py |
28 |
@@ -32,7 +32,7 @@ class _EbuildJobChannelBase ( DependencyResolverChannel ): |
29 |
add deps, then satisfy_request(): collect/lookup |
30 |
""" |
31 |
|
32 |
- def __init__ ( self, err_queue, name=None, logger=None ): |
33 |
+ def __init__ ( self, err_queue, name=None, logger=None, package_ref=None ): |
34 |
"""EbuildJobChannel |
35 |
|
36 |
arguments: |
37 |
@@ -41,6 +41,8 @@ class _EbuildJobChannelBase ( DependencyResolverChannel ): |
38 |
""" |
39 |
super ( _EbuildJobChannelBase, self ) . __init__ ( main_resolver=None ) |
40 |
|
41 |
+ self.package_ref = package_ref |
42 |
+ |
43 |
# this is the number of resolved deps so far, |
44 |
# should only be modified in the join()-method |
45 |
self._depdone = 0 |
46 |
|
47 |
diff --git a/roverlay/depres/depenv.py b/roverlay/depres/depenv.py |
48 |
index c8fea7e..2e6417e 100644 |
49 |
--- a/roverlay/depres/depenv.py |
50 |
+++ b/roverlay/depres/depenv.py |
51 |
@@ -132,13 +132,14 @@ class DepEnv ( object ): |
52 |
STATUS_UNRESOLVABLE = 4 |
53 |
|
54 |
@classmethod |
55 |
- def from_str ( cls, dep_str, deptype_mask ): |
56 |
+ def from_str ( cls, dep_str, deptype_mask, package_ref=None ): |
57 |
"""Generator that (pre-)parses a dependency string and creates |
58 |
DepEnv objects for it. |
59 |
|
60 |
arguments: |
61 |
* dep_str -- |
62 |
* deptype_mask -- |
63 |
+ * package_ref -- |
64 |
""" |
65 |
# split dep_str into logically ANDed dependency strings, |
66 |
# unquote them, remove "from <uri>.." entries and replace all |
67 |
@@ -153,22 +154,32 @@ class DepEnv ( object ): |
68 |
).strip() |
69 |
), |
70 |
deptype_mask = deptype_mask, |
71 |
+ package_ref = package_ref, |
72 |
) |
73 |
# --- end of from_str (...) --- |
74 |
|
75 |
- def __init__ ( self, dep_str, deptype_mask ): |
76 |
+ def __init__ ( self, dep_str, deptype_mask, package_ref=None ): |
77 |
"""Initializes a dependency environment that represents the dependency |
78 |
resolution of one entry in the description data of an R package. |
79 |
Precalculating most (if not all) data since this object will be passed |
80 |
through many dep rules. |
81 |
|
82 |
arguments: |
83 |
- * dep_str -- dependency string at it appears in the description data. |
84 |
+ * dep_str -- dependency string at it appears in the description data. |
85 |
+ * deptype_mask -- |
86 |
+ * package_ref -- |
87 |
""" |
88 |
self.deptype_mask = deptype_mask |
89 |
self.status = DepEnv.STATUS_UNDONE |
90 |
self.resolved_by = None |
91 |
|
92 |
+ self.package_ref = package_ref |
93 |
+ if package_ref is not None: |
94 |
+ self.get_package_info = self._deref_package_info |
95 |
+ else: |
96 |
+ self.get_package_info = self._deref_none |
97 |
+ |
98 |
+ |
99 |
self.dep_str = dep_str |
100 |
self.dep_str_low = dep_str.lower() |
101 |
|
102 |
@@ -180,6 +191,14 @@ class DepEnv ( object ): |
103 |
|
104 |
# --- end of __init__ (...) --- |
105 |
|
106 |
+ def _deref_none ( self ): |
107 |
+ return None |
108 |
+ # --- end of _deref_none (...) --- |
109 |
+ |
110 |
+ def _deref_package_info ( self ): |
111 |
+ return self.package_ref.deref_safe() |
112 |
+ # --- end of _deref_package_info (...) --- |
113 |
+ |
114 |
def _depsplit ( self ): |
115 |
result = list() |
116 |
for r in self.__class__.VERSION_REGEX: |
117 |
|
118 |
diff --git a/roverlay/ebuild/creation.py b/roverlay/ebuild/creation.py |
119 |
index a2a021d..fafd099 100644 |
120 |
--- a/roverlay/ebuild/creation.py |
121 |
+++ b/roverlay/ebuild/creation.py |
122 |
@@ -12,6 +12,8 @@ easy-to-use ebuild creation access. |
123 |
|
124 |
__all__ = [ 'EbuildCreation', ] |
125 |
|
126 |
+#TODO/COULDFIX: merge creation.py and depres.py |
127 |
+ |
128 |
import logging |
129 |
|
130 |
from roverlay.ebuild import depres, ebuilder, evars |
131 |
@@ -53,6 +55,12 @@ class EbuildCreation ( object ): |
132 |
#self.use_expand_flag_names = None |
133 |
# --- end of __init__ (...) --- |
134 |
|
135 |
+ def _get_depres_channel ( self, **channel_kw ): |
136 |
+ return self.depres_channel_spawner ( |
137 |
+ package_ref=self.package_info.get_ref(), **channel_kw |
138 |
+ ) |
139 |
+ # --- end of _get_depres_channel (...) --- |
140 |
+ |
141 |
def done ( self ) : return self.status < 1 |
142 |
def busy ( self ) : return self.status > 0 |
143 |
def success ( self ) : return self.status == 0 |
144 |
@@ -120,7 +128,7 @@ class EbuildCreation ( object ): |
145 |
# resolve dependencies |
146 |
dep_resolution = depres.EbuildDepRes ( |
147 |
self.package_info, self.logger, |
148 |
- run_now=True, depres_channel_spawner=self.depres_channel_spawner, |
149 |
+ run_now=True, depres_channel_spawner=self._get_depres_channel, |
150 |
err_queue=self.err_queue |
151 |
) |
152 |
if dep_resolution.success(): |