richardmaw-codethink pushed to branch richardmaw/subprocess-PWD at BuildStream / buildstream
Commits:
-
5b09dac7
by Richard Maw at 2018-09-06T09:11:14Z
3 changed files:
- buildstream/sandbox/_sandboxbwrap.py
- buildstream/sandbox/_sandboxchroot.py
- tests/testutils/repo/git.py
Changes:
... | ... | @@ -69,6 +69,15 @@ class SandboxBwrap(Sandbox): |
69 | 69 |
if env is None:
|
70 | 70 |
env = self._get_environment()
|
71 | 71 |
|
72 |
+ if cwd is None:
|
|
73 |
+ cwd = '/'
|
|
74 |
+ |
|
75 |
+ # Naive getcwd implementations can break when bind-mounts to different
|
|
76 |
+ # paths on the same filesystem are present. Letting the command know
|
|
77 |
+ # what directory it is in makes it unnecessary to call the faulty
|
|
78 |
+ # getcwd.
|
|
79 |
+ env['PWD'] = cwd
|
|
80 |
+ |
|
72 | 81 |
if not self._has_command(command[0], env):
|
73 | 82 |
raise SandboxError("Staged artifacts do not provide command "
|
74 | 83 |
"'{}'".format(command[0]),
|
... | ... | @@ -83,9 +92,6 @@ class SandboxBwrap(Sandbox): |
83 | 92 |
mount_map = MountMap(self, flags & SandboxFlags.ROOT_READ_ONLY)
|
84 | 93 |
root_mount_source = mount_map.get_mount_source('/')
|
85 | 94 |
|
86 |
- if cwd is None:
|
|
87 |
- cwd = '/'
|
|
88 |
- |
|
89 | 95 |
# Grab the full path of the bwrap binary
|
90 | 96 |
bwrap_command = [utils.get_host_tool('bwrap')]
|
91 | 97 |
|
... | ... | @@ -58,6 +58,12 @@ class SandboxChroot(Sandbox): |
58 | 58 |
if env is None:
|
59 | 59 |
env = self._get_environment()
|
60 | 60 |
|
61 |
+ # Naive getcwd implementations can break when bind-mounts to different
|
|
62 |
+ # paths on the same filesystem are present. Letting the command know
|
|
63 |
+ # what directory it is in makes it unnecessary to call the faulty
|
|
64 |
+ # getcwd.
|
|
65 |
+ env['PWD'] = cwd
|
|
66 |
+ |
|
61 | 67 |
if not self._has_command(command[0], env):
|
62 | 68 |
raise SandboxError("Staged artifacts do not provide command "
|
63 | 69 |
"'{}'".format(command[0]),
|
... | ... | @@ -26,24 +26,30 @@ class Git(Repo): |
26 | 26 |
|
27 | 27 |
super(Git, self).__init__(directory, subdir)
|
28 | 28 |
|
29 |
+ def _run_git(self, *args, **kwargs):
|
|
30 |
+ argv = ['git']
|
|
31 |
+ argv.extend(args)
|
|
32 |
+ if 'env' not in kwargs:
|
|
33 |
+ kwargs['env'] = dict(GIT_ENV, PWD=self.repo)
|
|
34 |
+ kwargs.setdefault('cwd', self.repo)
|
|
35 |
+ kwargs.setdefault('check', True)
|
|
36 |
+ return subprocess.run(argv, **kwargs)
|
|
37 |
+ |
|
29 | 38 |
def create(self, directory):
|
30 | 39 |
self.copy_directory(directory, self.repo)
|
31 |
- subprocess.call(['git', 'init', '.'], env=GIT_ENV, cwd=self.repo)
|
|
32 |
- subprocess.call(['git', 'add', '.'], env=GIT_ENV, cwd=self.repo)
|
|
33 |
- subprocess.call(['git', 'commit', '-m', 'Initial commit'], env=GIT_ENV, cwd=self.repo)
|
|
40 |
+ self._run_git('init', '.')
|
|
41 |
+ self._run_git('add', '.')
|
|
42 |
+ self._run_git('commit', '-m', 'Initial commit')
|
|
34 | 43 |
return self.latest_commit()
|
35 | 44 |
|
36 | 45 |
def add_commit(self):
|
37 |
- subprocess.call(['git', 'commit', '--allow-empty', '-m', 'Additional commit'],
|
|
38 |
- env=GIT_ENV, cwd=self.repo)
|
|
46 |
+ self._run_git('commit', '--allow-empty', '-m', 'Additional commit')
|
|
39 | 47 |
return self.latest_commit()
|
40 | 48 |
|
41 | 49 |
def add_file(self, filename):
|
42 | 50 |
shutil.copy(filename, self.repo)
|
43 |
- subprocess.call(['git', 'add', os.path.basename(filename)], env=GIT_ENV, cwd=self.repo)
|
|
44 |
- subprocess.call([
|
|
45 |
- 'git', 'commit', '-m', 'Added {}'.format(os.path.basename(filename))
|
|
46 |
- ], env=GIT_ENV, cwd=self.repo)
|
|
51 |
+ self._run_git('add', os.path.basename(filename))
|
|
52 |
+ self._run_git('commit', '-m', 'Added {}'.format(os.path.basename(filename)))
|
|
47 | 53 |
return self.latest_commit()
|
48 | 54 |
|
49 | 55 |
def add_submodule(self, subdir, url=None, checkout=None):
|
... | ... | @@ -53,8 +59,8 @@ class Git(Repo): |
53 | 59 |
if url is not None:
|
54 | 60 |
submodule['url'] = url
|
55 | 61 |
self.submodules[subdir] = submodule
|
56 |
- subprocess.call(['git', 'submodule', 'add', url, subdir], env=GIT_ENV, cwd=self.repo)
|
|
57 |
- subprocess.call(['git', 'commit', '-m', 'Added the submodule'], env=GIT_ENV, cwd=self.repo)
|
|
62 |
+ self._run_git('submodule', 'add', url, subdir)
|
|
63 |
+ self._run_git('commit', '-m', 'Added the submodule')
|
|
58 | 64 |
return self.latest_commit()
|
59 | 65 |
|
60 | 66 |
def source_config(self, ref=None, checkout_submodules=None):
|
... | ... | @@ -74,10 +80,8 @@ class Git(Repo): |
74 | 80 |
return config
|
75 | 81 |
|
76 | 82 |
def latest_commit(self):
|
77 |
- output = subprocess.check_output([
|
|
78 |
- 'git', 'rev-parse', 'master'
|
|
79 |
- ], env=GIT_ENV, cwd=self.repo)
|
|
83 |
+ output = self._run_git('rev-parse', 'master', stdout=subprocess.PIPE).stdout
|
|
80 | 84 |
return output.decode('UTF-8').strip()
|
81 | 85 |
|
82 | 86 |
def branch(self, branch_name):
|
83 |
- subprocess.call(['git', 'checkout', '-b', branch_name], env=GIT_ENV, cwd=self.repo)
|
|
87 |
+ self._run_git('checkout', '-b', branch_name)
|