Skip to content

Commit 9752a08

Browse files
committed
Merge pull request #4806 from arturcic/feature/replace-logging-with-ms-extensions
Replace logging own implementation with withMicrosoft Extensions Logging
2 parents bff3b59 + 05a7ad3 commit 9752a08

106 files changed

Lines changed: 981 additions & 1106 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

BREAKING_CHANGES.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,26 @@
1+
## Unreleased
2+
3+
### Logging System Replacement
4+
5+
* The custom `ILog` logging abstraction has been replaced with the industry-standard `Microsoft.Extensions.Logging` (M.E.L.) infrastructure using Serilog as the underlying provider.
6+
7+
* **Removed public types** from `GitVersion.Logging` namespace:
8+
* `ILog` interface
9+
* `ILogAppender` interface
10+
* `LogLevel` enum
11+
* `LogAction` delegate
12+
* `LogActionEntry` delegate
13+
* `LogExtensions` class
14+
15+
* **Migration for custom integrations**:
16+
* If you were injecting `ILog`, inject `ILogger<T>` instead
17+
* If you implemented `ILogAppender`, implement `ILoggerProvider` instead
18+
* The `Verbosity` enum is preserved for CLI usage and maps to Serilog log levels internally
19+
20+
* **Preserved types**:
21+
* `Verbosity` enum (Quiet/Minimal/Normal/Verbose/Diagnostic) - still used for CLI verbosity control
22+
* `IConsole` interface - moved from `GitVersion.Logging` to `GitVersion` namespace
23+
124
## v6.2.0
225

326
* The configuration property `label-number-pattern` was removed. The functionality can be still used by changing the label and the branch name regular expression for pull-request branches.

src/Directory.Build.props

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@
116116
<ItemGroup Label="MicrosoftExtensionsUsings">
117117
<Using Include="Microsoft.Extensions.DependencyInjection" />
118118
<Using Include="Microsoft.Extensions.DependencyInjection.Extensions" />
119+
<Using Include="Microsoft.Extensions.Logging" />
120+
<Using Include="Microsoft.Extensions.Logging.Abstractions" />
119121
<Using Include="Microsoft.Extensions.Options" />
120122
</ItemGroup>
121123

src/Directory.Packages.props

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@
1414
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
1515
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.3" />
1616
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.3" />
17+
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.3" />
18+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.3" />
1719
<PackageVersion Include="Microsoft.IO.Redist" Version="6.1.3" />
20+
<PackageVersion Include="Serilog" Version="4.3.0" />
21+
<PackageVersion Include="Serilog.Extensions.Hosting" Version="10.0.0" />
22+
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
23+
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
24+
<PackageVersion Include="Serilog.Sinks.Map" Version="2.0.0" />
1825
<PackageVersion Include="Polly" Version="8.6.5" />
1926
<PackageVersion Include="Roslynator.Analyzers" Version="4.15.0" />
2027
<PackageVersion Include="Roslynator.Formatting.Analyzers" Version="4.15.0" />
@@ -59,4 +66,4 @@
5966
<PackageVersion Include="Microsoft.Build.Tasks.Core" Version="18.0.2" />
6067
<PackageVersion Include="Microsoft.Build.Utilities.Core" Version="18.0.2" />
6168
</ItemGroup>
62-
</Project>
69+
</Project>

src/GitVersion.App.Tests/ArgumentParserOnBuildServerTests.cs

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/GitVersion.App.Tests/ArgumentParserTests.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public void EmptyMeansUseCurrentDirectory()
3131
arguments.TargetPath.ShouldBe(SysEnv.CurrentDirectory);
3232
arguments.LogFilePath.ShouldBe(null);
3333
arguments.IsHelp.ShouldBe(false);
34+
arguments.NoFetch.ShouldBe(false);
3435
}
3536

3637
[Test]
@@ -737,22 +738,22 @@ public void NocacheTrueWhenDefined()
737738
arguments.NoCache.ShouldBe(true);
738739
}
739740

