use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum TagFormat {
#[default]
Auto,
Prefixed,
Simple,
}
impl TagFormat {
pub fn tag(
self,
package_name: &str,
version: &semver::Version,
is_multi_package: bool,
) -> String {
match self {
TagFormat::Auto => {
if is_multi_package {
format!("{package_name}@{version}")
} else {
format!("v{version}")
}
}
TagFormat::Prefixed => format!("{package_name}@{version}"),
TagFormat::Simple => format!("v{version}"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum SignedCommitsMode {
#[default]
Auto,
Force,
Off,
}
fn is_default_signed_commits_mode(m: &SignedCommitsMode) -> bool {
matches!(m, SignedCommitsMode::Auto)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Strategy {
Push,
Branch,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(default, deny_unknown_fields)]
pub struct GitConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) strategy: Option<Strategy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) release_branch_prefix: Option<String>,
pub tag_format: TagFormat,
pub extra_files: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) prepare_commit_message: Option<String>,
#[serde(default, skip_serializing_if = "is_default_signed_commits_mode")]
pub signed_commits: SignedCommitsMode,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub(crate) publish_private_packages: Vec<String>,
}
impl GitConfig {
pub fn enabled(&self) -> bool {
self.enabled.unwrap_or(false)
}
pub fn strategy(&self) -> Strategy {
self.strategy.unwrap_or(Strategy::Push)
}
pub fn release_branch_prefix(&self) -> &str {
self.release_branch_prefix
.as_deref()
.unwrap_or("cursus-release/")
}
pub(super) fn resolve_defaults(&mut self, forge_enabled: bool) {
if forge_enabled && self.enabled.is_none() {
self.enabled = Some(true);
}
if self.strategy.is_none() {
self.strategy = Some(if forge_enabled {
Strategy::Branch
} else {
Strategy::Push
});
}
}
pub fn enabled_config() -> Self {
Self {
enabled: Some(true),
..Default::default()
}
}
pub fn with_strategy(mut self, strategy: Strategy) -> Self {
self.strategy = Some(strategy);
self
}
pub fn with_release_branch_prefix(mut self, prefix: String) -> Self {
self.release_branch_prefix = Some(prefix);
self
}
pub fn with_tag_format(mut self, tag_format: TagFormat) -> Self {
self.tag_format = tag_format;
self
}
pub fn with_extra_files(mut self, extra_files: Vec<String>) -> Self {
self.extra_files = extra_files;
self
}
pub fn prepare_commit_message(&self) -> &str {
self.prepare_commit_message
.as_deref()
.unwrap_or("ci(release): version packages")
}
pub fn with_prepare_commit_message(mut self, message: String) -> Self {
self.prepare_commit_message = Some(message);
self
}
pub fn publish_private_packages(&self) -> &[String] {
&self.publish_private_packages
}
pub fn with_publish_private_packages(mut self, packages: Vec<String>) -> Self {
self.publish_private_packages = packages;
self
}
}