From c657df7b175b649947d919be6a1304b389ebca1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sun, 21 Mar 2021 18:12:43 +0000 Subject: [PATCH 1/4] Split out setup_vcs. --- ognibuild/buildsystem.py | 2 ++ ognibuild/dist.py | 23 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 6b8dc8d..57c294d 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -188,6 +188,7 @@ if core._setup_distribution is None: d = core._setup_distribution r = { + 'name': d.name, 'setup_requires': getattr(d, "setup_requires", []), 'install_requires': getattr(d, "install_requires", []), 'tests_require': getattr(d, "tests_require", []) or [], @@ -261,6 +262,7 @@ class SetupPy(BuildSystem): return None return { + 'name': d.name, 'setup_requires': getattr(d, "setup_requires", []), 'install_requires': getattr(d, "install_requires", []), 'tests_require': getattr(d, "tests_require", []) or [], diff --git a/ognibuild/dist.py b/ognibuild/dist.py index 25d2d84..d136ffa 100644 --- a/ognibuild/dist.py +++ b/ognibuild/dist.py @@ -35,6 +35,7 @@ from buildlog_consultant.common import ( from . import DetailedFailure from .buildsystem import NoBuildToolsFound +from .session import Session from .session.schroot import SchrootSession @@ -121,10 +122,10 @@ class DistCatcher(object): return False -def create_dist_schroot( +def create_dist( + session: Session, tree: Tree, target_dir: str, - chroot: str, packaging_tree: Optional[Tree] = None, include_controldir: bool = True, subdir: Optional[str] = None, @@ -135,7 +136,7 @@ def create_dist_schroot( if subdir is None: subdir = "package" - with SchrootSession(chroot) as session: + with session: if packaging_tree is not None: from .debian import satisfy_build_deps @@ -165,6 +166,22 @@ def create_dist_schroot( raise DistNoTarball() +def create_dist_schroot( + tree: Tree, + target_dir: str, + chroot: str, + packaging_tree: Optional[Tree] = None, + include_controldir: bool = True, + subdir: Optional[str] = None, +) -> str: + session = SchrootSession(chroot) + return create_dist( + session, tree, target_dir, + packaging_tree=packaging_tree, + include_controldir=include_controldir, + subdir=subdir) + + if __name__ == "__main__": import argparse import breezy.bzr # noqa: F401 From 45e0f797e460944f8e6ba97306a4f016ce61e906 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sun, 21 Mar 2021 18:48:24 +0000 Subject: [PATCH 2/4] Factor out create_dist. --- ognibuild/__init__.py | 1 - ognibuild/__main__.py | 1 - ognibuild/dist.py | 36 +++++++++++++++++++++++++++++------- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/ognibuild/__init__.py b/ognibuild/__init__.py index c7e0bc6..366f1f8 100644 --- a/ognibuild/__init__.py +++ b/ognibuild/__init__.py @@ -69,4 +69,3 @@ class UpstreamOutput(object): def get_declared_dependencies(self): raise NotImplementedError(self.get_declared_dependencies) - diff --git a/ognibuild/__main__.py b/ognibuild/__main__.py index ff876b1..78784f5 100644 --- a/ognibuild/__main__.py +++ b/ognibuild/__main__.py @@ -25,7 +25,6 @@ from .buildsystem import NoBuildToolsFound, detect_buildsystems from .resolver import ( auto_resolver, native_resolvers, - UnsatisfiedRequirements, ) from .resolver.apt import AptResolver diff --git a/ognibuild/dist.py b/ognibuild/dist.py index d136ffa..e71bb4b 100644 --- a/ognibuild/dist.py +++ b/ognibuild/dist.py @@ -15,6 +15,13 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +__all__ = [ + 'UnidentifiedError', + 'DetailedFailure', + 'create_dist', + 'create_dist_schroot', + ] + import errno import logging import os @@ -33,7 +40,7 @@ from buildlog_consultant.common import ( ) -from . import DetailedFailure +from . import DetailedFailure, UnidentifiedError from .buildsystem import NoBuildToolsFound from .session import Session from .session.schroot import SchrootSession @@ -129,7 +136,7 @@ def create_dist( packaging_tree: Optional[Tree] = None, include_controldir: bool = True, subdir: Optional[str] = None, -) -> str: +) -> Optional[str]: from .buildsystem import detect_buildsystems from .resolver.apt import AptResolver from .buildlog import InstallFixer @@ -158,9 +165,16 @@ def create_dist( session.chdir(reldir) run_dist(session, buildsystems, resolver, fixers) - for path in dc.files: - shutil.copy(path, target_dir) - return os.path.join(target_dir, os.path.basename(path)) + try: + for path in dc.files: + shutil.copy(path, target_dir) + return os.path.join(target_dir, os.path.basename(path)) + finally: + for path in dc.files: + if os.path.isdir(path): + shutil.rmtree(path) + else: + os.unlink(path) logging.info("No tarball created :(") raise DistNoTarball() @@ -173,7 +187,7 @@ def create_dist_schroot( packaging_tree: Optional[Tree] = None, include_controldir: bool = True, subdir: Optional[str] = None, -) -> str: +) -> Optional[str]: session = SchrootSession(chroot) return create_dist( session, tree, target_dir, @@ -239,6 +253,14 @@ if __name__ == "__main__": except NoBuildToolsFound: logging.info("No build tools found, falling back to simple export.") export(tree, "dist.tar.gz", "tgz", None) + except NotImplementedError: + logging.info("Build system does not support dist tarball creation, " + "falling back to simple export.") + export(tree, "dist.tar.gz", "tgz", None) + except UnidentifiedError as e: + logging.fatal('Unidentified error: %r', e.lines) + except DetailedFailure as e: + logging.fatal('Identified error during dist creation: %s', e.error) else: - print("Created %s" % ret) + logging.info("Created %s", ret) sys.exit(0) From c5a278729e48a18a7750d31678de473c33bf11b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sun, 21 Mar 2021 18:57:24 +0000 Subject: [PATCH 3/4] Use auto_resolver rather than apt resolver. --- ognibuild/dist.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ognibuild/dist.py b/ognibuild/dist.py index e71bb4b..b6ef916 100644 --- a/ognibuild/dist.py +++ b/ognibuild/dist.py @@ -42,6 +42,7 @@ from buildlog_consultant.common import ( from . import DetailedFailure, UnidentifiedError from .buildsystem import NoBuildToolsFound +from .resolver import auto_resolver from .session import Session from .session.schroot import SchrootSession @@ -138,7 +139,6 @@ def create_dist( subdir: Optional[str] = None, ) -> Optional[str]: from .buildsystem import detect_buildsystems - from .resolver.apt import AptResolver from .buildlog import InstallFixer if subdir is None: @@ -158,7 +158,7 @@ def create_dist( raise buildsystems = list(detect_buildsystems(export_directory)) - resolver = AptResolver.from_session(session) + resolver = auto_resolver(session) fixers = [InstallFixer(resolver)] with DistCatcher(export_directory) as dc: From 04c3a81b9e11f1d6b5a7fdfebbcc244c7a429767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sun, 21 Mar 2021 19:00:08 +0000 Subject: [PATCH 4/4] Make cleanup optional. --- ognibuild/dist.py | 76 +++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/ognibuild/dist.py b/ognibuild/dist.py index b6ef916..c57d5e6 100644 --- a/ognibuild/dist.py +++ b/ognibuild/dist.py @@ -129,6 +129,13 @@ class DistCatcher(object): self.find_files() return False + def cleanup(self): + for path in self.files: + if os.path.isdir(path): + shutil.rmtree(path) + else: + os.unlink(path) + def create_dist( session: Session, @@ -137,47 +144,44 @@ def create_dist( packaging_tree: Optional[Tree] = None, include_controldir: bool = True, subdir: Optional[str] = None, + cleanup: bool = False ) -> Optional[str]: from .buildsystem import detect_buildsystems from .buildlog import InstallFixer if subdir is None: subdir = "package" - with session: - if packaging_tree is not None: - from .debian import satisfy_build_deps + if packaging_tree is not None: + from .debian import satisfy_build_deps - satisfy_build_deps(session, packaging_tree) + satisfy_build_deps(session, packaging_tree) - try: - export_directory, reldir = session.setup_from_vcs( - tree, include_controldir=include_controldir, subdir=subdir) - except OSError as e: - if e.errno == errno.ENOSPC: - raise DetailedFailure(1, ["mkdtemp"], NoSpaceOnDevice()) - raise + try: + export_directory, reldir = session.setup_from_vcs( + tree, include_controldir=include_controldir, subdir=subdir) + except OSError as e: + if e.errno == errno.ENOSPC: + raise DetailedFailure(1, ["mkdtemp"], NoSpaceOnDevice()) + raise - buildsystems = list(detect_buildsystems(export_directory)) - resolver = auto_resolver(session) - fixers = [InstallFixer(resolver)] + buildsystems = list(detect_buildsystems(export_directory)) + resolver = auto_resolver(session) + fixers = [InstallFixer(resolver)] - with DistCatcher(export_directory) as dc: - session.chdir(reldir) - run_dist(session, buildsystems, resolver, fixers) + with DistCatcher(export_directory) as dc: + session.chdir(reldir) + run_dist(session, buildsystems, resolver, fixers) - try: - for path in dc.files: - shutil.copy(path, target_dir) - return os.path.join(target_dir, os.path.basename(path)) - finally: - for path in dc.files: - if os.path.isdir(path): - shutil.rmtree(path) - else: - os.unlink(path) + try: + for path in dc.files: + shutil.copy(path, target_dir) + return os.path.join(target_dir, os.path.basename(path)) + finally: + if cleanup: + dc.cleanup() - logging.info("No tarball created :(") - raise DistNoTarball() + logging.info("No tarball created :(") + raise DistNoTarball() def create_dist_schroot( @@ -187,13 +191,15 @@ def create_dist_schroot( packaging_tree: Optional[Tree] = None, include_controldir: bool = True, subdir: Optional[str] = None, + cleanup: bool = False ) -> Optional[str]: - session = SchrootSession(chroot) - return create_dist( - session, tree, target_dir, - packaging_tree=packaging_tree, - include_controldir=include_controldir, - subdir=subdir) + with SchrootSession(chroot) as session: + return create_dist( + session, tree, target_dir, + packaging_tree=packaging_tree, + include_controldir=include_controldir, + subdir=subdir, + cleanup=cleanup) if __name__ == "__main__":