740-
[TestCase("-verbosity x", true, Verbosity.Normal)]
741-
[TestCase("-verbosity diagnostic", false, Verbosity.Diagnostic)]
742-
[TestCase("-verbosity Minimal", false, Verbosity.Minimal)]
743-
[TestCase("-verbosity NORMAL", false, Verbosity.Normal)]
744-
[TestCase("-verbosity quiet", false, Verbosity.Quiet)]
745-
[TestCase("-verbosity Verbose", false, Verbosity.Verbose)]
741+
[TestCase("x", true, Verbosity.Normal)]
742+
[TestCase("diagnostic", false, Verbosity.Diagnostic)]
743+
[TestCase("Minimal", false, Verbosity.Minimal)]
744+
[TestCase("NORMAL", false, Verbosity.Normal)]
745+
[TestCase("quiet", false, Verbosity.Quiet)]
746+
[TestCase("Verbose", false, Verbosity.Verbose)]
746747
public void CheckVerbosityParsing(string command, bool shouldThrow, Verbosity expectedVerbosity)
747748
{
748749
if (shouldThrow)
749750
{
750-
Assert.Throws<WarningException>(() => this.argumentParser.ParseArguments(command));
751+
Assert.Throws<WarningException>(() => ArgumentParser.ParseVerbosity(command));
751752
}
752753
else
753754
{
754-
var arguments = this.argumentParser.ParseArguments(command);
755-
arguments.Verbosity.ShouldBe(expectedVerbosity);
755+
var verbosity = ArgumentParser.ParseVerbosity(command);
756+
verbosity.ShouldBe(expectedVerbosity);
756757
}
757758
}
758759

src/GitVersion.App.Tests/ExecCmdLineArgumentTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ public void LogPathContainsForwardSlash()
3737
}
3838

