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 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}