Skip to content

Commit dbd80e1

Browse files
authored
Merge pull request #1385 from ruhullahshah/feature/env_var_support_in_conf_file
Add support for using environment variables in the versioning formats.
2 parents 6dfa28c + 8d6ff9a commit dbd80e1

13 files changed

+241
-27
lines changed

docs/configuration.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,19 @@ while still updating the `AssemblyVersion` and `AssemblyInformationVersion`
7171
attributes. Valid values: `MajorMinorPatchTag`, `MajorMinorPatch`, `MajorMinor`,
7272
`Major`, `None`.
7373

74+
### assembly-file-versioning-format
75+
Set this to any of the available [variables](/more-info/variables) in combination (but not necessary) with
76+
a process scoped environment variable. It overwrites the value of `assembly-file-versioning-scheme`. To reference
77+
an environment variable, use `env:`
78+
Example Syntax #1: `'{Major}.{Minor}.{Patch}.{env:JENKINS_BUILD_NUMBER ?? fallback_string}'`. Uses `JENKINS_BUILD_NUMBER`
79+
if available in the environment otherwise the `fallback_string`
80+
Example Syntax #2: `'{Major}.{Minor}.{Patch}.{env:JENKINS_BUILD_NUMBER}'`. Uses `JENKINS_BUILD_NUMBER`
81+
if available in the environment otherwise the parsing fails.
82+
String interpolation is supported as in `assembly-informational-format`
83+
84+
### assembly-versioning-format
85+
Follows the same semantics as `assembly-file-versioning-format` and overwrites the value of `assembly-versioning-scheme`.
86+
7487
### assembly-informational-format
7588
Set this to any of the available [variables](/more-info/variables) to change the
7689
value of the `AssemblyInformationalVersion` attribute. Default set to

src/GitVersionCore.Tests/CommitDateTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void CommitDateFormatTest(string format, string expectedOutcome)
2727

2828
},
2929
new EffectiveConfiguration(
30-
AssemblyVersioningScheme.MajorMinorPatch, AssemblyFileVersioningScheme.MajorMinorPatch, "", VersioningMode.ContinuousDelivery, "", "", "", IncrementStrategy.Inherit,
30+
AssemblyVersioningScheme.MajorMinorPatch, AssemblyFileVersioningScheme.MajorMinorPatch, "", "", "", VersioningMode.ContinuousDelivery, "", "", "", IncrementStrategy.Inherit,
3131
"", true, "", "", false, "", "", "", "", CommitMessageIncrementMode.Enabled, 4, 4, 4, Enumerable.Empty<IVersionFilter>(), false, true, format)
3232
);
3333

