diff --git a/cargo-registry-index/lib.rs b/cargo-registry-index/lib.rs index 55eb60a5442..0777a85fbe1 100644 --- a/cargo-registry-index/lib.rs +++ b/cargo-registry-index/lib.rs @@ -5,7 +5,7 @@ extern crate serde; pub mod testing; use anyhow::{anyhow, Context}; -use std::collections::HashMap; +use std::collections::BTreeMap; use std::io::Write; use std::path::{Path, PathBuf}; use std::process::Command; @@ -101,7 +101,7 @@ pub struct Crate { pub vers: String, pub deps: Vec, pub cksum: String, - pub features: HashMap>, + pub features: BTreeMap>, /// This field contains features with new, extended syntax. Specifically, /// namespaced features (`dep:`) and weak dependencies (`pkg?/feat`). /// @@ -112,7 +112,7 @@ pub struct Crate { /// will fail to load due to not being able to parse the new syntax, even /// with a `Cargo.lock` file. #[serde(skip_serializing_if = "Option::is_none")] - pub features2: Option>>, + pub features2: Option>>, pub yanked: Option, #[serde(default)] pub links: Option, @@ -139,7 +139,7 @@ pub struct Crate { pub v: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, PartialEq, PartialOrd, Ord, Eq)] pub struct Dependency { pub name: String, pub req: String, @@ -152,7 +152,7 @@ pub struct Dependency { pub package: Option, } -#[derive(Copy, Clone, Serialize, Deserialize, Debug)] +#[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq, PartialOrd, Ord, Eq)] #[serde(rename_all = "lowercase")] pub enum DependencyKind { Normal, diff --git a/src/controllers/krate/publish.rs b/src/controllers/krate/publish.rs index be5f3ac9fdb..259de4366e0 100644 --- a/src/controllers/krate/publish.rs +++ b/src/controllers/krate/publish.rs @@ -3,7 +3,7 @@ use flate2::read::GzDecoder; use hex::ToHex; use sha2::{Digest, Sha256}; -use std::collections::HashMap; +use std::collections::BTreeMap; use std::io::Read; use std::path::Path; use std::sync::Arc; @@ -216,7 +216,7 @@ pub fn publish(req: &mut dyn RequestExt) -> EndpointResult { .uploader() .upload_crate(app.http_client(), tarball, &krate, vers)?; - let (features, features2): (HashMap<_, _>, HashMap<_, _>) = + let (features, features2): (BTreeMap<_, _>, BTreeMap<_, _>) = features.into_iter().partition(|(_k, vals)| { !vals .iter() diff --git a/src/downloads_counter.rs b/src/downloads_counter.rs index 80309b8c328..145db8c7fca 100644 --- a/src/downloads_counter.rs +++ b/src/downloads_counter.rs @@ -247,7 +247,7 @@ mod tests { use crate::models::{Crate, NewCrate, NewUser, NewVersion, User}; use diesel::PgConnection; use semver::Version; - use std::collections::HashMap; + use std::collections::BTreeMap; #[test] fn test_increment_and_persist_all() { @@ -452,7 +452,7 @@ mod tests { let version = NewVersion::new( self.krate.id, &Version::parse(&format!("{}.0.0", self.next_version)).unwrap(), - &HashMap::new(), + &BTreeMap::new(), None, None, 0, diff --git a/src/models/version.rs b/src/models/version.rs index 72d9fd8dd0b..172bfb51f34 100644 --- a/src/models/version.rs +++ b/src/models/version.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::BTreeMap; use chrono::NaiveDateTime; use diesel::prelude::*; @@ -127,7 +127,7 @@ impl NewVersion { pub fn new( crate_id: i32, num: &semver::Version, - features: &HashMap>, + features: &BTreeMap>, license: Option, license_file: Option<&str>, crate_size: i32, diff --git a/src/tests/builders/publish.rs b/src/tests/builders/publish.rs index c6a596e64a0..d599b7117c9 100644 --- a/src/tests/builders/publish.rs +++ b/src/tests/builders/publish.rs @@ -1,5 +1,5 @@ use cargo_registry::views::krate_publish as u; -use std::{collections::HashMap, io::Read}; +use std::{collections::BTreeMap, collections::HashMap, io::Read}; use flate2::{write::GzEncoder, Compression}; use once_cell::sync::Lazy; @@ -36,7 +36,7 @@ pub struct PublishBuilder { readme: Option, tarball: Vec, version: semver::Version, - features: HashMap>, + features: BTreeMap>, } impl PublishBuilder { @@ -56,7 +56,7 @@ impl PublishBuilder { readme: None, tarball: EMPTY_TARBALL_BYTES.to_vec(), version: semver::Version::parse("1.0.0").unwrap(), - features: HashMap::new(), + features: BTreeMap::new(), } } diff --git a/src/tests/builders/version.rs b/src/tests/builders/version.rs index 3c3f898aa11..78eadfaf678 100644 --- a/src/tests/builders/version.rs +++ b/src/tests/builders/version.rs @@ -3,7 +3,7 @@ use cargo_registry::{ schema::{dependencies, versions}, util::errors::AppResult, }; -use std::collections::HashMap; +use std::collections::BTreeMap; use chrono::NaiveDateTime; use diesel::prelude::*; @@ -12,7 +12,7 @@ use diesel::prelude::*; pub struct VersionBuilder<'a> { created_at: Option, dependencies: Vec<(i32, Option<&'static str>)>, - features: HashMap>, + features: BTreeMap>, license: Option<&'a str>, license_file: Option<&'a str>, num: semver::Version, @@ -36,7 +36,7 @@ impl<'a> VersionBuilder<'a> { VersionBuilder { created_at: None, dependencies: Vec::new(), - features: HashMap::new(), + features: BTreeMap::new(), license: None, license_file: None, num, diff --git a/src/tests/krate/publish.rs b/src/tests/krate/publish.rs index 3146a651353..8103a563287 100644 --- a/src/tests/krate/publish.rs +++ b/src/tests/krate/publish.rs @@ -11,7 +11,7 @@ use diesel::{delete, update, ExpressionMethods, QueryDsl, RunQueryDsl}; use flate2::write::GzEncoder; use flate2::Compression; use http::StatusCode; -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; use std::io::Read; use std::iter::FromIterator; use std::time::Duration; @@ -953,9 +953,9 @@ fn features_version_2() { assert_eq!(crates[0].name, "foo"); assert_eq!(crates[0].deps.len(), 1); assert_eq!(crates[0].v, Some(2)); - let features = HashMap::from_iter([("old_feat".to_string(), vec![])]); + let features = BTreeMap::from_iter([("old_feat".to_string(), vec![])]); assert_eq!(crates[0].features, features); - let features2 = HashMap::from_iter([( + let features2 = BTreeMap::from_iter([( "new_feat".to_string(), vec!["dep:bar".to_string(), "bar?/feat".to_string()], )]); diff --git a/src/views/krate_publish.rs b/src/views/krate_publish.rs index 5ff78f2731d..51d9ca6e809 100644 --- a/src/views/krate_publish.rs +++ b/src/views/krate_publish.rs @@ -2,7 +2,7 @@ //! and manages the serialising and deserialising of this information //! to and from structs. The serlializing is only utilised in //! integration tests. -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; @@ -17,7 +17,7 @@ pub struct EncodableCrateUpload { pub name: EncodableCrateName, pub vers: EncodableCrateVersion, pub deps: Vec, - pub features: HashMap>, + pub features: BTreeMap>, pub description: Option, pub homepage: Option, pub documentation: Option, @@ -53,7 +53,7 @@ pub struct EncodableCategoryList(pub Vec); pub struct EncodableCategory(pub String); #[derive(Serialize, Debug, Deref)] pub struct EncodableFeature(pub String); -#[derive(PartialEq, Eq, Hash, Serialize, Debug, Deref)] +#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Debug, Deref)] pub struct EncodableFeatureName(pub String); #[derive(Serialize, Deserialize, Debug)] diff --git a/src/worker/update_downloads.rs b/src/worker/update_downloads.rs index 44bf942775d..d4c4730208a 100644 --- a/src/worker/update_downloads.rs +++ b/src/worker/update_downloads.rs @@ -85,7 +85,7 @@ mod test { use super::*; use crate::email::Emails; use crate::models::{Crate, NewCrate, NewUser, NewVersion, User, Version}; - use std::collections::HashMap; + use std::collections::BTreeMap; fn user(conn: &PgConnection) -> User { NewUser::new(2, "login", None, None, "access_token") @@ -103,7 +103,7 @@ mod test { let version = NewVersion::new( krate.id, &semver::Version::parse("1.0.0").unwrap(), - &HashMap::new(), + &BTreeMap::new(), None, None, 0,