Skip to content

Commit

Permalink
Merge pull request #784 from adamralph/no-git
Browse files Browse the repository at this point in the history
NoGit
  • Loading branch information
adamralph authored Jul 24, 2022
2 parents 4055269 + 6b62fed commit ac44da1
Show file tree
Hide file tree
Showing 20 changed files with 120 additions and 23 deletions.
2 changes: 1 addition & 1 deletion MinVer.Lib/GitCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public static bool TryRun(string args, string workingDirectory, ILogger log, out
}
catch (Win32Exception ex)
{
throw new InvalidOperationException("\"git\" is not present in PATH.", ex);
throw new NoGitException("\"git\" is not present in PATH.", ex);
}

var runProcess = tcs.Task;
Expand Down
12 changes: 12 additions & 0 deletions MinVer.Lib/NoGitException.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;

namespace MinVer.Lib;

#pragma warning disable CA1032 // Implement standard exception constructors
public class NoGitException : Exception
#pragma warning restore CA1032
{
public NoGitException(string message, Exception innerException) : base(message, innerException)
{
}
}
3 changes: 3 additions & 0 deletions MinVer/Logger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ public static void ErrorInvalidVersionOverride(string versionOverride) =>
Error(1005, $"Invalid version override '{versionOverride}'");
#endif

public static void ErrorNoGit(string message) =>
Error(1007, message);

private static void Error(int code, string message) => Message($"error MINVER{code:D4} : {message}");

private static bool Message(string message)
Expand Down
5 changes: 3 additions & 2 deletions MinVerTests.Infra/CommandEx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ internal static class CommandEx
private static readonly ConcurrentDictionary<string, int> indices = new ConcurrentDictionary<string, int>();
#endif

public static async Task<(string StandardOutput, string StandardError)> ReadLoggedAsync(string name, string args = "", string workingDirectory = "", IEnumerable<KeyValuePair<string, string>>? envVars = null)
public static async Task<(string StandardOutput, string StandardError)> ReadLoggedAsync(string name, string args = "", string workingDirectory = "", IEnumerable<KeyValuePair<string, string>>? envVars = null, Func<int, bool>? handleExitCode = null)
{
envVars = (envVars ?? Enumerable.Empty<KeyValuePair<string, string>>()).ToList();

Expand All @@ -30,7 +30,8 @@ internal static class CommandEx
{
env[key] = value;
}
}).ConfigureAwait(false);
},
handleExitCode: handleExitCode).ConfigureAwait(false);

int index;

Expand Down
4 changes: 2 additions & 2 deletions MinVerTests.Infra/MinVerCli.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ namespace MinVerTests.Infra
{
public static class MinVerCli
{
public static async Task<(string StandardOutput, string StandardError)> ReadAsync(string workingDirectory, string configuration = Configuration.Current, string args = "", params (string, string)[] envVars)
public static async Task<(string StandardOutput, string StandardError)> ReadAsync(string workingDirectory, string configuration = Configuration.Current, string args = "", Func<int, bool>? handleExitCode = null, params (string, string)[] envVars)
{
var environmentVariables = envVars.ToDictionary(envVar => envVar.Item1, envVar => envVar.Item2, StringComparer.OrdinalIgnoreCase);
_ = environmentVariables.TryAdd("MinVerVerbosity".ToAltCase(), "trace");

return await CommandEx.ReadLoggedAsync("dotnet", $"exec {GetPath(configuration)} {args}", workingDirectory, environmentVariables).ConfigureAwait(false);
return await CommandEx.ReadLoggedAsync("dotnet", $"exec {GetPath(configuration)} {args}", workingDirectory, environmentVariables, handleExitCode).ConfigureAwait(false);
}

public static string GetPath(string configuration) =>
Expand Down
15 changes: 8 additions & 7 deletions MinVerTests.Infra/Sdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,14 +103,14 @@ private static void CreateGlobalJsonIfRequired(string path)
}
}

