Skip to content

Commit e4a0e5d

Browse files
committed
Merge branch 'fix/ookii5'
2 parents a6e1b31 + 9e4fa26 commit e4a0e5d

16 files changed

Lines changed: 129 additions & 95 deletions

.github/workflows/dotnet.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ jobs:
1010
discussions: write
1111
steps:
1212
- uses: actions/checkout@v4
13-
13+
with:
14+
fetch-depth: 0
15+
fetch-tags: true
1416
- name: Setup .NET
1517
uses: actions/setup-dotnet@v4
1618
with:
17-
dotnet-version: '9.0.x'
19+
dotnet-version: '10.0.x'
1820
cache: false
1921

2022
- name: restore dependencies

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
- name: Setup .NET
3333
uses: actions/setup-dotnet@v4
3434
with:
35-
dotnet-version: '9.0.x'
35+
dotnet-version: '10.0.x'
3636

3737
- name: Create an archive directory
3838
run: mkdir -p ${{ env.archive-directory }}

global.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"sdk": {
3-
"version": "9.0.100",
3+
"version": "10.0.100",
44
"rollForward": "latestMinor"
55
}
66
}

src/FixNormalization/Arguments/InfoArgument.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Text;
33
using Spectre.Console;
44
using System.ComponentModel;
5+
using System.Reflection;
56

67
namespace FixNormalization.Arguments;
78

@@ -16,11 +17,12 @@ public static CancelMode Info(CommandLineParser parser)
1617
.LeftJustified()
1718
.Color(Color.GreenYellow));
1819
Version(parser);
19-
Console.WriteLine('\n');
20-
AnsiConsole.MarkupLine($"Copyright (c) 2024-2025 Capella87.");
20+
AnsiConsole.MarkupLine(GetGitCommitInformation(parser.StringProvider, Assembly.GetExecutingAssembly()));
21+
AnsiConsole.MarkupLine($"\nCopyright (c) 2024-2026 Capella87.");
2122
AnsiConsole.MarkupLine("Distributed under MIT License.");
2223
AnsiConsole.MarkupLine("Repository: https://github.com/Capella87/FixNormalization");
2324

25+
// Known Issue: CancelMode.Success will invoke the usage help
2426
return CancelMode.Abort;
2527
}
2628
}

src/FixNormalization/Arguments/RootArguments.cs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
using System;
55
using System.ComponentModel;
66
using System.Reflection;
7+
using System.Text;
78

89
namespace FixNormalization.Arguments;
910

