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