Support resolving crates.
This commit is contained in:
parent
3e63179616
commit
57a6972570
4 changed files with 37 additions and 7 deletions
|
@ -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)
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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),
|
||||
]
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue