source checkout fails when parent directory is not writable
Summary
If you look around here, you will notice that _stream.py:_source_checkout() incorrectly assumes that the parent directory of the destination is going to be writable. This is not a valid assumption and currently results in an ugly stacktrace when it happens:
Traceback (most recent call last):
File "/usr/bin/bst", line 10, in <module>
sys.exit(cli())
File "/usr/lib/python3.7/site-packages/click/core.py", line 764, in __call__
return self.main(*args, **kwargs)
File "/usr/lib/python3.7/site-packages/buildstream/_frontend/cli.py", line 195, in override_main
standalone_mode=standalone_mode, **extra)
File "/usr/lib/python3.7/site-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/usr/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/lib/python3.7/site-packages/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/lib/python3.7/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/usr/lib/python3.7/site-packages/click/decorators.py", line 27, in new_func
return f(get_current_context().obj, *args, **kwargs)
File "/usr/lib/python3.7/site-packages/buildstream/_frontend/cli.py", line 792, in source_checkout
include_build_scripts=build_scripts)
File "/usr/lib/python3.7/site-packages/buildstream/_stream.py", line 660, in source_checkout
fetch, tar, include_build_scripts)
File "/usr/lib/python3.7/site-packages/buildstream/_stream.py", line 1352, in _source_checkout
temp_source_dir = tempfile.TemporaryDirectory(dir=location_parent)
File "/usr/lib/python3.7/tempfile.py", line 788, in __init__
self.name = mkdtemp(suffix, prefix, dir)
File "/usr/lib/python3.7/tempfile.py", line 366, in mkdtemp
_os.mkdir(file, 0o700)
PermissionError: [Errno 13] Permission denied: '/tmpj050eb3g'
Steps to reproduce
- Find a BuildStream project to test against
- Pick your favorite element
- Run
bst source checkout ELEMENT DIRECTORY
where DIRECTORY is a location such that you have write permissions there but not for its parent.
What is the current bug behavior?
BuildStream throws a stack trace.
What is the expected correct behavior?
I get my sources correctly.
Edited by Chandan Singh