blue_build_process_management/drivers/
local_driver.rs1use 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 ×tamp,
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}