diff --git a/Cargo.toml b/Cargo.toml index b42a04c9902..9d270da59bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ version = "0.0.0" license = "MIT OR Apache-2.0" repository = "https://github.com/rust-lang/crates.io" description = "Backend of crates.io" -edition = "2021" +edition = "2024" default-run = "server" [workspace] diff --git a/src/app.rs b/src/app.rs index 8f84e260233..4d57f9ab83d 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,7 +1,7 @@ //! Application-wide components in a struct accessible from each request use crate::config; -use crate::db::{connection_url, make_manager_config, ConnectionConfig}; +use crate::db::{ConnectionConfig, connection_url, make_manager_config}; use std::sync::Arc; use crate::email::Emails; @@ -12,9 +12,9 @@ use axum::extract::{FromRef, FromRequestParts, State}; use crates_io_github::GitHubClient; use deadpool_diesel::Runtime; use derive_more::Deref; -use diesel_async::pooled_connection::deadpool::Pool as DeadpoolPool; -use diesel_async::pooled_connection::AsyncDieselConnectionManager; use diesel_async::AsyncPgConnection; +use diesel_async::pooled_connection::AsyncDieselConnectionManager; +use diesel_async::pooled_connection::deadpool::Pool as DeadpoolPool; use oauth2::basic::BasicClient; use oauth2::{EndpointNotSet, EndpointSet}; diff --git a/src/auth.rs b/src/auth.rs index 99eddc496a8..a3eb7d999eb 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -4,7 +4,7 @@ use crate::middleware::log_request::RequestLogExt; use crate::models::token::{CrateScope, EndpointScope}; use crate::models::{ApiToken, User}; use crate::util::errors::{ - account_locked, forbidden, internal, AppResult, InsecurelyGeneratedTokenRevoked, + AppResult, InsecurelyGeneratedTokenRevoked, account_locked, forbidden, internal, }; use crate::util::token::HashedToken; use chrono::Utc; diff --git a/src/bin/background-worker.rs b/src/bin/background-worker.rs index fc4ab97c7b1..b70f09ea05e 100644 --- a/src/bin/background-worker.rs +++ b/src/bin/background-worker.rs @@ -19,14 +19,14 @@ use crates_io::db::make_manager_config; use crates_io::fastly::Fastly; use crates_io::storage::Storage; use crates_io::worker::{Environment, RunnerExt}; -use crates_io::{config, Emails}; +use crates_io::{Emails, config}; use crates_io::{db, ssh}; use crates_io_env_vars::var; use crates_io_index::RepositoryConfig; use crates_io_team_repo::TeamRepoImpl; use crates_io_worker::Runner; -use diesel_async::pooled_connection::deadpool::Pool; use diesel_async::pooled_connection::AsyncDieselConnectionManager; +use diesel_async::pooled_connection::deadpool::Pool; use object_store::prefix::PrefixStore; use reqwest::Client; use secrecy::ExposeSecret; diff --git a/src/bin/crates-admin/dialoguer.rs b/src/bin/crates-admin/dialoguer.rs index d4fc9a03d38..98872ef9058 100644 --- a/src/bin/crates-admin/dialoguer.rs +++ b/src/bin/crates-admin/dialoguer.rs @@ -1,4 +1,4 @@ -use ::dialoguer::{theme::Theme, Confirm}; +use ::dialoguer::{Confirm, theme::Theme}; use crates_io::tasks::spawn_blocking; pub async fn confirm(msg: impl Into) -> anyhow::Result { diff --git a/src/bin/crates-admin/migrate.rs b/src/bin/crates-admin/migrate.rs index 606d9bae937..5db54049274 100644 --- a/src/bin/crates-admin/migrate.rs +++ b/src/bin/crates-admin/migrate.rs @@ -1,9 +1,9 @@ -use anyhow::{anyhow, Context, Error}; +use anyhow::{Context, Error, anyhow}; use crates_io::tasks::spawn_blocking; -use diesel_async::async_connection_wrapper::AsyncConnectionWrapper; use diesel_async::AsyncPgConnection; +use diesel_async::async_connection_wrapper::AsyncConnectionWrapper; use diesel_migrations::{ - embed_migrations, EmbeddedMigrations, HarnessWithOutput, MigrationHarness, + EmbeddedMigrations, HarnessWithOutput, MigrationHarness, embed_migrations, }; static CATEGORIES_TOML: &str = include_str!("../../boot/categories.toml"); diff --git a/src/bin/crates-admin/render_readmes.rs b/src/bin/crates-admin/render_readmes.rs index 2748a52b1d2..0d586cec96f 100644 --- a/src/bin/crates-admin/render_readmes.rs +++ b/src/bin/crates-admin/render_readmes.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Context}; +use anyhow::{Context, anyhow}; use crates_io::db; use crates_io::models::Version; use crates_io::schema::{crates, readme_renderings, versions}; @@ -17,7 +17,7 @@ use crates_io_tarball::{Manifest, StringOrBool}; use diesel::prelude::*; use diesel_async::async_connection_wrapper::AsyncConnectionWrapper; use diesel_async::{AsyncPgConnection, RunQueryDsl}; -use reqwest::{header, Client}; +use reqwest::{Client, header}; use std::str::FromStr; use tokio_tar::{self, Archive}; diff --git a/src/bin/server.rs b/src/bin/server.rs index 9fd9a4eefff..a91d5e049f0 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -2,7 +2,7 @@ extern crate tracing; use crates_io::middleware::normalize_path::normalize_path; -use crates_io::{metrics::LogEncoder, App, Emails}; +use crates_io::{App, Emails, metrics::LogEncoder}; use std::{sync::Arc, time::Duration}; use axum::ServiceExt; @@ -12,7 +12,7 @@ use reqwest::Client; use std::io::Write; use std::net::SocketAddr; use tokio::net::TcpListener; -use tokio::signal::unix::{signal, SignalKind}; +use tokio::signal::unix::{SignalKind, signal}; use tower::Layer; const CORE_THREADS: usize = 4; @@ -106,11 +106,13 @@ fn log_instance_metrics_thread(app: Arc) { None => return, }; - std::thread::spawn(move || loop { - if let Err(err) = log_instance_metrics_inner(&app) { - error!(?err, "log_instance_metrics error"); + std::thread::spawn(move || { + loop { + if let Err(err) = log_instance_metrics_inner(&app) { + error!(?err, "log_instance_metrics error"); + } + std::thread::sleep(interval); } - std::thread::sleep(interval); }); } diff --git a/src/config/database_pools.rs b/src/config/database_pools.rs index 9f048709cfa..56335def64c 100644 --- a/src/config/database_pools.rs +++ b/src/config/database_pools.rs @@ -11,8 +11,8 @@ //! - `READ_ONLY_MODE`: If defined (even as empty) then force all connections to be read-only. //! - `DB_TCP_TIMEOUT_MS`: TCP timeout in milliseconds. See the doc comment for more details. -use crate::config::Base; use crate::Env; +use crate::config::Base; use anyhow::anyhow; use crates_io_env_vars::{required_var, var, var_parsed}; use secrecy::SecretString; diff --git a/src/config/sentry.rs b/src/config/sentry.rs index 624d2955d32..cc28e138e37 100644 --- a/src/config/sentry.rs +++ b/src/config/sentry.rs @@ -1,7 +1,7 @@ use anyhow::Context; use crates_io_env_vars::{required_var, var, var_parsed}; -use sentry::types::Dsn; use sentry::IntoDsn; +use sentry::types::Dsn; pub struct SentryConfig { pub dsn: Option, diff --git a/src/config/server.rs b/src/config/server.rs index 119ed05db01..9fc9a326203 100644 --- a/src/config/server.rs +++ b/src/config/server.rs @@ -1,15 +1,15 @@ -use anyhow::{anyhow, Context}; +use anyhow::{Context, anyhow}; use ipnetwork::IpNetwork; use oauth2::{ClientId, ClientSecret}; use url::Url; -use crate::rate_limiter::{LimitedAction, RateLimiterConfig}; use crate::Env; +use crate::rate_limiter::{LimitedAction, RateLimiterConfig}; use super::base::Base; use super::database_pools::DatabasePools; -use crate::config::cdn_log_storage::CdnLogStorageConfig; use crate::config::CdnLogQueueConfig; +use crate::config::cdn_log_storage::CdnLogStorageConfig; use crate::middleware::cargo_compat::StatusCodeConfig; use crate::storage::StorageConfig; use crates_io_env_vars::{list, list_parsed, required_var, var, var_parsed}; @@ -179,7 +179,11 @@ impl Server { font-src https://code.cdn.mozilla.net; \ img-src *; \ object-src 'none'", - cdn_domain = storage.cdn_prefix.as_ref().map(|cdn_prefix| format!("https://{cdn_prefix}")).unwrap_or_default() + cdn_domain = storage + .cdn_prefix + .as_ref() + .map(|cdn_prefix| format!("https://{cdn_prefix}")) + .unwrap_or_default() ); Ok(Server { @@ -259,7 +263,9 @@ fn parse_cidr_block(block: &str) -> anyhow::Result { }; if cidr.prefix() < host_prefix { - return Err(anyhow!("WEB_PAGE_OFFSET_CIDR_BLOCKLIST only allows CIDR blocks with a host prefix of at least 16 bits (IPv4) or 64 bits (IPv6).")); + return Err(anyhow!( + "WEB_PAGE_OFFSET_CIDR_BLOCKLIST only allows CIDR blocks with a host prefix of at least 16 bits (IPv4) or 64 bits (IPv6)." + )); } Ok(cidr) diff --git a/src/controllers/crate_owner_invitation.rs b/src/controllers/crate_owner_invitation.rs index 31643129d39..e3813dc4438 100644 --- a/src/controllers/crate_owner_invitation.rs +++ b/src/controllers/crate_owner_invitation.rs @@ -6,14 +6,14 @@ use crate::controllers::helpers::pagination::{Page, PaginationOptions, Paginatio use crate::models::crate_owner_invitation::AcceptError; use crate::models::{Crate, CrateOwnerInvitation, User}; use crate::schema::{crate_owner_invitations, crates, users}; -use crate::util::errors::{bad_request, custom, forbidden, internal, AppResult, BoxedAppError}; use crate::util::RequestUtils; +use crate::util::errors::{AppResult, BoxedAppError, bad_request, custom, forbidden, internal}; use crate::views::{ EncodableCrateOwnerInvitation, EncodableCrateOwnerInvitationV1, EncodablePublicUser, InvitationResponse, }; -use axum::extract::{FromRequestParts, Path, Query}; use axum::Json; +use axum::extract::{FromRequestParts, Path, Query}; use axum_extra::json; use axum_extra::response::ErasedJson; use chrono::Utc; @@ -21,8 +21,8 @@ use diesel::pg::Pg; use diesel::prelude::*; use diesel::sql_types::Bool; use diesel_async::{AsyncPgConnection, RunQueryDsl}; -use http::request::Parts; use http::StatusCode; +use http::request::Parts; use indexmap::IndexMap; use std::collections::{HashMap, HashSet}; diff --git a/src/controllers/git.rs b/src/controllers/git.rs index d072c25febc..a68c48e6d66 100644 --- a/src/controllers/git.rs +++ b/src/controllers/git.rs @@ -2,7 +2,7 @@ use axum::extract::{ConnectInfo, Path, Request}; use axum::response::{IntoResponse, Response}; use http::header::HeaderName; use http::request::Parts; -use http::{header, HeaderMap, HeaderValue, StatusCode}; +use http::{HeaderMap, HeaderValue, StatusCode, header}; use hyper::body::Buf; use std::io::{BufRead, Read}; use std::net::SocketAddr; diff --git a/src/controllers/github/secret_scanning.rs b/src/controllers/github/secret_scanning.rs index 6f52d6230fa..793b76dd81c 100644 --- a/src/controllers/github/secret_scanning.rs +++ b/src/controllers/github/secret_scanning.rs @@ -2,19 +2,19 @@ use crate::app::AppState; use crate::email::Email; use crate::models::{ApiToken, User}; use crate::schema::api_tokens; -use crate::util::errors::{bad_request, AppResult, BoxedAppError}; +use crate::util::errors::{AppResult, BoxedAppError, bad_request}; use crate::util::token::HashedToken; -use anyhow::{anyhow, Context}; -use axum::body::Bytes; +use anyhow::{Context, anyhow}; use axum::Json; -use base64::{engine::general_purpose, Engine}; +use axum::body::Bytes; +use base64::{Engine, engine::general_purpose}; use crates_io_github::GitHubPublicKey; use diesel::prelude::*; use diesel_async::{AsyncPgConnection, RunQueryDsl}; use http::HeaderMap; -use p256::ecdsa::signature::Verifier; -use p256::ecdsa::VerifyingKey; use p256::PublicKey; +use p256::ecdsa::VerifyingKey; +use p256::ecdsa::signature::Verifier; use serde_json as json; use std::str::FromStr; use std::sync::LazyLock; diff --git a/src/controllers/helpers/pagination.rs b/src/controllers/helpers/pagination.rs index af04c0486a5..5ce90c882e8 100644 --- a/src/controllers/helpers/pagination.rs +++ b/src/controllers/helpers/pagination.rs @@ -3,12 +3,12 @@ use crate::middleware::app::RequestApp; use crate::middleware::log_request::RequestLogExt; use crate::middleware::real_ip::RealIp; use crate::models::helpers::with_count::*; -use crate::util::errors::{bad_request, AppResult}; use crate::util::HeaderMapExt; +use crate::util::errors::{AppResult, bad_request}; use std::num::NonZeroU32; use axum::extract::FromRequestParts; -use base64::{engine::general_purpose, Engine}; +use base64::{Engine, engine::general_purpose}; use diesel::pg::Pg; use diesel::prelude::*; use diesel::query_builder::{AstPass, Query, QueryFragment, QueryId}; @@ -133,8 +133,9 @@ impl PaginationOptionsBuilder { { parts.request_log().add("cause", "large page offset"); - let error = - format!("Page {numeric_page} is unavailable for performance reasons. Please take a look at https://crates.io/data-access for alternatives."); + let error = format!( + "Page {numeric_page} is unavailable for performance reasons. Please take a look at https://crates.io/data-access for alternatives." + ); return Err(bad_request(error)); } @@ -387,10 +388,8 @@ impl QueryId for PaginatedQueryWithCountSubq { type QueryId = (); } -impl< - T: Query, - C: Query + QueryDsl + diesel::query_dsl::methods::SelectDsl, - > Query for PaginatedQueryWithCountSubq +impl> + Query for PaginatedQueryWithCountSubq { type SqlType = (T::SqlType, BigInt); } @@ -639,8 +638,8 @@ mod tests { } mod seek { - use chrono::serde::ts_microseconds; use chrono::Utc; + use chrono::serde::ts_microseconds; seek!( pub(super) enum Seek { @@ -662,8 +661,8 @@ mod tests { #[test] fn test_seek_macro_encode_and_decode() { - use chrono::serde::ts_microseconds; use chrono::NaiveDate; + use chrono::serde::ts_microseconds; use seek::*; let assert_decode_after = |seek: Seek, query: &str, expect| { diff --git a/src/controllers/keyword.rs b/src/controllers/keyword.rs index d2745ef529a..bce90acd46f 100644 --- a/src/controllers/keyword.rs +++ b/src/controllers/keyword.rs @@ -1,6 +1,6 @@ use crate::app::AppState; use crate::controllers::helpers::pagination::PaginationOptions; -use crate::controllers::helpers::{pagination::Paginated, Paginate}; +use crate::controllers::helpers::{Paginate, pagination::Paginated}; use crate::models::Keyword; use crate::util::errors::AppResult; use crate::views::EncodableKeyword; diff --git a/src/controllers/krate.rs b/src/controllers/krate.rs index 6735169e22a..1fd32cd2769 100644 --- a/src/controllers/krate.rs +++ b/src/controllers/krate.rs @@ -1,5 +1,5 @@ use crate::models::Crate; -use crate::util::errors::{crate_not_found, AppResult}; +use crate::util::errors::{AppResult, crate_not_found}; use axum::extract::{FromRequestParts, Path}; use crates_io_database::schema::crates; use diesel::{OptionalExtension, QueryDsl}; diff --git a/src/controllers/krate/delete.rs b/src/controllers/krate/delete.rs index 66a4bba04c2..5d89db3b062 100644 --- a/src/controllers/krate/delete.rs +++ b/src/controllers/krate/delete.rs @@ -5,7 +5,7 @@ use crate::controllers::krate::CratePath; use crate::email::Email; use crate::models::NewDeletedCrate; use crate::schema::{crate_downloads, crates, dependencies}; -use crate::util::errors::{custom, AppResult, BoxedAppError}; +use crate::util::errors::{AppResult, BoxedAppError, custom}; use crate::worker::jobs; use axum::extract::rejection::QueryRejection; use axum::extract::{FromRequestParts, Query}; @@ -16,8 +16,8 @@ use crates_io_worker::BackgroundJob; use diesel::prelude::*; use diesel_async::scoped_futures::ScopedFutureExt; use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl}; -use http::request::Parts; use http::StatusCode; +use http::request::Parts; const DOWNLOADS_PER_MONTH_LIMIT: u64 = 500; const AVAILABLE_AFTER: TimeDelta = TimeDelta::hours(24); @@ -92,7 +92,9 @@ pub async fn delete_crate( let downloads = get_crate_downloads(&mut conn, krate.id).await?; if downloads > max_downloads(&age) { - let msg = format!("only crates with less than {DOWNLOADS_PER_MONTH_LIMIT} downloads per month can be deleted after 72 hours"); + let msg = format!( + "only crates with less than {DOWNLOADS_PER_MONTH_LIMIT} downloads per month can be deleted after 72 hours" + ); return Err(custom(StatusCode::UNPROCESSABLE_ENTITY, msg)); } } diff --git a/src/controllers/krate/downloads.rs b/src/controllers/krate/downloads.rs index 87ed619c6d0..9172d3c2eb1 100644 --- a/src/controllers/krate/downloads.rs +++ b/src/controllers/krate/downloads.rs @@ -8,7 +8,7 @@ use crate::controllers::krate::CratePath; use crate::models::download::Version; use crate::models::{User, Version as FullVersion, VersionDownload, VersionOwnerAction}; use crate::schema::{version_downloads, version_owner_actions, versions}; -use crate::util::errors::{bad_request, AppResult, BoxedAppError}; +use crate::util::errors::{AppResult, BoxedAppError, bad_request}; use crate::views::{EncodableVersion, EncodableVersionDownload}; use axum::extract::FromRequestParts; use axum_extra::extract::Query; @@ -18,8 +18,8 @@ use crates_io_database::schema::users; use crates_io_diesel_helpers::to_char; use diesel::prelude::*; use diesel_async::{AsyncPgConnection, RunQueryDsl}; -use futures_util::future::BoxFuture; use futures_util::FutureExt; +use futures_util::future::BoxFuture; use std::cmp; use std::str::FromStr; diff --git a/src/controllers/krate/follow.rs b/src/controllers/krate/follow.rs index d602846d0bc..fb2cb29a7dc 100644 --- a/src/controllers/krate/follow.rs +++ b/src/controllers/krate/follow.rs @@ -6,7 +6,7 @@ use crate::controllers::helpers::ok_true; use crate::controllers::krate::CratePath; use crate::models::{Crate, Follow}; use crate::schema::*; -use crate::util::errors::{crate_not_found, AppResult}; +use crate::util::errors::{AppResult, crate_not_found}; use axum::response::Response; use axum_extra::json; use axum_extra::response::ErasedJson; diff --git a/src/controllers/krate/metadata.rs b/src/controllers/krate/metadata.rs index 9f77a9347ae..1fe1cb20e9f 100644 --- a/src/controllers/krate/metadata.rs +++ b/src/controllers/krate/metadata.rs @@ -12,7 +12,7 @@ use crate::models::{ }; use crate::schema::*; use crate::util::errors::{ - bad_request, crate_not_found, version_not_found, AppResult, BoxedAppError, + AppResult, BoxedAppError, bad_request, crate_not_found, version_not_found, }; use crate::views::{EncodableCategory, EncodableCrate, EncodableKeyword, EncodableVersion}; use axum::extract::{FromRequestParts, Query}; @@ -251,8 +251,7 @@ impl Default for ShowIncludeMode { } impl ShowIncludeMode { - const INVALID_COMPONENT: &'static str = - "invalid component for ?include= (expected 'versions', 'keywords', 'categories', 'badges', 'downloads', 'default_version', or 'full')"; + const INVALID_COMPONENT: &'static str = "invalid component for ?include= (expected 'versions', 'keywords', 'categories', 'badges', 'downloads', 'default_version', or 'full')"; } impl FromStr for ShowIncludeMode { diff --git a/src/controllers/krate/owners.rs b/src/controllers/krate/owners.rs index 7ae56e2a7db..63ad10b7b53 100644 --- a/src/controllers/krate/owners.rs +++ b/src/controllers/krate/owners.rs @@ -3,14 +3,14 @@ use crate::controllers::helpers::authorization::Rights; use crate::controllers::krate::CratePath; use crate::models::krate::OwnerRemoveError; +use crate::models::{Crate, Owner, Team, User}; use crate::models::{ - krate::NewOwnerInvite, token::EndpointScope, CrateOwner, NewCrateOwnerInvitation, - NewCrateOwnerInvitationOutcome, NewTeam, + CrateOwner, NewCrateOwnerInvitation, NewCrateOwnerInvitationOutcome, NewTeam, + krate::NewOwnerInvite, token::EndpointScope, }; -use crate::models::{Crate, Owner, Team, User}; -use crate::util::errors::{bad_request, crate_not_found, custom, AppResult, BoxedAppError}; +use crate::util::errors::{AppResult, BoxedAppError, bad_request, crate_not_found, custom}; use crate::views::EncodableOwner; -use crate::{app::AppState, App}; +use crate::{App, app::AppState}; use crate::{auth::AuthCheck, email::Email}; use axum::Json; use axum_extra::json; @@ -20,8 +20,8 @@ use crates_io_github::{GitHubClient, GitHubError}; use diesel::prelude::*; use diesel_async::scoped_futures::ScopedFutureExt; use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl}; -use http::request::Parts; use http::StatusCode; +use http::request::Parts; use oauth2::AccessToken; use secrecy::{ExposeSecret, SecretString}; use thiserror::Error; diff --git a/src/controllers/krate/publish.rs b/src/controllers/krate/publish.rs index 81bbf5037f3..0d4d7f5568b 100644 --- a/src/controllers/krate/publish.rs +++ b/src/controllers/krate/publish.rs @@ -5,11 +5,11 @@ use crate::auth::AuthCheck; use crate::worker::jobs::{ self, CheckTyposquat, SendPublishNotificationsJob, UpdateDefaultVersion, }; -use axum::body::{Body, Bytes}; use axum::Json; +use axum::body::{Body, Bytes}; use cargo_manifest::{Dependency, DepsSet, TargetDepsSet}; use chrono::{DateTime, SecondsFormat, Utc}; -use crates_io_tarball::{process_tarball, TarballError}; +use crates_io_tarball::{TarballError, process_tarball}; use crates_io_worker::{BackgroundJob, EnqueueError}; use diesel::dsl::{exists, select}; use diesel::prelude::*; @@ -19,8 +19,8 @@ use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl}; use futures_util::TryFutureExt; use futures_util::TryStreamExt; use hex::ToHex; -use http::request::Parts; use http::StatusCode; +use http::request::Parts; use sha2::{Digest, Sha256}; use std::collections::HashMap; use tokio::io::{AsyncRead, AsyncReadExt}; @@ -28,8 +28,8 @@ use tokio_util::io::StreamReader; use url::Url; use crate::models::{ - default_versions::Version as DefaultVersion, Category, Crate, DependencyKind, Keyword, - NewCrate, NewVersion, NewVersionOwnerAction, VersionAction, + Category, Crate, DependencyKind, Keyword, NewCrate, NewVersion, NewVersionOwnerAction, + VersionAction, default_versions::Version as DefaultVersion, }; use crate::controllers::helpers::authorization::Rights; @@ -38,7 +38,7 @@ use crate::middleware::log_request::RequestLogExt; use crate::models::token::EndpointScope; use crate::rate_limiter::LimitedAction; use crate::schema::*; -use crate::util::errors::{bad_request, custom, internal, AppResult, BoxedAppError}; +use crate::util::errors::{AppResult, BoxedAppError, bad_request, custom, internal}; use crate::views::{ EncodableCrate, EncodableCrateDependency, GoodCrate, PublishMetadata, PublishWarnings, }; @@ -88,7 +88,7 @@ pub async fn publish(app: AppState, req: Parts, body: Body) -> AppResult AppResult MAX_DESCRIPTION_LENGTH { - return Err(bad_request(format!("The `description` is too long. A maximum of {MAX_DESCRIPTION_LENGTH} characters are currently allowed."))); + return Err(bad_request(format!( + "The `description` is too long. A maximum of {MAX_DESCRIPTION_LENGTH} characters are currently allowed." + ))); } } @@ -583,7 +585,7 @@ async fn count_versions_published_today( crate_id: i32, conn: &mut AsyncPgConnection, ) -> QueryResult { - use diesel::dsl::{now, IntervalDsl}; + use diesel::dsl::{IntervalDsl, now}; versions::table .filter(versions::crate_id.eq(crate_id)) @@ -794,7 +796,10 @@ pub fn validate_dependency(dep: &EncodableCrateDependency) -> AppResult<()> { if let Some(registry) = &dep.registry { if !registry.is_empty() { - return Err(bad_request(format_args!("Dependency `{}` is hosted on another registry. Cross-registry dependencies are not permitted on crates.io.", dep.name))); + return Err(bad_request(format_args!( + "Dependency `{}` is hosted on another registry. Cross-registry dependencies are not permitted on crates.io.", + dep.name + ))); } } @@ -806,10 +811,13 @@ pub fn validate_dependency(dep: &EncodableCrateDependency) -> AppResult<()> { ))); } Ok(req) if req == semver::VersionReq::STAR => { - return Err(bad_request(format_args!("wildcard (`*`) dependency constraints are not allowed \ + return Err(bad_request(format_args!( + "wildcard (`*`) dependency constraints are not allowed \ on crates.io. Crate with this problem: `{}` See https://doc.rust-lang.org/cargo/faq.html#can-\ libraries-use--as-a-version-for-their-dependencies for more \ - information", dep.name))); + information", + dep.name + ))); } _ => {} } @@ -876,9 +884,9 @@ pub async fn add_dependencies( impl From for BoxedAppError { fn from(error: TarballError) -> Self { match error { - TarballError::Malformed(_err) => bad_request( - "uploaded tarball is malformed or too large when decompressed", - ), + TarballError::Malformed(_err) => { + bad_request("uploaded tarball is malformed or too large when decompressed") + } TarballError::InvalidPath(path) => bad_request(format!("invalid path found: {path}")), TarballError::UnexpectedSymlink(path) => { bad_request(format!("unexpected symlink or hard link found: {path}")) @@ -887,12 +895,10 @@ impl From for BoxedAppError { TarballError::MissingManifest => { bad_request("uploaded tarball is missing a `Cargo.toml` manifest file") } - TarballError::IncorrectlyCasedManifest(name) => { - bad_request(format!( - "uploaded tarball is missing a `Cargo.toml` manifest file; `{name}` was found, but must be named `Cargo.toml` with that exact casing", - name = name.to_string_lossy(), - )) - } + TarballError::IncorrectlyCasedManifest(name) => bad_request(format!( + "uploaded tarball is missing a `Cargo.toml` manifest file; `{name}` was found, but must be named `Cargo.toml` with that exact casing", + name = name.to_string_lossy(), + )), TarballError::TooManyManifests(paths) => { let paths = paths .into_iter() @@ -926,8 +932,17 @@ mod tests { #[test] fn missing_metadata_error_message_test() { - assert_eq!(missing_metadata_error_message(&["a"]), "missing or empty metadata fields: a. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields"); - assert_eq!(missing_metadata_error_message(&["a", "b"]), "missing or empty metadata fields: a, b. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields"); - assert_eq!(missing_metadata_error_message(&["a", "b", "c"]), "missing or empty metadata fields: a, b, c. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields"); + assert_eq!( + missing_metadata_error_message(&["a"]), + "missing or empty metadata fields: a. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields" + ); + assert_eq!( + missing_metadata_error_message(&["a", "b"]), + "missing or empty metadata fields: a, b. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields" + ); + assert_eq!( + missing_metadata_error_message(&["a", "b", "c"]), + "missing or empty metadata fields: a, b, c. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields" + ); } } diff --git a/src/controllers/krate/search.rs b/src/controllers/krate/search.rs index dd3051a3b03..76c51be7a88 100644 --- a/src/controllers/krate/search.rs +++ b/src/controllers/krate/search.rs @@ -6,7 +6,7 @@ use axum_extra::extract::Query; use axum_extra::json; use axum_extra::response::ErasedJson; use derive_more::Deref; -use diesel::dsl::{exists, InnerJoinQuerySource, LeftJoinQuerySource}; +use diesel::dsl::{InnerJoinQuerySource, LeftJoinQuerySource, exists}; use diesel::prelude::*; use diesel::sql_types::Bool; use diesel_async::{AsyncPgConnection, RunQueryDsl}; @@ -19,13 +19,13 @@ use crate::app::AppState; use crate::controllers::helpers::Paginate; use crate::models::{Crate, CrateOwner, OwnerKind, TopVersions, Version}; use crate::schema::*; -use crate::util::errors::{bad_request, AppResult}; +use crate::util::errors::{AppResult, bad_request}; use crate::views::EncodableCrate; use crate::controllers::helpers::pagination::{Page, PaginationOptions, PaginationQueryParams}; use crate::models::krate::ALL_COLUMNS; -use crate::util::string_excl_null::StringExclNull; use crate::util::RequestUtils; +use crate::util::string_excl_null::StringExclNull; use crates_io_diesel_helpers::{array_agg, canon_crate_name, lower}; /// Returns a list of crates. @@ -632,8 +632,8 @@ impl FilterParams { mod seek { use super::Record; use crate::controllers::helpers::pagination::seek; - use chrono::serde::ts_microseconds; use chrono::Utc; + use chrono::serde::ts_microseconds; seek!( pub enum Seek { diff --git a/src/controllers/krate/versions.rs b/src/controllers/krate/versions.rs index d17a4b03ae3..ebbffb1fa02 100644 --- a/src/controllers/krate/versions.rs +++ b/src/controllers/krate/versions.rs @@ -7,21 +7,21 @@ use axum_extra::response::ErasedJson; use diesel::dsl::not; use diesel::prelude::*; use diesel_async::{AsyncPgConnection, RunQueryDsl}; -use futures_util::{future, TryStreamExt}; +use futures_util::{TryStreamExt, future}; use http::request::Parts; use indexmap::{IndexMap, IndexSet}; use std::str::FromStr; use crate::app::AppState; use crate::controllers::helpers::pagination::{ - encode_seek, Page, PaginationOptions, PaginationQueryParams, + Page, PaginationOptions, PaginationQueryParams, encode_seek, }; use crate::controllers::krate::CratePath; use crate::models::{User, Version, VersionOwnerAction}; use crate::schema::{users, versions}; -use crate::util::errors::{bad_request, AppResult, BoxedAppError}; -use crate::util::string_excl_null::StringExclNull; use crate::util::RequestUtils; +use crate::util::errors::{AppResult, BoxedAppError, bad_request}; +use crate::util::string_excl_null::StringExclNull; use crate::views::EncodableVersion; #[derive(Debug, Deserialize, FromRequestParts, utoipa::IntoParams)] @@ -374,8 +374,8 @@ async fn list_by_semver( mod seek { use crate::controllers::helpers::pagination::seek; use crate::models::{User, Version}; - use chrono::serde::ts_microseconds; use chrono::Utc; + use chrono::serde::ts_microseconds; // We might consider refactoring this to use named fields, which would be clearer and more // flexible. It's also worth noting that we currently encode seek compactly as a Vec, which diff --git a/src/controllers/metrics.rs b/src/controllers/metrics.rs index 963d69ee0dc..ed38c5aa6aa 100644 --- a/src/controllers/metrics.rs +++ b/src/controllers/metrics.rs @@ -1,9 +1,9 @@ use crate::app::AppState; use crate::tasks::spawn_blocking; -use crate::util::errors::{custom, forbidden, not_found, AppResult}; +use crate::util::errors::{AppResult, custom, forbidden, not_found}; use axum::extract::Path; use http::request::Parts; -use http::{header, StatusCode}; +use http::{StatusCode, header}; use prometheus::TextEncoder; /// Handles the `GET /api/private/metrics/{kind}` endpoint. diff --git a/src/controllers/session.rs b/src/controllers/session.rs index 67e7280d53a..c73869e52ec 100644 --- a/src/controllers/session.rs +++ b/src/controllers/session.rs @@ -1,5 +1,5 @@ -use axum::extract::{FromRequestParts, Query}; use axum::Json; +use axum::extract::{FromRequestParts, Query}; use axum_extra::json; use axum_extra::response::ErasedJson; use diesel::prelude::*; @@ -15,7 +15,7 @@ use crate::middleware::log_request::RequestLogExt; use crate::models::{NewEmail, NewUser, User}; use crate::schema::users; use crate::util::diesel::is_read_only_error; -use crate::util::errors::{bad_request, server_error, AppResult}; +use crate::util::errors::{AppResult, bad_request, server_error}; use crate::views::EncodableMe; use crates_io_github::GithubUser; use crates_io_session::SessionExtension; diff --git a/src/controllers/summary.rs b/src/controllers/summary.rs index 7dd2694a92d..1ea439c5bdd 100644 --- a/src/controllers/summary.rs +++ b/src/controllers/summary.rs @@ -142,7 +142,7 @@ struct Record { fn encode_crates( conn: &mut AsyncPgConnection, data: Vec, -) -> impl Future>> { +) -> impl Future>> + use<> { let crate_ids = data .iter() .map(|record| record.krate.id) diff --git a/src/controllers/token.rs b/src/controllers/token.rs index 61c402da799..d92e9f52293 100644 --- a/src/controllers/token.rs +++ b/src/controllers/token.rs @@ -5,21 +5,21 @@ use crate::views::EncodableApiTokenWithToken; use crate::app::AppState; use crate::auth::AuthCheck; use crate::models::token::{CrateScope, EndpointScope}; -use crate::util::errors::{bad_request, AppResult}; +use crate::util::errors::{AppResult, bad_request}; use crate::util::token::PlainToken; +use axum::Json; use axum::extract::{Path, Query}; use axum::response::{IntoResponse, Response}; -use axum::Json; use axum_extra::json; use axum_extra::response::ErasedJson; use chrono::{DateTime, Utc}; use diesel::data_types::PgInterval; -use diesel::dsl::{now, IntervalDsl}; +use diesel::dsl::{IntervalDsl, now}; use diesel::prelude::*; use diesel::sql_types::Timestamptz; use diesel_async::RunQueryDsl; -use http::request::Parts; use http::StatusCode; +use http::request::Parts; use secrecy::ExposeSecret; #[derive(Deserialize)] diff --git a/src/controllers/user/email_notifications.rs b/src/controllers/user/email_notifications.rs index b2c952c1bca..c069d1cfd18 100644 --- a/src/controllers/user/email_notifications.rs +++ b/src/controllers/user/email_notifications.rs @@ -4,8 +4,8 @@ use crate::controllers::helpers::ok_true; use crate::models::{CrateOwner, OwnerKind}; use crate::schema::crate_owners; use crate::util::errors::AppResult; -use axum::response::Response; use axum::Json; +use axum::response::Response; use diesel::prelude::*; use diesel_async::RunQueryDsl; use http::request::Parts; diff --git a/src/controllers/user/email_verification.rs b/src/controllers/user/email_verification.rs index b50316c0716..4c035815f01 100644 --- a/src/controllers/user/email_verification.rs +++ b/src/controllers/user/email_verification.rs @@ -4,7 +4,7 @@ use crate::auth::AuthCheck; use crate::controllers::helpers::ok_true; use crate::models::Email; use crate::util::errors::AppResult; -use crate::util::errors::{bad_request, BoxedAppError}; +use crate::util::errors::{BoxedAppError, bad_request}; use axum::extract::Path; use axum::response::Response; use crates_io_database::schema::emails; diff --git a/src/controllers/user/me.rs b/src/controllers/user/me.rs index 1751babfb27..44da94f7f3a 100644 --- a/src/controllers/user/me.rs +++ b/src/controllers/user/me.rs @@ -7,8 +7,8 @@ use diesel_async::RunQueryDsl; use http::request::Parts; use crate::app::AppState; -use crate::controllers::helpers::pagination::{Paginated, PaginationOptions}; use crate::controllers::helpers::Paginate; +use crate::controllers::helpers::pagination::{Paginated, PaginationOptions}; use crate::models::krate::CrateName; use crate::models::{CrateOwner, Follow, OwnerKind, User, Version, VersionOwnerAction}; use crate::schema::{crate_owners, crates, emails, follows, users, versions}; diff --git a/src/controllers/user/update.rs b/src/controllers/user/update.rs index 083afae0697..5174692acca 100644 --- a/src/controllers/user/update.rs +++ b/src/controllers/user/update.rs @@ -3,10 +3,10 @@ use crate::auth::AuthCheck; use crate::controllers::helpers::ok_true; use crate::models::NewEmail; use crate::schema::users; -use crate::util::errors::{bad_request, server_error, AppResult}; +use crate::util::errors::{AppResult, bad_request, server_error}; +use axum::Json; use axum::extract::Path; use axum::response::Response; -use axum::Json; use diesel::prelude::*; use diesel_async::RunQueryDsl; use http::request::Parts; @@ -75,7 +75,9 @@ pub async fn update_user( }; if let Err(error) = state.emails.send(&email_address, email).await { - warn!("Failed to send publish notifications unsubscribe email to {email_address}: {error}"); + warn!( + "Failed to send publish notifications unsubscribe email to {email_address}: {error}" + ); } } } diff --git a/src/controllers/util.rs b/src/controllers/util.rs index 4b47fdd083c..9e3467607fc 100644 --- a/src/controllers/util.rs +++ b/src/controllers/util.rs @@ -1,8 +1,8 @@ use crate::middleware::app::RequestApp; use crate::middleware::log_request::RequestLogExt; -use crate::util::errors::{forbidden, AppResult}; +use crate::util::errors::{AppResult, forbidden}; use http::request::Parts; -use http::{header, Extensions, HeaderMap, HeaderValue, Method, Request, Uri, Version}; +use http::{Extensions, HeaderMap, HeaderValue, Method, Request, Uri, Version, header}; /// The Origin header () /// is sent with CORS requests and POST requests, and indicates where the request comes from. diff --git a/src/controllers/version.rs b/src/controllers/version.rs index 495c10c7e9b..8c8885e6cbb 100644 --- a/src/controllers/version.rs +++ b/src/controllers/version.rs @@ -14,7 +14,7 @@ use utoipa::IntoParams; use crate::controllers::krate::load_crate; use crate::models::{Crate, Version}; -use crate::util::errors::{version_not_found, AppResult}; +use crate::util::errors::{AppResult, version_not_found}; #[derive(Deserialize, FromRequestParts, IntoParams)] #[into_params(parameter_in = Path)] diff --git a/src/controllers/version/downloads.rs b/src/controllers/version/downloads.rs index b8d4374c685..0ccd4a66fa9 100644 --- a/src/controllers/version/downloads.rs +++ b/src/controllers/version/downloads.rs @@ -7,7 +7,7 @@ use crate::app::AppState; use crate::models::VersionDownload; use crate::schema::*; use crate::util::errors::AppResult; -use crate::util::{redirect, RequestUtils}; +use crate::util::{RequestUtils, redirect}; use crate::views::EncodableVersionDownload; use axum::extract::{FromRequestParts, Query}; use axum::response::{IntoResponse, Response}; diff --git a/src/controllers/version/readme.rs b/src/controllers/version/readme.rs index 53df1cd84ee..27236fd2613 100644 --- a/src/controllers/version/readme.rs +++ b/src/controllers/version/readme.rs @@ -1,6 +1,6 @@ use crate::app::AppState; use crate::controllers::version::CrateVersionPath; -use crate::util::{redirect, RequestUtils}; +use crate::util::{RequestUtils, redirect}; use axum::response::{IntoResponse, Response}; use axum_extra::json; use http::request::Parts; diff --git a/src/controllers/version/update.rs b/src/controllers/version/update.rs index 65849f8b538..f74c2f5969c 100644 --- a/src/controllers/version/update.rs +++ b/src/controllers/version/update.rs @@ -6,7 +6,7 @@ use crate::models::token::EndpointScope; use crate::models::{Crate, NewVersionOwnerAction, Version, VersionAction, VersionOwnerAction}; use crate::rate_limiter::LimitedAction; use crate::schema::versions; -use crate::util::errors::{bad_request, custom, AppResult}; +use crate::util::errors::{AppResult, bad_request, custom}; use crate::views::EncodableVersion; use crate::worker::jobs::{SyncToGitIndex, SyncToSparseIndex, UpdateDefaultVersion}; use axum::Json; @@ -15,8 +15,8 @@ use axum_extra::response::ErasedJson; use crates_io_worker::BackgroundJob; use diesel::prelude::*; use diesel_async::{AsyncPgConnection, RunQueryDsl}; -use http::request::Parts; use http::StatusCode; +use http::request::Parts; use serde::Deserialize; #[derive(Deserialize)] diff --git a/src/controllers/version/yank.rs b/src/controllers/version/yank.rs index c06f49771c2..7f7b3d367fc 100644 --- a/src/controllers/version/yank.rs +++ b/src/controllers/version/yank.rs @@ -1,7 +1,7 @@ //! Endpoints for yanking and unyanking specific versions of crates -use super::update::{authenticate, perform_version_yank_update}; use super::CrateVersionPath; +use super::update::{authenticate, perform_version_yank_update}; use crate::app::AppState; use crate::controllers::helpers::ok_true; use crate::rate_limiter::LimitedAction; diff --git a/src/db.rs b/src/db.rs index c28c7a83661..4beffd92a71 100644 --- a/src/db.rs +++ b/src/db.rs @@ -1,7 +1,7 @@ use crate::certs::CRUNCHY; use diesel::{ConnectionResult, QueryResult}; -use diesel_async::pooled_connection::deadpool::{Hook, HookError}; use diesel_async::pooled_connection::ManagerConfig; +use diesel_async::pooled_connection::deadpool::{Hook, HookError}; use diesel_async::{AsyncPgConnection, RunQueryDsl}; use native_tls::{Certificate, TlsConnector}; use postgres_native_tls::MakeTlsConnector; diff --git a/src/email.rs b/src/email.rs index 830f1ab097e..07bf2363207 100644 --- a/src/email.rs +++ b/src/email.rs @@ -1,11 +1,11 @@ -use crate::config; use crate::Env; +use crate::config; use lettre::address::Envelope; -use lettre::message::header::ContentType; use lettre::message::Mailbox; +use lettre::message::header::ContentType; use lettre::transport::file::AsyncFileTransport; -use lettre::transport::smtp::authentication::{Credentials, Mechanism}; use lettre::transport::smtp::AsyncSmtpTransport; +use lettre::transport::smtp::authentication::{Credentials, Mechanism}; use lettre::transport::stub::AsyncStubTransport; use lettre::{Address, AsyncTransport, Message, Tokio1Executor}; use rand::distr::{Alphanumeric, SampleString}; diff --git a/src/fastly.rs b/src/fastly.rs index 469bb53a402..c572c443c48 100644 --- a/src/fastly.rs +++ b/src/fastly.rs @@ -1,6 +1,6 @@ -use anyhow::{anyhow, Context}; -use reqwest::header::{HeaderMap, HeaderValue}; +use anyhow::{Context, anyhow}; use reqwest::Client; +use reqwest::header::{HeaderMap, HeaderValue}; use secrecy::{ExposeSecret, SecretString}; #[derive(Debug)] diff --git a/src/metrics/instance.rs b/src/metrics/instance.rs index 108432cdb72..b6778303622 100644 --- a/src/metrics/instance.rs +++ b/src/metrics/instance.rs @@ -19,10 +19,10 @@ use crate::app::App; use crate::metrics::macros::metrics; -use diesel_async::pooled_connection::deadpool::Pool; use diesel_async::AsyncPgConnection; +use diesel_async::pooled_connection::deadpool::Pool; use prometheus::{ - proto::MetricFamily, HistogramVec, IntCounter, IntCounterVec, IntGauge, IntGaugeVec, + HistogramVec, IntCounter, IntCounterVec, IntGauge, IntGaugeVec, proto::MetricFamily, }; metrics! { diff --git a/src/metrics/log_encoder.rs b/src/metrics/log_encoder.rs index 395aeb9fe5f..39c1f6ef14a 100644 --- a/src/metrics/log_encoder.rs +++ b/src/metrics/log_encoder.rs @@ -239,7 +239,7 @@ enum VectorMetricData { mod tests { use super::*; use anyhow::Error; - use base64::{engine::general_purpose, Engine}; + use base64::{Engine, engine::general_purpose}; use prometheus::{Histogram, HistogramOpts, IntCounter, IntGauge, IntGaugeVec, Opts, Registry}; #[test] diff --git a/src/metrics/service.rs b/src/metrics/service.rs index dc1783e6cab..fcc65af2c11 100644 --- a/src/metrics/service.rs +++ b/src/metrics/service.rs @@ -15,7 +15,7 @@ use crate::schema::{background_jobs, crates, versions}; use crate::util::errors::AppResult; use diesel::{dsl::count_star, prelude::*}; use diesel_async::{AsyncPgConnection, RunQueryDsl}; -use prometheus::{proto::MetricFamily, IntGauge, IntGaugeVec}; +use prometheus::{IntGauge, IntGaugeVec, proto::MetricFamily}; metrics! { pub struct ServiceMetrics { diff --git a/src/middleware.rs b/src/middleware.rs index d223a5b6de6..c23142e3013 100644 --- a/src/middleware.rs +++ b/src/middleware.rs @@ -12,8 +12,8 @@ mod static_or_continue; mod update_metrics; use ::sentry::integrations::tower as sentry_tower; -use axum::middleware::{from_fn, from_fn_with_state}; use axum::Router; +use axum::middleware::{from_fn, from_fn_with_state}; use axum_extra::either::Either; use axum_extra::middleware::option_layer; use std::time::Duration; @@ -23,8 +23,8 @@ use tower_http::catch_panic::CatchPanicLayer; use tower_http::compression::{CompressionLayer, CompressionLevel}; use tower_http::timeout::{RequestBodyTimeoutLayer, TimeoutLayer}; -use crate::app::AppState; use crate::Env; +use crate::app::AppState; pub fn apply_axum_middleware(state: AppState, router: Router<()>) -> Router { let config = &state.config; diff --git a/src/middleware/cargo_compat.rs b/src/middleware/cargo_compat.rs index f99199e4fe3..0e74dab6021 100644 --- a/src/middleware/cargo_compat.rs +++ b/src/middleware/cargo_compat.rs @@ -1,8 +1,8 @@ +use axum::Json; use axum::extract::{MatchedPath, Request, State}; use axum::middleware::Next; use axum::response::{IntoResponse, Response}; -use axum::Json; -use http::{header, Method, StatusCode}; +use http::{Method, StatusCode, header}; use std::str::FromStr; #[derive(Clone, Copy, Debug)] @@ -131,10 +131,10 @@ async fn convert_to_json_response(res: Response) -> anyhow::Result { #[cfg(test)] mod tests { use super::*; + use axum::Router; use axum::body::Body; use axum::middleware::from_fn_with_state; use axum::routing::{get, put}; - use axum::Router; use bytes::Bytes; use http::response::Parts; use http::{Request, StatusCode}; diff --git a/src/middleware/common_headers.rs b/src/middleware/common_headers.rs index e304c9a4269..b79467eaee8 100644 --- a/src/middleware/common_headers.rs +++ b/src/middleware/common_headers.rs @@ -3,7 +3,7 @@ use axum::extract::Request; use axum::middleware::Next; use axum::response::IntoResponse; use axum_extra::headers::{CacheControl, Expires, HeaderMapExt}; -use http::{header, HeaderMap, HeaderValue}; +use http::{HeaderMap, HeaderValue, header}; use std::time::{Duration, SystemTime}; // see http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header diff --git a/src/middleware/ember_html.rs b/src/middleware/ember_html.rs index 0434fd02770..e46ff2de260 100644 --- a/src/middleware/ember_html.rs +++ b/src/middleware/ember_html.rs @@ -14,9 +14,9 @@ use std::sync::{Arc, LazyLock, OnceLock}; use axum::extract::Request; use axum::middleware::Next; use axum::response::{IntoResponse, Response}; -use futures_util::future::{BoxFuture, Shared}; use futures_util::FutureExt; -use http::{header, HeaderMap, HeaderValue, Method, StatusCode}; +use futures_util::future::{BoxFuture, Shared}; +use http::{HeaderMap, HeaderValue, Method, StatusCode, header}; use url::Url; use crate::app::AppState; diff --git a/src/middleware/log_request.rs b/src/middleware/log_request.rs index c5d37bb44fc..8af57c6d88d 100644 --- a/src/middleware/log_request.rs +++ b/src/middleware/log_request.rs @@ -5,12 +5,12 @@ use crate::controllers::util::RequestPartsExt; use crate::headers::XRequestId; use crate::middleware::normalize_path::OriginalPath; use crate::middleware::real_ip::RealIp; +use axum::Extension; use axum::extract::{MatchedPath, Request}; use axum::middleware::Next; use axum::response::IntoResponse; -use axum::Extension; -use axum_extra::headers::UserAgent; use axum_extra::TypedHeader; +use axum_extra::headers::UserAgent; use derive_more::Deref; use http::{Method, Uri}; use parking_lot::Mutex; @@ -56,7 +56,7 @@ pub async fn log_requests( let url = request_metadata .original_path .as_ref() - .map(|p| Cow::Borrowed(&p.0 .0)) + .map(|p| Cow::Borrowed(&p.0.0)) .unwrap_or_else(|| Cow::Owned(request_metadata.uri.to_string())); let matched_path = request_metadata diff --git a/src/middleware/normalize_path.rs b/src/middleware/normalize_path.rs index 3c63c3bc229..c69ef96342c 100644 --- a/src/middleware/normalize_path.rs +++ b/src/middleware/normalize_path.rs @@ -66,7 +66,7 @@ fn normalize_path_inner(req: &mut Request) { #[cfg(test)] mod tests { - use super::{normalize_path_inner, OriginalPath}; + use super::{OriginalPath, normalize_path_inner}; use axum::body::Body; use axum::extract::Request; diff --git a/src/middleware/require_user_agent.rs b/src/middleware/require_user_agent.rs index f17e539db73..d3bd41ca2a8 100644 --- a/src/middleware/require_user_agent.rs +++ b/src/middleware/require_user_agent.rs @@ -12,8 +12,8 @@ use crate::middleware::log_request::RequestLogExt; use axum::extract::Request; use axum::middleware::Next; use axum::response::IntoResponse; -use axum_extra::headers::UserAgent; use axum_extra::TypedHeader; +use axum_extra::headers::UserAgent; use http::StatusCode; pub async fn require_user_agent( diff --git a/src/router.rs b/src/router.rs index 10bf725826c..bd58d51fc00 100644 --- a/src/router.rs +++ b/src/router.rs @@ -4,11 +4,11 @@ use axum::{Json, Router}; use http::{Method, StatusCode}; use utoipa_axum::routes; +use crate::Env; use crate::app::AppState; use crate::controllers::*; use crate::openapi::BaseOpenApi; use crate::util::errors::not_found; -use crate::Env; #[allow(deprecated)] pub fn build_axum_router(state: AppState) -> Router<()> { diff --git a/src/ssh/mod.rs b/src/ssh/mod.rs index 61cd2b5eafc..d5de00ed9e9 100644 --- a/src/ssh/mod.rs +++ b/src/ssh/mod.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Context}; +use anyhow::{Context, anyhow}; use std::path::PathBuf; use std::{env, fs}; diff --git a/src/storage.rs b/src/storage.rs index 4e0d4ed3c4b..490ea0d1c95 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -443,7 +443,11 @@ mod tests { let storage = Storage::from_config(&config); let crate_tests = vec![ - ("foo", "1.2.3", "https://static.crates.io/crates/foo/foo-1.2.3.crate"), + ( + "foo", + "1.2.3", + "https://static.crates.io/crates/foo/foo-1.2.3.crate", + ), ( "some-long-crate-name", "42.0.5-beta.1+foo", @@ -455,7 +459,11 @@ mod tests { } let readme_tests = vec![ - ("foo", "1.2.3", "https://static.crates.io/readmes/foo/foo-1.2.3.html"), + ( + "foo", + "1.2.3", + "https://static.crates.io/readmes/foo/foo-1.2.3.html", + ), ( "some-long-crate-name", "42.0.5-beta.1+foo", diff --git a/src/tests/account_lock.rs b/src/tests/account_lock.rs index 20ec13125ea..e1adbf2d208 100644 --- a/src/tests/account_lock.rs +++ b/src/tests/account_lock.rs @@ -1,4 +1,4 @@ -use crate::tests::{util::RequestHelper, TestApp}; +use crate::tests::{TestApp, util::RequestHelper}; use chrono::{DateTime, Duration, Utc}; use http::StatusCode; use insta::assert_snapshot; diff --git a/src/tests/authentication.rs b/src/tests/authentication.rs index 38efcb633ee..2a4a505dead 100644 --- a/src/tests/authentication.rs +++ b/src/tests/authentication.rs @@ -1,8 +1,8 @@ -use crate::tests::util::{MockRequestExt, RequestHelper, Response}; use crate::tests::TestApp; +use crate::tests::util::{MockRequestExt, RequestHelper, Response}; use crate::tests::util::encode_session_header; -use http::{header, Method, StatusCode}; +use http::{Method, StatusCode, header}; use insta::assert_snapshot; static URL: &str = "/api/v1/me/updates"; diff --git a/src/tests/builders/krate.rs b/src/tests/builders/krate.rs index 3a289e6ae52..88e6adddf30 100644 --- a/src/tests/builders/krate.rs +++ b/src/tests/builders/krate.rs @@ -1,4 +1,4 @@ -use crate::models::{update_default_version, Category, Crate, Keyword, NewCrate}; +use crate::models::{Category, Crate, Keyword, NewCrate, update_default_version}; use crate::schema::{crate_downloads, crates, version_downloads}; use crate::util::errors::AppResult; diff --git a/src/tests/builders/publish.rs b/src/tests/builders/publish.rs index bbeb170586e..644d7a9aef1 100644 --- a/src/tests/builders/publish.rs +++ b/src/tests/builders/publish.rs @@ -266,20 +266,12 @@ trait NoneOrFilled: Sized { impl NoneOrFilled for Vec { fn none_or_filled(self) -> Option { - if self.is_empty() { - None - } else { - Some(self) - } + if self.is_empty() { None } else { Some(self) } } } impl NoneOrFilled for BTreeMap { fn none_or_filled(self) -> Option { - if self.is_empty() { - None - } else { - Some(self) - } + if self.is_empty() { None } else { Some(self) } } } diff --git a/src/tests/cors.rs b/src/tests/cors.rs index 1ea713ca79f..a38c3dcdb7b 100644 --- a/src/tests/cors.rs +++ b/src/tests/cors.rs @@ -1,5 +1,5 @@ -use crate::tests::util::{MockRequestExt, RequestHelper}; use crate::tests::TestApp; +use crate::tests::util::{MockRequestExt, RequestHelper}; use http::StatusCode; use insta::assert_snapshot; diff --git a/src/tests/krate/publish/emails.rs b/src/tests/krate/publish/emails.rs index 0e06a6a0067..22df3c83b98 100644 --- a/src/tests/krate/publish/emails.rs +++ b/src/tests/krate/publish/emails.rs @@ -1,7 +1,7 @@ use crate::schema::emails; use crate::tests::builders::PublishBuilder; use crate::tests::util::{RequestHelper, TestApp}; -use diesel::{delete, update, ExpressionMethods}; +use diesel::{ExpressionMethods, delete, update}; use diesel_async::RunQueryDsl; use googletest::prelude::*; diff --git a/src/tests/krate/publish/timestamps.rs b/src/tests/krate/publish/timestamps.rs index 98139be1f58..8590b8744e1 100644 --- a/src/tests/krate/publish/timestamps.rs +++ b/src/tests/krate/publish/timestamps.rs @@ -1,11 +1,11 @@ #[tokio::test(flavor = "multi_thread")] async fn uploading_new_version_touches_crate() { use crate::schema::crates; + use crate::tests::CrateResponse; use crate::tests::builders::PublishBuilder; use crate::tests::util::{RequestHelper, TestApp}; - use crate::tests::CrateResponse; - use diesel::dsl::*; use diesel::ExpressionMethods; + use diesel::dsl::*; use diesel_async::RunQueryDsl; let (app, _, user) = TestApp::full().with_user().await; diff --git a/src/tests/krate/yanking.rs b/src/tests/krate/yanking.rs index dbae08818c4..28e721c8c29 100644 --- a/src/tests/krate/yanking.rs +++ b/src/tests/krate/yanking.rs @@ -1,9 +1,9 @@ use crate::rate_limiter::LimitedAction; use crate::schema::publish_limit_buckets; +use crate::tests::VersionResponse; use crate::tests::builders::PublishBuilder; use crate::tests::routes::crates::versions::yank_unyank::YankRequestHelper; use crate::tests::util::{RequestHelper, TestApp}; -use crate::tests::VersionResponse; use chrono::Utc; use diesel::ExpressionMethods; use diesel_async::RunQueryDsl; diff --git a/src/tests/owners.rs b/src/tests/owners.rs index 03075334134..c0c7f892a3d 100644 --- a/src/tests/owners.rs +++ b/src/tests/owners.rs @@ -3,7 +3,7 @@ use crate::tests::builders::{CrateBuilder, PublishBuilder}; use crate::tests::util::{ MockAnonymousUser, MockCookieUser, MockTokenUser, RequestHelper, Response, }; -use crate::tests::{add_team_to_crate, new_team, TestApp}; +use crate::tests::{TestApp, add_team_to_crate, new_team}; use crate::views::{ EncodableCrateOwnerInvitationV1, EncodableOwner, EncodablePublicUser, InvitationResponse, }; diff --git a/src/tests/routes/crates/list.rs b/src/tests/routes/crates/list.rs index 639d6dc15b6..6f5d09d33fc 100644 --- a/src/tests/routes/crates/list.rs +++ b/src/tests/routes/crates/list.rs @@ -1023,9 +1023,11 @@ async fn pagination_links_included_if_applicable() -> anyhow::Result<()> { Some("?letter=p&per_page=1&page=2".to_string()), page3.meta.prev_page ); - assert!([page1.meta.total, page2.meta.total, page3.meta.total] - .iter() - .all(|w| *w == 3)); + assert!( + [page1.meta.total, page2.meta.total, page3.meta.total] + .iter() + .all(|w| *w == 3) + ); assert_eq!(page4.meta.total, 0); for p in [page1, page2, page3, page4] { assert!(default_versions_iter(&p.crates).all(Option::is_some)); @@ -1218,18 +1220,21 @@ async fn search_both(anon: &U, query: &str) -> [crate::tests:: anon.search(&format!("page=1&{query}")).await, anon.search(query).await, ); - assert!(offset - .meta - .next_page - .as_deref() - .unwrap_or("page=2") - .contains("page=2")); - assert!(seek - .meta - .next_page - .as_deref() - .unwrap_or("seek=") - .contains("seek=")); + assert!( + offset + .meta + .next_page + .as_deref() + .unwrap_or("page=2") + .contains("page=2") + ); + assert!( + seek.meta + .next_page + .as_deref() + .unwrap_or("seek=") + .contains("seek=") + ); assert!(default_versions_iter(&offset.crates).all(Option::is_some)); assert!(default_versions_iter(&seek.crates).all(Option::is_some)); [offset, seek] @@ -1288,8 +1293,8 @@ async fn querystring_rank( ) -> indexmap::IndexMap { use diesel_full_text_search::configuration::TsConfigurationByName; use diesel_full_text_search::{plainto_tsquery_with_search_config, ts_rank_cd}; - use futures_util::future::ready; use futures_util::TryStreamExt; + use futures_util::future::ready; let tsquery = plainto_tsquery_with_search_config(TsConfigurationByName("english"), q); let rank = ts_rank_cd(crates::textsearchable_index_col, tsquery); diff --git a/src/tests/routes/crates/read.rs b/src/tests/routes/crates/read.rs index 727e5233ad6..3ed80eb7191 100644 --- a/src/tests/routes/crates/read.rs +++ b/src/tests/routes/crates/read.rs @@ -11,7 +11,7 @@ async fn show() { let user = user.as_model(); use crate::schema::versions; - use diesel::{update, ExpressionMethods}; + use diesel::{ExpressionMethods, update}; CrateBuilder::new("foo_show", user.id) .description("description") diff --git a/src/tests/routes/crates/reverse_dependencies.rs b/src/tests/routes/crates/reverse_dependencies.rs index a9c4b426899..1889c556649 100644 --- a/src/tests/routes/crates/reverse_dependencies.rs +++ b/src/tests/routes/crates/reverse_dependencies.rs @@ -182,7 +182,7 @@ async fn reverse_dependencies_includes_published_by_user_when_present() { let user = user.as_model(); use crate::schema::versions; - use diesel::{update, ExpressionMethods}; + use diesel::{ExpressionMethods, update}; use diesel_async::RunQueryDsl; let c1 = CrateBuilder::new("c1", user.id) diff --git a/src/tests/routes/me/tokens/create.rs b/src/tests/routes/me/tokens/create.rs index 6ca675ed6d4..d203b01f966 100644 --- a/src/tests/routes/me/tokens/create.rs +++ b/src/tests/routes/me/tokens/create.rs @@ -1,5 +1,5 @@ -use crate::models::token::{CrateScope, EndpointScope, NewApiToken}; use crate::models::ApiToken; +use crate::models::token::{CrateScope, EndpointScope, NewApiToken}; use crate::tests::util::insta::{self, assert_json_snapshot}; use crate::tests::util::{RequestHelper, TestApp}; use diesel::prelude::*; @@ -7,7 +7,7 @@ use diesel_async::RunQueryDsl; use googletest::prelude::*; use http::StatusCode; use insta::assert_snapshot; -use serde_json::{json, Value}; +use serde_json::{Value, json}; static NEW_BAR: &[u8] = br#"{ "api_token": { "name": "bar" } }"#; diff --git a/src/tests/routes/me/updates.rs b/src/tests/routes/me/updates.rs index 12e497bbfea..f81f56e525f 100644 --- a/src/tests/routes/me/updates.rs +++ b/src/tests/routes/me/updates.rs @@ -1,7 +1,7 @@ use crate::schema::versions; +use crate::tests::OkBool; use crate::tests::builders::{CrateBuilder, VersionBuilder}; use crate::tests::util::{RequestHelper, TestApp}; -use crate::tests::OkBool; use crate::views::EncodableVersion; use diesel::prelude::*; use diesel::update; diff --git a/src/tests/routes/summary.rs b/src/tests/routes/summary.rs index ed6efdd7752..ae45e19570f 100644 --- a/src/tests/routes/summary.rs +++ b/src/tests/routes/summary.rs @@ -5,7 +5,7 @@ use crate::tests::util::{RequestHelper, TestApp}; use crate::views::{EncodableCategory, EncodableCrate, EncodableKeyword}; use chrono::Utc; use crates_io_database::schema::categories; -use diesel::{insert_into, update, ExpressionMethods}; +use diesel::{ExpressionMethods, insert_into, update}; use diesel_async::scoped_futures::ScopedFutureExt; use diesel_async::{AsyncConnection, RunQueryDsl}; diff --git a/src/tests/routes/users/stats.rs b/src/tests/routes/users/stats.rs index 3c80bb5ecbd..d2896782234 100644 --- a/src/tests/routes/users/stats.rs +++ b/src/tests/routes/users/stats.rs @@ -11,7 +11,7 @@ async fn user_total_downloads() -> anyhow::Result<()> { use crate::tests::builders::CrateBuilder; use crate::tests::util::{RequestHelper, TestApp}; use diesel::prelude::*; - use diesel::{update, QueryDsl}; + use diesel::{QueryDsl, update}; use diesel_async::RunQueryDsl; let (app, anon, user) = TestApp::init().with_user().await; diff --git a/src/tests/server.rs b/src/tests/server.rs index e770faf8284..17200f5efac 100644 --- a/src/tests/server.rs +++ b/src/tests/server.rs @@ -3,7 +3,7 @@ use crate::tests::util::*; use std::collections::HashSet; use ::insta::assert_json_snapshot; -use http::{header, Request, StatusCode}; +use http::{Request, StatusCode, header}; #[tokio::test(flavor = "multi_thread")] async fn user_agent_is_required() { diff --git a/src/tests/team.rs b/src/tests/team.rs index daaa32ac1f9..34561a20cc0 100644 --- a/src/tests/team.rs +++ b/src/tests/team.rs @@ -1,6 +1,6 @@ use crate::models::{Crate, CrateOwner, NewTeam}; use crate::tests::builders::{CrateBuilder, PublishBuilder}; -use crate::tests::{add_team_to_crate, new_team, OwnerTeamsResponse, RequestHelper, TestApp}; +use crate::tests::{OwnerTeamsResponse, RequestHelper, TestApp, add_team_to_crate, new_team}; use diesel::*; use diesel_async::RunQueryDsl; diff --git a/src/tests/token.rs b/src/tests/token.rs index a265f5dd873..42382c94e22 100644 --- a/src/tests/token.rs +++ b/src/tests/token.rs @@ -3,7 +3,7 @@ use crate::tests::{RequestHelper, TestApp}; use crate::{models::ApiToken, views::EncodableMe}; use diesel::prelude::*; use diesel_async::RunQueryDsl; -use http::{header, StatusCode}; +use http::{StatusCode, header}; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] diff --git a/src/tests/unhealthy_database.rs b/src/tests/unhealthy_database.rs index 038b6ac47c6..0286e5ac89c 100644 --- a/src/tests/unhealthy_database.rs +++ b/src/tests/unhealthy_database.rs @@ -1,7 +1,7 @@ use crate::tests::builders::CrateBuilder; use crate::tests::util::{RequestHelper, TestApp}; -use diesel_async::pooled_connection::deadpool::Pool; use diesel_async::AsyncPgConnection; +use diesel_async::pooled_connection::deadpool::Pool; use googletest::assert_that; use googletest::matchers::ends_with; use http::StatusCode; diff --git a/src/tests/user.rs b/src/tests/user.rs index 11a3d3448dc..33e98796849 100644 --- a/src/tests/user.rs +++ b/src/tests/user.rs @@ -1,8 +1,8 @@ use crate::controllers::session; use crate::models::{ApiToken, Email, User}; +use crate::tests::TestApp; use crate::tests::util::github::next_gh_id; use crate::tests::util::{MockCookieUser, RequestHelper}; -use crate::tests::TestApp; use crate::util::token::HashedToken; use chrono::{DateTime, Utc}; use crates_io_github::GithubUser; diff --git a/src/tests/util/chaosproxy.rs b/src/tests/util/chaosproxy.rs index 5486fd5610a..cc72e6f5689 100644 --- a/src/tests/util/chaosproxy.rs +++ b/src/tests/util/chaosproxy.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Context}; +use anyhow::{Context, anyhow}; use std::net::SocketAddr; use std::sync::Arc; use tokio::io::{AsyncReadExt, AsyncWriteExt}; diff --git a/src/tests/util/mock_request.rs b/src/tests/util/mock_request.rs index 077dd086999..1209bb304f5 100644 --- a/src/tests/util/mock_request.rs +++ b/src/tests/util/mock_request.rs @@ -1,5 +1,5 @@ use axum::body::Bytes; -use http::{header, header::IntoHeaderName, HeaderValue, Request}; +use http::{HeaderValue, Request, header, header::IntoHeaderName}; pub type MockRequest = Request; @@ -37,7 +37,7 @@ mod tests { use super::{MockRequest, MockRequestExt}; use axum::body::Bytes; - use hyper::http::{header, Method, Request}; + use hyper::http::{Method, Request, header}; pub fn mock_request(method: Method, path: &str) -> MockRequest { Request::builder() diff --git a/src/tests/util/response.rs b/src/tests/util/response.rs index 6dbaea9626e..72314f7b1fd 100644 --- a/src/tests/util/response.rs +++ b/src/tests/util/response.rs @@ -7,7 +7,7 @@ use std::str::from_utf8; use crate::rate_limiter::LimitedAction; use derive_more::Deref; -use http::{header, StatusCode}; +use http::{StatusCode, header}; /// A type providing helper methods for working with responses #[derive(Deref)] diff --git a/src/tests/util/test_app.rs b/src/tests/util/test_app.rs index 3ce16a8aead..2e155b3332b 100644 --- a/src/tests/util/test_app.rs +++ b/src/tests/util/test_app.rs @@ -3,8 +3,8 @@ use crate::config::{ self, Base, CdnLogQueueConfig, CdnLogStorageConfig, DatabasePools, DbPoolConfig, }; use crate::middleware::cargo_compat::StatusCodeConfig; -use crate::models::token::{CrateScope, EndpointScope}; use crate::models::NewEmail; +use crate::models::token::{CrateScope, EndpointScope}; use crate::rate_limiter::{LimitedAction, RateLimiterConfig}; use crate::storage::StorageConfig; use crate::tests::util::chaosproxy::ChaosProxy; diff --git a/src/tests/version.rs b/src/tests/version.rs index 424e431cc70..7e8966a2702 100644 --- a/src/tests/version.rs +++ b/src/tests/version.rs @@ -1,6 +1,6 @@ use crate::models::Version; -use crate::tests::builders::{CrateBuilder, VersionBuilder}; use crate::tests::TestApp; +use crate::tests::builders::{CrateBuilder, VersionBuilder}; #[tokio::test(flavor = "multi_thread")] async fn record_rerendered_readme_time() -> anyhow::Result<()> { diff --git a/src/tests/worker/sync_admins.rs b/src/tests/worker/sync_admins.rs index 296f5f8fa6a..01d73859ecf 100644 --- a/src/tests/worker/sync_admins.rs +++ b/src/tests/worker/sync_admins.rs @@ -3,8 +3,8 @@ use crate::tests::util::TestApp; use crate::worker::jobs::SyncAdmins; use crates_io_team_repo::{MockTeamRepo, Permission, Person}; use crates_io_worker::BackgroundJob; -use diesel::prelude::*; use diesel::QueryResult; +use diesel::prelude::*; use diesel_async::{AsyncPgConnection, RunQueryDsl}; use insta::assert_snapshot; diff --git a/src/typosquat/cache.rs b/src/typosquat/cache.rs index 57715610004..8c135aef703 100644 --- a/src/typosquat/cache.rs +++ b/src/typosquat/cache.rs @@ -1,8 +1,8 @@ use diesel_async::AsyncPgConnection; use std::sync::Arc; use thiserror::Error; -use typomania::checks::{Bitflips, Omitted, SwappedWords, Typos}; use typomania::Harness; +use typomania::checks::{Bitflips, Omitted, SwappedWords, Typos}; use super::{checks::Affixes, config, database::TopCrates}; @@ -39,7 +39,9 @@ impl Cache { if emails.is_empty() { // If we're not notifying anyone, then there's really not much to do here. - warn!("$TYPOSQUAT_NOTIFICATION_EMAILS is not set; no typosquatting notifications will be sent"); + warn!( + "$TYPOSQUAT_NOTIFICATION_EMAILS is not set; no typosquatting notifications will be sent" + ); Ok(Self { emails, harness: None, diff --git a/src/util/errors.rs b/src/util/errors.rs index e2e6312442b..fd4f9ea9794 100644 --- a/src/util/errors.rs +++ b/src/util/errors.rs @@ -33,7 +33,7 @@ use crate::email::EmailError; use crate::util::diesel::is_read_only_error; use crates_io_github::GitHubError; pub use json::TOKEN_FORMAT_ERROR; -pub(crate) use json::{custom, InsecurelyGeneratedTokenRevoked, TooManyRequests}; +pub(crate) use json::{InsecurelyGeneratedTokenRevoked, TooManyRequests, custom}; pub type BoxedAppError = Box; diff --git a/src/util/errors/json.rs b/src/util/errors/json.rs index b2a6a6e6ffa..baf878d1eae 100644 --- a/src/util/errors/json.rs +++ b/src/util/errors/json.rs @@ -1,5 +1,5 @@ -use axum::response::{IntoResponse, Response}; use axum::Extension; +use axum::response::{IntoResponse, Response}; use axum_extra::json; use std::borrow::Cow; use std::fmt; @@ -9,7 +9,7 @@ use super::{AppError, BoxedAppError}; use crate::middleware::log_request::CauseField; use crate::rate_limiter::LimitedAction; use chrono::{DateTime, Utc}; -use http::{header, StatusCode}; +use http::{StatusCode, header}; /// Generates a response with the provided status and description as JSON fn json_error(detail: &str, status: StatusCode) -> Response { @@ -95,8 +95,7 @@ impl AppError for InsecurelyGeneratedTokenRevoked { } } -pub const TOKEN_FORMAT_ERROR: &str = - "The given API token does not match the format used by crates.io. \ +pub const TOKEN_FORMAT_ERROR: &str = "The given API token does not match the format used by crates.io. \ \ Tokens generated before 2020-07-14 were generated with an insecure \ random number generator, and have been revoked. You can generate a \ diff --git a/src/util/request_helpers.rs b/src/util/request_helpers.rs index f16e8f9ae0c..be7ebc272af 100644 --- a/src/util/request_helpers.rs +++ b/src/util/request_helpers.rs @@ -1,7 +1,7 @@ use crate::controllers::util::RequestPartsExt; use axum::response::{IntoResponse, Response}; use http::header::AsHeaderName; -use http::{header, HeaderMap, StatusCode}; +use http::{HeaderMap, StatusCode, header}; use indexmap::IndexMap; pub trait HeaderMapExt { diff --git a/src/util/tracing.rs b/src/util/tracing.rs index cf40fb53e27..15ff4ec3f4e 100644 --- a/src/util/tracing.rs +++ b/src/util/tracing.rs @@ -3,7 +3,7 @@ use sentry::integrations::tracing::EventFilter; use tracing::Level; use tracing::Metadata; use tracing_subscriber::filter::LevelFilter; -use tracing_subscriber::{prelude::*, EnvFilter, Layer}; +use tracing_subscriber::{EnvFilter, Layer, prelude::*}; /// Initializes the `tracing` logging framework. /// diff --git a/src/worker/environment.rs b/src/worker/environment.rs index b9d465db789..842a3690a2c 100644 --- a/src/worker/environment.rs +++ b/src/worker/environment.rs @@ -1,14 +1,14 @@ +use crate::Emails; use crate::cloudfront::CloudFront; use crate::fastly::Fastly; use crate::storage::Storage; use crate::typosquat; -use crate::Emails; use anyhow::Context; use bon::Builder; use crates_io_index::{Repository, RepositoryConfig}; use crates_io_team_repo::TeamRepo; -use diesel_async::pooled_connection::deadpool::Pool; use diesel_async::AsyncPgConnection; +use diesel_async::pooled_connection::deadpool::Pool; use object_store::ObjectStore; use parking_lot::{Mutex, MutexGuard}; use std::ops::{Deref, DerefMut}; diff --git a/src/worker/jobs/archive_version_downloads.rs b/src/worker/jobs/archive_version_downloads.rs index 208a2ea7ae5..fc338c5d393 100644 --- a/src/worker/jobs/archive_version_downloads.rs +++ b/src/worker/jobs/archive_version_downloads.rs @@ -2,7 +2,7 @@ use super::IndexVersionDownloadsArchive; use crate::schema::version_downloads; use crate::tasks::spawn_blocking; use crate::worker::Environment; -use anyhow::{anyhow, Context}; +use anyhow::{Context, anyhow}; use chrono::{NaiveDate, Utc}; use crates_io_worker::BackgroundJob; use diesel::prelude::*; @@ -10,8 +10,8 @@ use diesel_async::{AsyncPgConnection, RunQueryDsl}; use futures_util::StreamExt; use object_store::ObjectStore; use secrecy::{ExposeSecret, SecretString}; -use std::collections::btree_map::Entry; use std::collections::BTreeMap; +use std::collections::btree_map::Entry; use std::path::Path; use std::sync::Arc; use std::time::Instant; @@ -93,7 +93,9 @@ async fn export( info!("Exporting version downloads to CSV file…"); let instant = Instant::now(); - let command = format!("\\copy (SELECT date, version_id, downloads FROM version_downloads WHERE date < '{before}') TO '{filename}' WITH CSV HEADER"); + let command = format!( + "\\copy (SELECT date, version_id, downloads FROM version_downloads WHERE date < '{before}') TO '{filename}' WITH CSV HEADER" + ); psql(database_url, &command).await?; let elapsed = instant.elapsed(); diff --git a/src/worker/jobs/downloads/process_log.rs b/src/worker/jobs/downloads/process_log.rs index 9b50c3c239f..ed024c74b31 100644 --- a/src/worker/jobs/downloads/process_log.rs +++ b/src/worker/jobs/downloads/process_log.rs @@ -2,19 +2,19 @@ use crate::config::CdnLogStorageConfig; use crate::worker::Environment; use anyhow::Context; use chrono::NaiveDate; -use crates_io_cdn_logs::{count_downloads, Decompressor, DownloadsMap}; +use crates_io_cdn_logs::{Decompressor, DownloadsMap, count_downloads}; use crates_io_worker::BackgroundJob; use diesel::dsl::exists; use diesel::prelude::*; -use diesel::{select, QueryResult}; +use diesel::{QueryResult, select}; use diesel_async::pooled_connection::deadpool::Pool; use diesel_async::scoped_futures::ScopedFutureExt; use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl}; +use object_store::ObjectStore; use object_store::aws::AmazonS3Builder; use object_store::local::LocalFileSystem; use object_store::memory::InMemory; use object_store::path::Path; -use object_store::ObjectStore; use semver::Version; use std::fmt::Debug; use std::sync::Arc; diff --git a/src/worker/jobs/downloads/queue/job.rs b/src/worker/jobs/downloads/queue/job.rs index e4f06b7531a..4289fea21c1 100644 --- a/src/worker/jobs/downloads/queue/job.rs +++ b/src/worker/jobs/downloads/queue/job.rs @@ -1,14 +1,14 @@ use crate::config::CdnLogQueueConfig; use crate::sqs::{MockSqsQueue, SqsQueue, SqsQueueImpl}; -use crate::worker::jobs::ProcessCdnLog; use crate::worker::Environment; +use crate::worker::jobs::ProcessCdnLog; use anyhow::Context; use aws_credential_types::Credentials; use aws_sdk_sqs::config::Region; use aws_sdk_sqs::types::Message; use crates_io_worker::BackgroundJob; -use diesel_async::pooled_connection::deadpool::Pool; use diesel_async::AsyncPgConnection; +use diesel_async::pooled_connection::deadpool::Pool; use std::sync::Arc; /// A background job that processes messages from the CDN log queue. @@ -223,13 +223,13 @@ async fn enqueue_jobs( mod tests { use super::*; use aws_sdk_sqs::operation::receive_message::builders::ReceiveMessageOutputBuilder; - use aws_sdk_sqs::types::builders::MessageBuilder; use aws_sdk_sqs::types::Message; + use aws_sdk_sqs::types::builders::MessageBuilder; use crates_io_test_db::TestDatabase; use crates_io_worker::schema::background_jobs; use diesel::prelude::*; - use diesel_async::pooled_connection::AsyncDieselConnectionManager; use diesel_async::RunQueryDsl; + use diesel_async::pooled_connection::AsyncDieselConnectionManager; use insta::assert_snapshot; use parking_lot::Mutex; use serde_json::json; @@ -366,7 +366,7 @@ mod tests { "cloudfront/static.crates.io/EJED5RT0WA7HA.2024-02-01-10.6a8be093.gz", "cloudfront/static.staging.crates.io/E6OCLKYH9FE8V.2024-02-01-10.5da9e90c.gz", "fastly-requests/static.crates.io/2024-02-01T09:00:00.000-4AIwSEQyIFDSzdAT1Fqt.log.zst", - "fastly-requests/static.staging.crates.io/2024-02-01T09:00:00.000-QPF3Ea8eICqLkzaoC_Wt.log.zst" + "fastly-requests/static.staging.crates.io/2024-02-01T09:00:00.000-QPF3Ea8eICqLkzaoC_Wt.log.zst", ]; for path in valid_paths { assert!(!is_ignored_path(path)); diff --git a/src/worker/jobs/dump_db.rs b/src/worker/jobs/dump_db.rs index 0fdf3512177..e741443b1b4 100644 --- a/src/worker/jobs/dump_db.rs +++ b/src/worker/jobs/dump_db.rs @@ -1,6 +1,6 @@ use crate::tasks::spawn_blocking; use crate::worker::Environment; -use crates_io_database_dump::{create_archives, DumpDirectory}; +use crates_io_database_dump::{DumpDirectory, create_archives}; use crates_io_worker::BackgroundJob; use secrecy::ExposeSecret; use std::path::PathBuf; diff --git a/src/worker/jobs/expiry_notification.rs b/src/worker/jobs/expiry_notification.rs index eaa41c8cff4..4119eab29aa 100644 --- a/src/worker/jobs/expiry_notification.rs +++ b/src/worker/jobs/expiry_notification.rs @@ -1,6 +1,6 @@ use crate::models::ApiToken; use crate::schema::api_tokens; -use crate::{email::Email, models::User, worker::Environment, Emails}; +use crate::{Emails, email::Email, models::User, worker::Environment}; use chrono::SecondsFormat; use crates_io_worker::BackgroundJob; use diesel::dsl::now; @@ -46,10 +46,14 @@ async fn check(emails: &Emails, conn: &mut AsyncPgConnection) -> anyhow::Result< return Ok(()); } - info!("Found {num_tokens} tokens that will expire before {before}. Sending out expiry notifications…"); + info!( + "Found {num_tokens} tokens that will expire before {before}. Sending out expiry notifications…" + ); if num_tokens == MAX_ROWS as usize { - warn!("The maximum number of API tokens per query has been reached. More API tokens might be processed on the next run."); + warn!( + "The maximum number of API tokens per query has been reached. More API tokens might be processed on the next run." + ); } let mut success = 0; @@ -235,9 +239,10 @@ mod tests { assert_eq!(sent_mail.len(), 1); let sent = &sent_mail[0]; assert_eq!(&sent.0.to(), &["testuser@test.com".parse::
()?]); - assert!(sent - .1 - .contains("crates.io: Your API token \"test_token\" is about to expire")); + assert!( + sent.1 + .contains("crates.io: Your API token \"test_token\" is about to expire") + ); let updated_token = api_tokens::table .filter(api_tokens::id.eq(token.id)) .filter(api_tokens::expiry_notification_at.is_not_null()) diff --git a/src/worker/jobs/index_version_downloads_archive/mod.rs b/src/worker/jobs/index_version_downloads_archive/mod.rs index 1a1d16965da..317d205f550 100644 --- a/src/worker/jobs/index_version_downloads_archive/mod.rs +++ b/src/worker/jobs/index_version_downloads_archive/mod.rs @@ -112,7 +112,7 @@ impl FileSet { } pub fn to_html(&self) -> anyhow::Result { - use minijinja::{context, Environment}; + use minijinja::{Environment, context}; let template = include_str!("index.html.j2"); let context = context! { diff --git a/src/worker/jobs/readmes.rs b/src/worker/jobs/readmes.rs index cab0530156b..09e996ab897 100644 --- a/src/worker/jobs/readmes.rs +++ b/src/worker/jobs/readmes.rs @@ -5,8 +5,8 @@ use crate::tasks::spawn_blocking; use crate::worker::Environment; use crates_io_markdown::text_to_html; use crates_io_worker::BackgroundJob; -use diesel_async::scoped_futures::ScopedFutureExt; use diesel_async::AsyncConnection; +use diesel_async::scoped_futures::ScopedFutureExt; use std::sync::Arc; #[derive(Clone, Serialize, Deserialize)] diff --git a/src/worker/jobs/rss/sync_crate_feed.rs b/src/worker/jobs/rss/sync_crate_feed.rs index 8b62e7bf20e..12db08234e3 100644 --- a/src/worker/jobs/rss/sync_crate_feed.rs +++ b/src/worker/jobs/rss/sync_crate_feed.rs @@ -247,12 +247,12 @@ mod tests { .unwrap() } - fn create_version( + fn create_version>>( conn: &mut AsyncPgConnection, crate_id: i32, - version: impl Into>, + version: T, publish_time: DateTime, - ) -> impl Future { + ) -> impl Future + use { let version = version.into(); let future = diesel::insert_into(versions::table) .values(( diff --git a/src/worker/jobs/rss/sync_crates_feed.rs b/src/worker/jobs/rss/sync_crates_feed.rs index c41c7bd12f3..4258f50e38c 100644 --- a/src/worker/jobs/rss/sync_crates_feed.rs +++ b/src/worker/jobs/rss/sync_crates_feed.rs @@ -211,11 +211,11 @@ mod tests { assert_debug_snapshot!(new_crates.iter().map(|u| &u.name).collect::>()); } - fn create_crate( + fn create_crate>>( conn: &mut AsyncPgConnection, - name: impl Into>, + name: T, publish_time: DateTime, - ) -> impl Future { + ) -> impl Future + use { let future = diesel::insert_into(crates::table) .values(( crates::name.eq(name.into()), diff --git a/src/worker/jobs/rss/sync_updates_feed.rs b/src/worker/jobs/rss/sync_updates_feed.rs index 1a1c390214d..5aa295097d7 100644 --- a/src/worker/jobs/rss/sync_updates_feed.rs +++ b/src/worker/jobs/rss/sync_updates_feed.rs @@ -237,12 +237,12 @@ mod tests { .unwrap() } - fn create_version( + fn create_version>>( conn: &mut AsyncPgConnection, crate_id: i32, - version: impl Into>, + version: T, publish_time: DateTime, - ) -> impl Future { + ) -> impl Future + use { let version = version.into(); let future = diesel::insert_into(versions::table) .values(( diff --git a/src/worker/jobs/typosquat.rs b/src/worker/jobs/typosquat.rs index df187175e5a..b2e82735a7c 100644 --- a/src/worker/jobs/typosquat.rs +++ b/src/worker/jobs/typosquat.rs @@ -4,10 +4,10 @@ use crates_io_worker::BackgroundJob; use diesel_async::AsyncPgConnection; use typomania::Package; +use crate::Emails; use crate::email::Email; use crate::typosquat::{Cache, Crate}; use crate::worker::Environment; -use crate::Emails; /// A job to check the name of a newly published crate against the most popular crates to see if /// the new crate might be typosquatting an existing, popular crate.