src/GitVersionCore.Tests/GitVersionCore.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
<Compile Include="Helpers\PathHelper.cs" />
144144
<Compile Include="IntegrationTests\MasterScenarios.cs" />
145145
<Compile Include="SemanticVersionTests.cs" />
146+
<Compile Include="StringFormatWithExtensionTests.cs" />
146147
<Compile Include="TestableVersionVariables.cs" />
147148
<Compile Include="TestEffectiveConfiguration.cs" />
148149
<Compile Include="TestFileSystem.cs" />
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
using System;
2+
3+
using GitVersion;
4+
using NUnit.Framework;
5+
6+
namespace GitVersionCore.Tests
7+
{
8+
[TestFixture]
9+
10+
public class StringFormatWithExtensionTests
11+
{
12+
[Test]
13+
public void FormatWith_NoTokens()
14+
{
15+
var propertyObject = new { };
16+
var target = "Some String without tokens";
17+
var expected = target;
18+
var actual = target.FormatWith(propertyObject);
19+
Assert.AreEqual(expected, actual);
20+
}
21+
22+
[Test]
23+
public void FormatWith_SingleSimpleToken()
24+
{
25+
var propertyObject = new { SomeProperty = "SomeValue" };
26+
var target = "{SomeProperty}";
27+
var expected = "SomeValue";
28+
var actual = target.FormatWith(propertyObject);
29+
Assert.AreEqual(expected, actual);
30+
}
31+
32+
[Test]
33+
public void FormatWith_MultipleTokensAndVerbatimText()
34+
{
35+
var propertyObject = new { SomeProperty = "SomeValue", AnotherProperty = "Other Value" };
36+
var target = "{SomeProperty} some text {AnotherProperty}";
37+
var expected = "SomeValue some text Other Value";
38+
var actual = target.FormatWith(propertyObject);
39+
Assert.AreEqual(expected, actual);
40+
}
41+
42+
[Test]
43+
public void FormatWith_EnvVarToken()
44+
{
45+
Environment.SetEnvironmentVariable("GIT_VERSION_TEST_VAR", "Env Var Value");
46+
var propertyObject = new { };
47+
var target = "{env:GIT_VERSION_TEST_VAR}";
48+
var expected = "Env Var Value";
49+
var actual = target.FormatWith(propertyObject);
50+
Assert.AreEqual(expected, actual);
51+
}
52+
53+
[Test]
54+
public void FormatWith_EnvVarTokenWithFallback()
55+
{
56+
Environment.SetEnvironmentVariable("GIT_VERSION_TEST_VAR", "Env Var Value");
57+
var propertyObject = new { };
58+
var target = "{env:GIT_VERSION_TEST_VAR ?? fallback}";
59+
var expected = "Env Var Value";
60+
var actual = target.FormatWith(propertyObject);
61+
Assert.AreEqual(expected, actual);
62+
}
63+
64+
[Test]
65+
public void FormatWith_UnsetEnvVarTokenWithFallback()
66+
{
67+
Environment.SetEnvironmentVariable("GIT_VERSION_UNSET_TEST_VAR", null);
68+
var propertyObject = new { };
69+
var target = "{env:GIT_VERSION_UNSET_TEST_VAR ?? fallback}";
70+
var expected = "fallback";
71+
var actual = target.FormatWith(propertyObject);
72+
Assert.AreEqual(expected, actual);
73+
}
74+
75+
[Test]
76+
public void FormatWith_MultipleEnvVars()
77+
{
78+
Environment.SetEnvironmentVariable("GIT_VERSION_TEST_VAR_1", "Val-1");
79+
Environment.SetEnvironmentVariable("GIT_VERSION_TEST_VAR_2", "Val-2");
80+
var propertyObject = new { };
81+
var target = "{env:GIT_VERSION_TEST_VAR_1} and {env:GIT_VERSION_TEST_VAR_2}";
82+
var expected = "Val-1 and Val-2";
83+
var actual = target.FormatWith(propertyObject);
84+
Assert.AreEqual(expected, actual);
85+
}
86+
87+
[Test]
88+
public void FormatWith_MultipleEnvChars()
89+
{
90+
var propertyObject = new { };
91+
//Test the greediness of the regex in matching env: char
92+
var target = "{env:env:GIT_VERSION_TEST_VAR_1} and {env:DUMMY_VAR ?? fallback}";
93+
var expected = "{env:env:GIT_VERSION_TEST_VAR_1} and fallback";
94+
var actual = target.FormatWith(propertyObject);
95+
Assert.AreEqual(expected, actual);
96+
}
97+
98+
[Test]
99+
public void FormatWith_MultipleFallbackChars()
100+
{
101+
var propertyObject = new { };
102+
//Test the greediness of the regex in matching env: and ?? chars
103+
var target = "{env:env:GIT_VERSION_TEST_VAR_1} and {env:DUMMY_VAR ??? fallback}";
104+
var actual = target.FormatWith(propertyObject);
105+
Assert.AreEqual(target, actual);
106+
}
107+
108+
[Test]
109+
public void FormatWith_SingleFallbackChar()
110+
{
111+
Environment.SetEnvironmentVariable("DUMMY_ENV_VAR", "Dummy-Val");
112+
var propertyObject = new { };
113+
//Test the sanity of the regex when there is a grammar mismatch
114+
var target = "{en:DUMMY_ENV_VAR} and {env:DUMMY_ENV_VAR??fallback}";
115+
var actual = target.FormatWith(propertyObject);
116+
Assert.AreEqual(target, actual);
117+
}
118+
119+
[Test]
120+
public void FormatWIth_NullPropagationWithMultipleSpaces()
121+
{
122+
var propertyObject = new { SomeProperty = "Some Value" };
123+
var target = "{SomeProperty} and {env:DUMMY_ENV_VAR ?? fallback}";
124+
var expected = "Some Value and fallback";
125+
var actual = target.FormatWith(propertyObject);
126+
Assert.AreEqual(expected, actual);
127+
}
128+
}
129+
}

