mirror of
https://github.com/ScoopInstaller/Scoop.git
synced 2025-10-30 14:17:54 +00:00
fix(scoop-alias): Pass options correctly (#6003)
Co-authored-by: Hsiao-nan Cheung <niheaven@gmail.com>
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
- **bucket:** Implement error handling for failed bucket addition ([#6051](https://github.com/ScoopInstaller/Scoop/issues/6051))
|
||||
- **scoop-virustotal:** Adjust `json_path` parameters to retrieve correct analysis stats ([#6044](https://github.com/ScoopInstaller/Scoop/issues/6044))
|
||||
- **install:** Fix parsing error when installing multiple apps w/ specific version ([#6039](https://github.com/ScoopInstaller/Scoop/issues/6039))
|
||||
- **scoop-alias:** Pass options correctly ([#6003](https://github.com/ScoopInstaller/Scoop/issues/6003))
|
||||
|
||||
## [v0.5.0](https://github.com/ScoopInstaller/Scoop/compare/v0.4.2...v0.5.0) - 2024-07-01
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# Description: Functions for managing commands and aliases.
|
||||
|
||||
## Functions for commands
|
||||
|
||||
function command_files {
|
||||
(Get-ChildItem "$PSScriptRoot\..\libexec") + (Get-ChildItem "$scoopdir\shims") |
|
||||
Where-Object 'scoop-.*?\.ps1$' -Property Name -Match
|
||||
@@ -19,11 +23,10 @@ function command_path($cmd) {
|
||||
# get path from shim
|
||||
$shim_path = "$scoopdir\shims\scoop-$cmd.ps1"
|
||||
$line = ((Get-Content $shim_path) | Where-Object { $_.startswith('$path') })
|
||||
if($line) {
|
||||
if ($line) {
|
||||
Invoke-Command ([scriptblock]::Create($line)) -NoNewScope
|
||||
$cmd_path = $path
|
||||
}
|
||||
else { $cmd_path = $shim_path }
|
||||
} else { $cmd_path = $shim_path }
|
||||
}
|
||||
|
||||
$cmd_path
|
||||
@@ -34,3 +37,82 @@ function exec($cmd, $arguments) {
|
||||
|
||||
& $cmd_path @arguments
|
||||
}
|
||||
|
||||
## Functions for aliases
|
||||
|
||||
function add_alias {
|
||||
param(
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[string]$name,
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[string]$command,
|
||||
[string]$description
|
||||
)
|
||||
|
||||
$aliases = get_config ALIAS ([PSCustomObject]@{})
|
||||
if ($aliases.$name) {
|
||||
abort "Alias '$name' already exists."
|
||||
}
|
||||
|
||||
$alias_script_name = "scoop-$name"
|
||||
$shimdir = shimdir $false
|
||||
if (Test-Path "$shimdir\$alias_script_name.ps1") {
|
||||
abort "File '$alias_script_name.ps1' already exists in shims directory."
|
||||
}
|
||||
$script = @(
|
||||
"# Summary: $description",
|
||||
"$command"
|
||||
) -join "`n"
|
||||
try {
|
||||
$script | Out-UTF8File "$shimdir\$alias_script_name.ps1"
|
||||
} catch {
|
||||
abort $_.Exception
|
||||
}
|
||||
|
||||
# Add the new alias to the config.
|
||||
$aliases | Add-Member -MemberType NoteProperty -Name $name -Value $alias_script_name
|
||||
set_config ALIAS $aliases | Out-Null
|
||||
}
|
||||
|
||||
function rm_alias {
|
||||
param(
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[string]$name
|
||||
)
|
||||
|
||||
$aliases = get_config ALIAS ([PSCustomObject]@{})
|
||||
if (!$aliases.$name) {
|
||||
abort "Alias '$name' doesn't exist."
|
||||
}
|
||||
|
||||
info "Removing alias '$name'..."
|
||||
Remove-Item "$(shimdir $false)\scoop-$name.ps1"
|
||||
$aliases.PSObject.Properties.Remove($name)
|
||||
set_config ALIAS $aliases | Out-Null
|
||||
}
|
||||
|
||||
function list_aliases {
|
||||
param(
|
||||
[bool]$verbose
|
||||
)
|
||||
|
||||
$aliases = get_config ALIAS ([PSCustomObject]@{})
|
||||
$alias_info = $aliases.PSObject.Properties.Name | Where-Object { $_ } | ForEach-Object {
|
||||
$content = Get-Content (command_path $_)
|
||||
[PSCustomObject]@{
|
||||
Name = $_
|
||||
Summary = (summary $content).Trim()
|
||||
Command = ($content | Select-Object -Skip 1).Trim()
|
||||
}
|
||||
}
|
||||
if (!$alias_info) {
|
||||
info 'No alias found.'
|
||||
return
|
||||
}
|
||||
$alias_info = $alias_info | Sort-Object Name
|
||||
$properties = @('Name', 'Command')
|
||||
if ($verbose) {
|
||||
$properties += 'Summary'
|
||||
}
|
||||
$alias_info | Select-Object $properties
|
||||
}
|
||||
|
||||
@@ -1,117 +1,68 @@
|
||||
# Usage: scoop alias add|list|rm [<args>]
|
||||
# Usage: scoop alias <subcommand> [options] [<args>]
|
||||
# Summary: Manage scoop aliases
|
||||
# Help: Add, remove or list Scoop aliases
|
||||
# Help: Available subcommands: add, rm, list.
|
||||
#
|
||||
# Aliases are custom Scoop subcommands that can be created to make common tasks
|
||||
# easier.
|
||||
# Aliases are custom Scoop subcommands that can be created to make common tasks easier.
|
||||
#
|
||||
# To add an Alias:
|
||||
# scoop alias add <name> <command> <description>
|
||||
# To add an alias:
|
||||
#
|
||||
# e.g.:
|
||||
# scoop alias add rm 'scoop uninstall $args[0]' 'Uninstalls an app'
|
||||
# scoop alias add upgrade 'scoop update *' 'Updates all apps, just like brew or apt'
|
||||
# scoop alias add <name> <command> [<description>]
|
||||
#
|
||||
# e.g.,
|
||||
#
|
||||
# scoop alias add rm 'scoop uninstall $args[0]' 'Uninstall an app'
|
||||
# scoop alias add upgrade 'scoop update *' 'Update all apps, just like "brew" or "apt"'
|
||||
#
|
||||
# To remove an alias:
|
||||
#
|
||||
# scoop alias rm <name>
|
||||
#
|
||||
# To list all aliases:
|
||||
#
|
||||
# scoop alias list [-v|--verbose]
|
||||
#
|
||||
# Options:
|
||||
# -v, --verbose Show alias description and table headers (works only for 'list')
|
||||
# -v, --verbose Show alias description and table headers (works only for "list")
|
||||
|
||||
param(
|
||||
[String]$opt,
|
||||
[String]$name,
|
||||
[String]$command,
|
||||
[String]$description,
|
||||
[Switch]$verbose = $false
|
||||
)
|
||||
param($SubCommand)
|
||||
|
||||
. "$PSScriptRoot\..\lib\install.ps1" # shim related
|
||||
. "$PSScriptRoot\..\lib\getopt.ps1"
|
||||
|
||||
$script:config_alias = 'alias'
|
||||
|
||||
function init_alias_config {
|
||||
$aliases = get_config $script:config_alias
|
||||
if ($aliases) {
|
||||
$aliases
|
||||
$SubCommands = @('add', 'rm', 'list')
|
||||
if ($SubCommand -notin $SubCommands) {
|
||||
if (!$SubCommand) {
|
||||
error '<subcommand> missing'
|
||||
} else {
|
||||
New-Object -TypeName PSObject
|
||||
error "'$SubCommand' is not one of available subcommands: $($SubCommands -join ', ')"
|
||||
}
|
||||
my_usage
|
||||
exit 1
|
||||
}
|
||||
|
||||
function add_alias($name, $command) {
|
||||
if (!$command) {
|
||||
abort "Can't create an empty alias."
|
||||
$opt, $other, $err = getopt $Args 'v' , 'verbose'
|
||||
if ($err) { "scoop alias: $err"; exit 1 }
|
||||
|
||||
$name, $command, $description = $other
|
||||
$verbose = $opt.v -or $opt.verbose
|
||||
|
||||
switch ($SubCommand) {
|
||||
'add' {
|
||||
if (!$name -or !$command) {
|
||||
error "<name> and <command> must be specified for subcommand 'add'"
|
||||
exit 1
|
||||
}
|
||||
add_alias $name $command $description
|
||||
}
|
||||
|
||||
# get current aliases from config
|
||||
$aliases = init_alias_config
|
||||
if ($aliases.$name) {
|
||||
abort "Alias '$name' already exists."
|
||||
'rm' {
|
||||
if (!$name) {
|
||||
error "<name> must be specified for subcommand 'rm'"
|
||||
exit 1
|
||||
}
|
||||
rm_alias $name
|
||||
}
|
||||
|
||||
$alias_file = "scoop-$name"
|
||||
|
||||
# generate script
|
||||
$shimdir = shimdir $false
|
||||
if (Test-Path "$shimdir\$alias_file.ps1") {
|
||||
abort "File '$alias_file.ps1' already exists in shims directory."
|
||||
'list' {
|
||||
list_aliases $verbose
|
||||
}
|
||||
$script =
|
||||
@(
|
||||
"# Summary: $description",
|
||||
"$command"
|
||||
) -join "`r`n"
|
||||
$script | Out-UTF8File "$shimdir\$alias_file.ps1"
|
||||
|
||||
# add alias to config
|
||||
$aliases | Add-Member -MemberType NoteProperty -Name $name -Value $alias_file
|
||||
|
||||
set_config $script:config_alias $aliases | Out-Null
|
||||
}
|
||||
|
||||
function rm_alias($name) {
|
||||
$aliases = init_alias_config
|
||||
if (!$name) {
|
||||
abort 'Alias to be removed has not been specified!'
|
||||
}
|
||||
|
||||
if ($aliases.$name) {
|
||||
info "Removing alias '$name'..."
|
||||
|
||||
rm_shim $aliases.$name (shimdir $false)
|
||||
|
||||
$aliases.PSObject.Properties.Remove($name)
|
||||
set_config $script:config_alias $aliases | Out-Null
|
||||
} else {
|
||||
abort "Alias '$name' doesn't exist."
|
||||
}
|
||||
}
|
||||
|
||||
function list_aliases {
|
||||
$aliases = @()
|
||||
|
||||
(init_alias_config).PSObject.Properties.GetEnumerator() | ForEach-Object {
|
||||
$content = Get-Content (command_path $_.Name)
|
||||
$command = ($content | Select-Object -Skip 1).Trim()
|
||||
$summary = (summary $content).Trim()
|
||||
|
||||
$aliases += New-Object psobject -Property @{Name = $_.name; Summary = $summary; Command = $command }
|
||||
}
|
||||
|
||||
if (!$aliases.count) {
|
||||
info "No alias found."
|
||||
}
|
||||
$aliases = $aliases.GetEnumerator() | Sort-Object Name
|
||||
if ($verbose) {
|
||||
return $aliases | Select-Object Name, Command, Summary
|
||||
} else {
|
||||
return $aliases | Select-Object Name, Command
|
||||
}
|
||||
}
|
||||
|
||||
switch ($opt) {
|
||||
'add' { add_alias $name $command }
|
||||
'rm' { rm_alias $name }
|
||||
'list' { list_aliases }
|
||||
default { my_usage; exit 1 }
|
||||
}
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
BeforeAll {
|
||||
. "$PSScriptRoot\Scoop-TestLib.ps1"
|
||||
. "$PSScriptRoot\..\lib\core.ps1"
|
||||
. "$PSScriptRoot\..\lib\help.ps1"
|
||||
. "$PSScriptRoot\..\libexec\scoop-alias.ps1" | Out-Null
|
||||
. "$PSScriptRoot\..\lib\commands.ps1"
|
||||
}
|
||||
|
||||
Describe 'Manipulate Alias' -Tag 'Scoop' {
|
||||
@@ -15,32 +14,32 @@ Describe 'Manipulate Alias' -Tag 'Scoop' {
|
||||
ensure $shimdir
|
||||
}
|
||||
|
||||
It 'Creates a new alias if alias doesn''t exist' {
|
||||
$alias_file = "$shimdir\scoop-rm.ps1"
|
||||
$alias_file | Should -Not -Exist
|
||||
It 'Creates a new alias if it does not exist' {
|
||||
$alias_script = "$shimdir\scoop-rm.ps1"
|
||||
$alias_script | Should -Not -Exist
|
||||
|
||||
add_alias 'rm' '"hello, world!"'
|
||||
& $alias_file | Should -Be 'hello, world!'
|
||||
& $alias_script | Should -Be 'hello, world!'
|
||||
}
|
||||
|
||||
It 'Does not change existing file if its filename same as alias name' {
|
||||
$alias_file = "$shimdir\scoop-rm.ps1"
|
||||
It 'Skips an existing alias' {
|
||||
$alias_script = "$shimdir\scoop-rm.ps1"
|
||||
Mock abort {}
|
||||
New-Item $alias_file -Type File -Force
|
||||
$alias_file | Should -Exist
|
||||
New-Item $alias_script -Type File -Force
|
||||
$alias_script | Should -Exist
|
||||
|
||||
add_alias 'rm' '"test"'
|
||||
Should -Invoke -CommandName abort -Times 1 -ParameterFilter { $msg -eq "File 'scoop-rm.ps1' already exists in shims directory." }
|
||||
}
|
||||
|
||||
It 'Removes an existing alias' {
|
||||
$alias_file = "$shimdir\scoop-rm.ps1"
|
||||
$alias_file | Should -Exist
|
||||
$alias_script = "$shimdir\scoop-rm.ps1"
|
||||
$alias_script | Should -Exist
|
||||
Mock get_config { @(@{'rm' = 'scoop-rm' }) }
|
||||
Mock info {}
|
||||
|
||||
rm_alias 'rm'
|
||||
$alias_file | Should -Not -Exist
|
||||
$alias_script | Should -Not -Exist
|
||||
Should -Invoke -CommandName info -Times 1 -ParameterFilter { $msg -eq "Removing alias 'rm'..." }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user