Non-empty read-only directories not handled during 'bst build' and others
It seems that non-empty read-only directories are not handled as expected.
If I construct a tar file like so:
mkdir files
touch files/{a,b}
chmod ugo-w files
tar cvf files.tar files
I cannot use it in an 'import' element as I would expect:
cat > tar.bst <<EOF
kind: import
description: Import shell
sources:
- kind: tar
url: file:///src/files.tar
base-dir: ''
EOF
bst track tar.bst
bst build tar.bst
The 'bst build' step fails. After re-creating the read-only directory, os.link
fails to create a link in it:
[--:--:--][991e5007][ main:tar.bst ] START Starting build
[--:--:--][991e5007][build:tar.bst ] START hello-buildstream/tar/991e5007-build.92.log
[--:--:--][991e5007][build:tar.bst ] START Staging sources
[00:00:00][991e5007][build:tar.bst ] SUCCESS Staging sources
[00:00:00][991e5007][build:tar.bst ] BUG hello-buildstream/tar/991e5007-build.92.log
An unhandled exception occured:
Traceback (most recent call last):
File "/src/buildstream/buildstream/_scheduler/job.py", line 265, in child_action
result = self.action(element)
File "/src/buildstream/buildstream/_scheduler/buildqueue.py", line 34, in process
element._assemble()
File "/src/buildstream/buildstream/element.py", line 1093, in _assemble
utils.link_files(collectdir, filesdir)
File "/src/buildstream/buildstream/utils.py", line 386, in link_files
_process_list(src, dest, files, safe_link, result, ignore_missing=ignore_missing)
File "/src/buildstream/buildstream/utils.py", line 553, in _process_list
actionfunc(srcpath, destpath, result=result)
File "/src/buildstream/buildstream/utils.py", line 250, in safe_link
os.link(src, dest)
PermissionError: [Errno 13] Permission denied: '/tmp/home/.cache/buildstream/build/tar-5djrnjyl/root/output/files/a' -> '/tmp/home/.cache/buildstream/build/tar-5djrnjyl/root/tmpwf74shc0/files/files/a'
If you do this as root user, it of course succeeds because root ignores permissions. Interestingly, a subsequent bst checkout
as root will fail with a similar error though. Perhaps it copies as user 'tomjon', and inside the sandbox.