package completion import ( "bytes" "fmt" "io/ioutil" "os" "path/filepath" "runtime" "github.com/logrusorgru/aurora" "github.com/urfave/cli" "github.com/zeromicro/go-zero/tools/goctl/util/pathx" "github.com/zeromicro/go-zero/tools/goctl/vars" ) func Completion(c *cli.Context) error { goos := runtime.GOOS if goos == vars.OsWindows { return fmt.Errorf("%q: only support unix-like OS", goos) } name := c.String("name") if len(name) == 0 { name = defaultCompletionFilename } if filepath.IsAbs(name) { return fmt.Errorf("unsupport absolute path: %q", name) } home, err := pathx.GetAutoCompleteHome() if err != nil { return err } buffer := bytes.NewBuffer(nil) zshF := filepath.Join(home, "zsh", defaultCompletionFilename) err = pathx.MkdirIfNotExist(filepath.Dir(zshF)) if err != nil { return err } bashF := filepath.Join(home, "bash", defaultCompletionFilename) err = pathx.MkdirIfNotExist(filepath.Dir(bashF)) if err != nil { return err } var flag = magic err = ioutil.WriteFile(zshF, zsh, os.ModePerm) if err != nil { return err } flag |= flagZsh err = ioutil.WriteFile(bashF, bash, os.ModePerm) if err != nil { return err } flag |= flagBash buffer.WriteString(aurora.Green("generation auto completion success!\n").String()) buffer.WriteString(aurora.Green("executes the following script to setting shell:\n").String()) switch flag { case magic | flagZsh: buffer.WriteString(aurora.Blue(fmt.Sprintf("echo PROG=goctl source %s >> ~/.zshrc && source ~/.zshrc", zshF)).String()) case magic | flagBash: buffer.WriteString(aurora.Blue(fmt.Sprintf("echo PROG=goctl source %s >> ~/.bashrc && source ~/.bashrc", bashF)).String()) case magic | flagZsh | flagBash: buffer.WriteString(aurora.Blue(fmt.Sprintf(`echo PROG=goctl source %s >> ~/.zshrc && source ~/.zshrc or echo PROG=goctl source %s >> ~/.bashrc && source ~/.bashrc`, zshF, bashF)).String()) default: return nil } fmt.Println(buffer.String()) return nil }