Skip to content

Commit c8ce8a5

Browse files
authored
Merge pull request #403 from matteofigus/master
Return version_id even if file is empty
2 parents 1f8e716 + 8e0dcd5 commit c8ce8a5

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

s3fs/core.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -718,10 +718,13 @@ def touch(self, path, truncate=True, data=None, **kwargs):
718718
if not truncate and self.exists(path):
719719
raise ValueError("S3 does not support touching existent files")
720720
try:
721-
self.call_s3(self.s3.put_object, kwargs, Bucket=bucket, Key=key)
721+
write_result = self.call_s3(
722+
self.s3.put_object, kwargs, Bucket=bucket, Key=key
723+
)
722724
except ClientError as ex:
723725
raise translate_boto_error(ex) from ex
724726
self.invalidate_cache(self._parent(path))
727+
return write_result
725728

726729
async def _cat_file(self, path, version_id=None, start=None, end=None):
727730
bucket, key, vers = self.split_path(path)
@@ -1707,7 +1710,7 @@ def commit(self):
17071710
if self.buffer is not None:
17081711
logger.debug("Empty file committed %s" % self)
17091712
self._abort_mpu()
1710-
self.fs.touch(self.path)
1713+
write_result = self.fs.touch(self.path)
17111714
elif not self.parts:
17121715
if self.buffer is not None:
17131716
logger.debug("One-shot upload of %s" % self)
@@ -1720,8 +1723,6 @@ def commit(self):
17201723
Body=data,
17211724
**self.kwargs,
17221725
)
1723-
if self.fs.version_aware:
1724-
self.version_id = write_result.get("VersionId")
17251726
else:
17261727
raise RuntimeError
17271728
else:
@@ -1734,9 +1735,9 @@ def commit(self):
17341735
UploadId=self.mpu["UploadId"],
17351736
MultipartUpload=part_info,
17361737
)
1737-
if self.fs.version_aware:
1738-
self.version_id = write_result.get("VersionId")
17391738

1739+
if self.fs.version_aware:
1740+
self.version_id = write_result.get("VersionId")
17401741
# complex cache invalidation, since file's appearance can cause several
17411742
# directories
17421743
self.buffer = None

s3fs/tests/test_s3fs.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,6 +1544,35 @@ def test_touch(s3):
15441544
assert s3.size(fn) == 4
15451545

15461546

1547+
@pytest.mark.skipif(py35, reason="no versions on old moto for py36")
1548+
def test_touch_versions(s3):
1549+
versioned_file = versioned_bucket_name + "/versioned_file"
1550+
s3 = S3FileSystem(
1551+
anon=False, version_aware=True, client_kwargs={"endpoint_url": endpoint_uri}
1552+
)
1553+
returned_versions = []
1554+
with s3.open(versioned_file, "wb") as fo:
1555+
fo.write(b"1")
1556+
returned_versions.append(fo.version_id)
1557+
with s3.open(versioned_file, "wb") as fo:
1558+
fo.write(b"")
1559+
returned_versions.append(fo.version_id)
1560+
assert s3.isfile(versioned_file)
1561+
versions = s3.object_version_info(versioned_file)
1562+
version_ids = [version["VersionId"] for version in versions]
1563+
assert len(version_ids) == 2
1564+
1565+
with s3.open(versioned_file) as fo:
1566+
assert fo.version_id == version_ids[1]
1567+
assert fo.version_id == returned_versions[1]
1568+
assert fo.read() == b""
1569+
1570+
with s3.open(versioned_file, version_id=version_ids[0]) as fo:
1571+
assert fo.version_id == version_ids[0]
1572+
assert fo.version_id == returned_versions[0]
1573+
assert fo.read() == b"1"
1574+
1575+
15471576
def test_cat_missing(s3):
15481577
fn0 = test_bucket_name + "/file0"
15491578
fn1 = test_bucket_name + "/file1"

0 commit comments

Comments
 (0)