Add code for exporting.

This commit is contained in:
Jelmer Vernooij 2021-03-17 14:15:54 +00:00
parent 9792ddb865
commit cc85d9d7a3
No known key found for this signature in database
GPG key ID: 579C160D4C9E23E8
6 changed files with 57 additions and 19 deletions

View file

@ -154,6 +154,10 @@ def main(): # noqa: C901
session = PlainSession() session = PlainSession()
with session: 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": if args.resolve == "apt":
resolver = AptResolver.from_session(session) resolver = AptResolver.from_session(session)
elif args.resolve == "native": elif args.resolve == "native":
@ -161,7 +165,6 @@ def main(): # noqa: C901
elif args.resolve == "auto": elif args.resolve == "auto":
resolver = auto_resolver(session, explain=args.explain) resolver = auto_resolver(session, explain=args.explain)
logging.info("Using requirement resolver: %s", resolver) logging.info("Using requirement resolver: %s", resolver)
os.chdir(args.directory)
try: try:
bss = list(detect_buildsystems(args.directory)) bss = list(detect_buildsystems(args.directory))
logging.info( logging.info(

View file

@ -174,13 +174,7 @@ class SetupPy(BuildSystem):
return "%s(%r)" % (type(self).__name__, self.path) return "%s(%r)" % (type(self).__name__, self.path)
def setup(self, resolver): def setup(self, resolver):
with open(self.path, "r") as f: pass
setup_py_contents = f.read()
try:
with open("setup.cfg", "r") as f:
setup_cfg_contents = f.read()
except FileNotFoundError:
setup_cfg_contents = ""
def test(self, session, resolver, fixers): def test(self, session, resolver, fixers):
self.setup(resolver) self.setup(resolver)

View file

@ -155,13 +155,8 @@ def create_dist_schroot(
fixers = [InstallFixer(resolver)] fixers = [InstallFixer(resolver)]
with DistCatcher(export_directory) as dc: with DistCatcher(export_directory) as dc:
oldcwd = os.getcwd() session.chdir(reldir)
os.chdir(export_directory) run_dist(session, buildsystems, resolver, fixers)
try:
session.chdir(os.path.join(reldir, subdir))
run_dist(session, buildsystems, resolver, fixers)
finally:
os.chdir(oldcwd)
for path in dc.files: for path in dc.files:
shutil.copy(path, target_dir) shutil.copy(path, target_dir)

View file

@ -16,7 +16,7 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # 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 sys
import subprocess import subprocess
@ -74,6 +74,14 @@ class Session(object):
def scandir(self, path: str): def scandir(self, path: str):
raise NotImplementedError(self.scandir) 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): class SessionSetupFailure(Exception):
"""Session failed to be set up.""" """Session failed to be set up."""

View file

@ -18,8 +18,10 @@
from . import Session from . import Session
import contextlib
import os import os
import subprocess import subprocess
import tempfile
from typing import Optional, Dict, List from typing import Optional, Dict, List
@ -38,6 +40,15 @@ class PlainSession(Session):
def __repr__(self): def __repr__(self):
return "%s()" % (type(self).__name__, ) 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): def create_home(self):
pass pass
@ -69,3 +80,21 @@ class PlainSession(Session):
def chdir(self, path): def chdir(self, path):
os.chdir(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

View file

@ -170,13 +170,13 @@ class SchrootSession(Session):
return os.scandir(fullpath) return os.scandir(fullpath)
def setup_from_vcs( 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 from ..vcs import dupe_vcs_tree, export_vcs_tree
build_dir = os.path.join(self.location, "build") build_dir = os.path.join(self.location, "build")
directory = tempfile.mkdtemp(dir=build_dir) directory = tempfile.mkdtemp(dir=build_dir)
reldir = "/" + os.path.relpath(directory, self.location) reldir = "/" + os.path.relpath(directory, self.location)
os.chdir(reldir)
export_directory = os.path.join(directory, subdir) export_directory = os.path.join(directory, subdir)
if not include_controldir: if not include_controldir:
@ -184,4 +184,13 @@ class SchrootSession(Session):
else: else:
dupe_vcs_tree(tree, export_directory) 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)