s3: add support for top level empty directories

This commit is contained in:
Mr. Outis
2019-11-29 11:46:28 -06:00
parent 6ad278f54c
commit 845cd352f7
2 changed files with 23 additions and 1 deletions
+12
View File
@@ -212,6 +212,15 @@ class RemoteS3(RemoteBASE):
fname = next(self._list_paths(path_info, max_items=1), "")
return path_info.path == fname or fname.startswith(dir_path.path)
def makedirs(self, path_info):
# We need to support creating empty directories, on S3, that means
# creating an object with an empty body and a trailing slash `/`.
#
# We are not creating directory objects for every parent prefix,
# it doesn't make sense.
dir_path = path_info / ""
self.s3.put_object(Bucket=path_info.bucket, Key=dir_path.path, Body="")
def isdir(self, path_info):
# S3 doesn't have a concept for directories.
#
@@ -271,4 +280,7 @@ class RemoteS3(RemoteBASE):
def walk_files(self, path_info, max_items=None):
for fname in self._list_paths(path_info, max_items):
if fname.endswith("/"):
continue
yield path_info.replace(path=fname)
+11 -1
View File
@@ -79,9 +79,11 @@ def test_walk_files(remote):
remote.path_info / "data/subdir/1",
remote.path_info / "data/subdir/2",
remote.path_info / "data/subdir/3",
remote.path_info / "empty_file",
remote.path_info / "foo",
]
assert list(remote.walk_files(remote.path_info / "data")) == files
assert list(remote.walk_files(remote.path_info)) == files
def test_copy_preserve_etag_across_buckets(remote):
@@ -99,3 +101,11 @@ def test_copy_preserve_etag_across_buckets(remote):
to_etag = RemoteS3.get_etag(s3, "another", "foo")
assert from_etag == to_etag
def makedirs(remote):
empty_dir = remote.path_info / "empty_dir"
remote.remove(empty_dir)
assert not remote.exists(empty_dir)
remote.makedirs(empty_dir)
assert remote.exists(empty_dir)