cli_xtask/subcommand/
dist_archive.rs

1use crate::{archive, config::Config, Result, Run};
2
3/// Arguments definition of the `dist-archive` subcommand.
4#[cfg_attr(doc, doc = include_str!("../../doc/cargo-xtask-dist-archive.md"))]
5#[derive(Debug, Clone, Default, clap::Args)]
6#[non_exhaustive]
7pub struct DistArchive {}
8
9impl Run for DistArchive {
10    fn run(&self, config: &Config) -> Result<()> {
11        self.run(config)
12    }
13}
14
15impl DistArchive {
16    /// Runs the `dist-archive` subcommand.
17    #[tracing::instrument(name = "dist-archive", skip_all, err)]
18    pub fn run(&self, config: &Config) -> Result<()> {
19        let Self {} = self;
20        let config = config.dist()?;
21
22        if !config.dist_base_working_directory().is_dir() {
23            tracing::warn!("no build artifacts found");
24            return Ok(());
25        }
26
27        let dist_dir = config.dist_target_directory();
28
29        let noarch_path = config.dist_base_working_directory().join("noarch");
30        let noarch_path = noarch_path.is_dir().then_some(noarch_path);
31
32        let mut created = false;
33        for dir in config.dist_base_working_directory().read_dir_utf8()? {
34            let dir = dir?;
35            if !dir.file_type()?.is_dir() {
36                continue;
37            }
38            let dir = dir.path();
39            if dir.file_name() == Some("noarch") {
40                continue;
41            }
42            let target_triple = dir.file_name().unwrap();
43            let archive_name = format!("{}-{}.tar.gz", config.name(), target_triple);
44            let archive_path = dist_dir.join(archive_name);
45
46            let mut targets = vec![];
47            for dir in [dir].into_iter().chain(noarch_path.as_deref()) {
48                for entry in dir.read_dir_utf8()? {
49                    targets.push(entry?.path().to_owned());
50                }
51            }
52            archive::create(&archive_path, &targets)?;
53
54            tracing::info!("Archive created successfully: {archive_path}");
55            created = true;
56        }
57
58        if !created && noarch_path.is_some() {
59            let archive_name = format!("{}-noarch.tar.gz", config.name());
60            let archive_path = dist_dir.join(archive_name);
61
62            archive::create(&archive_path, [noarch_path.unwrap()].into_iter())?;
63
64            tracing::info!("Archive created successfully: {archive_path}");
65        }
66
67        Ok(())
68    }
69}