diff --git a/docs/input/docs/configuration.md b/docs/input/docs/configuration.md index 134c92045e..f2a8da43e3 100644 --- a/docs/input/docs/configuration.md +++ b/docs/input/docs/configuration.md @@ -42,6 +42,7 @@ next-version: 1.0 assembly-versioning-scheme: MajorMinorPatch assembly-file-versioning-scheme: MajorMinorPatchTag assembly-informational-format: '{InformationalVersion}' +assembly-informational-is-semver: true mode: ContinuousDelivery increment: Inherit continuous-delivery-fallback-tag: ci @@ -116,6 +117,13 @@ Specifies the format of `AssemblyInformationalVersion`. Follows the same formatting semantics as `assembly-file-versioning-format`. The default value is `{InformationalVersion}`. +### assembly-informational-is-semver + +Controls whether `assembly-file-versioning-format` should follow semantic version allowed char-set or not. +If set to `true` it will replace any special characters by a dash `-`. +If set to `false` it will allow any special characters (unicode characters, spaces and symbols like `#@!?[]()$=-`). +The default value is `true`. + ### mode Sets the `mode` of how GitVersion should create a new version. Read more at diff --git a/src/GitVersionCore.Tests/Configuration/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt b/src/GitVersionCore.Tests/Configuration/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt index b7a78223f8..5b7009ee08 100644 --- a/src/GitVersionCore.Tests/Configuration/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt +++ b/src/GitVersionCore.Tests/Configuration/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt @@ -1,5 +1,6 @@ assembly-versioning-scheme: MajorMinorPatch assembly-file-versioning-scheme: MajorMinorPatch +assembly-informational-is-semver: true mode: ContinuousDelivery tag-prefix: '[vV]' continuous-delivery-fallback-tag: ci diff --git a/src/GitVersionCore.Tests/Helpers/TestEffectiveConfiguration.cs b/src/GitVersionCore.Tests/Helpers/TestEffectiveConfiguration.cs index bbc0685ecf..b98f20d6ce 100644 --- a/src/GitVersionCore.Tests/Helpers/TestEffectiveConfiguration.cs +++ b/src/GitVersionCore.Tests/Helpers/TestEffectiveConfiguration.cs @@ -36,8 +36,10 @@ public TestEffectiveConfiguration( bool tracksReleaseBranches = false, bool isRelease = false, string commitDateFormat = "yyyy-MM-dd", - bool updateBuildNumber = false) : - base(assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch, + bool updateBuildNumber = false, + bool assemblyInformationalIsSemver = true + ) : + base(assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyInformationalIsSemver, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch, branchPrefixToTrim, preventIncrementForMergedBranchVersion, tagNumberPattern, continuousDeploymentFallbackTag, trackMergeTarget, majorMessage, minorMessage, patchMessage, noBumpMessage, diff --git a/src/GitVersionCore.Tests/Model/CommitDateTests.cs b/src/GitVersionCore.Tests/Model/CommitDateTests.cs index a787843f1d..84ae9c7e78 100644 --- a/src/GitVersionCore.Tests/Model/CommitDateTests.cs +++ b/src/GitVersionCore.Tests/Model/CommitDateTests.cs @@ -28,7 +28,7 @@ public void CommitDateFormatTest(string format, string expectedOutcome) }, new EffectiveConfiguration( - AssemblyVersioningScheme.MajorMinorPatch, AssemblyFileVersioningScheme.MajorMinorPatch, "", "", "", VersioningMode.ContinuousDelivery, "", "", "", IncrementStrategy.Inherit, + AssemblyVersioningScheme.MajorMinorPatch, AssemblyFileVersioningScheme.MajorMinorPatch, "", true, "", "", VersioningMode.ContinuousDelivery, "", "", "", IncrementStrategy.Inherit, "", true, "", "", false, "", "", "", "", CommitMessageIncrementMode.Enabled, 4, 4, 4, Enumerable.Empty(), false, true, format, false, 0, 0) ); diff --git a/src/GitVersionCore.Tests/VersionCalculation/VariableProviderTests.cs b/src/GitVersionCore.Tests/VersionCalculation/VariableProviderTests.cs index 3f3e92c570..a58a9dda4c 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/VariableProviderTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/VariableProviderTests.cs @@ -306,5 +306,20 @@ public void ProvidesVariablesInContinuousDeliveryModeForFeatureBranchWithCustomA vars.ToString().ShouldMatchApproved(c => c.SubFolder("Approved")); } + + [Test] + public void ProvidesVariableshWithCustomAssemblyInfoFormatSupportingAnySpecialCharcter() + { + var semVer = new SemanticVersion(); + var textWithSpecialCharacters = @"+ -=#![]^&@$%:<>/\-çñáÁ统"; + var config = new TestEffectiveConfiguration( + assemblyInformationalFormat: $"Special characters: {textWithSpecialCharacters}", + assemblyInformationalIsSemver: false + ); + + var vars = variableProvider.GetVariablesFor(semVer, config, false); + + vars.InformationalVersion.ShouldContain(textWithSpecialCharacters); + } } } diff --git a/src/GitVersionCore/Configuration/ConfigExtensions.cs b/src/GitVersionCore/Configuration/ConfigExtensions.cs index 987795e27d..090b5d36e7 100644 --- a/src/GitVersionCore/Configuration/ConfigExtensions.cs +++ b/src/GitVersionCore/Configuration/ConfigExtensions.cs @@ -84,6 +84,7 @@ public static EffectiveConfiguration CalculateEffectiveConfiguration(this Config var assemblyVersioningScheme = configuration.AssemblyVersioningScheme.Value; var assemblyFileVersioningScheme = configuration.AssemblyFileVersioningScheme.Value; var assemblyInformationalFormat = configuration.AssemblyInformationalFormat; + var assemblyInformationalIsSemver = configuration.AssemblyInformationalIsSemVer; var assemblyVersioningFormat = configuration.AssemblyVersioningFormat; var assemblyFileVersioningFormat = configuration.AssemblyFileVersioningFormat; var gitTagPrefix = configuration.TagPrefix; @@ -97,7 +98,9 @@ public static EffectiveConfiguration CalculateEffectiveConfiguration(this Config var commitMessageVersionBump = currentBranchConfig.CommitMessageIncrementing ?? configuration.CommitMessageIncrementing.Value; return new EffectiveConfiguration( - assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, + assemblyVersioningScheme, assemblyFileVersioningScheme, + assemblyInformationalFormat, assemblyInformationalIsSemver, + assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, tag, nextVersion, incrementStrategy, currentBranchConfig.Regex, preventIncrementForMergedBranchVersion, diff --git a/src/GitVersionCore/Configuration/ConfigurationBuilder.cs b/src/GitVersionCore/Configuration/ConfigurationBuilder.cs index 0e8d5ffbda..735dda6bbe 100644 --- a/src/GitVersionCore/Configuration/ConfigurationBuilder.cs +++ b/src/GitVersionCore/Configuration/ConfigurationBuilder.cs @@ -184,7 +184,8 @@ private static Config CreateDefaultConfiguration() CommitsSinceVersionSourcePadding = 4, CommitDateFormat = "yyyy-MM-dd", UpdateBuildNumber = true, - TagPreReleaseWeight = DefaultTagPreReleaseWeight + TagPreReleaseWeight = DefaultTagPreReleaseWeight, + AssemblyInformationalIsSemVer = true }; AddBranchConfig(Config.DevelopBranchKey, diff --git a/src/GitVersionCore/Model/Configuration/Config.cs b/src/GitVersionCore/Model/Configuration/Config.cs index ea8c333143..b4a799b9fd 100644 --- a/src/GitVersionCore/Model/Configuration/Config.cs +++ b/src/GitVersionCore/Model/Configuration/Config.cs @@ -28,10 +28,13 @@ public Config() [YamlMember(Alias = "assembly-informational-format")] public string AssemblyInformationalFormat { get; set; } + + [YamlMember(Alias = "assembly-informational-is-semver")] + public bool AssemblyInformationalIsSemVer { get; set; } [YamlMember(Alias = "assembly-versioning-format")] public string AssemblyVersioningFormat { get; set; } - + [YamlMember(Alias = "assembly-file-versioning-format")] public string AssemblyFileVersioningFormat { get; set; } diff --git a/src/GitVersionCore/Model/Configuration/EffectiveConfiguration.cs b/src/GitVersionCore/Model/Configuration/EffectiveConfiguration.cs index 9c50c050d9..41196eb039 100644 --- a/src/GitVersionCore/Model/Configuration/EffectiveConfiguration.cs +++ b/src/GitVersionCore/Model/Configuration/EffectiveConfiguration.cs @@ -13,6 +13,7 @@ public EffectiveConfiguration( AssemblyVersioningScheme assemblyVersioningScheme, AssemblyFileVersioningScheme assemblyFileVersioningScheme, string assemblyInformationalFormat, + bool assemblyInformationalIsSemver, string assemblyVersioningFormat, string assemblyFileVersioningFormat, VersioningMode versioningMode, string gitTagPrefix, @@ -36,11 +37,13 @@ public EffectiveConfiguration( string commitDateFormat, bool updateBuildNumber, int preReleaseWeight, - int tagPreReleaseWeight) + int tagPreReleaseWeight + ) { AssemblyVersioningScheme = assemblyVersioningScheme; AssemblyFileVersioningScheme = assemblyFileVersioningScheme; AssemblyInformationalFormat = assemblyInformationalFormat; + AssemblyInformationalIsSemver = assemblyInformationalIsSemver; AssemblyVersioningFormat = assemblyVersioningFormat; AssemblyFileVersioningFormat = assemblyFileVersioningFormat; VersioningMode = versioningMode; @@ -78,6 +81,7 @@ public EffectiveConfiguration( public AssemblyVersioningScheme AssemblyVersioningScheme { get; private set; } public AssemblyFileVersioningScheme AssemblyFileVersioningScheme { get; private set; } public string AssemblyInformationalFormat { get; private set; } + public bool AssemblyInformationalIsSemver { get; private set; } public string AssemblyVersioningFormat { get; private set; } public string AssemblyFileVersioningFormat { get; private set; } diff --git a/src/GitVersionCore/VersionCalculation/VariableProvider.cs b/src/GitVersionCore/VersionCalculation/VariableProvider.cs index 2a21305219..7445da55ca 100644 --- a/src/GitVersionCore/VersionCalculation/VariableProvider.cs +++ b/src/GitVersionCore/VersionCalculation/VariableProvider.cs @@ -56,7 +56,8 @@ public VersionVariables GetVariablesFor(SemanticVersion semanticVersion, Effecti var semverFormatValues = new SemanticVersionFormatValues(semanticVersion, config); - var informationalVersion = CheckAndFormatString(config.AssemblyInformationalFormat, semverFormatValues, semverFormatValues.InformationalVersion, "AssemblyInformationalVersion"); + var informationalVersion = CheckAndFormatString(config.AssemblyInformationalFormat, semverFormatValues, semverFormatValues.InformationalVersion, "AssemblyInformationalVersion", + replaceSpecialChars: config.AssemblyInformationalIsSemver); var assemblyFileSemVer = CheckAndFormatString(config.AssemblyFileVersioningFormat, semverFormatValues, semverFormatValues.AssemblyFileSemVer, "AssemblyFileVersioningFormat"); @@ -123,7 +124,7 @@ private static void PromoteNumberOfCommitsToTagNumber(SemanticVersion semanticVe } } - private string CheckAndFormatString(string formatString, T source, string defaultValue, string formatVarName) + private string CheckAndFormatString(string formatString, T source, string defaultValue, string formatVarName, bool replaceSpecialChars = true) { string formattedString; @@ -137,7 +138,10 @@ private string CheckAndFormatString(string formatString, T source, string def try { - formattedString = formatString.FormatWith(source, environment).RegexReplace("[^0-9A-Za-z-.+]", "-"); + formattedString = formatString.FormatWith(source, environment); + if (replaceSpecialChars) { + formattedString = formattedString.RegexReplace("[^0-9A-Za-z-.+]", "-"); + } } catch (ArgumentException formex) {