def _listLatestProducts(self, product, flavor): prods = self.distServer.listAvailableProducts(product, None, flavor) names = {} flavors = {} out = [] for p in prods: names[p[0]] = 1 flavors[p[2]] = 1 names = list(names.keys()) names.sort() flavors = [f for f in flavors.keys() if f != "generic"] flavors.sort() flavors.insert(0, "generic") for name in names: for flav in flavors: latest = [p for p in prods if p[0] == name and p[2] == flav] latest.sort(**cmp_or_key(lambda a,b: self.eups.version_cmp(a[1],b[1]))) out.extend(latest) return out
def _getPackageLookup(self): if not self.distServer: return dict(_sortOrder=[]) # Look for both generic and flavor-specific packages pkgs = self.distServer.listAvailableProducts(flavor=self.flavor) if self.flavor != None: for p in self.distServer.listAvailableProducts(flavor=None): if not pkgs.count(p): pkgs.append(p) # # arrange into a hierarchical lookup # lookup = {} # key is product == pkg[0] for pkg in pkgs: if pkg[0] not in lookup: lookup[pkg[0]] = {} # key is flavor == pkg[2] if pkg[2] not in lookup[pkg[0]]: lookup[pkg[0]][pkg[2]] = [] # list of versions == pkg[1] lookup[pkg[0]][pkg[2]].append(pkg[1]) # now sort the contents keys = list(lookup.keys()) keys.sort() lookup["_sortOrder"] = keys for prod in lookup["_sortOrder"]: keys = [f for f in lookup[prod].keys() if f != "generic"] keys.sort() if "generic" in lookup[prod].keys(): keys.insert(0, "generic") lookup[prod]["_sortOrder"] = keys for flav in lookup[prod]["_sortOrder"]: lookup[prod][flav].sort(**cmp_or_key(self.eups.version_cmp)) return lookup
def findProducts(self, name, versions=None, flavors=None): """ return a list of Products matching the given inputs @param name : the name of the desired product @param versions : the desired versions. If versions is None, return all declared versions of the product. @param flavors : the desired flavors. If None, return matching products of all declared flavors. @return Product[] : a list of the matching products """ if versions is None: versions = self.findVersions(name) if not isinstance(versions, list): versions = [versions] if flavors is not None and not isinstance(flavors, list): flavors = [flavors] out = {} for vers in versions: vfile = self._versionFile(name, vers) if not os.path.exists(vfile): continue vfile = VersionFile(vfile, name, vers) flavs = flavors declared = vfile.getFlavors() if flavs is None: flavs = declared out[vers] = {} for f in flavs: if f in declared: out[vers][f] = vfile.makeProduct(f, self.defStackRoot, self.dbpath) if len(out.keys()) == 0: return [] pdir = self._productDir(name) if not os.path.exists(pdir): raise RuntimeError( "programmer error: product directory disappeared") # add in the tags for tag, vers, flavor in self.getTagAssignments(name): try: out[vers][flavor].tags.append(tag) except KeyError: pass # not sure why this doesn't work: # out = reduce(lambda x,y: x.extend(y), # map(lambda z: z.values(), out.values())) # out.sort(_cmp_by_verflav) # # replaced with moral equivalent: # v = [list(z.values()) for z in out.values()] x = v[0] for y in v[1:]: x.extend(y) x.sort(**cmp_or_key(_cmp_by_verflav)) return x
def findProducts(self, name, versions=None, flavors=None): """ return a list of Products matching the given inputs @param name : the name of the desired product @param versions : the desired versions. If versions is None, return all declared versions of the product. @param flavors : the desired flavors. If None, return matching products of all declared flavors. @return Product[] : a list of the matching products """ if versions is None: versions = self.findVersions(name) if not isinstance(versions, list): versions = [versions] if flavors is not None and not isinstance(flavors, list): flavors = [flavors] out = {} for vers in versions: vfile = self._versionFile(name, vers) if not os.path.exists(vfile): continue vfile = VersionFile(vfile, name, vers) flavs = flavors declared = vfile.getFlavors() if flavs is None: flavs = declared out[vers] = {} for f in flavs: if f in declared: out[vers][f] = vfile.makeProduct(f, self.defStackRoot, self.dbpath) if len(out.keys()) == 0: return [] pdir = self._productDir(name) if not os.path.exists(pdir): raise RuntimeError("programmer error: product directory disappeared") # add in the tags for tag, vers, flavor in self.getTagAssignments(name): try: out[vers][flavor].tags.append(tag) except KeyError: pass # not sure why this doesn't work: # out = reduce(lambda x,y: x.extend(y), # map(lambda z: z.values(), out.values())) # out.sort(_cmp_by_verflav) # # replaced with moral equivalent: # v = [list(z.values()) for z in out.values()] x = v[0] for y in v[1:]: x.extend(y) x.sort(**cmp_or_key(_cmp_by_verflav)) return x