Skip to content

Commit 948dbc0

Browse files
committed
Introducing a new templating mechanism to support different workflows
1 parent b3bd181 commit 948dbc0

File tree

13 files changed

+518
-5
lines changed

13 files changed

+518
-5
lines changed

docs/input/docs/reference/configuration.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ is-mainline: false
173173
174174
The details of the available options are as follows:
175175
176+
### workflows
177+
178+
The base template of the configuration to use. Possible values are: GitFlow/v1 or GitHubFlow/v1
179+
176180
### next-version
177181
178182
Allows you to bump the next version explicitly. Useful for bumping `main` or a

src/GitVersion.Core.Tests/IntegrationTests/HotfixBranchScenarios.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,27 @@ public void FeatureOnHotfixFeatureBranchNotDeleted()
219219
fixture.MergeNoFF(featureBranch); // commit 2
220220
fixture.AssertFullSemver("4.5.1-beta.2", configuration);
221221
}
222+
223+
[Test]
224+
public void IsVersionTakenFromHotfixBranchName()
225+
{
226+
var configuration = GitFlowConfigurationBuilder.New.Build();
227+
228+
using var fixture = new BaseGitFlowRepositoryFixture("4.20.4");
229+
230+
fixture.Checkout("develop");
231+
fixture.AssertFullSemver("4.21.0-alpha.1", configuration);
232+
233+
fixture.BranchTo("release/4.21.1");
234+
fixture.AssertFullSemver("4.21.1-beta.1+0", configuration);
235+
236+
fixture.MakeACommit();
237+
fixture.AssertFullSemver("4.21.1-beta.1+1", configuration);
238+
239+
fixture.BranchTo("hotfix/4.21.1");
240+
fixture.AssertFullSemver("4.21.1-beta.1+1", configuration);
241+
242+
fixture.MakeACommit();
243+
fixture.AssertFullSemver("4.21.1-beta.1+2", configuration);
244+
}
222245
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace GitVersion.Configuration;
2+
3+
internal sealed class ConfigurationBuilder : ConfigurationBuilderBase<ConfigurationBuilder>
4+
{
5+
public static ConfigurationBuilder New => new();
6+
}

src/GitVersion.Core/Configuration/ConfigurationBuilderBase.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace GitVersion.Configuration;
55

