Compare commits

..

No commits in common. "main" and "v0.1.5" have entirely different histories.
main ... v0.1.5

8 changed files with 76 additions and 97 deletions

View file

@ -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}}"

View file

@ -1,5 +0,0 @@
<Project>
<PropertyGroup>
<ArtifactsPath>$(MSBuildThisFileDirectory)artifacts</ArtifactsPath>
</PropertyGroup>
</Project>

View file

@ -33,19 +33,18 @@ _**NOTE**_: The option `-p:PublishTrimmed=true` may produce some *warnings*. If
```sh
USAGE:
scrl [path] [OPTIONS]
scrl <path> [OPTIONS]
ARGUMENTS:
[path] Starting directory (Default: .)
<path> Starting directory (Default: .)
OPTIONS:
DEFAULT
-h, --help Prints help information
-x, --extensions <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"

View file

@ -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<RootCommandSettings>
public sealed class RootCommandSettings : CommandSettings
{
[Description("List of script extensions to search for")]
[CommandOption("-x|--extensions <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, "<path>")]
public string Directory { get; init; } = ".";
}

View file

@ -2,6 +2,5 @@ using ScriptLauncher;
using Spectre.Console.Cli;
var app = new CommandApp<RootCommand>();
app.Configure(static x => x.SetApplicationName("scrl"));
app.Configure(x => x.SetApplicationName("scrl"));
return app.Run(args);

View file

@ -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,
},
};
}
}

View file

@ -2,15 +2,23 @@ namespace ScriptLauncher;
internal readonly struct ScriptFinder
{
public IEnumerable<string> 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<string> 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<DirectoryInfo, FileInfo[]> 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());
}

View file

@ -1,12 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFrameworks>net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AnalysisMode>All</AnalysisMode>
<Version>0.1.7</Version>
<Version>0.1.5</Version>
<PackAsTool>true</PackAsTool>
<Description>Tool to find and exec shell scripts</Description>
<PackageReadmeFile>README.md</PackageReadmeFile>
@ -14,8 +14,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Spectre.Console" Version="0.49.1" />
<PackageReference Include="Spectre.Console.Cli" Version="0.49.1" />
<PackageReference Include="Spectre.Console" Version="0.47.0" />
<PackageReference Include="Spectre.Console.Cli" Version="0.47.0" />
</ItemGroup>
<ItemGroup>