From d710cdb1a07383dece30a6dd65afaa56c242a2ca Mon Sep 17 00:00:00 2001 From: Darrell Tunnell Date: Fri, 8 May 2020 21:46:49 +0100 Subject: [PATCH 1/2] Spike of new CLI - gitversion calculate https://github.com/GitTools/GitVersion/issues/2262 --- src/GitVersion.sln | 18 ---- .../Core/GitVersionExecutorTests.cs | 4 +- .../Configuration/ConfigFileLocator.cs | 4 +- .../Configuration/ConfigProvider.cs | 2 +- src/GitVersionCore/Core/GitPreparer.cs | 101 ++---------------- src/GitVersionCore/Core/GitVersionTool.cs | 15 +-- .../Extensions/GitVersionOptionsExtensions.cs | 21 +--- src/GitVersionCore/Model/GitVersionOptions.cs | 25 ++--- .../Commands/CalculateCommand.cs | 40 +++++++ .../Commands/GitVersionRootCommand.cs | 19 ++++ src/GitVersionExe/Commands/LoggingMethod.cs | 8 ++ src/GitVersionExe/GitVersionApp.cs | 6 +- src/GitVersionExe/GitVersionExe.csproj | 8 ++ src/GitVersionExe/GitVersionExeModule.cs | 3 - src/GitVersionExe/GitVersionExecutor.cs | 58 +++++----- src/GitVersionExe/IArgumentParser.cs | 8 -- src/GitVersionExe/IGitVersionExecutor.cs | 2 +- src/GitVersionExe/Program.cs | 33 ++++-- .../GitVersionTask.Tests.csproj | 2 - src/GitVersionTask/GitVersionTask.csproj | 1 - 20 files changed, 169 insertions(+), 209 deletions(-) create mode 100644 src/GitVersionExe/Commands/CalculateCommand.cs create mode 100644 src/GitVersionExe/Commands/GitVersionRootCommand.cs create mode 100644 src/GitVersionExe/Commands/LoggingMethod.cs delete mode 100644 src/GitVersionExe/IArgumentParser.cs diff --git a/src/GitVersion.sln b/src/GitVersion.sln index 13bb303084..49a12defe9 100644 --- a/src/GitVersion.sln +++ b/src/GitVersion.sln @@ -4,8 +4,6 @@ VisualStudioVersion = 16.0.28714.193 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionExe", "GitVersionExe\GitVersionExe.csproj", "{C3578A7B-09A6-4444-9383-0DEAFA4958BD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionTask.Tests", "GitVersionTask.Tests\GitVersionTask.Tests.csproj", "{5A86453B-96FB-4B6E-A283-225BB9F753D3}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionCore.Tests", "GitVersionCore.Tests\GitVersionCore.Tests.csproj", "{BF905F84-382C-440D-92F5-C61108626D8D}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3EFFC5D6-88D0-49D9-BB53-E1B7EB49DD45}" @@ -29,10 +27,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionCore", "GitVersio EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionExe.Tests", "GitVersionExe.Tests\GitVersionExe.Tests.csproj", "{75C2BE85-1DAF-4E34-8305-B17AFAA982A6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionTask", "GitVersionTask\GitVersionTask.csproj", "{F7AC0E71-3E9A-4F6D-B986-E004825A48E1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionTask.MsBuild", "GitVersionTask.MsBuild\GitVersionTask.MsBuild.csproj", "{0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -43,10 +37,6 @@ Global {C3578A7B-09A6-4444-9383-0DEAFA4958BD}.Debug|Any CPU.Build.0 = Debug|Any CPU {C3578A7B-09A6-4444-9383-0DEAFA4958BD}.Release|Any CPU.ActiveCfg = Release|Any CPU {C3578A7B-09A6-4444-9383-0DEAFA4958BD}.Release|Any CPU.Build.0 = Release|Any CPU - {5A86453B-96FB-4B6E-A283-225BB9F753D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5A86453B-96FB-4B6E-A283-225BB9F753D3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5A86453B-96FB-4B6E-A283-225BB9F753D3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5A86453B-96FB-4B6E-A283-225BB9F753D3}.Release|Any CPU.Build.0 = Release|Any CPU {BF905F84-382C-440D-92F5-C61108626D8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BF905F84-382C-440D-92F5-C61108626D8D}.Debug|Any CPU.Build.0 = Debug|Any CPU {BF905F84-382C-440D-92F5-C61108626D8D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -59,14 +49,6 @@ Global {75C2BE85-1DAF-4E34-8305-B17AFAA982A6}.Debug|Any CPU.Build.0 = Debug|Any CPU {75C2BE85-1DAF-4E34-8305-B17AFAA982A6}.Release|Any CPU.ActiveCfg = Release|Any CPU {75C2BE85-1DAF-4E34-8305-B17AFAA982A6}.Release|Any CPU.Build.0 = Release|Any CPU - {F7AC0E71-3E9A-4F6D-B986-E004825A48E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F7AC0E71-3E9A-4F6D-B986-E004825A48E1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F7AC0E71-3E9A-4F6D-B986-E004825A48E1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F7AC0E71-3E9A-4F6D-B986-E004825A48E1}.Release|Any CPU.Build.0 = Release|Any CPU - {0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/GitVersionCore.Tests/Core/GitVersionExecutorTests.cs b/src/GitVersionCore.Tests/Core/GitVersionExecutorTests.cs index 4de9768a77..0ba1c508a1 100644 --- a/src/GitVersionCore.Tests/Core/GitVersionExecutorTests.cs +++ b/src/GitVersionCore.Tests/Core/GitVersionExecutorTests.cs @@ -418,7 +418,7 @@ public void GetProjectRootDirectoryWorkingDirectoryWithWorktree() sp = GetServiceProvider(gitVersionOptions); - gitVersionOptions.ProjectRootDirectory.TrimEnd('/', '\\').ShouldBe(worktreePath); + gitVersionOptions.GitRepositoryWorkingDirectory.TrimEnd('/', '\\').ShouldBe(worktreePath); } finally { @@ -441,7 +441,7 @@ public void GetProjectRootDirectoryNoWorktree() sp = GetServiceProvider(gitVersionOptions); var expectedPath = fixture.RepositoryPath.TrimEnd('/', '\\'); - gitVersionOptions.ProjectRootDirectory.TrimEnd('/', '\\').ShouldBe(expectedPath); + gitVersionOptions.GitRepositoryWorkingDirectory.TrimEnd('/', '\\').ShouldBe(expectedPath); } [Test] diff --git a/src/GitVersionCore/Configuration/ConfigFileLocator.cs b/src/GitVersionCore/Configuration/ConfigFileLocator.cs index 95a326e530..f3a47509a2 100644 --- a/src/GitVersionCore/Configuration/ConfigFileLocator.cs +++ b/src/GitVersionCore/Configuration/ConfigFileLocator.cs @@ -22,7 +22,7 @@ protected ConfigFileLocator(IFileSystem fileSystem) public string SelectConfigFilePath(GitVersionOptions gitVersionOptions) { var workingDirectory = gitVersionOptions.WorkingDirectory; - var projectRootDirectory = gitVersionOptions.ProjectRootDirectory; + var projectRootDirectory = gitVersionOptions.GitRepositoryWorkingDirectory; return GetConfigFilePath(HasConfigFileAt(workingDirectory) ? workingDirectory : projectRootDirectory); } @@ -50,7 +50,7 @@ public void Verify(GitVersionOptions gitVersionOptions) } var workingDirectory = gitVersionOptions.WorkingDirectory; - var projectRootDirectory = gitVersionOptions.ProjectRootDirectory; + var projectRootDirectory = gitVersionOptions.GitRepositoryWorkingDirectory; Verify(workingDirectory, projectRootDirectory); } diff --git a/src/GitVersionCore/Configuration/ConfigProvider.cs b/src/GitVersionCore/Configuration/ConfigProvider.cs index 7c41dcec5f..22e2bb3f51 100644 --- a/src/GitVersionCore/Configuration/ConfigProvider.cs +++ b/src/GitVersionCore/Configuration/ConfigProvider.cs @@ -28,7 +28,7 @@ public Config Provide(bool applyDefaults = true, Config overrideConfig = null) { var gitVersionOptions = options.Value; var workingDirectory = gitVersionOptions.WorkingDirectory; - var projectRootDirectory = gitVersionOptions.ProjectRootDirectory; + var projectRootDirectory = gitVersionOptions.GitRepositoryWorkingDirectory; var rootDirectory = configFileLocator.HasConfigFileAt(workingDirectory) ? workingDirectory : projectRootDirectory; return Provide(rootDirectory, applyDefaults, overrideConfig); diff --git a/src/GitVersionCore/Core/GitPreparer.cs b/src/GitVersionCore/Core/GitPreparer.cs index 1ab1a53af3..97f14d612c 100644 --- a/src/GitVersionCore/Core/GitPreparer.cs +++ b/src/GitVersionCore/Core/GitPreparer.cs @@ -35,11 +35,9 @@ public void Prepare() var currentBranch = ResolveCurrentBranch(); var dotGitDirectory = gitVersionOptions.DotGitDirectory; - var projectRoot = gitVersionOptions.ProjectRootDirectory; - log.Info($"Project root is: {projectRoot}"); log.Info($"DotGit directory is: {dotGitDirectory}"); - if (string.IsNullOrEmpty(dotGitDirectory) || string.IsNullOrEmpty(projectRoot)) + if (string.IsNullOrEmpty(dotGitDirectory)) { throw new Exception($"Failed to prepare or find the .git directory in path '{gitVersionOptions.WorkingDirectory}'."); } @@ -50,22 +48,17 @@ public void Prepare() private void PrepareInternal(bool normalizeGitDirectory, string currentBranch, bool shouldCleanUpRemotes = false) { var gitVersionOptions = options.Value; - if (!string.IsNullOrWhiteSpace(gitVersionOptions.RepositoryInfo.TargetUrl)) - { - CreateDynamicRepository(currentBranch); - } - else + + if (normalizeGitDirectory) { - if (normalizeGitDirectory) + if (shouldCleanUpRemotes) { - if (shouldCleanUpRemotes) - { - CleanupDuplicateOrigin(); - } - - NormalizeGitDirectory(currentBranch, gitVersionOptions.DotGitDirectory, false); + CleanupDuplicateOrigin(); } + + NormalizeGitDirectory(currentBranch, gitVersionOptions.DotGitDirectory, false); } + } private string ResolveCurrentBranch() @@ -108,32 +101,6 @@ private void CleanupDuplicateOrigin() } } - private void CreateDynamicRepository(string targetBranch) - { - var gitVersionOptions = options.Value; - if (string.IsNullOrWhiteSpace(targetBranch)) - { - throw new Exception("Dynamic Git repositories must have a target branch (/b)"); - } - - var repositoryInfo = gitVersionOptions.RepositoryInfo; - var gitDirectory = gitVersionOptions.DynamicGitRepositoryPath; - - using (log.IndentLog($"Creating dynamic repository at '{gitDirectory}'")) - { - var authentication = gitVersionOptions.Authentication; - if (!Directory.Exists(gitDirectory)) - { - CloneRepository(repositoryInfo.TargetUrl, gitDirectory, authentication); - } - else - { - log.Info("Git repository already exists"); - } - NormalizeGitDirectory(targetBranch, gitDirectory, true); - } - } - private void NormalizeGitDirectory(string targetBranch, string gitDirectory, bool isDynamicRepository) { using (log.IndentLog($"Normalizing git directory for branch '{targetBranch}'")) @@ -143,58 +110,6 @@ private void NormalizeGitDirectory(string targetBranch, string gitDirectory, boo } } - private void CloneRepository(string repositoryUrl, string gitDirectory, AuthenticationInfo auth) - { - Credentials credentials = null; - - if (auth != null) - { - if (!string.IsNullOrWhiteSpace(auth.Username)) - { - log.Info($"Setting up credentials using name '{auth.Username}'"); - - credentials = new UsernamePasswordCredentials - { - Username = auth.Username, - Password = auth.Password ?? string.Empty - }; - } - } - - try - { - using (log.IndentLog($"Cloning repository from url '{repositoryUrl}'")) - { - var cloneOptions = new CloneOptions - { - Checkout = false, - CredentialsProvider = (url, usernameFromUrl, types) => credentials - }; - - var returnedPath = Repository.Clone(repositoryUrl, gitDirectory, cloneOptions); - log.Info($"Returned path after repository clone: {returnedPath}"); - } - } - catch (LibGit2SharpException ex) - { - var message = ex.Message; - if (message.Contains("401")) - { - throw new Exception("Unauthorized: Incorrect username/password"); - } - if (message.Contains("403")) - { - throw new Exception("Forbidden: Possibly Incorrect username/password"); - } - if (message.Contains("404")) - { - throw new Exception("Not found: The repository was not found"); - } - - throw new Exception("There was an unknown problem with the Git repository you provided", ex); - } - } - /// /// Normalization of a git directory turns all remote branches into local branches, turns pull request refs into a real branch and a few other things. This is designed to be run *only on the build server* which checks out repositories in different ways. /// It is not recommended to run normalization against a local repository diff --git a/src/GitVersionCore/Core/GitVersionTool.cs b/src/GitVersionCore/Core/GitVersionTool.cs index 041f79a520..888492c03e 100644 --- a/src/GitVersionCore/Core/GitVersionTool.cs +++ b/src/GitVersionCore/Core/GitVersionTool.cs @@ -93,13 +93,14 @@ public void UpdateAssemblyInfo(VersionVariables variables) { var gitVersionOptions = options.Value; - if (gitVersionOptions.AssemblyInfo.ShouldUpdate) - { - using (assemblyInfoFileUpdater) - { - assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(gitVersionOptions.WorkingDirectory, gitVersionOptions.AssemblyInfo.EnsureAssemblyInfo, gitVersionOptions.AssemblyInfo.Files.ToArray())); - } - } + throw new NotImplementedException(); + //if (gitVersionOptions.AssemblyInfo.ShouldUpdate) + //{ + // using (assemblyInfoFileUpdater) + // { + // assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(gitVersionOptions.WorkingDirectory, gitVersionOptions.AssemblyInfo.EnsureAssemblyInfo, gitVersionOptions.AssemblyInfo.Files.ToArray())); + // } + //} } public void UpdateWixVersionFile(VersionVariables variables) diff --git a/src/GitVersionCore/Extensions/GitVersionOptionsExtensions.cs b/src/GitVersionCore/Extensions/GitVersionOptionsExtensions.cs index c8e161898b..54ca389076 100644 --- a/src/GitVersionCore/Extensions/GitVersionOptionsExtensions.cs +++ b/src/GitVersionCore/Extensions/GitVersionOptionsExtensions.cs @@ -9,9 +9,7 @@ public static class GitVersionOptionsExtensions { public static string GetDotGitDirectory(this GitVersionOptions gitVersionOptions) { - var dotGitDirectory = !string.IsNullOrWhiteSpace(gitVersionOptions.DynamicGitRepositoryPath) - ? gitVersionOptions.DynamicGitRepositoryPath - : Repository.Discover(gitVersionOptions.WorkingDirectory); + var dotGitDirectory = Repository.Discover(gitVersionOptions.WorkingDirectory); dotGitDirectory = dotGitDirectory?.TrimEnd('/', '\\'); if (string.IsNullOrEmpty(dotGitDirectory)) @@ -22,20 +20,11 @@ public static string GetDotGitDirectory(this GitVersionOptions gitVersionOptions : dotGitDirectory; } - public static string GetProjectRootDirectory(this GitVersionOptions gitVersionOptions) + public static string GetRepositoryWorkingDirectory(this GitVersionOptions gitVersionOptions) { - if (!string.IsNullOrWhiteSpace(gitVersionOptions.DynamicGitRepositoryPath)) - { - return gitVersionOptions.WorkingDirectory; - } - - var dotGitDirectory = Repository.Discover(gitVersionOptions.WorkingDirectory); - - if (string.IsNullOrEmpty(dotGitDirectory)) - throw new DirectoryNotFoundException($"Can't find the .git directory in {dotGitDirectory}"); - - using var repository = new Repository(dotGitDirectory); - return repository.Info.WorkingDirectory; + //return gitVersionOptions.WorkingDirectory; + using var repository = new Repository(gitVersionOptions.DotGitDirectory); + return repository.Info.WorkingDirectory; } public static string GetDynamicGitRepositoryPath(this GitVersionOptions gitVersionOptions) diff --git a/src/GitVersionCore/Model/GitVersionOptions.cs b/src/GitVersionCore/Model/GitVersionOptions.cs index 2463c839ee..4b65fdefad 100644 --- a/src/GitVersionCore/Model/GitVersionOptions.cs +++ b/src/GitVersionCore/Model/GitVersionOptions.cs @@ -9,23 +9,23 @@ namespace GitVersion public class GitVersionOptions { private Lazy dotGitDirectory; - private Lazy projectRootDirectory; - private Lazy dynamicGitRepositoryPath; + private Lazy gitRepositoryWorkingDirectory; public GitVersionOptions() { + WorkingDirectory = System.Environment.CurrentDirectory; dotGitDirectory = new Lazy(this.GetDotGitDirectory); - projectRootDirectory = new Lazy(this.GetProjectRootDirectory); - dynamicGitRepositoryPath = new Lazy(this.GetDynamicGitRepositoryPath); + gitRepositoryWorkingDirectory = new Lazy(this.GetRepositoryWorkingDirectory); } + public string[] Args { get; set; } public string WorkingDirectory { get; set; } - public string DotGitDirectory => dotGitDirectory.Value; - public string ProjectRootDirectory => projectRootDirectory.Value; - public string DynamicGitRepositoryPath => dynamicGitRepositoryPath.Value; + public string GitRepositoryWorkingDirectory => gitRepositoryWorkingDirectory.Value; + public bool LogToConsole { get; set; } = false; + public string LogFilePath; - public AssemblyInfoData AssemblyInfo { get; } = new AssemblyInfoData(); + //public AssemblyInfoData AssemblyInfo { get; } = new AssemblyInfoData(); public AuthenticationInfo Authentication { get; } = new AuthenticationInfo(); public ConfigInfo ConfigInfo { get; } = new ConfigInfo(); public RepositoryInfo RepositoryInfo { get; } = new RepositoryInfo(); @@ -37,19 +37,10 @@ public GitVersionOptions() public bool IsVersion; public bool IsHelp; - public string LogFilePath; public string ShowVariable; public string OutputFile; public ISet Output = new HashSet(); public Verbosity Verbosity = Verbosity.Normal; - [Obsolete] - public string Proj; - [Obsolete] - public string ProjArgs; - [Obsolete] - public string Exec; - [Obsolete] - public string ExecArgs; } } diff --git a/src/GitVersionExe/Commands/CalculateCommand.cs b/src/GitVersionExe/Commands/CalculateCommand.cs new file mode 100644 index 0000000000..7a139cafd0 --- /dev/null +++ b/src/GitVersionExe/Commands/CalculateCommand.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Options; +using System; +using System.CommandLine; +using System.CommandLine.Invocation; +using System.Threading.Tasks; + +namespace GitVersion +{ + public class CalculateCommand : Command + { + private readonly IGitVersionTool gitversionTool; + private readonly Logging.IConsole console; + + public CalculateCommand(IGitVersionTool gitversionTool, Logging.IConsole console) : base("calculate", "Calculates version information from your git repository") + { + this.gitversionTool = gitversionTool; + this.console = console; + this.AddOption(new Option( + "--normalize", + "Attempt to mutate your git repository so gitversion has enough information (local branches, commit history etc) to calculate.")); + this.Handler = CommandHandler.Create(ExecuteAsync); + } + + private async Task ExecuteAsync(bool? normalize) + { + if (normalize ?? false) + { + await Normalize(); + } + + var variables = this.gitversionTool.CalculateVersionVariables(); + console.WriteLine(variables.ToString()); + } + + private Task Normalize() + { + throw new NotImplementedException(); + } + } +} diff --git a/src/GitVersionExe/Commands/GitVersionRootCommand.cs b/src/GitVersionExe/Commands/GitVersionRootCommand.cs new file mode 100644 index 0000000000..6416cb635b --- /dev/null +++ b/src/GitVersionExe/Commands/GitVersionRootCommand.cs @@ -0,0 +1,19 @@ +using Microsoft.Extensions.Options; +using System.CommandLine; + +namespace GitVersion +{ + public class GitVersionRootCommand : RootCommand + { + public GitVersionRootCommand(CalculateCommand calculateCommand, IOptions globalOptions) : base("Versioning for your git repository, solved!") + { + // this.AddGlobalOption() + //this.AddGlobalOption(new Option("--target-path") { Argument = new Argument() }); + //this.AddGlobalOption(new Option("--logging-method") { Argument = new Argument() }); + GlobalOptions = globalOptions.Value; + this.AddCommand(calculateCommand); + } + + public GitVersionOptions GlobalOptions { get; } + } +} diff --git a/src/GitVersionExe/Commands/LoggingMethod.cs b/src/GitVersionExe/Commands/LoggingMethod.cs new file mode 100644 index 0000000000..62d6df3003 --- /dev/null +++ b/src/GitVersionExe/Commands/LoggingMethod.cs @@ -0,0 +1,8 @@ +namespace GitVersion +{ + public enum LoggingMethod + { + Console = 1, + File = 2, + } +} diff --git a/src/GitVersionExe/GitVersionApp.cs b/src/GitVersionExe/GitVersionApp.cs index 1652c71966..c7619280e3 100644 --- a/src/GitVersionExe/GitVersionApp.cs +++ b/src/GitVersionExe/GitVersionApp.cs @@ -14,7 +14,11 @@ internal class GitVersionApp : IHostedService private readonly ILog log; private readonly IOptions options; - public GitVersionApp(IHostApplicationLifetime applicationLifetime, IGitVersionExecutor gitVersionExecutor, ILog log, IOptions options) + public GitVersionApp( + IHostApplicationLifetime applicationLifetime, + IGitVersionExecutor gitVersionExecutor, + ILog log, + IOptions options) { this.options = options ?? throw new ArgumentNullException(nameof(options)); this.applicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime)); diff --git a/src/GitVersionExe/GitVersionExe.csproj b/src/GitVersionExe/GitVersionExe.csproj index 7424ee3d7d..d346d4beb8 100644 --- a/src/GitVersionExe/GitVersionExe.csproj +++ b/src/GitVersionExe/GitVersionExe.csproj @@ -27,9 +27,17 @@ + + + + + + + + diff --git a/src/GitVersionExe/GitVersionExeModule.cs b/src/GitVersionExe/GitVersionExeModule.cs index df4e5e7a96..6442185a18 100644 --- a/src/GitVersionExe/GitVersionExeModule.cs +++ b/src/GitVersionExe/GitVersionExeModule.cs @@ -6,14 +6,11 @@ public class GitVersionExeModule : IGitVersionModule { public void RegisterTypes(IServiceCollection services) { - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - - services.AddTransient(); } } } diff --git a/src/GitVersionExe/GitVersionExecutor.cs b/src/GitVersionExe/GitVersionExecutor.cs index 9fb4cc2e66..8dd540f42e 100644 --- a/src/GitVersionExe/GitVersionExecutor.cs +++ b/src/GitVersionExe/GitVersionExecutor.cs @@ -1,4 +1,5 @@ using System; +using System.CommandLine; using System.IO; using System.Reflection; using GitVersion.Configuration; @@ -11,37 +12,38 @@ namespace GitVersion public class GitVersionExecutor : IGitVersionExecutor { private readonly ILog log; - private readonly IConsole console; + private readonly Logging.IConsole console; private readonly IConfigFileLocator configFileLocator; private readonly IHelpWriter helpWriter; - private readonly IExecCommand execCommand; + private readonly GitVersionRootCommand execCommand; private readonly IConfigProvider configProvider; - private readonly IGitVersionTool gitVersionTool; private readonly IVersionWriter versionWriter; - public GitVersionExecutor(ILog log, IConsole console, - IConfigFileLocator configFileLocator, IConfigProvider configProvider, IGitVersionTool gitVersionTool, - IVersionWriter versionWriter, IHelpWriter helpWriter, IExecCommand execCommand) + public GitVersionExecutor(ILog log, + Logging.IConsole console, + IConfigFileLocator configFileLocator, + IConfigProvider configProvider, + IVersionWriter versionWriter, + IHelpWriter helpWriter, + GitVersionRootCommand execCommand) { this.log = log ?? throw new ArgumentNullException(nameof(log)); this.console = console ?? throw new ArgumentNullException(nameof(console)); this.configFileLocator = configFileLocator ?? throw new ArgumentNullException(nameof(configFileLocator)); this.configProvider = configProvider ?? throw new ArgumentNullException(nameof(configFileLocator)); - this.gitVersionTool = gitVersionTool ?? throw new ArgumentNullException(nameof(gitVersionTool)); - this.versionWriter = versionWriter ?? throw new ArgumentNullException(nameof(versionWriter)); this.helpWriter = helpWriter ?? throw new ArgumentNullException(nameof(helpWriter)); this.execCommand = execCommand ?? throw new ArgumentNullException(nameof(execCommand)); } - public int Execute(GitVersionOptions gitVersionOptions) + public int Execute(GitVersionOptions options) { - if (!HandleNonMainCommand(gitVersionOptions, out var exitCode)) - { - exitCode = RunGitVersionTool(gitVersionOptions); - } + //if (!HandleNonMainCommand(gitVersionOptions, out var exitCode)) + //{ + int exitCode = RunGitVersionCommand(options); + // } if (exitCode != 0) { @@ -52,17 +54,14 @@ public int Execute(GitVersionOptions gitVersionOptions) return exitCode; } - private int RunGitVersionTool(GitVersionOptions gitVersionOptions) + private int RunGitVersionCommand(GitVersionOptions gitVersionOptions) { try { - var variables = gitVersionTool.CalculateVersionVariables(); - - gitVersionTool.OutputVariables(variables); - gitVersionTool.UpdateAssemblyInfo(variables); - gitVersionTool.UpdateWixVersionFile(variables); - - execCommand.Execute(variables); + //gitVersionTool.OutputVariables(variables); + //gitVersionTool.UpdateAssemblyInfo(variables); + //gitVersionTool.UpdateWixVersionFile(variables); + return execCommand.InvokeAsync(gitVersionOptions.Args).Result; } catch (WarningException exception) { @@ -91,9 +90,9 @@ private int RunGitVersionTool(GitVersionOptions gitVersionOptions) return 1; } - return 0; } + [Obsolete("Refactor these into commands")] private bool HandleNonMainCommand(GitVersionOptions gitVersionOptions, out int exitCode) { if (gitVersionOptions == null) @@ -125,12 +124,8 @@ private bool HandleNonMainCommand(GitVersionOptions gitVersionOptions, out int e gitVersionOptions.Output.Add(OutputType.BuildServer); } -#pragma warning disable CS0612 // Type or member is obsolete - if (!string.IsNullOrEmpty(gitVersionOptions.Proj) || !string.IsNullOrEmpty(gitVersionOptions.Exec)) -#pragma warning restore CS0612 // Type or member is obsolete - { - gitVersionOptions.Output.Add(OutputType.BuildServer); - } + gitVersionOptions.Output.Add(OutputType.BuildServer); + ConfigureLogging(gitVersionOptions, log); @@ -173,12 +168,13 @@ private bool HandleNonMainCommand(GitVersionOptions gitVersionOptions, out int e private static void ConfigureLogging(GitVersionOptions gitVersionOptions, ILog log) { - if (gitVersionOptions.Output.Contains(OutputType.BuildServer) || gitVersionOptions.LogFilePath == "console" || gitVersionOptions.Init) + // Could always log to console unless by default. + // We can log variables within a control statement when log output to console is enabled. + if (gitVersionOptions.LogToConsole) { log.AddLogAppender(new ConsoleAppender()); } - - if (gitVersionOptions.LogFilePath != null && gitVersionOptions.LogFilePath != "console") + else if (gitVersionOptions.LogFilePath != null && gitVersionOptions.LogFilePath != "console") { log.AddLogAppender(new FileAppender(gitVersionOptions.LogFilePath)); } diff --git a/src/GitVersionExe/IArgumentParser.cs b/src/GitVersionExe/IArgumentParser.cs deleted file mode 100644 index d557a9b3e0..0000000000 --- a/src/GitVersionExe/IArgumentParser.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace GitVersion -{ - public interface IArgumentParser - { - Arguments ParseArguments(string commandLineArguments); - Arguments ParseArguments(string[] commandLineArguments); - } -} diff --git a/src/GitVersionExe/IGitVersionExecutor.cs b/src/GitVersionExe/IGitVersionExecutor.cs index e30a7e0b4a..38c39b7df7 100644 --- a/src/GitVersionExe/IGitVersionExecutor.cs +++ b/src/GitVersionExe/IGitVersionExecutor.cs @@ -2,6 +2,6 @@ namespace GitVersion { public interface IGitVersionExecutor { - int Execute(GitVersionOptions gitVersionOptions); + int Execute(GitVersionOptions options); } } diff --git a/src/GitVersionExe/Program.cs b/src/GitVersionExe/Program.cs index 02096df03b..295fdf8db3 100644 --- a/src/GitVersionExe/Program.cs +++ b/src/GitVersionExe/Program.cs @@ -1,4 +1,8 @@ using System; +using System.CommandLine; +using System.CommandLine.Invocation; +using System.IO.IsolatedStorage; +using System.Runtime.CompilerServices; using System.Threading.Tasks; using GitVersion.Extensions; using Microsoft.Extensions.Configuration; @@ -38,16 +42,33 @@ private IHostBuilder CreateHostBuilder(string[] args) => services.AddModule(new GitVersionCoreModule()); services.AddModule(new GitVersionExeModule()); - services.AddSingleton(sp => - { - var arguments = sp.GetService().ParseArguments(args); - var gitVersionOptions = arguments.ToOptions(); - return Options.Create(gitVersionOptions); - }); + // return Options.Create(gitVersionOptions); + + //services.AddSingleton(sp => + //{ + // var arguments = sp.GetService().ParseArguments(args); + // var gitVersionOptions = arguments.ToOptions(); + + //}); + services.AddOptions() + .PostConfigure(a => a.Args = args); + + services.AddSingleton(); + services.AddSingleton(); + //services.AddSingleton(sp => + //{ + // return BuildCommand(sp); + //}); overrides?.Invoke(services); services.AddHostedService(); }) .UseConsoleLifetime(); + + //private static RootCommand BuildCommand(IServiceProvider serviceProvider) + //{ + // var rootCommand = ActivatorUtilities.GetServiceOrCreateInstance(serviceProvider); + // return rootCommand; + //} } } diff --git a/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj b/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj index fb1d1d86f6..a7e78fcdf6 100644 --- a/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj +++ b/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj @@ -33,8 +33,6 @@ - - diff --git a/src/GitVersionTask/GitVersionTask.csproj b/src/GitVersionTask/GitVersionTask.csproj index 118c49401c..42b090dc0d 100644 --- a/src/GitVersionTask/GitVersionTask.csproj +++ b/src/GitVersionTask/GitVersionTask.csproj @@ -24,7 +24,6 @@ - From 46dc5af5fc294705f04e15b186ccc1f2beabd30b Mon Sep 17 00:00:00 2001 From: Darrell Tunnell Date: Sat, 9 May 2020 19:23:45 +0100 Subject: [PATCH 2/2] Global Option example working. --- .../Commands/CalculateCommand.cs | 34 ++++++--- .../Commands/GitVersionRootCommand.cs | 18 ++--- src/GitVersionExe/GitVersionApp.cs | 23 +++--- .../GitVersionCommandExecutor.cs | 74 +++++++++++++++++++ src/GitVersionExe/GitVersionExecutor.cs | 5 +- src/GitVersionExe/GlobalCommandOptions.cs | 9 +++ src/GitVersionExe/Program.cs | 2 + .../Properties/launchSettings.json | 8 ++ 8 files changed, 138 insertions(+), 35 deletions(-) create mode 100644 src/GitVersionExe/GitVersionCommandExecutor.cs create mode 100644 src/GitVersionExe/GlobalCommandOptions.cs create mode 100644 src/GitVersionExe/Properties/launchSettings.json diff --git a/src/GitVersionExe/Commands/CalculateCommand.cs b/src/GitVersionExe/Commands/CalculateCommand.cs index 7a139cafd0..fe78fd0a0d 100644 --- a/src/GitVersionExe/Commands/CalculateCommand.cs +++ b/src/GitVersionExe/Commands/CalculateCommand.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Options; +using GitVersion.Extensions; +using GitVersion.Logging; using System; using System.CommandLine; using System.CommandLine.Invocation; @@ -6,30 +7,39 @@ namespace GitVersion { + public class CalculateCommand : Command { - private readonly IGitVersionTool gitversionTool; private readonly Logging.IConsole console; + private readonly IGitVersionTool gitversionTool; + private readonly GitVersionCommandExecutor executor; - public CalculateCommand(IGitVersionTool gitversionTool, Logging.IConsole console) : base("calculate", "Calculates version information from your git repository") + public CalculateCommand(Logging.IConsole console, IGitVersionTool gitversionTool, GitVersionCommandExecutor executor) : base("calculate", "Calculates version information from your git repository") { - this.gitversionTool = gitversionTool; this.console = console; + this.gitversionTool = gitversionTool; + this.executor = executor; this.AddOption(new Option( "--normalize", "Attempt to mutate your git repository so gitversion has enough information (local branches, commit history etc) to calculate.")); - this.Handler = CommandHandler.Create(ExecuteAsync); - } + this.Handler = CommandHandler.Create(ExecuteAsync); + } - private async Task ExecuteAsync(bool? normalize) + private async Task ExecuteAsync(GlobalCommandOptions globalOptions, bool? normalize) { - if (normalize ?? false) + // The executor wraps execution of the command logic inside somethng that + // will do error handling according to the old behaviour. + return await executor.Execute(globalOptions, async () => { - await Normalize(); - } + if (normalize ?? false) + { + await Normalize(); + } - var variables = this.gitversionTool.CalculateVersionVariables(); - console.WriteLine(variables.ToString()); + var variables = this.gitversionTool.CalculateVersionVariables(); + console.WriteLine(variables.ToString()); + return 0; + }); } private Task Normalize() diff --git a/src/GitVersionExe/Commands/GitVersionRootCommand.cs b/src/GitVersionExe/Commands/GitVersionRootCommand.cs index 6416cb635b..9af5d773c7 100644 --- a/src/GitVersionExe/Commands/GitVersionRootCommand.cs +++ b/src/GitVersionExe/Commands/GitVersionRootCommand.cs @@ -1,19 +1,19 @@ -using Microsoft.Extensions.Options; using System.CommandLine; namespace GitVersion { public class GitVersionRootCommand : RootCommand { - public GitVersionRootCommand(CalculateCommand calculateCommand, IOptions globalOptions) : base("Versioning for your git repository, solved!") + public GitVersionRootCommand(CalculateCommand calculateCommand) : base("Versioning for your git repository, solved!") { - // this.AddGlobalOption() - //this.AddGlobalOption(new Option("--target-path") { Argument = new Argument() }); - //this.AddGlobalOption(new Option("--logging-method") { Argument = new Argument() }); - GlobalOptions = globalOptions.Value; - this.AddCommand(calculateCommand); - } + var loggingMethodOptions = new Option("--logging-method") { Argument = new Argument() }; + this.AddGlobalOption(loggingMethodOptions); + + var logFileOption = new Option("--logfilepath") { Argument = new Argument { } }; + logFileOption.Required = false; + this.AddGlobalOption(logFileOption); - public GitVersionOptions GlobalOptions { get; } + this.AddCommand(calculateCommand); + } } } diff --git a/src/GitVersionExe/GitVersionApp.cs b/src/GitVersionExe/GitVersionApp.cs index c7619280e3..042e2dfdca 100644 --- a/src/GitVersionExe/GitVersionApp.cs +++ b/src/GitVersionExe/GitVersionApp.cs @@ -1,4 +1,5 @@ using System; +using System.CommandLine; using System.Threading; using System.Threading.Tasks; using GitVersion.Logging; @@ -10,37 +11,33 @@ namespace GitVersion internal class GitVersionApp : IHostedService { private readonly IHostApplicationLifetime applicationLifetime; - private readonly IGitVersionExecutor gitVersionExecutor; + private readonly GitVersionRootCommand command; + // private readonly IGitVersionExecutor gitVersionExecutor; private readonly ILog log; private readonly IOptions options; - public GitVersionApp( - IHostApplicationLifetime applicationLifetime, - IGitVersionExecutor gitVersionExecutor, - ILog log, - IOptions options) + public GitVersionApp(IHostApplicationLifetime applicationLifetime, GitVersionRootCommand command, ILog log, IOptions options) { this.options = options ?? throw new ArgumentNullException(nameof(options)); this.applicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime)); - this.gitVersionExecutor = gitVersionExecutor ?? throw new ArgumentNullException(nameof(gitVersionExecutor)); + this.command = command; + // this.gitVersionExecutor = gitVersionExecutor ?? throw new ArgumentNullException(nameof(gitVersionExecutor)); this.log = log ?? throw new ArgumentNullException(nameof(log)); } - public Task StartAsync(CancellationToken cancellationToken) + public async Task StartAsync(CancellationToken cancellationToken) { try { - var gitVersionOptions = options.Value; - log.Verbosity = gitVersionOptions.Verbosity; - System.Environment.ExitCode = gitVersionExecutor.Execute(gitVersionOptions); + System.Environment.ExitCode = await command.InvokeAsync(options.Value.Args); + // log.Verbosity = gitVersionOptions.Verbosity; // not sure how to get verbosity now. } catch (Exception exception) - { + { Console.Error.WriteLine(exception.Message); System.Environment.ExitCode = 1; } applicationLifetime.StopApplication(); - return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) diff --git a/src/GitVersionExe/GitVersionCommandExecutor.cs b/src/GitVersionExe/GitVersionCommandExecutor.cs new file mode 100644 index 0000000000..c9f20a011e --- /dev/null +++ b/src/GitVersionExe/GitVersionCommandExecutor.cs @@ -0,0 +1,74 @@ +using GitVersion.Extensions; +using GitVersion.Logging; +using System; +using System.Threading.Tasks; + +namespace GitVersion +{ + /// + /// The purpose of this class is to wrap execution of each subcommand's logic, + /// to have a centralised location to handle exceptions, and log those exceptions, + /// based on the global option arguments used to control log output. + /// + /// This is evolving in a similar way to but for executing the new commands, and using the GlobalOptions for the new cli instead. + /// Allowing to serve as a reference until the port is finished. + /// + public class GitVersionCommandExecutor + { + public GitVersionCommandExecutor(ILog log) + { + Log = log; + } + + public async Task Execute(GlobalCommandOptions globalOptions, Func> execute) + { + if (globalOptions.LoggingMethod == LoggingMethod.Console) + { + Log.AddLogAppender(new ConsoleAppender()); + } + else if (globalOptions.LoggingMethod == LoggingMethod.File && globalOptions.LogFilePath != "console") + { + Log.AddLogAppender(new FileAppender(globalOptions.LogFilePath)); + } + + try + { + //gitVersionTool.OutputVariables(variables); + //gitVersionTool.UpdateAssemblyInfo(variables); + //gitVersionTool.UpdateWixVersionFile(variables); + var result = await execute.Invoke(); + return result; + } + catch (WarningException exception) + { + var error = $"An error occurred:{System.Environment.NewLine}{exception.Message}"; + Log.Warning(error); + return 1; + } + catch (Exception exception) + { + var error = $"An unexpected error occurred:{System.Environment.NewLine}{exception}"; + Log.Error(error); + + Log.Info("Attempting to show the current git graph (please include in issue): "); + Log.Info("Showing max of 100 commits"); + + try + { + // I am not sure here if we should be passing in working directory, or the dot git directory? + // current behaviour was to pass in working directory (environment current directory) so sticking with that. + LibGitExtensions.DumpGraph(globalOptions.WorkingDirectory, mess => Log.Info(mess), 100); + } + catch (Exception dumpGraphException) + { + Log.Error("Couldn't dump the git graph due to the following error: " + dumpGraphException); + } + return 1; + } + + + } + + public ILog Log { get; set; } + } +} diff --git a/src/GitVersionExe/GitVersionExecutor.cs b/src/GitVersionExe/GitVersionExecutor.cs index 8dd540f42e..54f8031314 100644 --- a/src/GitVersionExe/GitVersionExecutor.cs +++ b/src/GitVersionExe/GitVersionExecutor.cs @@ -1,6 +1,7 @@ using System; using System.CommandLine; using System.IO; +using System.Linq; using System.Reflection; using GitVersion.Configuration; using GitVersion.Extensions; @@ -19,7 +20,8 @@ public class GitVersionExecutor : IGitVersionExecutor private readonly IConfigProvider configProvider; private readonly IVersionWriter versionWriter; - public GitVersionExecutor(ILog log, + public GitVersionExecutor( + ILog log, Logging.IConsole console, IConfigFileLocator configFileLocator, IConfigProvider configProvider, @@ -170,6 +172,7 @@ private static void ConfigureLogging(GitVersionOptions gitVersionOptions, ILog l { // Could always log to console unless by default. // We can log variables within a control statement when log output to console is enabled. + //if(execCommand.Options.Contains()) if (gitVersionOptions.LogToConsole) { log.AddLogAppender(new ConsoleAppender()); diff --git a/src/GitVersionExe/GlobalCommandOptions.cs b/src/GitVersionExe/GlobalCommandOptions.cs new file mode 100644 index 0000000000..2eccf5e00c --- /dev/null +++ b/src/GitVersionExe/GlobalCommandOptions.cs @@ -0,0 +1,9 @@ +namespace GitVersion +{ + public class GlobalCommandOptions + { + public string WorkingDirectory { get; set; } = System.Environment.CurrentDirectory; + public LoggingMethod LoggingMethod { get; set; } + public string LogFilePath { get; set; } + } +} diff --git a/src/GitVersionExe/Program.cs b/src/GitVersionExe/Program.cs index 295fdf8db3..6ce358c1d1 100644 --- a/src/GitVersionExe/Program.cs +++ b/src/GitVersionExe/Program.cs @@ -53,6 +53,8 @@ private IHostBuilder CreateHostBuilder(string[] args) => services.AddOptions() .PostConfigure(a => a.Args = args); + services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); //services.AddSingleton(sp => diff --git a/src/GitVersionExe/Properties/launchSettings.json b/src/GitVersionExe/Properties/launchSettings.json new file mode 100644 index 0000000000..00494ac406 --- /dev/null +++ b/src/GitVersionExe/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "GitVersionExe": { + "commandName": "Project", + "commandLineArgs": "calculate --logging-method Console" + } + } +} \ No newline at end of file