diff --git a/src/bin/set-version/set_version.rs b/src/bin/set-version/set_version.rs index 66e74f0976..d5a08d83b9 100644 --- a/src/bin/set-version/set_version.rs +++ b/src/bin/set-version/set_version.rs @@ -108,11 +108,12 @@ fn exec(args: VersionArgs) -> CargoResult<()> { unstable_features: _, } = args; - let target = match (target, bump) { - (None, None) => TargetVersion::Relative(BumpLevel::Release), - (None, Some(level)) => TargetVersion::Relative(level), - (Some(version), None) => TargetVersion::Absolute(version), - (Some(_), Some(_)) => unreachable!("clap groups should prevent this"), + let target = match (target, bump, &metadata) { + (None, None, Some(_)) => TargetVersion::Unchanged, + (None, None, None) => TargetVersion::Relative(BumpLevel::Release), + (None, Some(level), _) => TargetVersion::Relative(level), + (Some(version), None, _) => TargetVersion::Absolute(version), + (Some(_), Some(_), _) => unreachable!("clap groups should prevent this"), }; let ws_metadata = resolve_ws(manifest_path.as_deref(), locked, offline)?; diff --git a/src/bin/set-version/version.rs b/src/bin/set-version/version.rs index 254ade9ebc..5223c11719 100644 --- a/src/bin/set-version/version.rs +++ b/src/bin/set-version/version.rs @@ -8,6 +8,7 @@ use crate::errors::*; pub enum TargetVersion { Relative(BumpLevel), Absolute(semver::Version), + Unchanged, } impl TargetVersion { @@ -17,6 +18,13 @@ impl TargetVersion { metadata: Option<&str>, ) -> CargoResult> { match self { + TargetVersion::Unchanged => { + let mut potential_version = current.to_owned(); + if let Some(metadata) = metadata { + potential_version.metadata(metadata)?; + }; + Ok(Some(potential_version)) + } TargetVersion::Relative(bump_level) => { let mut potential_version = current.to_owned(); bump_level.bump_version(&mut potential_version, metadata)?; diff --git a/src/version.rs b/src/version.rs index 5466672544..fe9183503d 100644 --- a/src/version.rs +++ b/src/version.rs @@ -289,6 +289,9 @@ mod test { let mut v = semver::Version::parse("1.0.0").unwrap(); v.metadata("git.123456").unwrap(); assert_eq!(v, semver::Version::parse("1.0.0+git.123456").unwrap()); + let mut v = semver::Version::parse("1.0.0-dev10").unwrap(); + v.metadata("git.123456").unwrap(); + assert_eq!(v, semver::Version::parse("1.0.0-dev10+git.123456").unwrap()); } } diff --git a/tests/cargo-set-version/main.rs b/tests/cargo-set-version/main.rs index 490d8c1444..421d1d30d0 100644 --- a/tests/cargo-set-version/main.rs +++ b/tests/cargo-set-version/main.rs @@ -11,6 +11,8 @@ mod ignore_dependent; mod relative_absolute_conflict; mod set_absolute_version; mod set_absolute_workspace_version; +mod set_metadata; +mod set_relative_release; mod set_relative_version; mod set_relative_workspace_version; mod upgrade_compatible_dependency;