fix: remove duplicate common prefixes for slash delimiter (#1797) (#1841)

Signed-off-by: houseme <housemecn@gmail.com>
Co-authored-by: houseme <housemecn@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: heihutu <30542132+heihutu@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: houseme <4829346+houseme@users.noreply.github.com>
This commit is contained in:
loverustfs
2026-02-17 21:36:31 +08:00
committed by GitHub
parent 229f0f89c8
commit cf633569a2
5 changed files with 251 additions and 127 deletions
Generated
+95 -96
View File
@@ -485,7 +485,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
"synstructure 0.13.2",
]
@@ -497,7 +497,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -559,7 +559,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -570,7 +570,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -596,7 +596,7 @@ checksum = "99e1aca718ea7b89985790c94aad72d77533063fe00bc497bb79a7c2dae6a661"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -836,9 +836,9 @@ dependencies = [
[[package]]
name = "aws-smithy-async"
version = "1.2.12"
version = "1.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3cba48474f1d6807384d06fec085b909f5807e16653c5af5c45dfe89539f0b70"
checksum = "5cc50d0f63e714784b84223abd7abbc8577de8c35d699e0edd19f0a88a08ae13"
dependencies = [
"futures-util",
"pin-project-lite",
@@ -847,9 +847,9 @@ dependencies = [
[[package]]
name = "aws-smithy-checksums"
version = "0.64.4"
version = "0.64.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a764fa7222922f6c0af8eea478b0ef1ba5ce1222af97e01f33ca5e957bd7f3b9"
checksum = "180dddf5ef0f52a2f99e2fada10e16ea610e507ef6148a42bdc4d5867596aa00"
dependencies = [
"aws-smithy-http",
"aws-smithy-types",
@@ -879,9 +879,9 @@ dependencies = [
[[package]]
name = "aws-smithy-http"
version = "0.63.4"
version = "0.63.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af4a8a5fe3e4ac7ee871237c340bbce13e982d37543b65700f4419e039f5d78e"
checksum = "d619373d490ad70966994801bc126846afaa0d1ee920697a031f0cf63f2568e7"
dependencies = [
"aws-smithy-eventstream",
"aws-smithy-runtime-api",
@@ -901,9 +901,9 @@ dependencies = [
[[package]]
name = "aws-smithy-http-client"
version = "1.1.10"
version = "1.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0709f0083aa19b704132684bc26d3c868e06bd428ccc4373b0b55c3e8748a58b"
checksum = "00ccbb08c10f6bcf912f398188e42ee2eab5f1767ce215a02a73bc5df1bbdd95"
dependencies = [
"aws-smithy-async",
"aws-smithy-runtime-api",
@@ -953,9 +953,9 @@ dependencies = [
[[package]]
name = "aws-smithy-runtime"
version = "1.10.1"
version = "1.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fd3dfc18c1ce097cf81fced7192731e63809829c6cbf933c1ec47452d08e1aa"
checksum = "22ccf7f6eba8b2dcf8ce9b74806c6c185659c311665c4bf8d6e71ebd454db6bf"
dependencies = [
"aws-smithy-async",
"aws-smithy-http",
@@ -978,9 +978,9 @@ dependencies = [
[[package]]
name = "aws-smithy-runtime-api"
version = "1.11.4"
version = "1.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c55e0837e9b8526f49e0b9bfa9ee18ddee70e853f5bc09c5d11ebceddcb0fec"
checksum = "b4af6e5def28be846479bbeac55aa4603d6f7986fc5da4601ba324dd5d377516"
dependencies = [
"aws-smithy-async",
"aws-smithy-types",
@@ -995,9 +995,9 @@ dependencies = [
[[package]]
name = "aws-smithy-types"
version = "1.4.4"
version = "1.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "576b0d6991c9c32bc14fc340582ef148311f924d41815f641a308b5d11e8e7cd"
checksum = "8ca2734c16913a45343b37313605d84e7d8b34a4611598ce1d25b35860a2bed3"
dependencies = [
"base64-simd",
"bytes",
@@ -1491,9 +1491,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.58"
version = "4.5.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63be97961acde393029492ce0be7a1af7e323e6bae9511ebfac33751be5e6806"
checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499"
dependencies = [
"clap_builder",
"clap_derive",
@@ -1501,9 +1501,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.58"
version = "4.5.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f13174bda5dfd69d7e947827e5af4b0f2f94a4a3ee92912fba07a66150f21e2"
checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24"
dependencies = [
"anstream",
"anstyle",
@@ -1520,7 +1520,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -1650,7 +1650,7 @@ checksum = "1c7e7913ec01ed98b697e62f8d3fd63c86dc6cccaf983c7eebc64d0e563b0ad9"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2068,7 +2068,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim 0.11.1",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2082,7 +2082,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim 0.11.1",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2095,7 +2095,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim 0.11.1",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2117,7 +2117,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
"darling_core 0.20.11",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2128,7 +2128,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
dependencies = [
"darling_core 0.21.3",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2139,7 +2139,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
dependencies = [
"darling_core 0.23.0",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2637,7 +2637,7 @@ checksum = "c4fe888aeb6a095c4bcbe8ac1874c4b9a4c7ffa2ba849db7922683ba20875aaf"
dependencies = [
"datafusion-doc",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2914,7 +2914,7 @@ dependencies = [
"darling 0.20.11",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2934,7 +2934,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
dependencies = [
"derive_builder_core 0.20.2",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -2956,7 +2956,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustc_version",
"syn 2.0.115",
"syn 2.0.116",
"unicode-xid",
]
@@ -3018,7 +3018,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -3143,7 +3143,7 @@ dependencies = [
"darling 0.21.3",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -3182,7 +3182,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -3480,7 +3480,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -3574,7 +3574,7 @@ dependencies = [
"proc-macro-error2",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -4489,7 +4489,7 @@ checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -4606,7 +4606,7 @@ dependencies = [
"proc-macro2",
"quote",
"regex",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -4702,9 +4702,9 @@ dependencies = [
[[package]]
name = "liblzma"
version = "0.4.5"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73c36d08cad03a3fbe2c4e7bb3a9e84c57e4ee4135ed0b065cade3d98480c648"
checksum = "b6033b77c21d1f56deeae8014eb9fbe7bdf1765185a6c508b5ca82eeaed7f899"
dependencies = [
"liblzma-sys",
]
@@ -4892,11 +4892,10 @@ dependencies = [
[[package]]
name = "lzma-rust2"
version = "0.16.1"
version = "0.16.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d673a11333485e7d8b93d62a9a5b07b22daf5e8a8655a44c1bb18aa4bf3d1524"
checksum = "47bb1e988e6fb779cf720ad431242d3f03167c1b3f2b1aae7f1a94b2495b36ae"
dependencies = [
"crc",
"sha2 0.10.9",
]
@@ -4968,9 +4967,9 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
[[package]]
name = "memmap2"
version = "0.9.9"
version = "0.9.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490"
checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3"
dependencies = [
"libc",
]
@@ -5099,7 +5098,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -5810,7 +5809,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -6017,7 +6016,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -6039,7 +6038,7 @@ dependencies = [
"proc-macro-error-attr2",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -6092,7 +6091,7 @@ dependencies = [
"pulldown-cmark",
"pulldown-cmark-to-cmark",
"regex",
"syn 2.0.115",
"syn 2.0.116",
"tempfile",
]
@@ -6106,7 +6105,7 @@ dependencies = [
"itertools 0.14.0",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -6432,7 +6431,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b"
dependencies = [
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -6493,7 +6492,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -6684,7 +6683,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_json",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -6766,7 +6765,7 @@ dependencies = [
"quote",
"rust-embed-utils",
"shellexpand",
"syn 2.0.115",
"syn 2.0.116",
"walkdir",
]
@@ -7784,7 +7783,7 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
[[package]]
name = "s3s"
version = "0.13.0-alpha.3"
source = "git+https://github.com/s3s-project/s3s.git?rev=4e245f04eb1436358f1006a8fb392404a8a414a0#4e245f04eb1436358f1006a8fb392404a8a414a0"
source = "git+https://github.com/s3s-project/s3s.git?rev=1b4cc93504c8e698838b4084ea747018a8220b16#1b4cc93504c8e698838b4084ea747018a8220b16"
dependencies = [
"arc-swap",
"arrayvec",
@@ -7894,7 +7893,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -7989,7 +7988,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8000,7 +7999,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8085,7 +8084,7 @@ dependencies = [
"darling 0.21.3",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8121,7 +8120,7 @@ checksum = "6f50427f258fb77356e4cd4aa0e87e2bd2c66dbcee41dc405282cae2bfc26c83"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8375,7 +8374,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8451,7 +8450,7 @@ checksum = "da5fc6819faabb412da764b99d3b713bb55083c11e7e0c00144d386cd6a1939c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8540,7 +8539,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8682,9 +8681,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.115"
version = "2.0.116"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12"
checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb"
dependencies = [
"proc-macro2",
"quote",
@@ -8720,7 +8719,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8805,7 +8804,7 @@ dependencies = [
"cfg-if",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8816,7 +8815,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
"test-case-core",
]
@@ -8846,7 +8845,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -8857,7 +8856,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -9014,7 +9013,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -9089,9 +9088,9 @@ dependencies = [
[[package]]
name = "toml_parser"
version = "1.0.8+spec-1.1.0"
version = "1.0.9+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0742ff5ff03ea7e67c8ae6c93cac239e0d9784833362da3f9a9c1da8dfefcbdc"
checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4"
dependencies = [
"winnow",
]
@@ -9143,7 +9142,7 @@ dependencies = [
"prettyplease",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -9168,7 +9167,7 @@ dependencies = [
"prost-build",
"prost-types",
"quote",
"syn 2.0.115",
"syn 2.0.116",
"tempfile",
"tonic-build",
]
@@ -9261,7 +9260,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -9416,9 +9415,9 @@ checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
[[package]]
name = "unicode-ident"
version = "1.0.23"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "unicode-segmentation"
@@ -9666,7 +9665,7 @@ dependencies = [
"bumpalo",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
"wasm-bindgen-shared",
]
@@ -9869,7 +9868,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -9880,7 +9879,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -10204,7 +10203,7 @@ dependencies = [
"heck",
"indexmap 2.13.0",
"prettyplease",
"syn 2.0.115",
"syn 2.0.116",
"wasm-metadata",
"wit-bindgen-core",
"wit-component",
@@ -10220,7 +10219,7 @@ dependencies = [
"prettyplease",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
"wit-bindgen-core",
"wit-bindgen-rust",
]
@@ -10271,7 +10270,7 @@ dependencies = [
"darling 0.20.11",
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -10354,7 +10353,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
"synstructure 0.13.2",
]
@@ -10375,7 +10374,7 @@ checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -10395,7 +10394,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
"synstructure 0.13.2",
]
@@ -10416,7 +10415,7 @@ checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
@@ -10449,14 +10448,14 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.115",
"syn 2.0.116",
]
[[package]]
name = "zip"
version = "8.0.0"
version = "8.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79b32dd4ad3aca14ae109f8cce0495ac1c57f6f4f00ad459a40e582f89440d97"
checksum = "6e499faf5c6b97a0d086f4a8733de6d47aee2252b8127962439d8d4311a73f72"
dependencies = [
"aes 0.8.4",
"bzip2",
+6 -6
View File
@@ -111,8 +111,8 @@ async-trait = "0.1.89"
axum = "0.8.8"
axum-server = { version = "0.8.0", features = ["tls-rustls"], default-features = false }
futures = "0.3.32"
futures-core = "0.3.31"
futures-util = "0.3.31"
futures-core = "0.3.32"
futures-util = "0.3.32"
pollster = "0.4.0"
hyper = { version = "1.8.1", features = ["http2", "http1", "server"] }
hyper-rustls = { version = "0.27.7", default-features = false, features = ["native-tokio", "http1", "tls12", "logging", "http2", "aws-lc-rs", "webpki-roots"] }
@@ -182,13 +182,13 @@ atomic_enum = "0.3.0"
aws-config = { version = "1.8.14" }
aws-credential-types = { version = "1.2.12" }
aws-sdk-s3 = { version = "1.123.0", default-features = false, features = ["sigv4a", "default-https-client", "rt-tokio"] }
aws-smithy-types = { version = "1.4.4" }
aws-smithy-types = { version = "1.4.5" }
backtrace = "0.3.76"
base64 = "0.22.1"
base64-simd = "0.8.0"
brotli = "8.0.2"
cfg-if = "1.0.4"
clap = { version = "4.5.58", features = ["derive", "env"] }
clap = { version = "4.5.59", features = ["derive", "env"] }
const-str = { version = "1.1.0", features = ["std", "proc"] }
convert_case = "0.11.0"
criterion = { version = "0.8", features = ["html_reports"] }
@@ -234,7 +234,7 @@ rumqttc = { version = "0.25.1" }
rustix = { version = "1.1.3", features = ["fs"] }
rust-embed = { version = "8.11.0" }
rustc-hash = { version = "2.1.1" }
s3s = { version = "0.13.0-alpha.3", features = ["minio"], git = "https://github.com/s3s-project/s3s.git", rev = "4e245f04eb1436358f1006a8fb392404a8a414a0" }
s3s = { version = "0.13.0-alpha.3", features = ["minio"], git = "https://github.com/s3s-project/s3s.git", rev = "1b4cc93504c8e698838b4084ea747018a8220b16" }
serial_test = "3.3.1"
shadow-rs = { version = "1.7.0", default-features = false }
siphasher = "1.0.2"
@@ -263,7 +263,7 @@ walkdir = "2.5.0"
wildmatch = { version = "2.6.1", features = ["serde"] }
windows = { version = "0.62.2" }
xxhash-rust = { version = "0.8.15", features = ["xxh64", "xxh3"] }
zip = "8.0.0"
zip = "8.1.0"
zstd = "0.13.3"
# Observability and Metrics
+4
View File
@@ -29,6 +29,10 @@ mod data_usage_test;
#[cfg(test)]
mod kms;
// Regression test for issue #1797
#[cfg(test)]
mod list_objects_duplicates_test;
// Quota tests
#[cfg(test)]
mod quota_test;
@@ -0,0 +1,135 @@
// Copyright 2024 RustFS Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#[cfg(test)]
mod tests {
use crate::common::{RustFSTestEnvironment, init_logging};
use aws_sdk_s3::Client;
use aws_sdk_s3::primitives::ByteStream;
use serial_test::serial;
use tracing::info;
/// Helper function to create an S3 client for testing
fn create_s3_client(env: &RustFSTestEnvironment) -> Client {
env.create_s3_client()
}
/// Helper function to create a test bucket
async fn create_bucket(client: &Client, bucket: &str) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let mut retries = 20;
loop {
match client.create_bucket().bucket(bucket).send().await {
Ok(_) => {
info!("Bucket {} created successfully", bucket);
return Ok(());
}
Err(e) => {
// Ignore if bucket already exists
if e.to_string().contains("BucketAlreadyOwnedByYou") || e.to_string().contains("BucketAlreadyExists") {
info!("Bucket {} already exists", bucket);
return Ok(());
}
if retries > 0 {
retries -= 1;
info!("Bucket creation failed, retrying... ({})", retries);
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
continue;
}
return Err(Box::new(e));
}
}
}
}
/// Test ensuring that ListObjectsV2 returns unique CommonPrefixes even if "folder" objects exist.
///
/// Bug Reference: Issue #1797
/// Veeam creates 0-byte objects ending in '/' (e.g. "folder/") to represent folders.
/// If "folder/file.txt" also exists, "folder/" is a CommonPrefix.
/// The bug was that "folder/" (the object) and "folder/" (derived prefix) were both added to CommonPrefixes
/// when delimiter was "/" because the deduplication check was explicitly skipped for "/" delimiter.
#[tokio::test]
#[serial]
async fn test_list_objects_v2_unique_common_prefixes() {
init_logging();
info!("Starting test: ListObjectsV2 should return unique CommonPrefixes");
let mut env = RustFSTestEnvironment::new().await.expect("Failed to create test environment");
env.start_rustfs_server(vec![]).await.expect("Failed to start RustFS");
let client = create_s3_client(&env);
let bucket = "test-list-unique-prefixes";
// Create bucket
create_bucket(&client, bucket).await.expect("Failed to create bucket");
// 1. Create a file inside a folder
client
.put_object()
.bucket(bucket)
.key("folder/file.txt")
.body(ByteStream::from_static(b"content"))
.send()
.await
.expect("Failed to create file inside folder");
// 2. Create the "folder" object itself (Veeam behavior)
client
.put_object()
.bucket(bucket)
.key("folder/")
.body(ByteStream::from_static(b""))
.send()
.await
.expect("Failed to create folder object");
// 3. List with delimiter="/"
let result = client
.list_objects_v2()
.bucket(bucket)
.delimiter("/")
.send()
.await
.expect("Failed to list objects");
// Verify prefixes
let prefixes = result.common_prefixes();
info!("CommonPrefixes: {:?}", prefixes);
// Should contain "folder/" exactly once
let folder_prefixes: Vec<_> = prefixes.iter().filter(|p| p.prefix() == Some("folder/")).collect();
assert_eq!(
folder_prefixes.len(),
1,
"Expected exactly 1 'folder/' prefix, found {}",
folder_prefixes.len()
);
// Verify that "folder/" is NOT returned as an object in Contents.
// For this regression test, we expect "folder/" to be represented only as a CommonPrefix
// (rolled up from "folder/file.txt" and the explicit "folder/" object), and to appear there
// exactly once. It must not appear in Contents at all.
// Ensure "folder/" is NOT in contents (Contents)
let folder_in_contents = result.contents().iter().any(|o| o.key() == Some("folder/"));
assert!(
!folder_in_contents,
"Expected 'folder/' to be rolled up into CommonPrefixes, but found it in Contents"
);
// Stop the RustFS server to ensure proper cleanup
env.stop_server();
}
}
+11 -25
View File
@@ -35,7 +35,7 @@ use rustfs_filemeta::{
merge_file_meta_versions,
};
use rustfs_utils::path::{self, SLASH_SEPARATOR, base_dir_from_prefix};
use std::collections::HashMap;
use std::collections::{HashMap, HashSet};
use std::sync::Arc;
use tokio::sync::broadcast::{self};
use tokio::sync::mpsc::{self, Receiver, Sender};
@@ -344,22 +344,15 @@ impl ECStore {
};
let mut prefixes: Vec<String> = Vec::new();
let mut prefix_set: HashSet<String> = HashSet::new();
let mut objects = Vec::with_capacity(get_objects.len());
for obj in get_objects.into_iter() {
if let Some(delimiter) = &delimiter {
if delimiter.is_some() {
if obj.is_dir && obj.mod_time.is_none() {
let mut found = false;
if delimiter != SLASH_SEPARATOR {
for p in prefixes.iter() {
if found {
break;
}
found = p == &obj.name;
}
}
if !found {
prefixes.push(obj.name.clone());
// Check if prefix already exists to avoid duplicates
if prefix_set.insert(obj.name.clone()) {
prefixes.push(obj.name);
}
} else {
objects.push(obj);
@@ -471,22 +464,15 @@ impl ECStore {
};
let mut prefixes: Vec<String> = Vec::new();
let mut prefix_set: HashSet<String> = HashSet::new();
let mut objects = Vec::with_capacity(get_objects.len());
for obj in get_objects.into_iter() {
if let Some(delimiter) = &delimiter {
if delimiter.is_some() {
if obj.is_dir && obj.mod_time.is_none() {
let mut found = false;
if delimiter != SLASH_SEPARATOR {
for p in prefixes.iter() {
if found {
break;
}
found = p == &obj.name;
}
}
if !found {
prefixes.push(obj.name.clone());
// Check if prefix already exists to avoid duplicates
if prefix_set.insert(obj.name.clone()) {
prefixes.push(obj.name);
}
} else {
objects.push(obj);