New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Elvish Shell support #1066
Merged
Merged
Changes from all commits
Commits
Show all changes
34 commits
Select commit
Hold shift + click to select a range
1af3e99
feat: Elvish Shell support
elijahr e8e631c
Fix asdf.elv, add install docs
elijahr 6e8cf29
Update docs and tests
elijahr 242b88d
fix shellcheck issues
elijahr 6baada0
Fix tests
elijahr 2b034c9
Fix test
elijahr 5bb00bb
Fix other test
elijahr 1f1f570
Fix tests on older elvish
elijahr dfdb59c
Fix test
elijahr 8f7ea81
Install newer elvish
elijahr b05968f
Fix test
elijahr 8c7fb68
Add test for running command
elijahr 7cabf9b
Add test for running asdf subcommands
elijahr 1a15a53
Linter
elijahr 5186c1a
Remove command keyword
elijahr cec89d7
Fix test
elijahr 6b49ba2
Fix test
elijahr 207f1c1
-norc
elijahr 384f450
Add completions
elijahr 02069ff
Fix test
elijahr 9ba6749
Single module for asdf function & completions
elijahr 1295224
Fix uninstall instructions
elijahr 84f073a
Cleanup debug code
elijahr 2c9529b
Comments
elijahr f871425
Fix completer in unit tests
elijahr fa84123
Add unit test for ASDF_DATA_DIR
elijahr 9036d91
Revert change in command-info.bash
elijahr ab495ff
Fix installation instructions
elijahr 0b006ed
Add flags
elijahr 4383fbe
Ignore downloads dir
elijahr 624949c
Use regex for matching
elijahr 0b41485
Add plugin-test completion
elijahr e697aab
Format string
elijahr 2538279
Download elvish binary
elijahr File filter
Filter by extension
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
installs | ||
/installs | ||
/downloads | ||
/plugins | ||
shims | ||
/shims | ||
repository | ||
.vagrant | ||
keyrings | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,244 @@ | ||
|
||
use re | ||
use str | ||
use path | ||
|
||
var asdf_dir = $E:HOME'/.asdf' | ||
if (and (has-env ASDF_DIR) (!=s $E:ASDF_DIR '')) { | ||
asdf_dir = $E:ASDF_DIR | ||
} else { | ||
set-env ASDF_DIR $asdf_dir | ||
} | ||
|
||
var asdf_data_dir = $asdf_dir | ||
if (and (has-env ASDF_DATA_DIR) (!=s $E:ASDF_DATA_DIR '')) { | ||
asdf_data_dir = $E:ASDF_DATA_DIR | ||
} | ||
|
||
# Add function wrapper so we can export variables | ||
fn asdf [command @args]{ | ||
if (==s $command 'shell') { | ||
# set environment variables | ||
parts = [($asdf_dir'/bin/asdf' export-shell-version elvish $@args)] | ||
if (==s $parts[0] 'set-env') { | ||
set-env $parts[1] $parts[2] | ||
} elif (==s $parts[0] 'unset-env') { | ||
unset-env $parts[1] | ||
} | ||
} else { | ||
# forward other commands to asdf script | ||
$asdf_dir'/bin/asdf' $command $@args | ||
} | ||
} | ||
|
||
fn match [argz @pats]{ | ||
var matched = $true; | ||
if (!= (count $argz) (count $pats)) { | ||
matched = $false | ||
} else { | ||
for i [(range (count $pats))] { | ||
pat = '^'$pats[$i]'$' | ||
arg = $argz[$i] | ||
if (not (re:match $pat $arg)) { | ||
matched = $false | ||
break | ||
} | ||
} | ||
} | ||
put $matched | ||
} | ||
|
||
fn ls-shims []{ | ||
ls $asdf_data_dir'/shims' | ||
} | ||
|
||
fn ls-executables []{ | ||
# Print all executable files and links in path | ||
try { | ||
find $@paths '(' -type f -o -type l ')' -print 2>/dev/null | each [p]{ | ||
try { | ||
if (test -x $p) { | ||
path:base $p | ||
} | ||
} except { | ||
# don't fail if permission denied | ||
} | ||
} | ||
} except { | ||
# silence default non-zero exit status | ||
} | ||
} | ||
|
||
fn ls-installed-versions [plugin_name]{ | ||
asdf list $plugin_name | each [version]{ | ||
put (re:replace '\s*(.*)\s*' '${1}' $version) | ||
} | ||
} | ||
|
||
fn ls-all-versions [plugin_name]{ | ||
asdf list-all $plugin_name | each [version]{ | ||
put (re:replace '\s*(.*)\s*' '${1}' $version) | ||
} | ||
} | ||
|
||
# Append ~/.asdf/bin and ~/.asdf/shims to PATH | ||
for path [ | ||
$asdf_dir'/bin' | ||
$asdf_data_dir'/shims' | ||
] { | ||
if (not (has-value $paths $path)) { | ||
paths = [ | ||
$@paths | ||
$path | ||
] | ||
} | ||
} | ||
|
||
# Setup argument completions | ||
fn arg-completer [@argz]{ | ||
argz = $argz[1:-1] # strip 'asdf' and trailing empty string | ||
var num = (count $argz) | ||
if (== $num 0) { | ||
# list all subcommands | ||
find $asdf_dir'/lib/commands' -name 'command-*' | each [cmd]{ | ||
put (re:replace '.*/command-(.*)\.bash' '${1}' $cmd) | ||
} | ||
put 'plugin' | ||
} else { | ||
if (match $argz 'current') { | ||
# asdf current <name> | ||
asdf plugin-list | ||
} elif (match $argz 'env') { | ||
# asdf env <command> | ||
ls-shims | ||
} elif (match $argz 'env' '.*') { | ||
# asdf env <command> [util] | ||
ls-executables | ||
} elif (match $argz 'exec') { | ||
# asdf exec <command> | ||
ls-shims | ||
} elif (match $argz 'global') { | ||
# asdf global <name> | ||
asdf plugin-list | ||
} elif (match $argz 'global' '.*') { | ||
# asdf global <name> <version> | ||
ls-installed-versions $argz[-1] | ||
} elif (match $argz 'install') { | ||
# asdf install <name> | ||
asdf plugin-list | ||
} elif (match $argz 'install' '.*') { | ||
# asdf install <name> <version> | ||
ls-all-versions $argz[-1] | ||
} elif (match $argz 'install' '.*' '.*') { | ||
# asdf install <name> <version> [--keep-download] | ||
put '--keep-download' | ||
} elif (match $argz 'latest') { | ||
# asdf latest <name> | ||
asdf plugin-list | ||
} elif (match $argz 'latest' '.*') { | ||
# asdf latest <name> [<version>] | ||
ls-all-versions $argz[-1] | ||
} elif (match $argz 'list-all') { | ||
# asdf list all <name> | ||
asdf plugin-list | ||
} elif (match $argz 'list-all' '.*') { | ||
# asdf list all <name> [<version>] | ||
ls-all-versions $argz[-1] | ||
} elif (match $argz 'list') { | ||
# asdf list <name> | ||
asdf plugin-list | ||
} elif (match $argz 'list' '.*') { | ||
# asdf list <name> [<version>] | ||
ls-installed-versions $argz[-1] | ||
} elif (match $argz 'local') { | ||
# asdf local <name> [-p|--parent] | ||
asdf plugin-list | ||
put '-p' | ||
put '--parent' | ||
} elif (match $argz 'local' '(-p|(--parent))') { | ||
# asdf local <name> [-p|--parent] <version> | ||
asdf plugin-list | ||
} elif (match $argz 'local' '.*') { | ||
# asdf local <name> [-p|--parent] | ||
# asdf local <name> <version> | ||
ls-installed-versions $argz[-1] | ||
put '-p' | ||
put '--parent' | ||
} elif (match $argz 'local' '(-p|(--parent))' '.*') { | ||
# asdf local [-p|--parent] <name> <version> | ||
ls-installed-versions $argz[-1] | ||
} elif (match $argz 'local' '.*' '(-p|(--parent))') { | ||
# asdf local <name> [-p|--parent] <version> | ||
ls-installed-versions $argz[-2] | ||
} elif (match $argz 'local' '.*' '.*') { | ||
# asdf local <name> <version> [-p|--parent] | ||
put '-p' | ||
put '--parent' | ||
} elif (or (match $argz 'plugin-add') (match $argz 'plugin' 'add')) { | ||
# asdf plugin add <name> | ||
asdf plugin-list-all | each [line]{ | ||
put (re:replace '([^\s]+)\s+.*' '${1}' $line) | ||
} | ||
} elif (or (match $argz 'plugin-list') (match $argz 'plugin' 'list')) { | ||
# asdf plugin list | ||
put '--urls' | ||
put '--refs' | ||
put 'all' | ||
} elif (or (match $argz 'plugin-push') (match $argz 'plugin' 'push')) { | ||
# asdf plugin push <name> | ||
asdf plugin-list | ||
} elif (or (match $argz 'plugin-remove') (match $argz 'plugin' 'remove')) { | ||
# asdf plugin remove <name> | ||
asdf plugin-list | ||
} elif (and (>= (count $argz) 3) (match $argz[:3] 'plugin-test' '.*' '.*')) { | ||
# asdf plugin-test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*] | ||
put '--asdf-plugin-gitref' | ||
put '--asdf-tool-version' | ||
ls-executables | ||
ls-shims | ||
} elif (and (>= (count $argz) 4) (match $argz[:4] 'plugin' 'test' '.*' '.*')) { | ||
# asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*] | ||
put '--asdf-plugin-gitref' | ||
put '--asdf-tool-version' | ||
ls-executables | ||
ls-shims | ||
} elif (or (match $argz 'plugin-update') (match $argz 'plugin' 'update')) { | ||
# asdf plugin update <name> | ||
asdf plugin-list | ||
put '--all' | ||
} elif (match $argz 'plugin') { | ||
# list plugin-* subcommands | ||
find $asdf_dir'/lib/commands' -name 'command-plugin-*' | each [cmd]{ | ||
put (re:replace '.*/command-plugin-(.*)\.bash' '${1}' $cmd) | ||
} | ||
} elif (match $argz 'reshim') { | ||
# asdf reshim <name> | ||
asdf plugin-list | ||
} elif (match $argz 'reshim' '.*') { | ||
# asdf reshim <name> <version> | ||
ls-installed-versions $argz[-1] | ||
} elif (match $argz 'shim-versions') { | ||
# asdf shim-versions <command> | ||
ls-shims | ||
} elif (match $argz 'uninstall') { | ||
# asdf uninstall <name> | ||
asdf plugin-list | ||
} elif (match $argz 'uninstall' '.*') { | ||
# asdf uninstall <name> <version> | ||
ls-installed-versions $argz[-1] | ||
} elif (match $argz 'update') { | ||
if (== $num 1) { | ||
# asdf update | ||
put '--head' | ||
} | ||
} elif (match $argz 'where') { | ||
# asdf where <name> | ||
asdf plugin-list | ||
} elif (match $argz 'where' '.*') { | ||
# asdf where <name> [<version>] | ||
ls-installed-versions $argz[-1] | ||
} elif (match $argz 'which') { | ||
ls-shims | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How were you testing that required these changes?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added
/downloads
because that directory gets populated by a call toasdf install
with the--keep-download
flag.I added leading slashes to the other entries because https://stackoverflow.com/a/38433961:
My understanding is that this makes sure other, nested items with the same name won't be excluded.