Skip to content

Commit 31d182f

Browse files
jkloetzkerhubert
authored andcommitted
input: optimize resolving of provided dependencies
Most likely no string substitution is required on provideDeps. Wrap the entries into a specialized class that handles only what is really necessary.
1 parent df3c9cc commit 31d182f

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

pym/bob/input.py

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1849,6 +1849,40 @@ def useResultOnce(self):
18491849
self.usedResult = True
18501850
return True
18511851

1852+
1853+
class VerbatimProvideDepsResolver:
1854+
def __init__(self, pattern):
1855+
self.pattern = pattern
1856+
1857+
def resolve(self, env, resolvedDeps):
1858+
pattern = self.pattern
1859+
return set(d for d in resolvedDeps if d == pattern)
1860+
1861+
class GlobProvideDepsResolver:
1862+
def __init__(self, pattern):
1863+
self.pattern = pattern
1864+
1865+
def resolve(self, env, resolvedDeps):
1866+
pattern = self.pattern
1867+
return set(d for d in resolvedDeps if fnmatch.fnmatchcase(d, pattern))
1868+
1869+
class SubstituteProvideDepsResolver:
1870+
def __init__(self, pattern):
1871+
self.pattern = pattern
1872+
1873+
def resolve(self, env, resolvedDeps):
1874+
pattern = self.pattern
1875+
pattern = env.substitute(pattern, "providedDeps::"+pattern)
1876+
return set(d for d in resolvedDeps if fnmatch.fnmatchcase(d, pattern))
1877+
1878+
def getProvideDepsResolver(pattern):
1879+
if any((c in pattern) for c in '\\\"\'$'):
1880+
return SubstituteProvideDepsResolver(pattern)
1881+
elif any((c in pattern) for c in '*?['):
1882+
return GlobProvideDepsResolver(pattern)
1883+
else:
1884+
return VerbatimProvideDepsResolver(pattern)
1885+
18521886
class Recipe(object):
18531887
"""Representation of a single recipe
18541888
@@ -2220,6 +2254,9 @@ def coDet(r):
22202254
if self.__jobServer is None:
22212255
self.__jobServer = False
22222256

2257+
# Optimize provideDeps
2258+
self.__provideDeps = [ getProvideDepsResolver(d) for d in self.__provideDeps ]
2259+
22232260
# Evaluate root property
22242261
if isinstance(self.__root, str) or isinstance(self.__root, IfExpression):
22252262
self.__root = rootEnv.evaluate(self.__root, "root")
@@ -2450,10 +2487,9 @@ def prepare(self, inputEnv, sandboxEnabled, inputStates, inputSandbox=None,
24502487
# check provided dependencies
24512488
providedDeps = set()
24522489
for pattern in self.__provideDeps:
2453-
pattern = env.substitute(pattern, "providedDep::"+pattern)
2454-
l = set(d for d in resolvedDeps if fnmatch.fnmatchcase(d, pattern))
2490+
l = pattern.resolve(env, resolvedDeps)
24552491
if not l:
2456-
raise ParseError("Unknown dependency '{}' in provideDeps".format(pattern))
2492+
raise ParseError("Unknown dependency '{}' in provideDeps".format(pattern.pattern))
24572493
providedDeps |= l
24582494

24592495
for (recipe, depRef, name, origDepDiffTools, origDepDiffSandbox) in maybeProvideDeps:

0 commit comments

Comments
 (0)