cellarspoon
b1d9d9d858
All checks were successful
continuous-integration/drone/push Build is passing
98 lines
2.6 KiB
Go
98 lines
2.6 KiB
Go
package cli
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
|
|
"coopcloud.tech/abra/cli/internal"
|
|
"coopcloud.tech/abra/pkg/config"
|
|
"coopcloud.tech/abra/pkg/web"
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/urfave/cli/v2"
|
|
)
|
|
|
|
// AutoCompleteCommand helps people set up auto-complete in their shells
|
|
var AutoCompleteCommand = &cli.Command{
|
|
Name: "autocomplete",
|
|
Usage: "Configure shell autocompletion (recommended)",
|
|
Aliases: []string{"ac"},
|
|
Description: `
|
|
This command helps set up autocompletion in your shell by downloading the
|
|
relevant autocompletion files and laying out what additional information must
|
|
be loaded.
|
|
|
|
Example:
|
|
|
|
abra autocomplete bash
|
|
|
|
Supported shells are as follows:
|
|
|
|
fizsh
|
|
zsh
|
|
bash
|
|
|
|
`,
|
|
ArgsUsage: "<shell>",
|
|
Action: func(c *cli.Context) error {
|
|
shellType := c.Args().First()
|
|
|
|
if shellType == "" {
|
|
internal.ShowSubcommandHelpAndError(c, errors.New("no shell provided"))
|
|
}
|
|
|
|
supportedShells := map[string]bool{
|
|
"bash": true,
|
|
"zsh": true,
|
|
"fizsh": true,
|
|
}
|
|
|
|
if _, ok := supportedShells[shellType]; !ok {
|
|
logrus.Fatalf("%s is not a supported shell right now, sorry", shellType)
|
|
}
|
|
|
|
if shellType == "fizsh" {
|
|
shellType = "zsh" // handled the same on the autocompletion side
|
|
}
|
|
|
|
autocompletionDir := path.Join(config.ABRA_DIR, "autocompletion")
|
|
if err := os.Mkdir(autocompletionDir, 0764); err != nil {
|
|
if !os.IsExist(err) {
|
|
logrus.Fatal(err)
|
|
}
|
|
logrus.Debugf("%s already created", autocompletionDir)
|
|
}
|
|
|
|
autocompletionFile := path.Join(config.ABRA_DIR, "autocompletion", shellType)
|
|
if _, err := os.Stat(autocompletionFile); err != nil && os.IsNotExist(err) {
|
|
url := fmt.Sprintf("https://git.coopcloud.tech/coop-cloud/abra/raw/branch/main/scripts/autocomplete/%s", shellType)
|
|
logrus.Infof("fetching %s", url)
|
|
if err := web.GetFile(autocompletionFile, url); err != nil {
|
|
logrus.Fatal(err)
|
|
}
|
|
}
|
|
|
|
switch shellType {
|
|
case "bash":
|
|
fmt.Println(fmt.Sprintf(`
|
|
# Run the following commands to install autocompletion
|
|
sudo mkdir /etc/bash_completion.d/
|
|
sudo cp %s /etc/bash_completion.d/abra
|
|
echo "source /etc/bash_completion.d/abra" >> ~/.bashrc
|
|
# And finally run "abra app ps <hit tab key>" to test things are working, you should see app names listed!
|
|
`, autocompletionFile))
|
|
case "zsh":
|
|
fmt.Println(fmt.Sprintf(`
|
|
# Run the following commands to install autocompletion
|
|
sudo mkdir /etc/zsh/completion.d/
|
|
sudo cp %s /etc/zsh/completion.d/abra
|
|
echo "PROG=abra\n_CLI_ZSH_AUTOCOMPLETE_HACK=1\nsource /etc/zsh/completion.d/abra" >> ~/.zshrc
|
|
# And finally run "abra app ps <hit tab key>" to test things are working, you should see app names listed!
|
|
`, autocompletionFile))
|
|
}
|
|
|
|
return nil
|
|
},
|
|
}
|