From d4aa3bdb17298cddc5ea8e8519bbb921f14dd379 Mon Sep 17 00:00:00 2001 From: dentiny Date: Fri, 10 Apr 2026 03:52:54 +0000 Subject: [PATCH 1/5] fix(core): add missing version assignment --- src/prefix.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/prefix.rs b/src/prefix.rs index 9cdf3b05..a17b4bd0 100644 --- a/src/prefix.rs +++ b/src/prefix.rs @@ -89,7 +89,7 @@ fn strip_meta(prefix: &Path, meta: ObjectMeta) -> ObjectMeta { size: meta.size, location: strip_prefix(prefix, meta.location), e_tag: meta.e_tag, - version: None, + version: meta.version, } } From 0db6cb9580663b2faca1ea0054b8458971086022 Mon Sep 17 00:00:00 2001 From: dentiny Date: Thu, 16 Apr 2026 19:02:28 +0000 Subject: [PATCH 2/5] refactor --- src/prefix.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/prefix.rs b/src/prefix.rs index a17b4bd0..05912591 100644 --- a/src/prefix.rs +++ b/src/prefix.rs @@ -84,12 +84,19 @@ fn strip_prefix(prefix: &Path, path: Path) -> Path { /// Strip the constant prefix from a given ObjectMeta fn strip_meta(prefix: &Path, meta: ObjectMeta) -> ObjectMeta { + let ObjectMeta { + last_modified, + size, + location, + e_tag, + version, + } = meta; ObjectMeta { - last_modified: meta.last_modified, - size: meta.size, - location: strip_prefix(prefix, meta.location), - e_tag: meta.e_tag, - version: meta.version, + last_modified: last_modified, + size: size, + location: strip_prefix(prefix, location), + e_tag: e_tag, + version: version, } } From bffda761c9e4e1690b657e1f6ddda5cdab78a065 Mon Sep 17 00:00:00 2001 From: dentiny Date: Fri, 17 Apr 2026 10:11:12 +0000 Subject: [PATCH 3/5] regression test --- src/prefix.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/prefix.rs b/src/prefix.rs index 05912591..e87628e8 100644 --- a/src/prefix.rs +++ b/src/prefix.rs @@ -92,11 +92,11 @@ fn strip_meta(prefix: &Path, meta: ObjectMeta) -> ObjectMeta { version, } = meta; ObjectMeta { - last_modified: last_modified, - size: size, + last_modified, + size, location: strip_prefix(prefix, location), - e_tag: e_tag, - version: version, + e_tag, + version, } } @@ -328,6 +328,26 @@ mod tests { store.get(&head.location).await.unwrap(); } + #[test] + fn strip_meta_preserves_version_and_etag() { + let prefix = Path::from("prefix"); + let meta = ObjectMeta { + location: Path::from("prefix/foo"), + last_modified: chrono::DateTime::from_timestamp(1_700_000_000, 0).unwrap(), + size: 42, + e_tag: Some("etag-value".to_string()), + version: Some("version-value".to_string()), + }; + + let stripped = strip_meta(&prefix, meta.clone()); + + assert_eq!(stripped.location, Path::from("foo")); + assert_eq!(stripped.last_modified, meta.last_modified); + assert_eq!(stripped.size, meta.size); + assert_eq!(stripped.e_tag, meta.e_tag); + assert_eq!(stripped.version, meta.version); + } + #[tokio::test] async fn prefix_multipart() { let store = PrefixStore::new(InMemory::new(), "prefix"); From e2cf797f10a6c5ce32e5dc1812d860e2dd94aed8 Mon Sep 17 00:00:00 2001 From: dentiny Date: Wed, 6 May 2026 12:05:53 +0000 Subject: [PATCH 4/5] clippy --- src/client/list.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/list.rs b/src/client/list.rs index 6ad87db8..c2123183 100644 --- a/src/client/list.rs +++ b/src/client/list.rs @@ -117,8 +117,8 @@ impl ListClientExt for T { while let Some(result) = stream.next().await { let response = result?; - common_prefixes.extend(response.common_prefixes.into_iter()); - objects.extend(response.objects.into_iter()); + common_prefixes.extend(response.common_prefixes); + objects.extend(response.objects); } Ok(ListResult { From eb07a062ccf1d099cdd0a78fd6ea43e34c5c1d23 Mon Sep 17 00:00:00 2001 From: dentiny Date: Wed, 6 May 2026 19:58:12 +0000 Subject: [PATCH 5/5] more robust impl --- src/prefix.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/prefix.rs b/src/prefix.rs index e87628e8..b6e9137f 100644 --- a/src/prefix.rs +++ b/src/prefix.rs @@ -339,13 +339,19 @@ mod tests { version: Some("version-value".to_string()), }; - let stripped = strip_meta(&prefix, meta.clone()); - - assert_eq!(stripped.location, Path::from("foo")); - assert_eq!(stripped.last_modified, meta.last_modified); - assert_eq!(stripped.size, meta.size); - assert_eq!(stripped.e_tag, meta.e_tag); - assert_eq!(stripped.version, meta.version); + let ObjectMeta { + location, + last_modified, + size, + e_tag, + version, + } = strip_meta(&prefix, meta.clone()); + + assert_eq!(location, Path::from("foo")); + assert_eq!(last_modified, meta.last_modified); + assert_eq!(size, meta.size); + assert_eq!(e_tag, meta.e_tag); + assert_eq!(version, meta.version); } #[tokio::test]