Skip to content

Additional options for command-line switch /overrideconfig. #2524

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Apr 12, 2021
67 changes: 62 additions & 5 deletions docs/input/docs/usage/cli/arguments.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,66 @@ gitversion init Configuration utility for gitversion

## Override config

`/overrideconfig [key=value]` will override appropriate key from
`GitVersion.yml`.
`/overrideconfig [key=value]` will override appropriate `key` from 'GitVersion.yml'.

At the moment only `tag-prefix` option is supported. Read more about
[Configuration](/docs/reference/configuration). It will not change config file
`GitVersion.yml`.
To specify multiple options add multiple `/overrideconfig [key=value]` entries:
`/overrideconfig key1=value1 /overrideconfig key2=value2`.

To have **space characters** as a part of `value`, `value` has be enclosed with double quotes - `key="My value"`.

Double quote character inside of the double quoted `value` has to be be escaped with a backslash '\\' - `key="My \"escaped-quotes\""`.

Following options are supported:
1. `assembly-file-versioning-format`
1. `assembly-file-versioning-scheme`
1. `assembly-informational-format`
1. `assembly-versioning-format`
1. `assembly-versioning-scheme`
1. `build-metadata-padding`
1. `commit-date-format`
1. `commit-message-incrementing`
1. `commits-since-version-source-padding`
1. `continuous-delivery-fallback-tag`
1. `increment`
1. `legacy-semver-padding`
1. `major-version-bump-message`
1. `minor-version-bump-message`
1. `mode`
1. `next-version`
1. `no-bump-message`
1. `patch-version-bump-message`
1. `tag-prefix`
1. `tag-pre-release-weight`
1. `update-build-number`

Read more about [Configuration](/docs/reference/configuration).

Using `override-config` on the command line will not change the contents of the config file `GitVersion.yml`.

### Example: How to override configuration option 'tag-prefix' to use prefix 'custom'

`GitVersion.exe /output json /overrideconfig tag-prefix=custom`

### Example: How to override configuration option 'assembly-versioning-format'

`GitVersion.exe /output json /overrideconfig assembly-versioning-format="{Major}.{Minor}.{Patch}.{env:BUILD_NUMBER ?? 0}"`

Will pickup up environment variable `BUILD_NUMBER` or fallback to zero for assembly revision number.

### Example: How to override configuration option 'assembly-versioning-scheme'

`GitVersion.exe /output json /overrideconfig assembly-versioning-scheme=MajorMinor`

Will use only major and minor version numbers for assembly version. Assembly build and revision numbers will be 0 (e.g. `1.2.0.0`)

### Example: How to override multiple configuration options

`GitVersion.exe /output json /overrideconfig tag-prefix=custom /overrideconfig assembly-versioning-scheme=MajorMinor`

### Example: How to override configuration option 'update-build-number'

`GitVersion.exe /output json /overrideconfig update-build-number=true`

### Example: How to override configuration option 'next-version'

`GitVersion.exe /output json /overrideconfig next-version=6`
248 changes: 231 additions & 17 deletions src/GitVersion.App.Tests/ArgumentParserTests.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
using System.Collections.Generic;
using System.IO;
using GitTools.Testing;
using GitVersion.Core.Tests.Helpers;
using GitVersion.Extensions;
using GitVersion.Logging;
using GitVersion.Model;
using GitVersion.Core.Tests.Helpers;
using GitVersion.Model.Configuration;
using GitTools.Testing;
using Microsoft.Extensions.DependencyInjection;
using NUnit.Framework;
using Shouldly;
Expand Down Expand Up @@ -364,26 +367,237 @@ public void OverrideconfigWithNoOptions()
arguments.OverrideConfig.ShouldBeNull();
}

[Test]
public void OverrideconfigWithSingleTagprefixOption()
{
var arguments = argumentParser.ParseArguments("/overrideconfig tag-prefix=sample");
arguments.OverrideConfig.TagPrefix.ShouldBe("sample");
}

