Add basic ctan support.

This commit is contained in:
Jelmer Vernooij 2021-04-02 01:51:10 +01:00
parent 0a4c6f9608
commit b4481b0a31
No known key found for this signature in database
GPG key ID: 579C160D4C9E23E8
2 changed files with 79 additions and 1 deletions

View file

@ -82,6 +82,15 @@ class PythonPackageRequirement(Requirement):
return p.returncode == 0
class LatexPackageRequirement(Requirement):
def __init__(self, package: str):
self.package = package
def __repr__(self):
return "%s(%r)" % (type(self).__name__, self.package)
class PhpPackageRequirement(Requirement):
def __init__(
self,

View file

@ -18,6 +18,7 @@
import logging
import subprocess
from .. import UnidentifiedError
from ..fix_build import run_detecting_problems
@ -68,7 +69,7 @@ class CPANResolver(Resolver):
continue
perlreqs.append(requirement)
if perlreqs:
yield (self._cmd(perlreqs), [perlreqs])
yield (self._cmd(perlreqs), perlreqs)
def install(self, requirements):
from ..requirements import PerlModuleRequirement
@ -101,6 +102,73 @@ class CPANResolver(Resolver):
raise UnsatisfiedRequirements(missing)
class TlmgrResolver(Resolver):
def __init__(self, session, repository: str, user_local=False):
self.session = session
self.user_local = user_local
self.repository = repository
def __str__(self):
if self.repository.startswith('http://') or self.repository.startswith('https://'):
return 'tlmgr(%r)' % self.repository
else:
return self.repository
def __repr__(self):
return "%s(%r, %r)" % (
type(self).__name__, self.session, self.repository)
def _cmd(self, reqs):
ret = ["tlmgr", "--repository=%s" % self.repository, "install"]
if self.user_local:
ret.append("--usermode")
ret.extend([req.package for req in reqs])
return ret
def explain(self, requirements):
from ..requirements import LatexPackageRequirement
latexreqs = []
for requirement in requirements:
if not isinstance(requirement, LatexPackageRequirement):
continue
latexreqs.append(requirement)
if latexreqs:
yield (self._cmd(latexreqs), latexreqs)
def install(self, requirements):
from ..requirements import LatexPackageRequirement
if not self.user_local:
user = "root"
else:
user = None
missing = []
for requirement in requirements:
if not isinstance(requirement, LatexPackageRequirement):
missing.append(requirement)
continue
cmd = self._cmd([requirement])
logging.info("tlmgr: running %r", cmd)
try:
run_detecting_problems(self.session, cmd, user=user)
except UnidentifiedError as e:
if "tlmgr: user mode not initialized, please read the documentation!" in e.lines:
self.session.check_call(['tlmgr', 'init-usertree'])
else:
raise
if missing:
raise UnsatisfiedRequirements(missing)
class CTANResolver(TlmgrResolver):
def __init__(self, session, user_local=False):
super(CTANResolver, self).__init__(
session, "ctan", user_local=user_local)
class RResolver(Resolver):
def __init__(self, session, repos, user_local=False):
self.session = session
@ -463,6 +531,7 @@ class StackedResolver(Resolver):
NATIVE_RESOLVER_CLS = [
CPANResolver,
CTANResolver,
PypiResolver,
NpmResolver,
GoResolver,