88 lines
1.8 KiB
Go
88 lines
1.8 KiB
Go
package complete
|
|
|
|
import (
|
|
"errors"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/posener/complete/install"
|
|
)
|
|
|
|
func runCommandLine(cmd string) {
|
|
c := parseFlags(cmd)
|
|
err := c.validate()
|
|
if err != nil {
|
|
os.Stderr.WriteString(err.Error() + "\n")
|
|
os.Exit(1)
|
|
}
|
|
if !c.yes && !prompt(c.action(), cmd) {
|
|
fmt.Println("Cancelling...")
|
|
os.Exit(2)
|
|
}
|
|
fmt.Println(c.action() + "ing...")
|
|
if c.install {
|
|
err = install.Install(cmd, c.root)
|
|
} else {
|
|
err = install.Uninstall(cmd, c.root)
|
|
}
|
|
if err != nil {
|
|
fmt.Printf("%s failed! %s\n", c.action(), err)
|
|
os.Exit(3)
|
|
}
|
|
fmt.Println("Done!")
|
|
}
|
|
|
|
func prompt(action, cmd string) bool {
|
|
fmt.Printf("%s bash completion for %s? ", action, cmd)
|
|
var answer string
|
|
fmt.Scanln(&answer)
|
|
|
|
switch strings.ToLower(answer) {
|
|
case "y", "yes":
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
type config struct {
|
|
install bool
|
|
uninstall bool
|
|
root bool
|
|
yes bool
|
|
}
|
|
|
|
func parseFlags(cmd string) config {
|
|
var c config
|
|
flag.BoolVar(&c.install, "install", false,
|
|
fmt.Sprintf("Install bash completion for %s command", cmd))
|
|
flag.BoolVar(&c.uninstall, "uninstall", false,
|
|
fmt.Sprintf("Uninstall bash completion for %s command", cmd))
|
|
flag.BoolVar(&c.root, "root", false,
|
|
"(Un)Install as root:\n"+
|
|
" (Un)Install at /etc/bash_completion.d/ (user should have write permissions to that directory).\n"+
|
|
" If not set, a complete command will be added(removed) to ~/.bashrc")
|
|
flag.BoolVar(&c.yes, "y", false, "Don't prompt user for typing 'yes'")
|
|
flag.Parse()
|
|
return c
|
|
}
|
|
|
|
func (c config) validate() error {
|
|
if c.install && c.uninstall {
|
|
return errors.New("Install and uninstall are exclusive")
|
|
}
|
|
if !c.install && !c.uninstall {
|
|
return errors.New("Must specify -install or -uninstall")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (c config) action() string {
|
|
if c.install {
|
|
return "Install"
|
|
}
|
|
return "Uninstall"
|
|
}
|