From 1fa0251c12f95fd8b3c590a5f7c1862124789bcd Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Wed, 19 Feb 2025 20:09:12 +0100 Subject: [PATCH] feat: Prepare AOT support --- .github/workflows/build.yml | 2 +- README.md | 2 +- src/Accelerate/Accelerate.csproj | 14 +++--- src/Accelerate/Campaign.cs | 7 +-- src/Accelerate/Program.cs | 2 +- src/Accelerate/Repositories/AzureDevOps.cs | 44 ++++++++++++++++--- .../Repositories/RepositoryCollection.cs | 4 +- src/Accelerate/SourceGenerationContext.cs | 8 ++++ .../Accelerate.Tests/Accelerate.Tests.csproj | 8 ++-- .../RepositoryCollectionTest.cs | 1 - .../Accelerate.Tests/Workflow/WorkflowTest.cs | 12 ++--- 11 files changed, 73 insertions(+), 31 deletions(-) create mode 100644 src/Accelerate/SourceGenerationContext.cs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 942ed84..dfc3124 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,7 @@ jobs: run: | git config --global user.email "9199345+HofmeisterAn@users.noreply.github.com" git config --global user.name "Andre Hofmeister" - echo "${{ github.WORKSPACE }}/src/Accelerate/bin/${{ env.CONFIGURATION }}/net6.0/" >> $GITHUB_PATH + echo "${{ github.WORKSPACE }}/src/Accelerate/bin/${{ env.CONFIGURATION }}/net8.0/" >> $GITHUB_PATH - name: Test Workflow run: | workflow_git_dir="HofmeisterAn/GitHub/_git/testcontainers-dotnet-docker-compose/" diff --git a/README.md b/README.md index 8fe3141..b149df5 100644 --- a/README.md +++ b/README.md @@ -34,4 +34,4 @@ After initializing a new campaign using the command `dotnet accelerate init --na ## Copyright -Copyright (c) 2024 Andre Hofmeister and other authors. \ No newline at end of file +Copyright (c) 2025 Andre Hofmeister and other authors. \ No newline at end of file diff --git a/src/Accelerate/Accelerate.csproj b/src/Accelerate/Accelerate.csproj index 6e6ab4c..ab980fa 100644 --- a/src/Accelerate/Accelerate.csproj +++ b/src/Accelerate/Accelerate.csproj @@ -1,24 +1,28 @@ Exe - net6.0 + net8.0 enable true + false + true dotnet-accelerate - Copyright (c) 2024 Andre Hofmeister and other authors + Copyright (c) 2025 Andre Hofmeister and other authors Andre Hofmeister and contributors LICENSE git https://github.com/HofmeisterAn/accelerate + - - - + + + diff --git a/src/Accelerate/Campaign.cs b/src/Accelerate/Campaign.cs index 708aae1..78622c1 100644 --- a/src/Accelerate/Campaign.cs +++ b/src/Accelerate/Campaign.cs @@ -92,7 +92,8 @@ public async Task CloneAsync(CancellationToken ct = default) throw new AccelerateException(AccelerateErrorCode.GitCommandExecutionFailed); } - var visualStudioCodeWorkspaceJson = JsonSerializer.Serialize(new VisualStudioCodeWorkspace(this, _repositories)); + var visualStudioCodeWorkspace = new VisualStudioCodeWorkspace(this, _repositories); + var visualStudioCodeWorkspaceJson = JsonSerializer.Serialize(visualStudioCodeWorkspace, SourceGenerationContext.Default.VisualStudioCodeWorkspace); await File.WriteAllTextAsync(VisualStudioCodeWorkspaceFileName, visualStudioCodeWorkspaceJson, ct); } @@ -198,7 +199,7 @@ public async Task ForeachAsync(IEnumerable command, CancellationToken ct } } - private sealed class VisualStudioCodeWorkspace + public sealed class VisualStudioCodeWorkspace { public VisualStudioCodeWorkspace(Campaign campaign, IEnumerable repositories) { @@ -209,7 +210,7 @@ public VisualStudioCodeWorkspace(Campaign campaign, IEnumerable repo public IReadOnlyList Folders { get; } } - private sealed class VisualStudioCodeFolder + public sealed class VisualStudioCodeFolder { public VisualStudioCodeFolder(string name, string path) { diff --git a/src/Accelerate/Program.cs b/src/Accelerate/Program.cs index 43c640d..4f069d6 100644 --- a/src/Accelerate/Program.cs +++ b/src/Accelerate/Program.cs @@ -8,7 +8,7 @@ public AccelerateHostBuilder(params string[] args) { ConfigureAppConfiguration((_, configurationBuilder) => { - configurationBuilder.SetBasePath(Path.GetDirectoryName(GetType().Assembly.Location)); + configurationBuilder.SetBasePath(AppContext.BaseDirectory); }) .ConfigureServices((hostBuilder, serviceCollection) => { diff --git a/src/Accelerate/Repositories/AzureDevOps.cs b/src/Accelerate/Repositories/AzureDevOps.cs index 17c40e4..74c624d 100644 --- a/src/Accelerate/Repositories/AzureDevOps.cs +++ b/src/Accelerate/Repositories/AzureDevOps.cs @@ -35,7 +35,13 @@ public async Task CloneAsync(Campaign campaign, AzureDevOps repository, Ca var workDir = Path.Combine(campaign.WorkingDirectoryPath, repository.WorkingDirectoryPath); var args = new[] { "clone", repository.Url.ToString(), "." }; _ = Directory.CreateDirectory(workDir); - var commandResult = await Cli.Wrap(GitCli).WithWorkingDirectory(workDir).WithArguments(args).WithValidation(CommandResultValidation.None).ExecuteBufferedAsync(ct); + + var commandResult = await Cli.Wrap(GitCli) + .WithWorkingDirectory(workDir) + .WithArguments(args) + .WithValidation(CommandResultValidation.None) + .ExecuteBufferedAsync(ct); + return LogAndValidate(campaign, repository, commandResult, 0, 128); } @@ -43,7 +49,13 @@ public async Task CheckoutAsync(Campaign campaign, AzureDevOps repository, { var workDir = Path.Combine(campaign.WorkingDirectoryPath, repository.WorkingDirectoryPath); var args = new[] { "checkout", "-b", campaign.Name, "--track" }; - var commandResult = await Cli.Wrap(GitCli).WithWorkingDirectory(workDir).WithArguments(args).WithValidation(CommandResultValidation.None).ExecuteBufferedAsync(ct); + + var commandResult = await Cli.Wrap(GitCli) + .WithWorkingDirectory(workDir) + .WithArguments(args) + .WithValidation(CommandResultValidation.None) + .ExecuteBufferedAsync(ct); + return LogAndValidate(campaign, repository, commandResult, 0); } @@ -51,7 +63,13 @@ public async Task CommitAsync(Campaign campaign, AzureDevOps repository, s { var workDir = Path.Combine(campaign.WorkingDirectoryPath, repository.WorkingDirectoryPath); var args = new[] { "commit", "--all", "--message", message }; - var commandResult = await Cli.Wrap(GitCli).WithWorkingDirectory(workDir).WithArguments(args).WithValidation(CommandResultValidation.None).ExecuteBufferedAsync(ct); + + var commandResult = await Cli.Wrap(GitCli) + .WithWorkingDirectory(workDir) + .WithArguments(args) + .WithValidation(CommandResultValidation.None) + .ExecuteBufferedAsync(ct); + return LogAndValidate(campaign, repository, commandResult, 0); } @@ -59,7 +77,13 @@ public async Task PushAsync(Campaign campaign, AzureDevOps repository, Can { var workDir = Path.Combine(campaign.WorkingDirectoryPath, repository.WorkingDirectoryPath); var args = new[] { "push", "--set-upstream", "origin", campaign.Name }; - var commandResult = await Cli.Wrap(GitCli).WithWorkingDirectory(workDir).WithArguments(args).WithValidation(CommandResultValidation.None).ExecuteBufferedAsync(ct); + + var commandResult = await Cli.Wrap(GitCli) + .WithWorkingDirectory(workDir) + .WithArguments(args) + .WithValidation(CommandResultValidation.None) + .ExecuteBufferedAsync(ct); + return LogAndValidate(campaign, repository, commandResult, 0); } @@ -97,7 +121,7 @@ public async Task CreatePullRequestsAsync(Campaign campaign, AzureDevOps r var parameter = Convert.ToBase64String(Encoding.Default.GetBytes(":" + _azureDevOpsSettings.Value.AuthToken)); - var jsonString = JsonSerializer.Serialize(prRequestBody); + var jsonString = JsonSerializer.Serialize(prRequestBody, SourceGenerationContext.Default.DictionaryStringString); using var httpClient = new HttpClient(); @@ -122,11 +146,17 @@ public async Task ForeachAsync(Campaign campaign, AzureDevOps repository, { var workDir = Path.Combine(campaign.WorkingDirectoryPath, repository.WorkingDirectoryPath); var args = new[] { "-c", string.Join(' ', command) }; - var commandResult = await Cli.Wrap(_shellSettings.Value.Shell).WithWorkingDirectory(workDir).WithArguments(args).WithValidation(CommandResultValidation.None).ExecuteBufferedAsync(ct); + + var commandResult = await Cli.Wrap(_shellSettings.Value.Shell) + .WithWorkingDirectory(workDir) + .WithArguments(args) + .WithValidation(CommandResultValidation.None) + .ExecuteBufferedAsync(ct); + return LogAndValidate(campaign, repository, commandResult, 0); } - private bool LogAndValidate(Campaign campaign, AzureDevOps repository, BufferedCommandResult result, params int[] successExitCodes) + private bool LogAndValidate(Campaign _, AzureDevOps repository, BufferedCommandResult result, params int[] successExitCodes) { if (_logger.IsEnabled(LogLevel.Debug)) { diff --git a/src/Accelerate/Repositories/RepositoryCollection.cs b/src/Accelerate/Repositories/RepositoryCollection.cs index dada51e..3af2172 100644 --- a/src/Accelerate/Repositories/RepositoryCollection.cs +++ b/src/Accelerate/Repositories/RepositoryCollection.cs @@ -45,10 +45,10 @@ public RepositoryCollection(string jsonString) switch (typeName) { case "Accelerate.Repositories.AzureDevOps": - repository = repoProperty.Deserialize(); + repository = repoProperty.Deserialize(SourceGenerationContext.Default.AzureDevOps); break; case "Accelerate.Repositories.GitHub": - repository = repoProperty.Deserialize(); + repository = repoProperty.Deserialize(SourceGenerationContext.Default.GitHub); break; default: throw new AccelerateException(AccelerateErrorCode.Undefined); diff --git a/src/Accelerate/SourceGenerationContext.cs b/src/Accelerate/SourceGenerationContext.cs new file mode 100644 index 0000000..aace393 --- /dev/null +++ b/src/Accelerate/SourceGenerationContext.cs @@ -0,0 +1,8 @@ +namespace Accelerate; + +[JsonSerializable(typeof(Campaign.VisualStudioCodeWorkspace))] +[JsonSerializable(typeof(Campaign.VisualStudioCodeFolder))] +[JsonSerializable(typeof(AzureDevOps))] +[JsonSerializable(typeof(GitHub))] +[JsonSerializable(typeof(Dictionary))] +internal partial class SourceGenerationContext : JsonSerializerContext; \ No newline at end of file diff --git a/tests/Accelerate.Tests/Accelerate.Tests.csproj b/tests/Accelerate.Tests/Accelerate.Tests.csproj index 164834c..14f57ea 100644 --- a/tests/Accelerate.Tests/Accelerate.Tests.csproj +++ b/tests/Accelerate.Tests/Accelerate.Tests.csproj @@ -1,13 +1,13 @@ - net6.0 + net8.0 enable false - - - + + + diff --git a/tests/Accelerate.Tests/RepositoryCollectionTest.cs b/tests/Accelerate.Tests/RepositoryCollectionTest.cs index 320f1c4..a250169 100644 --- a/tests/Accelerate.Tests/RepositoryCollectionTest.cs +++ b/tests/Accelerate.Tests/RepositoryCollectionTest.cs @@ -3,7 +3,6 @@ namespace Accelerate.Tests; public sealed class RepositoryCollectionTest { [Theory] - [InlineData(null)] [InlineData("")] [InlineData("{}")] public void Constructor_WithInvalidJson_ThrowsAccelerateException(string jsonString) diff --git a/tests/Accelerate.Tests/Workflow/WorkflowTest.cs b/tests/Accelerate.Tests/Workflow/WorkflowTest.cs index 44378cd..955fad7 100644 --- a/tests/Accelerate.Tests/Workflow/WorkflowTest.cs +++ b/tests/Accelerate.Tests/Workflow/WorkflowTest.cs @@ -2,7 +2,7 @@ namespace Accelerate.Tests.Workflow; public sealed class WorkflowTest : IGitCommand, IShellCommand, IDisposable { - private readonly IList _actualCmds = new List(); + private readonly List _actualCmds = new List(); private readonly CampaignId _campaignId = new CampaignId(); @@ -10,9 +10,9 @@ public sealed class WorkflowTest : IGitCommand, IShellCommand(); - inMemorySettings.Add(string.Join(':', nameof(AzureDevOpsSettings), nameof(AzureDevOpsSettings.AuthToken)), _campaignId.Id); - inMemorySettings.Add(string.Join(':', nameof(ShellSettings), nameof(ShellSettings.Shell)), _campaignId.Id); + var inMemorySettings = new List>(); + inMemorySettings.Add(new KeyValuePair(string.Join(':', nameof(AzureDevOpsSettings), nameof(AzureDevOpsSettings.AuthToken)), _campaignId.Id)); + inMemorySettings.Add(new KeyValuePair(string.Join(':', nameof(ShellSettings), nameof(ShellSettings.Shell)), _campaignId.Id)); // When var cmd = new Cmd.Init(_campaignId, this, this) @@ -45,10 +45,10 @@ public async Task Should_Execute_Workflow_Successfully() using var cmd = cmds[step]; await cmd.InitializeAsync() - .ConfigureAwait(false); + .ConfigureAwait(true); await cmd.DisposeAsync() - .ConfigureAwait(false); + .ConfigureAwait(true); } // Then