1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import copy
16 import imp
17 import inspect
18 import itertools
19 import new
20 import os
21 import string
22 import sys
23 import types
24 import tempfile
25 import traceback
26
27 from conary.repository import errors, trovesource
28 from conary.build import recipe, use
29 from conary.build import errors as builderrors
30 from conary.build.errors import RecipeFileError
31 from conary.build.factory import Factory as FactoryRecipe
32 from conary.conaryclient import cmdline
33 from conary.deps import deps
34 from conary.lib import graph, log, util
35 from conary.local import database
36 from conary import versions
37
39
40
41
42
43 - def __init__(self, cfg, repos, db, buildFlavor, directory,
44 branch, name, ignoreInstalled, overrides):
45 self.cfg = cfg
46 self.repos = repos
47 self.db = db
48 self.buildFlavor = buildFlavor
49 self.parentDir = directory
50 self.branch = branch
51 self.parentPackageName = name
52 self.ignoreInstalled = ignoreInstalled
53
54 if overrides is None:
55 self.overrides = {}
56 else:
57 self.overrides = overrides
58
60
61 baseModuleImports = [
62 ('conary.build', ('build', 'action')),
63 ('conary.build.grouprecipe', 'GroupRecipe'),
64 ('conary.build.filesetrecipe', 'FilesetRecipe'),
65 ('conary.build.redirectrecipe', 'RedirectRecipe'),
66 ('conary.build.derivedrecipe', 'DerivedPackageRecipe'),
67 ('conary.build.packagerecipe',
68 ('clearBuildReqs', 'clearBuildRequires',
69 'clearCrossReqs', 'clearCrossRequires',
70 'PackageRecipe', 'BuildPackageRecipe',
71 'CPackageRecipe', 'AutoPackageRecipe')),
72 ('conary.build.inforecipe', ('UserInfoRecipe', 'GroupInfoRecipe',
73 'UserGroupInfoRecipe' )),
74 ('conary.lib', ('util',)),
75 ('os',),
76 ('re',),
77 ('sys',),
78 ('stat',),
79 ('conary.build.use', ('Arch', 'Use', ('LocalFlags', 'Flags'),
80 'PackageFlags')) ]
81 - def __init__(self, objDict = {}, fileName = 'unknownfile.py',
82 baseName = 'unknown', factory = False,
83 subloadData = None):
109
111 self.module.__dict__.update(d)
112
114
115
116
117
118 recipeClassDict = {}
119 for recipeClass in self.module.__dict__.values():
120 if (type(recipeClass) != type or
121 not issubclass(recipeClass, recipe.Recipe)):
122 continue
123 numParents = len(inspect.getmro(recipeClass))
124 recipeClassDict[recipeClass.__name__] = (numParents, recipeClass)
125
126
127
128 recipeClasses = [ x[1] for x in sorted(recipeClassDict.values(),
129 key=lambda x: x[0]) ]
130 for recipeClass in recipeClasses:
131 className = recipeClass.__name__
132
133
134
135 mro = list(inspect.getmro(recipeClass)[1:])
136 newMro = []
137 for superClass in mro:
138 superName = superClass.__name__
139 newMro.append(self.module.__dict__.get(superName, superClass))
140
141 newDict = {}
142 for name, attr in recipeClass.__dict__.iteritems():
143 if type(attr) in [ types.ModuleType, types.MethodType,
144 types.UnboundMethodType,
145 types.FunctionType,
146 staticmethod,
147
148
149 use.LocalFlagCollection]:
150 newDict[name] = attr
151 else:
152 newDict[name] = copy.deepcopy(attr)
153
154 self.module.__dict__[className] = \
155 new.classobj(className, tuple(newMro), newDict)
156
158 """
159 import a package into a non-global context.
160
161 @param d: the context to import the module
162 @type d: dict
163 @param package: the name of the module to import
164 @type package: str
165 @param modules: a sequence of modules to import from the package.
166 If a 2-tuple is in the sequence, rename the imported module to
167 the second value in the tuple.
168 @type modules: sequence of strings or tuples, or empty tuple
169
170 Examples of translated import statements::
171 from foo import bar as baz:
172 _localImport(d, "foo", (("bar", "baz"))
173 from bar import fred, george:
174 _localImport(d, "bar", ("fred", "george"))
175 import os
176 _localImport(d, "os")
177 """
178 m = __import__(package, {}, {}, modules)
179 if modules:
180 if isinstance(modules, str):
181 modules = (modules,)
182 for name in modules:
183 if type(name) is tuple:
184 mod = name[0]
185 name = name[1]
186 else:
187 mod = name
188 self.module.__dict__[name] = getattr(m, mod)
189 else:
190 self.module.__dict__[package] = m
191
192
193 l = self.module.__dict__.setdefault('__localImportModules', [])
194 l.append(m)
195
196 - def _loadRecipe(self, troveSpec, label, findInstalled):
197 """ See docs for loadInstalledPackage and loadSuperClass. """
198 loader = ChainedRecipeLoader(troveSpec, label, findInstalled,
199 self.subloadData.cfg,
200 self.subloadData.repos,
201 self.subloadData.branch,
202 self.subloadData.parentPackageName,
203 self.subloadData.parentDir,
204 self.subloadData.buildFlavor,
205 self.subloadData.ignoreInstalled,
206 self.subloadData.overrides,
207 self.subloadData.db)
208
209 for name, recipe in loader.allRecipes().items():
210
211
212
213 recipe.internalAbstractBaseClass = 1
214
215 self.module.__dict__[name] = recipe
216 if recipe._trove:
217
218
219
220
221
222
223
224 troveTuple = (recipe._trove.getName(), recipe._trove.getVersion(),
225 recipe._usedFlavor)
226 log.info('Loaded %s from %s=%s[%s]' % ((name,) + troveTuple))
227 self.loadedTroves.extend(loader.getLoadedTroves())
228 self.loadedTroves.append(troveTuple)
229 self.loadedSpecs[troveSpec] = (troveTuple,
230 loader.getLoadedSpecs())
231
232
233
234 self.module.__dict__[loader.recipe.__module__] = loader
235