diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 0f9354d..f5d7731 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -25,16 +25,16 @@ jobs: uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v3 + uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v2 with: category: "/language:${{matrix.language}}" diff --git a/Directory.Build.props b/Directory.Build.props deleted file mode 100644 index 93d5ad5..0000000 --- a/Directory.Build.props +++ /dev/null @@ -1,5 +0,0 @@ - - - $(MSBuildThisFileDirectory)artifacts - - diff --git a/README.md b/README.md index 246bb32..ab7118b 100644 --- a/README.md +++ b/README.md @@ -33,19 +33,18 @@ _**NOTE**_: The option `-p:PublishTrimmed=true` may produce some *warnings*. If ```sh USAGE: - scrl [path] [OPTIONS] + scrl [OPTIONS] ARGUMENTS: - [path] Starting directory (Default: .) + Starting directory (Default: .) OPTIONS: - DEFAULT - -h, --help Prints help information - -x, --extensions List of script extensions to search for - -d, --depth 3 Search depth - -e, --elevated Run with elevated privileges - -g, --group Group scripts by folder - -b, --brief Show brief information + -h, --help Prints help information + -x, --extensions Comma separated list of script extensions + -d, --depth Search depth + -e, --elevated Run with elevated privileges + -g, --group Group scripts by folder + -b, --brief Show brief information ``` [CLI]: https://docs.microsoft.com/en-us/dotnet/core/tools/ ".NET CLI Docs" diff --git a/src/Commands.cs b/src/Commands.cs index ed0b950..4be0a59 100644 --- a/src/Commands.cs +++ b/src/Commands.cs @@ -1,5 +1,5 @@ using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; + using Spectre.Console; using Spectre.Console.Cli; @@ -76,30 +76,27 @@ public sealed class RootCommand : AsyncCommand public sealed class RootCommandSettings : CommandSettings { - [Description("List of script extensions to search for")] - [CommandOption("-x|--extensions ")] - [SuppressMessage("Performance", "CA1819:Properties should not return arrays")] - public string[] Extensions { get; init; } = [".ps1", ".*sh", ".bat", ".cmd", ".nu"]; + [Description("Comma separated list of script extensions")] + [CommandOption("-x|--extensions")] + public string? Extensions { get; init; } [Description("Search depth")] [CommandOption("-d|--depth")] - [DefaultValue(3)] - public int Depth { get; init; } + public int Depth { get; init; } = 1; [Description("Run with elevated privileges")] [CommandOption("-e|--elevated")] - public bool Elevated { get; init; } + public bool Elevated { get; init; } = false; [Description("Group scripts by folder")] [CommandOption("-g|--group")] - public bool Group { get; init; } + public bool Group { get; init; } = false; [Description("Show brief information")] [CommandOption("-b|--brief")] - public bool Brief { get; init; } + public bool Brief { get; init; } = false; [Description("Starting directory (Default: .)")] - [CommandArgument(0, "[path]")] - [DefaultValue(".")] - public string Directory { get; init; } = string.Empty; -} + [CommandArgument(0, "")] + public string Directory { get; init; } = "."; +} \ No newline at end of file diff --git a/src/Program.cs b/src/Program.cs index 836c56b..f53f375 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -2,6 +2,5 @@ using ScriptLauncher; using Spectre.Console.Cli; var app = new CommandApp(); -app.Configure(static x => x.SetApplicationName("scrl")); - +app.Configure(x => x.SetApplicationName("scrl")); return app.Run(args); diff --git a/src/ScriptExecutor.cs b/src/ScriptExecutor.cs index a1d14aa..77e1fe0 100644 --- a/src/ScriptExecutor.cs +++ b/src/ScriptExecutor.cs @@ -26,55 +26,36 @@ internal static class ScriptExecutor ).ConfigureAwait(ConfigureAwaitOptions.None); } - private static string GetElevationVerb(bool elevated) - { - if (!elevated) + private static ProcessStartInfo? GetExecutableProcessInfo(FileInfo file, bool elevated) => + file.Extension switch { - return string.Empty; - } - - var platform = Environment.OSVersion.Platform; - return platform switch - { - PlatformID.Win32NT => "runas /user:Administrator", - PlatformID.Unix or PlatformID.MacOSX => "sudo", - _ => string.Empty, + ".bat" + or ".cmd" + => new ProcessStartInfo + { + FileName = "cmd", + Arguments = $"/Q /C .\\{file.Name}", + Verb = elevated ? "runas /user:Administrator" : string.Empty, + WorkingDirectory = file.DirectoryName + }, + ".ps1" + => new ProcessStartInfo + { + FileName = "powershell.exe", + Arguments = $"-NoProfile -ExecutionPolicy Bypass -File .\\{file.Name}", + Verb = elevated ? "runas /user:Administrator" : string.Empty, + WorkingDirectory = file.DirectoryName + }, + ".sh" + or ".zsh" + or ".fish" + => new ProcessStartInfo + { + FileName = "sh", + Arguments = $"-c ./{file.Name}", + Verb = elevated ? "sudo" : string.Empty, + WorkingDirectory = file.DirectoryName + }, + _ => null }; - } - - private static ProcessStartInfo? GetExecutableProcessInfo(FileInfo file, bool elevated) - { - var verb = GetElevationVerb(elevated); - return file.Extension switch - { - ".bat" or ".cmd" => new ProcessStartInfo - { - FileName = "cmd", - Arguments = $"/Q /C ./{file.Name}", - Verb = verb, - WorkingDirectory = file.DirectoryName, - }, - ".ps1" => new ProcessStartInfo - { - FileName = "powershell.exe", - Arguments = $"-NoProfile -ExecutionPolicy Bypass -File ./{file.Name}", - Verb = verb, - WorkingDirectory = file.DirectoryName, - }, - ".nu" => new ProcessStartInfo - { - FileName = "nu", - Arguments = $"--no-config-file ./{file.Name}", - Verb = verb, - WorkingDirectory = file.DirectoryName, - }, - _ => new ProcessStartInfo - { - FileName = "sh", - Arguments = $"-c ./{file.Name}", - Verb = verb, - WorkingDirectory = file.DirectoryName, - }, - }; - } } diff --git a/src/ScriptFinder.cs b/src/ScriptFinder.cs index e7040f4..3ea2f4a 100644 --- a/src/ScriptFinder.cs +++ b/src/ScriptFinder.cs @@ -2,15 +2,23 @@ namespace ScriptLauncher; internal readonly struct ScriptFinder { - public IEnumerable Extensions { get; } + private static readonly string[] DefaultExtensions = new[] { ".ps1", ".*sh", ".bat", ".cmd" }; + private static readonly char[] DefaultSeparators = new[] { ',', ' ' }; + + public string[] Extensions { get; } public string RootDirectory { get; } - private int Depth { get; } + public int Depth { get; } private readonly EnumerationOptions _options; - public ScriptFinder(IEnumerable extensions, string directory, int depth) + public ScriptFinder(string? extensions, string directory, int depth) { - Extensions = extensions.ToHashSet().Select(static x => $".{x.TrimStart('.')}"); + Extensions = + extensions + ?.Split(DefaultSeparators, StringSplitOptions.RemoveEmptyEntries) + .ToHashSet() + .Select(x => $".{x.TrimStart('.')}") + .ToArray() ?? DefaultExtensions; Depth = depth; RootDirectory = directory; @@ -28,7 +36,7 @@ internal readonly struct ScriptFinder try { var filenames = Directory.GetFiles(RootDirectory, $"*{extension}", _options); - return filenames.Select(static x => new FileInfo(x)); + return filenames.Select(x => new FileInfo(x)); } catch (UnauthorizedAccessException) { @@ -37,13 +45,13 @@ internal readonly struct ScriptFinder } public FileInfo[] GetScripts() => - Extensions.Select(GetScriptFilesWithExtension).SelectMany(static x => x).ToArray(); + Extensions.Select(GetScriptFilesWithExtension).SelectMany(x => x).ToArray(); public IDictionary GetScriptsByDirectory() => Extensions .Select(GetScriptFilesWithExtension) - .SelectMany(static x => x) - .GroupBy(static x => x.DirectoryName!) - .OrderBy(static x => x.Key) - .ToDictionary(static x => new DirectoryInfo(x.Key), static x => x.ToArray()); + .SelectMany(x => x) + .GroupBy(x => x.DirectoryName!) + .OrderBy(x => x.Key) + .ToDictionary(x => new DirectoryInfo(x.Key), x => x.ToArray()); } diff --git a/src/ScriptLauncher.csproj b/src/ScriptLauncher.csproj index 985e1e3..7784893 100644 --- a/src/ScriptLauncher.csproj +++ b/src/ScriptLauncher.csproj @@ -1,12 +1,12 @@ - + Exe - net8.0 + net8.0 enable enable All - 0.1.7 + 0.1.5 true Tool to find and exec shell scripts README.md @@ -14,8 +14,8 @@ - - + +