mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-04-20 20:48:43 +00:00
Fix metafile updating: Update them in entry
only
to avoid race condition. Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
488e7b8492
commit
92f4d0af95
3 changed files with 63 additions and 38 deletions
|
@ -1,6 +1,7 @@
|
|||
use std::collections::BTreeSet;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use crate::{DesiredTargets, PkgOverride};
|
||||
use crate::{metafiles, DesiredTargets, PkgOverride};
|
||||
|
||||
mod resolve;
|
||||
pub use resolve::*;
|
||||
|
@ -16,3 +17,11 @@ pub struct Options {
|
|||
pub cli_overrides: PkgOverride,
|
||||
pub desired_targets: DesiredTargets,
|
||||
}
|
||||
|
||||
/// MetaData required to update MetaFiles.
|
||||
pub struct MetaData {
|
||||
pub bins: BTreeSet<String>,
|
||||
pub cvs: metafiles::CrateVersionSource,
|
||||
pub version_req: String,
|
||||
pub target: String,
|
||||
}
|
||||
|
|
|
@ -1,18 +1,18 @@
|
|||
use std::{collections::BTreeSet, path::PathBuf, process, sync::Arc};
|
||||
use std::{path::PathBuf, process, sync::Arc};
|
||||
|
||||
use cargo_toml::Package;
|
||||
use log::{debug, error, info};
|
||||
use miette::{miette, IntoDiagnostic, Result, WrapErr};
|
||||
use tokio::{process::Command, task::block_in_place};
|
||||
|
||||
use super::{Options, Resolution};
|
||||
use super::{MetaData, Options, Resolution};
|
||||
use crate::{bins, fetchers::Fetcher, *};
|
||||
|
||||
pub async fn install(
|
||||
resolution: Resolution,
|
||||
opts: Arc<Options>,
|
||||
jobserver_client: LazyJobserverClient,
|
||||
) -> Result<()> {
|
||||
) -> Result<Option<MetaData>> {
|
||||
match resolution {
|
||||
Resolution::Fetch {
|
||||
fetcher,
|
||||
|
@ -37,13 +37,15 @@ pub async fn install(
|
|||
.ok_or_else(|| miette!("No viable targets found, try with `--targets`"))?;
|
||||
|
||||
if !opts.dry_run {
|
||||
install_from_source(package, target, jobserver_client).await
|
||||
install_from_source(package, target, jobserver_client)
|
||||
.await
|
||||
.map(|_| None)
|
||||
} else {
|
||||
info!(
|
||||
"Dry-run: running `cargo install {} --version {} --target {target}`",
|
||||
package.name, package.version
|
||||
);
|
||||
Ok(())
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -56,7 +58,7 @@ async fn install_from_package(
|
|||
version: String,
|
||||
bin_path: PathBuf,
|
||||
bin_files: Vec<bins::BinFile>,
|
||||
) -> Result<()> {
|
||||
) -> Result<Option<MetaData>> {
|
||||
// Download package
|
||||
if opts.dry_run {
|
||||
info!("Dry run, not downloading package");
|
||||
|
@ -90,7 +92,7 @@ async fn install_from_package(
|
|||
|
||||
if opts.dry_run {
|
||||
info!("Dry run, not proceeding");
|
||||
return Ok(());
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
info!("Installing binaries...");
|
||||
|
@ -106,25 +108,12 @@ async fn install_from_package(
|
|||
}
|
||||
}
|
||||
|
||||
let bins: BTreeSet<String> = bin_files.into_iter().map(|bin| bin.base_name).collect();
|
||||
|
||||
debug!("Writing .crates.toml");
|
||||
metafiles::v1::CratesToml::append(&cvs, bins.clone())?;
|
||||
|
||||
debug!("Writing .crates2.json");
|
||||
metafiles::v2::Crates2Json::append(
|
||||
&cvs,
|
||||
metafiles::v2::CrateInfo {
|
||||
version_req: Some(version),
|
||||
bins,
|
||||
profile: "release".into(),
|
||||
Ok(Some(MetaData {
|
||||
bins: bin_files.into_iter().map(|bin| bin.base_name).collect(),
|
||||
cvs,
|
||||
version_req: version,
|
||||
target: fetcher.target().to_string(),
|
||||
rustc: format!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")),
|
||||
..Default::default()
|
||||
},
|
||||
)?;
|
||||
|
||||
Ok(())
|
||||
}))
|
||||
})
|
||||
}
|
||||
|
||||
|
|
31
src/main.rs
31
src/main.rs
|
@ -12,7 +12,7 @@ use log::{debug, error, info, warn, LevelFilter};
|
|||
use miette::{miette, Result, WrapErr};
|
||||
use simplelog::{ColorChoice, ConfigBuilder, TermLogger, TerminalMode};
|
||||
use tempfile::TempDir;
|
||||
use tokio::{runtime::Runtime, task::JoinError};
|
||||
use tokio::{runtime::Runtime, task::block_in_place};
|
||||
|
||||
use cargo_binstall::{binstall, *};
|
||||
|
||||
|
@ -330,9 +330,35 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
|
|||
.collect()
|
||||
};
|
||||
|
||||
let mut metadata_vec = Vec::with_capacity(tasks.len());
|
||||
for task in tasks {
|
||||
await_task(task).await?;
|
||||
if let Some(metadata) = await_task(task).await? {
|
||||
metadata_vec.push(metadata);
|
||||
}
|
||||
}
|
||||
|
||||
block_in_place(|| {
|
||||
debug!("Writing .crates.toml");
|
||||
metafiles::v1::CratesToml::append(
|
||||
metadata_vec
|
||||
.iter()
|
||||
.map(|metadata| (&metadata.cvs, metadata.bins.clone())),
|
||||
)?;
|
||||
|
||||
debug!("Writing .crates2.json");
|
||||
metafiles::v2::Crates2Json::append(metadata_vec.into_iter().map(|metadata| {
|
||||
(
|
||||
metadata.cvs,
|
||||
metafiles::v2::CrateInfo {
|
||||
version_req: Some(metadata.version_req),
|
||||
bins: metadata.bins,
|
||||
profile: "release".into(),
|
||||
target: metadata.target,
|
||||
rustc: format!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")),
|
||||
..Default::default()
|
||||
},
|
||||
)
|
||||
}))?;
|
||||
|
||||
if opts.no_cleanup {
|
||||
// Consume temp_dir without removing it from fs.
|
||||
|
@ -344,4 +370,5 @@ async fn entry(jobserver_client: LazyJobserverClient) -> Result<()> {
|
|||
}
|
||||
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue