Skip to content

Commit

Permalink
use environment variables in CLI
Browse files Browse the repository at this point in the history
  • Loading branch information
adamralph committed Dec 21, 2020
1 parent b7ae07b commit 0a4841a
Show file tree
Hide file tree
Showing 6 changed files with 161 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<!-- MinVer doesn't use MinVer for versioning because
the environment variables for the build and for the package tests
would interfere with each other. -->
<Version Condition="'$(Version)' == ''">1.0.0</Version>
<Version Condition="'$(CI_VERSION)' != ''">$(CI_VERSION)</Version>
</PropertyGroup>

</Project>
12 changes: 12 additions & 0 deletions minver-cli/Logger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,18 @@ public void Warn(int code, string message)
}
}

public static void ErrorInvalidEnvVar(string name, string value, string validValueString)
{
if (validValueString == null)
{
Error($"Invalid environment variable '{name}' '{value}'.");
}
else
{
Error($"Invalid environment variable '{name}' '{value}'. Valid values are {validValueString}");
}
}

public static void ErrorWorkDirDoesNotExist(string workDir) =>
Error($"Working directory '{workDir}' does not exist.");

Expand Down
93 changes: 91 additions & 2 deletions minver-cli/Options.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,89 @@
namespace MinVer
{
using System;
#if MINVER_CLI
using System.Linq;
#endif
using MinVer.Lib;

internal class Options
{
#if MINVER_CLI
public static bool TryParseEnvVars(out Options options)
{
options = new Options();

var autoIncrementEnvVar = GetEnvVar("MinVerAutoIncrement");
if (!string.IsNullOrEmpty(autoIncrementEnvVar))
{
if (!Enum.TryParse<VersionPart>(autoIncrementEnvVar, true, out var autoIncrement))
{
Logger.ErrorInvalidEnvVar("MinVerAutoIncrement", autoIncrementEnvVar, VersionPartEx.ValidValues);
return false;
}

options.AutoIncrement = autoIncrement;
}

options.BuildMeta = GetEnvVar("MinVerBuildMetadata");
options.DefaultPreReleasePhase = GetEnvVar("MinVerDefaultPreReleasePhase");

var minMajorMinorEnvVar = GetEnvVar("MinVerMinimumMajorMinor");
if (!string.IsNullOrEmpty(minMajorMinorEnvVar))
{
if (!MajorMinor.TryParse(minMajorMinorEnvVar, out var minMajorMinor))
{
Logger.ErrorInvalidEnvVar("MinVerMinimumMajorMinor", minMajorMinorEnvVar, MajorMinor.ValidValues);
return false;
}

options.MinMajorMinor = minMajorMinor;
}

options.TagPrefix = GetEnvVar("MinVerTagPrefix");

var verbosityEnvVar = GetEnvVar("MinVerVerbosity");
if (!string.IsNullOrEmpty(verbosityEnvVar))
{
if (!VerbosityMap.TryMap(verbosityEnvVar, out var verbosity))
{
Logger.ErrorInvalidEnvVar("MinVerVerbosity", verbosityEnvVar, VerbosityMap.ValidValues);
return false;
}

options.Verbosity = verbosity;
}

var versionOverrideEnvVar = GetEnvVar("MinVerVersionOverride");
if (!string.IsNullOrEmpty(versionOverrideEnvVar))
{
if (!Lib.Version.TryParse(versionOverrideEnvVar, out var versionOverride))
{
Logger.ErrorInvalidEnvVar("MinVerVersionOverride", versionOverrideEnvVar, null);
return false;
}

options.VersionOverride = versionOverride;
}

return true;
}

private static string GetEnvVar(string name)
{
var vars = Environment.GetEnvironmentVariables();

var key = vars.Keys
.Cast<string>()
.OrderBy(_ => _)
.FirstOrDefault(k => string.Equals(k, name, StringComparison.OrdinalIgnoreCase));

return key == null
? null
: (string)vars[key];
}
#endif

public static bool TryParse(
string autoIncrementOption,
string buildMetaOption,
Expand Down Expand Up @@ -73,6 +152,18 @@ public static bool TryParse(
return true;
}

public Options Mask(Options other) =>
new Options
{
AutoIncrement = this.AutoIncrement == default ? other.AutoIncrement : this.AutoIncrement,
BuildMeta = this.BuildMeta ?? other.BuildMeta,
DefaultPreReleasePhase = this.DefaultPreReleasePhase ?? other.DefaultPreReleasePhase,
MinMajorMinor = this.MinMajorMinor ?? other.MinMajorMinor,
TagPrefix = this.TagPrefix ?? other.TagPrefix,
Verbosity = this.Verbosity == default ? other.Verbosity : this.Verbosity,
VersionOverride = this.VersionOverride ?? other.VersionOverride,
};

public VersionPart AutoIncrement { get; private set; }

public string BuildMeta { get; private set; }
Expand All @@ -85,8 +176,6 @@ public static bool TryParse(

public Verbosity Verbosity { get; private set; }

#if MINVER
public Lib.Version VersionOverride { get; private set; }
#endif
}
}
11 changes: 9 additions & 2 deletions minver-cli/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,22 @@ private static int Main(string[] args)
return 2;
}
#if MINVER_CLI
if (!Options.TryParseEnvVars(out var envOptions))
{
return 2;
}
options = options.Mask(envOptions);
#endif
var log = new Logger(options.Verbosity);
if (log.IsDebugEnabled)
{
log.Debug($"MinVer {informationalVersion}.");
}
#if MINVER
if (options.VersionOverride != null)
{
log.Info($"Using version override {options.VersionOverride}.");
Expand All @@ -70,7 +78,6 @@ private static int Main(string[] args)
return 0;
}
#endif
var version = Versioner.GetVersion(workDir, options.TagPrefix, options.MinMajorMinor, options.BuildMeta, options.AutoIncrement, options.DefaultPreReleasePhase, log);
Expand Down
1 change: 1 addition & 0 deletions minver-cli/minver-cli.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

<PropertyGroup>
<AnalysisMode>AllEnabledByDefault</AnalysisMode>
<DefineConstants>$(DefineConstants);MINVER_CLI</DefineConstants>
<Description>A minimalist command line tool for versioning any Git repository using tags.</Description>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<NoWarn>$(NoWarn);NU5105</NoWarn>
Expand Down
47 changes: 47 additions & 0 deletions targets/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(0, 0, 0, new[] { "alpha", "0" }), output);
// cli
Assert.Equal($"0.0.0-alpha.0+build.{buildNumber}", await RunCliAsync(testProject, "trace"));
});

