Skip to content

Commit d93f470

Browse files
committed
Fix issue Montonically increasing AssemblyFileVersion to satisfy the MSI (#1366)
1 parent 6bf4319 commit d93f470

File tree

9 files changed

+85
-8
lines changed

9 files changed

+85
-8
lines changed

docs/configuration.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,16 @@ 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 `$`
78+
Example Syntax #1: `'{Major}.{Minor}.{Patch}.{$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}.{$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+
7484
### assembly-informational-format
7585
Set this to any of the available [variables](/more-info/variables) to change the
7686
value of the `AssemblyInformationalVersion` attribute. Default set to

src/GitVersionCore/Configuration/Config.cs

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

29+
[YamlMember(Alias = "assembly-file-versioning-format")]
30+
public string AssemblyFileVersioningFormat { get; set; }
31+
2932
[YamlMember(Alias = "mode")]
3033
public VersioningMode? VersioningMode { get; set; }
3134

src/GitVersionCore/Configuration/ConfigurationProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ 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.AssemblyFileVersioningFormat = config.AssemblyFileVersioningFormat;
9192
config.TagPrefix = config.TagPrefix ?? DefaultTagPrefix;
9293
config.VersioningMode = config.VersioningMode ?? VersioningMode.ContinuousDelivery;
9394
config.ContinuousDeploymentFallbackTag = config.ContinuousDeploymentFallbackTag ?? "ci";

src/GitVersionCore/EffectiveConfiguration.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public EffectiveConfiguration(
1212
AssemblyVersioningScheme assemblyVersioningScheme,
1313
AssemblyFileVersioningScheme assemblyFileVersioningScheme,
1414
string assemblyInformationalFormat,
15+
string assemblyFileVersioningFormat,
1516
VersioningMode versioningMode, string gitTagPrefix,
1617
string tag, string nextVersion, IncrementStrategy increment,
1718
string branchPrefixToTrim,
@@ -35,6 +36,7 @@ public EffectiveConfiguration(
3536
AssemblyVersioningScheme = assemblyVersioningScheme;
3637
AssemblyFileVersioningScheme = assemblyFileVersioningScheme;
3738
AssemblyInformationalFormat = assemblyInformationalFormat;
39+
AssemblyFileVersioningFormat = assemblyFileVersioningFormat;
3840
VersioningMode = versioningMode;
3941
GitTagPrefix = gitTagPrefix;
4042
Tag = tag;
@@ -67,6 +69,7 @@ public EffectiveConfiguration(
6769
public AssemblyVersioningScheme AssemblyVersioningScheme { get; private set; }
6870
public AssemblyFileVersioningScheme AssemblyFileVersioningScheme { get; private set; }
6971
public string AssemblyInformationalFormat { get; private set; }
72+
public string AssemblyFileVersioningFormat { get; private set; }
7073

7174
/// <summary>
7275
/// Git tag prefix

src/GitVersionCore/GitVersionContext.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ void CalculateEffectiveConfiguration()
122122
var assemblyVersioningScheme = FullConfiguration.AssemblyVersioningScheme.Value;
123123
var assemblyFileVersioningScheme = FullConfiguration.AssemblyFileVersioningScheme.Value;
124124
var assemblyInformationalFormat = FullConfiguration.AssemblyInformationalFormat;
125+
var assemblyFileVersioningFormat = FullConfiguration.AssemblyFileVersioningFormat;
125126
var gitTagPrefix = FullConfiguration.TagPrefix;
126127
var majorMessage = FullConfiguration.MajorVersionBumpMessage;
127128
var minorMessage = FullConfiguration.MinorVersionBumpMessage;
@@ -132,7 +133,7 @@ void CalculateEffectiveConfiguration()
132133
var commitMessageVersionBump = currentBranchConfig.CommitMessageIncrementing ?? FullConfiguration.CommitMessageIncrementing.Value;
133134

134135
Configuration = new EffectiveConfiguration(
135-
assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, versioningMode, gitTagPrefix,
136+
assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix,
136137
tag, nextVersion, incrementStrategy,
137138
currentBranchConfig.Regex,
138139
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: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,27 @@ public static VersionVariables GetVariablesFor(SemanticVersion semanticVersion,
6161
}
6262
}
6363

64+
string assemblyFileVersioningFormat;
65+
string assemblyFileSemVer;
66+
67+
if (!(string.IsNullOrEmpty(config.AssemblyFileVersioningFormat)))
68+
{
69+
//assembly-file-versioning-format value if provided in the config, overwrites the exisiting AssemblyFileSemVer
70+
try
71+
{
72+
assemblyFileVersioningFormat = config.AssemblyFileVersioningFormat.FormatWith<SemanticVersionFormatValues>(semverFormatValues);
73+
assemblyFileSemVer = assemblyFileVersioningFormat;
74+
}
75+
catch (ArgumentException formex)
76+
{
77+
throw new WarningException(string.Format("Unable to format AssemblyFileVersioningFormat. Check your format string: {0}", formex.Message));
78+
}
79+
}
80+
else
81+
{
82+
assemblyFileSemVer = semverFormatValues.AssemblyFileSemVer;
83+
}
84+
6485
var variables = new VersionVariables(
6586
semverFormatValues.Major,
6687
semverFormatValues.Minor,
@@ -76,7 +97,7 @@ public static VersionVariables GetVariablesFor(SemanticVersion semanticVersion,
7697
semverFormatValues.LegacySemVerPadded,
7798
semverFormatValues.FullSemVer,
7899
semverFormatValues.AssemblySemVer,
79-
semverFormatValues.AssemblyFileSemVer,
100+
assemblyFileSemVer,
80101
semverFormatValues.PreReleaseTag,
81102
semverFormatValues.PreReleaseTagWithDash,
82103
semverFormatValues.PreReleaseLabel,

src/GitVersionCore/StringFormatWith.cs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace GitVersion
88

99
static class StringFormatWithExtension
1010
{
11-
private static readonly Regex TokensRegex = new Regex(@"{\w+}", RegexOptions.Compiled);
11+
private static readonly Regex TokensRegex = new Regex(@"{\$??\w+(\?\?\w+)??}", RegexOptions.Compiled);
1212

1313
/// <summary>
1414
/// Formats a string template with the given source object.
@@ -30,13 +30,39 @@ public static string FormatWith<T>(this string template, T source)
3030
foreach (Match match in TokensRegex.Matches(template))
3131
{
3232
var memberAccessExpression = TrimBraces(match.Value);
33-
Func<object, string> expression = CompileDataBinder(objType, memberAccessExpression);
34-
string propertyValue = expression(source);
33+
string propertyValue = null;
34+
35+
// Support evaluation of environment variables in the format string
36+
// For example: {$JENKINS_BUILD_NUMBER??fall-back-string}
37+
if (memberAccessExpression.StartsWith("$"))
38+
{
39+
memberAccessExpression = memberAccessExpression.TrimStart('$').TrimEnd('$');
40+
string envVar = memberAccessExpression, fallback = null;
41+
string[] components = (memberAccessExpression.Contains("??")) ? memberAccessExpression.Split(new string[] { "??" }, StringSplitOptions.None) : null;
42+
if (components != null)
43+
{
44+
envVar = components[0];
45+
fallback = components[1];
46+
}
47+
48+
propertyValue = Helpers.EnvironmentHelper.GetEnvironmentVariableForProcess(envVar);
49+
if (propertyValue == null)
50+
{
51+
if (fallback != null)
52+
propertyValue = fallback;
53+
else
54+
throw new ArgumentException(string.Format("Environment variable {0} not found and no fallback string provided", envVar));
55+
}
56+
}
57+
else
58+
{
59+
Func<object, string> expression = CompileDataBinder(objType, memberAccessExpression);
60+
propertyValue = expression(source);
61+
}
3562
template = template.Replace(match.Value, propertyValue);
3663
}
3764

3865
return template;
39-
4066
}
4167

4268

@@ -73,6 +99,5 @@ static Func<object, string> CompileDataBinder(Type type, string expr)
7399

74100
return Expression.Lambda<Func<object, string>>(body, param).Compile();
75101
}
76-
77102
}
78103
}

0 commit comments

Comments
 (0)