diff --git a/src/controllers/krate/publish.rs b/src/controllers/krate/publish.rs index 1451e3795ad..71226e231cc 100644 --- a/src/controllers/krate/publish.rs +++ b/src/controllers/krate/publish.rs @@ -373,16 +373,14 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult { - return Err(bad_request(format_args!( - "crate version `{}` is already uploaded", - new_version.num_no_build - ))); - }, - Err(error) => return Err(error.into()), - Ok(version) => version, - }; + let version = new_version.save(conn, &verified_email_address).map_err(|error| { + use diesel::result::{Error, DatabaseErrorKind}; + match error { + Error::DatabaseError(DatabaseErrorKind::UniqueViolation, _) => + duplicate_version_error(new_version.num_no_build), + error => error.into(), + } + })?; insert_version_owner_action( conn, @@ -620,6 +618,10 @@ fn missing_metadata_error_message(missing: &[&str]) -> String { ) } +fn duplicate_version_error(version: &str) -> BoxedAppError { + bad_request(format!("crate version `{version}` is already uploaded")) +} + fn validate_rust_version(value: &str) -> AppResult<()> { match semver::VersionReq::parse(value) { // Exclude semver operators like `^` and pre-release identifiers