From 08bd77054daeaa9651ed782b00743533e50b02ac Mon Sep 17 00:00:00 2001 From: Andreas Haraminac Date: Wed, 4 Nov 2026 19:09:41 +0000 Subject: [PATCH] Tooling: reject numeric prerelease leading zeros --- xtask/src/version.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/xtask/src/version.rs b/xtask/src/version.rs index 8c4c1fc34..2cbb2065b 100644 --- a/xtask/src/version.rs +++ b/xtask/src/version.rs @@ -49,7 +49,12 @@ pub fn validate(v: &str) -> Result<(), String> { return bad(); } if let Some(p) = pre - && (p.is_empty() || p.split('.').any(|id| id.is_empty() || !id.bytes().all(|b| b.is_ascii_alphanumeric() || b == b'-'))) + && (p.is_empty() + || p.split('.').any(|id| { + id.is_empty() + || !id.bytes().all(|b| b.is_ascii_alphanumeric() || b == b'-') + || (id.len() > 1 && id.starts_with('0') && id.bytes().all(|b| b.is_ascii_digit())) + })) { return bad(); } @@ -135,13 +140,14 @@ mod tests { #[test] fn validates_versions() { - for ok in ["0.1.0", "1.20.300", "1.0.0-rc.1", "1.0.0-alpha", "1.0.0-x-y.2"] { + for ok in ["0.1.0", "1.20.300", "1.0.0-rc.1", "1.0.0-alpha", "1.0.0-x-y.2", "1.0.0-0", "1.0.0-rc.0", "1.0.0-01a", "1.0.0-01-2"] { assert!(validate(ok).is_ok(), "{ok}"); } - for bad in ["1.0", "1.0.0.0", "v1.0.0", "01.0.0", "1.0.0-", "1.0.0-a..b", "1.0.0+meta", "1.a.0", ""] { + for bad in ["1.0", "1.0.0.0", "v1.0.0", "01.0.0", "1.0.0-", "1.0.0-a..b", "1.0.0+meta", "1.a.0", "", "1.0.0-00", "1.0.0-rc.01"] { assert!(validate(bad).is_err(), "{bad}"); } assert!(replace(MANIFEST, "nope").is_err()); + assert!(replace(MANIFEST, "1.0.0-rc.01").is_err()); } #[test]