def sync(self, package): package = self.query(package) if not package: raise DeferToNextBackend package_dir = path(self.config.staging_area).join(package.name) if not package_dir.exists: package_dir.create() filename = package_dir.join(path(package.metadata.urlpath).name) if not filename.exists: download(urlparse.urljoin(self.config.base_url, package.metadata.urlpath), filename) if not package_dir.join(package.name).exists: with tarfile.open(filename.absolute) as tar: tar.extractall(package_dir) tar.close() srcdir = package_dir.join(package.name) if not package.depends: package.metadata = PackageMetadata.from_pkgbuild(srcdir.join("PKGBUILD"), name=package.name) unmet_deps = deptest(*package.depends) for dependency in unmet_deps: log.info("resolving dependency: " + str(dependency)) self.frontend.dispatch(CAPABS.SYNC, [dependency.name]) child = pexpect.spawn("makepkg -si", cwd=srcdir) if child.expect("Password: "******".*Failed to install built package\(s\).", r".*Finished making: (.+?) ([^ ]+)", r".*\[Y/n\]"] ) if index == 2: child.setecho(False) child.sendline("y") child.expect(pexpect.EOF)
def search(self, *terms): """Don't use this. This is painfully slow.""" desc_re = re.compile(r"%DESC%\n.*{0}.*$".format(".*".join(terms)), re.IGNORECASE | re.MULTILINE) for db in ALPM_DB_PATH.join("sync").glob("*.db"): if db.name[:-3] not in self.enabled_repositories: continue seen = [] try: tar = tarfile.open(db, "r") except tarfile.ReadError: log.error("could not open db file: {0}".format(db)) continue for member in tar.getmembers(): member_path = path(member.name) if member_path.name != "desc": continue package = member_path.parent if package.name in seen: continue desc = tar.extractfile(member).read() if (len(terms) == 1 and re.match(terms[0], package.name, re.IGNORECASE)): seen.append(package.name) else: if re.search(desc_re, desc): seen.append(package.name) else: continue metadata = self.parse_desc(desc) yield ALPMPackage(metadata=metadata)
def initialize(self): super(AURBackend, self).initialize() staging_area = path(self.config.staging_area) if not staging_area.exists: log.info("creating staging area: " + staging_area) staging_area.create()
def download(url, pathname): return path(pathname).write(urllib2.urlopen(url).read(), "wb")
def download(url, location): response = urllib2.urlopen(url) with path(location).open("wb") as f: f.write(response.read())
import os import nose import pwd import sys import urllib2 import unittest from ...objects import Package, PackageMetadata from .backend import AURBackend from ufl.io.fs import path from ufl.io.shell import execute tmp = path("/tmp/borealis-" + pwd.getpwuid(os.getuid())[0] + "/aur3/") def download(url, location): response = urllib2.urlopen(url) with path(location).open("wb") as f: f.write(response.read()) def parse_meta(meta_file): try: metadata = AURBackend.sanitize_json_metadata(meta_file.read()) except ValueError: metadata = None assert metadata, meta_file def parse_pkgbuild(pkgbuild):
import tarfile from borealis import log from borealis.backends import DeferToNextBackend, ACTIONS, CAPABS, \ PackageManagementBackend from borealis.objects import Package, PackageMetadata, Version from borealis.util import sudo from ufl.core.structures.dict import AttrDict from ufl.io.fs import path from ufl.io.shell import execute, PIPE __all__ = ["ALPMBackend", "PacmanProxyBackend"] ALPM_DB_PATH = path("/var/lib/pacman") class ALPMPackage(Package): """Represents an Archlinux package. Provides additional, ALPM specific metadata such as :attr:`installed` and :attr:`installed_version`.""" def __init__(self, *args, **kwargs): super(ALPMPackage, self).__init__(*args, **kwargs) self._installed_dir = ALPM_DB_PATH.join("local").glob(self.name + "-[0-9]*") @property def installed(self): return self._installed_dir != []