diff --git a/.cargo/audit.toml b/.cargo/audit.toml index 0fd52747c..6dff7758a 100644 --- a/.cargo/audit.toml +++ b/.cargo/audit.toml @@ -1,8 +1,5 @@ [advisories] ignore = [ - "RUSTSEC-2020-0036", # failure is officially deprecated/unmaintained - # https://github.com/rust-lang/docs.rs/issues/1014 - "RUSTSEC-2023-0018", # rustwide -> remove_dir_all,TOCTOU / Race Condition # https://github.com/rust-lang/docs.rs/issues/2074 diff --git a/Cargo.lock b/Cargo.lock index 6831a838f..bb2332e34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,6 +39,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "377e4c0ba83e4431b10df45c1d4666f178ea9c552cac93e60c3a88bf32785923" +dependencies = [ + "as-slice", +] + [[package]] name = "allocator-api2" version = "0.2.18" @@ -145,6 +154,15 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "assert-json-diff" version = "1.1.0" @@ -229,17 +247,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "attohttpc" -version = "0.16.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb8867f378f33f78a811a8eb9bf108ad99430d7aad43315dd9319c827ef6247" +checksum = "9a13149d0cf3f7f9b9261fad4ec63b2efbf9a80665f52def86282d26255e6331" dependencies = [ "flate2", - "http 0.2.12", + "http 1.1.0", "log", "native-tls", - "openssl", "url", - "wildmatch", ] [[package]] @@ -786,12 +802,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.7" @@ -936,6 +946,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.38" @@ -1146,7 +1162,7 @@ dependencies = [ "serde_json", "smol_str", "thiserror", - "toml 0.8.14", + "toml", ] [[package]] @@ -1386,6 +1402,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "cvt" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ae9bf77fbf2d39ef573205d554d87e86c12f1994e9ea335b0651b9b278bcf1" +dependencies = [ + "cfg-if", +] + [[package]] name = "darling" version = "0.20.9" @@ -1591,7 +1616,6 @@ dependencies = [ "criterion", "dashmap", "docsrs-metadata", - "failure", "fn-error-context", "font-awesome-as-a-crate", "futures-util", @@ -1651,7 +1675,7 @@ dependencies = [ "thread_local", "time", "tokio", - "toml 0.8.14", + "toml", "tower", "tower-http", "tower-service", @@ -1671,7 +1695,7 @@ version = "0.1.0" dependencies = [ "serde", "thiserror", - "toml 0.8.14", + "toml", ] [[package]] @@ -1802,28 +1826,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] - [[package]] name = "fallible-iterator" version = "0.2.0" @@ -1965,6 +1967,20 @@ dependencies = [ "winapi", ] +[[package]] +name = "fs_at" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "982f82cc75107eef84f417ad6c53ae89bf65b561937ca4a3b3b0fd04d0aa2425" +dependencies = [ + "aligned", + "cfg-if", + "cvt", + "libc", + "nix 0.26.4", + "windows-sys 0.48.0", +] + [[package]] name = "futf" version = "0.1.5" @@ -2110,11 +2126,11 @@ checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "git2" -version = "0.17.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b989d6a7ca95a362cf2cfc5ad688b3a467be1f87e480b8dad07fee8c79b0044" +checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "libc", "libgit2-sys", "log", @@ -3821,9 +3837,9 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libgit2-sys" -version = "0.15.2+1.6.4" +version = "0.17.0+1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a80df2e11fb4a61f4ba2ab42dbe7f74468da143f1a75c74e11dee7c813f694fa" +checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" dependencies = [ "cc", "libc", @@ -4025,15 +4041,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - [[package]] name = "mime" version = "0.3.17" @@ -4120,16 +4127,25 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" -version = "0.25.1" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ - "autocfg", "bitflags 1.3.2", "cfg-if", "libc", - "memoffset", - "pin-utils", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "cfg_aliases", + "libc", ] [[package]] @@ -4148,6 +4164,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "normpath" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5831952a9476f2fed74b77d74182fa5ddc4d21c72ec45a333b250e3ed0272804" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -5061,15 +5086,18 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "remove_dir_all" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882f368737489ea543bc5c340e6f3d34a28c39980bd9a979e47322b26f60ac40" +checksum = "23895cfadc1917fed9c6ed76a8c2903615fa3704f7493ff82b364c6540acc02b" dependencies = [ + "aligned", + "cfg-if", + "cvt", + "fs_at", + "lazy_static", "libc", - "log", - "num_cpus", - "rayon", - "winapi", + "normpath", + "windows-sys 0.45.0", ] [[package]] @@ -5326,22 +5354,22 @@ checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "rustwide" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f77082ac67ce0958dca987d10f5a994114cd98ee0a81afa6f5bc44fb2e416f0" +checksum = "af779495d93498c4a328950fe9e09c403dd5eb3beedd49dcfa9aa8fdd3b577c3" dependencies = [ + "anyhow", "attohttpc", - "base64 0.13.1", - "failure", + "base64 0.22.1", "flate2", "fs2", "futures-util", "getrandom 0.2.15", "git2", - "http 0.2.12", + "http 1.1.0", "lazy_static", "log", - "nix", + "nix 0.29.0", "percent-encoding", "remove_dir_all", "scopeguard", @@ -5352,9 +5380,9 @@ dependencies = [ "thiserror", "tokio", "tokio-stream", - "toml 0.5.11", + "toml", "walkdir", - "windows-sys 0.36.1", + "windows-sys 0.52.0", ] [[package]] @@ -6218,18 +6246,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - [[package]] name = "syntect" version = "5.2.0" @@ -6566,15 +6582,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - [[package]] name = "toml" version = "0.8.14" @@ -6877,12 +6884,6 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - [[package]] name = "unicode_categories" version = "0.1.1" @@ -7096,12 +7097,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wildmatch" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f44b95f62d34113cf558c93511ac93027e03e9c29a60dd0fd70e6e025c7270a" - [[package]] name = "winapi" version = "0.3.9" @@ -7152,19 +7147,6 @@ dependencies = [ "windows-targets 0.52.5", ] -[[package]] -name = "windows-sys" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" -dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -7256,12 +7238,6 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" -[[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -7280,12 +7256,6 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" -[[package]] -name = "windows_i686_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -7310,12 +7280,6 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" -[[package]] -name = "windows_i686_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -7334,12 +7298,6 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" -[[package]] -name = "windows_x86_64_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -7376,12 +7334,6 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" -[[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" diff --git a/Cargo.toml b/Cargo.toml index 09d09ad8c..95d520475 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,13 +45,12 @@ url = { version = "2.1.1", features = ["serde"] } docsrs-metadata = { path = "crates/metadata" } anyhow = { version = "1.0.42", features = ["backtrace"]} backtrace = "0.3.61" -failure = "0.1.8" thiserror = "1.0.26" comrak = { version = "0.24.1", default-features = false } syntect = { version = "5.0.0", default-features = false, features = ["parsing", "html", "dump-load", "regex-onig"] } toml = "0.8.0" prometheus = { version = "0.13.0", default-features = false } -rustwide = { version = "0.16.0", features = ["unstable-toolchain-ci", "unstable"] } +rustwide = { version = "0.17.0", features = ["unstable-toolchain-ci", "unstable"] } mime_guess = "2" zstd = "0.13.0" hostname = "0.4.0" diff --git a/src/docbuilder/rustwide_builder.rs b/src/docbuilder/rustwide_builder.rs index f3a6bef3b..b43000341 100644 --- a/src/docbuilder/rustwide_builder.rs +++ b/src/docbuilder/rustwide_builder.rs @@ -17,7 +17,6 @@ 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 failure::Error as FailureError; use postgres::Client; use regex::Regex; use rustwide::cmd::{Command, CommandError, SandboxBuilder, SandboxImage}; @@ -69,10 +68,8 @@ fn build_workspace(context: &dyn Context) -> Result { builder = builder.fast_init(true); } - let workspace = builder.init().map_err(FailureError::compat)?; - workspace - .purge_all_build_dirs() - .map_err(FailureError::compat)?; + let workspace = builder.init()?; + workspace.purge_all_build_dirs()?; Ok(workspace) } @@ -141,9 +138,7 @@ impl RustwideBuilder { } pub fn purge_caches(&self) -> Result<()> { - self.workspace - .purge_all_caches() - .map_err(FailureError::compat)?; + self.workspace.purge_all_caches()?; Ok(()) } @@ -159,9 +154,7 @@ impl RustwideBuilder { // we fake the rustc version and install from scratch every time since we can't detect // the already-installed rustc version. if self.toolchain.as_ci().is_some() { - self.toolchain - .install(&self.workspace) - .map_err(FailureError::compat)?; + self.toolchain.install(&self.workspace)?; self.add_essential_files()?; return Ok(true); } @@ -180,7 +173,7 @@ impl RustwideBuilder { if let Some(&ToolchainError::NotInstalled) = err.downcast_ref::() { Vec::new() } else { - return Err(err.compat().into()); + return Err(err); } } }; @@ -199,20 +192,14 @@ impl RustwideBuilder { // and will not be reinstalled until explicitly requested by a crate. for target in installed_targets { if !targets_to_install.remove(&target) { - self.toolchain - .remove_target(&self.workspace, &target) - .map_err(FailureError::compat)?; + self.toolchain.remove_target(&self.workspace, &target)?; } } - self.toolchain - .install(&self.workspace) - .map_err(FailureError::compat)?; + self.toolchain.install(&self.workspace)?; for target in &targets_to_install { - self.toolchain - .add_target(&self.workspace, target) - .map_err(FailureError::compat)?; + self.toolchain.add_target(&self.workspace, target)?; } // NOTE: rustup will automatically refuse to update the toolchain // if `rustfmt` is not available in the newer version @@ -290,9 +277,7 @@ impl RustwideBuilder { // fill up disk space. // This also prevents having multiple builders using the same rustwide workspace, // which we don't do. Currently our separate builders use a separate rustwide workspace. - self.workspace - .purge_all_build_dirs() - .map_err(FailureError::compat)?; + self.workspace.purge_all_build_dirs()?; let mut build_dir = self .workspace @@ -300,56 +285,49 @@ impl RustwideBuilder { // This is an empty library crate that is supposed to always build. let krate = Crate::crates_io(DUMMY_CRATE_NAME, DUMMY_CRATE_VERSION); - krate.fetch(&self.workspace).map_err(FailureError::compat)?; + krate.fetch(&self.workspace)?; build_dir .build(&self.toolchain, &krate, self.prepare_sandbox(&limits)) .run(|build| { - (|| -> Result<()> { - let metadata = Metadata::from_crate_root(build.host_source_dir())?; + let metadata = Metadata::from_crate_root(build.host_source_dir())?; - let res = - self.execute_build(HOST_TARGET, true, build, &limits, &metadata, true)?; - if !res.result.successful { - bail!("failed to build dummy crate for {}", rustc_version); - } + let res = self.execute_build(HOST_TARGET, true, build, &limits, &metadata, true)?; + if !res.result.successful { + bail!("failed to build dummy crate for {}", rustc_version); + } - info!("copying essential files for {}", rustc_version); - assert!(!metadata.proc_macro); - let source = build.host_target_dir().join(HOST_TARGET).join("doc"); - let dest = tempfile::Builder::new() - .prefix("essential-files") - .tempdir()?; - copy_dir_all(source, &dest)?; - - // One https://github.com/rust-lang/rust/pull/101702 lands, static files will be - // put in their own directory, "static.files". To make sure those files are - // available at --static-root-path, we add files from that subdirectory, if present. - let static_files = dest.as_ref().join("static.files"); - if static_files.try_exists()? { - self.runtime.block_on(add_path_into_database( - &self.async_storage, - RUSTDOC_STATIC_STORAGE_PREFIX, - &static_files, - ))?; - } else { - self.runtime.block_on(add_path_into_database( - &self.async_storage, - RUSTDOC_STATIC_STORAGE_PREFIX, - &dest, - ))?; - } + info!("copying essential files for {}", rustc_version); + assert!(!metadata.proc_macro); + let source = build.host_target_dir().join(HOST_TARGET).join("doc"); + let dest = tempfile::Builder::new() + .prefix("essential-files") + .tempdir()?; + copy_dir_all(source, &dest)?; + + // One https://github.com/rust-lang/rust/pull/101702 lands, static files will be + // put in their own directory, "static.files". To make sure those files are + // available at --static-root-path, we add files from that subdirectory, if present. + let static_files = dest.as_ref().join("static.files"); + if static_files.try_exists()? { + self.runtime.block_on(add_path_into_database( + &self.async_storage, + RUSTDOC_STATIC_STORAGE_PREFIX, + &static_files, + ))?; + } else { + self.runtime.block_on(add_path_into_database( + &self.async_storage, + RUSTDOC_STATIC_STORAGE_PREFIX, + &dest, + ))?; + } - set_config(&mut conn, ConfigName::RustcVersion, rustc_version)?; - Ok(()) - })() - .map_err(|e| failure::Error::from_boxed_compat(e.into())) - }) - .map_err(|e| e.compat())?; + set_config(&mut conn, ConfigName::RustcVersion, rustc_version)?; + Ok(()) + })?; - krate - .purge_from_cache(&self.workspace) - .map_err(FailureError::compat)?; + krate.purge_from_cache(&self.workspace)?; Ok(()) } @@ -437,11 +415,7 @@ impl RustwideBuilder { // fill up disk space. // This also prevents having multiple builders using the same rustwide workspace, // which we don't do. Currently our separate builders use a separate rustwide workspace. - info_span!("purge_all_build_dirs").in_scope(|| { - self.workspace - .purge_all_build_dirs() - .map_err(FailureError::compat) - })?; + info_span!("purge_all_build_dirs").in_scope(|| self.workspace.purge_all_build_dirs())?; let mut build_dir = self.workspace.build_dir(&format!("{name}-{version}")); @@ -456,7 +430,7 @@ impl RustwideBuilder { Crate::registry(AlternativeRegistry::new(registry), name, version) } }; - krate.fetch(&self.workspace).map_err(FailureError::compat)?; + krate.fetch(&self.workspace)?; krate }; @@ -470,15 +444,13 @@ impl RustwideBuilder { debug!("adding sources into database"); let files_list = { - let (files_list, new_alg) = self - .runtime - .block_on(add_path_into_remote_archive( + let (files_list, new_alg) = + self.runtime.block_on(add_path_into_remote_archive( &self.async_storage, &source_archive_path(name, version), build.host_source_dir(), false, - )) - .map_err(|e| failure::Error::from_boxed_compat(e.into()))?; + ))?; algs.insert(new_alg); files_list }; @@ -496,209 +468,199 @@ impl RustwideBuilder { build.fetch_build_std_dependencies(&targets)?; } - (|| -> Result { - let mut has_docs = false; - let mut successful_targets = Vec::new(); + let mut has_docs = false; + let mut successful_targets = Vec::new(); - // Perform an initial build - let mut res = - self.execute_build(default_target, true, build, &limits, &metadata, false)?; + // Perform an initial build + let mut res = + self.execute_build(default_target, true, build, &limits, &metadata, false)?; - // If the build fails with the lockfile given, try using only the dependencies listed in Cargo.toml. - let cargo_lock = build.host_source_dir().join("Cargo.lock"); - if !res.result.successful && cargo_lock.exists() { - info!("removing lockfile and reattempting build"); - std::fs::remove_file(cargo_lock)?; - { - let _span = info_span!("cargo_generate_lockfile").entered(); - Command::new(&self.workspace, self.toolchain.cargo()) - .cd(build.host_source_dir()) - .args(&["generate-lockfile"]) - .run()?; - } - { - let _span = info_span!("cargo fetch --locked").entered(); - Command::new(&self.workspace, self.toolchain.cargo()) - .cd(build.host_source_dir()) - .args(&["fetch", "--locked"]) - .run()?; - } - res = self.execute_build( - default_target, - true, - build, - &limits, - &metadata, - false, - )?; + // If the build fails with the lockfile given, try using only the dependencies listed in Cargo.toml. + let cargo_lock = build.host_source_dir().join("Cargo.lock"); + if !res.result.successful && cargo_lock.exists() { + info!("removing lockfile and reattempting build"); + std::fs::remove_file(cargo_lock)?; + { + let _span = info_span!("cargo_generate_lockfile").entered(); + Command::new(&self.workspace, self.toolchain.cargo()) + .cd(build.host_source_dir()) + .args(&["generate-lockfile"]) + .run()?; } - - if res.result.successful { - if let Some(name) = res.cargo_metadata.root().library_name() { - let host_target = build.host_target_dir(); - has_docs = host_target - .join(default_target) - .join("doc") - .join(name) - .is_dir(); - } + { + let _span = info_span!("cargo fetch --locked").entered(); + Command::new(&self.workspace, self.toolchain.cargo()) + .cd(build.host_source_dir()) + .args(&["fetch", "--locked"]) + .run()?; } + res = + self.execute_build(default_target, true, build, &limits, &metadata, false)?; + } - let mut target_build_logs = HashMap::new(); - if has_docs { - debug!("adding documentation for the default target to the database"); - self.copy_docs( - &build.host_target_dir(), - local_storage.path(), - default_target, - true, - )?; - - successful_targets.push(res.target.clone()); - - // Then build the documentation for all the targets - // Limit the number of targets so that no one can try to build all 200000 possible targets - for target in other_targets.into_iter().take(limits.targets()) { - debug!("building package {} {} for {}", name, version, target); - let target_res = self.build_target( - target, - build, - &limits, - local_storage.path(), - &mut successful_targets, - &metadata, - )?; - target_build_logs.insert(target, target_res.build_log); - } - let (_, new_alg) = self.runtime.block_on(add_path_into_remote_archive( - &self.async_storage, - &rustdoc_archive_path(name, version), - local_storage.path(), - true, - ))?; - algs.insert(new_alg); - }; - - let has_examples = build.host_source_dir().join("examples").is_dir(); - if res.result.successful { - self.metrics.successful_builds.inc(); - } else if res.cargo_metadata.root().is_library() { - self.metrics.failed_builds.inc(); - } else { - self.metrics.non_library_builds.inc(); + if res.result.successful { + if let Some(name) = res.cargo_metadata.root().library_name() { + let host_target = build.host_target_dir(); + has_docs = host_target + .join(default_target) + .join("doc") + .join(name) + .is_dir(); } + } - let release_data = if !is_local { - match self - .runtime - .block_on(self.registry_api.get_release_data(name, version)) - .with_context(|| { - format!("could not fetch releases-data for {name}-{version}") - }) { - Ok(data) => Some(data), - Err(err) => { - report_error(&err); - None - } - } - } else { - None - } - .unwrap_or_default(); - - let cargo_metadata = res.cargo_metadata.root(); - let repository = self.get_repo(cargo_metadata)?; + let mut target_build_logs = HashMap::new(); + if has_docs { + debug!("adding documentation for the default target to the database"); + self.copy_docs( + &build.host_target_dir(), + local_storage.path(), + default_target, + true, + )?; - let mut async_conn = self.runtime.block_on(self.db.get_async())?; + successful_targets.push(res.target.clone()); - let release_id = self.runtime.block_on(add_package_into_database( - &mut async_conn, - cargo_metadata, - &build.host_source_dir(), - &res.target, - files_list, - successful_targets, - &release_data, - has_docs, - has_examples, - algs, - repository, + // Then build the documentation for all the targets + // Limit the number of targets so that no one can try to build all 200000 possible targets + for target in other_targets.into_iter().take(limits.targets()) { + debug!("building package {} {} for {}", name, version, target); + let target_res = self.build_target( + target, + build, + &limits, + local_storage.path(), + &mut successful_targets, + &metadata, + )?; + target_build_logs.insert(target, target_res.build_log); + } + let (_, new_alg) = self.runtime.block_on(add_path_into_remote_archive( + &self.async_storage, + &rustdoc_archive_path(name, version), + local_storage.path(), true, ))?; + algs.insert(new_alg); + }; - if let Some(doc_coverage) = res.doc_coverage { - self.runtime.block_on(add_doc_coverage( - &mut async_conn, - release_id, - doc_coverage, - ))?; - } + let has_examples = build.host_source_dir().join("examples").is_dir(); + if res.result.successful { + self.metrics.successful_builds.inc(); + } else if res.cargo_metadata.root().is_library() { + self.metrics.failed_builds.inc(); + } else { + self.metrics.non_library_builds.inc(); + } - let build_status = if res.result.successful { - BuildStatus::Success - } else { - BuildStatus::Failure - }; - self.runtime.block_on(finish_build( + let release_data = if !is_local { + match self + .runtime + .block_on(self.registry_api.get_release_data(name, version)) + .with_context(|| { + format!("could not fetch releases-data for {name}-{version}") + }) { + Ok(data) => Some(data), + Err(err) => { + report_error(&err); + None + } + } + } else { + None + } + .unwrap_or_default(); + + let cargo_metadata = res.cargo_metadata.root(); + let repository = self.get_repo(cargo_metadata)?; + + let mut async_conn = self.runtime.block_on(self.db.get_async())?; + + let release_id = self.runtime.block_on(add_package_into_database( + &mut async_conn, + cargo_metadata, + &build.host_source_dir(), + &res.target, + files_list, + successful_targets, + &release_data, + has_docs, + has_examples, + algs, + repository, + true, + ))?; + + if let Some(doc_coverage) = res.doc_coverage { + self.runtime.block_on(add_doc_coverage( &mut async_conn, - build_id, - &res.result.rustc_version, - &res.result.docsrs_version, - build_status, - None, + release_id, + doc_coverage, ))?; + } - { - let _span = info_span!("store_build_logs").entered(); - let build_log_path = format!("build-logs/{build_id}/{default_target}.txt"); - self.storage.store_one(build_log_path, res.build_log)?; - for (target, log) in target_build_logs { - let build_log_path = format!("build-logs/{build_id}/{target}.txt"); - self.storage.store_one(build_log_path, log)?; - } + let build_status = if res.result.successful { + BuildStatus::Success + } else { + BuildStatus::Failure + }; + self.runtime.block_on(finish_build( + &mut async_conn, + build_id, + &res.result.rustc_version, + &res.result.docsrs_version, + build_status, + None, + ))?; + + { + let _span = info_span!("store_build_logs").entered(); + let build_log_path = format!("build-logs/{build_id}/{default_target}.txt"); + self.storage.store_one(build_log_path, res.build_log)?; + for (target, log) in target_build_logs { + let build_log_path = format!("build-logs/{build_id}/{target}.txt"); + self.storage.store_one(build_log_path, log)?; } + } - // Some crates.io crate data is mutable, so we proactively update it during a release - if !is_local { - match self - .runtime - .block_on(self.registry_api.get_crate_data(name)) - { - Ok(crate_data) => self.runtime.block_on( - update_crate_data_in_database(&mut async_conn, name, &crate_data), - )?, - Err(err) => warn!("{:#?}", err), - } + // Some crates.io crate data is mutable, so we proactively update it during a release + if !is_local { + match self + .runtime + .block_on(self.registry_api.get_crate_data(name)) + { + Ok(crate_data) => self.runtime.block_on(update_crate_data_in_database( + &mut async_conn, + name, + &crate_data, + ))?, + Err(err) => warn!("{:#?}", err), } + } - if res.result.successful { - // delete eventually existing files from pre-archive storage. - // we're doing this in the end so eventual problems in the build - // won't lead to non-existing docs. - for prefix in &["rustdoc", "sources"] { - let prefix = format!("{prefix}/{name}/{version}/"); - debug!("cleaning old storage folder {}", prefix); - self.storage.delete_prefix(&prefix)?; - } + if res.result.successful { + // delete eventually existing files from pre-archive storage. + // we're doing this in the end so eventual problems in the build + // won't lead to non-existing docs. + for prefix in &["rustdoc", "sources"] { + let prefix = format!("{prefix}/{name}/{version}/"); + debug!("cleaning old storage folder {}", prefix); + self.storage.delete_prefix(&prefix)?; } + } - self.runtime.block_on(async move { - // we need to drop the async connection inside an async runtime context - // so sqlx can use a runtime to handle the pool. - drop(async_conn); - }); + self.runtime.block_on(async move { + // we need to drop the async connection inside an async runtime context + // so sqlx can use a runtime to handle the pool. + drop(async_conn); + }); - Ok(res.result.successful) - })() - .map_err(|e| failure::Error::from_boxed_compat(e.into())) - }) - .map_err(|e| e.compat())?; + Ok(res.result.successful) + })?; { let _span = info_span!("purge_from_cache").entered(); - krate - .purge_from_cache(&self.workspace) - .map_err(FailureError::compat)?; + krate.purge_from_cache(&self.workspace)?; local_storage.close()?; } Ok(successful) @@ -927,9 +889,7 @@ impl RustwideBuilder { }) || cargo_args.last().unwrap().starts_with("-Zbuild-std"); if !docsrs_metadata::DEFAULT_TARGETS.contains(&target) && !has_build_std { // This is a no-op if the target is already installed. - self.toolchain - .add_target(&self.workspace, target) - .map_err(FailureError::compat)?; + self.toolchain.add_target(&self.workspace, target)?; } let mut command = build