From 4393254ad34f8e0c51b5777c0c45f6980320a484 Mon Sep 17 00:00:00 2001 From: Denis Cornehl Date: Sat, 22 Feb 2025 10:25:24 +0100 Subject: [PATCH] upgrade to edition 2024 --- Cargo.toml | 2 +- benches/compression.rs | 4 +- src/bin/cratesfyi.rs | 20 ++-- src/build_queue.rs | 73 +++++++------ src/cdn.rs | 136 ++++++++++++++---------- src/config.rs | 2 +- src/db/add_package.rs | 4 +- src/db/delete.rs | 17 +-- src/db/mod.rs | 2 +- src/db/overrides.rs | 4 +- src/db/pool.rs | 4 +- src/docbuilder/limits.rs | 2 +- src/docbuilder/rustwide_builder.rs | 76 ++++++++------ src/lib.rs | 2 +- src/metrics/mod.rs | 3 +- src/registry_api.rs | 4 +- src/repositories/github.rs | 10 +- src/repositories/gitlab.rs | 8 +- src/repositories/updater.rs | 8 +- src/storage/archive_index.rs | 12 ++- src/storage/compression.rs | 13 +-- src/storage/database.rs | 2 +- src/storage/mod.rs | 97 +++++++++-------- src/storage/s3.rs | 4 +- src/test/fakes.rs | 10 +- src/test/mod.rs | 8 +- src/utils/cargo_metadata.rs | 4 +- src/utils/consistency/mod.rs | 4 +- src/utils/daemon.rs | 5 +- src/utils/html.rs | 2 +- src/utils/mod.rs | 20 ++-- src/utils/queue_builder.rs | 4 +- src/utils/rustc_version.rs | 2 +- src/utils/sized_buffer.rs | 10 +- src/web/build_details.rs | 37 ++++--- src/web/builds.rs | 78 ++++++++------ src/web/cache.rs | 10 +- src/web/crate_details.rs | 36 ++++--- src/web/csp.rs | 4 +- src/web/error.rs | 4 +- src/web/extractors.rs | 2 +- src/web/features.rs | 4 +- src/web/file.rs | 4 +- src/web/highlight.rs | 4 +- src/web/markdown.rs | 2 +- src/web/metrics.rs | 10 +- src/web/mod.rs | 38 ++++--- src/web/page/web_page.rs | 2 +- src/web/releases.rs | 161 +++++++++++++++++------------ src/web/routes.rs | 6 +- src/web/rustdoc.rs | 87 +++++++++------- src/web/sitemap.rs | 10 +- src/web/source.rs | 36 ++++--- src/web/statics.rs | 4 +- src/web/status.rs | 7 +- 55 files changed, 632 insertions(+), 492 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bdbdd4972..a606b79db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ readme = "README.md" license = "MIT" repository = "https://github.com/rust-lang/docs.rs" build = "build.rs" -edition = "2021" +edition = "2024" [workspace] exclude = [ diff --git a/benches/compression.rs b/benches/compression.rs index d95801b8a..8f8285a0e 100644 --- a/benches/compression.rs +++ b/benches/compression.rs @@ -1,5 +1,5 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput}; -use docs_rs::storage::{compress, decompress, CompressionAlgorithm}; +use criterion::{Criterion, Throughput, black_box, criterion_group, criterion_main}; +use docs_rs::storage::{CompressionAlgorithm, compress, decompress}; pub fn regex_capture_matches(c: &mut Criterion) { // this isn't a great benchmark because it only tests on one file diff --git a/src/bin/cratesfyi.rs b/src/bin/cratesfyi.rs index 038ca2a05..2ebb3cff7 100644 --- a/src/bin/cratesfyi.rs +++ b/src/bin/cratesfyi.rs @@ -5,30 +5,30 @@ use std::path::PathBuf; use std::str::FromStr; use std::sync::Arc; -use anyhow::{anyhow, Context as _, Error, Result}; +use anyhow::{Context as _, Error, Result, anyhow}; use clap::{Parser, Subcommand, ValueEnum}; use docs_rs::cdn::CdnBackend; -use docs_rs::db::{self, add_path_into_database, CrateId, Overrides, Pool}; +use docs_rs::db::{self, CrateId, Overrides, Pool, add_path_into_database}; use docs_rs::repositories::RepositoryStatsUpdater; use docs_rs::utils::{ - get_config, get_crate_pattern_and_priority, list_crate_priorities, queue_builder, - remove_crate_priority, set_config, set_crate_priority, ConfigName, + ConfigName, get_config, get_crate_pattern_and_priority, list_crate_priorities, queue_builder, + remove_crate_priority, set_config, set_crate_priority, }; use docs_rs::{ - start_background_metrics_webserver, start_web_server, AsyncBuildQueue, AsyncStorage, - BuildQueue, Config, Context, Index, InstanceMetrics, PackageKind, RegistryApi, RustwideBuilder, - ServiceMetrics, Storage, + AsyncBuildQueue, AsyncStorage, BuildQueue, Config, Context, Index, InstanceMetrics, + PackageKind, RegistryApi, RustwideBuilder, ServiceMetrics, Storage, + start_background_metrics_webserver, start_web_server, }; use futures_util::StreamExt; use humantime::Duration; use once_cell::sync::OnceCell; use sentry::{ - integrations::panic as sentry_panic, integrations::tracing as sentry_tracing, - TransactionContext, + TransactionContext, integrations::panic as sentry_panic, + integrations::tracing as sentry_tracing, }; use tokio::runtime::{Builder, Runtime}; use tracing_log::LogTracer; -use tracing_subscriber::{filter::Directive, prelude::*, EnvFilter}; +use tracing_subscriber::{EnvFilter, filter::Directive, prelude::*}; fn main() { // set the global log::logger for backwards compatibility diff --git a/src/build_queue.rs b/src/build_queue.rs index 4f94db520..9844183e4 100644 --- a/src/build_queue.rs +++ b/src/build_queue.rs @@ -1,14 +1,14 @@ -use crate::db::{delete_crate, delete_version, update_latest_version_id, CrateId, Pool}; +use crate::Context; +use crate::db::{CrateId, Pool, delete_crate, delete_version, update_latest_version_id}; use crate::docbuilder::PackageKind; use crate::error::Result; use crate::storage::AsyncStorage; -use crate::utils::{get_config, get_crate_priority, report_error, retry, set_config, ConfigName}; -use crate::Context; -use crate::{cdn, BuildPackageSummary}; +use crate::utils::{ConfigName, get_config, get_crate_priority, report_error, retry, set_config}; +use crate::{BuildPackageSummary, cdn}; use crate::{Config, Index, InstanceMetrics, RustwideBuilder}; use anyhow::Context as _; use fn_error_context::context; -use futures_util::{stream::TryStreamExt, StreamExt}; +use futures_util::{StreamExt, stream::TryStreamExt}; use sqlx::Connection as _; use std::collections::HashMap; use std::sync::Arc; @@ -125,7 +125,7 @@ impl AsyncBuildQueue { .pending_count_by_priority() .await? .iter() - .filter(|(&priority, _)| priority <= 0) + .filter(|&(&priority, _)| priority <= 0) .map(|(_, count)| count) .sum::()) } @@ -756,8 +756,10 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default() - .rustc_version("rustc 1.84.0-nightly (e7c0d2750 2020-10-15)")]) + .builds(vec![ + FakeBuild::default() + .rustc_version("rustc 1.84.0-nightly (e7c0d2750 2020-10-15)"), + ]) .create() .await?; @@ -785,8 +787,10 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default() - .rustc_version("rustc 1.84.0-nightly (e7c0d2750 2020-10-15)")]) + .builds(vec![ + FakeBuild::default() + .rustc_version("rustc 1.84.0-nightly (e7c0d2750 2020-10-15)"), + ]) .create() .await?; @@ -833,8 +837,10 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default() - .rustc_version("rustc 1.84.0-nightly (e7c0d2750 2020-10-15)")]) + .builds(vec![ + FakeBuild::default() + .rustc_version("rustc 1.84.0-nightly (e7c0d2750 2020-10-15)"), + ]) .create() .await?; @@ -867,8 +873,10 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default() - .rustc_version("rustc 1.84.0-nightly (e7c0d2750 2020-10-15)")]) + .builds(vec![ + FakeBuild::default() + .rustc_version("rustc 1.84.0-nightly (e7c0d2750 2020-10-15)"), + ]) .create() .await?; @@ -1090,15 +1098,16 @@ mod tests { assert_eq!(metrics.build_time.get_sample_count(), 9); // no invalidations were run since we don't have a distribution id configured - assert!(env - .runtime() - .block_on(async { - cdn::queued_or_active_crate_invalidations( - &mut *env.async_db().await.async_conn().await, - ) - .await - })? - .is_empty()); + assert!( + env.runtime() + .block_on(async { + cdn::queued_or_active_crate_invalidations( + &mut *env.async_db().await.async_conn().await, + ) + .await + })? + .is_empty() + ); Ok(()) }) @@ -1135,9 +1144,11 @@ mod tests { let queued_invalidations = fetch_invalidations(); assert_eq!(queued_invalidations.len(), 3); - assert!(queued_invalidations - .iter() - .all(|i| i.krate == "will_succeed")); + assert!( + queued_invalidations + .iter() + .all(|i| i.krate == "will_succeed") + ); queue.process_next_crate(|krate| { assert_eq!("will_fail", krate.name); @@ -1146,10 +1157,12 @@ mod tests { let queued_invalidations = fetch_invalidations(); assert_eq!(queued_invalidations.len(), 6); - assert!(queued_invalidations - .iter() - .skip(3) - .all(|i| i.krate == "will_fail")); + assert!( + queued_invalidations + .iter() + .skip(3) + .all(|i| i.krate == "will_fail") + ); Ok(()) }) diff --git a/src/cdn.rs b/src/cdn.rs index 61fb78b9b..25aa294c7 100644 --- a/src/cdn.rs +++ b/src/cdn.rs @@ -1,11 +1,11 @@ -use crate::{metrics::duration_to_seconds, utils::report_error, Config, InstanceMetrics}; -use anyhow::{anyhow, bail, Context, Error, Result}; +use crate::{Config, InstanceMetrics, metrics::duration_to_seconds, utils::report_error}; +use anyhow::{Context, Error, Result, anyhow, bail}; use aws_config::BehaviorVersion; use aws_sdk_cloudfront::{ - config::{retry::RetryConfig, Region}, + Client, + config::{Region, retry::RetryConfig}, error::SdkError, types::{InvalidationBatch, Paths}, - Client, }; use chrono::{DateTime, Utc}; use futures_util::stream::TryStreamExt; @@ -133,7 +133,7 @@ impl CdnBackend { path_patterns: &[&str], ) { let CdnBackend::Dummy { - ref invalidation_requests, + invalidation_requests, .. } = self else { @@ -646,13 +646,13 @@ mod tests { use super::*; use crate::test::async_wrapper; - use aws_sdk_cloudfront::{config::Credentials, Config}; + use aws_sdk_cloudfront::{Config, config::Credentials}; use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; use aws_smithy_types::body::SdkBody; fn active_invalidations(cdn: &CdnBackend, distribution_id: &str) -> Vec { let CdnBackend::Dummy { - ref invalidation_requests, + invalidation_requests, .. } = cdn else { @@ -734,9 +734,11 @@ mod tests { let config = env.config(); let mut conn = env.async_db().await.async_conn().await; - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .is_empty()); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .is_empty() + ); let counts = queued_or_active_crate_invalidation_count_by_distribution(&mut conn, &config) @@ -760,9 +762,11 @@ mod tests { let cdn = env.cdn().await; let config = env.config(); let mut conn = env.async_db().await.async_conn().await; - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .is_empty()); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .is_empty() + ); queue_crate_invalidation(&mut conn, &env.config(), "krate").await?; @@ -844,10 +848,12 @@ mod tests { } // the queued entries got a CDN reference attached - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .iter() - .all(|i| i.cdn_reference.is_some() && i.created_in_cdn.is_some())); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .iter() + .all(|i| i.cdn_reference.is_some() && i.created_in_cdn.is_some()) + ); Ok(()) }); @@ -864,9 +870,11 @@ mod tests { let cdn = env.cdn().await; let config = env.config(); let mut conn = env.async_db().await.async_conn().await; - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .is_empty()); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .is_empty() + ); queue_crate_invalidation(&mut conn, &env.config(), "krate").await?; @@ -948,10 +956,12 @@ mod tests { } // the queued entries got a CDN reference attached - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .iter() - .all(|i| i.cdn_reference.is_some() && i.created_in_cdn.is_some())); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .iter() + .all(|i| i.cdn_reference.is_some() && i.created_in_cdn.is_some()) + ); // clear the active invalidations in the CDN to _fake_ them // being completed on the CDN side. @@ -976,9 +986,11 @@ mod tests { .await?; // which removes them from the queue table - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .is_empty()); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .is_empty() + ); Ok(()) }); @@ -1004,9 +1016,11 @@ mod tests { .await?; let mut conn = env.async_db().await.async_conn().await; - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .is_empty()); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .is_empty() + ); // insert some completed invalidations into the queue & the CDN, these will be ignored for i in 0..10 { @@ -1082,9 +1096,11 @@ mod tests { .await?; let mut conn = env.async_db().await.async_conn().await; - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .is_empty()); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .is_empty() + ); insert_running_invalidation( &mut conn, "distribution_id_web", @@ -1106,14 +1122,16 @@ mod tests { .await?; // nothing was added to the CDN - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .iter() - .filter(|i| !matches!( - &i.cdn_reference, - Some(val) if val == &already_running_invalidation.invalidation_id - )) - .all(|i| i.cdn_reference.is_none())); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .iter() + .filter(|i| !matches!( + &i.cdn_reference, + Some(val) if val == &already_running_invalidation.invalidation_id + )) + .all(|i| i.cdn_reference.is_none()) + ); // old invalidations are still active let ir_web = active_invalidations(&cdn, "distribution_id_web"); @@ -1135,10 +1153,12 @@ mod tests { .await?; // which adds the CDN reference - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .iter() - .all(|i| i.cdn_reference.is_some())); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .iter() + .all(|i| i.cdn_reference.is_some()) + ); // and creates them in the CDN too let ir_web = active_invalidations(&cdn, "distribution_id_web"); @@ -1160,9 +1180,11 @@ mod tests { let mut conn = env.async_db().await.async_conn().await; // no invalidation is queued - assert!(queued_or_active_crate_invalidations(&mut conn) - .await? - .is_empty()); + assert!( + queued_or_active_crate_invalidations(&mut conn) + .await? + .is_empty() + ); // run the handler handle_queued_invalidation_requests( @@ -1265,14 +1287,16 @@ mod tests { )]); let client = Client::from_conf(get_mock_config(conn.clone()).await); - assert!(CdnBackend::get_cloudfront_invalidation_status( - &client, - "some_distribution", - "some_reference", - ) - .await - .expect("error getting invalidation") - .is_none()); + assert!( + CdnBackend::get_cloudfront_invalidation_status( + &client, + "some_distribution", + "some_reference", + ) + .await + .expect("error getting invalidation") + .is_none() + ); } #[tokio::test] diff --git a/src/config.rs b/src/config.rs index 2cb6a1281..0692595fa 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,5 +1,5 @@ use crate::{cdn::CdnKind, storage::StorageKind}; -use anyhow::{anyhow, bail, Context, Result}; +use anyhow::{Context, Result, anyhow, bail}; use chrono::NaiveDate; use std::{env::VarError, error::Error, path::PathBuf, str::FromStr, time::Duration}; use tracing::trace; diff --git a/src/db/add_package.rs b/src/db/add_package.rs index eb00f9b7b..f42d2344a 100644 --- a/src/db/add_package.rs +++ b/src/db/add_package.rs @@ -4,10 +4,10 @@ use crate::{ error::Result, registry_api::{CrateData, CrateOwner, ReleaseData}, storage::CompressionAlgorithm, - utils::{rustc_version::parse_rustc_date, MetadataPackage}, + utils::{MetadataPackage, rustc_version::parse_rustc_date}, web::crate_details::{latest_release, releases_for_crate}, }; -use anyhow::{anyhow, Context}; +use anyhow::{Context, anyhow}; use derive_more::Display; use futures_util::stream::TryStreamExt; use serde::Serialize; diff --git a/src/db/delete.rs b/src/db/delete.rs index 33ccf3fb7..c69564a6f 100644 --- a/src/db/delete.rs +++ b/src/db/delete.rs @@ -1,13 +1,13 @@ use crate::{ - error::Result, - storage::{rustdoc_archive_path, source_archive_path, AsyncStorage}, Config, + error::Result, + storage::{AsyncStorage, rustdoc_archive_path, source_archive_path}, }; use anyhow::Context as _; use fn_error_context::context; use sqlx::Connection; -use super::{update_latest_version_id, CrateId}; +use super::{CrateId, update_latest_version_id}; /// List of directories in docs.rs's underlying storage (either the database or S3) containing a /// subdirectory named after the crate. Those subdirectories will be deleted. @@ -480,11 +480,12 @@ mod tests { // local and remote index are gone too let archive_index = format!("{rustdoc_archive}.index"); assert!(!env.async_storage().await.exists(&archive_index).await?); - assert!(!env - .config() - .local_archive_cache_path - .join(&archive_index) - .exists()); + assert!( + !env.config() + .local_archive_cache_path + .join(&archive_index) + .exists() + ); } else { assert!( !env.async_storage() diff --git a/src/db/mod.rs b/src/db/mod.rs index 310826921..4c903952b 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -9,7 +9,7 @@ pub(crate) use self::add_package::{ }; pub use self::{ add_package::{ - update_build_status, update_crate_data_in_database, BuildId, CrateId, ReleaseId, + BuildId, CrateId, ReleaseId, update_build_status, update_crate_data_in_database, }, delete::{delete_crate, delete_version}, file::{add_path_into_database, add_path_into_remote_archive}, diff --git a/src/db/overrides.rs b/src/db/overrides.rs index ab23c8284..a11e0f3e8 100644 --- a/src/db/overrides.rs +++ b/src/db/overrides.rs @@ -40,7 +40,9 @@ impl Overrides { pub async fn save(conn: &mut sqlx::PgConnection, krate: &str, overrides: Self) -> Result<()> { if overrides.timeout.is_some() && overrides.targets.is_none() { - tracing::warn!("setting `Overrides::timeout` implies a default `Overrides::targets = 1`, prefer setting this explicitly"); + tracing::warn!( + "setting `Overrides::timeout` implies a default `Overrides::targets = 1`, prefer setting this explicitly" + ); } if sqlx::query_scalar!("SELECT id FROM crates WHERE crates.name = $1", krate) diff --git a/src/db/pool.rs b/src/db/pool.rs index 43d0a3ba9..d3fe03a41 100644 --- a/src/db/pool.rs +++ b/src/db/pool.rs @@ -1,7 +1,7 @@ -use crate::metrics::InstanceMetrics; use crate::Config; +use crate::metrics::InstanceMetrics; use futures_util::{future::BoxFuture, stream::BoxStream}; -use sqlx::{postgres::PgPoolOptions, Executor}; +use sqlx::{Executor, postgres::PgPoolOptions}; use std::{ ops::{Deref, DerefMut}, sync::Arc, diff --git a/src/docbuilder/limits.rs b/src/docbuilder/limits.rs index 6b653b4b9..815169272 100644 --- a/src/docbuilder/limits.rs +++ b/src/docbuilder/limits.rs @@ -1,4 +1,4 @@ -use crate::{db::Overrides, error::Result, Config}; +use crate::{Config, db::Overrides, error::Result}; use serde::Serialize; use std::time::Duration; diff --git a/src/docbuilder/rustwide_builder.rs b/src/docbuilder/rustwide_builder.rs index 97d53658e..8704c167e 100644 --- a/src/docbuilder/rustwide_builder.rs +++ b/src/docbuilder/rustwide_builder.rs @@ -1,26 +1,26 @@ +use crate::RUSTDOC_STATIC_STORAGE_PREFIX; use crate::db::{ - add_doc_coverage, add_path_into_remote_archive, finish_build, finish_release, initialize_build, - initialize_crate, initialize_release, types::BuildStatus, update_build_with_error, - update_crate_data_in_database, Pool, -}; -use crate::db::{ - file::{add_path_into_database, file_list_to_json}, BuildId, + file::{add_path_into_database, file_list_to_json}, }; use crate::db::{CrateId, ReleaseId}; +use crate::db::{ + Pool, add_doc_coverage, add_path_into_remote_archive, finish_build, finish_release, + initialize_build, initialize_crate, initialize_release, types::BuildStatus, + update_build_with_error, update_crate_data_in_database, +}; use crate::docbuilder::Limits; use crate::error::Result; use crate::repositories::RepositoryStatsUpdater; use crate::storage::{rustdoc_archive_path, source_archive_path}; use crate::utils::{ - copy_dir_all, get_config, parse_rustc_version, report_error, set_config, CargoMetadata, - ConfigName, + CargoMetadata, ConfigName, copy_dir_all, get_config, parse_rustc_version, report_error, + set_config, }; -use crate::RUSTDOC_STATIC_STORAGE_PREFIX; -use crate::{db::blacklist::is_blacklisted, utils::MetadataPackage}; use crate::{AsyncStorage, Config, Context, InstanceMetrics, RegistryApi, Storage}; -use anyhow::{anyhow, bail, Context as _, Error}; -use docsrs_metadata::{BuildTargets, Metadata, DEFAULT_TARGETS, HOST_TARGET}; +use crate::{db::blacklist::is_blacklisted, utils::MetadataPackage}; +use anyhow::{Context as _, Error, anyhow, bail}; +use docsrs_metadata::{BuildTargets, DEFAULT_TARGETS, HOST_TARGET, Metadata}; use regex::Regex; use rustwide::cmd::{Command, CommandError, SandboxBuilder, SandboxImage}; use rustwide::logging::{self, LogStorage}; @@ -422,8 +422,12 @@ impl RustwideBuilder { .mem_available .expect("kernel version too old for determining memory limit"); if limits.memory() as u64 > available { - bail!("not enough memory to build {} {}: needed {} MiB, have {} MiB\nhelp: set DOCSRS_DISABLE_MEMORY_LIMIT=true to force a build", - name, version, limits.memory() / 1024 / 1024, available / 1024 / 1024 + bail!( + "not enough memory to build {} {}: needed {} MiB, have {} MiB\nhelp: set DOCSRS_DISABLE_MEMORY_LIMIT=true to force a build", + name, + version, + limits.memory() / 1024 / 1024, + available / 1024 / 1024 ); } else { debug!( @@ -821,12 +825,14 @@ impl RustwideBuilder { &build.host_source_dir(), )?; - let mut rustdoc_flags = vec![if create_essential_files { - "--emit=unversioned-shared-resources,toolchain-shared-resources" - } else { - "--emit=invocation-specific" - } - .to_string()]; + let mut rustdoc_flags = vec![ + if create_essential_files { + "--emit=unversioned-shared-resources,toolchain-shared-resources" + } else { + "--emit=invocation-specific" + } + .to_string(), + ]; rustdoc_flags.extend(vec![ "--resource-suffix".to_string(), format!("-{}", parse_rustc_version(self.rustc_version()?)?), @@ -1046,7 +1052,7 @@ mod tests { use crate::db::types::Feature; use crate::registry_api::ReleaseData; use crate::storage::CompressionAlgorithm; - use crate::test::{wrapper, AxumRouterTestExt, TestEnvironment}; + use crate::test::{AxumRouterTestExt, TestEnvironment, wrapper}; fn get_features( env: &TestEnvironment, @@ -1246,9 +1252,11 @@ mod tests { assert!(target_docs_present); runtime.block_on(web.assert_success(&target_url))?; - assert!(storage - .exists(&format!("build-logs/{}/{target}.txt", row.build_id)) - .unwrap()); + assert!( + storage + .exists(&format!("build-logs/{}/{target}.txt", row.build_id)) + .unwrap() + ); } } @@ -1644,10 +1652,12 @@ mod tests { .successful ); - assert!(get_features(env, crate_, version)? - .unwrap() - .iter() - .any(|f| f.name == "serde_derive")); + assert!( + get_features(env, crate_, version)? + .unwrap() + .iter() + .any(|f| f.name == "serde_derive") + ); Ok(()) }); @@ -1667,10 +1677,12 @@ mod tests { .successful ); - assert!(!get_features(env, crate_, version)? - .unwrap() - .iter() - .any(|f| f.name == "with_builtin_macros")); + assert!( + !get_features(env, crate_, version)? + .unwrap() + .iter() + .any(|f| f.name == "with_builtin_macros") + ); Ok(()) }); diff --git a/src/lib.rs b/src/lib.rs index ff2a039bb..32ab281e0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,7 @@ //! documentation of crates for the Rust Programming Language. #![allow(clippy::cognitive_complexity)] -pub use self::build_queue::{queue_rebuilds, AsyncBuildQueue, BuildQueue}; +pub use self::build_queue::{AsyncBuildQueue, BuildQueue, queue_rebuilds}; pub use self::config::Config; pub use self::context::Context; pub use self::docbuilder::PackageKind; diff --git a/src/metrics/mod.rs b/src/metrics/mod.rs index 3f68a5dde..5ef471c6f 100644 --- a/src/metrics/mod.rs +++ b/src/metrics/mod.rs @@ -3,10 +3,9 @@ mod macros; use self::macros::MetricFromOpts; use crate::{ - cdn, + AsyncBuildQueue, Config, cdn, db::{CrateId, Pool, ReleaseId}, target::TargetAtom, - AsyncBuildQueue, Config, }; use anyhow::Error; use dashmap::DashMap; diff --git a/src/registry_api.rs b/src/registry_api.rs index 9e55898fe..74fe7f6dc 100644 --- a/src/registry_api.rs +++ b/src/registry_api.rs @@ -1,7 +1,7 @@ use crate::{error::Result, utils::retry_async}; -use anyhow::{anyhow, bail, Context}; +use anyhow::{Context, anyhow, bail}; use chrono::{DateTime, Utc}; -use reqwest::header::{HeaderValue, ACCEPT, USER_AGENT}; +use reqwest::header::{ACCEPT, HeaderValue, USER_AGENT}; use semver::Version; use serde::{Deserialize, Serialize}; use std::fmt; diff --git a/src/repositories/github.rs b/src/repositories/github.rs index 6fd683d4c..912551547 100644 --- a/src/repositories/github.rs +++ b/src/repositories/github.rs @@ -1,17 +1,17 @@ -use crate::error::Result; use crate::Config; +use crate::error::Result; use async_trait::async_trait; use chrono::{DateTime, Utc}; use reqwest::{ - header::{HeaderMap, HeaderValue, ACCEPT, AUTHORIZATION, USER_AGENT}, Client as HttpClient, + header::{ACCEPT, AUTHORIZATION, HeaderMap, HeaderValue, USER_AGENT}, }; use serde::Deserialize; use tracing::{trace, warn}; use crate::repositories::{ - FetchRepositoriesResult, RateLimitReached, Repository, RepositoryForge, RepositoryName, - APP_USER_AGENT, + APP_USER_AGENT, FetchRepositoriesResult, RateLimitReached, Repository, RepositoryForge, + RepositoryName, }; const GRAPHQL_UPDATE: &str = "query($ids: [ID!]!) { @@ -267,8 +267,8 @@ struct GraphIssues { #[cfg(test)] mod tests { use super::{Config, GitHub}; - use crate::repositories::updater::{repository_name, RepositoryForge}; use crate::repositories::RateLimitReached; + use crate::repositories::updater::{RepositoryForge, repository_name}; async fn mock_server_and_github(config: &Config) -> (mockito::ServerGuard, GitHub) { let server = mockito::Server::new_async().await; diff --git a/src/repositories/gitlab.rs b/src/repositories/gitlab.rs index 4544dac94..79fa93c0b 100644 --- a/src/repositories/gitlab.rs +++ b/src/repositories/gitlab.rs @@ -2,8 +2,8 @@ use crate::error::Result; use async_trait::async_trait; use chrono::{DateTime, Utc}; use reqwest::{ - header::{HeaderMap, HeaderValue, ACCEPT, AUTHORIZATION, USER_AGENT}, Client as HttpClient, + header::{ACCEPT, AUTHORIZATION, HeaderMap, HeaderValue, USER_AGENT}, }; use serde::Deserialize; use std::collections::HashSet; @@ -11,8 +11,8 @@ use std::str::FromStr; use tracing::warn; use crate::repositories::{ - FetchRepositoriesResult, RateLimitReached, Repository, RepositoryForge, RepositoryName, - APP_USER_AGENT, + APP_USER_AGENT, FetchRepositoriesResult, RateLimitReached, Repository, RepositoryForge, + RepositoryName, }; const GRAPHQL_UPDATE: &str = "query($ids: [ID!]!) { @@ -265,8 +265,8 @@ struct GraphProject { #[cfg(test)] mod tests { use super::GitLab; - use crate::repositories::updater::{repository_name, RepositoryForge}; use crate::repositories::RateLimitReached; + use crate::repositories::updater::{RepositoryForge, repository_name}; async fn mock_server_and_gitlab() -> (mockito::ServerGuard, GitLab) { let server = mockito::Server::new_async().await; diff --git a/src/repositories/updater.rs b/src/repositories/updater.rs index f9d1ce237..93354851a 100644 --- a/src/repositories/updater.rs +++ b/src/repositories/updater.rs @@ -1,7 +1,7 @@ use crate::error::Result; use crate::repositories::{GitHub, GitLab, RateLimitReached}; use crate::utils::MetadataPackage; -use crate::{db::Pool, Config}; +use crate::{Config, db::Pool}; use async_trait::async_trait; use chrono::{DateTime, Utc}; use futures_util::stream::TryStreamExt; @@ -258,8 +258,7 @@ impl RepositoryStatsUpdater { ) -> Result { trace!( "storing {} repository stats for {}", - host, - repo.name_with_owner, + host, repo.name_with_owner, ); Ok(sqlx::query_scalar!( "INSERT INTO repositories ( @@ -296,8 +295,7 @@ impl RepositoryStatsUpdater { ) -> Result<()> { trace!( "removing repository stats for host ID `{}` and host `{}`", - host_id, - host + host_id, host ); sqlx::query!( "DELETE FROM repositories WHERE host_id = $1 AND host = $2;", diff --git a/src/storage/archive_index.rs b/src/storage/archive_index.rs index 3326716fc..d4546e9fd 100644 --- a/src/storage/archive_index.rs +++ b/src/storage/archive_index.rs @@ -1,6 +1,6 @@ use crate::error::Result; -use crate::storage::{compression::CompressionAlgorithm, FileRange}; -use anyhow::{bail, Context as _}; +use crate::storage::{FileRange, compression::CompressionAlgorithm}; +use anyhow::{Context as _, bail}; use rusqlite::{Connection, OpenFlags, OptionalExtension}; use std::{fs, io, path::Path}; use tracing::instrument; @@ -150,9 +150,11 @@ mod tests { assert_eq!(fi.range, FileRange::new(39, 459)); assert_eq!(fi.compression, CompressionAlgorithm::Bzip2); - assert!(find_in_file(&tempfile, "some_other_file",) - .unwrap() - .is_none()); + assert!( + find_in_file(&tempfile, "some_other_file",) + .unwrap() + .is_none() + ); } #[test] diff --git a/src/storage/compression.rs b/src/storage/compression.rs index 449e1b17f..251056532 100644 --- a/src/storage/compression.rs +++ b/src/storage/compression.rs @@ -1,6 +1,6 @@ use anyhow::Error; -use bzip2::read::{BzDecoder, BzEncoder}; use bzip2::Compression; +use bzip2::read::{BzDecoder, BzEncoder}; use serde::{Deserialize, Serialize}; use std::{ collections::HashSet, @@ -125,11 +125,12 @@ mod tests { // Ensure decompressing a file over the limit returns a SizeLimitReached error. let err = decompress(compressed_big.as_slice(), alg, MAX_SIZE).unwrap_err(); - assert!(err - .downcast_ref::() - .and_then(|io| io.get_ref()) - .and_then(|err| err.downcast_ref::()) - .is_some()); + assert!( + err.downcast_ref::() + .and_then(|io| io.get_ref()) + .and_then(|err| err.downcast_ref::()) + .is_some() + ); } } diff --git a/src/storage/database.rs b/src/storage/database.rs index 7170eb991..46ca33929 100644 --- a/src/storage/database.rs +++ b/src/storage/database.rs @@ -1,5 +1,5 @@ use super::{Blob, FileRange}; -use crate::{db::Pool, error::Result, InstanceMetrics}; +use crate::{InstanceMetrics, db::Pool, error::Result}; use chrono::{DateTime, Utc}; use futures_util::stream::{Stream, TryStreamExt}; use sqlx::Acquire; diff --git a/src/storage/mod.rs b/src/storage/mod.rs index cbb30cde4..25001b1d0 100644 --- a/src/storage/mod.rs +++ b/src/storage/mod.rs @@ -3,17 +3,18 @@ mod compression; mod database; mod s3; -pub use self::compression::{compress, decompress, CompressionAlgorithm, CompressionAlgorithms}; +pub use self::compression::{CompressionAlgorithm, CompressionAlgorithms, compress, decompress}; use self::database::DatabaseBackend; use self::s3::S3Backend; use crate::{ + Config, InstanceMetrics, db::{ - file::{detect_mime, FileEntry}, - mimes, BuildId, Pool, + BuildId, Pool, + file::{FileEntry, detect_mime}, + mimes, }, error::Result, utils::spawn_blocking, - Config, InstanceMetrics, }; use anyhow::anyhow; use chrono::{DateTime, Utc}; @@ -907,11 +908,13 @@ mod backend_tests { assert!(!storage.get_public_access(path)?); for path in &["bar.txt", "baz.txt", "foo/baz.txt"] { - assert!(storage - .set_public_access(path, true) - .unwrap_err() - .downcast_ref::() - .is_some()); + assert!( + storage + .set_public_access(path, true) + .unwrap_err() + .downcast_ref::() + .is_some() + ); } Ok(()) @@ -937,17 +940,21 @@ mod backend_tests { assert!(!storage.get_public_access(path)?); for path in &["bar.txt", "baz.txt", "foo/baz.txt"] { - assert!(storage - .get(path, usize::MAX) - .unwrap_err() - .downcast_ref::() - .is_some()); - - assert!(storage - .get_public_access(path) - .unwrap_err() - .downcast_ref::() - .is_some()); + assert!( + storage + .get(path, usize::MAX) + .unwrap_err() + .downcast_ref::() + .is_some() + ); + + assert!( + storage + .get_public_access(path) + .unwrap_err() + .downcast_ref::() + .is_some() + ); } Ok(()) @@ -978,11 +985,13 @@ mod backend_tests { ); for path in &["bar.txt", "baz.txt", "foo/baz.txt"] { - assert!(storage - .get_range(path, usize::MAX, 0..=4, None) - .unwrap_err() - .downcast_ref::() - .is_some()); + assert!( + storage + .get_range(path, usize::MAX, 0..=4, None) + .unwrap_err() + .downcast_ref::() + .is_some() + ); } Ok(()) @@ -1024,10 +1033,12 @@ mod backend_tests { // When testing, minio just gave me `XMinioInvalidObjectName`, so I'll check that too. let long_filename = "ATCG".repeat(512); - assert!(storage - .get(&long_filename, 42) - .unwrap_err() - .is::()); + assert!( + storage + .get(&long_filename, 42) + .unwrap_err() + .is::() + ); Ok(()) } @@ -1055,13 +1066,15 @@ mod backend_tests { let blob = storage.get("small-blob.bin", MAX_SIZE)?; assert_eq!(blob.content.len(), small_blob.content.len()); - assert!(storage - .get("big-blob.bin", MAX_SIZE) - .unwrap_err() - .downcast_ref::() - .and_then(|io| io.get_ref()) - .and_then(|err| err.downcast_ref::()) - .is_some()); + assert!( + storage + .get("big-blob.bin", MAX_SIZE) + .unwrap_err() + .downcast_ref::() + .and_then(|io| io.get_ref()) + .and_then(|err| err.downcast_ref::()) + .is_some() + ); Ok(()) } @@ -1299,11 +1312,13 @@ mod backend_tests { assert!(storage.get(existing, usize::MAX).is_ok()); } for missing in missing { - assert!(storage - .get(missing, usize::MAX) - .unwrap_err() - .downcast_ref::() - .is_some()); + assert!( + storage + .get(missing, usize::MAX) + .unwrap_err() + .downcast_ref::() + .is_some() + ); } Ok(()) diff --git a/src/storage/s3.rs b/src/storage/s3.rs index 6af7ca414..74f27db00 100644 --- a/src/storage/s3.rs +++ b/src/storage/s3.rs @@ -4,10 +4,10 @@ use anyhow::{Context as _, Error}; use async_stream::try_stream; use aws_config::BehaviorVersion; use aws_sdk_s3::{ - config::{retry::RetryConfig, Region}, + Client, + config::{Region, retry::RetryConfig}, error::{ProvideErrorMetadata, SdkError}, types::{Delete, ObjectIdentifier, Tag, Tagging}, - Client, }; use aws_smithy_types_convert::date_time::DateTimeExt; use chrono::Utc; diff --git a/src/test/fakes.rs b/src/test/fakes.rs index c493f6f62..b2de2bd4f 100644 --- a/src/test/fakes.rs +++ b/src/test/fakes.rs @@ -1,19 +1,19 @@ use super::TestDatabase; -use crate::db::file::{file_list_to_json, FileEntry}; +use crate::db::file::{FileEntry, file_list_to_json}; use crate::db::types::BuildStatus; use crate::db::{ - initialize_build, initialize_crate, initialize_release, update_build_status, BuildId, ReleaseId, + BuildId, ReleaseId, initialize_build, initialize_crate, initialize_release, update_build_status, }; use crate::docbuilder::DocCoverage; use crate::error::Result; use crate::registry_api::{CrateData, CrateOwner, ReleaseData}; use crate::storage::{ - rustdoc_archive_path, source_archive_path, AsyncStorage, CompressionAlgorithm, + AsyncStorage, CompressionAlgorithm, rustdoc_archive_path, source_archive_path, }; use crate::utils::{Dependency, MetadataPackage, Target}; -use anyhow::{bail, Context}; -use base64::{engine::general_purpose::STANDARD as b64, Engine}; +use anyhow::{Context, bail}; +use base64::{Engine, engine::general_purpose::STANDARD as b64}; use chrono::{DateTime, Utc}; use std::collections::HashMap; use std::iter; diff --git a/src/test/mod.rs b/src/test/mod.rs index 1e411f3e6..45b7e017e 100644 --- a/src/test/mod.rs +++ b/src/test/mod.rs @@ -1,6 +1,6 @@ mod fakes; -pub(crate) use self::fakes::{fake_release_that_failed_before_build, FakeBuild}; +pub(crate) use self::fakes::{FakeBuild, fake_release_that_failed_before_build}; use crate::cdn::CdnBackend; use crate::db::{self, AsyncPoolClient, Pool}; use crate::error::Result; @@ -13,9 +13,9 @@ use crate::{ }; use anyhow::Context as _; use axum::body::Bytes; -use axum::{body::Body, http::Request, response::Response as AxumResponse, Router}; +use axum::{Router, body::Body, http::Request, response::Response as AxumResponse}; use fn_error_context::context; -use futures_util::{stream::TryStreamExt, FutureExt}; +use futures_util::{FutureExt, stream::TryStreamExt}; use http_body_util::BodyExt; // for `collect` use once_cell::sync::OnceCell; use serde::de::DeserializeOwned; @@ -365,7 +365,7 @@ pub(crate) struct TestEnvironment { } pub(crate) fn init_logger() { - use tracing_subscriber::{filter::Directive, EnvFilter}; + use tracing_subscriber::{EnvFilter, filter::Directive}; rustwide::logging::init_with(tracing_log::LogTracer::new()); let subscriber = tracing_subscriber::FmtSubscriber::builder() diff --git a/src/utils/cargo_metadata.rs b/src/utils/cargo_metadata.rs index 9ccb7bc86..66cd8e35b 100644 --- a/src/utils/cargo_metadata.rs +++ b/src/utils/cargo_metadata.rs @@ -1,6 +1,6 @@ use crate::error::Result; -use anyhow::{bail, Context}; -use rustwide::{cmd::Command, Toolchain, Workspace}; +use anyhow::{Context, bail}; +use rustwide::{Toolchain, Workspace, cmd::Command}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::path::Path; diff --git a/src/utils/consistency/mod.rs b/src/utils/consistency/mod.rs index 663880005..d60d8c292 100644 --- a/src/utils/consistency/mod.rs +++ b/src/utils/consistency/mod.rs @@ -1,4 +1,4 @@ -use crate::{db::delete, utils::spawn_blocking, Context}; +use crate::{Context, db::delete, utils::spawn_blocking}; use anyhow::{Context as _, Result}; use itertools::Itertools; use tracing::{info, warn}; @@ -159,7 +159,7 @@ where mod tests { use super::diff::Difference; use super::*; - use crate::test::{async_wrapper, TestEnvironment}; + use crate::test::{TestEnvironment, async_wrapper}; use sqlx::Row as _; async fn count(env: &TestEnvironment, sql: &str) -> Result { diff --git a/src/utils/daemon.rs b/src/utils/daemon.rs index f0b00b2c5..8b0bca064 100644 --- a/src/utils/daemon.rs +++ b/src/utils/daemon.rs @@ -3,12 +3,11 @@ //! This daemon will start web server, track new packages and build them use crate::{ - cdn, queue_rebuilds, + AsyncBuildQueue, Config, Context, Index, RustwideBuilder, cdn, queue_rebuilds, utils::{queue_builder, report_error}, web::start_web_server, - AsyncBuildQueue, Config, Context, Index, RustwideBuilder, }; -use anyhow::{anyhow, Context as _, Error}; +use anyhow::{Context as _, Error, anyhow}; use std::future::Future; use std::sync::Arc; use std::thread; diff --git a/src/utils/html.rs b/src/utils/html.rs index 0cf9931bb..ba457c397 100644 --- a/src/utils/html.rs +++ b/src/utils/html.rs @@ -107,7 +107,7 @@ pub(crate) fn rewrite_lol( #[cfg(test)] mod test { - use crate::test::{async_wrapper, AxumResponseTestExt, AxumRouterTestExt}; + use crate::test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; #[test] fn rewriting_only_injects_css_once() { diff --git a/src/utils/mod.rs b/src/utils/mod.rs index f7b717844..eff293dab 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -23,10 +23,10 @@ mod queue; pub(crate) mod queue_builder; pub(crate) mod rustc_version; use anyhow::Result; -use serde::de::DeserializeOwned; use serde::Serialize; +use serde::de::DeserializeOwned; use std::panic; -use tracing::{error, warn, Span}; +use tracing::{Span, error, warn}; pub(crate) mod sized_buffer; use std::{future::Future, thread, time::Duration}; @@ -196,9 +196,11 @@ mod tests { .execute(&mut *conn) .await?; - assert!(get_config::(&mut conn, ConfigName::RustcVersion) - .await? - .is_none()); + assert!( + get_config::(&mut conn, ConfigName::RustcVersion) + .await? + .is_none() + ); Ok(()) }); } @@ -211,9 +213,11 @@ mod tests { .execute(&mut *conn) .await?; - assert!(get_config::(&mut conn, ConfigName::RustcVersion) - .await? - .is_none()); + assert!( + get_config::(&mut conn, ConfigName::RustcVersion) + .await? + .is_none() + ); set_config( &mut conn, diff --git a/src/utils/queue_builder.rs b/src/utils/queue_builder.rs index 0cca02a8d..3430f62d4 100644 --- a/src/utils/queue_builder.rs +++ b/src/utils/queue_builder.rs @@ -1,7 +1,7 @@ use crate::Context; -use crate::{docbuilder::RustwideBuilder, utils::report_error, BuildQueue, Config}; +use crate::{BuildQueue, Config, docbuilder::RustwideBuilder, utils::report_error}; use anyhow::{Context as _, Error}; -use std::panic::{catch_unwind, AssertUnwindSafe}; +use std::panic::{AssertUnwindSafe, catch_unwind}; use std::sync::Arc; use std::time::Duration; use std::{fs, io, path::Path, thread}; diff --git a/src/utils/rustc_version.rs b/src/utils/rustc_version.rs index 59d201525..b7bf18b42 100644 --- a/src/utils/rustc_version.rs +++ b/src/utils/rustc_version.rs @@ -1,5 +1,5 @@ use crate::error::Result; -use anyhow::{anyhow, Context}; +use anyhow::{Context, anyhow}; use chrono::prelude::*; use once_cell::sync::Lazy; use regex::Regex; diff --git a/src/utils/sized_buffer.rs b/src/utils/sized_buffer.rs index 9c94efe3b..be7f0144b 100644 --- a/src/utils/sized_buffer.rs +++ b/src/utils/sized_buffer.rs @@ -57,10 +57,12 @@ mod tests { // Ensure adding a third chunk fails let error = buffer.write(&[0; 500]).unwrap_err(); - assert!(error - .get_ref() - .unwrap() - .is::()); + assert!( + error + .get_ref() + .unwrap() + .is::() + ); // Ensure all the third chunk was discarded assert_eq!(1000, buffer.inner.len()); diff --git a/src/web/build_details.rs b/src/web/build_details.rs index d683b0301..c9fa46687 100644 --- a/src/web/build_details.rs +++ b/src/web/build_details.rs @@ -1,15 +1,15 @@ use crate::{ - db::{types::BuildStatus, BuildId}, + AsyncStorage, Config, + db::{BuildId, types::BuildStatus}, impl_axum_webpage, web::{ + MetaData, error::{AxumNope, AxumResult}, extractors::{DbConnection, Path}, file::File, filters, page::templates::{RenderRegular, RenderSolid}, - MetaData, }, - AsyncStorage, Config, }; use anyhow::Context as _; use axum::{extract::Extension, response::IntoResponse}; @@ -163,8 +163,8 @@ pub(crate) async fn build_details_handler( #[cfg(test)] mod tests { use crate::test::{ - async_wrapper, fake_release_that_failed_before_build, AxumResponseTestExt, - AxumRouterTestExt, FakeBuild, + AxumResponseTestExt, AxumRouterTestExt, FakeBuild, async_wrapper, + fake_release_that_failed_before_build, }; use kuchikiki::traits::TendrilSink; use test_case::test_case; @@ -258,9 +258,11 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default() - .no_s3_build_log() - .db_build_log("A build log")]) + .builds(vec![ + FakeBuild::default() + .no_s3_build_log() + .db_build_log("A build log"), + ]) .create() .await?; @@ -350,12 +352,11 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default() - .s3_build_log("A build log") - .build_log_for_other_target( - "other_target", - "other target build log", - )]) + .builds(vec![ + FakeBuild::default() + .s3_build_log("A build log") + .build_log_for_other_target("other_target", "other target build log"), + ]) .create() .await?; @@ -417,9 +418,11 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default() - .s3_build_log("A build log") - .db_build_log("Another build log")]) + .builds(vec![ + FakeBuild::default() + .s3_build_log("A build log") + .db_build_log("Another build log"), + ]) .create() .await?; diff --git a/src/web/builds.rs b/src/web/builds.rs index 1a8bcd19a..6b78ebffe 100644 --- a/src/web/builds.rs +++ b/src/web/builds.rs @@ -4,25 +4,25 @@ use super::{ headers::CanonicalUrl, }; use crate::{ - db::{types::BuildStatus, BuildId}, + AsyncBuildQueue, Config, + db::{BuildId, types::BuildStatus}, docbuilder::Limits, impl_axum_webpage, web::{ + MetaData, ReqVersion, error::AxumResult, extractors::{DbConnection, Path}, filters, match_version, page::templates::{RenderRegular, RenderSolid}, - MetaData, ReqVersion, }, - AsyncBuildQueue, Config, }; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use axum::{ - extract::Extension, http::header::ACCESS_CONTROL_ALLOW_ORIGIN, response::IntoResponse, Json, + Json, extract::Extension, http::header::ACCESS_CONTROL_ALLOW_ORIGIN, response::IntoResponse, }; use axum_extra::{ - headers::{authorization::Bearer, Authorization}, TypedHeader, + headers::{Authorization, authorization::Bearer}, }; use chrono::{DateTime, Utc}; use constant_time_eq::constant_time_eq; @@ -256,8 +256,8 @@ mod tests { use crate::{ db::Overrides, test::{ - async_wrapper, fake_release_that_failed_before_build, AxumResponseTestExt, - AxumRouterTestExt, FakeBuild, + AxumResponseTestExt, AxumRouterTestExt, FakeBuild, async_wrapper, + fake_release_that_failed_before_build, }, web::cache::CachePolicy, }; @@ -389,10 +389,12 @@ mod tests { Some(&"rustc (blabla 2021-01-01)".into()) ); assert!(value.pointer("/0/id").unwrap().is_i64()); - assert!(serde_json::from_value::>( - value.pointer("/0/build_time").unwrap().clone() - ) - .is_ok()); + assert!( + serde_json::from_value::>( + value.pointer("/0/build_time").unwrap().clone() + ) + .is_ok() + ); assert_eq!(value.pointer("/1/build_status"), Some(&false.into())); assert_eq!( @@ -404,10 +406,12 @@ mod tests { Some(&"rustc (blabla 2020-01-01)".into()) ); assert!(value.pointer("/1/id").unwrap().is_i64()); - assert!(serde_json::from_value::>( - value.pointer("/1/build_time").unwrap().clone() - ) - .is_ok()); + assert!( + serde_json::from_value::>( + value.pointer("/1/build_time").unwrap().clone() + ) + .is_ok() + ); assert_eq!(value.pointer("/2/build_status"), Some(&true.into())); assert_eq!( @@ -419,10 +423,12 @@ mod tests { Some(&"rustc (blabla 2019-01-01)".into()) ); assert!(value.pointer("/2/id").unwrap().is_i64()); - assert!(serde_json::from_value::>( - value.pointer("/2/build_time").unwrap().clone() - ) - .is_ok()); + assert!( + serde_json::from_value::>( + value.pointer("/2/build_time").unwrap().clone() + ) + .is_ok() + ); assert!( value.pointer("/1/build_time").unwrap().as_str().unwrap() @@ -679,9 +685,11 @@ mod tests { .await .name("aquarelle") .version("0.1.0") - .builds(vec![FakeBuild::default() - .rustc_version("rustc (blabla 2019-01-01)") - .docsrs_version("docs.rs 1.0.0")]) + .builds(vec![ + FakeBuild::default() + .rustc_version("rustc (blabla 2019-01-01)") + .docsrs_version("docs.rs 1.0.0"), + ]) .create() .await?; @@ -689,9 +697,11 @@ mod tests { .await .name("aquarelle") .version("0.2.0") - .builds(vec![FakeBuild::default() - .rustc_version("rustc (blabla 2019-01-01)") - .docsrs_version("docs.rs 1.0.0")]) + .builds(vec![ + FakeBuild::default() + .rustc_version("rustc (blabla 2019-01-01)") + .docsrs_version("docs.rs 1.0.0"), + ]) .create() .await?; @@ -722,9 +732,11 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default() - .rustc_version("rustc (blabla 2019-01-01)") - .docsrs_version("docs.rs 1.0.0")]) + .builds(vec![ + FakeBuild::default() + .rustc_version("rustc (blabla 2019-01-01)") + .docsrs_version("docs.rs 1.0.0"), + ]) .create() .await?; @@ -741,9 +753,11 @@ mod tests { .await .name("foo") .version("0.1.0") - .builds(vec![FakeBuild::default() - .rustc_version("rustc (blabla 2019-01-01)") - .docsrs_version("docs.rs 1.0.0")]) + .builds(vec![ + FakeBuild::default() + .rustc_version("rustc (blabla 2019-01-01)") + .docsrs_version("docs.rs 1.0.0"), + ]) .create() .await?; diff --git a/src/web/cache.rs b/src/web/cache.rs index ff421496a..1dbdad773 100644 --- a/src/web/cache.rs +++ b/src/web/cache.rs @@ -2,7 +2,7 @@ use crate::config::Config; use axum::{ extract::Request as AxumHttpRequest, middleware::Next, response::Response as AxumResponse, }; -use http::{header::CACHE_CONTROL, HeaderValue}; +use http::{HeaderValue, header::CACHE_CONTROL}; use std::sync::Arc; pub static NO_CACHING: HeaderValue = HeaderValue::from_static("max-age=0"); @@ -140,9 +140,11 @@ mod tests { wrapper(|env| { env.override_config(|config| config.cache_control_stale_while_revalidate = None); - assert!(CachePolicy::ForeverInCdnAndStaleInBrowser - .render(&env.config()) - .is_none()); + assert!( + CachePolicy::ForeverInCdnAndStaleInBrowser + .render(&env.config()) + .is_none() + ); Ok(()) }); } diff --git a/src/web/crate_details.rs b/src/web/crate_details.rs index 027e607d6..18d970fa3 100644 --- a/src/web/crate_details.rs +++ b/src/web/crate_details.rs @@ -1,23 +1,23 @@ -use super::{match_version, MetaData}; +use super::{MetaData, match_version}; use crate::db::{BuildId, ReleaseId}; use crate::registry_api::OwnerKind; use crate::utils::{get_correct_docsrs_style_file, report_error}; use crate::{ - db::{types::BuildStatus, CrateId}, + AsyncStorage, + db::{CrateId, types::BuildStatus}, impl_axum_webpage, storage::PathNotFoundError, web::{ + MatchedRelease, ReqVersion, cache::CachePolicy, encode_url_path, error::{AxumNope, AxumResult}, extractors::{DbConnection, Path}, - page::templates::{filters, RenderRegular, RenderSolid}, + page::templates::{RenderRegular, RenderSolid, filters}, rustdoc::RustdocHtmlParams, - MatchedRelease, ReqVersion, }, - AsyncStorage, }; -use anyhow::{anyhow, Context, Result}; +use anyhow::{Context, Result, anyhow}; use axum::{ extract::Extension, response::{IntoResponse, Response as AxumResponse}, @@ -827,8 +827,8 @@ pub(crate) async fn get_all_platforms( mod tests { use super::*; use crate::test::{ - async_wrapper, fake_release_that_failed_before_build, AxumResponseTestExt, - AxumRouterTestExt, FakeBuild, TestDatabase, TestEnvironment, + AxumResponseTestExt, AxumRouterTestExt, FakeBuild, TestDatabase, TestEnvironment, + async_wrapper, fake_release_that_failed_before_build, }; use crate::{db::update_build_status, registry_api::CrateOwner}; use anyhow::Error; @@ -894,7 +894,9 @@ mod tests { .unwrap() } - #[fn_error_context::context("assert_last_successful_build_equals({package}, {version}, {expected_last_successful_build:?})")] + #[fn_error_context::context( + "assert_last_successful_build_equals({package}, {version}, {expected_last_successful_build:?})" + )] async fn assert_last_successful_build_equals( db: &TestDatabase, package: &str, @@ -1243,10 +1245,12 @@ mod tests { response .assert_cache_control(CachePolicy::ForeverInCdnAndStaleInBrowser, &env.config()); - assert!(response - .text() - .await? - .contains("rel=\"canonical\" href=\"https://docs.rs/crate/foo/latest")); + assert!( + response + .text() + .await? + .contains("rel=\"canonical\" href=\"https://docs.rs/crate/foo/latest") + ); Ok(()) }) @@ -1420,7 +1424,7 @@ mod tests { .name("foo") .version("0.0.2") .builds(vec![ - FakeBuild::default().build_status(BuildStatus::InProgress) + FakeBuild::default().build_status(BuildStatus::InProgress), ]) .create() .await?; @@ -1484,7 +1488,7 @@ mod tests { .name("foo") .version("0.1.0") .builds(vec![ - FakeBuild::default().build_status(BuildStatus::InProgress) + FakeBuild::default().build_status(BuildStatus::InProgress), ]) .create() .await?; @@ -2351,7 +2355,7 @@ path = "src/lib.rs" .name("dummy") .version("0.1.0") .builds(vec![ - FakeBuild::default().build_status(BuildStatus::InProgress) + FakeBuild::default().build_status(BuildStatus::InProgress), ]) .create() .await?; diff --git a/src/web/csp.rs b/src/web/csp.rs index 2b138d64f..5f36a509d 100644 --- a/src/web/csp.rs +++ b/src/web/csp.rs @@ -2,12 +2,12 @@ use crate::config::Config; use axum::{ extract::Request as AxumHttpRequest, middleware::Next, response::Response as AxumResponse, }; -use base64::{engine::general_purpose::STANDARD as b64, Engine}; +use base64::{Engine, engine::general_purpose::STANDARD as b64}; use std::{ fmt::Write, sync::{ - atomic::{AtomicBool, Ordering}, Arc, + atomic::{AtomicBool, Ordering}, }, }; diff --git a/src/web/error.rs b/src/web/error.rs index 554774b1d..ec70260af 100644 --- a/src/web/error.rs +++ b/src/web/error.rs @@ -5,9 +5,9 @@ use crate::{ }; use anyhow::anyhow; use axum::{ + Json, http::StatusCode, response::{IntoResponse, Response as AxumResponse}, - Json, }; use std::borrow::Cow; use tracing::error; @@ -217,7 +217,7 @@ pub(crate) type JsonAxumResult = Result; #[cfg(test)] mod tests { use super::{AxumNope, IntoResponse}; - use crate::test::{async_wrapper, AxumResponseTestExt, AxumRouterTestExt}; + use crate::test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; use crate::web::cache::CachePolicy; use kuchikiki::traits::TendrilSink; diff --git a/src/web/extractors.rs b/src/web/extractors.rs index 23769582d..a0ba3d70e 100644 --- a/src/web/extractors.rs +++ b/src/web/extractors.rs @@ -1,9 +1,9 @@ use crate::db::{AsyncPoolClient, Pool}; use anyhow::Context as _; use axum::{ + RequestPartsExt, extract::{Extension, FromRequestParts, OptionalFromRequestParts}, http::request::Parts, - RequestPartsExt, }; use std::ops::{Deref, DerefMut}; diff --git a/src/web/features.rs b/src/web/features.rs index 2f158a5e9..0e7d4fe23 100644 --- a/src/web/features.rs +++ b/src/web/features.rs @@ -2,6 +2,7 @@ use crate::{ db::types::Feature as DbFeature, impl_axum_webpage, web::{ + MetaData, ReqVersion, cache::CachePolicy, error::{AxumNope, AxumResult}, extractors::{DbConnection, Path}, @@ -9,7 +10,6 @@ use crate::{ headers::CanonicalUrl, match_version, page::templates::{RenderRegular, RenderSolid}, - MetaData, ReqVersion, }, }; use anyhow::anyhow; @@ -232,7 +232,7 @@ fn get_sorted_features(raw_features: Vec) -> (Vec, HashSet, code: &str, default: Option<&str>) -> Strin #[cfg(test)] mod tests { use super::{ - select_syntax, try_with_lang, with_lang, LimitsExceeded, PER_LINE_BYTE_LENGTH_LIMIT, - TOTAL_CODE_BYTE_LENGTH_LIMIT, + LimitsExceeded, PER_LINE_BYTE_LENGTH_LIMIT, TOTAL_CODE_BYTE_LENGTH_LIMIT, select_syntax, + try_with_lang, with_lang, }; #[test] diff --git a/src/web/markdown.rs b/src/web/markdown.rs index 2242bcd63..25140d0d7 100644 --- a/src/web/markdown.rs +++ b/src/web/markdown.rs @@ -1,6 +1,6 @@ use crate::web::highlight; use comrak::{ - adapters::SyntaxHighlighterAdapter, ExtensionOptions, Options, Plugins, RenderPlugins, + ExtensionOptions, Options, Plugins, RenderPlugins, adapters::SyntaxHighlighterAdapter, }; use std::collections::HashMap; diff --git a/src/web/metrics.rs b/src/web/metrics.rs index b73b9634a..3d5e9cec4 100644 --- a/src/web/metrics.rs +++ b/src/web/metrics.rs @@ -1,15 +1,15 @@ use crate::{ - db::Pool, metrics::duration_to_seconds, web::error::AxumResult, AsyncBuildQueue, Config, - InstanceMetrics, ServiceMetrics, + AsyncBuildQueue, Config, InstanceMetrics, ServiceMetrics, db::Pool, + metrics::duration_to_seconds, web::error::AxumResult, }; use anyhow::{Context as _, Result}; use axum::{ extract::{Extension, MatchedPath, Request as AxumRequest}, - http::{header::CONTENT_TYPE, StatusCode}, + http::{StatusCode, header::CONTENT_TYPE}, middleware::Next, response::IntoResponse, }; -use prometheus::{proto::MetricFamily, Encoder, TextEncoder}; +use prometheus::{Encoder, TextEncoder, proto::MetricFamily}; use std::{borrow::Cow, future::Future, sync::Arc, time::Instant}; async fn fetch_and_render_metrics(fetch_metrics: Fut) -> AxumResult @@ -110,8 +110,8 @@ pub(crate) async fn request_recorder( #[cfg(test)] mod tests { - use crate::test::{async_wrapper, AxumResponseTestExt, AxumRouterTestExt}; use crate::Context; + use crate::test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; use std::collections::HashMap; #[test] diff --git a/src/web/mod.rs b/src/web/mod.rs index 2f00e878b..835f9ce9b 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -3,13 +3,13 @@ pub mod page; // mod tmp; -use crate::db::types::BuildStatus; use crate::db::CrateId; use crate::db::ReleaseId; +use crate::db::types::BuildStatus; use crate::utils::get_correct_docsrs_style_file; use crate::utils::report_error; -use crate::web::page::templates::{filters, RenderSolid}; -use anyhow::{anyhow, bail, Context as _, Result}; +use crate::web::page::templates::{RenderSolid, filters}; +use anyhow::{Context as _, Result, anyhow, bail}; use axum_extra::middleware::option_layer; use rinja::Template; use serde_json::Value; @@ -37,20 +37,20 @@ mod source; mod statics; mod status; -use crate::{impl_axum_webpage, Context}; +use crate::{Context, impl_axum_webpage}; use anyhow::Error; use axum::{ + Router as AxumRouter, extract::{Extension, MatchedPath, Request as AxumRequest}, http::StatusCode, middleware, middleware::Next, response::{IntoResponse, Response as AxumResponse}, - Router as AxumRouter, }; use chrono::{DateTime, Utc}; use error::AxumNope; use page::TemplateData; -use percent_encoding::{utf8_percent_encode, AsciiSet, CONTROLS}; +use percent_encoding::{AsciiSet, CONTROLS, utf8_percent_encode}; use semver::{Version, VersionReq}; use sentry::integrations::tower as sentry_tower; use serde_with::{DeserializeFromStr, SerializeDisplay}; @@ -770,8 +770,8 @@ impl_axum_webpage! { mod test { use super::*; use crate::test::{ - async_wrapper, AxumResponseTestExt, AxumRouterTestExt, FakeBuild, TestDatabase, - TestEnvironment, + AxumResponseTestExt, AxumRouterTestExt, FakeBuild, TestDatabase, TestEnvironment, + async_wrapper, }; use crate::{db::ReleaseId, docbuilder::DocCoverage}; use kuchikiki::traits::TendrilSink; @@ -859,10 +859,12 @@ mod test { let foo_doc = kuchikiki::parse_html() .one(web.assert_success("/foo/0.0.1/foo/").await?.text().await?); - assert!(foo_doc - .select(".pure-menu-link b") - .unwrap() - .any(|e| e.text_contents().contains("60%"))); + assert!( + foo_doc + .select(".pure-menu-link b") + .unwrap() + .any(|e| e.text_contents().contains("60%")) + ); Ok(()) }); @@ -1121,7 +1123,7 @@ mod test { .name("foo") .version("1.1.0") .builds(vec![ - FakeBuild::default().build_status(BuildStatus::InProgress) + FakeBuild::default().build_status(BuildStatus::InProgress), ]) .create() .await?; @@ -1312,10 +1314,12 @@ mod test { response.headers().get(http::header::LOCATION).unwrap(), "/something" ); - assert!(response - .headers() - .get(http::header::CACHE_CONTROL) - .is_none()); + assert!( + response + .headers() + .get(http::header::CACHE_CONTROL) + .is_none() + ); assert!(response.extensions().get::().is_none()); } diff --git a/src/web/page/web_page.rs b/src/web/page/web_page.rs index 20a425f63..fb69cd912 100644 --- a/src/web/page/web_page.rs +++ b/src/web/page/web_page.rs @@ -1,4 +1,4 @@ -use crate::web::{csp::Csp, error::AxumNope, TemplateData}; +use crate::web::{TemplateData, csp::Csp, error::AxumNope}; use axum::{ body::Body, extract::Request as AxumRequest, diff --git a/src/web/releases.rs b/src/web/releases.rs index d53c82a86..cc8c43e5d 100644 --- a/src/web/releases.rs +++ b/src/web/releases.rs @@ -1,25 +1,24 @@ //! Releases web handlers use crate::{ + AsyncBuildQueue, Config, InstanceMetrics, RegistryApi, build_queue::{QueuedCrate, REBUILD_PRIORITY}, cdn, impl_axum_webpage, utils::report_error, web::{ - axum_parse_uri_with_params, axum_redirect, encode_url_path, + ReqVersion, axum_parse_uri_with_params, axum_redirect, encode_url_path, error::{AxumNope, AxumResult}, extractors::{DbConnection, Path}, match_version, - page::templates::{filters, RenderRegular, RenderSolid}, - ReqVersion, + page::templates::{RenderRegular, RenderSolid, filters}, }, - AsyncBuildQueue, Config, InstanceMetrics, RegistryApi, }; -use anyhow::{anyhow, Context as _, Result}; +use anyhow::{Context as _, Result, anyhow}; use axum::{ extract::{Extension, Query}, response::{IntoResponse, Response as AxumResponse}, }; -use base64::{engine::general_purpose::STANDARD as b64, Engine}; +use base64::{Engine, engine::general_purpose::STANDARD as b64}; use chrono::{DateTime, Utc}; use futures_util::stream::TryStreamExt; use itertools::Itertools; @@ -331,7 +330,7 @@ pub(crate) async fn releases_handler( conn: &mut sqlx::PgConnection, page: Option, release_type: ReleaseType, -) -> AxumResult { +) -> AxumResult> { let page_number = page.unwrap_or(1); let (description, release_order, latest_only) = match release_type { @@ -455,7 +454,7 @@ async fn redirect_to_random_crate( config: Arc, metrics: Arc, conn: &mut sqlx::PgConnection, -) -> AxumResult { +) -> AxumResult> { // We try to find a random crate and redirect to it. // // The query is efficient, but relies on a static factor which depends @@ -804,8 +803,8 @@ mod tests { use crate::db::{finish_build, initialize_build, initialize_crate, initialize_release}; use crate::registry_api::{CrateOwner, OwnerKind}; use crate::test::{ - async_wrapper, fake_release_that_failed_before_build, AxumResponseTestExt, - AxumRouterTestExt, FakeBuild, + AxumResponseTestExt, AxumRouterTestExt, FakeBuild, async_wrapper, + fake_release_that_failed_before_build, }; use anyhow::Error; use chrono::{Duration, TimeZone}; @@ -889,10 +888,12 @@ mod tests { .await .name("in_progress") .version("0.1.0") - .builds(vec![FakeBuild::default() - .build_status(BuildStatus::InProgress) - .rustc_version("rustc (blabla 2022-01-01)") - .docsrs_version("docs.rs 4.0.0")]) + .builds(vec![ + FakeBuild::default() + .build_status(BuildStatus::InProgress) + .rustc_version("rustc (blabla 2022-01-01)") + .docsrs_version("docs.rs 4.0.0"), + ]) .create() .await?; @@ -1230,10 +1231,12 @@ mod tests { .await?; assert_eq!(response.status(), 500); - assert!(response - .text() - .await? - .contains("error name 1\nerror name 2")); + assert!( + response + .text() + .await? + .contains("error name 1\nerror name 2") + ); Ok(()) }) } @@ -1419,10 +1422,12 @@ mod tests { .await .name("in_progress") .version("0.1.0") - .builds(vec![FakeBuild::default() - .build_status(BuildStatus::InProgress) - .rustc_version("rustc (blabla 2022-01-01)") - .docsrs_version("docs.rs 4.0.0")]) + .builds(vec![ + FakeBuild::default() + .build_status(BuildStatus::InProgress) + .rustc_version("rustc (blabla 2022-01-01)") + .docsrs_version("docs.rs 4.0.0"), + ]) .create() .await?; @@ -1791,10 +1796,12 @@ mod tests { let content = kuchikiki::parse_html().one(web.get("/releases/queue").await?.text().await?); - assert!(content - .select(".release > div > strong") - .expect("missing heading") - .any(|el| el.text_contents().contains("active CDN deployments"))); + assert!( + content + .select(".release > div > strong") + .expect("missing heading") + .any(|el| el.text_contents().contains("active CDN deployments")) + ); let items = content .select(".queue-list > li") @@ -1817,15 +1824,19 @@ mod tests { let empty = kuchikiki::parse_html().one(web.get("/releases/queue").await?.text().await?); - assert!(empty - .select(".queue-list > strong") - .expect("missing heading") - .any(|el| el.text_contents().contains("nothing"))); + assert!( + empty + .select(".queue-list > strong") + .expect("missing heading") + .any(|el| el.text_contents().contains("nothing")) + ); - assert!(!empty - .select(".release > strong") - .expect("missing heading") - .any(|el| el.text_contents().contains("active CDN deployments"))); + assert!( + !empty + .select(".release > strong") + .expect("missing heading") + .any(|el| el.text_contents().contains("active CDN deployments")) + ); let queue = env.async_build_queue().await; queue.add_crate("foo", "1.0.0", 0, None).await?; @@ -1850,9 +1861,10 @@ mod tests { assert!(a.text_contents().contains(expected.1)); if let Some(priority) = expected.2 { - assert!(li - .text_contents() - .contains(&format!("priority: {priority}"))); + assert!( + li.text_contents() + .contains(&format!("priority: {priority}")) + ); } } @@ -1874,10 +1886,12 @@ mod tests { .await .name("foo") .version("1.0.0") - .builds(vec![FakeBuild::default() - .build_status(BuildStatus::InProgress) - .rustc_version("rustc (blabla 2022-01-01)") - .docsrs_version("docs.rs 4.0.0")]) + .builds(vec![ + FakeBuild::default() + .build_status(BuildStatus::InProgress) + .rustc_version("rustc (blabla 2022-01-01)") + .docsrs_version("docs.rs 4.0.0"), + ]) .create() .await?; @@ -1917,15 +1931,19 @@ mod tests { let empty = kuchikiki::parse_html().one(web.get("/releases/queue").await?.text().await?); - assert!(empty - .select(".about > p") - .expect("missing heading") - .any(|el| el.text_contents().contains("We continuously rebuild"))); + assert!( + empty + .select(".about > p") + .expect("missing heading") + .any(|el| el.text_contents().contains("We continuously rebuild")) + ); - assert!(empty - .select(".about > p") - .expect("missing heading") - .any(|el| el.text_contents().contains("crates in the rebuild queue"))); + assert!( + empty + .select(".about > p") + .expect("missing heading") + .any(|el| el.text_contents().contains("crates in the rebuild queue")) + ); Ok(()) }); @@ -1954,12 +1972,13 @@ mod tests { // empty because expand_rebuild_queue is not set assert_eq!(items.len(), 0); - assert!(full - .select(".about > p") - .expect("missing heading") - .any(|el| el - .text_contents() - .contains("There are currently 2 crates in the rebuild queue"))); + assert!( + full.select(".about > p") + .expect("missing heading") + .any(|el| el + .text_contents() + .contains("There are currently 2 crates in the rebuild queue")) + ); let full = kuchikiki::parse_html() .one(web.get("/releases/queue?expand=1").await?.text().await?); @@ -1974,18 +1993,26 @@ mod tests { assert_eq!(build_queue_list.len(), 1); assert_eq!(rebuild_queue_list.len(), 2); - assert!(rebuild_queue_list - .iter() - .any(|li| li.text_contents().contains("foo"))); - assert!(rebuild_queue_list - .iter() - .any(|li| li.text_contents().contains("bar"))); - assert!(build_queue_list - .iter() - .any(|li| li.text_contents().contains("baz"))); - assert!(!rebuild_queue_list - .iter() - .any(|li| li.text_contents().contains("baz"))); + assert!( + rebuild_queue_list + .iter() + .any(|li| li.text_contents().contains("foo")) + ); + assert!( + rebuild_queue_list + .iter() + .any(|li| li.text_contents().contains("bar")) + ); + assert!( + build_queue_list + .iter() + .any(|li| li.text_contents().contains("baz")) + ); + assert!( + !rebuild_queue_list + .iter() + .any(|li| li.text_contents().contains("baz")) + ); Ok(()) }); diff --git a/src/web/routes.rs b/src/web/routes.rs index 0900445b1..78cb36af4 100644 --- a/src/web/routes.rs +++ b/src/web/routes.rs @@ -2,12 +2,12 @@ use super::{ cache::CachePolicy, error::AxumNope, metrics::request_recorder, statics::build_static_router, }; use axum::{ + Router as AxumRouter, extract::Request as AxumHttpRequest, handler::Handler as AxumHandler, middleware::{self, Next}, response::{IntoResponse, Redirect}, - routing::{get, post, MethodRouter}, - Router as AxumRouter, + routing::{MethodRouter, get, post}, }; use axum_extra::routing::RouterExt; use rinja::Template; @@ -370,7 +370,7 @@ async fn fallback() -> impl IntoResponse { #[cfg(test)] mod tests { - use crate::test::{async_wrapper, AxumResponseTestExt, AxumRouterTestExt}; + use crate::test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; use crate::web::cache::CachePolicy; use reqwest::StatusCode; diff --git a/src/web/rustdoc.rs b/src/web/rustdoc.rs index 526688958..423917a88 100644 --- a/src/web/rustdoc.rs +++ b/src/web/rustdoc.rs @@ -1,11 +1,12 @@ //! rustdoc handler use crate::{ + AsyncStorage, Config, InstanceMetrics, RUSTDOC_STATIC_STORAGE_PREFIX, db::Pool, storage::rustdoc_archive_path, utils, web::{ - axum_cached_redirect, axum_parse_uri_with_params, + MetaData, ReqVersion, axum_cached_redirect, axum_parse_uri_with_params, cache::CachePolicy, crate_details::CrateDetails, csp::Csp, @@ -15,14 +16,12 @@ use crate::{ file::File, match_version, page::{ - templates::{filters, RenderRegular, RenderSolid}, TemplateData, + templates::{RenderRegular, RenderSolid, filters}, }, - MetaData, ReqVersion, }, - AsyncStorage, Config, InstanceMetrics, RUSTDOC_STATIC_STORAGE_PREFIX, }; -use anyhow::{anyhow, Context as _}; +use anyhow::{Context as _, anyhow}; use axum::{ extract::{Extension, Query}, http::{StatusCode, Uri}, @@ -37,7 +36,7 @@ use std::{ collections::{BTreeMap, HashMap}, sync::Arc, }; -use tracing::{debug, error, info_span, instrument, trace, Instrument}; +use tracing::{Instrument, debug, error, info_span, instrument, trace}; static DOC_RUST_LANG_ORG_REDIRECTS: Lazy> = Lazy::new(|| { HashMap::from([ @@ -296,12 +295,11 @@ impl RustdocPage { Err(RewritingError::MemoryLimitExceeded(..)) => { metrics.html_rewrite_ooms.inc(); - return Err(AxumNope::InternalError( - anyhow!( - "Failed to serve the rustdoc file '{}' because rewriting it surpassed the memory limit of {} bytes", - file_path, config.max_parse_memory, - ) - )); + return Err(AxumNope::InternalError(anyhow!( + "Failed to serve the rustdoc file '{}' because rewriting it surpassed the memory limit of {} bytes", + file_path, + config.max_parse_memory, + ))); } result => result.context("error rewriting HTML")?, }; @@ -871,11 +869,11 @@ pub(crate) async fn static_asset_handler( #[cfg(test)] mod test { use crate::{ + Config, registry_api::{CrateOwner, OwnerKind}, test::*, utils::Dependency, web::{cache::CachePolicy, encode_url_path}, - Config, }; use anyhow::Context; use kuchikiki::traits::TendrilSink; @@ -893,7 +891,10 @@ mod test { let response = web.get(path).await?; response.assert_cache_control(CachePolicy::ForeverInCdnAndStaleInBrowser, config); let data = response.text().await?; - info!("fetched path {} and got content {}\nhelp: if this is missing the header, remember to add ", path, data); + info!( + "fetched path {} and got content {}\nhelp: if this is missing the header, remember to add ", + path, data + ); let dom = kuchikiki::parse_html().one(data); if let Some(elem) = dom @@ -1221,7 +1222,10 @@ mod test { &env.config(), ) .await?; - assert_eq!(redirect, "/crate/dummy/latest/target-redirect/x86_64-unknown-linux-gnu/dummy/struct.will-be-deleted.html"); + assert_eq!( + redirect, + "/crate/dummy/latest/target-redirect/x86_64-unknown-linux-gnu/dummy/struct.will-be-deleted.html" + ); Ok(()) }) @@ -2317,7 +2321,8 @@ mod test { "/tungstenite/0.10.0/tungstenite/?search=String%20-%3E%20Message", &env.web_app().await, &env.config() - ).await?, + ) + .await?, "/crate/tungstenite/latest/target-redirect/x86_64-unknown-linux-gnu/tungstenite/index.html?search=String%20-%3E%20Message", ); Ok(()) @@ -2588,10 +2593,11 @@ mod test { .text() .await?, ); - assert!(dom - .select(r#"a[href="/optional-dep/1.2.3"] > i[class="dependencies normal"] + i"#) - .expect("should have optional dependency") - .any(|el| { el.text_contents().contains("optional") })); + assert!( + dom.select(r#"a[href="/optional-dep/1.2.3"] > i[class="dependencies normal"] + i"#) + .expect("should have optional dependency") + .any(|el| { el.text_contents().contains("optional") }) + ); let dom = kuchikiki::parse_html().one( env.web_app() .await @@ -2600,12 +2606,13 @@ mod test { .text() .await?, ); - assert!(dom - .select( + assert!( + dom.select( r#"a[href="/crate/optional-dep/1.2.3"] > i[class="dependencies normal"] + i"# ) .expect("should have optional dependency") - .any(|el| { el.text_contents().contains("optional") })); + .any(|el| { el.text_contents().contains("optional") }) + ); Ok(()) }) } @@ -2684,22 +2691,24 @@ mod test { let web = env.web_app().await; - assert!(web - .get("/dummy/0.1.0/dummy/") - .await? - .headers() - .get("x-robots-tag") - .unwrap() - .to_str() - .unwrap() - .contains("noindex")); - - assert!(web - .get("/dummy/latest/dummy/") - .await? - .headers() - .get("x-robots-tag") - .is_none()); + assert!( + web.get("/dummy/0.1.0/dummy/") + .await? + .headers() + .get("x-robots-tag") + .unwrap() + .to_str() + .unwrap() + .contains("noindex") + ); + + assert!( + web.get("/dummy/latest/dummy/") + .await? + .headers() + .get("x-robots-tag") + .is_none() + ); Ok(()) }) } diff --git a/src/web/sitemap.rs b/src/web/sitemap.rs index 128349a42..ea3d74739 100644 --- a/src/web/sitemap.rs +++ b/src/web/sitemap.rs @@ -1,14 +1,14 @@ use crate::{ + Config, docbuilder::Limits, impl_axum_webpage, - utils::{get_config, ConfigName}, + utils::{ConfigName, get_config}, web::{ + AxumErrorPage, error::{AxumNope, AxumResult}, extractors::{DbConnection, Path}, - page::templates::{filters, RenderBrands, RenderSolid}, - AxumErrorPage, + page::templates::{RenderBrands, RenderSolid, filters}, }, - Config, }; use axum::{extract::Extension, http::StatusCode, response::IntoResponse}; use chrono::{TimeZone, Utc}; @@ -203,7 +203,7 @@ pub(crate) async fn about_handler(subpage: Option>) -> AxumResult"#)); @@ -811,10 +813,12 @@ mod tests { let web = env.web_app().await; let response = web.get("/crate/fake/0.1.0/source/large_file.rs").await?; assert_eq!(response.status(), StatusCode::OK); - assert!(response - .text() - .await? - .contains("This file is too large to display")); + assert!( + response + .text() + .await? + .contains("This file is too large to display") + ); Ok(()) }); } diff --git a/src/web/statics.rs b/src/web/statics.rs index ebdd78e34..36a820462 100644 --- a/src/web/statics.rs +++ b/src/web/statics.rs @@ -1,12 +1,12 @@ use super::{cache::CachePolicy, metrics::request_recorder, routes::get_static}; use axum::{ + Router as AxumRouter, extract::{Extension, Request}, http::header::CONTENT_TYPE, middleware, middleware::Next, response::{IntoResponse, Response}, routing::get_service, - Router as AxumRouter, }; use axum_extra::headers::HeaderValue; use tower_http::services::ServeDir; @@ -80,7 +80,7 @@ pub(crate) fn build_static_router() -> AxumRouter { mod tests { use super::{STYLE_CSS, VENDORED_CSS}; use crate::{ - test::{async_wrapper, AxumResponseTestExt, AxumRouterTestExt}, + test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}, web::cache::CachePolicy, }; use axum::response::Response as AxumResponse; diff --git a/src/web/status.rs b/src/web/status.rs index 61aaa03b3..efda38af3 100644 --- a/src/web/status.rs +++ b/src/web/status.rs @@ -1,11 +1,12 @@ use super::{cache::CachePolicy, error::AxumNope}; use crate::web::{ + ReqVersion, error::AxumResult, extractors::{DbConnection, Path}, - match_version, ReqVersion, + match_version, }; use axum::{ - extract::Extension, http::header::ACCESS_CONTROL_ALLOW_ORIGIN, response::IntoResponse, Json, + Json, extract::Extension, http::header::ACCESS_CONTROL_ALLOW_ORIGIN, response::IntoResponse, }; pub(crate) async fn status_handler( @@ -46,7 +47,7 @@ pub(crate) async fn status_handler( #[cfg(test)] mod tests { - use crate::test::{async_wrapper, AxumResponseTestExt, AxumRouterTestExt}; + use crate::test::{AxumResponseTestExt, AxumRouterTestExt, async_wrapper}; use crate::web::cache::CachePolicy; use reqwest::StatusCode; use test_case::test_case;