Check requirements before.

This commit is contained in:
Jelmer Vernooij 2021-03-02 03:22:25 +00:00
parent 52e119022b
commit dd015abd4a
No known key found for this signature in database
GPG key ID: 579C160D4C9E23E8
5 changed files with 72 additions and 9 deletions

View file

@ -35,8 +35,8 @@ def get_necessary_declared_requirements(resolver, requirements, stages):
return missing return missing
def install_necessary_declared_requirements(resolver, buildsystem, stages): def install_necessary_declared_requirements(session, resolver, buildsystem, stages):
missing = [] relevant = []
try: try:
declared_reqs = list(buildsystem.get_declared_dependencies()) declared_reqs = list(buildsystem.get_declared_dependencies())
except NotImplementedError: except NotImplementedError:
@ -44,10 +44,18 @@ def install_necessary_declared_requirements(resolver, buildsystem, stages):
"Unable to determine declared dependencies from %s", buildsystem "Unable to determine declared dependencies from %s", buildsystem
) )
else: else:
missing.extend( relevant.extend(
get_necessary_declared_requirements(resolver, declared_reqs, stages) get_necessary_declared_requirements(resolver, declared_reqs, stages)
) )
resolver.install(missing) missing = []
for req in relevant:
try:
if not req.met(session):
missing.append(req)
except NotImplementedError:
missing.append(req)
if missing:
resolver.install(missing)
# Types of dependencies: # Types of dependencies:
@ -141,7 +149,7 @@ def main(): # noqa: C901
if stages: if stages:
logging.info("Checking that declared requirements are present") logging.info("Checking that declared requirements are present")
for bs in bss: for bs in bss:
install_necessary_declared_requirements(resolver, bs, stages) install_necessary_declared_requirements(session, resolver, bs, stages)
fixers = determine_fixers(session, resolver) fixers = determine_fixers(session, resolver)
if args.subcommand == "dist": if args.subcommand == "dist":
from .dist import run_dist from .dist import run_dist

View file

@ -120,7 +120,7 @@ def problem_to_upstream_requirement(problem): # noqa: C901
elif isinstance(problem, MissingJavaClass): elif isinstance(problem, MissingJavaClass):
return JavaClassRequirement(problem.classname) return JavaClassRequirement(problem.classname)
elif isinstance(problem, MissingHaskellDependencies): elif isinstance(problem, MissingHaskellDependencies):
return [HaskellPackageRequirement(dep) for dep in problem.deps] return [HaskellPackageRequirement.from_string(dep) for dep in problem.deps]
elif isinstance(problem, MissingMavenArtifacts): elif isinstance(problem, MissingMavenArtifacts):
return [MavenArtifactRequirement(artifact) for artifact in problem.artifacts] return [MavenArtifactRequirement(artifact) for artifact in problem.artifacts]
elif isinstance(problem, MissingCSharpCompiler): elif isinstance(problem, MissingCSharpCompiler):

View file

@ -633,6 +633,9 @@ class Cabal(BuildSystem):
def test(self, session, resolver, fixers): def test(self, session, resolver, fixers):
self._run(session, ["test"], fixers) self._run(session, ["test"], fixers)
def dist(self, session, resolver, fixers, quiet=False):
self._run(session, ["sdist"], fixers)
def detect_buildsystems(path, trust_package=False): # noqa: C901 def detect_buildsystems(path, trust_package=False): # noqa: C901
"""Detect build systems.""" """Detect build systems."""

View file

@ -17,6 +17,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
import posixpath import posixpath
import subprocess
from typing import Optional, List, Tuple from typing import Optional, List, Tuple
from . import Requirement from . import Requirement
@ -55,6 +56,26 @@ class PythonPackageRequirement(Requirement):
req = Requirement.parse(text) req = Requirement.parse(text)
return cls(package=req.name, specs=req.specs) return cls(package=req.name, specs=req.specs)
def met(self, session):
if self.python_version == "cpython3":
cmd = "python3"
elif self.python_version == "cpython2":
cmd = "python2"
elif self.python_version == "pypy":
cmd = "pypy"
elif self.python_version == "pypy3":
cmd = "pypy3"
elif self.python_version is None:
cmd = "python3"
else:
raise NotImplementedError
text = self.package + ','.join([''.join(spec) for spec in self.specs])
p = session.Popen(
[cmd, "-c", "import pkg_resources; pkg_resources.require(%r)" % text],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
p.communicate()
return p.returncode == 0
class BinaryRequirement(Requirement): class BinaryRequirement(Requirement):
@ -64,6 +85,13 @@ class BinaryRequirement(Requirement):
super(BinaryRequirement, self).__init__("binary") super(BinaryRequirement, self).__init__("binary")
self.binary_name = binary_name self.binary_name = binary_name
def met(self, session):
p = session.Popen(
["which", self.binary_name], stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL)
p.communicate()
return p.returncode == 0
class PerlModuleRequirement(Requirement): class PerlModuleRequirement(Requirement):
@ -250,9 +278,15 @@ class HaskellPackageRequirement(Requirement):
package: str package: str
def __init__(self, package: str): def __init__(self, package: str, specs=None):
super(HaskellPackageRequirement, self).__init__("haskell-package") super(HaskellPackageRequirement, self).__init__("haskell-package")
self.package = package self.package = package
self.specs = specs
@classmethod
def from_string(cls, text):
parts = text.split()
return cls(parts[0], specs=parts[1:])
class MavenArtifactRequirement(Requirement): class MavenArtifactRequirement(Requirement):
@ -312,3 +346,22 @@ class PythonModuleRequirement(Requirement):
super(PythonModuleRequirement, self).__init__("python-module") super(PythonModuleRequirement, self).__init__("python-module")
self.python_version = python_version self.python_version = python_version
self.minimum_version = minimum_version self.minimum_version = minimum_version
def met(self, session):
if self.python_version == "cpython3":
cmd = "python3"
elif self.python_version == "cpython2":
cmd = "python2"
elif self.python_version == "pypy":
cmd = "pypy"
elif self.python_version == "pypy3":
cmd = "pypy3"
elif self.python_version is None:
cmd = "python3"
else:
raise NotImplementedError
p = session.Popen(
[cmd, "-c", "import %s" % self.module],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
p.communicate()
return p.returncode == 0

View file

@ -56,7 +56,6 @@ class CPANResolver(Resolver):
# TODO(jelmer): Specify -T to skip tests? # TODO(jelmer): Specify -T to skip tests?
self.session.check_call( self.session.check_call(
["cpan", "-i", requirement.module], ["cpan", "-i", requirement.module],
user="root",
env={"PERL_MM_USE_DEFAULT": "1"}, env={"PERL_MM_USE_DEFAULT": "1"},
) )
if missing: if missing:
@ -85,7 +84,7 @@ class HackageResolver(Resolver):
missing.append(requirement) missing.append(requirement)
continue continue
self.session.check_call( self.session.check_call(
["cabal", "install", requirement.package], user="root" ["cabal", "install", requirement.package]
) )
if missing: if missing:
raise UnsatisfiedRequirements(missing) raise UnsatisfiedRequirements(missing)