Target(
Expand All @@ -123,6 +126,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(0, 0, 0, new[] { "alpha", "0" }), output);
// cli
Assert.Equal($"0.0.0-alpha.0+build.{buildNumber}", await RunCliAsync(testProject, "trace"));
});

Target(
Expand All @@ -141,6 +147,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(0, 0, 0, new[] { "alpha", "0" }), output);
// cli
Assert.Equal($"0.0.0-alpha.0+build.{buildNumber}", await RunCliAsync(testProject, "trace"));
});

Target(
Expand All @@ -158,6 +167,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(0, 0, 0, new[] { "alpha", "0" }), output);
// cli
Assert.Equal($"0.0.0-alpha.0+build.{buildNumber}", await RunCliAsync(testProject, "trace"));
});

Target(
Expand All @@ -175,6 +187,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(1, 2, 3, default, default, "foo"), output);
// cli
Assert.Equal($"1.2.3+foo.build.{buildNumber}", await RunCliAsync(testProject, "info", env => env.Add(AltCase("MinVerTagPrefix"), "v.")));
});

Target(
Expand All @@ -193,6 +208,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(1, 2, 4, new[] { "alpha", "0" }, 1), output);
// cli
Assert.Equal($"1.2.4-alpha.0.1+build.{buildNumber}", await RunCliAsync(testProject, "debug"));
});

Target(
Expand All @@ -208,6 +226,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(1, 3, 0, new[] { "alpha", "0" }, 1), output);
// cli
Assert.Equal($"1.3.0-alpha.0.1+build.{buildNumber}", await RunCliAsync(testProject, "trace", env => env.Add(AltCase("MinVerAutoIncrement"), "minor")));
});

Target(
Expand All @@ -225,6 +246,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(1, 4, 0), output);
// cli
Assert.Equal($"1.4.0+build.{buildNumber}", await RunCliAsync(testProject, "trace"));
});

Target(
Expand All @@ -243,6 +267,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(2, 0, 0, new[] { "alpha", "0" }), output);
// cli
Assert.Equal($"2.0.0-alpha.0+build.{buildNumber}", await RunCliAsync(testProject, "trace", env => env.Add(AltCase("MinVerMinimumMajorMinor"), "2.0")));
});

Target(
Expand All @@ -260,6 +287,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(2, 0, 0, new[] { "alpha", "0" }, 1), output);
// cli
Assert.Equal($"2.0.0-alpha.0.1+build.{buildNumber}", await RunCliAsync(testProject, "trace", env => env.Add(AltCase("MinVerMinimumMajorMinor"), "2.0")));
});

Target(
Expand All @@ -275,6 +305,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(1, 5, 1, new[] { "preview", "0" }, 1), output);
// cli
Assert.Equal($"1.5.1-preview.0.1+build.{buildNumber}", await RunCliAsync(testProject, "trace", env => env.Add(AltCase("MinVerDefaultPreReleasePhase"), "preview")));
});

Target(
Expand All @@ -290,6 +323,9 @@ void Run(IEnumerable<string> targets, Options options, string packageTestsSdk)
// assert
AssertVersion(new Version(3, 2, 1, new[] { "rc", "4" }, default, "build.5"), output);
// cli
Assert.Equal("3.2.1-rc.4+build.5", await RunCliAsync(testProject, "trace", env => env.Add(AltCase("MinVerVersionOverride"), "3.2.1-rc.4+build.5")));
});

Target(
Expand Down Expand Up @@ -366,6 +402,17 @@ static void AssertVersion(Version expected, string path)
Assert.Equal(expected.ToString(), fileVersion.ProductVersion);
}

async Task<string> RunCliAsync(string repo, string verbosity, Action<IDictionary<string, string>> configureEnvironment = null) =>
(await ReadAsync(
"dotnet",
$"exec ./minver-cli/bin/Release/netcoreapp2.1/minver-cli.dll --repo {repo}",
configureEnvironment: env =>
{
configureEnvironment?.Invoke(env);
env.Add(AltCase("MinVerBuildMetadata"), $"build.{buildNumber}");
env.Add(AltCase("MinVerVerbosity"), verbosity ?? "");
})).Trim();

static string AltCase(string value) => new string(value.Select((c, i) => i % 2 == 0 ? c.ToString().ToLowerInvariant()[0] : c.ToString().ToUpperInvariant()[0]).ToArray());

public record Version
Expand Down

0 comments on commit 0a4841a

Please sign in to comment.