public static async Task<(Package Package, string StandardOutput, string StandardError)> BuildProject(string path, params (string, string)[] envVars)
public static async Task<(Package? Package, string StandardOutput, string StandardError)> BuildProject(string path, Func<int, bool>? handleExitCode = null, params (string, string)[] envVars)
{
var (packages, standardOutput, standardError) = await Build(path, envVars).ConfigureAwait(false);
var (packages, standardOutput, standardError) = await Build(path, handleExitCode, envVars).ConfigureAwait(false);

return (packages.Single(), standardOutput, standardError);
return (packages.SingleOrDefault(), standardOutput, standardError);
}

public static async Task<(List<Package>, string StandardOutput, string StandardError)> Build(string path, params (string, string)[] envVars)
public static async Task<(List<Package>, string StandardOutput, string StandardError)> Build(string path, Func<int, bool>? handleExitCode = null, params (string, string)[] envVars)
{
var environmentVariables = envVars.ToDictionary(envVar => envVar.Item1, envVar => envVar.Item2, StringComparer.OrdinalIgnoreCase);
_ = environmentVariables.TryAdd("MinVerVerbosity".ToAltCase(), "diagnostic");
Expand All @@ -120,7 +120,8 @@ private static void CreateGlobalJsonIfRequired(string path)
var (standardOutput, standardError) = await DotNet(
$"build --no-restore{(!Version.StartsWith("2.", StringComparison.Ordinal) ? " --nologo" : "")}",
path,
environmentVariables).ConfigureAwait(false);
environmentVariables,
handleExitCode).ConfigureAwait(false);

var matcher = new Matcher().AddInclude("**/bin/Debug/*.nupkg");
var packageFileNames = matcher.GetResultsInFullPath(path).OrderBy(_ => _);
Expand All @@ -142,7 +143,7 @@ private static void CreateGlobalJsonIfRequired(string path)
environmentVariables).ConfigureAwait(false);
}

public static Task<(string StandardOutput, string StandardError)> DotNet(string args, string path, IDictionary<string, string>? envVars = null)
public static Task<(string StandardOutput, string StandardError)> DotNet(string args, string path, IDictionary<string, string>? envVars = null, Func<int, bool>? handleExitCode = null)
{
envVars ??= new Dictionary<string, string>();

Expand All @@ -152,7 +153,7 @@ private static void CreateGlobalJsonIfRequired(string path)
envVars["MSBuildSDKsPath"] = Path.Combine(dotnetRoot, "sdk", Version, "Sdks");
}

return CommandEx.ReadLoggedAsync("dotnet", args, path, envVars);
return CommandEx.ReadLoggedAsync("dotnet", args, path, envVars, handleExitCode);
}

private static async Task<Package> GetPackage(string fileName)
Expand Down
2 changes: 1 addition & 1 deletion MinVerTests.Packages/BuildMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public static async Task HasBuildMetadata()
var expected = Package.WithVersion(0, 0, 0, new[] { "alpha", "0", }, 0, "build.123");

// act
var (actual, _, _) = await Sdk.BuildProject(path, envVars);
var (actual, _, _) = await Sdk.BuildProject(path, envVars: envVars);
var (cliStandardOutput, _) = await MinVerCli.ReadAsync(path, envVars: envVars);

// assert
Expand Down
2 changes: 1 addition & 1 deletion MinVerTests.Packages/CustomAutoIncrement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public static async Task HasCustomAutoIncrement()
var expected = Package.WithVersion(2, 4, 0, new[] { "alpha", "0", }, 1);

// act
var (actual, _, _) = await Sdk.BuildProject(path, envVars);
var (actual, _, _) = await Sdk.BuildProject(path, envVars: envVars);
var (cliStandardOutput, _) = await MinVerCli.ReadAsync(path, envVars: envVars);