src/GitVersionCore.Tests/TestEffectiveConfiguration.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public class TestEffectiveConfiguration : EffectiveConfiguration
1010
public TestEffectiveConfiguration(
1111
AssemblyVersioningScheme assemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatch,
1212
AssemblyFileVersioningScheme assemblyFileVersioningScheme = AssemblyFileVersioningScheme.MajorMinorPatch,
13+
string assemblyVersioningFormat = null,
14+
string assemblyFileVersioningFormat = null,
1315
string assemblyInformationalFormat = null,
1416
VersioningMode versioningMode = VersioningMode.ContinuousDelivery,
1517
string gitTagPrefix = "v",
@@ -32,7 +34,7 @@ public TestEffectiveConfiguration(
3234
bool tracksReleaseBranches = false,
3335
bool isRelease = false,
3436
string commitDateFormat = "yyyy-MM-dd") :
35-
base(assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch,
37+
base(assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch,
3638
branchPrefixToTrim, preventIncrementForMergedBranchVersion, tagNumberPattern, continuousDeploymentFallbackTag,
3739
trackMergeTarget,
3840
majorMessage, minorMessage, patchMessage, noBumpMessage,

src/GitVersionCore/Configuration/Config.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ public Config()
2626
[YamlMember(Alias = "assembly-informational-format")]
2727
public string AssemblyInformationalFormat { get; set; }
2828

29+
[YamlMember(Alias = "assembly-versioning-format")]
30+
public string AssemblyVersioningFormat { get; set; }
31+
32+
[YamlMember(Alias = "assembly-file-versioning-format")]
33+
public string AssemblyFileVersioningFormat { get; set; }
34+
2935
[YamlMember(Alias = "mode")]
3036
public VersioningMode? VersioningMode { get; set; }
3137

src/GitVersionCore/Configuration/ConfigurationProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ public static void ApplyDefaultsTo(Config config)
8888
config.AssemblyVersioningScheme = config.AssemblyVersioningScheme ?? AssemblyVersioningScheme.MajorMinorPatch;
8989
config.AssemblyFileVersioningScheme = config.AssemblyFileVersioningScheme ?? AssemblyFileVersioningScheme.MajorMinorPatch;
9090
config.AssemblyInformationalFormat = config.AssemblyInformationalFormat;
91+
config.AssemblyVersioningFormat = config.AssemblyVersioningFormat;
92+
config.AssemblyFileVersioningFormat = config.AssemblyFileVersioningFormat;
9193
config.TagPrefix = config.TagPrefix ?? DefaultTagPrefix;
9294
config.VersioningMode = config.VersioningMode ?? VersioningMode.ContinuousDelivery;
9395
config.ContinuousDeploymentFallbackTag = config.ContinuousDeploymentFallbackTag ?? "ci";

src/GitVersionCore/EffectiveConfiguration.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ public EffectiveConfiguration(
1212
AssemblyVersioningScheme assemblyVersioningScheme,
1313
AssemblyFileVersioningScheme assemblyFileVersioningScheme,
1414
string assemblyInformationalFormat,
15+
string assemblyVersioningFormat,
16+
string assemblyFileVersioningFormat,
1517
VersioningMode versioningMode, string gitTagPrefix,
1618
string tag, string nextVersion, IncrementStrategy increment,
1719
string branchPrefixToTrim,
@@ -35,6 +37,8 @@ public EffectiveConfiguration(
3537
AssemblyVersioningScheme = assemblyVersioningScheme;
3638
AssemblyFileVersioningScheme = assemblyFileVersioningScheme;
3739
AssemblyInformationalFormat = assemblyInformationalFormat;
40+
AssemblyVersioningFormat = assemblyVersioningFormat;
41+
AssemblyFileVersioningFormat = assemblyFileVersioningFormat;
3842
VersioningMode = versioningMode;
3943
GitTagPrefix = gitTagPrefix;
4044
Tag = tag;
@@ -67,6 +71,8 @@ public EffectiveConfiguration(
6771
public AssemblyVersioningScheme AssemblyVersioningScheme { get; private set; }
6872
public AssemblyFileVersioningScheme AssemblyFileVersioningScheme { get; private set; }
6973
public string AssemblyInformationalFormat { get; private set; }
74+
public string AssemblyVersioningFormat { get; private set; }
75+
public string AssemblyFileVersioningFormat { get; private set; }
7076

7177
/// <summary>
7278
/// Git tag prefix

src/GitVersionCore/GitVersionContext.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ void CalculateEffectiveConfiguration()
122122
var assemblyVersioningScheme = FullConfiguration.AssemblyVersioningScheme.Value;
123123
var assemblyFileVersioningScheme = FullConfiguration.AssemblyFileVersioningScheme.Value;
124124
var assemblyInformationalFormat = FullConfiguration.AssemblyInformationalFormat;
125+
var assemblyVersioningFormat = FullConfiguration.AssemblyVersioningFormat;
126+
var assemblyFileVersioningFormat = FullConfiguration.AssemblyFileVersioningFormat;
125127
var gitTagPrefix = FullConfiguration.TagPrefix;
126128
var majorMessage = FullConfiguration.MajorVersionBumpMessage;
127129
var minorMessage = FullConfiguration.MinorVersionBumpMessage;
@@ -132,7 +134,7 @@ void CalculateEffectiveConfiguration()
132134
var commitMessageVersionBump = currentBranchConfig.CommitMessageIncrementing ?? FullConfiguration.CommitMessageIncrementing.Value;
133135

134136
Configuration = new EffectiveConfiguration(
135-
assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, versioningMode, gitTagPrefix,
137+
assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix,
136138
tag, nextVersion, incrementStrategy,
137139
currentBranchConfig.Regex,
138140
preventIncrementForMergedBranchVersion,

src/GitVersionCore/GitVersionCore.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
<Compile Include="GitVersionException.cs" />
122122
<Compile Include="GitVersionInformationResources\GitVersionInformationGenerator.cs" />
123123
<Compile Include="Helpers\EncodingHelper.cs" />
124+
<Compile Include="Helpers\EnvironmentHelper.cs" />
124125
<Compile Include="Helpers\FileSystem.cs" />
125126
<Compile Include="Helpers\IFileSystem.cs" />
126127
<Compile Include="Helpers\IThreadSleep.cs" />
@@ -232,4 +233,4 @@
232233
</Target>
233234
<Import Project="..\packages\PepitaPackage.1.21.4\build\PepitaPackage.targets" Condition="Exists('..\packages\PepitaPackage.1.21.4\build\PepitaPackage.targets')" />
234235
<Import Project="..\packages\Fody.2.0.8\build\portable-net+sl+win+wpa+wp\Fody.targets" Condition="Exists('..\packages\Fody.2.0.8\build\portable-net+sl+win+wpa+wp\Fody.targets')" />
235-
</Project>
236+
</Project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
3+
namespace GitVersion.Helpers
4+
{
5+
public class EnvironmentHelper
6+
{
7+
public static string GetEnvironmentVariableForProcess(string envVar)
8+
{
9+
return Environment.GetEnvironmentVariable(envVar, EnvironmentVariableTarget.Process);
10+
}
11+
}
12+
}

src/GitVersionCore/OutputVariables/VariableProvider.cs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,14 @@ public static VersionVariables GetVariablesFor(SemanticVersion semanticVersion,
4343

4444
var semverFormatValues = new SemanticVersionFormatValues(semanticVersion, config);
4545

46-
string informationalVersion;
46+
string informationalVersion = CheckAndFormatString(config.AssemblyInformationalFormat, semverFormatValues,
47+
semverFormatValues.DefaultInformationalVersion, "AssemblyInformationalVersion");
4748

48-
if (string.IsNullOrEmpty(config.AssemblyInformationalFormat))
49-
{
50-
informationalVersion = semverFormatValues.DefaultInformationalVersion;
51-
}
52-
else
53-
{
54-
try
55-
{
56-
informationalVersion = config.AssemblyInformationalFormat.FormatWith<SemanticVersionFormatValues>(semverFormatValues);
57-
}
58-
catch (ArgumentException formex)
59-
{
60-
throw new WarningException(string.Format("Unable to format AssemblyInformationalVersion. Check your format string: {0}", formex.Message));
61-
}
62-
}
49+
string assemblyFileSemVer = CheckAndFormatString(config.AssemblyFileVersioningFormat, semverFormatValues,
50+
semverFormatValues.AssemblyFileSemVer, "AssemblyFileVersioningFormat");
51+
52+
string assemblySemVer = CheckAndFormatString(config.AssemblyVersioningFormat, semverFormatValues,
53+
semverFormatValues.AssemblySemVer, "AssemblyVersioningFormat");
6354

6455
var variables = new VersionVariables(
6556
semverFormatValues.Major,
@@ -75,8 +66,8 @@ public static VersionVariables GetVariablesFor(SemanticVersion semanticVersion,
7566
semverFormatValues.LegacySemVer,
7667
semverFormatValues.LegacySemVerPadded,
7768
semverFormatValues.FullSemVer,
78-
semverFormatValues.AssemblySemVer,
79-
semverFormatValues.AssemblyFileSemVer,
69+
assemblySemVer,
70+
assemblyFileSemVer,
8071
semverFormatValues.PreReleaseTag,
8172
semverFormatValues.PreReleaseTagWithDash,
8273
semverFormatValues.PreReleaseLabel,
@@ -100,5 +91,28 @@ static void PromoteNumberOfCommitsToTagNumber(SemanticVersion semanticVersion)
10091
semanticVersion.BuildMetaData.CommitsSinceVersionSource = semanticVersion.BuildMetaData.CommitsSinceTag ?? 0;
10192
semanticVersion.BuildMetaData.CommitsSinceTag = null;
10293
}
94+
95+
static string CheckAndFormatString<T>(string formatString, T source, string defaultValue, string formatVarName)
96+
{
97+
string formattedString;
98+
99+
if (string.IsNullOrEmpty(formatString))
100+
{
101+
formattedString = defaultValue;
102+
}
103+
else
104+
{
105+
try
106+
{
107+
formattedString = formatString.FormatWith(source);
108+
}
109+
catch (ArgumentException formex)
110+
{
111+
throw new WarningException(string.Format("Unable to format {0}. Check your format string: {1}", formatVarName, formex.Message));
112+
}
113+
}
114+
115+
return formattedString;
116+
}
103117
}
104118
}

0 commit comments

Comments
 (0)