cli_xtask/subcommand/
sync_rdme.rs

1use std::process::Command;
2
3use crate::{
4    args::{EnvArgs, PackageArgs},
5    config::Config,
6    process::CommandExt,
7    Result, Run,
8};
9
10/// Arguments definition of the `sync-rdme` subcommand.
11#[cfg_attr(doc, doc = include_str!("../../doc/cargo-xtask-sync-rdme.md"))]
12#[derive(Debug, Clone, Default, clap::Args)]
13#[non_exhaustive]
14pub struct SyncRdme {
15    /// Environment variables to set for `cargo sync-rdme`.
16    #[clap(flatten)]
17    pub env_args: EnvArgs,
18    /// Packages to run the `cargo sync-rdme` with.
19    #[clap(flatten)]
20    pub package_args: PackageArgs,
21    /// Options to pass to the `cargo sync-rdme`
22    pub extra_options: Vec<String>,
23}
24
25impl Run for SyncRdme {
26    fn run(&self, config: &Config) -> Result<()> {
27        self.run(config)
28    }
29}
30
31impl SyncRdme {
32    /// Runs the `sync-rdme` subcommand.
33    #[tracing::instrument(name = "sync-rdme", skip_all, err)]
34    pub fn run(&self, _config: &Config) -> Result<()> {
35        let Self {
36            env_args,
37            package_args,
38            extra_options,
39        } = self;
40
41        for res in package_args.packages() {
42            let (workspace, package) = res?;
43            // rustup run nightly cargo sync-rdme <extra_options>
44            // `cargo +nightly sync-rdme` fails on windows, so use rustup instead
45            // cargo sync-rdme <extra_options>
46            Command::new("rustup")
47                .args([
48                    "run",
49                    "nightly",
50                    "cargo",
51                    "sync-rdme",
52                    "--package",
53                    &package.name,
54                    "--all-features",
55                ])
56                .args(extra_options)
57                .envs(env_args.env.clone())
58                // workaround: on windows, `cargo sync-rdme` fails for some packages with following error:
59                // error[E0514]: found crate `<crate>` compiled by an incompatible version of rustc
60                .env(
61                    "CARGO_TARGET_DIR",
62                    workspace.target_directory.join("nightly").as_str(),
63                )
64                .workspace_spawn(workspace)?;
65        }
66
67        Ok(())
68    }
69}