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 dispatch(self, action, arguments): name = CAPABS.get_name(action) results = [] for index, backend in enumerate(self.backends): method = backend.get_method(action) if method: try: if action == CAPABS.SEARCH: results.append(method(*arguments)) else: results.extend(map(method, arguments)) except DeferToNextBackend: if index != len(self.backends) - 1: next_backend = self.backends[index + 1] log.info("deferring to " + next_backend.__class__.__name__) continue else: log.warning("backend {} does not support method {}"\ .format(backend.__class__.__name__, name)) results = flatten_lazy(results) try: first = next(results) results = itertools.chain([first], results) except StopIteration: log.notice("no results") sys.exit(0) return getattr(self, "post_" + name.lower())(results)
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 interrupt(signal, frame): print("") log.info("interrupted") sys.exit(0)