Support resolving crates.

This commit is contained in:
Jelmer Vernooij 2021-03-03 00:00:35 +00:00
parent 3e63179616
commit 57a6972570
No known key found for this signature in database
GPG key ID: 579C160D4C9E23E8
4 changed files with 37 additions and 7 deletions

View file

@ -627,8 +627,13 @@ class Cargo(BuildSystem):
def get_declared_dependencies(self): def get_declared_dependencies(self):
if "dependencies" in self.cargo: if "dependencies" in self.cargo:
for name, details in self.cargo["dependencies"].items(): for name, details in self.cargo["dependencies"].items():
# TODO(jelmer): Look at details['features'], details['version'] if isinstance(details, str):
yield "build", CargoCrateRequirement(name) 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): def test(self, session, resolver, fixers):
run_with_build_fixers(session, ["cargo", "test"], fixers) run_with_build_fixers(session, ["cargo", "test"], fixers)

View file

@ -308,7 +308,7 @@ def get_package_for_paths(
if candidates: if candidates:
break break
if len(candidates) == 0: if len(candidates) == 0:
logging.warning("No packages found that contain %r", paths) logging.debug("No packages found that contain %r", paths)
return None return None
if len(candidates) > 1: if len(candidates) > 1:
logging.warning( logging.warning(

View file

@ -18,7 +18,7 @@
import posixpath import posixpath
import subprocess import subprocess
from typing import Optional, List, Tuple from typing import Optional, List, Tuple, Set
from . import Requirement from . import Requirement
@ -123,19 +123,33 @@ class NodePackageRequirement(Requirement):
class CargoCrateRequirement(Requirement): class CargoCrateRequirement(Requirement):
crate: str 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") super(CargoCrateRequirement, self).__init__("cargo-crate")
self.crate = crate self.crate = crate
if features is None:
features = set()
self.features = features
self.version = version
def __repr__(self): def __repr__(self):
return "%s(%r)" % ( return "%s(%r, features=%r, version=%r)" % (
type(self).__name__, type(self).__name__,
self.crate, self.crate,
self.features,
self.version
) )
def __str__(self): 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): class PkgConfigRequirement(Requirement):

View file

@ -28,6 +28,7 @@ from ..debian.apt import AptManager
from . import Resolver, UnsatisfiedRequirements from . import Resolver, UnsatisfiedRequirements
from ..requirements import ( from ..requirements import (
Requirement, Requirement,
CargoCrateRequirement,
BinaryRequirement, BinaryRequirement,
CHeaderRequirement, CHeaderRequirement,
PkgConfigRequirement, PkgConfigRequirement,
@ -515,6 +516,15 @@ def resolve_python_package_req(apt_mgr, req):
return None 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 = [ APT_REQUIREMENT_RESOLVERS = [
(BinaryRequirement, resolve_binary_req), (BinaryRequirement, resolve_binary_req),
(PkgConfigRequirement, resolve_pkg_config_req), (PkgConfigRequirement, resolve_pkg_config_req),
@ -542,6 +552,7 @@ APT_REQUIREMENT_RESOLVERS = [
(AutoconfMacroRequirement, resolve_autoconf_macro_req), (AutoconfMacroRequirement, resolve_autoconf_macro_req),
(PythonModuleRequirement, resolve_python_module_req), (PythonModuleRequirement, resolve_python_module_req),
(PythonPackageRequirement, resolve_python_package_req), (PythonPackageRequirement, resolve_python_package_req),
(CargoCrateRequirement, resolve_cargo_crate_req),
] ]