Skip to content

Commit 6bd54bf

Browse files
authored
custom-completions: scoop: improve performance of getting scoop commands (#988)
Instead of calling scoop that calls powershell, use nushell's native commands. On Windows 11 virtual machine, powershell takes `330ms 492µs 860ns` on **fastest** case, with this commit takes `23ms 24µs 660ns` on **slowest**. ```nu > use old-scoop-completions.nu * > let oldTimes = (1..10 | each { timeit { scoopCommands } }) > $oldTimes | sort --reverse ╭───┬───────────────────╮ │ 0 │ 357ms 565µs 720ns │ │ 1 │ 344ms 64µs 450ns │ │ 2 │ 343ms 264µs 680ns │ │ 3 │ 342ms 686µs 10ns │ │ 4 │ 342ms 241µs 740ns │ │ 5 │ 338ms 365µs 910ns │ │ 6 │ 337ms 682µs 790ns │ │ 7 │ 335ms 473µs 290ns │ │ 8 │ 335ms 186µs 830ns │ │ 9 │ 330ms 492µs 860ns │ ╰───┴───────────────────╯ > $oldTimes | math avg 340ms 702µs 428ns > use scoop-completions.nu * > let newTimes = (1..10 | each { timeit { scoopCommands } }) > $newTimes | sort --reverse ╭───┬──────────────────╮ │ 0 │ 23ms 24µs 660ns │ │ 1 │ 18ms 33µs 480ns │ │ 2 │ 15ms 597µs 650ns │ │ 3 │ 15ms 412µs 850ns │ │ 4 │ 15ms 58µs 770ns │ │ 5 │ 14ms 536µs 30ns │ │ 6 │ 14ms 366µs 20ns │ │ 7 │ 14ms 175µs 270ns │ │ 8 │ 13ms 688µs 730ns │ │ 9 │ 13ms 378µs 590ns │ ╰───┴──────────────────╯ > $newTimes | math avg 15ms 727µs 205ns ```
1 parent 6c9f974 commit 6bd54bf

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

custom-completions/scoop/scoop-completions.nu

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,29 @@ def scoopShimBuilds [] {
9292
}
9393

9494
def scoopCommands [] {
95-
^powershell -nop -nol -c "(scoop help | ConvertTo-Json -Compress)"
96-
| decode
97-
| lines
98-
| last
99-
| to text
100-
| from json
101-
| rename value description
95+
let libexecDir = if ('SCOOP' in $env) {
96+
[ $env.SCOOP, 'apps', 'scoop', 'current', 'libexec' ] | path join
97+
} else {
98+
[ $env.USERPROFILE, 'scoop', 'apps', 'scoop', 'current', 'libexec' ] | path join
99+
}
100+
101+
let commands = (
102+
ls $libexecDir
103+
| each {|command|
104+
[
105+
[value, description];
106+
[
107+
# eg. scoop-help.ps1 -> help
108+
($command.name | path basename | str substring 6..-4),
109+
# second line is starts with '# Summary: '
110+
# eg. '# Summary: Install apps' -> 'Install apps'
111+
(open $command.name | lines | skip 1 | first | str substring 11..)
112+
]
113+
]
114+
}
115+
| flatten
116+
)
117+
$commands
102118
}
103119

104120
def scoopAliases [] {

0 commit comments

Comments
 (0)