Skip to main content

cargo_uv/
cargo.rs

1use std::process::{Child, Command, Stdio};
2
3use miette::IntoDiagnostic;
4use tracing::{debug, instrument};
5
6use crate::{GitBuilder, cli::Cli};
7
8pub struct Cargo;
9impl Cargo {
10    #[instrument(name = "Cargo::command")]
11    pub fn command(supress_stdout: bool) -> Command {
12        let mut cargo = Command::new("cargo");
13        if !supress_stdout {
14            debug!("Inherit");
15            cargo.stdout(Stdio::inherit());
16        } else {
17            cargo.stdout(Stdio::piped());
18        }
19        cargo
20    }
21
22    pub fn publish(cli_args: &Cli) -> miette::Result<Child> {
23        let mut cargo = Cargo::command(cli_args.suppress.includes_cargo());
24        cargo.arg("publish");
25        if cli_args.dry_run() {
26            cargo.arg("--dry-run");
27        }
28        let git = GitBuilder::new()
29            .root_directory(cli_args.root_dir()?)
30            .build();
31        git.dirty_files()?;
32        if cli_args.manifest.manifest_path.is_some() {
33            cargo
34                .arg("--manifest-path")
35                .arg(cli_args.manifest.manifest_path.clone().unwrap());
36        }
37        if cli_args.no_verify() {
38            cargo.arg("--no-verify");
39        }
40
41        // BUG: Be able to remove --allow-dirty #1
42        cargo.args(["--allow-dirty"]);
43        tracing::debug!("Running: {:?}", cargo);
44        cargo.spawn().into_diagnostic()
45    }
46
47    pub fn generate_lockfile(cli_args: &Cli) -> miette::Result<()> {
48        let mut cargo = Cargo::command(true);
49        cargo.arg("generate-lockfile");
50        if cli_args.manifest.manifest_path.is_some() {
51            cargo
52                .arg("--manifest-path")
53                .arg(cli_args.manifest.manifest_path.clone().unwrap());
54        }
55
56        tracing::debug!("Running: {:?}", cargo);
57        let output = cargo.output().into_diagnostic()?;
58        if !output.status.success() {
59            Err(
60                miette::miette!("{}", String::from_utf8(output.stderr).into_diagnostic()?)
61                    .context("While running `cargo generate-lockfile`"),
62            )?;
63        }
64        Ok(())
65    }
66}