示例#1
0
 def __init__(self, basepath, url, version, arches, components, groups,
              rawurl, blacklist, whitelist, recommended):
     self.basepath = basepath
     self.version = version
     self.components = components
     self.url = url
     self.rawurl = rawurl
     self.groups = groups
     self.arches = arches
     self.deps = dict()
     self.provides = dict()
     self.blacklist = set(blacklist)
     self.whitelist = set(whitelist)
     self.cachefile = '%s/cache-%s' % (self.basepath, md5(cPickle.dumps( \
             [self.version, self.components, self.url, \
             self.rawurl, self.groups, self.arches])).hexdigest())
     self.recommended = recommended
     self.url_map = []
示例#2
0
 def cachekey(self):
     return md5(cPickle.dumps([self.version, self.components, self.url,
                               self.rawurl, self.arches])).hexdigest()
示例#3
0
 def cachekey(self):
     return md5(
         cPickle.dumps([
             self.version, self.components, self.url, self.rawurl,
             self.arches
         ])).hexdigest()
示例#4
0
文件: Yum.py 项目: mikemccllstr/bcfg2
    def complete(self, packagelist):
        if not self.use_yum:
            return Collection.complete(self, packagelist)

        cachekey = cPickle.dumps(sorted(packagelist))
        try:
            packages = self.pkgset_cache[cachekey]
        except KeyError:
            packages = set()

        pkgs = set(packagelist).difference(packages)    
        requires = set()
        satisfied = set()
        unknown = set()
        final_pass = False

        while requires or pkgs:
            # infinite loop protection
            start_reqs = len(requires)
            
            while pkgs:
                package = pkgs.pop()
                if package in packages:
                    continue
                
                if not self.is_package(package):
                    # try this package out as a requirement
                    requires.add((package, None, (None, None, None)))
                    continue

                packages.add(package)
                reqs = set(self.get_deps(package)).difference(satisfied)
                if reqs:
                    requires.update(reqs)

            reqs_satisfied = set()
            for req in requires:
                if req in satisfied:
                    reqs_satisfied.add(req)
                    continue

                if req[1] is None and self.is_package(req[0]):
                    if req[0] not in packages:
                        pkgs.add(req[0])
                    reqs_satisfied.add(req)
                    continue
                    
                self.logger.debug("Packages: Handling requirement '%s'" %
                                  self.get_package_name(req))
                providers = list(set(self.get_provides(req)))
                if len(providers) > 1:
                    # hopefully one of the providing packages is already
                    # included
                    best = [p for p in providers if p in packages]
                    if best:
                        providers = best
                    else:
                        # pick a provider whose name matches the requirement
                        best = [p for p in providers if p == req[0]]
                        if len(best) == 1:
                            providers = best
                        elif not final_pass:
                            # found no "best" package, so defer
                            providers = None
                        # else: found no "best" package, but it's the
                        # final pass, so include them all
                
                if providers:
                    self.logger.debug("Packages: Requirement '%s' satisfied "
                                      "by %s" %
                                     (self.get_package_name(req),
                                      ",".join([self.get_package_name(p)
                                                for p in providers])))
                    newpkgs = set(providers).difference(packages)
                    if newpkgs:
                        for package in newpkgs:
                            if self.is_package(package):
                                pkgs.add(package)
                            else:
                                unknown.add(package)
                    reqs_satisfied.add(req)
                elif providers is not None:
                    # nothing provided this requirement at all
                    unknown.add(req)
                    reqs_satisfied.add(req)
                # else, defer
            requires.difference_update(reqs_satisfied)

            # infinite loop protection
            if len(requires) == start_reqs and len(pkgs) == 0:
                final_pass = True

            if final_pass and requires:
                unknown.update(requires)
                requires = set()

        self.filter_unknown(unknown)
        unknown = [self.get_package_name(p) for p in unknown]

        # we do not cache unknown packages, since those are likely to
        # be fixed
        self.pkgset_cache[cachekey] = packages

        return packages, unknown