From 677358e0d56d4b8da9d077c6b5196eefe63947c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Mon, 1 Mar 2021 18:20:21 +0000 Subject: [PATCH] Support quiet mode for dist. --- ognibuild/buildsystem.py | 62 ++++++++++++++++++++++++++++------- ognibuild/debian/apt.py | 6 ++-- ognibuild/debian/fix_build.py | 25 +++++++------- ognibuild/dist.py | 4 +-- ognibuild/resolver/apt.py | 10 ++++++ 5 files changed, 79 insertions(+), 28 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 2848f18..dbf52d4 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -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) diff --git a/ognibuild/debian/apt.py b/ognibuild/debian/apt.py index 4ff00c1..677947a 100644 --- a/ognibuild/debian/apt.py +++ b/ognibuild/debian/apt.py @@ -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: diff --git a/ognibuild/debian/fix_build.py b/ognibuild/debian/fix_build.py index 1d4b336..b0ced37 100644 --- a/ognibuild/debian/fix_build.py +++ b/ognibuild/debian/fix_build.py @@ -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) diff --git a/ognibuild/dist.py b/ognibuild/dist.py index 9c97e0e..730f38d 100644 --- a/ognibuild/dist.py +++ b/ognibuild/dist.py @@ -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() diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index 8648700..d7d543d 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -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":