Skip to main content

gitversion_rs/config/
model.rs

1//! GitVersion configuration data model.
2//!
3//! Maps 1:1 to the original `schemas/6.3/GitVersion.configuration.json` and
4//! `GitVersion.Configuration/GitVersionConfiguration.cs`.
5//! All YAML keys are kebab-case.
6
7use serde::{Deserialize, Serialize};
8use std::collections::BTreeMap;
9
10/// Increment strategy. `increment` key.
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12pub enum IncrementStrategy {
13    None,
14    Major,
15    Minor,
16    Patch,
17    Inherit,
18}
19
20/// Deployment mode. `mode` key.
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
22pub enum DeploymentMode {
23    ManualDeployment,
24    ContinuousDelivery,
25    ContinuousDeployment,
26}
27
28/// Commit-message-based increment behaviour. `commit-message-incrementing` key.
29#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
30pub enum CommitMessageIncrementMode {
31    Enabled,
32    Disabled,
33    MergeMessageOnly,
34}
35
36/// Version discovery strategy. `strategies` key.
37#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
38pub enum VersionStrategy {
39    None,
40    Fallback,
41    ConfiguredNextVersion,
42    MergeMessage,
43    TaggedCommit,
44    TrackReleaseBranches,
45    VersionInBranchName,
46    Mainline,
47}
48
49/// Versioning scheme for AssemblyVersion / AssemblyFileVersion.
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
51pub enum VersioningScheme {
52    MajorMinorPatchTag,
53    MajorMinorPatch,
54    MajorMinor,
55    Major,
56    None,
57}
58
59/// SemanticVersion parsing strictness.
60#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
61pub enum SemanticVersionFormat {
62    Strict,
63    Loose,
64}
65
66/// Prevent-increment configuration. `prevent-increment` key.
67#[derive(Debug, Clone, Default, Serialize, Deserialize)]
68#[serde(rename_all = "kebab-case")]
69pub struct PreventIncrement {
70    #[serde(default)]
71    pub of_merged_branch: Option<bool>,
72    #[serde(default)]
73    pub when_branch_merged: Option<bool>,
74    #[serde(default)]
75    pub when_current_commit_tagged: Option<bool>,
76}
77
78/// Commit-ignore configuration. `ignore` key.
79#[derive(Debug, Clone, Default, Serialize, Deserialize)]
80#[serde(rename_all = "kebab-case")]
81pub struct IgnoreConfig {
82    #[serde(default)]
83    pub commits_before: Option<String>,
84    #[serde(default)]
85    pub sha: Vec<String>,
86    /// Exclude commits that only touch files under these paths from version calculation.
87    /// A commit is excluded only when *all* its changed files fall under the ignored paths.
88    #[serde(default, skip_serializing_if = "Vec::is_empty")]
89    pub paths: Vec<String>,
90}
91
92/// Per-branch configuration. Merged with the global configuration via inheritance.
93#[derive(Debug, Clone, Default, Serialize, Deserialize)]
94#[serde(rename_all = "kebab-case")]
95pub struct BranchConfiguration {
96    #[serde(default, skip_serializing_if = "Option::is_none")]
97    pub regex: Option<String>,
98    #[serde(default, skip_serializing_if = "Option::is_none")]
99    pub label: Option<String>,
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub increment: Option<IncrementStrategy>,
102    #[serde(default, skip_serializing_if = "Option::is_none")]
103    pub mode: Option<DeploymentMode>,
104    #[serde(default, skip_serializing_if = "Option::is_none")]
105    pub commit_message_incrementing: Option<CommitMessageIncrementMode>,
106    #[serde(default, skip_serializing_if = "Option::is_none")]
107    pub prevent_increment: Option<PreventIncrement>,
108    #[serde(default, skip_serializing_if = "Option::is_none")]
109    pub track_merge_target: Option<bool>,
110    #[serde(default, skip_serializing_if = "Option::is_none")]
111    pub track_merge_message: Option<bool>,
112    #[serde(default, skip_serializing_if = "Option::is_none")]
113    pub tracks_release_branches: Option<bool>,
114    #[serde(default, skip_serializing_if = "Option::is_none")]
115    pub is_release_branch: Option<bool>,
116    #[serde(default, skip_serializing_if = "Option::is_none")]
117    pub is_main_branch: Option<bool>,
118    #[serde(default, skip_serializing_if = "Option::is_none")]
119    pub pre_release_weight: Option<i64>,
120    #[serde(default, skip_serializing_if = "Vec::is_empty")]
121    pub source_branches: Vec<String>,
122    #[serde(default, skip_serializing_if = "Vec::is_empty")]
123    pub is_source_branch_for: Vec<String>,
124    /// Regex for extracting a number from the pre-release label.
125    /// Corresponds to the original `BranchConfiguration.LabelNumberPattern`.
126    /// When None, the built-in fixed pattern is used.
127    #[serde(default, skip_serializing_if = "Option::is_none")]
128    pub label_number_pattern: Option<String>,
129}
130
131/// Root GitVersion configuration.
132#[derive(Debug, Clone, Default, Serialize, Deserialize)]
133#[serde(rename_all = "kebab-case")]
134pub struct GitVersionConfiguration {
135    #[serde(default, skip_serializing_if = "Option::is_none")]
136    pub workflow: Option<String>,
137    #[serde(default, skip_serializing_if = "Option::is_none")]
138    pub assembly_versioning_scheme: Option<VersioningScheme>,
139    #[serde(default, skip_serializing_if = "Option::is_none")]
140    pub assembly_file_versioning_scheme: Option<VersioningScheme>,
141    #[serde(default, skip_serializing_if = "Option::is_none")]
142    pub assembly_informational_format: Option<String>,
143    #[serde(default, skip_serializing_if = "Option::is_none")]
144    pub assembly_versioning_format: Option<String>,
145    #[serde(default, skip_serializing_if = "Option::is_none")]
146    pub assembly_file_versioning_format: Option<String>,
147    #[serde(default, skip_serializing_if = "Option::is_none")]
148    pub tag_prefix: Option<String>,
149    #[serde(default, skip_serializing_if = "Option::is_none")]
150    pub version_in_branch_pattern: Option<String>,
151    #[serde(default, skip_serializing_if = "Option::is_none")]
152    pub next_version: Option<String>,
153    #[serde(default, skip_serializing_if = "Option::is_none")]
154    pub major_version_bump_message: Option<String>,
155    #[serde(default, skip_serializing_if = "Option::is_none")]
156    pub minor_version_bump_message: Option<String>,
157    #[serde(default, skip_serializing_if = "Option::is_none")]
158    pub patch_version_bump_message: Option<String>,
159    #[serde(default, skip_serializing_if = "Option::is_none")]
160    pub no_bump_message: Option<String>,
161    #[serde(default, skip_serializing_if = "Option::is_none")]
162    pub tag_pre_release_weight: Option<i64>,
163    #[serde(default, skip_serializing_if = "Option::is_none")]
164    pub commit_date_format: Option<String>,
165    #[serde(default, skip_serializing_if = "Option::is_none")]
166    pub semantic_version_format: Option<SemanticVersionFormat>,
167    #[serde(default, skip_serializing_if = "Option::is_none")]
168    pub update_build_number: Option<bool>,
169    #[serde(default, skip_serializing_if = "Vec::is_empty")]
170    pub strategies: Vec<VersionStrategy>,
171
172    // Global defaults that can also be overridden per-branch
173    #[serde(default, skip_serializing_if = "Option::is_none")]
174    pub increment: Option<IncrementStrategy>,
175    #[serde(default, skip_serializing_if = "Option::is_none")]
176    pub mode: Option<DeploymentMode>,
177    #[serde(default, skip_serializing_if = "Option::is_none")]
178    pub label: Option<String>,
179    #[serde(default, skip_serializing_if = "Option::is_none")]
180    pub regex: Option<String>,
181    #[serde(default, skip_serializing_if = "Option::is_none")]
182    pub commit_message_incrementing: Option<CommitMessageIncrementMode>,
183    #[serde(default, skip_serializing_if = "Option::is_none")]
184    pub prevent_increment: Option<PreventIncrement>,
185    #[serde(default, skip_serializing_if = "Option::is_none")]
186    pub track_merge_target: Option<bool>,
187    #[serde(default, skip_serializing_if = "Option::is_none")]
188    pub track_merge_message: Option<bool>,
189    #[serde(default, skip_serializing_if = "Option::is_none")]
190    pub tracks_release_branches: Option<bool>,
191    #[serde(default, skip_serializing_if = "Option::is_none")]
192    pub is_release_branch: Option<bool>,
193    #[serde(default, skip_serializing_if = "Option::is_none")]
194    pub is_main_branch: Option<bool>,
195    #[serde(default, skip_serializing_if = "Option::is_none")]
196    pub pre_release_weight: Option<i64>,
197    #[serde(default, skip_serializing_if = "Vec::is_empty")]
198    pub source_branches: Vec<String>,
199    #[serde(default, skip_serializing_if = "Vec::is_empty")]
200    pub is_source_branch_for: Vec<String>,
201    /// Global default `label-number-pattern`. Can be overridden per branch.
202    #[serde(default, skip_serializing_if = "Option::is_none")]
203    pub label_number_pattern: Option<String>,
204
205    #[serde(default)]
206    pub ignore: IgnoreConfig,
207    #[serde(default)]
208    pub merge_message_formats: BTreeMap<String, String>,
209    #[serde(default)]
210    pub branches: BTreeMap<String, BranchConfiguration>,
211
212    /// External command hooks (similar to the semantic-release exec plugin). Hook name -> shell command.
213    /// Supported hooks: verify, prepare, publish, success, fail.
214    #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
215    pub exec: BTreeMap<String, String>,
216}