Skip to content

Commit 0aed500

Browse files
committed
input: support for variable depends
1 parent 4d00b85 commit 0aed500

File tree

2 files changed

+89
-15
lines changed

2 files changed

+89
-15
lines changed

pym/bob/input.py

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2220,16 +2220,6 @@ def coDet(r):
22202220
if self.__jobServer is None:
22212221
self.__jobServer = False
22222222

2223-
# check provided dependencies
2224-
availDeps = [ d.recipe for d in self.__deps ]
2225-
providedDeps = set()
2226-
for pattern in self.__provideDeps:
2227-
l = set(d for d in availDeps if fnmatch.fnmatchcase(d, pattern))
2228-
if not l:
2229-
raise ParseError("Unknown dependency '{}' in provideDeps".format(pattern))
2230-
providedDeps |= l
2231-
self.__provideDeps = providedDeps
2232-
22332223
# Evaluate root property
22342224
if isinstance(self.__root, str) or isinstance(self.__root, IfExpression):
22352225
self.__root = rootEnv.evaluate(self.__root, "root")
@@ -2346,6 +2336,7 @@ def prepare(self, inputEnv, sandboxEnabled, inputStates, inputSandbox=None,
23462336
directPackages = []
23472337
indirectPackages = []
23482338
provideDeps = UniquePackageList(stack, self.__raiseIncompatibleProvided)
2339+
maybeProvideDeps = {}
23492340
checkoutDeps = []
23502341
results = []
23512342
depEnv = env.derive()
@@ -2355,11 +2346,16 @@ def prepare(self, inputEnv, sandboxEnabled, inputStates, inputSandbox=None,
23552346
depDiffSandbox = diffSandbox
23562347
depDiffTools = diffTools.copy()
23572348
thisDeps = {}
2349+
resolvedDeps = []
23582350

2359-
for dep in self.__deps:
2351+
for d in self.__deps:
2352+
dep = copy.deepcopy(d)
23602353
env.setFunArgs({ "recipe" : self, "sandbox" : bool(sandbox) and sandboxEnabled,
23612354
"__tools" : tools })
23622355

2356+
dep.recipe = env.substitute(dep.recipe, "dependency::"+dep.recipe)
2357+
resolvedDeps.append(dep.recipe)
2358+
23632359
if dep.condition and not all(env.evaluate(cond, "dependency "+dep.recipe)
23642360
for cond in dep.condition): continue
23652361

@@ -2449,10 +2445,24 @@ def prepare(self, inputEnv, sandboxEnabled, inputStates, inputSandbox=None,
24492445
if sandboxEnabled:
24502446
env.update(sandbox.environment)
24512447
if dep.provideGlobal: depEnv.update(sandbox.environment)
2452-
if dep.recipe in self.__provideDeps:
2453-
provideDeps.append(depRef)
2454-
provideDeps.extend(CoreRef(d, [p.getName()], origDepDiffTools, origDepDiffSandbox)
2455-
for d in depCoreStep.providedDeps)
2448+
2449+
l = [depRef]
2450+
l.append([CoreRef(d, [p.getName()], origDepDiffTools, origDepDiffSandbox)
2451+
for d in depCoreStep.providedDeps])
2452+
maybeProvideDeps[dep.recipe] = l
2453+
2454+
# check provided dependencies
2455+
providedDeps = set()
2456+
for pattern in self.__provideDeps:
2457+
pattern = env.substitute(pattern, "providedDep::"+pattern)
2458+
l = set(d for d in resolvedDeps if fnmatch.fnmatchcase(d, pattern))
2459+
if not l:
2460+
raise ParseError("Unknown dependency '{}' in provideDeps".format(pattern))
2461+
providedDeps |= l
2462+
2463+
for recipe in providedDeps:
2464+
provideDeps.append(maybeProvideDeps[recipe][0])
2465+
provideDeps.extend(maybeProvideDeps[recipe][1])
24562466

24572467
# Filter indirect packages and add to result list if necessary. Most
24582468
# likely there are many duplicates that are dropped.

test/unit/test_input_recipeset.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,70 @@ def testInvalidMinVerStr(self):
251251

252252

253253
class TestDependencies(RecipesTmp, TestCase):
254+
def testVariableDeps(self):
255+
"""Test resolve of dependecies by environment substitution"""
256+
self.writeRecipe("root", """\
257+
root: True
258+
depends: [a]
259+
environment:
260+
A : "b"
261+
D : "c"
262+
buildScript: "true"
263+
packageScript: "true"
264+
""")
265+
self.writeRecipe("root2", """\
266+
root: True
267+
depends: [a, d]
268+
environment:
269+
A : "c"
270+
buildScript: "true"
271+
packageScript: "true"
272+
""")
273+
274+
self.writeRecipe("a", """\
275+
depends: [ "$A-foo" ]
276+
buildScript: "true"
277+
packageScript: "true"
278+
provideDeps: [ "$A-f*" ]
279+
provideVars:
280+
D: "e"
281+
""")
282+
283+
self.writeRecipe("b-foo", """\
284+
buildScript: "true"
285+
packageScript: "echo 'b'"
286+
""")
287+
self.writeRecipe("c-foo", """\
288+
buildScript: "true"
289+
packageScript: "echo 'c'"
290+
""")
291+
self.writeRecipe("d", """\
292+
depends:
293+
- name: a
294+
use: [environment, deps]
295+
- "$D"
296+
buildScript: "true"
297+
packageScript: "true"
298+
""")
299+
self.writeRecipe("e", """\
300+
buildScript: "true"
301+
packageScript: "true"
302+
""")
303+
304+
recipes = RecipeSet()
305+
recipes.parse()
306+
packages = recipes.generatePackages(lambda x,y: "unused")
307+
308+
p = packages.walkPackagePath("root/a/b-foo")
309+
self.assertEqual(p.getName(), "b-foo")
310+
p = packages.walkPackagePath("root2/a/c-foo")
311+
self.assertEqual(p.getName(), "c-foo")
312+
p = packages.walkPackagePath("root2/d/e")
313+
self.assertEqual(p.getName(), "e")
314+
#access via providedDeps
315+
p = packages.walkPackagePath("root/b-foo")
316+
self.assertEqual(p.getName(), "b-foo")
317+
254318
def testDuplicateRemoval(self):
255319
"""Test that provided dependencies do not replace real dependencies"""
256320
self.writeRecipe("root", """\

0 commit comments

Comments
 (0)