// assert
Expand Down
2 changes: 1 addition & 1 deletion MinVerTests.Packages/CustomDefaultPreReleasePhase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public static async Task HasCustomDefaultPreReleasePhase()
var expected = Package.WithVersion(2, 3, 5, new[] { "preview", "0", }, 1);

// act
var (actual, _, _) = await Sdk.BuildProject(path, envVars);
var (actual, _, _) = await Sdk.BuildProject(path, envVars: envVars);
var (cliStandardOutput, _) = await MinVerCli.ReadAsync(path, envVars: envVars);

// assert
Expand Down
2 changes: 1 addition & 1 deletion MinVerTests.Packages/IgnoringHeight.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public static async Task HeightIsIgnored()
var expected = Package.WithVersion(2, 3, 4);

// act
var (actual, _, _) = await Sdk.BuildProject(path, envVars);
var (actual, _, _) = await Sdk.BuildProject(path, envVars: envVars);
var (cliStandardOutput, _) = await MinVerCli.ReadAsync(path, envVars: envVars);

// assert
Expand Down
13 changes: 13 additions & 0 deletions MinVerTests.Packages/Infra/WindowsFactAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System.Runtime.InteropServices;
using Xunit;

namespace MinVerTests.Packages.Infra;

internal sealed class WindowsFactAttribute : FactAttribute
{
public override string Skip
{
get => !RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "Windows only" : base.Skip;
set => base.Skip = value;
}
}
2 changes: 1 addition & 1 deletion MinVerTests.Packages/MinimumMajorMinorAfterTag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public static async Task HasMinimumMajorMinorWithHeightOne()
var expected = Package.WithVersion(3, 0, 0, new[] { "alpha", "0", }, 1);

// act
var (actual, _, _) = await Sdk.BuildProject(path, envVars);
var (actual, _, _) = await Sdk.BuildProject(path, envVars: envVars);
var (cliStandardOutput, _) = await MinVerCli.ReadAsync(path, envVars: envVars);

// assert
Expand Down
2 changes: 1 addition & 1 deletion MinVerTests.Packages/MinimumMajorMinorOnTag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public static async Task HasMinimumMajorMinor()
var expected = Package.WithVersion(3, 0, 0, new[] { "alpha", "0", });

// act
var (actual, _, _) = await Sdk.BuildProject(path, envVars);
var (actual, _, _) = await Sdk.BuildProject(path, envVars: envVars);
var (cliStandardOutput, _) = await MinVerCli.ReadAsync(path, envVars: envVars);

// assert
Expand Down
54 changes: 54 additions & 0 deletions MinVerTests.Packages/NoGit.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System;
using System.Globalization;
using System.Reflection;
using System.Threading.Tasks;
using MinVerTests.Infra;
using MinVerTests.Packages.Infra;
using Xunit;

namespace MinVerTests.Packages;

public static class NoGit
{
[WindowsFact]
public static async Task GitIsNotInPath()
{
// arrange
var path = MethodBase.GetCurrentMethod().GetTestDirectory();
await Sdk.CreateProject(path);
await Git.Init(path);
await Git.Commit(path);

var pathEnvVar = Environment.GetEnvironmentVariable("PATH") ?? "";
pathEnvVar = pathEnvVar.Replace("git", "not-git", true, CultureInfo.InvariantCulture);

var sdkExitCode = 0;
var cliExitCode = 0;

// act
var (_, sdkStandardOutput, _) = await Sdk.BuildProject(
path,
exitCode =>
{
sdkExitCode = exitCode;
return true;
},
("PATH", pathEnvVar));

var (_, cliStandardError) = await MinVerCli.ReadAsync(
path,
handleExitCode: exitCode =>
{
cliExitCode = exitCode;
return true;
},
envVars: ("PATH", pathEnvVar));

// assert
Assert.NotEqual(0, sdkExitCode);
Assert.Contains("MINVER1007", sdkStandardOutput, StringComparison.Ordinal);

Assert.NotEqual(0, cliExitCode);
Assert.Contains("\"git\" is not present in PATH.", cliStandardError, StringComparison.Ordinal);
}
}
2 changes: 1 addition & 1 deletion MinVerTests.Packages/OutputVariables.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public static async Task AreSet()
var envVars = ("MinVerVersionOverride".ToAltCase(), "2.3.4-alpha-x.5+build.6");

