Always close files when creating collection

If an exception occurs we rely on garbage collection to close the files.
This commit is contained in:
Unrud 2017-03-07 17:56:52 +01:00
parent 9900251b8b
commit 9b27d075b6

View File

@ -25,6 +25,7 @@ entry.
"""
import contextlib
import errno
import json
import os
@ -583,17 +584,18 @@ class Collection(BaseCollection):
uploads them nonatomic and without existence checks.
"""
fs = []
for href, item in vobject_items.items():
if not is_safe_filesystem_path_component(href):
raise UnsafePathError(href)
path = path_to_filesystem(self._filesystem_path, href)
fs.append(open(path, "w", encoding=self.encoding, newline=""))
fs[-1].write(item.serialize())
# sync everything at once because it's slightly faster.
for f in fs:
self._fsync(f.fileno())
f.close()
with contextlib.ExitStack() as stack:
fs = []
for href, item in vobject_items.items():
if not is_safe_filesystem_path_component(href):
raise UnsafePathError(href)
path = path_to_filesystem(self._filesystem_path, href)
fs.append(stack.enter_context(
open(path, "w", encoding=self.encoding, newline="")))
fs[-1].write(item.serialize())
# sync everything at once because it's slightly faster.
for f in fs:
self._fsync(f.fileno())
self._sync_directory(self._filesystem_path)
@classmethod