From 503789d56f28c1b31db6396c6f1ffe9bf2d86772 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 11 May 2026 22:13:05 +0900 Subject: [PATCH] Fix beta issue --- .../changepack_log_V_c980ZHoX7fAHspd9P2y.json | 1 + Cargo.lock | 10 +-- crates/cli/src/lib.rs | 80 +++++++++++++++++++ 3 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 .changepacks/changepack_log_V_c980ZHoX7fAHspd9P2y.json diff --git a/.changepacks/changepack_log_V_c980ZHoX7fAHspd9P2y.json b/.changepacks/changepack_log_V_c980ZHoX7fAHspd9P2y.json new file mode 100644 index 0000000..231833f --- /dev/null +++ b/.changepacks/changepack_log_V_c980ZHoX7fAHspd9P2y.json @@ -0,0 +1 @@ +{"changes":{"bridge/python/pyproject.toml":"Patch","crates/node/Cargo.toml":"Patch","crates/rust/Cargo.toml":"Patch","crates/core/Cargo.toml":"Patch","bridge/node/package.json":"Patch","crates/python/Cargo.toml":"Patch","crates/cli/Cargo.toml":"Patch"},"note":"Fix beta issue","date":"2026-05-11T13:12:56.396433700Z"} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c83b938..9d1ba94 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -336,7 +336,7 @@ checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" [[package]] name = "dependency-check-updates" -version = "0.1.9" +version = "0.1.10" dependencies = [ "clap", "dependency-check-updates-core", @@ -358,7 +358,7 @@ dependencies = [ [[package]] name = "dependency-check-updates-core" -version = "0.1.9" +version = "0.1.10" dependencies = [ "ignore", "miette", @@ -382,7 +382,7 @@ dependencies = [ [[package]] name = "dependency-check-updates-node" -version = "0.1.9" +version = "0.1.10" dependencies = [ "dependency-check-updates-core", "node-semver", @@ -399,7 +399,7 @@ dependencies = [ [[package]] name = "dependency-check-updates-python" -version = "0.1.9" +version = "0.1.10" dependencies = [ "dependency-check-updates-core", "reqwest", @@ -424,7 +424,7 @@ dependencies = [ [[package]] name = "dependency-check-updates-rust" -version = "0.1.9" +version = "0.1.10" dependencies = [ "dependency-check-updates-core", "reqwest", diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 40a445d..08451f6 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -365,6 +365,17 @@ fn compute_updates( // resolved version to 2 segments before comparing. This respects the user's // intent to pin only at that granularity. let precision = count_version_segments(current_bare); + + if precision < 3 && !is_plain_three_segment_version(selected) { + trace!( + package = %dep.name, + current = %dep.current_req, + selected = %selected, + "skipping: selected version cannot be safely truncated" + ); + continue; + } + let selected_truncated = truncate_version(selected, precision); if current_bare == selected_truncated { @@ -406,6 +417,20 @@ fn count_version_segments(bare: &str) -> usize { numeric_part.split('.').filter(|s| !s.is_empty()).count() } +fn is_plain_three_segment_version(version: &str) -> bool { + let mut parts = version.split('.'); + matches!( + (parts.next(), parts.next(), parts.next(), parts.next()), + (Some(major), Some(minor), Some(patch), None) + if !major.is_empty() + && !minor.is_empty() + && !patch.is_empty() + && major.chars().all(|c| c.is_ascii_digit()) + && minor.chars().all(|c| c.is_ascii_digit()) + && patch.chars().all(|c| c.is_ascii_digit()) + ) +} + /// Truncate a version string to the given number of segments. /// /// Always strips build metadata (the `+...` suffix) since it has no meaning @@ -562,6 +587,42 @@ mod tests { assert_eq!(updates[0].to, "2.0.0"); } + #[test] + fn test_compute_updates_does_not_truncate_prerelease_to_stable() { + let deps = vec![DependencySpec { + name: "pkg".to_owned(), + current_req: "3.1".to_owned(), + section: DependencySection::Dependencies, + }]; + let resolved = vec![( + 0, + Ok(ResolvedVersion { + latest: Some("3.1.0".to_owned()), + selected: Some("4.0.0-beta.0".to_owned()), + }), + )]; + let updates = compute_updates(&deps, &resolved); + assert!(updates.is_empty()); + } + + #[test] + fn test_compute_updates_truncates_plain_three_segment_version() { + let deps = vec![DependencySpec { + name: "pkg".to_owned(), + current_req: "3.1".to_owned(), + section: DependencySection::Dependencies, + }]; + let resolved = vec![( + 0, + Ok(ResolvedVersion { + latest: Some("4.0.0".to_owned()), + selected: Some("4.0.0".to_owned()), + }), + )]; + let updates = compute_updates(&deps, &resolved); + assert_eq!(updates[0].to, "4.0"); + } + #[test] fn test_compute_updates_skips_failed_resolution() { let deps = vec![DependencySpec { @@ -980,6 +1041,25 @@ mod tests { assert_eq!(updates[0].to, "2.0.0-rc.40"); } + #[test] + fn test_compute_updates_allows_beta_to_newer_beta_upgrade() { + let deps = vec![DependencySpec { + name: "pkg".to_owned(), + current_req: "4.0.0-beta.0".to_owned(), + section: DependencySection::Dependencies, + }]; + let resolved = vec![( + 0, + Ok(ResolvedVersion { + latest: Some("4.0.0-beta.2".to_owned()), + selected: Some("4.0.0-beta.2".to_owned()), + }), + )]; + let updates = compute_updates(&deps, &resolved); + assert_eq!(updates.len(), 1); + assert_eq!(updates[0].to, "4.0.0-beta.2"); + } + #[test] fn test_compute_updates_allows_prerelease_to_stable_upgrade() { // Current: 2.0.0-rc.37 (prerelease), Selected: 2.0.0 (stable) → semver: stable > prerelease of same version.