Skip to main content

blue_build_process_management/drivers/
local_driver.rs

1use std::path::PathBuf;
2
3use blue_build_utils::{container::Tag, string_vec};
4use comlexr::cmd;
5use log::trace;
6use miette::{Result, bail};
7
8use super::{CiDriver, Driver, opts::GenerateTagsOpts};
9
10pub struct LocalDriver;
11
12impl CiDriver for LocalDriver {
13    fn on_default_branch() -> bool {
14        trace!("LocalDriver::on_default_branch()");
15        false
16    }
17
18    fn keyless_cert_identity() -> Result<String> {
19        bail!("Unimplemented for local")
20    }
21
22    fn oidc_provider() -> miette::Result<String> {
23        bail!("Unimplemented for local")
24    }
25
26    fn generate_tags(opts: GenerateTagsOpts) -> Result<Vec<Tag>> {
27        trace!("LocalDriver::generate_tags({opts:?})");
28        let os_version = Driver::get_os_version().oci_ref(opts.oci_ref).call()?;
29        let timestamp = blue_build_utils::get_tag_timestamp();
30        let short_sha = commit_sha();
31
32        opts.alt_tags
33            .as_ref()
34            .map_or_else(
35                || {
36                    let mut tags = string_vec![
37                        "latest",
38                        &timestamp,
39                        format!("{os_version}"),
40                        format!("{timestamp}-{os_version}"),
41                    ];
42
43                    if let Some(short_sha) = &short_sha {
44                        tags.push(format!("{short_sha}-{os_version}"));
45                    }
46
47                    tags
48                },
49                |alt_tags| {
50                    alt_tags
51                        .iter()
52                        .flat_map(|alt| {
53                            let mut tags = string_vec![
54                                alt,
55                                format!("{alt}-{os_version}"),
56                                format!("{timestamp}-{alt}-{os_version}"),
57                            ];
58                            if let Some(short_sha) = &short_sha {
59                                tags.push(format!("{short_sha}-{alt}-{os_version}"));
60                            }
61
62                            tags
63                        })
64                        .collect()
65                },
66            )
67            .into_iter()
68            .map(|tag| tag.parse())
69            .collect()
70    }
71
72    fn get_repo_url() -> miette::Result<String> {
73        trace!("LocalDriver::get_repo_url()");
74        Ok(String::new())
75    }
76
77    fn get_registry() -> miette::Result<String> {
78        trace!("LocalDriver::get_registry()");
79        Ok(String::from("localhost"))
80    }
81
82    fn default_ci_file_path() -> PathBuf {
83        unimplemented!()
84    }
85}
86
87fn commit_sha() -> Option<String> {
88    let output = cmd!("git", "rev-parse", "--short", "HEAD").output().ok()?;
89
90    if output.status.success() {
91        String::from_utf8(output.stdout)
92            .ok()
93            .map(|s| s.trim().to_string())
94    } else {
95        None
96    }
97}