summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildstream/storage/_filebaseddirectory.py7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/buildstream/storage/_filebaseddirectory.py b/src/buildstream/storage/_filebaseddirectory.py
index c492c41cd..a2708c4eb 100644
--- a/src/buildstream/storage/_filebaseddirectory.py
+++ b/src/buildstream/storage/_filebaseddirectory.py
@@ -268,6 +268,13 @@ class FileBasedDirectory(Directory):
if "r" in mode:
return open(newpath, mode=mode, encoding=encoding)
else:
+ if "x" in mode:
+ # This check is not atomic, however, we're operating with a
+ # single thread in a private directory tree.
+ if subdir.exists(path[-1]):
+ raise FileExistsError("{} already exists in {}".format(path[-1], str(subdir)))
+ mode = "w" + mode[1:]
+
return utils.save_file_atomic(newpath, mode=mode, encoding=encoding)
def __str__(self):