import random
import string
+from . import _pakfire
from . import actions
from . import builder
from . import config
class Pakfire(object):
mode = None
- def __init__(self, path="/", arch=None, distro=None):
+ def __init__(self, path="/", arch=None, distro=None, cache_path=None):
# The path where we are operating in
self.path = path
# Initialize the keyring
self.keyring = keyring.Keyring(self)
- self.pool = satsolver.Pool(self.arch.name)
+ self.pool = _pakfire.Pool(self.arch.name)
+ self.pool.cache_path = cache_path or \
+ os.path.join(CACHE_DIR, self.distro.sname, self.distro.release)
+
self.repos = repository.Repositories(self)
# Load default repository configuration
pkgs.append(pkg)
else:
- solvs = self.pakfire.pool.search(pattern, satsolver.SEARCH_GLOB, "solvable:name")
-
- for solv in solvs:
- pkg = packages.SolvPackage(self.pakfire, solv)
- if pkg in pkgs:
- continue
-
- pkgs.append(pkg)
+ pkgs += self.pakfire.pool.whatprovides(pattern, name_only=True)
return sorted(pkgs)
Solvable = _pakfire.Solvable
Relation = _pakfire.Relation
-class Pool(_pakfire.Pool):
- RELATIONS = (
- (">=", _pakfire.REL_GE,),
- ("<=", _pakfire.REL_LE,),
- ("=" , _pakfire.REL_EQ,),
- ("<" , _pakfire.REL_LT,),
- (">" , _pakfire.REL_GT,),
- )
-
- def create_relation(self, s):
- assert s
-
- if isinstance(s, filelist._File):
- return Relation(self, s.name)
-
- elif s.startswith("/"):
- return Relation(self, s)
-
- for pattern, type in self.RELATIONS:
- if not pattern in s:
- continue
-
- name, version = s.split(pattern, 1)
- return Relation(self, name.strip(), version.strip(), type)
-
- return Relation(self, s)
-
- def create_request(self, builder=False, install=None, remove=None, update=None, updateall=False):
- request = Request(self)
-
- # Add multiinstall information.
- for solv in PAKFIRE_MULTIINSTALL:
- request.noobsoletes(solv)
-
- # Apply all installs.
- for req in self.expand_requires(install):
- request.install(req)
-
- # Apply all removes.
- for req in self.expand_requires(remove):
- request.remove(req)
-
- # Apply all updates.
- for req in self.expand_requires(update):
- request.update(req)
-
- # Configure the request to update all packages
- # if requested.
- if updateall:
- request.updateall()
-
- # Return the request.
- return request
-
- def grouplist(self, group):
- pkgs = []
-
- for solv in self.search(group, _pakfire.SEARCH_SUBSTRING, "solvable:group"):
- pkg = packages.SolvPackage(self, solv)
-
- if group in pkg.groups and not pkg.name in pkgs:
- pkgs.append(pkg.name)
-
- return sorted(pkgs)
-
- def expand_requires(self, requires):
- if requires is None:
- return []
-
- ret = []
- for req in requires:
- if isinstance(req, packages.BinaryPackage):
- ret.append(req)
- continue
-
- if isinstance(req, packages.SolvPackage):
- ret.append(req.solvable)
- continue
-
- assert type(req) == type("a"), req
-
- # Expand all groups.
- if req.startswith("@"):
- reqs = self.grouplist(req[1:])
- else:
- reqs = [req,]
-
- for req in reqs:
- req = self.create_relation(req)
- ret.append(req)
-
- return ret
-
- def resolvdep(self, pakfire, pkg, logger=None):
- assert os.path.exists(pkg)
-
- # Open the package file.
- pkg = packages.open(pakfire, None, pkg)
-
- # Create a new request.
- request = self.create_request(install=pkg.requires)
-
- # Add build dependencies if needed.
- if isinstance(pkg, packages.Makefile) or isinstance(pkg, packages.SourcePackage):
- for req in self.expand_requires(BUILD_PACKAGES):
- request.install(req)
-
- # Solv the request.
- solver = self.solve(request, logger=logger)
-
- if solver.status:
- return solver
-
- raise DependencyError(solver.get_problem_string())
-
- def solve(self, request, interactive=False, logger=None, force_best=False, **kwargs):
- # XXX implement interactive
-
- if not logger:
- logger = logging.getLogger("pakfire")
-
- # Create a solver.
- solver = Solver(self, request, logger=logger)
-
- # Apply configuration to solver.
- for key, val in list(kwargs.items()):
- solver.set(key, val)
-
- # Do the solving.
- solver.solve(force_best=force_best)
-
- # Return the solver so one can do stuff with it...
- return solver
-
- def whatprovides(self, pakfire, what):
- pkgs = []
- for solv in self.providers(what):
- pkg = packages.SolvPackage(pakfire, solv)
- pkgs.append(pkg)
-
- return pkgs
-
-
class Request(_pakfire.Request):
def install(self, what):
if isinstance(what, Solvable):