// act
var (_, standardOutput, _) = await Sdk.BuildProject(path, envVars);
var (_, standardOutput, _) = await Sdk.BuildProject(path, envVars: envVars);

// assert
Assert.Contains("MinVer: [output] MinVerVersion=2.3.4-alpha-x.5+build.6", standardOutput, StringComparison.Ordinal);
Expand Down
2 changes: 1 addition & 1 deletion MinVerTests.Packages/Skip.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public static async Task HasDefaultSdkVersion()
var expected = Package.WithVersion(1, 0, 0);

// act
var (actual, _, _) = await Sdk.BuildProject(path, envVars);
var (actual, _, _) = await Sdk.BuildProject(path, envVars: envVars);

// assert
Assert.Equal(expected, actual);
Expand Down
2 changes: 1 addition & 1 deletion MinVerTests.Packages/TagWithPrefix.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public static async Task HasTagVersion()
var expected = Package.WithVersion(2, 3, 4, new[] { "alpha", "5", });

// act
var (actual, _, _) = await Sdk.BuildProject(path, envVars);
var (actual, _, _) = await Sdk.BuildProject(path, envVars: envVars);
var (cliStandardOutput, _) = await MinVerCli.ReadAsync(path, envVars: envVars);

// assert
Expand Down
2 changes: 1 addition & 1 deletion MinVerTests.Packages/VersionOverride.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public static async Task HasVersionOverride()
var expected = Package.WithVersion(3, 4, 5, new[] { "alpha", "6", }, 0, "build.7");

// act
var (actual, _, _) = await Sdk.BuildProject(path, envVars);
var (actual, _, _) = await Sdk.BuildProject(path, envVars: envVars);
var (cliStandardOutput, _) = await MinVerCli.ReadAsync(path, envVars: envVars);

// assert
Expand Down
3 changes: 3 additions & 0 deletions minver-cli/Logger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ public static void ErrorInvalidMinMajorMinor(string minMajorMinor) =>
public static void ErrorInvalidVerbosity(string verbosity) =>
Error($"Invalid verbosity '{verbosity}'. Valid values are {VerbosityMap.ValidValues}.");

public static void ErrorNoGit(string message) =>
Error(message);

private static void Error(string message) => Message($"error : {message}");

private static bool Message(string message)
Expand Down
12 changes: 11 additions & 1 deletion minver-cli/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Reflection;
using McMaster.Extensions.CommandLineUtils;
using MinVer.Lib;
using Version = MinVer.Lib.Version;

namespace MinVer;

Expand Down Expand Up @@ -78,7 +79,16 @@ private static int Main(string[] args)
return 0;
}

var version = Versioner.GetVersion(workDir, options.TagPrefix ?? "", options.MinMajorMinor ?? MajorMinor.Zero, options.BuildMeta ?? "", options.AutoIncrement ?? default, options.DefaultPreReleasePhase ?? "", options.IgnoreHeight ?? false, log);
Version version;
try
{
version = Versioner.GetVersion(workDir, options.TagPrefix ?? "", options.MinMajorMinor ?? MajorMinor.Zero, options.BuildMeta ?? "", options.AutoIncrement ?? default, options.DefaultPreReleasePhase ?? "", options.IgnoreHeight ?? false, log);
}
catch (NoGitException ex)
{
Logger.ErrorNoGit(ex.Message);
return 2;
}

Console.Out.WriteLine(version);

Expand Down

0 comments on commit ac44da1

Please sign in to comment.