mirror of
https://github.com/nsnail/dot.git
synced 2025-06-17 21:13:21 +08:00
<style>
This commit is contained in:
parent
51943833ed
commit
075c8e76b2
@ -7,6 +7,18 @@ end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.cs]
|
||||
dotnet_analyzer_diagnostic.severity = warning
|
||||
dotnet_diagnostic.IDE0008.severity = none
|
||||
dotnet_diagnostic.IDE0055.severity = none
|
||||
dotnet_diagnostic.IDE0160.severity = none
|
||||
dotnet_diagnostic.CA1707.severity = none
|
||||
dotnet_diagnostic.IDE0048.severity = none
|
||||
dotnet_diagnostic.IDE0058.severity = none
|
||||
dotnet_diagnostic.IDE0017.severity = none
|
||||
dotnet_diagnostic.CA5350.severity = none
|
||||
dotnet_diagnostic.CA5351.severity = none
|
||||
|
||||
|
||||
# ReSharper properties
|
||||
resharper_align_linq_query = true
|
||||
@ -35,6 +47,7 @@ resharper_indent_preprocessor_other = usual_indent
|
||||
resharper_int_align = true
|
||||
resharper_keep_existing_arrangement = false
|
||||
resharper_place_linq_into_on_new_line = false
|
||||
resharper_place_simple_embedded_statement_on_same_line = false
|
||||
resharper_place_simple_switch_expression_on_single_line = true
|
||||
resharper_wrap_before_eq = true
|
||||
resharper_wrap_chained_method_calls = chop_if_long
|
||||
|
@ -1,8 +0,0 @@
|
||||
<Project>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.50.0.58025">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
</Project>
|
2
dot.sln
2
dot.sln
@ -17,7 +17,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meta", "meta", "{AD79881E-7
|
||||
CodeCleanupOnSave.csx = CodeCleanupOnSave.csx
|
||||
Directory.Build.props = Directory.Build.props
|
||||
dot.sln.DotSettings = dot.sln.DotSettings
|
||||
dot.sln.DotSettings.user = dot.sln.DotSettings.user
|
||||
dotnet-tools.json = dotnet-tools.json
|
||||
GenerateResx.targets = GenerateResx.targets
|
||||
git-clean.cmd = git-clean.cmd
|
||||
@ -27,7 +26,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meta", "meta", "{AD79881E-7
|
||||
README.md = README.md
|
||||
README.zh-CN.md = README.zh-CN.md
|
||||
SafetyDelUnusedResx.ahk = SafetyDelUnusedResx.ahk
|
||||
SonarqubleAnalyzer.props = SonarqubleAnalyzer.props
|
||||
switch-nuget.cmd = switch-nuget.cmd
|
||||
switch-project.cmd = switch-project.cmd
|
||||
switcher.json = switcher.json
|
||||
|
@ -1,6 +1,12 @@
|
||||
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:s="clr-namespace:System;assembly=mscorlib"
|
||||
xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml:space="preserve">
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOR/@EntryValue">Required</s:String>
|
||||
<s:String
|
||||
x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_FOREACH/@EntryValue">Required</s:String>
|
||||
<s:String
|
||||
x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_IFELSE/@EntryValue">Required</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/BRACES_FOR_WHILE/@EntryValue">Required</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/CSharpFileLayoutPatterns/Pattern/@EntryValue"><?xml version="1.0" encoding="utf-16"?>
|
||||
<Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns">
|
||||
<TypePattern>
|
||||
|
@ -1,10 +1,14 @@
|
||||
// ReSharper disable ClassNeverInstantiated.Global
|
||||
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime.Versioning;
|
||||
|
||||
#if NET7_0_WINDOWS
|
||||
namespace Dot.Color;
|
||||
|
||||
[Description(nameof(Str.ScreenPixelTool))]
|
||||
[Localization(typeof(Str))]
|
||||
[SupportedOSPlatform(nameof(OSPlatform.Windows))]
|
||||
internal sealed class Main : ToolBase<Option>
|
||||
|
||||
{
|
||||
|
@ -9,7 +9,7 @@ namespace Dot.Color;
|
||||
internal sealed class MouseHook : IDisposable
|
||||
{
|
||||
[StructLayout(LayoutKind.Explicit)]
|
||||
private struct Msllhookstruct
|
||||
private readonly struct Msllhookstruct
|
||||
{
|
||||
[FieldOffset(0)] public readonly int X;
|
||||
[FieldOffset(4)] public readonly int Y;
|
||||
@ -37,20 +37,29 @@ internal sealed class MouseHook : IDisposable
|
||||
|
||||
private void Dispose(bool disposing)
|
||||
{
|
||||
if (_disposed) return;
|
||||
if (_disposed) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
#pragma warning disable S108
|
||||
if (disposing) { }
|
||||
#pragma warning restore S108
|
||||
|
||||
if (_hookId != default) Win32.UnhookWindowsHookEx(_hookId);
|
||||
if (_hookId != default) {
|
||||
Win32.UnhookWindowsHookEx(_hookId);
|
||||
}
|
||||
|
||||
_disposed = true;
|
||||
}
|
||||
|
||||
|
||||
private nint HookCallback(int nCode, nint wParam, nint lParam)
|
||||
{
|
||||
if (nCode < 0 || (_WM_MOUSEMOVE != wParam && _WM_LBUTTONDOWN != wParam))
|
||||
if (nCode < 0 || (_WM_MOUSEMOVE != wParam && _WM_LBUTTONDOWN != wParam)) {
|
||||
return Win32.CallNextHookEx(_hookId, nCode, wParam, lParam);
|
||||
}
|
||||
|
||||
var hookStruct = (Msllhookstruct)Marshal.PtrToStructure(lParam, typeof(Msllhookstruct))!;
|
||||
MouseEvent(null, new MouseEventArgs( //
|
||||
wParam == _WM_MOUSEMOVE ? MouseButtons.None : MouseButtons.Left //
|
||||
|
@ -2,4 +2,4 @@
|
||||
|
||||
namespace Dot.Color;
|
||||
|
||||
internal class Option : OptionBase { }
|
||||
internal sealed class Option : OptionBase { }
|
@ -1,10 +1,13 @@
|
||||
#if NET7_0_WINDOWS
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime.Versioning;
|
||||
using Size = System.Drawing.Size;
|
||||
|
||||
namespace Dot.Color;
|
||||
|
||||
internal class WinInfo : Form
|
||||
[SupportedOSPlatform(nameof(OSPlatform.Windows))]
|
||||
internal sealed class WinInfo : Form
|
||||
{
|
||||
private const int _WINDOW_SIZE = 480; //窗口大小
|
||||
private const int _ZOOM_RATE = 16; //缩放倍率
|
||||
@ -49,7 +52,10 @@ internal class WinInfo : Form
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (_disposed) return;
|
||||
if (_disposed) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (disposing) {
|
||||
_graphics?.Dispose();
|
||||
_pbox?.Dispose();
|
||||
|
@ -1,14 +1,18 @@
|
||||
#if NET7_0_WINDOWS
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime.Versioning;
|
||||
using TextCopy;
|
||||
|
||||
namespace Dot.Color;
|
||||
|
||||
internal class WinMain : Form
|
||||
[SupportedOSPlatform(nameof(OSPlatform.Windows))]
|
||||
internal sealed class WinMain : Form
|
||||
{
|
||||
private readonly Bitmap _bmp;
|
||||
private bool _disposed;
|
||||
private readonly WinInfo _winInfo = new(); //小图窗口
|
||||
|
||||
|
||||
public WinMain()
|
||||
{
|
||||
// 隐藏控制台窗口,避免捕获到截屏
|
||||
@ -32,7 +36,10 @@ internal class WinMain : Form
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (_disposed) return;
|
||||
if (_disposed) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (disposing) {
|
||||
_bmp?.Dispose();
|
||||
_winInfo?.Dispose();
|
||||
@ -43,7 +50,9 @@ internal class WinMain : Form
|
||||
|
||||
protected override void OnKeyUp(KeyEventArgs e)
|
||||
{
|
||||
if (e.KeyCode == Keys.Escape) Application.Exit();
|
||||
if (e.KeyCode == Keys.Escape) {
|
||||
Application.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnLoad(EventArgs e)
|
||||
|
@ -3,12 +3,13 @@ using System.Diagnostics;
|
||||
namespace Dot;
|
||||
|
||||
// ReSharper disable once UnusedType.Global
|
||||
internal class CsxEditor
|
||||
// ReSharper disable once UnusedMember.Global
|
||||
internal sealed class CsxEditor
|
||||
{
|
||||
// ReSharper disable once UnusedMember.Local
|
||||
#pragma warning disable CA1822
|
||||
private void Run()
|
||||
#pragma warning restore CA1822
|
||||
#pragma warning disable IDE0051
|
||||
private static void Run()
|
||||
#pragma warning restore IDE0051
|
||||
{
|
||||
/*
|
||||
for %%i in (*.png) do pngquant %%i --force --output %%i --skip-if-larger
|
||||
@ -25,14 +26,14 @@ internal class CsxEditor
|
||||
.ToArray();
|
||||
|
||||
|
||||
Parallel.ForEach(files, file => {
|
||||
_ = Parallel.ForEach(files, file => {
|
||||
var startInfo = new ProcessStartInfo {
|
||||
FileName = "pngquant"
|
||||
, Arguments
|
||||
= $"\"{file}\" --force --output \"{file}\" --skip-if-larger"
|
||||
};
|
||||
using var p = Process.Start(startInfo);
|
||||
p.WaitForExit();
|
||||
p!.WaitForExit();
|
||||
Console.WriteLine(p.ExitCode);
|
||||
});
|
||||
|
||||
@ -46,13 +47,13 @@ internal class CsxEditor
|
||||
}))
|
||||
.ToArray();
|
||||
|
||||
Parallel.ForEach(files, file => {
|
||||
_ = Parallel.ForEach(files, file => {
|
||||
var startInfo = new ProcessStartInfo {
|
||||
FileName = "jpegtran"
|
||||
, Arguments = $"-copy none -optimize -perfect \"{file}\" \"{file}\""
|
||||
};
|
||||
using var p = Process.Start(startInfo);
|
||||
p.WaitForExit();
|
||||
p!.WaitForExit();
|
||||
Console.WriteLine(p.ExitCode);
|
||||
});
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Globalization;
|
||||
using System.Text.RegularExpressions;
|
||||
// ReSharper disable once RedundantUsingDirective
|
||||
using Panel = Spectre.Console.Panel;
|
||||
@ -21,7 +22,10 @@ internal abstract class FilesTool<TOption> : ToolBase<TOption> where TOption : D
|
||||
|
||||
private async Task CoreInternal()
|
||||
{
|
||||
if (!Opt.WriteMode) AnsiConsole.MarkupLine("[gray]{0}[/]", Str.ExerciseMode);
|
||||
if (!Opt.WriteMode) {
|
||||
AnsiConsole.MarkupLine(CultureInfo.InvariantCulture, "[gray]{0}[/]", Str.ExerciseMode);
|
||||
}
|
||||
|
||||
IEnumerable<string> fileList;
|
||||
await AnsiConsole.Progress()
|
||||
.Columns(new ProgressBarColumn() //
|
||||
@ -45,8 +49,9 @@ internal abstract class FilesTool<TOption> : ToolBase<TOption> where TOption : D
|
||||
var grid = new Grid().AddColumn(new GridColumn().NoWrap().PadRight(16))
|
||||
.AddColumn(new GridColumn().Alignment(Justify.Right));
|
||||
|
||||
foreach (var kv in _writeStats.OrderByDescending(x => x.Value).ThenBy(x => x.Key))
|
||||
grid.AddRow(kv.Key, kv.Value.ToString());
|
||||
foreach (var kv in _writeStats.OrderByDescending(x => x.Value).ThenBy(x => x.Key)) {
|
||||
_ = grid.AddRow(kv.Key, kv.Value.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
AnsiConsole.Write(new Panel(grid).Header(Str.WriteFileStats));
|
||||
}
|
||||
@ -57,7 +62,11 @@ internal abstract class FilesTool<TOption> : ToolBase<TOption> where TOption : D
|
||||
{
|
||||
var exCnt = 0;
|
||||
if (Opt.ExcludeRegexes?.FirstOrDefault() is null) //默认排除.git 、 node_modules 目录
|
||||
{
|
||||
Opt.ExcludeRegexes = new[] { @"\.git", "node_modules" };
|
||||
}
|
||||
|
||||
|
||||
var excludeRegexes = Opt.ExcludeRegexes.Select(x => new Regex(x));
|
||||
var fileList = Directory.EnumerateFiles(path, searchPattern
|
||||
, new EnumerationOptions {
|
||||
@ -68,7 +77,10 @@ internal abstract class FilesTool<TOption> : ToolBase<TOption> where TOption : D
|
||||
, MaxRecursionDepth = Opt.MaxRecursionDepth
|
||||
})
|
||||
.Where(x => {
|
||||
if (!excludeRegexes.Any(y => y.IsMatch(x))) return true;
|
||||
if (!excludeRegexes.Any(y => y.IsMatch(x))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
++exCnt;
|
||||
return false;
|
||||
})
|
||||
@ -79,9 +91,10 @@ internal abstract class FilesTool<TOption> : ToolBase<TOption> where TOption : D
|
||||
|
||||
protected override Task Core()
|
||||
{
|
||||
if (!Directory.Exists(Opt.Path))
|
||||
throw new ArgumentException(nameof(Opt.Path), string.Format(Str.PathNotFound, Opt.Path));
|
||||
return CoreInternal();
|
||||
return !Directory.Exists(Opt.Path)
|
||||
? throw new ArgumentException(nameof(Opt.Path)
|
||||
, string.Format(CultureInfo.InvariantCulture, Str.PathNotFound, Opt.Path))
|
||||
: CoreInternal();
|
||||
}
|
||||
|
||||
|
||||
@ -124,7 +137,10 @@ internal abstract class FilesTool<TOption> : ToolBase<TOption> where TOption : D
|
||||
_readCnt += readCnt;
|
||||
_writeCnt += writeCnt;
|
||||
_breakCnt += breakCnt;
|
||||
if (readCnt > 0) _childTask.Increment(1);
|
||||
if (readCnt > 0) {
|
||||
_childTask.Increment(1);
|
||||
}
|
||||
|
||||
_childTask.Description
|
||||
= $"{Str.Read}: [green]{_readCnt}[/]/{_totalCnt}, {Str.Write}: [red]{_writeCnt}[/], {Str.Break}: [gray]{_breakCnt}[/], {Str.Exclude}: [yellow]{_excludeCnt}[/]";
|
||||
}
|
||||
@ -133,6 +149,6 @@ internal abstract class FilesTool<TOption> : ToolBase<TOption> where TOption : D
|
||||
|
||||
protected void UpdateStats(string key)
|
||||
{
|
||||
_writeStats.AddOrUpdate(key, 1, (_, oldValue) => oldValue + 1);
|
||||
_ = _writeStats.AddOrUpdate(key, 1, (_, oldValue) => oldValue + 1);
|
||||
}
|
||||
}
|
@ -8,7 +8,7 @@ namespace Dot.Get;
|
||||
|
||||
[Description(nameof(Str.DownloadTool))]
|
||||
[Localization(typeof(Str))]
|
||||
internal partial class Main : ToolBase<Option>
|
||||
internal sealed partial class Main : ToolBase<Option>
|
||||
{
|
||||
private const string _PART = "part";
|
||||
|
||||
@ -22,7 +22,9 @@ internal partial class Main : ToolBase<Option>
|
||||
{
|
||||
if (GetUseablePath(ref path))
|
||||
// path 是一个存在的文件,已追加尾标
|
||||
{
|
||||
return path;
|
||||
}
|
||||
|
||||
// ReSharper disable once InvertIf
|
||||
if (Directory.Exists(path)) { //path 是一个存在的目录。
|
||||
@ -115,8 +117,9 @@ internal partial class Main : ToolBase<Option>
|
||||
contentLength = content.Headers.ContentLength ?? 0;
|
||||
attachment = content.Headers.ContentDisposition?.FileName ??
|
||||
Opt.Url[(Opt.Url.LastIndexOf('/') + 1)..];
|
||||
foreach (var kv in content.Headers)
|
||||
foreach (var kv in content.Headers) {
|
||||
table.AddRow(kv.Key, string.Join(Environment.NewLine, kv.Value));
|
||||
}
|
||||
});
|
||||
AnsiConsole.Write(table);
|
||||
|
||||
@ -164,7 +167,10 @@ internal partial class Main : ToolBase<Option>
|
||||
using var getReq = new HttpRequestMessage(HttpMethod.Get, Opt.Url);
|
||||
var startPos = i * chunkSize;
|
||||
var endPos = startPos + chunkSize - 1;
|
||||
if (i == Opt.ChunkNumbers - 1) endPos += contentLength % chunkSize;
|
||||
if (i == Opt.ChunkNumbers - 1) {
|
||||
endPos += contentLength % chunkSize;
|
||||
}
|
||||
|
||||
getReq.Headers.Range = new RangeHeaderValue(startPos, endPos);
|
||||
// ReSharper disable once AccessToDisposedClosure
|
||||
using var getRsp
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
namespace Dot.Get;
|
||||
|
||||
internal class Option : OptionBase
|
||||
internal sealed class Option : OptionBase
|
||||
{
|
||||
[CommandOption("-b|--buffer-size")]
|
||||
[Description(nameof(Str.BufferSize))]
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using NSExt.Extensions;
|
||||
|
||||
@ -9,7 +10,7 @@ namespace Dot.Git;
|
||||
|
||||
[Description(nameof(Str.GitTool))]
|
||||
[Localization(typeof(Str))]
|
||||
internal class Main : ToolBase<Option>
|
||||
internal sealed class Main : ToolBase<Option>
|
||||
{
|
||||
private Encoding _gitOutputEnc; //git command rsp 编码
|
||||
private ConcurrentDictionary<string, StringBuilder> _repoRsp; //仓库信息容器
|
||||
@ -28,7 +29,10 @@ internal class Main : ToolBase<Option>
|
||||
, new TaskDescriptionColumn { Alignment = Justify.Left } //
|
||||
)
|
||||
.StartAsync(async ctx => {
|
||||
var taskFinder = ctx.AddTask(string.Format(Str.FindGitReps, Opt.Path)).IsIndeterminate();
|
||||
var taskFinder = ctx
|
||||
.AddTask(string.Format(CultureInfo.InvariantCulture, Str.FindGitReps
|
||||
, Opt.Path))
|
||||
.IsIndeterminate();
|
||||
var paths = Directory.GetDirectories(Opt.Path, ".git" //
|
||||
, new EnumerationOptions //
|
||||
{
|
||||
@ -44,8 +48,8 @@ internal class Main : ToolBase<Option>
|
||||
_repoStatus = new ConcurrentDictionary<string, TaskStatusColumn.Statues>();
|
||||
var tasks = new Dictionary<string, ProgressTask>();
|
||||
foreach (var path in paths) {
|
||||
_repoRsp.TryAdd(path, new StringBuilder());
|
||||
_repoStatus.TryAdd(path, default);
|
||||
_ = _repoRsp.TryAdd(path, new StringBuilder());
|
||||
_ = _repoStatus.TryAdd(path, default);
|
||||
var task = ctx.AddTask(new DirectoryInfo(path).Name, false).IsIndeterminate();
|
||||
tasks.Add(path, task);
|
||||
}
|
||||
@ -82,7 +86,10 @@ internal class Main : ToolBase<Option>
|
||||
// 打印 git command rsp
|
||||
void ExecRspReceived(object sender, DataReceivedEventArgs e)
|
||||
{
|
||||
if (e.Data is null) return;
|
||||
if (e.Data is null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var msg = Encoding.UTF8.GetString(_gitOutputEnc.GetBytes(e.Data));
|
||||
_repoRsp[payload.Key].Append(msg.EscapeMarkup());
|
||||
}
|
||||
@ -122,9 +129,9 @@ internal class Main : ToolBase<Option>
|
||||
|
||||
protected override Task Core()
|
||||
{
|
||||
if (!Directory.Exists(Opt.Path))
|
||||
throw new ArgumentException(nameof(Opt.Path) //
|
||||
, string.Format(Str.PathNotFound, Opt.Path));
|
||||
return CoreInternal();
|
||||
return !Directory.Exists(Opt.Path)
|
||||
? throw new ArgumentException(nameof(Opt.Path) //
|
||||
, string.Format(CultureInfo.InvariantCulture, Str.PathNotFound, Opt.Path))
|
||||
: CoreInternal();
|
||||
}
|
||||
}
|
@ -3,7 +3,7 @@
|
||||
|
||||
namespace Dot.Git;
|
||||
|
||||
internal class Option : OptionBase
|
||||
internal sealed class Option : OptionBase
|
||||
{
|
||||
[CommandOption("-a|--args")]
|
||||
[Description(nameof(Str.GitArgs))]
|
||||
|
@ -4,6 +4,6 @@ internal static class ProgressTaskStateExtensions
|
||||
{
|
||||
public static void Status(this ProgressTaskState me, TaskStatusColumn.Statues value)
|
||||
{
|
||||
me.Update<TaskStatusColumn.Statues>(nameof(TaskStatusColumn), _ => value);
|
||||
_ = me.Update<TaskStatusColumn.Statues>(nameof(TaskStatusColumn), _ => value);
|
||||
}
|
||||
}
|
@ -6,7 +6,7 @@ using Spectre.Console.Rendering;
|
||||
|
||||
namespace Dot.Git;
|
||||
|
||||
internal class TaskStatusColumn : ProgressColumn
|
||||
internal sealed class TaskStatusColumn : ProgressColumn
|
||||
{
|
||||
public enum Statues : byte
|
||||
{
|
||||
|
@ -1,6 +1,7 @@
|
||||
// ReSharper disable ClassNeverInstantiated.Global
|
||||
|
||||
|
||||
using System.Globalization;
|
||||
#if NET7_0_WINDOWS
|
||||
using TextCopy;
|
||||
#endif
|
||||
@ -14,7 +15,10 @@ internal sealed class Main : ToolBase<Option>
|
||||
protected override Task Core()
|
||||
{
|
||||
var guid = System.Guid.NewGuid().ToString();
|
||||
if (Opt.Upper) guid = guid.ToUpper();
|
||||
if (Opt.Upper) {
|
||||
guid = guid.ToUpper(CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
Console.WriteLine(Str.Copied, guid);
|
||||
#if NET7_0_WINDOWS
|
||||
ClipboardService.SetText(guid);
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
namespace Dot.Guid;
|
||||
|
||||
internal class Option : OptionBase
|
||||
internal sealed class Option : OptionBase
|
||||
{
|
||||
[CommandOption("-u|--upper")]
|
||||
[Description(nameof(Str.UseUppercase))]
|
||||
|
@ -14,8 +14,10 @@ internal sealed class Main : ToolBase<Option>
|
||||
{
|
||||
foreach (var item in NetworkInterface.GetAllNetworkInterfaces()) {
|
||||
if (item.NetworkInterfaceType != NetworkInterfaceType.Ethernet ||
|
||||
item.OperationalStatus != OperationalStatus.Up)
|
||||
item.OperationalStatus != OperationalStatus.Up) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var output = string.Join(Environment.NewLine
|
||||
, item.GetIPProperties()
|
||||
.UnicastAddresses
|
||||
|
@ -2,4 +2,4 @@
|
||||
|
||||
namespace Dot.IP;
|
||||
|
||||
internal class Option : OptionBase { }
|
||||
internal sealed class Option : OptionBase { }
|
@ -11,7 +11,7 @@ namespace Dot.Json;
|
||||
|
||||
[Description(nameof(Str.Json))]
|
||||
[Localization(typeof(Str))]
|
||||
internal class Main : ToolBase<Option>
|
||||
internal sealed class Main : ToolBase<Option>
|
||||
{
|
||||
private object _inputObj;
|
||||
|
||||
@ -26,11 +26,15 @@ internal class Main : ToolBase<Option>
|
||||
private async Task CoreInternal()
|
||||
{
|
||||
string result = null;
|
||||
if (Opt.Compress)
|
||||
if (Opt.Compress) {
|
||||
result = await JsonCompress();
|
||||
else if (Opt.ConvertToString)
|
||||
}
|
||||
else if (Opt.ConvertToString) {
|
||||
result = await ConvertToString();
|
||||
else if (Opt.Format) result = await JsonFormat();
|
||||
}
|
||||
else if (Opt.Format) {
|
||||
result = await JsonFormat();
|
||||
}
|
||||
|
||||
if (!result.NullOrWhiteSpace()) {
|
||||
#if NET7_0_WINDOWS
|
||||
@ -61,9 +65,13 @@ internal class Main : ToolBase<Option>
|
||||
var inputText = Opt.InputText;
|
||||
|
||||
#if NET7_0_WINDOWS
|
||||
if (inputText.NullOrWhiteSpace()) inputText = ClipboardService.GetText();
|
||||
if (inputText.NullOrWhiteSpace()) {
|
||||
inputText = ClipboardService.GetText();
|
||||
}
|
||||
#endif
|
||||
if (inputText.NullOrWhiteSpace()) throw new ArgumentException(Str.InputTextIsEmpty);
|
||||
if (inputText.NullOrWhiteSpace()) {
|
||||
throw new ArgumentException(Str.InputTextIsEmpty);
|
||||
}
|
||||
|
||||
try {
|
||||
_inputObj = inputText.Object<object>();
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
namespace Dot.Json;
|
||||
|
||||
internal class Option : OptionBase
|
||||
internal sealed class Option : OptionBase
|
||||
{
|
||||
[CommandOption("-c|--compress")]
|
||||
[Description(nameof(Str.CompressJson))]
|
||||
|
@ -27,7 +27,7 @@ namespace Dot.Lang {
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Str {
|
||||
internal sealed class Str {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
|
@ -1,27 +1,37 @@
|
||||
using System.Globalization;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using Dot;
|
||||
using Dot.Git;
|
||||
|
||||
namespace Dot;
|
||||
|
||||
internal sealed class Program
|
||||
{
|
||||
public static int Main(string[] args)
|
||||
{
|
||||
var app = new CommandApp();
|
||||
|
||||
|
||||
app.Configure(config => {
|
||||
config.SetApplicationName(AssemblyInfo.ASSEMBLY_PRODUCT);
|
||||
config.SetApplicationVersion(AssemblyInfo.ASSEMBLY_VERSION);
|
||||
|
||||
config.AddCommand<Main>(nameof(Dot.Git).ToLower());
|
||||
config.AddCommand<Main>(nameof(Git).ToLower(CultureInfo.InvariantCulture));
|
||||
#if NET7_0_WINDOWS
|
||||
config.AddCommand<Dot.Color.Main>(nameof(Dot.Color).ToLower());
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
|
||||
config.AddCommand<Color.Main>(nameof(Color).ToLower(CultureInfo.InvariantCulture));
|
||||
}
|
||||
#endif
|
||||
config.AddCommand<Dot.Guid.Main>(nameof(Dot.Guid).ToLower());
|
||||
config.AddCommand<Dot.IP.Main>(nameof(Dot.IP).ToLower());
|
||||
config.AddCommand<Dot.Json.Main>(nameof(Dot.Json).ToLower());
|
||||
config.AddCommand<Dot.Pwd.Main>(nameof(Dot.Pwd).ToLower());
|
||||
config.AddCommand<Dot.Rbom.Main>(nameof(Dot.Rbom).ToLower());
|
||||
config.AddCommand<Dot.Trim.Main>(nameof(Dot.Trim).ToLower());
|
||||
config.AddCommand<Dot.Text.Main>(nameof(Dot.Text).ToLower());
|
||||
config.AddCommand<Dot.Time.Main>(nameof(Dot.Time).ToLower());
|
||||
config.AddCommand<Dot.ToLf.Main>(nameof(Dot.ToLf).ToLower());
|
||||
config.AddCommand<Dot.Get.Main>(nameof(Dot.Get).ToLower());
|
||||
config.AddCommand<Guid.Main>(nameof(Guid).ToLower(CultureInfo.InvariantCulture));
|
||||
config.AddCommand<IP.Main>(nameof(IP).ToLower(CultureInfo.InvariantCulture));
|
||||
config.AddCommand<Json.Main>(nameof(Json).ToLower(CultureInfo.InvariantCulture));
|
||||
config.AddCommand<Pwd.Main>(nameof(Pwd).ToLower(CultureInfo.InvariantCulture));
|
||||
config.AddCommand<Rbom.Main>(nameof(Rbom).ToLower(CultureInfo.InvariantCulture));
|
||||
config.AddCommand<Trim.Main>(nameof(Trim).ToLower(CultureInfo.InvariantCulture));
|
||||
config.AddCommand<Text.Main>(nameof(Text).ToLower(CultureInfo.InvariantCulture));
|
||||
config.AddCommand<Time.Main>(nameof(Time).ToLower(CultureInfo.InvariantCulture));
|
||||
config.AddCommand<ToLf.Main>(nameof(ToLf).ToLower(CultureInfo.InvariantCulture));
|
||||
config.AddCommand<Get.Main>(nameof(Get).ToLower(CultureInfo.InvariantCulture));
|
||||
|
||||
|
||||
config.ValidateExamples();
|
||||
@ -29,3 +39,5 @@ app.Configure(config => {
|
||||
|
||||
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
||||
return app.Run(args);
|
||||
}
|
||||
}
|
@ -27,28 +27,38 @@ internal sealed class Main : ToolBase<Option>
|
||||
var pDest = stackalloc char[Opt.Length];
|
||||
var sourceLen = 0;
|
||||
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.Number))
|
||||
foreach (var c in _charTable[0])
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.Number)) {
|
||||
foreach (var c in _charTable[0]) {
|
||||
*(pSource + sourceLen++) = c;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.LowerCaseLetter))
|
||||
foreach (var c in _charTable[1])
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.LowerCaseLetter)) {
|
||||
foreach (var c in _charTable[1]) {
|
||||
*(pSource + sourceLen++) = c;
|
||||
}
|
||||
}
|
||||
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.UpperCaseLetter))
|
||||
foreach (var c in _charTable[2])
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.UpperCaseLetter)) {
|
||||
foreach (var c in _charTable[2]) {
|
||||
*(pSource + sourceLen++) = c;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.SpecialCharacter))
|
||||
foreach (var c in _charTable[3])
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.SpecialCharacter)) {
|
||||
foreach (var c in _charTable[3]) {
|
||||
*(pSource + sourceLen++) = c;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var randScope = new[] { 0, sourceLen };
|
||||
for (var i = 0; i != Opt.Length; ++i) //
|
||||
{
|
||||
*(pDest + i) = *(pSource + randScope.Rand());
|
||||
}
|
||||
|
||||
var result = new string(pDest, 0, Opt.Length);
|
||||
Console.WriteLine(Str.Copied, result);
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
namespace Dot.Pwd;
|
||||
|
||||
internal class Option : OptionBase
|
||||
internal sealed class Option : OptionBase
|
||||
{
|
||||
[Flags]
|
||||
public enum GenerateTypes
|
||||
|
@ -14,11 +14,18 @@ internal sealed class Main : FilesTool<Option>
|
||||
{
|
||||
Span<byte> buffer = stackalloc byte[_utf8Bom.Length];
|
||||
var readLen = fsr.Read(buffer);
|
||||
if (readLen != _utf8Bom.Length || !buffer.SequenceEqual(_utf8Bom)) return false;
|
||||
if (readLen != _utf8Bom.Length || !buffer.SequenceEqual(_utf8Bom)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
using var fsw = CreateTempFile(out tempFile);
|
||||
int data;
|
||||
while ((data = fsr.ReadByte()) != -1) fsw.WriteByte((byte)data);
|
||||
|
||||
|
||||
while ((data = fsr.ReadByte()) != -1) {
|
||||
fsw.WriteByte((byte)data);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -35,7 +42,10 @@ internal sealed class Main : FilesTool<Option>
|
||||
}
|
||||
|
||||
if (CloneFileWithoutBom(fsr, ref tmpFile)) {
|
||||
if (Opt.WriteMode) File.Copy(tmpFile, file, true);
|
||||
if (Opt.WriteMode) {
|
||||
File.Copy(tmpFile, file, true);
|
||||
}
|
||||
|
||||
ShowMessage(0, 1, 0);
|
||||
UpdateStats(Path.GetExtension(file));
|
||||
}
|
||||
@ -44,6 +54,8 @@ internal sealed class Main : FilesTool<Option>
|
||||
}
|
||||
}
|
||||
|
||||
if (tmpFile != default) File.Delete(tmpFile);
|
||||
if (tmpFile != default) {
|
||||
File.Delete(tmpFile);
|
||||
}
|
||||
}
|
||||
}
|
@ -3,4 +3,4 @@
|
||||
|
||||
namespace Dot.Rbom;
|
||||
|
||||
internal class Option : DirOption { }
|
||||
internal sealed class Option : DirOption { }
|
@ -54,7 +54,10 @@ internal sealed class Main : ToolBase<Option>
|
||||
ret.HtmlEncode = text.Html();
|
||||
|
||||
|
||||
if (!text.IsBase64String()) return ret;
|
||||
if (!text.IsBase64String()) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
byte[] base64DeHex = null;
|
||||
try {
|
||||
base64DeHex = text.Base64De();
|
||||
@ -63,7 +66,10 @@ internal sealed class Main : ToolBase<Option>
|
||||
// ignored
|
||||
}
|
||||
|
||||
if (base64DeHex == null) return ret;
|
||||
if (base64DeHex == null) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret.Base64DeCodeHex = base64DeHex.String();
|
||||
ret.Base64DeCode = enc.GetString(base64DeHex);
|
||||
|
||||
@ -118,9 +124,13 @@ html-decode: {o.HtmlDecode}
|
||||
#endif
|
||||
{
|
||||
#if NET7_0_WINDOWS
|
||||
if (Opt.Text.NullOrEmpty()) Opt.Text = await ClipboardService.GetTextAsync();
|
||||
if (Opt.Text.NullOrEmpty()) {
|
||||
Opt.Text = await ClipboardService.GetTextAsync();
|
||||
}
|
||||
#endif
|
||||
if (Opt.Text.NullOrEmpty()) throw new ArgumentException(Str.InputTextIsEmpty);
|
||||
if (Opt.Text.NullOrEmpty()) {
|
||||
throw new ArgumentException(Str.InputTextIsEmpty);
|
||||
}
|
||||
|
||||
|
||||
ParseAndShow(Opt.Text);
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
namespace Dot.Text;
|
||||
|
||||
internal class Option : OptionBase
|
||||
internal sealed class Option : OptionBase
|
||||
{
|
||||
[CommandArgument(0, "[input text]")]
|
||||
[Description(nameof(Str.TextTobeProcessed))]
|
||||
|
@ -1,6 +1,7 @@
|
||||
// ReSharper disable ClassNeverInstantiated.Global
|
||||
|
||||
|
||||
using System.Globalization;
|
||||
using System.Net.Sockets;
|
||||
|
||||
namespace Dot.Time;
|
||||
@ -48,9 +49,9 @@ internal sealed class Main : ToolBase<Option>
|
||||
|
||||
try {
|
||||
socket.Connect(server, _NTP_PORT);
|
||||
socket.Send(ntpData);
|
||||
_ = socket.Send(ntpData);
|
||||
var timeBefore = DateTime.Now;
|
||||
socket.Receive(ntpData);
|
||||
_ = socket.Receive(ntpData);
|
||||
var transferTime = DateTime.Now - timeBefore;
|
||||
|
||||
var intPart = ((ulong)ntpData[40] << 24) //
|
||||
@ -130,8 +131,8 @@ internal sealed class Main : ToolBase<Option>
|
||||
.Average(x => x.Value.State.Result().TotalMilliseconds);
|
||||
});
|
||||
|
||||
AnsiConsole.MarkupLine(Str.NtpReceiveDone, $"[green]{_successCnt}[/]", _ntpServers.Length
|
||||
, $"[yellow]{_offsetAvg:f2}[/]");
|
||||
AnsiConsole.MarkupLine(CultureInfo.InvariantCulture, Str.NtpReceiveDone, $"[green]{_successCnt}[/]"
|
||||
, _ntpServers.Length, $"[yellow]{_offsetAvg:f2}[/]");
|
||||
|
||||
|
||||
if (Opt.Sync) {
|
||||
@ -159,11 +160,11 @@ internal sealed class Main : ToolBase<Option>
|
||||
table.UpdateCell(
|
||||
0, 1, DateTime.Now.AddMilliseconds(-_offsetAvg).ToString("O"))
|
||||
.UpdateCell(1, 1, DateTime.Now.ToString("O")));
|
||||
await Task.Delay(100);
|
||||
await Task.Delay(100, CancellationToken.None);
|
||||
}
|
||||
});
|
||||
|
||||
await AnsiConsole.Console.Input.ReadKeyAsync(true, cts.Token);
|
||||
_ = await AnsiConsole.Console.Input.ReadKeyAsync(true, cts.Token);
|
||||
cts.Cancel();
|
||||
await task;
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
namespace Dot.Time;
|
||||
|
||||
internal class Option : OptionBase
|
||||
internal sealed class Option : OptionBase
|
||||
{
|
||||
[CommandOption("-s|--sync")]
|
||||
[Description(nameof(Str.SyncToLocalTime))]
|
||||
|
@ -9,7 +9,7 @@ internal static class ProgressTaskStateExtensions
|
||||
|
||||
public static void Result(this ProgressTaskState me, TimeSpan value)
|
||||
{
|
||||
me.Update<TimeSpan>(nameof(TaskResultColumn), _ => value);
|
||||
_ = me.Update<TimeSpan>(nameof(TaskResultColumn), _ => value);
|
||||
}
|
||||
|
||||
public static TaskStatusColumn.Statues Status(this ProgressTaskState me)
|
||||
@ -19,6 +19,6 @@ internal static class ProgressTaskStateExtensions
|
||||
|
||||
public static void Status(this ProgressTaskState me, TaskStatusColumn.Statues value)
|
||||
{
|
||||
me.Update<TaskStatusColumn.Statues>(nameof(TaskStatusColumn), _ => value);
|
||||
_ = me.Update<TaskStatusColumn.Statues>(nameof(TaskStatusColumn), _ => value);
|
||||
}
|
||||
}
|
@ -5,7 +5,7 @@ using Spectre.Console.Rendering;
|
||||
|
||||
namespace Dot.Time;
|
||||
|
||||
internal class TaskResultColumn : ProgressColumn
|
||||
internal sealed class TaskResultColumn : ProgressColumn
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the alignment of the task description.
|
||||
|
@ -7,7 +7,7 @@ using Spectre.Console.Rendering;
|
||||
|
||||
namespace Dot.Time;
|
||||
|
||||
internal class TaskStatusColumn : ProgressColumn
|
||||
internal sealed class TaskStatusColumn : ProgressColumn
|
||||
{
|
||||
public enum Statues : byte
|
||||
{
|
||||
|
@ -34,7 +34,7 @@ internal sealed class Main : FilesTool<Option>
|
||||
continue;
|
||||
case 0x0d: //cr macos
|
||||
fsw.WriteByte(0x0a);
|
||||
fsr.Seek(-1, SeekOrigin.Current);
|
||||
_ = fsr.Seek(-1, SeekOrigin.Current);
|
||||
hasWrote = true;
|
||||
continue;
|
||||
case 0x00 or 0xff: //非文本文件
|
||||
@ -53,7 +53,10 @@ internal sealed class Main : FilesTool<Option>
|
||||
#pragma warning disable S2583
|
||||
if (hasWrote && !isBin) {
|
||||
#pragma warning restore S2583
|
||||
if (Opt.WriteMode) File.Copy(tmpFile, file, true);
|
||||
if (Opt.WriteMode) {
|
||||
File.Copy(tmpFile, file, true);
|
||||
}
|
||||
|
||||
ShowMessage(0, 1, 0);
|
||||
UpdateStats(Path.GetExtension(file));
|
||||
}
|
||||
|
@ -3,4 +3,4 @@
|
||||
|
||||
namespace Dot.ToLf;
|
||||
|
||||
internal class Option : DirOption { }
|
||||
internal sealed class Option : DirOption { }
|
@ -10,7 +10,7 @@ internal abstract class ToolBase<TOption> : Command<TOption> where TOption : Opt
|
||||
await Core();
|
||||
if (Opt.KeepSession) {
|
||||
AnsiConsole.MarkupLine(Str.PressAnyKey);
|
||||
AnsiConsole.Console.Input.ReadKey(true);
|
||||
_ = AnsiConsole.Console.Input.ReadKey(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12,17 +12,21 @@ internal sealed class Main : FilesTool<Option>
|
||||
private static int GetSpacesCnt(Stream fsr)
|
||||
{
|
||||
var trimLen = 0;
|
||||
fsr.Seek(-1, SeekOrigin.End);
|
||||
_ = fsr.Seek(-1, SeekOrigin.End);
|
||||
int data;
|
||||
while ((data = fsr.ReadByte()) != -1)
|
||||
while ((data = fsr.ReadByte()) != -1) {
|
||||
if (new[] { 0x20, 0x0d, 0x0a }.Contains(data)) {
|
||||
++trimLen;
|
||||
if (fsr.Position - 2 < 0) break;
|
||||
fsr.Seek(-2, SeekOrigin.Current);
|
||||
if (fsr.Position - 2 < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
_ = fsr.Seek(-2, SeekOrigin.Current);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return trimLen;
|
||||
}
|
||||
@ -41,14 +45,17 @@ internal sealed class Main : FilesTool<Option>
|
||||
return;
|
||||
}
|
||||
|
||||
fsrw.Seek(0, SeekOrigin.Begin);
|
||||
_ = fsrw.Seek(0, SeekOrigin.Begin);
|
||||
if (!fsrw.IsTextStream()) {
|
||||
ShowMessage(0, 0, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (Opt.WriteMode) fsrw.SetLength(fsrw.Length - spacesCnt);
|
||||
if (Opt.WriteMode) {
|
||||
fsrw.SetLength(fsrw.Length - spacesCnt);
|
||||
}
|
||||
|
||||
ShowMessage(0, 1, 0);
|
||||
UpdateStats(Path.GetExtension(file));
|
||||
}
|
||||
|
@ -3,4 +3,4 @@
|
||||
|
||||
namespace Dot.Trim;
|
||||
|
||||
internal class Option : DirOption { }
|
||||
internal sealed class Option : DirOption { }
|
@ -5,8 +5,14 @@
|
||||
<UseWindowsForms Condition="'$(TargetFramework)' == 'net7.0-windows'">true</UseWindowsForms>
|
||||
<RootNamespace>Dot</RootNamespace>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
<NoWarn>CA1416;S1075</NoWarn>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<AnalysisLevel>preview-all</AnalysisLevel>
|
||||
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
|
||||
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
||||
<MSBuildTreatWarningsAsErrors>true</MSBuildTreatWarningsAsErrors>
|
||||
<MSBuildWarningsAsErrors>true</MSBuildWarningsAsErrors>
|
||||
<WarningsAsErrors>true</WarningsAsErrors>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(TargetFramework)' == 'net7.0-windows'">
|
||||
<DefineConstants>$(DefineConstants);NET7_0_WINDOWS</DefineConstants>
|
||||
@ -23,11 +29,5 @@
|
||||
<LastGenOutput>Str.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Spectre.Console">
|
||||
<HintPath>..\..\..\..\..\ForkedGitReps\spectre.console\src\Spectre.Console\bin\Debug\net6.0\Spectre.Console.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<Import Project="../SonarqubleAnalyzer.props"/>
|
||||
<Import Project="../GenerateResx.targets"/>
|
||||
</Project>
|
Loading…
x
Reference in New Issue
Block a user