From 57a69725704658917d146cb2f2755a805a807a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Wed, 3 Mar 2021 00:00:35 +0000 Subject: [PATCH] Support resolving crates. --- ognibuild/buildsystem.py | 9 +++++++-- ognibuild/debian/apt.py | 2 +- ognibuild/requirements.py | 22 ++++++++++++++++++---- ognibuild/resolver/apt.py | 11 +++++++++++ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index bfee9cd..6804b20 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -627,8 +627,13 @@ class Cargo(BuildSystem): def get_declared_dependencies(self): if "dependencies" in self.cargo: for name, details in self.cargo["dependencies"].items(): - # TODO(jelmer): Look at details['features'], details['version'] - yield "build", CargoCrateRequirement(name) + if isinstance(details, str): + details = {"version": details} + # TODO(jelmer): Look at details['version'] + yield "build", CargoCrateRequirement( + name, + features=details.get('features', []), + version=details.get("version")) def test(self, session, resolver, fixers): run_with_build_fixers(session, ["cargo", "test"], fixers) diff --git a/ognibuild/debian/apt.py b/ognibuild/debian/apt.py index f5480da..405194f 100644 --- a/ognibuild/debian/apt.py +++ b/ognibuild/debian/apt.py @@ -308,7 +308,7 @@ def get_package_for_paths( if candidates: break if len(candidates) == 0: - logging.warning("No packages found that contain %r", paths) + logging.debug("No packages found that contain %r", paths) return None if len(candidates) > 1: logging.warning( diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index e2e5ff6..e0ad842 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -18,7 +18,7 @@ import posixpath import subprocess -from typing import Optional, List, Tuple +from typing import Optional, List, Tuple, Set from . import Requirement @@ -123,19 +123,33 @@ class NodePackageRequirement(Requirement): class CargoCrateRequirement(Requirement): crate: str + features: Set[str] + version: Optional[str] - def __init__(self, crate): + def __init__(self, crate, features=None, version=None): super(CargoCrateRequirement, self).__init__("cargo-crate") self.crate = crate + if features is None: + features = set() + self.features = features + self.version = version def __repr__(self): - return "%s(%r)" % ( + return "%s(%r, features=%r, version=%r)" % ( type(self).__name__, self.crate, + self.features, + self.version ) def __str__(self): - return "cargo crate: %s" % self.crate + if self.features: + return "cargo crate: %s %s (%s)" % ( + self.crate, self.version or '', + ', '.join(sorted(self.features))) + else: + return "cargo crate: %s %s" % ( + self.crate, self.version or '') class PkgConfigRequirement(Requirement): diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index f500efe..7969786 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -28,6 +28,7 @@ from ..debian.apt import AptManager from . import Resolver, UnsatisfiedRequirements from ..requirements import ( Requirement, + CargoCrateRequirement, BinaryRequirement, CHeaderRequirement, PkgConfigRequirement, @@ -515,6 +516,15 @@ def resolve_python_package_req(apt_mgr, req): return None +def resolve_cargo_crate_req(apt_mgr, req): + paths = [ + '/usr/share/cargo/registry/%s-[0-9]+.*/Cargo.toml' % req.crate] + pkg_name = apt_mgr.get_package_for_paths(paths, regex=True) + if pkg_name is None: + return None + return AptRequirement.simple(pkg_name) + + APT_REQUIREMENT_RESOLVERS = [ (BinaryRequirement, resolve_binary_req), (PkgConfigRequirement, resolve_pkg_config_req), @@ -542,6 +552,7 @@ APT_REQUIREMENT_RESOLVERS = [ (AutoconfMacroRequirement, resolve_autoconf_macro_req), (PythonModuleRequirement, resolve_python_module_req), (PythonPackageRequirement, resolve_python_package_req), + (CargoCrateRequirement, resolve_cargo_crate_req), ]