cli_xtask/subcommand/
dist_build_license.rs

1use eyre::eyre;
2
3use crate::{config::Config, fs::ToRelative, Result, Run};
4
5/// Arguments definition of the `dist-build-license` subcommand.
6#[cfg_attr(doc, doc = include_str!("../../doc/cargo-xtask-dist-build-license.md"))]
7#[derive(Debug, Clone, Default, clap::Args)]
8#[non_exhaustive]
9pub struct DistBuildLicense {}
10
11impl Run for DistBuildLicense {
12    fn run(&self, config: &Config) -> Result<()> {
13        self.run(config)
14    }
15}
16
17impl DistBuildLicense {
18    /// Execute `dist-build-license` subcommand workflow
19    #[tracing::instrument(name = "dist-build-license", skip_all, err)]
20    pub fn run(&self, config: &Config) -> Result<()> {
21        tracing::info!("Building license files...");
22
23        let Self {} = self;
24        let config = config.dist()?;
25
26        let packages = config.packages();
27
28        let working_dir = config.dist_working_directory(None);
29        let license_dir;
30        let add_package_dir;
31        if packages.len() > 1 {
32            license_dir = working_dir.join("license");
33            add_package_dir = true;
34            crate::fs::remove_dir(&license_dir)?;
35        } else {
36            license_dir = working_dir;
37            add_package_dir = false;
38        }
39
40        for package in config.packages() {
41            let dest_dir = if add_package_dir {
42                license_dir.join(package.name())
43            } else {
44                license_dir.clone()
45            };
46
47            for src_file in package.license_files() {
48                let file_name = src_file
49                    .file_name()
50                    .ok_or_else(|| eyre!("license file has no name: {}", src_file.to_relative()))?;
51                let dest_file = dest_dir.join(file_name);
52                crate::fs::copy(src_file, dest_file)?;
53            }
54        }
55
56        Ok(())
57    }
58}