diff --git a/docs/configuration.md b/docs/configuration.md index f96b6ea4ee..804aa05404 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -45,9 +45,12 @@ build-metadata-padding: 4 commits-since-version-source-padding: 4 commit-message-incrementing: Enabled commit-date-format: 'yyyy-MM-dd' +merge-message-version: Enabled + ignore: sha: [] commits-before: yyyy-MM-ddTHH:mm:ss + merge-message: '' ``` And the description of the available options are: @@ -153,6 +156,10 @@ details on the syntax. Default set to `Enabled`; set to `Disabled` to disable. ### commit-date-format Sets the format which will be used to format the `CommitDate` output variable. +#### merge-message-version +This configuration can be used to disable merge message version detection, where the version +is infered from the commit message. + ### ignore The header for ignore configuration. @@ -179,6 +186,10 @@ Date and time in the format `yyyy-MM-ddTHH:mm:ss` (eg `commits-before: 2015-10-23T12:23:15`) to setup an exclusion range. Effectively any commit before `commits-before` will be ignored. +#### merge-message +The regex to match commit messages that will be ignored. Useful to exclude for example +pull request from an automatic nuget updater. + ## Branch configuration Then we have branch specific configuration, which looks something like this: diff --git a/src/GitVersionCore.Tests/CommitDateTests.cs b/src/GitVersionCore.Tests/CommitDateTests.cs index 541b362903..faceca4ef3 100644 --- a/src/GitVersionCore.Tests/CommitDateTests.cs +++ b/src/GitVersionCore.Tests/CommitDateTests.cs @@ -1,4 +1,6 @@ using System; +using System.Collections; +using System.Collections.Generic; using System.Linq; using GitVersion; using GitVersion.VersionFilters; @@ -26,7 +28,7 @@ public void CommitDateFormatTest(string format, string expectedOutcome) }, new EffectiveConfiguration( AssemblyVersioningScheme.MajorMinorPatch, AssemblyFileVersioningScheme.MajorMinorPatch, "", "", "", VersioningMode.ContinuousDelivery, "", "", "", IncrementStrategy.Inherit, - "", true, "", "", false, "", "", "", "", CommitMessageIncrementMode.Enabled, 4, 4, 4, Enumerable.Empty(), false, true, format) + "", true, "", "", false, "", "", "", "", CommitMessageIncrementMode.Enabled, 4, 4, 4, Enumerable.Empty(), false, true, format, true) ); Assert.That(formatValues.CommitDate, Is.EqualTo(expectedOutcome)); diff --git a/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt b/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt index 7d0d4f02a6..65e454fcef 100644 --- a/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt +++ b/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt @@ -11,6 +11,7 @@ legacy-semver-padding: 4 build-metadata-padding: 4 commits-since-version-source-padding: 4 commit-message-incrementing: Enabled +merge-message-version: Enabled branches: develop: mode: ContinuousDeployment diff --git a/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs b/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs index 876de76ac1..0f77943375 100644 --- a/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs +++ b/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs @@ -33,15 +33,16 @@ public TestEffectiveConfiguration( IEnumerable versionFilters = null, bool tracksReleaseBranches = false, bool isRelease = false, - string commitDateFormat = "yyyy-MM-dd") : + string commitDateFormat = "yyyy-MM-dd", + bool mergeMessageVersion = true) : base(assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch, branchPrefixToTrim, preventIncrementForMergedBranchVersion, tagNumberPattern, continuousDeploymentFallbackTag, trackMergeTarget, majorMessage, minorMessage, patchMessage, noBumpMessage, commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding, versionFilters ?? Enumerable.Empty(), - tracksReleaseBranches, isRelease, commitDateFormat) + tracksReleaseBranches, isRelease, commitDateFormat, mergeMessageVersion) { } } -} \ No newline at end of file +} diff --git a/src/GitVersionCore/Configuration/BranchConfig.cs b/src/GitVersionCore/Configuration/BranchConfig.cs index c0e717adae..12ec932922 100644 --- a/src/GitVersionCore/Configuration/BranchConfig.cs +++ b/src/GitVersionCore/Configuration/BranchConfig.cs @@ -1,4 +1,4 @@ -namespace GitVersion +namespace GitVersion { using System.Collections.Generic; using YamlDotNet.Serialization; @@ -54,8 +54,8 @@ public BranchConfig(BranchConfig branchConfiguration) [YamlMember(Alias = "commit-message-incrementing")] public CommitMessageIncrementMode? CommitMessageIncrementing { get; set; } - [YamlMember(Alias = "regex")] - public string Regex { get; set; } + [YamlMember(Alias = "merge-message")] + public string MergeMessage { get; set; } [YamlMember(Alias = "source-branches")] public List SourceBranches { get; set; } diff --git a/src/GitVersionCore/Configuration/Config.cs b/src/GitVersionCore/Configuration/Config.cs index ab2ac963b2..e85a6e7f4d 100644 --- a/src/GitVersionCore/Configuration/Config.cs +++ b/src/GitVersionCore/Configuration/Config.cs @@ -78,6 +78,9 @@ public string NextVersion [YamlMember(Alias = "commit-message-incrementing")] public CommitMessageIncrementMode? CommitMessageIncrementing { get; set; } + [YamlMember(Alias = "merge-message-version")] + public bool? MergeMessageVersion { get; set; } + [YamlMember(Alias = "branches")] public Dictionary Branches { diff --git a/src/GitVersionCore/Configuration/ConfigurationProvider.cs b/src/GitVersionCore/Configuration/ConfigurationProvider.cs index 74d586a538..9d6136fff1 100644 --- a/src/GitVersionCore/Configuration/ConfigurationProvider.cs +++ b/src/GitVersionCore/Configuration/ConfigurationProvider.cs @@ -101,6 +101,7 @@ public static void ApplyDefaultsTo(Config config) config.BuildMetaDataPadding = config.BuildMetaDataPadding ?? 4; config.CommitsSinceVersionSourcePadding = config.CommitsSinceVersionSourcePadding ?? 4; config.CommitDateFormat = config.CommitDateFormat ?? "yyyy-MM-dd"; + config.MergeMessageVersion = config.MergeMessageVersion ?? true; var configBranches = config.Branches.ToList(); diff --git a/src/GitVersionCore/Configuration/IgnoreConfig.cs b/src/GitVersionCore/Configuration/IgnoreConfig.cs index df4d45fa17..3779de05d1 100644 --- a/src/GitVersionCore/Configuration/IgnoreConfig.cs +++ b/src/GitVersionCore/Configuration/IgnoreConfig.cs @@ -1,4 +1,4 @@ -namespace GitVersion +namespace GitVersion { using System; using System.Collections.Generic; @@ -19,10 +19,14 @@ public IgnoreConfig() [YamlMember(Alias = "sha")] public IEnumerable SHAs { get; set; } + [YamlMember(Alias = "merge-message")] + public string MergeMessage { get; set; } + public virtual IEnumerable ToFilters() { if (SHAs.Any()) yield return new ShaVersionFilter(SHAs); if (Before.HasValue) yield return new MinDateVersionFilter(Before.Value); + if (!string.IsNullOrWhiteSpace(MergeMessage)) yield return new MessageFilter(MergeMessage); } } -} \ No newline at end of file +} diff --git a/src/GitVersionCore/EffectiveConfiguration.cs b/src/GitVersionCore/EffectiveConfiguration.cs index abf2cd9aec..1b703b605e 100644 --- a/src/GitVersionCore/EffectiveConfiguration.cs +++ b/src/GitVersionCore/EffectiveConfiguration.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using GitVersion.VersionFilters; namespace GitVersion @@ -32,7 +32,8 @@ public EffectiveConfiguration( IEnumerable versionFilters, bool tracksReleaseBranches, bool isCurrentBranchRelease, - string commitDateFormat) + string commitDateFormat, + bool mergeMessageVersion) { AssemblyVersioningScheme = assemblyVersioningScheme; AssemblyFileVersioningScheme = assemblyFileVersioningScheme; @@ -61,7 +62,8 @@ public EffectiveConfiguration( TracksReleaseBranches = tracksReleaseBranches; IsCurrentBranchRelease = isCurrentBranchRelease; CommitDateFormat = commitDateFormat; - } + MergeMessageVersion = mergeMessageVersion; + } public bool TracksReleaseBranches { get; private set; } public bool IsCurrentBranchRelease { get; private set; } @@ -115,5 +117,7 @@ public EffectiveConfiguration( public IEnumerable VersionFilters { get; private set; } public string CommitDateFormat { get; private set; } + + public bool MergeMessageVersion { get; private set; } } -} \ No newline at end of file +} diff --git a/src/GitVersionCore/GitVersionContext.cs b/src/GitVersionCore/GitVersionContext.cs index 4478d330b4..72370e3552 100644 --- a/src/GitVersionCore/GitVersionContext.cs +++ b/src/GitVersionCore/GitVersionContext.cs @@ -1,4 +1,4 @@ -namespace GitVersion +namespace GitVersion { using LibGit2Sharp; using System; @@ -110,6 +110,8 @@ void CalculateEffectiveConfiguration() throw new Exception("Configuration value for 'BuildMetaDataPadding' has no value. (this should not happen, please report an issue)"); if (!FullConfiguration.CommitsSinceVersionSourcePadding.HasValue) throw new Exception("Configuration value for 'CommitsSinceVersionSourcePadding' has no value. (this should not happen, please report an issue)"); + if (!FullConfiguration.MergeMessageVersion.HasValue) + throw new Exception("Configuration value for 'MergeMessageVersion' has no value. (this should not happen, please report an issue)"); var versioningMode = currentBranchConfig.VersioningMode.Value; var tag = currentBranchConfig.Tag; @@ -130,7 +132,7 @@ void CalculateEffectiveConfiguration() var patchMessage = FullConfiguration.PatchVersionBumpMessage; var noBumpMessage = FullConfiguration.NoBumpMessage; var commitDateFormat = FullConfiguration.CommitDateFormat; - + var mergeMessageVersion = FullConfiguration.MergeMessageVersion.Value; var commitMessageVersionBump = currentBranchConfig.CommitMessageIncrementing ?? FullConfiguration.CommitMessageIncrementing.Value; Configuration = new EffectiveConfiguration( @@ -148,7 +150,8 @@ void CalculateEffectiveConfiguration() FullConfiguration.Ignore.ToFilters(), currentBranchConfig.TracksReleaseBranches.Value, currentBranchConfig.IsReleaseBranch.Value, - commitDateFormat); + commitDateFormat, + mergeMessageVersion); } private static Branch GetTargetBranch(IRepository repository, string targetBranch) diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs index dae854251b..48d24f13f1 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs @@ -14,6 +14,11 @@ public class MergeMessageBaseVersionStrategy : BaseVersionStrategy { public override IEnumerable GetVersions(GitVersionContext context) { + if (!context.Configuration.MergeMessageVersion) + { + return Enumerable.Empty(); + } + var commitsPriorToThan = context.CurrentBranch .CommitsPriorToThan(context.CurrentCommit.When()); var baseVersions = commitsPriorToThan diff --git a/src/GitVersionCore/VersionFilters/MessageFilter.cs b/src/GitVersionCore/VersionFilters/MessageFilter.cs new file mode 100644 index 0000000000..825eeebb1b --- /dev/null +++ b/src/GitVersionCore/VersionFilters/MessageFilter.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using GitVersion.VersionCalculation.BaseVersionCalculators; + +namespace GitVersion.VersionFilters +{ + public class MessageFilter : IVersionFilter + { + private readonly Regex regex; + + public MessageFilter(string regex) + { + if (regex == null) throw new ArgumentNullException(nameof(regex)); + this.regex = new Regex(regex); ; + } + + public bool Exclude(BaseVersion version, out string reason) + { + if (version == null) throw new ArgumentNullException(nameof(version)); + + reason = null; + + if (version.BaseVersionSource != null && + regex.Match(version.BaseVersionSource.Message).Success) + { + reason = $"Message {version.BaseVersionSource.Message} was ignored due to commit having been excluded by configuration"; + return true; + } + + return false; + } + } +} diff --git a/src/GitVersionExe.Tests/TestEffectiveConfiguration.cs b/src/GitVersionExe.Tests/TestEffectiveConfiguration.cs index 6b2d03ddfe..98a4d1e061 100644 --- a/src/GitVersionExe.Tests/TestEffectiveConfiguration.cs +++ b/src/GitVersionExe.Tests/TestEffectiveConfiguration.cs @@ -33,16 +33,17 @@ public TestEffectiveConfiguration( IEnumerable versionFilters = null, bool tracksReleaseBranches = false, bool isRelease = false, - string commitDateFormat = "yyyy-MM-dd") : + string commitDateFormat = "yyyy-MM-dd", + bool mergeMessageVersion = true) : base(assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch, branchPrefixToTrim, preventIncrementForMergedBranchVersion, tagNumberPattern, continuousDeploymentFallbackTag, trackMergeTarget, majorMessage, minorMessage, patchMessage, noBumpMessage, commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding, versionFilters ?? Enumerable.Empty(), - tracksReleaseBranches, isRelease, commitDateFormat) + tracksReleaseBranches, isRelease, commitDateFormat, mergeMessageVersion) { } } -} \ No newline at end of file +} diff --git a/src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs b/src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs index 876de76ac1..0f77943375 100644 --- a/src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs +++ b/src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs @@ -33,15 +33,16 @@ public TestEffectiveConfiguration( IEnumerable versionFilters = null, bool tracksReleaseBranches = false, bool isRelease = false, - string commitDateFormat = "yyyy-MM-dd") : + string commitDateFormat = "yyyy-MM-dd", + bool mergeMessageVersion = true) : base(assemblyVersioningScheme, assemblyFileVersioningScheme, assemblyInformationalFormat, assemblyVersioningFormat, assemblyFileVersioningFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch, branchPrefixToTrim, preventIncrementForMergedBranchVersion, tagNumberPattern, continuousDeploymentFallbackTag, trackMergeTarget, majorMessage, minorMessage, patchMessage, noBumpMessage, commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding, versionFilters ?? Enumerable.Empty(), - tracksReleaseBranches, isRelease, commitDateFormat) + tracksReleaseBranches, isRelease, commitDateFormat, mergeMessageVersion) { } } -} \ No newline at end of file +}