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):
|
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)
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue