completion.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. return err
  45. }
  46. flag |= flagZsh
  47. err = ioutil.WriteFile(bashF, bash, os.ModePerm)
  48. if err != nil {
  49. return err
  50. }
  51. flag |= flagBash
  52. buffer.WriteString(aurora.BrightGreen("generation auto completion success!\n").String())
  53. buffer.WriteString(aurora.BrightGreen("executes the following script to setting shell:\n").String())
  54. switch flag {
  55. case magic | flagZsh:
  56. buffer.WriteString(aurora.BrightCyan(fmt.Sprintf("echo PROG=goctl source %s >> ~/.zshrc && source ~/.zshrc", zshF)).String())
  57. case magic | flagBash:
  58. buffer.WriteString(aurora.BrightCyan(fmt.Sprintf("echo PROG=goctl source %s >> ~/.bashrc && source ~/.bashrc", bashF)).String())
  59. case magic | flagZsh | flagBash:
  60. buffer.WriteString(aurora.BrightCyan(fmt.Sprintf(`echo PROG=goctl source %s >> ~/.zshrc && source ~/.zshrc
  61. or
  62. echo PROG=goctl source %s >> ~/.bashrc && source ~/.bashrc`, zshF, bashF)).String())
  63. default:
  64. return nil
  65. }
  66. fmt.Println(buffer.String())
  67. return nil
  68. }