6-
internal abstract class ConfigurationBuilderBase<TConfigurationBuilder>
6+
internal abstract class ConfigurationBuilderBase<TConfigurationBuilder> : IConfigurationBuilder
77
where TConfigurationBuilder : ConfigurationBuilderBase<TConfigurationBuilder>
88
{
99
private AssemblyVersioningScheme? assemblyVersioningScheme;
@@ -363,13 +363,12 @@ public virtual TConfigurationBuilder WithConfiguration(GitVersionConfiguration v
363363
return (TConfigurationBuilder)this;
364364
}
365365

366-
public TConfigurationBuilder AddOverride(IReadOnlyDictionary<object, object?> value)
366+
public void AddOverride(IReadOnlyDictionary<object, object?> value)
367367
{
368368
if (value.Any())
369369
{
370370
this.overrides.Add(value);
371371
}
372-
return (TConfigurationBuilder)this;
373372
}
374373

375374
public virtual GitVersionConfiguration Build()

src/GitVersion.Core/Configuration/ConfigurationProvider.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using GitVersion.Configuration.Init.Wizard;
22
using GitVersion.Extensions;
33
using GitVersion.Logging;
4+
using GitVersion.Properties;
45
using Microsoft.Extensions.Options;
56
using YamlDotNet.Core;
67

@@ -54,8 +55,24 @@ internal GitVersionConfiguration ProvideInternal(
5455
{
5556
var overrideConfigurationFromFile = this.configFileLocator.ReadOverrideConfiguration(workingDirectory);
5657

57-
var configurationBuilder = GitFlowConfigurationBuilder.New;
58-
foreach (var item in new[] { overrideConfigurationFromFile, overrideConfiguration })
58+
var workflow = GetWorkflow(overrideConfiguration, overrideConfigurationFromFile);
59+
60+
Dictionary<object, object?>? overrideConfigurationFromWorkflow = null;
61+
62+
if (!string.IsNullOrEmpty(workflow))
63+
{
64+
var workflowResource = (byte[]?)Resources.ResourceManager.GetObject(workflow, Resources.Culture);
65+
if (workflowResource != null)
66+
{
67+
overrideConfigurationFromWorkflow = ConfigurationSerializer.Deserialize<Dictionary<object, object?>>(
68+
Encoding.UTF8.GetString(workflowResource)
69+
);
70+
}
71+
}
72+
73+
IConfigurationBuilder configurationBuilder = (workflow is null)
74+
? GitFlowConfigurationBuilder.New : ConfigurationBuilder.New;
75+
foreach (var item in new[] { overrideConfigurationFromWorkflow, overrideConfigurationFromFile, overrideConfiguration })
5976
{
6077
if (item != null) configurationBuilder.AddOverride(item);
6178
}
@@ -73,6 +90,20 @@ internal GitVersionConfiguration ProvideInternal(
7390
}
7491
}
7592

93+
private static string? GetWorkflow(IReadOnlyDictionary<object, object?>? overrideConfiguration, IReadOnlyDictionary<object, object?>? overrideConfigurationFromFile)
94+
{
95+
string? workflow = null;
96+
foreach (var item in new[] { overrideConfigurationFromFile, overrideConfiguration })
97+
{
98+
if (item?.TryGetValue("workflow", out object? value) == true && value != null)
99+
{
100+
workflow = (string)value;
101+
}
102+
}
103+
104+
return workflow;
105+
}
106+
76107
private static string? ReadGitDirFromFile(string fileName)
77108
{
78109
const string expectedPrefix = "gitdir: ";
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
assembly-versioning-scheme: MajorMinorPatch
2+
assembly-file-versioning-scheme: MajorMinorPatch
3+
label-prefix: '[vV]?'
4+
major-version-bump-message: '\+semver:\s?(breaking|major)'
5+
minor-version-bump-message: '\+semver:\s?(feature|minor)'
6+
patch-version-bump-message: '\+semver:\s?(fix|patch)'
7+
no-bump-message: '\+semver:\s?(none|skip)'
8+
label-pre-release-weight: 60000
9+
commit-date-format: yyyy-MM-dd
10+
merge-message-formats: {}
11+
update-build-number: true
12+
semantic-version-format: Strict
13+
branches:
14+
develop:
15+
mode: ContinuousDeployment
16+
label: alpha
17+
increment: Minor
18+
prevent-increment-of-merged-branch-version: false
19+
track-merge-target: true
20+
regex: ^dev(elop)?(ment)?$
21+
source-branches: []
22+
tracks-release-branches: true
23+
is-release-branch: false
24+
is-mainline: false
25+
pre-release-weight: 0
26+
main:
27+
label: ''
28+
increment: Patch
29+
prevent-increment-of-merged-branch-version: true
30+
track-merge-target: false
31+
regex: ^master$|^main$
32+
source-branches:
33+
- develop
34+
- release
35+
tracks-release-branches: false
36+
is-release-branch: false
37+
is-mainline: true
38+
pre-release-weight: 55000
39+
release:
40+
label: beta
41+
increment: None
42+
prevent-increment-of-merged-branch-version: true
43+
track-merge-target: false
44+
regex: ^releases?[/-]
45+
source-branches:
46+
- develop
47+
- main
48+
- support
49+
- release
50+
tracks-release-branches: false
51+
is-release-branch: true
52+
is-mainline: false
53+
pre-release-weight: 30000
54+
feature:
55+
mode: ContinuousDelivery
56+
label: '{BranchName}'
57+
increment: Inherit
58+
regex: ^features?[/-]
59+
source-branches:
60+
- develop
61+
- main
62+
- release
63+
- feature
64+
- support
65+
- hotfix
66+
pre-release-weight: 30000
67+
pull-request:
68+
mode: ContinuousDelivery
69+
label: PullRequest
70+
increment: Inherit
71+
label-number-pattern: '[/-](?<number>\d+)'
72+
regex: ^(pull|pull\-requests|pr)[/-]
73+
source-branches:
74+
- develop
75+
- main
76+
- release
77+
- feature
78+
- support
79+
- hotfix
80+
pre-release-weight: 30000
81+
hotfix:
82+
mode: ContinuousDelivery
83+
label: beta
84+
increment: Inherit
85+
regex: ^hotfix(es)?[/-]
86+
source-branches:
87+
- release
88+
- main
89+
- support
90+
- hotfix
91+
pre-release-weight: 30000
92+
support:
93+
label: ''
94+
increment: Patch
95+
prevent-increment-of-merged-branch-version: true
96+
track-merge-target: false
97+
regex: ^support[/-]
98+
source-branches:
99+
- main
100+
tracks-release-branches: false
101+
is-release-branch: false
102+
is-mainline: true
103+
pre-release-weight: 55000
104+
unknown:
105+
mode: ContinuousDelivery
106+
label: '{BranchName}'
107+
increment: Inherit
108+
regex: .*
109+
source-branches:
110+
- main
111+
- develop
112+
- release
113+
- feature
114+
- pull-request
115+
- hotfix
116+
- support
117+
ignore:
118+
sha: []
119+
mode: ContinuousDelivery
120+
label: '{BranchName}'
121+
increment: Inherit
122+
prevent-increment-of-merged-branch-version: false
123+
track-merge-target: false
124+
track-merge-message: true
125+
commit-message-incrementing: Enabled
126+
regex: ''
127+
tracks-release-branches: false
128+
is-release-branch: false
129+
is-mainline: false
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
assembly-versioning-scheme: MajorMinorPatch
2+
assembly-file-versioning-scheme: MajorMinorPatch
3+
label-prefix: '[vV]?'
4+
major-version-bump-message: '\+semver:\s?(breaking|major)'
5+
minor-version-bump-message: '\+semver:\s?(feature|minor)'
6+
patch-version-bump-message: '\+semver:\s?(fix|patch)'
7+
no-bump-message: '\+semver:\s?(none|skip)'
8+
label-pre-release-weight: 60000
9+
commit-date-format: yyyy-MM-dd
10+
merge-message-formats: {}
11+
update-build-number: true
12+
semantic-version-format: Strict
13+
branches:
14+
main:
15+
label: ''
16+
increment: Patch
17+
prevent-increment-of-merged-branch-version: true
18+
track-merge-target: false
19+
regex: ^master$|^main$
20+
source-branches:
21+
- release
22+
tracks-release-branches: false
23+
is-release-branch: false
24+
is-mainline: true
25+
pre-release-weight: 55000
26+
release:
27+
label: beta
28+
increment: None
29+
prevent-increment-of-merged-branch-version: true
30+
track-merge-target: false
31+
regex: ^releases?[/-]
32+
source-branches:
33+
- main
34+
- release
35+
tracks-release-branches: false
36+
is-release-branch: true
37+
is-mainline: false
38+
pre-release-weight: 30000
39+
feature:
40+
mode: ContinuousDelivery
41+
label: '{BranchName}'
42+
increment: Inherit
43+
regex: ^features?[/-]
44+
source-branches:
45+
- main
46+
- release
47+
- feature
48+
pre-release-weight: 30000
49+
pull-request:
50+
mode: ContinuousDelivery
51+
label: PullRequest
52+
increment: Inherit
53+
label-number-pattern: '[/-](?<number>\d+)'
54+
regex: ^(pull|pull\-requests|pr)[/-]
55+
source-branches:
56+
- main
57+
- release
58+
- feature
59+
pre-release-weight: 30000
60+
unknown:
61+
mode: ContinuousDelivery
62+
label: '{BranchName}'
63+
increment: Inherit
64+
regex: .*
65+
source-branches:
66+
- main
67+
- release
68+
- feature
69+
- pull-request
70+
ignore:
71+
sha: []
72+
mode: ContinuousDelivery
73+
label: '{BranchName}'
74+
increment: Inherit
75+
prevent-increment-of-merged-branch-version: false
76+
track-merge-target: false
77+
track-merge-message: true
78+
commit-message-incrementing: Enabled
79+
regex: ''
80+
tracks-release-branches: false
81+
is-release-branch: false
82+
is-mainline: false

src/GitVersion.Core/Configuration/GitVersionConfiguration.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ public GitVersionConfiguration()
1414
Ignore = new IgnoreConfiguration();
1515
}
1616

17+
[JsonPropertyName("workflow")]
18+
[JsonPropertyDescription("The base template of the configuration to use. Possible values are: GitFlow/v1 or GitHubFlow/v1")]
19+
public string? Workflow { get; set; }
20+
1721
[JsonPropertyName("assembly-versioning-scheme")]
1822
[JsonPropertyDescription("The scheme to use when setting AssemblyVersion attribute. Can be 'MajorMinorPatchTag', 'MajorMinorPatch', 'MajorMinor', 'Major', 'None'.")]
1923
public AssemblyVersioningScheme? AssemblyVersioningScheme { get; set; }
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace GitVersion.Configuration;
2+
3+
internal interface IConfigurationBuilder
4+
{
5+
void AddOverride(IReadOnlyDictionary<object, object?> value);
6+
7+
GitVersionConfiguration Build();
8+
}

src/GitVersion.Core/GitVersion.Core.csproj

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,19 @@
2929
<InternalsVisibleTo Include="GitVersion.MsBuild.Tests" />
3030
</ItemGroup>
3131

32+
<ItemGroup>
33+
<Compile Update="Properties\Resources.Designer.cs">
34+
<DesignTime>True</DesignTime>
35+
<AutoGen>True</AutoGen>
36+
<DependentUpon>Resources.resx</DependentUpon>
37+
</Compile>
38+
</ItemGroup>
39+
40+
<ItemGroup>
41+
<EmbeddedResource Update="Properties\Resources.resx">
42+
<Generator>ResXFileCodeGenerator</Generator>
43+
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
44+
</EmbeddedResource>
45+
</ItemGroup>
46+
3247
</Project>

0 commit comments

Comments
 (0)