[TestCase("tag-prefix=sample;tag-prefix=other")]
[TestCase("tag-prefix=sample;param2=other")]
public void OverrideconfigWithSeveralOptions(string options)
[TestCaseSource(nameof(OverrideconfigWithInvalidOptionTestData))]
public string OverrideconfigWithInvalidOption(string options)
{
var exception = Assert.Throws<WarningException>(() => argumentParser.ParseArguments($"/overrideconfig {options}"));
exception.Message.ShouldContain("Can't specify multiple /overrideconfig options");
return exception.Message;
}

[TestCase("tag-prefix=sample=asdf")]
public void OverrideconfigWithInvalidOption(string options)
private static IEnumerable<TestCaseData> OverrideconfigWithInvalidOptionTestData()
{
var exception = Assert.Throws<WarningException>(() => argumentParser.ParseArguments($"/overrideconfig {options}"));
exception.Message.ShouldContain("Could not parse /overrideconfig option");
yield return new TestCaseData("tag-prefix=sample=asdf")
{
ExpectedResult = "Could not parse /overrideconfig option: tag-prefix=sample=asdf. Ensure it is in format 'key=value'."
};
yield return new TestCaseData("unknown-option=25")
{
ExpectedResult = "Could not parse /overrideconfig option: unknown-option=25. Unsuported 'key'."
};
yield return new TestCaseData("update-build-number=1")
{
ExpectedResult = "Could not parse /overrideconfig option: update-build-number=1. Ensure that 'value' is 'true' or 'false'."
};
yield return new TestCaseData("tag-pre-release-weight=invalid-value")
{
ExpectedResult = "Could not parse /overrideconfig option: tag-pre-release-weight=invalid-value. Ensure that 'value' is valid integer number."
};
yield return new TestCaseData("assembly-versioning-scheme=WrongEnumValue")
{
ExpectedResult = $"Could not parse /overrideconfig option: assembly-versioning-scheme=WrongEnumValue. Ensure that 'value' is valid for specified 'key' enumeration: {System.Environment.NewLine}" +
$"MajorMinorPatchTag{System.Environment.NewLine}" +
$"MajorMinorPatch{System.Environment.NewLine}" +
$"MajorMinor{System.Environment.NewLine}" +
$"Major{System.Environment.NewLine}" +
$"None{System.Environment.NewLine}"
};
}

[TestCaseSource(nameof(OverrideconfigWithSingleOptionTestData))]
public void OverrideconfigWithSingleOptions(string options, Config expected)
{
var arguments = argumentParser.ParseArguments($"/overrideconfig {options}");
arguments.OverrideConfig.ShouldBeEquivalentTo(expected);
}

