2020-04-22 09:28:58 +00:00
|
|
|
from typing import Iterable, List
|
|
|
|
|
|
|
|
import resolvelib
|
|
|
|
|
2020-08-08 09:59:55 +00:00
|
|
|
from mach_nix.data.nixpkgs import NixpkgsIndex
|
2020-10-25 18:09:37 +00:00
|
|
|
from mach_nix.data.providers import DependencyProviderBase, Candidate
|
|
|
|
from mach_nix.deptree import remove_circles_and_print
|
2020-04-22 09:28:58 +00:00
|
|
|
from mach_nix.requirements import Requirement
|
|
|
|
from mach_nix.resolver import Resolver, ResolvedPkg
|
2020-11-19 05:16:04 +00:00
|
|
|
from mach_nix.versions import filter_versions
|
2020-04-22 09:28:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
# Implement logic so the resolver understands the requirement format.
|
|
|
|
class Provider:
|
2020-08-08 09:59:55 +00:00
|
|
|
def __init__(self, nixpkgs: NixpkgsIndex, deps_db: DependencyProviderBase):
|
2020-04-22 09:28:58 +00:00
|
|
|
self.nixpkgs = nixpkgs
|
2020-10-25 18:09:37 +00:00
|
|
|
self.provider = deps_db
|
2020-04-22 09:28:58 +00:00
|
|
|
|
|
|
|
def get_extras_for(self, dependency):
|
2020-11-17 11:29:44 +00:00
|
|
|
# return selected extras
|
|
|
|
return tuple(sorted(dependency.selected_extras))
|
2020-04-22 09:28:58 +00:00
|
|
|
|
|
|
|
def get_base_requirement(self, candidate):
|
|
|
|
return Requirement("{}=={}".format(candidate.name, candidate.ver))
|
|
|
|
|
|
|
|
def identify(self, dependency):
|
|
|
|
return dependency.name
|
|
|
|
|
|
|
|
def get_preference(self, resolution, candidates, information):
|
|
|
|
return len(candidates)
|
|
|
|
|
|
|
|
def find_matches(self, req):
|
2020-10-25 18:09:37 +00:00
|
|
|
return self.provider.find_matches(req)
|
2020-04-22 09:28:58 +00:00
|
|
|
|
2020-10-25 18:09:37 +00:00
|
|
|
def is_satisfied_by(self, requirement, candidate: Candidate):
|
|
|
|
res = None
|
2020-11-17 11:29:44 +00:00
|
|
|
if not set(requirement.extras).issubset(set(candidate.selected_extras)):
|
2020-10-25 18:09:37 +00:00
|
|
|
res = False
|
|
|
|
res = bool(len(list(filter_versions([candidate.ver], requirement.specs))))
|
|
|
|
return res
|
2020-04-22 09:28:58 +00:00
|
|
|
|
|
|
|
def get_dependencies(self, candidate):
|
2020-10-25 18:09:37 +00:00
|
|
|
install_requires, setup_requires = self.provider.get_pkg_reqs(candidate)
|
2020-04-22 09:28:58 +00:00
|
|
|
deps = install_requires + setup_requires
|
|
|
|
return deps
|
|
|
|
|
|
|
|
|
|
|
|
class ResolvelibResolver(Resolver):
|
2020-08-08 09:59:55 +00:00
|
|
|
def __init__(self, nixpkgs: NixpkgsIndex, deps_provider: DependencyProviderBase):
|
2020-04-22 09:28:58 +00:00
|
|
|
self.nixpkgs = nixpkgs
|
2020-05-19 09:46:48 +00:00
|
|
|
self.deps_provider = deps_provider
|
2020-04-22 09:28:58 +00:00
|
|
|
|
2020-06-28 02:32:19 +00:00
|
|
|
def resolve(self, reqs: Iterable[Requirement]) -> List[ResolvedPkg]:
|
2020-04-22 09:28:58 +00:00
|
|
|
reporter = resolvelib.BaseReporter()
|
2020-05-19 09:46:48 +00:00
|
|
|
result = resolvelib.Resolver(Provider(self.nixpkgs, self.deps_provider), reporter).resolve(reqs, max_rounds=1000)
|
2020-04-22 09:28:58 +00:00
|
|
|
nix_py_pkgs = []
|
|
|
|
for name in result.graph._forwards.keys():
|
|
|
|
if name is None:
|
|
|
|
continue
|
2020-10-27 02:46:33 +00:00
|
|
|
candidate = result.mapping[name]
|
|
|
|
ver = candidate.ver
|
|
|
|
install_requires, setup_requires = self.deps_provider.get_pkg_reqs(candidate)
|
2020-05-19 09:46:48 +00:00
|
|
|
prop_build_inputs = list({req.key for req in install_requires})
|
2020-04-22 09:28:58 +00:00
|
|
|
build_inputs = list({req.key for req in setup_requires})
|
|
|
|
is_root = name in result.graph._forwards[None]
|
|
|
|
nix_py_pkgs.append(ResolvedPkg(
|
|
|
|
name=name,
|
|
|
|
ver=ver,
|
|
|
|
build_inputs=build_inputs,
|
|
|
|
prop_build_inputs=prop_build_inputs,
|
2020-05-19 09:46:48 +00:00
|
|
|
is_root=is_root,
|
2020-10-27 02:46:33 +00:00
|
|
|
provider_info=candidate.provider_info,
|
2020-11-17 11:29:44 +00:00
|
|
|
extras_selected=list(result.mapping[name].selected_extras),
|
2020-10-27 02:46:33 +00:00
|
|
|
build=candidate.build
|
2020-04-22 09:28:58 +00:00
|
|
|
))
|
2020-08-11 11:40:10 +00:00
|
|
|
remove_circles_and_print(nix_py_pkgs, self.nixpkgs)
|
2020-04-22 09:28:58 +00:00
|
|
|
return nix_py_pkgs
|