summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@gmail.com>2014-10-29 18:14:15 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2014-10-30 15:12:17 +0000
commitaf63ece0a8db78bb5d0b7b67061b305d528fe993 (patch)
treefe39baa9811c84564bc60a7e66ca9c900d864224
parent64861f8dba8bd038c3ddfeb48dbef140a4332c6a (diff)
downloadmorph-af63ece0a8db78bb5d0b7b67061b305d528fe993.tar.gz
Make build commands use containerised_cmdline
-rw-r--r--morphlib/stagingarea.py45
1 files changed, 14 insertions, 31 deletions
diff --git a/morphlib/stagingarea.py b/morphlib/stagingarea.py
index 25e33b3f..8a9faca6 100644
--- a/morphlib/stagingarea.py
+++ b/morphlib/stagingarea.py
@@ -267,16 +267,11 @@ class StagingArea(object):
def runcmd(self, argv, **kwargs): # pragma: no cover
'''Run a command in a chroot in the staging area.'''
assert 'env' not in kwargs
- kwargs['env'] = self.env
+ kwargs['env'] = dict(self.env)
if 'extra_env' in kwargs:
kwargs['env'].update(kwargs['extra_env'])
del kwargs['extra_env']
- if 'cwd' in kwargs:
- cwd = kwargs['cwd']
- del kwargs['cwd']
- else:
- cwd = '/'
ccache_dir = kwargs.pop('ccache_dir', None)
chroot_dir = self.dirname if self.use_chroot else '/'
@@ -289,40 +284,28 @@ class StagingArea(object):
for d in staging_dirs]
if not self.use_chroot:
do_not_mount_dirs += [temp_dir]
-
logging.debug("Not mounting dirs %r" % do_not_mount_dirs)
- real_argv = ['linux-user-chroot', '--chdir', cwd, '--unshare-net']
- for d in morphlib.fsutils.invert_paths(os.walk(chroot_dir),
- do_not_mount_dirs):
- if not os.path.islink(d):
- real_argv += ['--mount-readonly', self.relative(d)]
-
- if self.use_chroot:
- proc_target = os.path.join(self.dirname, 'proc')
- if not os.path.exists(proc_target):
- os.makedirs(proc_target)
- real_argv += ['--mount-proc', self.relative(proc_target)]
-
+ mount_proc = self.use_chroot
if ccache_dir and not self._app.settings['no-ccache']:
ccache_target = os.path.join(
self.dirname, kwargs['env']['CCACHE_DIR'].lstrip('/'))
- real_argv += ['--mount-bind', ccache_dir,
- self.relative(ccache_target)]
-
- real_argv += [chroot_dir]
-
- real_argv += argv
+ binds = ((ccache_dir, ccache_target),)
+ else:
+ binds = ()
+ cmdline = morphlib.util.containerised_cmdline(
+ argv, cwd=kwargs.pop('cwd', '/'),
+ root=chroot_dir, mounts=self.to_mount,
+ binds=binds, mount_proc=mount_proc,
+ writable_paths=do_not_mount_dirs)
try:
- if 'logfile' in kwargs and kwargs['logfile'] != None:
- logfile = kwargs['logfile']
- del kwargs['logfile']
-
+ if kwargs.get('logfile') != None:
+ logfile = kwargs.pop('logfile')
teecmd = ['tee', '-a', logfile]
- return self._app.runcmd(real_argv, teecmd, **kwargs)
+ return self._app.runcmd(cmdline, teecmd, **kwargs)
else:
- return self._app.runcmd(real_argv, **kwargs)
+ return self._app.runcmd(cmdline, **kwargs)
except cliapp.AppException as e:
raise cliapp.AppException('In staging area %s: running '
'command \'%s\' failed.' %