diff --git a/ognibuild/__main__.py b/ognibuild/__main__.py index e0bed9c..f9a5fc6 100644 --- a/ognibuild/__main__.py +++ b/ognibuild/__main__.py @@ -154,6 +154,10 @@ def main(): # noqa: C901 session = PlainSession() with session: + logging.info("Preparing directory %s", args.directory) + external_dir, internal_dir = session.setup_from_directory(args.directory) + session.chdir(internal_dir) + os.chdir(external_dir) if args.resolve == "apt": resolver = AptResolver.from_session(session) elif args.resolve == "native": @@ -161,7 +165,6 @@ def main(): # noqa: C901 elif args.resolve == "auto": resolver = auto_resolver(session, explain=args.explain) logging.info("Using requirement resolver: %s", resolver) - os.chdir(args.directory) try: bss = list(detect_buildsystems(args.directory)) logging.info( diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index c366ba8..532c841 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -174,13 +174,7 @@ class SetupPy(BuildSystem): return "%s(%r)" % (type(self).__name__, self.path) def setup(self, resolver): - with open(self.path, "r") as f: - setup_py_contents = f.read() - try: - with open("setup.cfg", "r") as f: - setup_cfg_contents = f.read() - except FileNotFoundError: - setup_cfg_contents = "" + pass def test(self, session, resolver, fixers): self.setup(resolver) diff --git a/ognibuild/dist.py b/ognibuild/dist.py index 578ee05..c094230 100644 --- a/ognibuild/dist.py +++ b/ognibuild/dist.py @@ -155,13 +155,8 @@ def create_dist_schroot( fixers = [InstallFixer(resolver)] with DistCatcher(export_directory) as dc: - oldcwd = os.getcwd() - os.chdir(export_directory) - try: - session.chdir(os.path.join(reldir, subdir)) - run_dist(session, buildsystems, resolver, fixers) - finally: - os.chdir(oldcwd) + session.chdir(reldir) + run_dist(session, buildsystems, resolver, fixers) for path in dc.files: shutil.copy(path, target_dir) diff --git a/ognibuild/session/__init__.py b/ognibuild/session/__init__.py index cebe227..aa93f29 100644 --- a/ognibuild/session/__init__.py +++ b/ognibuild/session/__init__.py @@ -16,7 +16,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -from typing import Optional, List, Dict +from typing import Optional, List, Dict, Tuple import sys import subprocess @@ -74,6 +74,14 @@ class Session(object): def scandir(self, path: str): raise NotImplementedError(self.scandir) + def setup_from_vcs( + self, tree, include_controldir: Optional[bool] = None, + subdir="package") -> Tuple[str, str]: + raise NotImplementedError(self.setup_from_vcs) + + def setup_from_directory(self, path, subdir="package") -> Tuple[str, str]: + raise NotImplementedError(self.setup_from_directory) + class SessionSetupFailure(Exception): """Session failed to be set up.""" diff --git a/ognibuild/session/plain.py b/ognibuild/session/plain.py index 74d28d0..58cdfb7 100644 --- a/ognibuild/session/plain.py +++ b/ognibuild/session/plain.py @@ -18,8 +18,10 @@ from . import Session +import contextlib import os import subprocess +import tempfile from typing import Optional, Dict, List @@ -38,6 +40,15 @@ class PlainSession(Session): def __repr__(self): return "%s()" % (type(self).__name__, ) + def __enter__(self) -> "Session": + self.es = contextlib.ExitStack() + self.es.__enter__() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.es.__exit__(exc_type, exc_val, exc_tb) + return False + def create_home(self): pass @@ -69,3 +80,21 @@ class PlainSession(Session): def chdir(self, path): os.chdir(path) + + def setup_from_vcs( + self, tree, include_controldir=None, subdir="package"): + from ..vcs import dupe_vcs_tree, export_vcs_tree + if include_controldir is False or ( + not hasattr(tree, 'base') and include_controldir is None): + td = self.es.enter_context(tempfile.TemporaryDirectory()) + export_vcs_tree(tree, td) + return td, td + elif not hasattr(tree, 'base'): + td = self.es.enter_context(tempfile.TemporaryDirectory()) + dupe_vcs_tree(tree, td) + return td, td + else: + return tree.base, tree.base + + def setup_from_directory(self, path): + return path, path diff --git a/ognibuild/session/schroot.py b/ognibuild/session/schroot.py index ba1a281..6e8c236 100644 --- a/ognibuild/session/schroot.py +++ b/ognibuild/session/schroot.py @@ -170,13 +170,13 @@ class SchrootSession(Session): return os.scandir(fullpath) def setup_from_vcs( - self, tree, include_controldir=False, subdir="package"): + self, tree, include_controldir: Optional[bool] = None, + subdir="package"): from ..vcs import dupe_vcs_tree, export_vcs_tree build_dir = os.path.join(self.location, "build") directory = tempfile.mkdtemp(dir=build_dir) reldir = "/" + os.path.relpath(directory, self.location) - os.chdir(reldir) export_directory = os.path.join(directory, subdir) if not include_controldir: @@ -184,4 +184,13 @@ class SchrootSession(Session): else: dupe_vcs_tree(tree, export_directory) - return export_directory, reldir + return export_directory, os.path.join(reldir, subdir) + + def setup_from_directory(self, path, subdir="package"): + import shutil + build_dir = os.path.join(self.location, "build") + directory = tempfile.mkdtemp(dir=build_dir) + reldir = "/" + os.path.relpath(directory, self.location) + export_directory = os.path.join(directory, subdir) + shutil.copytree(path, export_directory, dirs_exist_ok=True) + return export_directory, os.path.join(reldir, subdir)