From 89c8460761ecd784d0bb39e8fd7ff77fc19028d9 Mon Sep 17 00:00:00 2001 From: Danny Ben Shitrit Date: Wed, 19 Aug 2026 21:32:40 +0300 Subject: [PATCH 1/2] - Regenerate with bashly 2.0 --- doc/rush-add.1 | 2 +- doc/rush-add.md | 2 +- doc/rush-clone.1 | 2 +- doc/rush-clone.md | 2 +- doc/rush-completions.1 | 15 +- doc/rush-completions.md | 21 +- doc/rush-config.1 | 2 +- doc/rush-config.md | 2 +- doc/rush-copy.1 | 2 +- doc/rush-copy.md | 2 +- doc/rush-default.1 | 2 +- doc/rush-default.md | 2 +- doc/rush-edit.1 | 2 +- doc/rush-edit.md | 2 +- doc/rush-get.1 | 2 +- doc/rush-get.md | 2 +- doc/rush-info.1 | 2 +- doc/rush-info.md | 2 +- doc/rush-list.1 | 2 +- doc/rush-list.md | 2 +- doc/rush-menu.1 | 2 +- doc/rush-menu.md | 2 +- doc/rush-pull.1 | 2 +- doc/rush-pull.md | 2 +- doc/rush-push.1 | 2 +- doc/rush-push.md | 2 +- doc/rush-remove.1 | 2 +- doc/rush-remove.md | 2 +- doc/rush-search.1 | 2 +- doc/rush-search.md | 2 +- doc/rush-show.1 | 2 +- doc/rush-show.md | 2 +- doc/rush-snatch.1 | 2 +- doc/rush-snatch.md | 2 +- doc/rush-undo.1 | 2 +- doc/rush-undo.md | 2 +- doc/rush.1 | 4 +- doc/rush.md | 4 +- features/completions.feature | 3 +- rush | 1693 +++++++++++++++++++++++----------- settings.yml | 2 + src/bashly.yml | 32 +- src/lib/send_completions.sh | 510 ---------- 43 files changed, 1227 insertions(+), 1125 deletions(-) delete mode 100644 src/lib/send_completions.sh diff --git a/doc/rush-add.1 b/doc/rush-add.1 index f4eba99..706005c 100644 --- a/doc/rush-add.1 +++ b/doc/rush-add.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-add" "1" "July 2026" "" "Register a local repository." +.TH "rush\-add" "1" "August 2026" "" "Register a local repository." .SH NAME \f[B]rush add\f[R] \- Register a local repository. .SH SYNOPSIS diff --git a/doc/rush-add.md b/doc/rush-add.md index d6faa49..1683060 100644 --- a/doc/rush-add.md +++ b/doc/rush-add.md @@ -1,6 +1,6 @@ % rush-add(1) | Register a local repository. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-clone.1 b/doc/rush-clone.1 index 5ff39f2..bac5d1f 100644 --- a/doc/rush-clone.1 +++ b/doc/rush-clone.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-clone" "1" "July 2026" "" "Clone a GitHub package repository." +.TH "rush\-clone" "1" "August 2026" "" "Clone a GitHub package repository." .SH NAME \f[B]rush clone\f[R] \- Clone a GitHub package repository. .SH SYNOPSIS diff --git a/doc/rush-clone.md b/doc/rush-clone.md index 2174a7e..c19484a 100644 --- a/doc/rush-clone.md +++ b/doc/rush-clone.md @@ -1,6 +1,6 @@ % rush-clone(1) | Clone a GitHub package repository. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-completions.1 b/doc/rush-completions.1 index 1bc0de6..941dd62 100644 --- a/doc/rush-completions.1 +++ b/doc/rush-completions.1 @@ -1,11 +1,18 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-completions" "1" "July 2026" "" "Generate bash completions." +.TH "rush\-completions" "1" "August 2026" "" "Generate a shell completion script" .SH NAME -\f[B]rush completions\f[R] \- Generate bash completions. +\f[B]rush completions\f[R] \- Generate a shell completion script .SH SYNOPSIS -\f[B]rush completions\f[R] +\f[B]rush completions\f[R] SHELL .SH DESCRIPTION -Generate bash completions. +Generate a shell completion script +.SH ARGUMENTS +.SS SHELL +Shell to generate completions for +.IP \(bu 2 +Default Value: \f[B]bash\f[R] +.IP \(bu 2 +Allowed Values: \f[B]bash, zsh\f[R] .SH SEE ALSO \f[B]rush\f[R](1) diff --git a/doc/rush-completions.md b/doc/rush-completions.md index 54416e7..fa7bf15 100644 --- a/doc/rush-completions.md +++ b/doc/rush-completions.md @@ -1,23 +1,34 @@ -% rush-completions(1) | Generate bash completions. +% rush-completions(1) | Generate a shell completion script % -% July 2026 +% August 2026 NAME ================================================== -**rush completions** - Generate bash completions. +**rush completions** - Generate a shell completion script SYNOPSIS ================================================== -**rush completions** +**rush completions** [SHELL] DESCRIPTION ================================================== -Generate bash completions. +Generate a shell completion script +ARGUMENTS +================================================== + +SHELL +-------------------------------------------------- + +Shell to generate completions for + +- Default Value: **bash** +- Allowed Values: **bash, zsh** + SEE ALSO ================================================== diff --git a/doc/rush-config.1 b/doc/rush-config.1 index f508563..134373e 100644 --- a/doc/rush-config.1 +++ b/doc/rush-config.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-config" "1" "July 2026" "" "Show or edit the configuration file." +.TH "rush\-config" "1" "August 2026" "" "Show or edit the configuration file." .SH NAME \f[B]rush config\f[R] \- Show or edit the configuration file. .SH SYNOPSIS diff --git a/doc/rush-config.md b/doc/rush-config.md index dc05b94..af6997a 100644 --- a/doc/rush-config.md +++ b/doc/rush-config.md @@ -1,6 +1,6 @@ % rush-config(1) | Show or edit the configuration file. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-copy.1 b/doc/rush-copy.1 index 84fe400..f27cb71 100644 --- a/doc/rush-copy.1 +++ b/doc/rush-copy.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-copy" "1" "July 2026" "" "Copy a package between local repositories." +.TH "rush\-copy" "1" "August 2026" "" "Copy a package between local repositories." .SH NAME \f[B]rush copy\f[R] \- Copy a package between local repositories. .SH SYNOPSIS diff --git a/doc/rush-copy.md b/doc/rush-copy.md index c6aeef4..a3f6c67 100644 --- a/doc/rush-copy.md +++ b/doc/rush-copy.md @@ -1,6 +1,6 @@ % rush-copy(1) | Copy a package between local repositories. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-default.1 b/doc/rush-default.1 index e5e8bf3..5a4d115 100644 --- a/doc/rush-default.1 +++ b/doc/rush-default.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-default" "1" "July 2026" "" "Set a default repository." +.TH "rush\-default" "1" "August 2026" "" "Set a default repository." .SH NAME \f[B]rush default\f[R] \- Set a default repository. .SH SYNOPSIS diff --git a/doc/rush-default.md b/doc/rush-default.md index 620a974..65eae42 100644 --- a/doc/rush-default.md +++ b/doc/rush-default.md @@ -1,6 +1,6 @@ % rush-default(1) | Set a default repository. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-edit.1 b/doc/rush-edit.1 index 7d7df9b..0373a19 100644 --- a/doc/rush-edit.1 +++ b/doc/rush-edit.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-edit" "1" "July 2026" "" "Edit package files." +.TH "rush\-edit" "1" "August 2026" "" "Edit package files." .SH NAME \f[B]rush edit\f[R] \- Edit package files. .SH SYNOPSIS diff --git a/doc/rush-edit.md b/doc/rush-edit.md index b4eef57..7ac28c7 100644 --- a/doc/rush-edit.md +++ b/doc/rush-edit.md @@ -1,6 +1,6 @@ % rush-edit(1) | Edit package files. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-get.1 b/doc/rush-get.1 index 8da6175..1360f74 100644 --- a/doc/rush-get.1 +++ b/doc/rush-get.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-get" "1" "July 2026" "" "Install a package." +.TH "rush\-get" "1" "August 2026" "" "Install a package." .SH NAME \f[B]rush get\f[R] \- Install a package. .SH SYNOPSIS diff --git a/doc/rush-get.md b/doc/rush-get.md index fa66eaa..740588d 100644 --- a/doc/rush-get.md +++ b/doc/rush-get.md @@ -1,6 +1,6 @@ % rush-get(1) | Install a package. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-info.1 b/doc/rush-info.1 index fb1b52d..e0889cc 100644 --- a/doc/rush-info.1 +++ b/doc/rush-info.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-info" "1" "July 2026" "" "Show information about a package." +.TH "rush\-info" "1" "August 2026" "" "Show information about a package." .SH NAME \f[B]rush info\f[R] \- Show information about a package. .SH SYNOPSIS diff --git a/doc/rush-info.md b/doc/rush-info.md index 3919683..f5114a8 100644 --- a/doc/rush-info.md +++ b/doc/rush-info.md @@ -1,6 +1,6 @@ % rush-info(1) | Show information about a package. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-list.1 b/doc/rush-list.1 index 7bc0ad3..f78860c 100644 --- a/doc/rush-list.1 +++ b/doc/rush-list.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-list" "1" "July 2026" "" "Show packages in one or all repositories." +.TH "rush\-list" "1" "August 2026" "" "Show packages in one or all repositories." .SH NAME \f[B]rush list\f[R] \- Show packages in one or all repositories. .SH SYNOPSIS diff --git a/doc/rush-list.md b/doc/rush-list.md index 4ab85c4..7e72f5a 100644 --- a/doc/rush-list.md +++ b/doc/rush-list.md @@ -1,6 +1,6 @@ % rush-list(1) | Show packages in one or all repositories. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-menu.1 b/doc/rush-menu.1 index 6a3c13c..b3ceba5 100644 --- a/doc/rush-menu.1 +++ b/doc/rush-menu.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-menu" "1" "July 2026" "" "Select a package from an interactive menu." +.TH "rush\-menu" "1" "August 2026" "" "Select a package from an interactive menu." .SH NAME \f[B]rush menu\f[R] \- Select a package from an interactive menu. .SH SYNOPSIS diff --git a/doc/rush-menu.md b/doc/rush-menu.md index 0a36078..37a908e 100644 --- a/doc/rush-menu.md +++ b/doc/rush-menu.md @@ -1,6 +1,6 @@ % rush-menu(1) | Select a package from an interactive menu. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-pull.1 b/doc/rush-pull.1 index 6ee9306..67ab5b6 100644 --- a/doc/rush-pull.1 +++ b/doc/rush-pull.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-pull" "1" "July 2026" "" "Git pull one or all repositories." +.TH "rush\-pull" "1" "August 2026" "" "Git pull one or all repositories." .SH NAME \f[B]rush pull\f[R] \- Git pull one or all repositories. .SH SYNOPSIS diff --git a/doc/rush-pull.md b/doc/rush-pull.md index dd03315..91a9976 100644 --- a/doc/rush-pull.md +++ b/doc/rush-pull.md @@ -1,6 +1,6 @@ % rush-pull(1) | Git pull one or all repositories. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-push.1 b/doc/rush-push.1 index 7320889..e86caaf 100644 --- a/doc/rush-push.1 +++ b/doc/rush-push.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-push" "1" "July 2026" "" "Git push one or all repositories." +.TH "rush\-push" "1" "August 2026" "" "Git push one or all repositories." .SH NAME \f[B]rush push\f[R] \- Git push one or all repositories. .SH SYNOPSIS diff --git a/doc/rush-push.md b/doc/rush-push.md index f5e4b11..4419d75 100644 --- a/doc/rush-push.md +++ b/doc/rush-push.md @@ -1,6 +1,6 @@ % rush-push(1) | Git push one or all repositories. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-remove.1 b/doc/rush-remove.1 index f07be6e..8814a3b 100644 --- a/doc/rush-remove.1 +++ b/doc/rush-remove.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-remove" "1" "July 2026" "" "Unregister a local repository." +.TH "rush\-remove" "1" "August 2026" "" "Unregister a local repository." .SH NAME \f[B]rush remove\f[R] \- Unregister a local repository. .SH SYNOPSIS diff --git a/doc/rush-remove.md b/doc/rush-remove.md index ae8a1d0..d5a8f61 100644 --- a/doc/rush-remove.md +++ b/doc/rush-remove.md @@ -1,6 +1,6 @@ % rush-remove(1) | Unregister a local repository. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-search.1 b/doc/rush-search.1 index 1e14862..96d93a5 100644 --- a/doc/rush-search.1 +++ b/doc/rush-search.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-search" "1" "July 2026" "" "Search in package names and info files." +.TH "rush\-search" "1" "August 2026" "" "Search in package names and info files." .SH NAME \f[B]rush search\f[R] \- Search in package names and info files. .SH SYNOPSIS diff --git a/doc/rush-search.md b/doc/rush-search.md index b1d7e75..0434155 100644 --- a/doc/rush-search.md +++ b/doc/rush-search.md @@ -1,6 +1,6 @@ % rush-search(1) | Search in package names and info files. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-show.1 b/doc/rush-show.1 index 1685580..d3febad 100644 --- a/doc/rush-show.1 +++ b/doc/rush-show.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-show" "1" "July 2026" "" "Show package files." +.TH "rush\-show" "1" "August 2026" "" "Show package files." .SH NAME \f[B]rush show\f[R] \- Show package files. .SH SYNOPSIS diff --git a/doc/rush-show.md b/doc/rush-show.md index 0627a38..e5aa8cf 100644 --- a/doc/rush-show.md +++ b/doc/rush-show.md @@ -1,6 +1,6 @@ % rush-show(1) | Show package files. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-snatch.1 b/doc/rush-snatch.1 index 4b6f066..51e5930 100644 --- a/doc/rush-snatch.1 +++ b/doc/rush-snatch.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-snatch" "1" "July 2026" "" "Install a package from a remote repo." +.TH "rush\-snatch" "1" "August 2026" "" "Install a package from a remote repo." .SH NAME \f[B]rush snatch\f[R] \- Install a package from a remote repo. .SH SYNOPSIS diff --git a/doc/rush-snatch.md b/doc/rush-snatch.md index 95a5094..24ed263 100644 --- a/doc/rush-snatch.md +++ b/doc/rush-snatch.md @@ -1,6 +1,6 @@ % rush-snatch(1) | Install a package from a remote repo. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush-undo.1 b/doc/rush-undo.1 index 6df386e..3368659 100644 --- a/doc/rush-undo.1 +++ b/doc/rush-undo.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush\-undo" "1" "July 2026" "" "Uninstall a package." +.TH "rush\-undo" "1" "August 2026" "" "Uninstall a package." .SH NAME \f[B]rush undo\f[R] \- Uninstall a package. .SH SYNOPSIS diff --git a/doc/rush-undo.md b/doc/rush-undo.md index 49dbd7a..7772fb9 100644 --- a/doc/rush-undo.md +++ b/doc/rush-undo.md @@ -1,6 +1,6 @@ % rush-undo(1) | Uninstall a package. % -% July 2026 +% August 2026 NAME ================================================== diff --git a/doc/rush.1 b/doc/rush.1 index 97cc597..eefc0c5 100644 --- a/doc/rush.1 +++ b/doc/rush.1 @@ -1,6 +1,6 @@ .\" Automatically generated by Pandoc 3.9 .\" -.TH "rush" "1" "July 2026" "Version 1.0.1" "Personal package manager." +.TH "rush" "1" "August 2026" "Version 1.0.1" "Personal package manager." .SH NAME \f[B]rush\f[R] \- Personal package manager. .SH SYNOPSIS @@ -47,7 +47,7 @@ Edit package files. Show package files. .SH INTERNAL COMMANDS .SS rush completions -Generate bash completions. +Generate a shell completion script .SH ENVIRONMENT VARIABLES .SS RUSH_CONFIG Location of the rush config file. diff --git a/doc/rush.md b/doc/rush.md index f3e3c6b..d2b0086 100644 --- a/doc/rush.md +++ b/doc/rush.md @@ -1,6 +1,6 @@ % rush(1) Version 1.0.1 | Personal package manager. % Danny Ben Shitrit \ -% July 2026 +% August 2026 NAME ================================================== @@ -125,7 +125,7 @@ INTERNAL COMMANDS rush completions -------------------------------------------------- -Generate bash completions. +Generate a shell completion script ENVIRONMENT VARIABLES diff --git a/features/completions.feature b/features/completions.feature index 0587697..4a9e7b8 100644 --- a/features/completions.feature +++ b/features/completions.feature @@ -4,13 +4,12 @@ Feature: completions Scenario: Show --help When I run 'rush completions --help' Then the exit code should mean success - And stdout should include 'Generate bash completions' + And stdout should include 'Generate a shell completion script' And stdout should include 'rush completions' Scenario: Generate the completions script Given rush is properly configured When I run 'rush completions' Then the exit code should mean success - And stdout should include '# rush completion' And stdout should include '_rush_completions()' And stdout should include 'complete -F _rush_completions rush' diff --git a/rush b/rush index d262c01..6e438bc 100755 --- a/rush +++ b/rush @@ -1,8 +1,8 @@ #!/usr/bin/env bash -# This script was generated by bashly 1.4.0.rc2 (https://bashly.dev) +# This script was generated by bashly 2.0.0.rc1 (https://bashly.dev) # Modifying it manually is not recommended -# :wrapper.bash3_bouncer +# :wrapper.bash_version_bouncer if ((BASH_VERSINFO[0] < 4 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] < 2))); then printf "bash version 4.2 or higher is required\n" >&2 exit 1 @@ -55,7 +55,7 @@ rush_usage() { printf " %s Show package files.\n" "$(green "show") " echo printf "%s\n" "$(bold "Internal Commands:")" - printf " %s Generate bash completions.\n" "$(green "completions")" + printf " %s Generate a shell completion script\n" "$(green "completions")" echo # :command.long_usage @@ -875,10 +875,10 @@ rush_show_usage() { # :command.usage rush_completions_usage() { - printf "rush completions - Generate bash completions.\n\n" + printf "rush completions - Generate a shell completion script\n\n" printf "%s\n" "$(bold "Usage:")" - printf " rush completions\n" + printf " rush completions [SHELL]\n" printf " rush completions --help | -h\n" echo @@ -892,6 +892,16 @@ rush_completions_usage() { printf " Show this help\n" echo + # :command.usage_args + printf "%s\n" "$(bold "Arguments:")" + + # :argument.usage + printf " %s\n" "$(green "SHELL")" + printf " Shell to generate completions for\n" + printf " %s\n" "Allowed: bash, zsh" + printf " %s\n" "Default: bash" + echo + fi } @@ -1292,517 +1302,6 @@ search_repo() { echo } -# src/lib/send_completions.sh -send_completions() { - echo $'# rush completion -*- shell-script -*-' - echo $'' - echo $'# This bash completions script was generated by' - echo $'# completely (https://github.com/bashly-framework/completely)' - echo $'# Modifying it manually is not recommended' - echo $'' - echo $'_rush_completions_node_flag_state() {' - echo $' case "$1:$2" in' - echo $' 0:--help|0:-h) return 0 ;;' - echo $' 0:--version|0:-v) return 0 ;;' - echo $' 0:--clone|0:-c) return 0 ;;' - echo $' 0:--force|0:-f) return 0 ;;' - echo $' 0:--verbose|0:-v) return 0 ;;' - echo $' 1:--help|1:-h) return 0 ;;' - echo $' 2:--help|2:-h) return 0 ;;' - echo $' 2:--purge|2:-p) return 0 ;;' - echo $' 3:--name|3:-n) return 2 ;;' - echo $' 3:--help|3:-h) return 0 ;;' - echo $' 3:--ssh|3:-s) return 0 ;;' - echo $' 3:--default|3:-d) return 0 ;;' - echo $' 3:--shallow|3:-w) return 0 ;;' - echo $' 3:--ignore|3:-i) return 0 ;;' - echo $' 4:--help|4:-h) return 0 ;;' - echo $' 5:--message|5:-m) return 2 ;;' - echo $' 5:--help|5:-h) return 0 ;;' - echo $' 5:--all|5:-a) return 0 ;;' - echo $' 6:--help|6:-h) return 0 ;;' - echo $' 6:--edit|6:-e) return 0 ;;' - echo $' 7:--help|7:-h) return 0 ;;' - echo $' 8:--help|8:-h) return 0 ;;' - echo $' 8:--clone|8:-c) return 0 ;;' - echo $' 8:--force|8:-f) return 0 ;;' - echo $' 8:--verbose|8:-v) return 0 ;;' - echo $' 9:--help|9:-h) return 0 ;;' - echo $' 9:--verbose|9:-v) return 0 ;;' - echo $' 10:--help|10:-h) return 0 ;;' - echo $' 10:--force|10:-f) return 0 ;;' - echo $' 10:--verbose|10:-v) return 0 ;;' - echo $' 10:--undo|10:-u) return 0 ;;' - echo $' 11:--help|11:-h) return 0 ;;' - echo $' 11:--force|11:-f) return 0 ;;' - echo $' 12:--help|12:-h) return 0 ;;' - echo $' 13:--help|13:-h) return 0 ;;' - echo $' 13:--simple|13:-s) return 0 ;;' - echo $' 13:--all|13:-a) return 0 ;;' - echo $' 14:--help|14:-h) return 0 ;;' - echo $' 14:--install|14:-i) return 0 ;;' - echo $' 15:--help|15:-h) return 0 ;;' - echo $' 16:--help|16:-h) return 0 ;;' - echo $' 17:--help|17:-h) return 0 ;;' - echo $' 18:--help|18:-h) return 0 ;;' - echo $' esac' - echo $'' - echo $' return 1' - echo $'}' - echo $'' - echo $'_rush_completions_option_seen() {' - echo $' local completed_option option_name' - echo $' for completed_option in "${completed_options[@]}"; do' - echo $' for option_name in "$@"; do' - echo $' [[ "$completed_option" == "$option_name" ]] && return 0' - echo $' done' - echo $' done' - echo $'' - echo $' return 1' - echo $'}' - echo $'' - echo $'_rush_completions_resolve_node() {' - echo $' node_id=0' - echo $' node_word_count=0' - echo $' positional_index=0' - echo $'' - echo $' local word' - echo $' for word in "${non_options[@]}"; do' - echo $' case "$node_id:$word" in' - echo $' 0:add)' - echo $' node_id=1' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:a)' - echo $' node_id=1' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:remove)' - echo $' node_id=2' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:r)' - echo $' node_id=2' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:clone)' - echo $' node_id=3' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:pull)' - echo $' node_id=4' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:p)' - echo $' node_id=4' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:download)' - echo $' node_id=4' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:update)' - echo $' node_id=4' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:push)' - echo $' node_id=5' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:upload)' - echo $' node_id=5' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:config)' - echo $' node_id=6' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:c)' - echo $' node_id=6' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:default)' - echo $' node_id=7' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:get)' - echo $' node_id=8' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:g)' - echo $' node_id=8' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:undo)' - echo $' node_id=9' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:u)' - echo $' node_id=9' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:snatch)' - echo $' node_id=10' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:copy)' - echo $' node_id=11' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:info)' - echo $' node_id=12' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:i)' - echo $' node_id=12' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:list)' - echo $' node_id=13' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:l)' - echo $' node_id=13' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:ls)' - echo $' node_id=13' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:menu)' - echo $' node_id=14' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:search)' - echo $' node_id=15' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:s)' - echo $' node_id=15' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:edit)' - echo $' node_id=16' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:e)' - echo $' node_id=16' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:show)' - echo $' node_id=17' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:completions)' - echo $' node_id=18' - echo $' node_word_count=1' - echo $' ;;' - echo $' *)' - echo $' break' - echo $' ;;' - echo $' esac' - echo $' done' - echo $'' - echo $' positional_index=$((${#non_options[@]} - node_word_count))' - echo $'}' - echo $'' - echo $'_rush_completions() {' - echo $' local cur=${COMP_WORDS[COMP_CWORD]}' - echo $' local prev=' - echo $' if ((COMP_CWORD > 0)); then' - echo $' prev=${COMP_WORDS[$((COMP_CWORD - 1))]}' - echo $' fi' - echo $'' - echo $' local completed=()' - echo $' if ((COMP_CWORD > 1)); then' - echo $' completed=("${COMP_WORDS[@]:1:$((COMP_CWORD - 1))}")' - echo $' fi' - echo $'' - echo $' local non_options=()' - echo $' local completed_options=()' - echo $' local node_id=' - echo $' local node_word_count=-1' - echo $' local positional_index=0' - echo $' local invalid_completion=0' - echo $' local flag_state=0' - echo $' _rush_completions_resolve_node' - echo $'' - echo $' local skip_next=0' - echo $' for word in "${completed[@]}"; do' - echo $' if ((skip_next)); then' - echo $' skip_next=0' - echo $' continue' - echo $' fi' - echo $'' - echo $' if [[ "${word:0:1}" == "-" ]]; then' - echo $' _rush_completions_node_flag_state "$node_id" "$word"' - echo $' flag_state=$?' - echo $' if (( flag_state == 1 )); then' - echo $' invalid_completion=1' - echo $' break' - echo $' fi' - echo $'' - echo $' completed_options+=("$word")' - echo $' if (( flag_state == 2 )); then' - echo $' skip_next=1' - echo $' fi' - echo $' continue' - echo $' fi' - echo $'' - echo $' non_options+=("$word")' - echo $' _rush_completions_resolve_node' - echo $' done' - echo $'' - echo $' COMPREPLY=()' - echo $' (( invalid_completion )) && return' - echo $'' - echo $' case "$node_id:$prev" in' - echo $' 3:--name|3:-n)' - echo $' return' - echo $' ;;' - echo $' 5:--message|5:-m)' - echo $' return' - echo $' ;;' - echo $' esac' - echo $'' - echo $' if [[ "${cur:0:1}" != "-" ]] && (( positional_index == 0 )); then' - echo $' case "$node_id" in' - echo $' 0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "add a remove r clone pull p download update push upload config c default get g undo u snatch copy info i list l ls menu search s edit e show completions $(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' esac' - echo $' fi' - echo $'' - echo $' if [[ "${cur:0:1}" == "-" ]]; then' - echo $' case "$node_id" in' - echo $' 0)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--version" "-v" || words+=("--version" "-v")' - echo $' _rush_completions_option_seen "--clone" "-c" || words+=("--clone" "-c")' - echo $' _rush_completions_option_seen "--force" "-f" || words+=("--force" "-f")' - echo $' _rush_completions_option_seen "--verbose" "-v" || words+=("--verbose" "-v")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 1)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 2)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--purge" "-p" || words+=("--purge" "-p")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 3)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--ssh" "-s" || words+=("--ssh" "-s")' - echo $' _rush_completions_option_seen "--default" "-d" || words+=("--default" "-d")' - echo $' _rush_completions_option_seen "--name" "-n" || words+=("--name" "-n")' - echo $' _rush_completions_option_seen "--shallow" "-w" || words+=("--shallow" "-w")' - echo $' _rush_completions_option_seen "--ignore" "-i" || words+=("--ignore" "-i")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 4)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 5)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--all" "-a" || words+=("--all" "-a")' - echo $' _rush_completions_option_seen "--message" "-m" || words+=("--message" "-m")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 6)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--edit" "-e" || words+=("--edit" "-e")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 7)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 8)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--clone" "-c" || words+=("--clone" "-c")' - echo $' _rush_completions_option_seen "--force" "-f" || words+=("--force" "-f")' - echo $' _rush_completions_option_seen "--verbose" "-v" || words+=("--verbose" "-v")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 9)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--verbose" "-v" || words+=("--verbose" "-v")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 10)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--force" "-f" || words+=("--force" "-f")' - echo $' _rush_completions_option_seen "--verbose" "-v" || words+=("--verbose" "-v")' - echo $' _rush_completions_option_seen "--undo" "-u" || words+=("--undo" "-u")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 11)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--force" "-f" || words+=("--force" "-f")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 12)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 13)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--simple" "-s" || words+=("--simple" "-s")' - echo $' _rush_completions_option_seen "--all" "-a" || words+=("--all" "-a")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 14)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--install" "-i" || words+=("--install" "-i")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 15)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 16)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 17)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 18)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' esac' - echo $' fi' - echo $'' - echo $' case "$node_id:$positional_index" in' - echo $' 0:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "add a remove r clone pull p download update push upload config c default get g undo u snatch copy info i list l ls menu search s edit e show completions $(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 1:0)' - echo $' return' - echo $' ;;' - echo $' 1:1)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 2:0)' - echo $' return' - echo $' ;;' - echo $' 3:0)' - echo $' return' - echo $' ;;' - echo $' 3:1)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 4:0)' - echo $' return' - echo $' ;;' - echo $' 5:0)' - echo $' return' - echo $' ;;' - echo $' 7:0)' - echo $' return' - echo $' ;;' - echo $' 8:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 9:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 10:0)' - echo $' return' - echo $' ;;' - echo $' 10:1)' - echo $' return' - echo $' ;;' - echo $' 11:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 11:1)' - echo $' return' - echo $' ;;' - echo $' 12:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 13:0)' - echo $' return' - echo $' ;;' - echo $' 14:0)' - echo $' return' - echo $' ;;' - echo $' 15:0)' - echo $' return' - echo $' ;;' - echo $' 16:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 16:1)' - echo $' return' - echo $' ;;' - echo $' 17:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 17:1)' - echo $' return' - echo $' ;;' - echo $' esac' - echo $'} &&' - echo $' complete -F _rush_completions rush' - echo $'' - echo $'# ex: filetype=sh' -} - # src/lib/warn.sh warn() { printf "%-20s | %s\n" "$(red "$1")" "$(red_bold "${*:2}")" @@ -3842,59 +3341,1141 @@ rush_completions_parse_requirements() { *) # :command.parse_requirements_case # :command.parse_requirements_case_simple - printf "invalid argument: %s\n" "$key" >&2 - exit 1 + # :argument.case + if [[ -z ${args['shell']+x} ]]; then + args['shell']=$1 + shift + else + printf "invalid argument: %s\n" "$key" >&2 + exit 1 + fi ;; esac done + # :command.default_assignments + [[ -n ${args['shell']:-} ]] || args['shell']="bash" + + # :command.whitelist_filter + if [[ -n ${args['shell']:-} ]] && [[ ! ${args['shell']:-} =~ ^(bash|zsh)$ ]]; then + printf "%s\n" "shell must be one of: bash, zsh" >&2 + exit 1 + fi + } -# :command.initialize -initialize() { - declare -g version="1.0.1" - set -eo pipefail +# :command.completions +completion_run() { + local -a completion_words=("$@") + local -A completion_blocked_flags=() + local -A completion_emitted=() + local -a completion_options=() + local -A completion_options_seen=() + local completion_count=${#completion_words[@]} + local completion_current="" + + if [[ $completion_count -gt 0 ]]; then + completion_current="${completion_words[$((completion_count - 1))]}" + unset 'completion_words[completion_count - 1]' + fi - # src/initialize.sh - CONFIG_FILE="${RUSH_CONFIG:-$HOME/rush.ini}" - RUSH_ROOT="${RUSH_ROOT:-$HOME/rush-repos}" + rush_completion "$completion_current" "${completion_words[@]}" + + local completion_options_string="" + if [[ ${#completion_options[@]} -gt 0 ]]; then + completion_options_string="$( + IFS=, + printf '%s' "${completion_options[*]}" + )" + fi + printf ':options=%s\n' "$completion_options_string" } -# :command.run -run() { - # :command.globals - declare -g long_usage='' - declare -g -A args=() - declare -g -a input=() +completion_candidates() { + local completion_current="$1" + shift - normalize_input "$@" - parse_requirements "${input[@]}" + local completion_candidate + for completion_candidate in "$@"; do + if [[ $completion_candidate == "$completion_current"* ]] && + [[ -z "${completion_emitted[$completion_candidate]:-}" ]]; then + printf '%s\n' "$completion_candidate" + completion_emitted["$completion_candidate"]=1 + fi + done +} - case "$action" in - "add") rush_add_command ;; - "remove") rush_remove_command ;; - "clone") rush_clone_command ;; - "pull") rush_pull_command ;; - "push") rush_push_command ;; - "config") rush_config_command ;; - "default") rush_default_command ;; - "get") rush_get_command ;; - "undo") rush_undo_command ;; - "snatch") rush_snatch_command ;; - "copy") rush_copy_command ;; - "info") rush_info_command ;; - "list") rush_list_command ;; - "menu") rush_menu_command ;; - "search") rush_search_command ;; - "edit") rush_edit_command ;; - "show") rush_show_command ;; - "completions") rush_completions_command ;; +completion_flag_candidates() { + local completion_flag="$1" + local completion_current="$2" + shift 2 + + if [[ -z "${completion_blocked_flags[$completion_flag]:-}" ]]; then + completion_candidates "$completion_current" "$@" + fi +} + +completion_add_options() { + local completion_option + for completion_option in "$@"; do + if [[ -z "${completion_options_seen[$completion_option]:-}" ]]; then + completion_options+=("$completion_option") + completion_options_seen["$completion_option"]=1 + fi + done +} + +completion_dynamic_candidates() { + local completion_current="$1" + local completion_output="$2" + + [[ -n $completion_output ]] || return + + local completion_candidate + while IFS= read -r completion_candidate; do + if [[ -n $completion_candidate ]]; then + completion_candidates "$completion_current" "$completion_candidate" + fi + done <<<"$completion_output" +} + +# :command.completion_script +send_completions() { + local completion_shell="${1:-bash}" + + case "$completion_shell" in + bash) send_completions_bash ;; + zsh) send_completions_zsh ;; + *) + printf 'unsupported shell: %s\n' "$completion_shell" >&2 + return 1 + ;; esac } -# :command.start -command_line_args=("$@") -initialize -run "${command_line_args[@]}" +# :command.completion_script_bash +send_completions_bash() { + echo $'_rush_completions() {' + echo $' local completion_command="${COMP_WORDS[0]}"' + echo $' local completion_current="${COMP_WORDS[COMP_CWORD]:-}"' + echo $' local completion_word_count=$((COMP_CWORD - 1))' + echo $' local -a completion_words=()' + echo $' local -a completion_response=()' + echo $' local -a completion_options=()' + echo $' local -A completion_seen=()' + echo $'' + echo $' if [[ $completion_word_count -gt 0 ]]; then' + echo $' completion_words=("${COMP_WORDS[@]:1:completion_word_count}")' + echo $' fi' + echo $'' + echo $' COMPREPLY=()' + echo $' while IFS= read -r completion_line; do' + echo $' completion_response+=("$completion_line")' + echo $' done < <("$completion_command" __complete "${completion_words[@]}" "$completion_current")' + echo $'' + echo $' local completion_directive="${completion_response[-1]:-}"' + echo $' if [[ $completion_directive == :options=* ]]; then' + echo $' unset "completion_response[-1]"' + echo $' IFS=, read -r -a completion_options <<< "${completion_directive#:options=}"' + echo $' fi' + echo $'' + echo $' COMPREPLY=("${completion_response[@]}")' + echo $' local completion_candidate' + echo $' for completion_candidate in "${COMPREPLY[@]}"; do' + echo $' completion_seen["$completion_candidate"]=1' + echo $' done' + echo $'' + echo $' local completion_option' + echo $' local completion_files=false' + echo $' local completion_directories=false' + echo $' for completion_option in "${completion_options[@]}"; do' + echo $' case "$completion_option" in' + echo $' files) completion_files=true ;;' + echo $' directories) completion_directories=true ;;' + echo $' no-space) compopt -o nospace ;;' + echo $' esac' + echo $' done' + echo $'' + echo $' if [[ $completion_files == true ]]; then' + echo $' while IFS= read -r completion_candidate; do' + echo $' if [[ -z "${completion_seen[$completion_candidate]:-}" ]]; then' + echo $' COMPREPLY+=("$completion_candidate")' + echo $' completion_seen["$completion_candidate"]=1' + echo $' fi' + echo $' done < <(compgen -f -- "$completion_current")' + echo $' elif [[ $completion_directories == true ]]; then' + echo $' while IFS= read -r completion_candidate; do' + echo $' if [[ -z "${completion_seen[$completion_candidate]:-}" ]]; then' + echo $' COMPREPLY+=("$completion_candidate")' + echo $' completion_seen["$completion_candidate"]=1' + echo $' fi' + echo $' done < <(compgen -d -- "$completion_current")' + echo $' fi' + echo $'}' + echo $'' + echo $'complete -F _rush_completions rush' +} +# :command.completion_script_zsh +send_completions_zsh() { + echo $'#compdef rush' + echo $'' + echo $'_rush_completions() {' + echo $' local completion_command="${words[1]}"' + echo $' local completion_current="${words[CURRENT]:-}"' + echo $' local completion_output' + echo $' local completion_directive' + echo $' local -a completion_words=()' + echo $' local -a completion_response=()' + echo $' local -a completion_options=()' + echo $' local -a completion_add_args=()' + echo $'' + echo $' if (( CURRENT > 2 )); then' + echo $' completion_words=("${words[2,$((CURRENT - 1))]}")' + echo $' fi' + echo $'' + echo $' completion_output="$("$completion_command" __complete "${completion_words[@]}" "$completion_current")"' + echo $' completion_response=("${(@f)completion_output}")' + echo $'' + echo $' completion_directive="${completion_response[-1]:-}"' + echo $' if [[ $completion_directive == :options=* ]]; then' + echo $' completion_response[-1]=()' + echo $' completion_options=("${(@s:,:)${completion_directive#:options=}}")' + echo $' fi' + echo $'' + echo $' local completion_option' + echo $' local completion_files=false' + echo $' local completion_directories=false' + echo $' for completion_option in "${completion_options[@]}"; do' + echo $' case "$completion_option" in' + echo $' files) completion_files=true ;;' + echo $' directories) completion_directories=true ;;' + echo $' no-space) completion_add_args=(-S "") ;;' + echo $' esac' + echo $' done' + echo $'' + echo $' if (( ${#completion_response[@]} > 0 )); then' + echo $' compadd "${completion_add_args[@]}" -- "${completion_response[@]}"' + echo $' fi' + echo $'' + echo $' if [[ $completion_files == true ]]; then' + echo $' _files "${completion_add_args[@]}"' + echo $' elif [[ $completion_directories == true ]]; then' + echo $' _files -/ "${completion_add_args[@]}"' + echo $' fi' + echo $'}' + echo $'' + echo $'compdef _rush_completions rush' +} + +# :command.completion_function +rush_completion() { + local completion_current="$1" + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + add | a) + shift + rush_add_completion "$completion_current" "$@" + return + ;; + remove | r) + shift + rush_remove_completion "$completion_current" "$@" + return + ;; + clone) + shift + rush_clone_completion "$completion_current" "$@" + return + ;; + pull | p | download | update) + shift + rush_pull_completion "$completion_current" "$@" + return + ;; + push | upload) + shift + rush_push_completion "$completion_current" "$@" + return + ;; + config | c) + shift + rush_config_completion "$completion_current" "$@" + return + ;; + default) + shift + rush_default_completion "$completion_current" "$@" + return + ;; + get | g) + shift + rush_get_completion "$completion_current" "$@" + return + ;; + undo | u) + shift + rush_undo_completion "$completion_current" "$@" + return + ;; + snatch) + shift + rush_snatch_completion "$completion_current" "$@" + return + ;; + copy) + shift + rush_copy_completion "$completion_current" "$@" + return + ;; + info | i) + shift + rush_info_completion "$completion_current" "$@" + return + ;; + list | l | ls) + shift + rush_list_completion "$completion_current" "$@" + return + ;; + menu) + shift + rush_menu_completion "$completion_current" "$@" + return + ;; + search | s) + shift + rush_search_completion "$completion_current" "$@" + return + ;; + edit | e) + shift + rush_edit_completion "$completion_current" "$@" + return + ;; + show) + shift + rush_show_completion "$completion_current" "$@" + return + ;; + completions) + shift + rush_completions_completion "$completion_current" "$@" + return + ;; + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --version | -v) + completion_blocked_flags["--version"]=1 + shift + ;; + *) + rush_get_completion "$completion_current" "$@" + return + ;; + esac + done + completion_candidates "$completion_current" add a remove r clone pull p download update push upload config c default get g undo u snatch copy info i list l ls menu search s edit e show completions + + rush_get_completion "$completion_current" + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --version "$completion_current" --version -v + fi + +} + +# :command.completion_function +rush_add_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + *) + if [[ $completion_arg_index -ge 2 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + fi + + if [[ $completion_current != -* ]]; then + case "$completion_arg_index" in + 1) + completion_add_options directories + ;; + esac + fi + +} + +# :command.completion_function +rush_remove_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --purge | -p) + completion_blocked_flags["--purge"]=1 + + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --purge "$completion_current" --purge -p + fi + +} + +# :command.completion_function +rush_clone_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --ssh | -s) + completion_blocked_flags["--ssh"]=1 + + shift + ;; + --default | -d) + completion_blocked_flags["--default"]=1 + + shift + ;; + --name | -n) + shift + if [[ $# -eq 0 ]]; then + + return + fi + shift + completion_blocked_flags["--name"]=1 + + ;; + --shallow | -w) + completion_blocked_flags["--shallow"]=1 + + shift + ;; + --ignore | -i) + completion_blocked_flags["--ignore"]=1 + + shift + ;; + *) + if [[ $completion_arg_index -ge 2 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --ssh "$completion_current" --ssh -s + completion_flag_candidates --default "$completion_current" --default -d + completion_flag_candidates --name "$completion_current" --name -n + completion_flag_candidates --shallow "$completion_current" --shallow -w + completion_flag_candidates --ignore "$completion_current" --ignore -i + fi + + if [[ $completion_current != -* ]]; then + case "$completion_arg_index" in + 1) + completion_add_options directories + ;; + esac + fi + +} + +# :command.completion_function +rush_pull_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + fi + +} + +# :command.completion_function +rush_push_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --all | -a) + completion_blocked_flags["--all"]=1 + + shift + ;; + --message | -m) + shift + if [[ $# -eq 0 ]]; then + + return + fi + shift + completion_blocked_flags["--message"]=1 + + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --all "$completion_current" --all -a + completion_flag_candidates --message "$completion_current" --message -m + fi + +} + +# :command.completion_function +rush_config_completion() { + local completion_current="$1" + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --edit | -e) + completion_blocked_flags["--edit"]=1 + + shift + ;; + *) + return + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --edit "$completion_current" --edit -e + fi + +} + +# :command.completion_function +rush_default_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + fi + +} + +# :command.completion_function +rush_get_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --clone | -c) + completion_blocked_flags["--clone"]=1 + + shift + ;; + --force | -f) + completion_blocked_flags["--force"]=1 + + shift + ;; + --verbose | -v) + completion_blocked_flags["--verbose"]=1 + + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --clone "$completion_current" --clone -c + completion_flag_candidates --force "$completion_current" --force -f + completion_flag_candidates --verbose "$completion_current" --verbose -v + fi + + if [[ $completion_current != -* ]]; then + case "$completion_arg_index" in + 0) + if completion_output="$({ rush list -s -a; } 2>/dev/null)"; then + completion_dynamic_candidates "$completion_current" "$completion_output" + fi + ;; + esac + fi + +} + +# :command.completion_function +rush_undo_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --verbose | -v) + completion_blocked_flags["--verbose"]=1 + + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --verbose "$completion_current" --verbose -v + fi + + if [[ $completion_current != -* ]]; then + case "$completion_arg_index" in + 0) + if completion_output="$({ rush list -s -a; } 2>/dev/null)"; then + completion_dynamic_candidates "$completion_current" "$completion_output" + fi + ;; + esac + fi + +} + +# :command.completion_function +rush_snatch_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --force | -f) + completion_blocked_flags["--force"]=1 + + shift + ;; + --verbose | -v) + completion_blocked_flags["--verbose"]=1 + + shift + ;; + --undo | -u) + completion_blocked_flags["--undo"]=1 + + shift + ;; + *) + if [[ $completion_arg_index -ge 2 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --force "$completion_current" --force -f + completion_flag_candidates --verbose "$completion_current" --verbose -v + completion_flag_candidates --undo "$completion_current" --undo -u + fi + +} + +# :command.completion_function +rush_copy_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --force | -f) + completion_blocked_flags["--force"]=1 + + shift + ;; + *) + if [[ $completion_arg_index -ge 2 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --force "$completion_current" --force -f + fi + + if [[ $completion_current != -* ]]; then + case "$completion_arg_index" in + 0) + if completion_output="$({ rush list -s -a; } 2>/dev/null)"; then + completion_dynamic_candidates "$completion_current" "$completion_output" + fi + ;; + esac + fi + +} + +# :command.completion_function +rush_info_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + fi + + if [[ $completion_current != -* ]]; then + case "$completion_arg_index" in + 0) + if completion_output="$({ rush list -s -a; } 2>/dev/null)"; then + completion_dynamic_candidates "$completion_current" "$completion_output" + fi + ;; + esac + fi + +} + +# :command.completion_function +rush_list_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --simple | -s) + completion_blocked_flags["--simple"]=1 + + shift + ;; + --all | -a) + completion_blocked_flags["--all"]=1 + + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --simple "$completion_current" --simple -s + completion_flag_candidates --all "$completion_current" --all -a + fi + +} + +# :command.completion_function +rush_menu_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + --install | -i) + completion_blocked_flags["--install"]=1 + + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + completion_flag_candidates --install "$completion_current" --install -i + fi + +} + +# :command.completion_function +rush_search_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + fi + +} + +# :command.completion_function +rush_edit_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + *) + if [[ $completion_arg_index -ge 2 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + fi + + if [[ $completion_current != -* ]]; then + case "$completion_arg_index" in + 0) + if completion_output="$({ rush list -s -a; } 2>/dev/null)"; then + completion_dynamic_candidates "$completion_current" "$completion_output" + fi + ;; + esac + fi + +} + +# :command.completion_function +rush_show_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + *) + if [[ $completion_arg_index -ge 2 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + fi + + if [[ $completion_current != -* ]]; then + case "$completion_arg_index" in + 0) + if completion_output="$({ rush list -s -a; } 2>/dev/null)"; then + completion_dynamic_candidates "$completion_current" "$completion_output" + fi + ;; + esac + fi + +} + +# :command.completion_function +rush_completions_completion() { + local completion_current="$1" + local completion_arg_index=0 + shift + + while [[ $# -gt 0 ]]; do + case "$1" in + --help | -h) + completion_blocked_flags["--help"]=1 + shift + ;; + *) + if [[ $completion_arg_index -ge 1 ]]; then + return + fi + completion_arg_index=$((completion_arg_index + 1)) + shift + + ;; + esac + done + + if [[ $completion_current == -* ]]; then + completion_flag_candidates --help "$completion_current" --help -h + fi + + if [[ $completion_current != -* ]]; then + case "$completion_arg_index" in + 0) + local -a completion_values=( + "bash" + "zsh" + ) + completion_candidates "$completion_current" "${completion_values[@]}" + ;; + esac + fi + +} + +# :command.initialize +initialize() { + declare -g version="1.0.1" + set -eo pipefail + + # src/initialize.sh + CONFIG_FILE="${RUSH_CONFIG:-$HOME/rush.ini}" + RUSH_ROOT="${RUSH_ROOT:-$HOME/rush-repos}" +} + +# :command.run +run() { + # :command.globals + declare -g long_usage='' + declare -g -A args=() + declare -g -a input=() + + normalize_input "$@" + parse_requirements "${input[@]}" + + case "$action" in + "add") rush_add_command ;; + "remove") rush_remove_command ;; + "clone") rush_clone_command ;; + "pull") rush_pull_command ;; + "push") rush_push_command ;; + "config") rush_config_command ;; + "default") rush_default_command ;; + "get") rush_get_command ;; + "undo") rush_undo_command ;; + "snatch") rush_snatch_command ;; + "copy") rush_copy_command ;; + "info") rush_info_command ;; + "list") rush_list_command ;; + "menu") rush_menu_command ;; + "search") rush_search_command ;; + "edit") rush_edit_command ;; + "show") rush_show_command ;; + "completions") rush_completions_command ;; + esac +} + +# :command.start +start() { + if [[ ${1:-} == "__complete" ]]; then + completion_run "${@:2}" + return + fi + + command_line_args=("$@") + initialize + run "${command_line_args[@]}" +} + +start "$@" diff --git a/settings.yml b/settings.yml index 4181f24..b535c9f 100644 --- a/settings.yml +++ b/settings.yml @@ -6,6 +6,8 @@ enable_view_markers: always enable_env_var_names_array: never enable_deps_array: never +completions: full + usage_colors: caption: bold command: green diff --git a/src/bashly.yml b/src/bashly.yml index 5987498..95ffc43 100644 --- a/src/bashly.yml +++ b/src/bashly.yml @@ -2,7 +2,6 @@ name: rush help: Personal package manager. version: 1.0.1 help_header_override: print_logo -completions: [$(rush list -s -a)] x_mandoc_authors: Danny Ben Shitrit x_mandoc_footer: |- @@ -44,7 +43,8 @@ commands: - name: path required: true help: Path to the repository. - completions: [] + completions: + options: [directories] examples: - rush add default ~/rush-repos/default @@ -90,7 +90,8 @@ commands: If you need to use a different name, use the `user/repo` syntax. - name: path - completions: [] + completions: + options: [directories] help: |- Local path to clone the repository into. @@ -199,7 +200,8 @@ commands: args: - name: package required: true - completions: [$(rush list -s -a)] + completions: + dynamic: [rush list -s -a] help: &package_help |- Package name. @@ -240,7 +242,8 @@ commands: args: - name: package required: true - completions: [$(rush list -s -a)] + completions: + dynamic: [rush list -s -a] help: *package_help flags: @@ -298,7 +301,8 @@ commands: args: - name: source_package required: true - completions: [$(rush list -s -a)] + completions: + dynamic: [rush list -s -a] help: |- Source package name. @@ -333,7 +337,8 @@ commands: args: - name: package required: true - completions: [$(rush list -s -a)] + completions: + dynamic: [rush list -s -a] help: *package_help examples: @@ -416,7 +421,8 @@ commands: args: - name: package required: true - completions: [$(rush list -s -a)] + completions: + dynamic: [rush list -s -a] help: *package_help - name: file @@ -430,7 +436,8 @@ commands: args: - name: package required: true - completions: [$(rush list -s -a)] + completions: + dynamic: [rush list -s -a] help: *package_help - name: file @@ -442,4 +449,9 @@ commands: - name: completions group: Internal - help: Generate bash completions. + help: Generate a shell completion script + args: + - name: shell + help: Shell to generate completions for + allowed: [bash, zsh] + default: bash diff --git a/src/lib/send_completions.sh b/src/lib/send_completions.sh deleted file mode 100644 index 077ba93..0000000 --- a/src/lib/send_completions.sh +++ /dev/null @@ -1,510 +0,0 @@ -## [@bashly-upgrade completions send_completions] -send_completions() { - echo $'# rush completion -*- shell-script -*-' - echo $'' - echo $'# This bash completions script was generated by' - echo $'# completely (https://github.com/bashly-framework/completely)' - echo $'# Modifying it manually is not recommended' - echo $'' - echo $'_rush_completions_node_flag_state() {' - echo $' case "$1:$2" in' - echo $' 0:--help|0:-h) return 0 ;;' - echo $' 0:--version|0:-v) return 0 ;;' - echo $' 0:--clone|0:-c) return 0 ;;' - echo $' 0:--force|0:-f) return 0 ;;' - echo $' 0:--verbose|0:-v) return 0 ;;' - echo $' 1:--help|1:-h) return 0 ;;' - echo $' 2:--help|2:-h) return 0 ;;' - echo $' 2:--purge|2:-p) return 0 ;;' - echo $' 3:--name|3:-n) return 2 ;;' - echo $' 3:--help|3:-h) return 0 ;;' - echo $' 3:--ssh|3:-s) return 0 ;;' - echo $' 3:--default|3:-d) return 0 ;;' - echo $' 3:--shallow|3:-w) return 0 ;;' - echo $' 3:--ignore|3:-i) return 0 ;;' - echo $' 4:--help|4:-h) return 0 ;;' - echo $' 5:--message|5:-m) return 2 ;;' - echo $' 5:--help|5:-h) return 0 ;;' - echo $' 5:--all|5:-a) return 0 ;;' - echo $' 6:--help|6:-h) return 0 ;;' - echo $' 6:--edit|6:-e) return 0 ;;' - echo $' 7:--help|7:-h) return 0 ;;' - echo $' 8:--help|8:-h) return 0 ;;' - echo $' 8:--clone|8:-c) return 0 ;;' - echo $' 8:--force|8:-f) return 0 ;;' - echo $' 8:--verbose|8:-v) return 0 ;;' - echo $' 9:--help|9:-h) return 0 ;;' - echo $' 9:--verbose|9:-v) return 0 ;;' - echo $' 10:--help|10:-h) return 0 ;;' - echo $' 10:--force|10:-f) return 0 ;;' - echo $' 10:--verbose|10:-v) return 0 ;;' - echo $' 10:--undo|10:-u) return 0 ;;' - echo $' 11:--help|11:-h) return 0 ;;' - echo $' 11:--force|11:-f) return 0 ;;' - echo $' 12:--help|12:-h) return 0 ;;' - echo $' 13:--help|13:-h) return 0 ;;' - echo $' 13:--simple|13:-s) return 0 ;;' - echo $' 13:--all|13:-a) return 0 ;;' - echo $' 14:--help|14:-h) return 0 ;;' - echo $' 14:--install|14:-i) return 0 ;;' - echo $' 15:--help|15:-h) return 0 ;;' - echo $' 16:--help|16:-h) return 0 ;;' - echo $' 17:--help|17:-h) return 0 ;;' - echo $' 18:--help|18:-h) return 0 ;;' - echo $' esac' - echo $'' - echo $' return 1' - echo $'}' - echo $'' - echo $'_rush_completions_option_seen() {' - echo $' local completed_option option_name' - echo $' for completed_option in "${completed_options[@]}"; do' - echo $' for option_name in "$@"; do' - echo $' [[ "$completed_option" == "$option_name" ]] && return 0' - echo $' done' - echo $' done' - echo $'' - echo $' return 1' - echo $'}' - echo $'' - echo $'_rush_completions_resolve_node() {' - echo $' node_id=0' - echo $' node_word_count=0' - echo $' positional_index=0' - echo $'' - echo $' local word' - echo $' for word in "${non_options[@]}"; do' - echo $' case "$node_id:$word" in' - echo $' 0:add)' - echo $' node_id=1' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:a)' - echo $' node_id=1' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:remove)' - echo $' node_id=2' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:r)' - echo $' node_id=2' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:clone)' - echo $' node_id=3' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:pull)' - echo $' node_id=4' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:p)' - echo $' node_id=4' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:download)' - echo $' node_id=4' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:update)' - echo $' node_id=4' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:push)' - echo $' node_id=5' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:upload)' - echo $' node_id=5' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:config)' - echo $' node_id=6' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:c)' - echo $' node_id=6' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:default)' - echo $' node_id=7' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:get)' - echo $' node_id=8' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:g)' - echo $' node_id=8' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:undo)' - echo $' node_id=9' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:u)' - echo $' node_id=9' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:snatch)' - echo $' node_id=10' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:copy)' - echo $' node_id=11' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:info)' - echo $' node_id=12' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:i)' - echo $' node_id=12' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:list)' - echo $' node_id=13' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:l)' - echo $' node_id=13' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:ls)' - echo $' node_id=13' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:menu)' - echo $' node_id=14' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:search)' - echo $' node_id=15' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:s)' - echo $' node_id=15' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:edit)' - echo $' node_id=16' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:e)' - echo $' node_id=16' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:show)' - echo $' node_id=17' - echo $' node_word_count=1' - echo $' ;;' - echo $' 0:completions)' - echo $' node_id=18' - echo $' node_word_count=1' - echo $' ;;' - echo $' *)' - echo $' break' - echo $' ;;' - echo $' esac' - echo $' done' - echo $'' - echo $' positional_index=$((${#non_options[@]} - node_word_count))' - echo $'}' - echo $'' - echo $'_rush_completions() {' - echo $' local cur=${COMP_WORDS[COMP_CWORD]}' - echo $' local prev=' - echo $' if ((COMP_CWORD > 0)); then' - echo $' prev=${COMP_WORDS[$((COMP_CWORD - 1))]}' - echo $' fi' - echo $'' - echo $' local completed=()' - echo $' if ((COMP_CWORD > 1)); then' - echo $' completed=("${COMP_WORDS[@]:1:$((COMP_CWORD - 1))}")' - echo $' fi' - echo $'' - echo $' local non_options=()' - echo $' local completed_options=()' - echo $' local node_id=' - echo $' local node_word_count=-1' - echo $' local positional_index=0' - echo $' local invalid_completion=0' - echo $' local flag_state=0' - echo $' _rush_completions_resolve_node' - echo $'' - echo $' local skip_next=0' - echo $' for word in "${completed[@]}"; do' - echo $' if ((skip_next)); then' - echo $' skip_next=0' - echo $' continue' - echo $' fi' - echo $'' - echo $' if [[ "${word:0:1}" == "-" ]]; then' - echo $' _rush_completions_node_flag_state "$node_id" "$word"' - echo $' flag_state=$?' - echo $' if (( flag_state == 1 )); then' - echo $' invalid_completion=1' - echo $' break' - echo $' fi' - echo $'' - echo $' completed_options+=("$word")' - echo $' if (( flag_state == 2 )); then' - echo $' skip_next=1' - echo $' fi' - echo $' continue' - echo $' fi' - echo $'' - echo $' non_options+=("$word")' - echo $' _rush_completions_resolve_node' - echo $' done' - echo $'' - echo $' COMPREPLY=()' - echo $' (( invalid_completion )) && return' - echo $'' - echo $' case "$node_id:$prev" in' - echo $' 3:--name|3:-n)' - echo $' return' - echo $' ;;' - echo $' 5:--message|5:-m)' - echo $' return' - echo $' ;;' - echo $' esac' - echo $'' - echo $' if [[ "${cur:0:1}" != "-" ]] && (( positional_index == 0 )); then' - echo $' case "$node_id" in' - echo $' 0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "add a remove r clone pull p download update push upload config c default get g undo u snatch copy info i list l ls menu search s edit e show completions $(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' esac' - echo $' fi' - echo $'' - echo $' if [[ "${cur:0:1}" == "-" ]]; then' - echo $' case "$node_id" in' - echo $' 0)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--version" "-v" || words+=("--version" "-v")' - echo $' _rush_completions_option_seen "--clone" "-c" || words+=("--clone" "-c")' - echo $' _rush_completions_option_seen "--force" "-f" || words+=("--force" "-f")' - echo $' _rush_completions_option_seen "--verbose" "-v" || words+=("--verbose" "-v")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 1)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 2)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--purge" "-p" || words+=("--purge" "-p")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 3)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--ssh" "-s" || words+=("--ssh" "-s")' - echo $' _rush_completions_option_seen "--default" "-d" || words+=("--default" "-d")' - echo $' _rush_completions_option_seen "--name" "-n" || words+=("--name" "-n")' - echo $' _rush_completions_option_seen "--shallow" "-w" || words+=("--shallow" "-w")' - echo $' _rush_completions_option_seen "--ignore" "-i" || words+=("--ignore" "-i")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 4)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 5)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--all" "-a" || words+=("--all" "-a")' - echo $' _rush_completions_option_seen "--message" "-m" || words+=("--message" "-m")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 6)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--edit" "-e" || words+=("--edit" "-e")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 7)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 8)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--clone" "-c" || words+=("--clone" "-c")' - echo $' _rush_completions_option_seen "--force" "-f" || words+=("--force" "-f")' - echo $' _rush_completions_option_seen "--verbose" "-v" || words+=("--verbose" "-v")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 9)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--verbose" "-v" || words+=("--verbose" "-v")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 10)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--force" "-f" || words+=("--force" "-f")' - echo $' _rush_completions_option_seen "--verbose" "-v" || words+=("--verbose" "-v")' - echo $' _rush_completions_option_seen "--undo" "-u" || words+=("--undo" "-u")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 11)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--force" "-f" || words+=("--force" "-f")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 12)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 13)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--simple" "-s" || words+=("--simple" "-s")' - echo $' _rush_completions_option_seen "--all" "-a" || words+=("--all" "-a")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 14)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' _rush_completions_option_seen "--install" "-i" || words+=("--install" "-i")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 15)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 16)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 17)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 18)' - echo $' local words=()' - echo $' _rush_completions_option_seen "--help" "-h" || words+=("--help" "-h")' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' esac' - echo $' fi' - echo $'' - echo $' case "$node_id:$positional_index" in' - echo $' 0:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "add a remove r clone pull p download update push upload config c default get g undo u snatch copy info i list l ls menu search s edit e show completions $(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 1:0)' - echo $' return' - echo $' ;;' - echo $' 1:1)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 2:0)' - echo $' return' - echo $' ;;' - echo $' 3:0)' - echo $' return' - echo $' ;;' - echo $' 3:1)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 4:0)' - echo $' return' - echo $' ;;' - echo $' 5:0)' - echo $' return' - echo $' ;;' - echo $' 7:0)' - echo $' return' - echo $' ;;' - echo $' 8:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 9:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 10:0)' - echo $' return' - echo $' ;;' - echo $' 10:1)' - echo $' return' - echo $' ;;' - echo $' 11:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 11:1)' - echo $' return' - echo $' ;;' - echo $' 12:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 13:0)' - echo $' return' - echo $' ;;' - echo $' 14:0)' - echo $' return' - echo $' ;;' - echo $' 15:0)' - echo $' return' - echo $' ;;' - echo $' 16:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 16:1)' - echo $' return' - echo $' ;;' - echo $' 17:0)' - echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(rush list -s -a)" -- "$cur")' - echo $' return' - echo $' ;;' - echo $' 17:1)' - echo $' return' - echo $' ;;' - echo $' esac' - echo $'} &&' - echo $' complete -F _rush_completions rush' - echo $'' - echo $'# ex: filetype=sh' -} \ No newline at end of file From bca94689f3459b26e67ea29a6f2d253f76598645 Mon Sep 17 00:00:00 2001 From: Danny Ben Shitrit Date: Wed, 19 Aug 2026 21:43:05 +0300 Subject: [PATCH 2/2] fix completions shell arg --- features/completions.feature | 6 ++++++ rush | 3 ++- src/commands/completions.sh | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/features/completions.feature b/features/completions.feature index 4a9e7b8..cb1bfd5 100644 --- a/features/completions.feature +++ b/features/completions.feature @@ -13,3 +13,9 @@ Scenario: Generate the completions script Then the exit code should mean success And stdout should include '_rush_completions()' And stdout should include 'complete -F _rush_completions rush' + +Scenario: Generate the zsh completions script + Given rush is properly configured + When I run 'rush completions zsh' + Then the exit code should mean success + And stdout should include '#compdef rush' diff --git a/rush b/rush index 6e438bc..57332ec 100755 --- a/rush +++ b/rush @@ -1822,7 +1822,8 @@ rush_show_command() { rush_completions_command() { # src/commands/completions.sh - send_completions + send_completions "${args[shell]}" + } # :command.parse_requirements diff --git a/src/commands/completions.sh b/src/commands/completions.sh index d7c238c..e981385 100644 --- a/src/commands/completions.sh +++ b/src/commands/completions.sh @@ -1 +1 @@ -send_completions \ No newline at end of file +send_completions "${args[shell]}"