1011
[GeneratedParser]
1112
[Description("Fix Unicode normalization of filenames.")]
1213
internal sealed partial class RootArguments
1314
{
14-
[CommandLineArgument(IsPositional = true, CancelParsing = CancelMode.Success)]
15+
[CommandLineArgument(IsPositional = true)]
1516
[Description("Commands of fnorm.")]
1617
public required string Command { get; set; }
1718

@@ -22,6 +23,11 @@ internal sealed partial class RootArguments
2223
[CommandLineArgument]
2324
[Description("Display version information.")]
2425
public static CancelMode Version(CommandLineParser parser)
26+
{
27+
return ShowVersion(parser);
28+
}
29+
30+
public static CancelMode ShowVersion(CommandLineParser parser)
2531
{
2632
var assembly = Assembly.GetExecutingAssembly();
2733

@@ -48,10 +54,32 @@ public static void ShowRichVersionInformation(LocalizedStringProvider provider,
4854
AnsiConsole.MarkupLine($"[bold yellow]{appName}[/] {version.EscapeMarkup()}");
4955
}
5056

57+
public static string GetGitCommitInformation(LocalizedStringProvider stringProvider, Assembly assembly)
58+
{
59+
var stringBuilder = new StringBuilder();
60+
61+
var attrs = assembly.GetCustomAttributes<AssemblyMetadataAttribute>();
62+
63+
var sha = attrs
64+
.FirstOrDefault(a => a.Key == "GitCommitSha")?
65+
.Value ?? "Unknown";
66+
var branch = attrs.FirstOrDefault(a => a.Key == "GitBranch")?.Value ?? "Unknown";
67+
var date = attrs
68+
.FirstOrDefault(a => a.Key == "GitCommitDate")?
69+
.Value ?? "Unknown";
70+
if (sha != "Unknown" && date != "Unknown")
71+
{
72+
return stringBuilder.Append($"{sha}-{branch} ({date})")
73+
.ToString();
74+
}
75+
76+
return string.Empty;
77+
}
78+
5179
private static string GetAppVersion(Assembly assembly)
5280
{
53-
var versionAttribute = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>();
54-
var version = versionAttribute?.InformationalVersion ?? assembly.GetName()?.Version?.ToString() ?? string.Empty;
81+
var versionAttribute = assembly.GetCustomAttributes<AssemblyMetadataAttribute>();
82+
var version = versionAttribute?.FirstOrDefault(a => a.Key == "SemVer")?.Value ?? assembly.GetName()?.Version?.ToString() ?? string.Empty;
5583

5684
return version;
5785
}

src/FixNormalization/Commands/FixCommand.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using Ookii.CommandLine.Conversion;
88
using System.IO.Abstractions;
99

10-
using FixNormalization.Validation;
10+
using Ookii.CommandLine.Validation;
1111

1212
namespace FixNormalization.Commands;
1313

@@ -29,7 +29,7 @@ public partial class FixCommand : AsyncCommandBase
2929
[Description("Normalization form to be used. You can choose NFC (The most common types in the majority of environments) and NFD (Used in macOS or Darwin)")]
3030
[ValueDescription("form")]
3131
[ArgumentConverter(typeof(NormalizationFormConverter))]
32-
[ValidateNormalizationForm(AllowNonDefinedValues = true,
32+
[ValidateEnumValue(AllowNonDefinedValues = TriState.True,
3333
IncludeInUsageHelp = true,
3434
IncludeValuesInErrorMessage = true)]
3535
public NormalizationForm NForm { get; set; }
@@ -57,13 +57,13 @@ public FixCommand() : base()
5757

5858
// TODO: Excluded item criteria (wildcard, file type... etc)
5959

60-
public async Task<int> RunAsync(IFileSystem? fs)
60+
public async Task<int> RunAsync(IFileSystem? fs, CancellationToken token)
6161
{
6262
_fileSystem = fs;
63-
return await RunAsync();
63+
return await RunAsync(token);
6464
}
6565

66-
public override async Task<int> RunAsync()
66+
public override async Task<int> RunAsync(CancellationToken token)
6767
{
6868
_fileSystem ??= new FileSystem();
6969

@@ -116,7 +116,7 @@ await DetectFilesInDirectory(e, targetedFiles, isRecursive: Recursive
116116
var failed = new List<string>();
117117
try
118118
{
119-
await NormalizeFiles(targetedFiles, failed, this.CancellationToken);
119+
await NormalizeFiles(targetedFiles, failed, token);
120120
}
121121
catch (OperationCanceledException)
122122
{

src/FixNormalization/Commands/VersionCommand.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,6 @@ public VersionCommand(CommandLineParser parser)
2323

2424
public int Run()
2525
{
26-
var assembly = Assembly.GetExecutingAssembly();
27-
var appName = _parser.ApplicationFriendlyName;
28-
29-
if (assembly is null)
30-
{
31-
AnsiConsole.MarkupLine($"[yellow bold]{appName}[/] Unknown version");
32-
return (int)CancelMode.Abort;
33-
}
34-
RootArguments.ShowRichVersionInformation(_parser.StringProvider, assembly, appName);
35-
36-
return (int)CancelMode.Abort;
26+
return (int)RootArguments.ShowVersion(_parser);
3727
}
3828
}
Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<OutputType>Exe</OutputType>
4-
<TargetFramework>net9.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<Version>0.2.0-beta.1</Version>
@@ -14,13 +14,26 @@
1414
</PropertyGroup>
1515

1616
<ItemGroup>
17-
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.4" />
18-
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.4" />
19-
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.4" />
20-
<PackageReference Include="Ookii.CommandLine" Version="4.2.0" />
21-
<PackageReference Include="Spectre.Console" Version="0.50.0" />
22-
<PackageReference Include="TestableIO.System.IO.Abstractions" Version="22.0.14" />
23-
<PackageReference Include="TestableIO.System.IO.Abstractions.Wrappers" Version="22.0.14" />
17+
<PackageReference Include="Microsoft.Extensions.Configuration" Version="10.*" />
18+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.*" />
19+
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.*" />
20+
<PackageReference Include="Ookii.CommandLine" Version="5.0.0" />
21+
<PackageReference Include="Spectre.Console" Version="0.54.0" />
22+
<PackageReference Include="TestableIO.System.IO.Abstractions" Version="22.1.0" />
23+
<PackageReference Include="TestableIO.System.IO.Abstractions.Wrappers" Version="22.1.0" />
24+
<PackageReference Include="GitVersion.MsBuild" Version="6.5.1">
25+
<PrivateAssets>All</PrivateAssets>
26+
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
27+
</PackageReference>
2428
</ItemGroup>
2529

30+
<Target Name="AddGitMetadata" BeforeTargets="GetAssemblyVersion">
31+
<ItemGroup>
32+
<AssemblyMetadata Include="GitCommitSha" Value="$(GitVersion_ShortSha)" />
33+
<AssemblyMetadata Include="GitBranch" Value="$(GitVersion_BranchName)" />
34+
<AssemblyMetadata Include="GitCommitDate" Value="$(GitVersion_CommitDate)" />
35+
<AssemblyMetadata Include="SemVer" Value="$(GitVersion_SemVer)" />
36+
</ItemGroup>
37+
</Target>
38+
2639
</Project>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
mode: ManualDeployment
2+
next-version: 0.2.0
3+
branches:
4+
main:
5+
increment: None
6+
develop:
7+
increment: None
8+
feature:
9+
increment: None
10+
workflow:

src/FixNormalization/NormalizationFormConverter.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,23 @@
55
using System.Globalization;
66
using System.Text;
77

8-
using FixNormalization.Validation;
9-
108
namespace FixNormalization;
119

1210
public sealed class NormalizationFormConverter : ArgumentConverter
1311
{
14-
public override object? Convert(ReadOnlySpan<char> value, CultureInfo culture, CommandLineArgument argument)
12+
public override object? Convert(ReadOnlyMemory<char> value, CultureInfo culture, CommandLineArgument argument)
13+
{
14+
return Convert(value.ToString(), culture, argument);
15+
}
16+
17+
public object? Convert(ReadOnlySpan<char> value, CultureInfo culture, CommandLineArgument argument)
1518
{
1619
return Convert(value.ToString(), culture, argument);
1720
}
1821

19-
public override object? Convert(string value, CultureInfo culture, CommandLineArgument argument)
22+
public object? Convert(string value, CultureInfo culture, CommandLineArgument argument)
2023
{
21-
var attribute = argument.Validators.OfType<ValidateNormalizationFormAttribute>()!.FirstOrDefault();
24+
var attribute = argument.Validators.OfType<ValidateEnumValueAttribute>()!.FirstOrDefault();
2225

2326
try
2427
{
@@ -53,7 +56,7 @@ public sealed class NormalizationFormConverter : ArgumentConverter
5356
_ => throw new ArgumentException($"Value {target.ToString()} is invalid.")
5457
};
5558

56-
private string GetExceptionMessage(string value, CommandLineArgument argument, ValidateNormalizationFormAttribute? attr)
59+
private string GetExceptionMessage(string value, CommandLineArgument argument, ValidateEnumValueAttribute? attr)
5760
{
5861
return attr!.GetErrorMessage(argument, value) ?? argument.Parser.StringProvider.ValidateEnumValueFailed(argument.ArgumentName, typeof(NormalizationForm), value, true);
5962
}

0 commit comments

Comments
 (0)