3939
[Theory]
40-
[TestCase("", "INFO [")]
41-
[TestCase("-verbosity NORMAL", "INFO [")]
40+
[TestCase("", "INFO")]
41+
[TestCase("-verbosity NORMAL", "INFO")]
4242
[TestCase("-verbosity quiet", "")]
4343
public void CheckBuildServerVerbosityConsole(string verbosityArg, string expectedOutput)
4444
{
@@ -80,7 +80,7 @@ public void WorkingDirectoryWithoutCommitsFailsWithInformativeMessage()
8080
{
8181
using var fixture = new EmptyRepositoryFixture();
8282

83-
var result = GitVersionHelper.ExecuteIn(fixture.RepositoryPath, null, false);
83+
var result = GitVersionHelper.ExecuteIn(fixture.RepositoryPath, " /l console", false);
8484

8585
result.ExitCode.ShouldNotBe(0);
8686
result.Output.ShouldNotBeNull();

src/GitVersion.App.Tests/GitVersion.App.Tests.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<ItemGroup>
1919
<Compile Include="..\GitVersion.Core.Tests\Helpers\TestConsoleAdapter.cs" Link="Helpers\TestConsoleAdapter.cs" />
2020
<Compile Include="..\GitVersion.Core.Tests\Helpers\TestEnvironment.cs" Link="Helpers\TestEnvironment.cs" />
21-
<Compile Include="..\GitVersion.Core.Tests\Helpers\TestLogAppender.cs" Link="Helpers\TestLogAppender.cs" />
2221
<Compile Include="..\GitVersion.Core.Tests\Helpers\TestBase.cs" Link="Helpers\TestBase.cs" />
2322
<Compile Include="..\GitVersion.Core.Tests\Helpers\GitVersionCoreTestModule.cs" Link="Helpers\GitVersionCoreTestModule.cs" />
2423
<Compile Include="..\GitVersion.Core.Tests\Extensions\GitVersionVariablesExtensions.cs" Link="Extensions\GitVersionVariablesExtensions.cs" />

src/GitVersion.App.Tests/HelpWriterTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void AllArgsAreInHelp()
2828

2929
{ nameof(Arguments.Diag) , "/diag" },
3030
{ nameof(Arguments.LogFilePath) , "/l" },
31-
{ nameof(Arguments.Verbosity), "/verbosity" },
31+
{ "verbosity", "/verbosity" },
3232
{ nameof(Arguments.Output) , "/output" },
3333
{ nameof(Arguments.OutputFile) , "/outputfile" },
3434
{ nameof(Arguments.ShowVariable), "/showvariable" },

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using GitVersion.Core.Tests.Helpers;
22
using GitVersion.Extensions;
3-
using GitVersion.Logging;
43

54
namespace GitVersion.App.Tests;
65

@@ -17,8 +16,7 @@ public ProgramFixture(string workingDirectory = "")
1716
{
1817
this.workingDirectory = workingDirectory;
1918
var logBuilder = new StringBuilder();
20-
var logAppender = new TestLogAppender(m => logBuilder.AppendLine(m));
21-
ILog log = new Log(logAppender);
19+
var testLoggerFactory = new TestLoggerFactory(m => logBuilder.AppendLine(m));
2220

2321
var consoleBuilder = new StringBuilder();
2422
var consoleAdapter = new TestConsoleAdapter(consoleBuilder);
@@ -27,7 +25,8 @@ public ProgramFixture(string workingDirectory = "")
2725

2826
WithOverrides(services =>
2927
{
30-
services.AddSingleton(log);
28+
services.AddSingleton<ILoggerFactory>(testLoggerFactory);
29+
services.AddSingleton(typeof(ILogger<>), typeof(TestLogger<>));
3130
services.AddSingleton<IConsole>(consoleAdapter);
3231
services.AddSingleton<IEnvironment>(this.environment);
3332
});

src/GitVersion.App/ArgumentParser.cs

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,45 @@
11
using System.IO.Abstractions;
2-
using GitVersion.Agents;
32
using GitVersion.Extensions;
43
using GitVersion.FileSystemGlobbing;
54
using GitVersion.Helpers;
65
using GitVersion.Logging;
76
using GitVersion.OutputVariables;
7+
using Serilog.Core;
8+
using Serilog.Events;
89

910
namespace GitVersion;
1011

11-
internal class ArgumentParser(IEnvironment environment,
12-
IFileSystem fileSystem,
13-
ICurrentBuildAgent buildAgent,
14-
IConsole console,
15-
IHelpWriter helpWriter,
16-
IVersionWriter versionWriter,
17-
IGlobbingResolver globbingResolver)
12+
internal class ArgumentParser(
13+
IEnvironment environment,
14+
IFileSystem fileSystem,
15+
IConsole console,
16+
IHelpWriter helpWriter,
17+
IVersionWriter versionWriter,
18+
IGlobbingResolver globbingResolver,
19+
LoggingLevelSwitch loggingLevelSwitch
20+
)
1821
: IArgumentParser
1922
{
2023
private readonly IEnvironment environment = environment.NotNull();
2124
private readonly IFileSystem fileSystem = fileSystem.NotNull();
22-
private readonly ICurrentBuildAgent buildAgent = buildAgent.NotNull();
2325
private readonly IConsole console = console.NotNull();
2426
private readonly IHelpWriter helpWriter = helpWriter.NotNull();
2527
private readonly IVersionWriter versionWriter = versionWriter.NotNull();
2628
private readonly IGlobbingResolver globbingResolver = globbingResolver.NotNull();
29+
private readonly LoggingLevelSwitch loggingLevelSwitch = loggingLevelSwitch.NotNull();
2730

2831
private const string defaultOutputFileName = "GitVersion.json";
2932
private static readonly IEnumerable<string> availableVariables = GitVersionVariables.AvailableVariables;
3033

34+
private static readonly Dictionary<Verbosity, LogEventLevel> VerbosityMaps = new()
35+
{
36+
{ Verbosity.Verbose, LogEventLevel.Verbose },
37+
{ Verbosity.Diagnostic, LogEventLevel.Debug },
38+
{ Verbosity.Normal, LogEventLevel.Information },
39+
{ Verbosity.Minimal, LogEventLevel.Warning },
40+
{ Verbosity.Quiet, LogEventLevel.Error }
41+
};
42+
3143
public Arguments ParseArguments(string commandLineArguments)
3244
{
3345
var arguments = QuotedStringHelpers.SplitUnquoted(commandLineArguments, ' ');
@@ -48,8 +60,6 @@ public Arguments ParseArguments(string[] commandLineArguments)
4860

4961
AddAuthentication(args);
5062

51-
args.NoFetch = this.buildAgent.PreventFetch();
52-
5363
return args;
5464
}
5565

@@ -58,20 +68,14 @@ public Arguments ParseArguments(string[] commandLineArguments)
5868
if (firstArgument.IsHelp())
5969
{
6070
this.helpWriter.Write();
61-
return new Arguments
62-
{
63-
IsHelp = true
64-
};
71+
return new Arguments { IsHelp = true };
6572
}
6673

6774
if (firstArgument.IsSwitch("version"))
6875
{
6976
var assembly = Assembly.GetExecutingAssembly();
7077
this.versionWriter.Write(assembly);
71-
return new Arguments
72-
{
73-
IsVersion = true
74-
};
78+
return new Arguments { IsVersion = true };
7579
}
7680

7781
var arguments = new Arguments();
@@ -104,7 +108,6 @@ public Arguments ParseArguments(string[] commandLineArguments)
104108
arguments.TargetPath = arguments.TargetPath.TrimEnd('/', '\\');
105109

106110
if (!arguments.EnsureAssemblyInfo) arguments.UpdateAssemblyInfoFileName = ResolveFiles(arguments.TargetPath, arguments.UpdateAssemblyInfoFileName).ToHashSet();
107-
arguments.NoFetch = arguments.NoFetch || this.buildAgent.PreventFetch();
108111

109112
ValidateConfigurationFile(arguments);
110113

@@ -204,7 +207,7 @@ private void ParseTargetPath(Arguments arguments, string? name, IReadOnlyList<st
204207
throw new WarningException(couldNotParseMessage);
205208
}
206209

207-
private static bool ParseSwitches(Arguments arguments, string? name, IReadOnlyList<string>? values, string? value)
210+
private bool ParseSwitches(Arguments arguments, string? name, IReadOnlyList<string>? values, string? value)
208211
{
209212
if (name.IsSwitch("l"))
210213
{
@@ -292,7 +295,8 @@ private static bool ParseSwitches(Arguments arguments, string? name, IReadOnlyLi
292295

293296
if (name.IsSwitch("verbosity"))
294297
{
295-
ParseVerbosity(arguments, value);
298+
var verbosity = ParseVerbosity(value);
299+
loggingLevelSwitch.MinimumLevel = VerbosityMaps[verbosity];
296300
return true;
297301
}
298302

@@ -437,12 +441,14 @@ private static void ParseOutput(Arguments arguments, IEnumerable<string>? values
437441
}
438442
}
439443

440-
private static void ParseVerbosity(Arguments arguments, string? value)
444+
internal static Verbosity ParseVerbosity(string? value)
441445
{
442-
if (!Enum.TryParse(value, true, out arguments.Verbosity))
446+
if (!Enum.TryParse(value, true, out Verbosity verbosity))
443447
{
444448
throw new WarningException($"Could not parse Verbosity value '{value}'");
445449
}
450+
451+
return verbosity;
446452
}
447453

448454
private static void ParseOverrideConfig(Arguments arguments, IReadOnlyCollection<string>? values)
@@ -466,8 +472,10 @@ private static void ParseOverrideConfig(Arguments arguments, IReadOnlyCollection
466472
{
467473
throw new WarningException($"Could not parse /overrideconfig option: {keyValueOption}. Unsupported 'key'.");
468474
}
475+
469476
parser.SetValue(optionKey, keyAndValue[1]);
470477
}
478+
471479
arguments.OverrideConfiguration = parser.GetOverrideConfiguration();
472480
}
473481

@@ -506,6 +514,7 @@ private static void ParseUpdateAssemblyInfo(Arguments arguments, string? value,
506514
{
507515
throw new WarningException("Cannot specify both updateprojectfiles and updateassemblyinfo in the same run. Please rerun GitVersion with only one parameter");
508516
}
517+
509518
if (arguments.UpdateAssemblyInfoFileName.Count > 1 && arguments.EnsureAssemblyInfo)
510519
{
511520
throw new WarningException("Can't specify multiple assembly info files when using -ensureassemblyinfo switch, either use a single assembly info file or do not specify -ensureassemblyinfo and create assembly info files manually");
@@ -547,6 +556,7 @@ private static void ParseUpdateProjectInfo(Arguments arguments, string? value, I
547556
{
548557
throw new WarningException("Cannot specify both updateassemblyinfo and updateprojectfiles in the same run. Please rerun GitVersion with only one parameter");
549558
}
559+
550560
if (arguments.EnsureAssemblyInfo)
551561
{
552562
throw new WarningException("Cannot specify -ensureassemblyinfo with updateprojectfiles: please ensure your project file exists before attempting to update it");

0 commit comments

Comments
 (0)