Support quiet mode for dist.

This commit is contained in:
Jelmer Vernooij 2021-03-01 18:20:21 +00:00
parent 354001c60a
commit 677358e0d5
No known key found for this signature in database
GPG key ID: 579C160D4C9E23E8
5 changed files with 79 additions and 28 deletions

View file

@ -58,7 +58,7 @@ class BuildSystem(object):
def __str__(self):
return self.name
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
raise NotImplementedError(self.dist)
def test(self, session, resolver, fixers):
@ -90,7 +90,7 @@ class Pear(BuildSystem):
def setup(self, resolver):
resolver.install([BinaryRequirement("pear")])
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
self.setup(resolver)
run_with_build_fixers(session, ["pear", "package"], fixers)
@ -111,13 +111,48 @@ class Pear(BuildSystem):
run_with_build_fixers(session, ["pear", "install", self.path], fixers)
# run_setup, but setting __name__
# Imported from Python's distutils.core, Copyright (C) PSF
def run_setup(script_name, script_args=None, stop_after="run"):
from distutils import core
import sys
if stop_after not in ('init', 'config', 'commandline', 'run'):
raise ValueError("invalid value for 'stop_after': %r" % (stop_after,))
core._setup_stop_after = stop_after
save_argv = sys.argv.copy()
g = {'__file__': script_name, '__name__': '__main__'}
try:
try:
sys.argv[0] = script_name
if script_args is not None:
sys.argv[1:] = script_args
with open(script_name, 'rb') as f:
exec(f.read(), g)
finally:
sys.argv = save_argv
core._setup_stop_after = None
except SystemExit:
# Hmm, should we do something if exiting with a non-zero code
# (ie. error)?
pass
if core._setup_distribution is None:
raise RuntimeError(("'distutils.core.setup()' was never called -- "
"perhaps '%s' is not a Distutils setup script?") % \
script_name)
return core._setup_distribution
class SetupPy(BuildSystem):
name = "setup.py"
def __init__(self, path):
self.path = path
from distutils.core import run_setup
# TODO(jelmer): Perhaps run this in session, so we can install
# missing dependencies?
try:
@ -163,9 +198,12 @@ class SetupPy(BuildSystem):
self.setup(resolver)
self._run_setup(session, resolver, ["build"], fixers)
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
self.setup(resolver)
self._run_setup(session, resolver, ["sdist"], fixers)
preargs = []
if quiet:
preargs.append('--quiet')
self._run_setup(session, resolver, preargs + ["sdist"], fixers)
def clean(self, session, resolver, fixers):
self.setup(resolver)
@ -230,7 +268,7 @@ class PyProject(BuildSystem):
with open(self.path, "r") as pf:
return toml.load(pf)
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
if "poetry" in self.pyproject.get("tool", []):
logging.debug(
"Found pyproject.toml with poetry section, "
@ -261,7 +299,7 @@ class SetupCfg(BuildSystem):
]
)
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
self.setup(resolver)
session.check_call(["python3", "-m", "pep517.build", "-s", "."])
@ -285,7 +323,7 @@ class Npm(BuildSystem):
def setup(self, resolver):
resolver.install([BinaryRequirement("npm")])
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
self.setup(resolver)
run_with_build_fixers(session, ["npm", "pack"], fixers)
@ -300,7 +338,7 @@ class Waf(BuildSystem):
def setup(self, session, resolver, fixers):
resolver.install([BinaryRequirement("python3")])
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
self.setup(session, resolver, fixers)
run_with_build_fixers(session, ["./waf", "dist"], fixers)
@ -319,7 +357,7 @@ class Gem(BuildSystem):
def setup(self, resolver):
resolver.install([BinaryRequirement("gem2deb")])
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
self.setup(resolver)
gemfiles = [
entry.name for entry in session.scandir(".") if entry.name.endswith(".gem")
@ -359,7 +397,7 @@ class DistInkt(BuildSystem):
]
)
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
self.setup(resolver)
if self.name == "dist-inkt":
resolver.install([PerlModuleRequirement(self.dist_inkt_class)])
@ -435,7 +473,7 @@ class Make(BuildSystem):
self.setup(session, resolver, fixers)
run_with_build_fixers(session, ["make", "install"], fixers)
def dist(self, session, resolver, fixers):
def dist(self, session, resolver, fixers, quiet=False):
self.setup(session, resolver, fixers)
try:
run_with_build_fixers(session, ["make", "dist"], fixers)

