package install import ( "errors" "os" "os/user" "path/filepath" "github.com/hashicorp/go-multierror" ) type installer interface { Install(cmd, bin string) error Uninstall(cmd, bin string) error } // Install complete command given: // cmd: is the command name func Install(cmd string) error { is := installers() if len(is) == 0 { return errors.New("Did not find any shells to install") } bin, err := getBinaryPath() if err != nil { return err } for _, i := range is { errI := i.Install(cmd, bin) if errI != nil { err = multierror.Append(err, errI) } } return err } // Uninstall complete command given: // cmd: is the command name func Uninstall(cmd string) error { is := installers() if len(is) == 0 { return errors.New("Did not find any shells to uninstall") } bin, err := getBinaryPath() if err != nil { return err } for _, i := range is { errI := i.Uninstall(cmd, bin) if errI != nil { err = multierror.Append(err, errI) } } return err } func installers() (i []installer) { for _, rc := range [...]string{".bashrc", ".bash_profile", ".bash_login", ".profile"} { if f := rcFile(rc); f != "" { i = append(i, bash{f}) break } } if f := rcFile(".zshrc"); f != "" { i = append(i, zsh{f}) } if d := fishConfigDir(); d != "" { i = append(i, fish{d}) } return } func fishConfigDir() string { configDir := filepath.Join(getConfigHomePath(), "fish") if configDir == "" { return "" } if info, err := os.Stat(configDir); err != nil || !info.IsDir() { return "" } return configDir } func getConfigHomePath() string { u, err := user.Current() if err != nil { return "" } configHome := os.Getenv("XDG_CONFIG_HOME") if configHome == "" { return filepath.Join(u.HomeDir, ".config") } return configHome } func getBinaryPath() (string, error) { bin, err := os.Executable() if err != nil { return "", err } return filepath.Abs(bin) } func rcFile(name string) string { u, err := user.Current() if err != nil { return "" } path := filepath.Join(u.HomeDir, name) if _, err := os.Stat(path); err != nil { return "" } return path }