private static IEnumerable<TestCaseData> OverrideconfigWithSingleOptionTestData()
{
yield return new TestCaseData(
"assembly-versioning-scheme=MajorMinor",
new Config
{
AssemblyVersioningScheme = AssemblyVersioningScheme.MajorMinor,
}
);
yield return new TestCaseData(
"assembly-file-versioning-scheme=\"MajorMinorPatch\"",
new Config
{
AssemblyFileVersioningScheme = AssemblyFileVersioningScheme.MajorMinorPatch,
}
);
yield return new TestCaseData(
"assembly-informational-format=\"{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}\"",
new Config
{
AssemblyInformationalFormat = "{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}",
}
);
yield return new TestCaseData(
"assembly-versioning-format=\"{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}\"",
new Config
{
AssemblyVersioningFormat = "{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}",
}
);
yield return new TestCaseData(
"assembly-file-versioning-format=\"{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}\"",
new Config
{
AssemblyFileVersioningFormat = "{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}",
}
);
yield return new TestCaseData(
"mode=ContinuousDelivery",
new Config
{
VersioningMode = GitVersion.VersionCalculation.VersioningMode.ContinuousDelivery
}
);
yield return new TestCaseData(
"tag-prefix=sample",
new Config
{
TagPrefix = "sample"
}
);
yield return new TestCaseData(
"continuous-delivery-fallback-tag=cd-tag",
new Config
{
ContinuousDeploymentFallbackTag = "cd-tag"
}
);
yield return new TestCaseData(
"next-version=1",
new Config
{
NextVersion = "1"
}
);
yield return new TestCaseData(
"major-version-bump-message=\"This is major version bump message.\"",
new Config
{
MajorVersionBumpMessage = "This is major version bump message."
}
);
yield return new TestCaseData(
"minor-version-bump-message=\"This is minor version bump message.\"",
new Config
{
MinorVersionBumpMessage = "This is minor version bump message."
}
);
yield return new TestCaseData(
"patch-version-bump-message=\"This is patch version bump message.\"",
new Config
{
PatchVersionBumpMessage = "This is patch version bump message."
}
);
yield return new TestCaseData(
"no-bump-message=\"This is no bump message.\"",
new Config
{
NoBumpMessage = "This is no bump message."
}
);
yield return new TestCaseData(
"legacy-semver-padding=99",
new Config
{
LegacySemVerPadding = 99
}
);
yield return new TestCaseData(
"build-metadata-padding=30",
new Config
{
BuildMetaDataPadding = 30
}
);
yield return new TestCaseData(
"commits-since-version-source-padding=5",
new Config
{
CommitsSinceVersionSourcePadding = 5
}
);
yield return new TestCaseData(
"tag-pre-release-weight=2",
new Config
{
TagPreReleaseWeight = 2
}
);
yield return new TestCaseData(
"commit-message-incrementing=MergeMessageOnly",
new Config
{
CommitMessageIncrementing = CommitMessageIncrementMode.MergeMessageOnly
}
);
yield return new TestCaseData(
"increment=Minor",
new Config
{
Increment = IncrementStrategy.Minor
}
);
yield return new TestCaseData(
"commit-date-format=\"MM/dd/yyyy h:mm tt\"",
new Config
{
CommitDateFormat = "MM/dd/yyyy h:mm tt"
}
);
yield return new TestCaseData(
"update-build-number=true",
new Config
{
UpdateBuildNumber = true
}
);
}

[TestCaseSource(nameof(OverrideconfigWithMultipleOptionsTestData))]
public void OverrideconfigWithMultipleOptions(string options, Config expected)
{
var arguments = argumentParser.ParseArguments(options);
arguments.OverrideConfig.ShouldBeEquivalentTo(expected);
}

private static IEnumerable<TestCaseData> OverrideconfigWithMultipleOptionsTestData()
{
yield return new TestCaseData(
"/overrideconfig tag-prefix=sample /overrideconfig assembly-versioning-scheme=MajorMinor",
new Config
{
TagPrefix = "sample",
AssemblyVersioningScheme = AssemblyVersioningScheme.MajorMinor,
}
);
yield return new TestCaseData(
"/overrideconfig tag-prefix=sample /overrideconfig assembly-versioning-format=\"{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}\"",
new Config
{
TagPrefix = "sample",
AssemblyVersioningFormat = "{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}"
}
);
yield return new TestCaseData(
"/overrideconfig tag-prefix=sample /overrideconfig assembly-versioning-format=\"{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}\" /overrideconfig update-build-number=true /overrideconfig assembly-versioning-scheme=MajorMinorPatchTag /overrideconfig mode=ContinuousDelivery /overrideconfig tag-pre-release-weight=4",
new Config
{
TagPrefix = "sample",
AssemblyVersioningFormat = "{Major}.{Minor}.{Patch}.{env:CI_JOB_ID ?? 0}",
UpdateBuildNumber = true,
AssemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatchTag,
VersioningMode = GitVersion.VersionCalculation.VersioningMode.ContinuousDelivery,
TagPreReleaseWeight = 4
}
);
}

[Test]
Expand Down
Loading