View file

@ -62,7 +62,7 @@ class AptManager(object):
def searchers(self):
if self._searchers is None:
self._searchers = [
RemoteAptContentsFileSearcher.from_session(self.session),
AptContentsFileSearcher.from_session(self.session),
GENERATED_FILE_SEARCHER]
return self._searchers
@ -106,7 +106,7 @@ class ContentsFileNotFound(Exception):
"""The contents file was not found."""
class RemoteAptContentsFileSearcher(FileSearcher):
class AptContentsFileSearcher(FileSearcher):
def __init__(self):
self._db = {}
@ -233,7 +233,7 @@ class RemoteAptContentsFileSearcher(FileSearcher):
response = self._get(url + ext)
except HTTPError as e:
if e.status == 404:
continue
continue
raise
break
else:

View file

@ -42,6 +42,7 @@ from debmutate.debhelper import (
)
from debmutate.deb822 import (
Deb822Editor,
PkgRelation,
)
from debmutate.reformatting import (
FormattingUnpreservable,
@ -144,16 +145,17 @@ def add_build_dependency(
try:
with ControlEditor(path=control_path) as updater:
for binary in updater.binaries:
if binary["Package"] == requirement.package:
raise CircularDependency(requirement.package)
updater.source["Build-Depends"] = ensure_relation(
updater.source.get("Build-Depends", ""),
requirement.relations)
if requirement.touches_package(binary["Package"]):
raise CircularDependency(binary["Package"])
for rel in requirement.relations:
updater.source["Build-Depends"] = ensure_relation(
updater.source.get("Build-Depends", ""),
PkgRelation.str([rel]))
except FormattingUnpreservable as e:
logging.info("Unable to edit %s in a way that preserves formatting.", e.path)
return False
desc = PkgRelation.str(requirement.relations)
desc = requirement.pkg_relation_str()
if not updater.changed:
logging.info("Giving up; dependency %s was already present.", desc)
@ -193,16 +195,17 @@ def add_test_dependency(
command_counter += 1
if name != testname:
continue
control["Depends"] = ensure_relation(
control.get("Depends", ""),
requirement.relations)
for rel in requirement.relations:
control["Depends"] = ensure_relation(
control.get("Depends", ""),
PkgRelation.str([rel]))
except FormattingUnpreservable as e:
logging.info("Unable to edit %s in a way that preserves formatting.", e.path)
return False
if not updater.changed:
return False
desc = PkgRelation.str(requirement.relations)
desc = requirement.pkg_relation_str()
logging.info("Adding dependency to test %s: %s", testname, desc)
return commit_debian_changes(
@ -240,7 +243,7 @@ def commit_debian_changes(
def targeted_python_versions(tree: Tree) -> Set[str]:
with tree.get_file("debian/control") as f:
control = Deb822(f)
build_depends = PkgRelation.parse_relations(control.get("Build-Depends", ""))
build_depends = PkgRelation.parse(control.get("Build-Depends", ""))
all_build_deps: Set[str] = set()
for or_deps in build_depends:
all_build_deps.update(or_dep["name"] for or_dep in or_deps)

View file

@ -63,13 +63,13 @@ class DistNoTarball(Exception):
"""Dist operation did not create a tarball."""
def run_dist(session, buildsystems, resolver, fixers):
def run_dist(session, buildsystems, resolver, fixers, quiet=False):
# Some things want to write to the user's home directory,
# e.g. pip caches in ~/.cache
session.create_home()
for buildsystem in buildsystems:
buildsystem.dist(session, resolver, fixers)
buildsystem.dist(session, resolver, fixers, quiet=quiet)
return
raise NoBuildToolsFound()

View file

@ -75,6 +75,16 @@ class AptRequirement(Requirement):
def from_str(cls, text):
return cls(PkgRelation.parse_relations(text))
def pkg_relation_str(self):
return PkgRelation.str(self.relations)
def touches_package(self, package):
for rel in self.relations:
for entry in rel:
if entry['name'] == package:
return True
return False
def get_package_for_python_package(apt_mgr, package, python_version, specs=None):
if python_version == "pypy":