@@ -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+
18521886class 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