cli_xtask/subcommand/
dist_archive.rs1use crate::{archive, config::Config, Result, Run};
2
3#[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 #[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}