diff --git a/src/GitVersion.Configuration.Tests/Configuration/ConfigurationExtensionsTests.cs b/src/GitVersion.Configuration.Tests/Configuration/ConfigurationExtensionsTests.cs index 2c6b2fef35..e9998b1de5 100644 --- a/src/GitVersion.Configuration.Tests/Configuration/ConfigurationExtensionsTests.cs +++ b/src/GitVersion.Configuration.Tests/Configuration/ConfigurationExtensionsTests.cs @@ -143,4 +143,24 @@ public void EnsureGetBranchSpecificLabelThrowsWhenEnvVarMissing() Should.Throw(() => effectiveConfiguration.GetBranchSpecificLabel(ReferenceName.FromBranchName(BranchName), null, environment)); } + + [TestCase("case-00/my-branch", "case-00-my-branch")] + [TestCase("my-branch", "my-branch")] + [TestCase("my_branch/valid", "my-branch-valid")] + public void EnsureGetBranchSpecificLabelReturnsValidLabelForEnvironmentVariables(string variable, string expectedLabel) + { + var environment = new TestEnvironment(); + environment.SetEnvironmentVariable("GITHUB_HEAD_REF", variable); + + var configuration = GitFlowConfigurationBuilder.New + .WithoutBranches() + .WithBranch("feature/test-feature", builder => builder + .WithLabel("{env:GITHUB_HEAD_REF}") + .WithRegularExpression(@"^features?[\/-](?.+)")) + .Build(); + + var effectiveConfiguration = configuration.GetEffectiveConfiguration(ReferenceName.FromBranchName("feature/test-feature")); + var actual = effectiveConfiguration.GetBranchSpecificLabel(ReferenceName.FromBranchName("feature/test-feature"), null, environment); + actual.ShouldBe(expectedLabel); + } } diff --git a/src/GitVersion.Core/Core/RegexPatterns.cs b/src/GitVersion.Core/Core/RegexPatterns.cs index 79dc6da59f..f01b6e603e 100644 --- a/src/GitVersion.Core/Core/RegexPatterns.cs +++ b/src/GitVersion.Core/Core/RegexPatterns.cs @@ -34,6 +34,9 @@ internal static partial class RegexPatterns [StringSyntax(StringSyntaxAttribute.Regex, Options)] internal const string SanitizeNameRegexPattern = "[^a-zA-Z0-9-]"; + [StringSyntax(StringSyntaxAttribute.Regex, Options)] + internal const string SanitizeLabelRegexPattern = "[^a-zA-Z0-9-.]"; + #if NET9_0_OR_GREATER [GeneratedRegex(SwitchArgumentRegexPattern, Options)] public static partial Regex SwitchArgumentRegex { get; } diff --git a/src/GitVersion.Core/Extensions/ConfigurationExtensions.cs b/src/GitVersion.Core/Extensions/ConfigurationExtensions.cs index 97ffb4c88e..3f4ac9a428 100644 --- a/src/GitVersion.Core/Extensions/ConfigurationExtensions.cs +++ b/src/GitVersion.Core/Extensions/ConfigurationExtensions.cs @@ -133,7 +133,8 @@ private static bool ShouldBeIgnored(ICommit commit, IIgnoreConfiguration ignore) var effectiveBranchName = branchNameOverride ?? branchName; var labelPlaceholders = BuildLabelPlaceholders(configuration.RegularExpression, effectiveBranchName); - return label.FormatWith(labelPlaceholders, environment); + return label.FormatWith(labelPlaceholders, environment) + .RegexReplace(RegexPatterns.SanitizeLabelRegexPattern, "-"); } public TaggedSemanticVersions GetTaggedSemanticVersion()