Skip to content

Commit

Permalink
fixup! input: add 'clean' dependency property
Browse files Browse the repository at this point in the history
  • Loading branch information
rhubert committed May 23, 2024
1 parent 2e1a20c commit 1147752
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 22 deletions.
8 changes: 6 additions & 2 deletions doc/manual/configuration.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1291,10 +1291,14 @@ The following settings are supported:
| | | At the dependency both names will refer to the same |
| | | tool. |
+-------------+-----------------+-----------------------------------------------------+
| clean | Boolean | Drop all the environment and tools collected so far |
| | | for this dependency. This is mostly useful to make |
| inherit | Boolean | Inherit environment and tools available for this |
| | | dependency. |
| | | When set to "false" all the environment and tools |
| | | are dropped. This is mostly useful to make |
| | | an existing root-package become a dependency |
| | | of another root package. |
| | | |
| | | Default: "true" |
+-------------+-----------------+-----------------------------------------------------+

.. _configuration-recipes-env:
Expand Down
36 changes: 22 additions & 14 deletions pym/bob/input.py
Original file line number Diff line number Diff line change
Expand Up @@ -1855,11 +1855,11 @@ class Recipe(object):
"""

class Dependency(object):
def __init__(self, recipe, env, fwd, use, cond, tools, checkoutDep, clean):
def __init__(self, recipe, env, fwd, use, cond, tools, checkoutDep, inherit):
self.recipe = recipe
self.envOverride = env
self.provideGlobal = fwd
self.clean = clean
self.inherit = inherit
self.use = use
self.useEnv = "environment" in self.use
self.useTools = "tools" in self.use
Expand All @@ -1871,9 +1871,9 @@ def __init__(self, recipe, env, fwd, use, cond, tools, checkoutDep, clean):
self.checkoutDep = checkoutDep

@staticmethod
def __parseEntry(dep, env, fwd, use, cond, tools, checkoutDep, clean):
def __parseEntry(dep, env, fwd, use, cond, tools, checkoutDep, inherit):
if isinstance(dep, str):
return [ Recipe.Dependency(dep, env, fwd, use, cond, tools, checkoutDep, clean) ]
return [ Recipe.Dependency(dep, env, fwd, use, cond, tools, checkoutDep, inherit) ]
else:
envOverride = dep.get("environment")
if envOverride:
Expand All @@ -1885,7 +1885,7 @@ def __parseEntry(dep, env, fwd, use, cond, tools, checkoutDep, clean):
tools.update(toolOverride)
fwd = dep.get("forward", fwd)
use = dep.get("use", use)
clean = dep.get("clean", clean)
inherit = dep.get("inherit", inherit)
newCond = dep.get("if")
if newCond is not None:
cond = cond + [newCond] if cond is not None else [ newCond ]
Expand All @@ -1894,22 +1894,22 @@ def __parseEntry(dep, env, fwd, use, cond, tools, checkoutDep, clean):
if name:
if "depends" in dep:
raise ParseError("A dependency must not use 'name' and 'depends' at the same time!")
return [ Recipe.Dependency(name, env, fwd, use, cond, tools, checkoutDep, clean) ]
return [ Recipe.Dependency(name, env, fwd, use, cond, tools, checkoutDep, inherit) ]
dependencies = dep.get("depends")
if dependencies is None:
raise ParseError("Either 'name' or 'depends' required for dependencies!")
return Recipe.Dependency.parseEntries(dependencies, env, fwd,
use, cond, tools,
checkoutDep, clean)
checkoutDep, inherit)

@staticmethod
def parseEntries(deps, env={}, fwd=False, use=["result", "deps"],
cond=None, tools={}, checkoutDep=False, clean=False):
cond=None, tools={}, checkoutDep=False, inherit=True):
"""Returns an iterator yielding all dependencies as flat list"""
# return flattened list of dependencies
return chain.from_iterable(
Recipe.Dependency.__parseEntry(dep, env, fwd, use, cond, tools,
checkoutDep, clean)
checkoutDep, inherit)
for dep in deps )

@staticmethod
Expand Down Expand Up @@ -2319,10 +2319,18 @@ def prepare(self, inputEnv, sandboxEnabled, inputStates, inputSandbox=None,
if dep.condition and not all(env.evaluate(cond, "dependency "+recipe)
for cond in dep.condition): continue

if dep.clean:
thisDepEnv = self.getRecipeSet().getRootEnv()
thisDepTools = Env()
thisDepDiffTools = Env()
if not dep.inherit:
thisDepEnv = self.getRecipeSet().getRootEnv().derive(
{ key : env.substitute(value, "depends["+recipe+"].environment["+key+"]")
for key, value in dep.envOverride.items() })

thisDepTools = Env().derive({
k : depTools[v] for k,v in dep.toolOverride.items() })

thisDepDiffTools = {}
thisDepDiffTools.update({
k : depDiffTools.get(v, v)
for k, v in dep.toolOverride.items() })
else:
if dep.toolOverride:
try:
Expand Down Expand Up @@ -3574,7 +3582,7 @@ def __createSchemas(self):
schema.Optional('name') : str,
schema.Optional('use') : useClauses,
schema.Optional('forward') : bool,
schema.Optional('clean') : bool,
schema.Optional('inherit') : bool,
schema.Optional('environment') : VarDefineValidator("depends::environment"),
schema.Optional('if') : schema.Or(str, IfExpression),
schema.Optional('tools') : { toolNameSchema : toolNameSchema },
Expand Down
25 changes: 19 additions & 6 deletions test/unit/test_input_recipeset.py
Original file line number Diff line number Diff line change
Expand Up @@ -647,8 +647,8 @@ def testCheckoutDepVariants(self):

self.assertNotEqual(paVId, pbVId, "checkout steps are different")

def testCleanDep(self):
""" Test the `clean` property for dependencies """
def testDepInherit(self):
""" Test the `inherit` property for dependencies """

self.writeDefault(
{"environment" : {"DEFAULT" : "42" }})
Expand All @@ -669,7 +669,13 @@ def testCleanDep(self):
use: [environment]
forward: true
- name: b
clean: True
inherit: False
- name: c
inherit: False
environment:
C: "1"
tools:
c: foo
packageScript: "true"
""")

Expand All @@ -684,6 +690,12 @@ def testCleanDep(self):
packageScript: "true"
""")

self.writeRecipe("c", """\
packageVars: [C]
packageTools: [c]
packageScript: "true"
""")

self.writeRecipe("foo", """\
packageTools: [foo]
packageScript: "true"
Expand All @@ -697,11 +709,12 @@ def testCleanDep(self):

pa_b = packages.walkPackagePath("a/b")
pb = packages.walkPackagePath("b")
pc = packages.walkPackagePath("a/c")
self.assertEqual(pa_b.getPackageStep().getVariantId(),
pb.getPackageStep().getVariantId())
self.assertEqual(
{"DEFAULT" : "42"},
pb.getPackageStep().getEnv())
self.assertEqual({"DEFAULT" : "42"}, pb.getPackageStep().getEnv())
self.assertEqual({"C" : "1"}, pc.getPackageStep().getEnv())
self.assertEqual(list(pc.getPackageStep().getTools()), ["c"])

class TestDependencyEnv(RecipesTmp, TestCase):
"""Tests related to "environment" block in dependencies"""
Expand Down

0 comments on commit 1147752

Please sign in to comment.