completion.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package completion
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "path/filepath"
  8. "runtime"
  9. "github.com/logrusorgru/aurora"
  10. "github.com/urfave/cli"
  11. "github.com/zeromicro/go-zero/tools/goctl/util/pathx"
  12. "github.com/zeromicro/go-zero/tools/goctl/vars"
  13. )
  14. func Completion(c *cli.Context) error {
  15. goos := runtime.GOOS
  16. if goos == vars.OsWindows {
  17. return fmt.Errorf("%q: only support unix-like OS", goos)
  18. }
  19. name := c.String("name")
  20. if len(name) == 0 {
  21. name = defaultCompletionFilename
  22. }
  23. if filepath.IsAbs(name) {
  24. return fmt.Errorf("unsupport absolute path: %q", name)
  25. }
  26. home, err := pathx.GetAutoCompleteHome()
  27. if err != nil {
  28. return err
  29. }
  30. buffer := bytes.NewBuffer(nil)
  31. zshF := filepath.Join(home, "zsh", defaultCompletionFilename)
  32. err = pathx.MkdirIfNotExist(filepath.Dir(zshF))
  33. if err != nil {
  34. return err
  35. }
  36. bashF := filepath.Join(home, "bash", defaultCompletionFilename)
  37. err = pathx.MkdirIfNotExist(filepath.Dir(bashF))
  38. if err != nil {
  39. return err
  40. }
  41. flag := magic
  42. err = ioutil.WriteFile(zshF, zsh, os.ModePerm)
  43. if err == nil {
  44. flag |= flagZsh
  45. }
  46. err = ioutil.WriteFile(bashF, bash, os.ModePerm)
  47. if err == nil {
  48. flag |= flagBash
  49. }
  50. buffer.WriteString(aurora.BrightGreen("generation auto completion success!\n").String())
  51. buffer.WriteString(aurora.BrightGreen("executes the following script to setting shell:\n").String())
  52. switch flag {
  53. case magic | flagZsh:
  54. buffer.WriteString(aurora.BrightCyan(fmt.Sprintf("echo PROG=goctl source %s >> ~/.zshrc && source ~/.zshrc", zshF)).String())
  55. case magic | flagBash:
  56. buffer.WriteString(aurora.BrightCyan(fmt.Sprintf("echo PROG=goctl source %s >> ~/.bashrc && source ~/.bashrc", bashF)).String())
  57. case magic | flagZsh | flagBash:
  58. buffer.WriteString(aurora.BrightCyan(fmt.Sprintf(`echo PROG=goctl source %s >> ~/.zshrc && source ~/.zshrc
  59. or
  60. echo PROG=goctl source %s >> ~/.bashrc && source ~/.bashrc`, zshF, bashF)).String())
  61. default:
  62. return nil
  63. }
  64. fmt.Println(buffer.String())
  65. return nil
  66. }