def testFlavorSetOps(self): a = parseFlavor('foo,bar is: x86') b = parseFlavor('foo,~!bar') x = a & b assert(x.freeze() == '5#use:foo') x = a - b assert(x.freeze() == '1#x86|5#use:bar') x = flavorDifferences((a,b)) assert(x[a].freeze() == '1#x86|5#use:bar') assert(x[b].freeze() == '5#use:~!bar') a = DependencySet() a.addDep(TroveDependencies, Dependency("foo:runtime")) assert(a.copy() & a == a) assert(not (a - a)) x = flavorDifferences((a, a)) assert(not x[a]) #now test non-strict ops a = parseFlavor('foo,bar') b = parseFlavor('~foo,~!bar,bam') assert(str(a.intersection(b, strict=False)) == 'foo') assert(str(a.difference(b, strict=False)) == 'bar') assert(str(flavorDifferences([a, b],strict=False)[a]) == 'bar') assert(str(flavorDifferences([a, b],strict=False)[b]) == 'bam,~!bar') # test empty set assert(flavorDifferences([]) == {})
def getFlavorSpecs(job): flavorsByName = {} for nvf in job.iterTroveList(): flavorsByName.setdefault(nvf[0], []).append(nvf[2]) for trove in job.iterTroves(): if not trove: continue for nvf in trove.iterBuiltTroves(): flavorsByName.setdefault(nvf[0], []).append(nvf[2]) for name, flavorList in flavorsByName.items(): allFlavors = [] for flavor in flavorList: archFlags = flavorutil.getArchFlags(flavor, withFlags=False) flavorsByName[name, flavor] = archFlags if len(set(allFlavors)) != len(allFlavors): diffs = deps.flavorDifferences(flavorList) for flavor in flavorList: archFlags = flavorsByName[name, flavor] archFlags.union(diffs[flavor]) return flavorsByName
def getTupleStrings(self, n, v, f): """ returns potentially shortened display versions and flavors for a trove tuple. @param n: trove name @type n: str @param v: trove version @type v: versions.Version @param f: trove flavor @type f: deps.deps.Flavor @rtype: (vStr, fStr) where vStr is the version string to display for this trove and fStr is the flavor string (may be empty) """ if self.dcfg.useFullVersions(): vStr = str(v) elif self.dcfg.showLabels: vStr = '%s/%s' % (v.branch().label(), v.trailingRevision()) elif len(self._vCache.get(n, [])) > 1: # print the trailing revision unless there # are two versions that are on different # branches. vers = self._vCache[n] branch = v.branch() vStr = None for ver in vers: if ver.branch() != branch: vStr = str(v) if not vStr: vStr = str(v.trailingRevision()) else: vStr = str(v.trailingRevision()) if self.dcfg.useFullFlavors(): fStr = str(f) else: # print only the flavor differences between # the two troves. # FIXME Document all this! if self.dcfg.affinityDb: installed = set() #installed = set([x[2] for x in self.dcfg.affinityDb.trovesByName(n)]) installed.discard(f) installed = list(installed) else: installed = [] flavors = list(self._fCache.get(n, [])) if installed: for baseFlavor in self.dcfg.baseFlavors: flavors += [ deps.overrideFlavor(baseFlavor, x) for x in installed ] else: flavors += self.dcfg.baseFlavors if len(flavors) > 1: fStr = deps.flavorDifferences( list(flavors) + installed + [f], strict=False)[f] ISD = deps.InstructionSetDependency if f.hasDepClass(ISD) and fStr.hasDepClass(ISD): allDeps = set(x.name for x in f.iterDepsByClass(ISD)) allDeps.difference_update(x.name for x in fStr.iterDepsByClass(ISD)) for depName in allDeps: fStr.addDep(ISD, deps.Dependency(depName)) fStr = str(fStr) else: fStr = '' return vStr, fStr
def getTupleStrings(self, n, v, f): """ returns potentially shortened display versions and flavors for a trove tuple. @param n: trove name @type n: str @param v: trove version @type v: versions.Version @param f: trove flavor @type f: deps.deps.Flavor @rtype: (vStr, fStr) where vStr is the version string to display for this trove and fStr is the flavor string (may be empty) """ if self.dcfg.useFullVersions(): vStr = str(v) elif self.dcfg.showLabels: vStr = '%s/%s' % (v.branch().label(), v.trailingRevision()) elif len(self._vCache.get(n, [])) > 1: # print the trailing revision unless there # are two versions that are on different # branches. vers = self._vCache[n] branch = v.branch() vStr = None for ver in vers: if ver.branch() != branch: vStr = str(v) if not vStr: vStr = str(v.trailingRevision()) else: vStr = str(v.trailingRevision()) if self.dcfg.useFullFlavors(): fStr = str(f) else: # print only the flavor differences between # the two troves. # FIXME Document all this! if self.dcfg.affinityDb: installed = set() #installed = set([x[2] for x in self.dcfg.affinityDb.trovesByName(n)]) installed.discard(f) installed = list(installed) else: installed = [] flavors = list(self._fCache.get(n, [])) if installed: for baseFlavor in self.dcfg.baseFlavors: flavors += [ deps.overrideFlavor(baseFlavor, x) for x in installed ] else: flavors += self.dcfg.baseFlavors if len(flavors) > 1: fStr = deps.flavorDifferences(list(flavors) + installed + [f], strict=False)[f] ISD = deps.InstructionSetDependency if f.hasDepClass(ISD) and fStr.hasDepClass(ISD): allDeps = set(x.name for x in f.iterDepsByClass(ISD)) allDeps.difference_update( x.name for x in fStr.iterDepsByClass(ISD)) for depName in allDeps: fStr.addDep(ISD, deps.Dependency(depName)) fStr = str(fStr) else: fStr = '' return vStr, fStr