Skip to content

Commit 71bb08d

Browse files
committed
refactors program initialization
Replaces old `Program` class with a new `CliHost` implementation for building the application. Removes unnecessary code and simplifies service configuration and application setup.
1 parent e979954 commit 71bb08d

File tree

4 files changed

+60
-49
lines changed

4 files changed

+60
-49
lines changed

src/GitVersion.App.Tests/Helpers/ProgramFixture.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,18 @@ public Task<ExecutionResults> Run(string arg)
5555

5656
public async Task<ExecutionResults> Run(params string[] args)
5757
{
58-
// Create the application and override registrations.
59-
var program = new Program(builder => Overrides.ForEach(action => action(builder)));
60-
6158
if (!this.workingDirectory.IsNullOrWhiteSpace())
6259
{
6360
args = ["-targetpath", this.workingDirectory, .. args];
6461
}
65-
await program.RunAsync(args);
62+
63+
var builder = CliHost.CreateCliHostBuilder(args);
64+
65+
Overrides.ForEach(action => action(builder.Services));
66+
67+
var host = builder.Build();
68+
var app = host.Services.GetRequiredService<GitVersionApp>();
69+
await app.RunAsync(CancellationToken.None);
6670

6771
return new(SysEnv.ExitCode, this.output.Value, this.logger.Value);
6872
}

src/GitVersion.App/CliHost.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using GitVersion.Agents;
2+
using GitVersion.Configuration;
3+
using GitVersion.Extensions;
4+
using GitVersion.Output;
5+
using Microsoft.Extensions.DependencyInjection;
6+
using Microsoft.Extensions.Hosting;
7+
using Microsoft.Extensions.Options;
8+
9+
namespace GitVersion;
10+
11+
internal static class CliHost
12+
{
13+
internal static HostApplicationBuilder CreateCliHostBuilder(string[] args)
14+
{
15+
var builder = Host.CreateApplicationBuilder(args);
16+
17+
builder.Services.AddModule(new GitVersionCoreModule());
18+
builder.Services.AddModule(new GitVersionLibGit2SharpModule());
19+
builder.Services.AddModule(new GitVersionBuildAgentsModule());
20+
builder.Services.AddModule(new GitVersionConfigurationModule());
21+
builder.Services.AddModule(new GitVersionOutputModule());
22+
builder.Services.AddModule(new GitVersionAppModule());
23+
24+
builder.Services.AddSingleton(sp =>
25+
{
26+
var arguments = sp.GetRequiredService<IArgumentParser>().ParseArguments(args);
27+
var gitVersionOptions = arguments.ToOptions();
28+
return Options.Create(gitVersionOptions);
29+
});
30+
31+
builder.Services.AddSingleton<GitVersionApp>();
32+
33+
return builder;
34+
}
35+
}

src/GitVersion.App/GitVersionApp.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,18 @@
55

66
namespace GitVersion;
77

8-
internal class GitVersionApp(ILog log, IHostApplicationLifetime applicationLifetime, IGitVersionExecutor gitVersionExecutor, IOptions<GitVersionOptions> options)
9-
: IHostedService
8+
internal class GitVersionApp(
9+
ILog log,
10+
IHostApplicationLifetime applicationLifetime,
11+
IGitVersionExecutor gitVersionExecutor,
12+
IOptions<GitVersionOptions> options)
1013
{
1114
private readonly ILog log = log.NotNull();
1215
private readonly IHostApplicationLifetime applicationLifetime = applicationLifetime.NotNull();
1316
private readonly IGitVersionExecutor gitVersionExecutor = gitVersionExecutor.NotNull();
1417
private readonly IOptions<GitVersionOptions> options = options.NotNull();
1518

16-
public Task StartAsync(CancellationToken cancellationToken)
19+
public Task RunAsync(CancellationToken _)
1720
{
1821
try
1922
{
@@ -30,6 +33,4 @@ public Task StartAsync(CancellationToken cancellationToken)
3033
this.applicationLifetime.StopApplication();
3134
return Task.CompletedTask;
3235
}
33-
34-
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
3536
}

src/GitVersion.App/Program.cs

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,16 @@
1-
using GitVersion.Agents;
2-
using GitVersion.Configuration;
3-
using GitVersion.Extensions;
4-
using GitVersion.Output;
5-
using Microsoft.Extensions.Configuration;
1+
using GitVersion;
62
using Microsoft.Extensions.DependencyInjection;
7-
using Microsoft.Extensions.Hosting;
8-
using Microsoft.Extensions.Options;
93

10-
namespace GitVersion;
4+
var builder = CliHost.CreateCliHostBuilder(args);
115

12-
internal class Program
13-
{
14-
private readonly Action<IServiceCollection>? overrides;
15-
16-
internal Program(Action<IServiceCollection>? overrides = null) => this.overrides = overrides;
17-
18-
private static async Task Main(string[] args) => await new Program().RunAsync(args);
6+
var host = builder.Build();
7+
var app = host.Services.GetRequiredService<GitVersionApp>();
198

20-
internal Task RunAsync(string[] args) => CreateHostBuilder(args).Build().RunAsync();
21-
22-
private IHostBuilder CreateHostBuilder(string[] args) =>
23-
new HostBuilder()
24-
.ConfigureAppConfiguration((_, configApp) => configApp.AddCommandLine(args))
25-
.ConfigureServices((_, services) =>
26-
{
27-
services.AddModule(new GitVersionCoreModule());
28-
services.AddModule(new GitVersionLibGit2SharpModule());
29-
services.AddModule(new GitVersionBuildAgentsModule());
30-
services.AddModule(new GitVersionConfigurationModule());
31-
services.AddModule(new GitVersionOutputModule());
32-
services.AddModule(new GitVersionAppModule());
33-
34-
services.AddSingleton(sp =>
35-
{
36-
var arguments = sp.GetRequiredService<IArgumentParser>().ParseArguments(args);
37-
var gitVersionOptions = arguments.ToOptions();
38-
return Options.Create(gitVersionOptions);
39-
});
9+
var cts = new CancellationTokenSource();
10+
Console.CancelKeyPress += (_, _) =>
11+
{
12+
cts.Cancel();
13+
cts.Dispose();
14+
};
4015

41-
this.overrides?.Invoke(services);
42-
services.AddHostedService<GitVersionApp>();
43-
})
44-
.UseConsoleLifetime();
45-
}
16+
await app.RunAsync(cts.Token).ConfigureAwait(false);

0 commit comments

Comments
 (0)