|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
|
|
|
_ "embed"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"runtime"
|
|
|
|
"strings"
|
|
|
|
"text/template"
|
|
|
|
|
|
|
|
"github.com/logrusorgru/aurora"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/withfig/autocomplete-tools/integrations/cobra"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/api"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/bug"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/docker"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/env"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/gateway"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/internal/cobrax"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/internal/version"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/kube"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/migrate"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/model"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/quickstart"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/rpc"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/tpl"
|
|
|
|
"github.com/zeromicro/go-zero/tools/goctl/upgrade"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
codeFailure = 1
|
|
|
|
dash = "-"
|
|
|
|
doubleDash = "--"
|
|
|
|
assign = "="
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
//go:embed usage.tpl
|
|
|
|
usageTpl string
|
|
|
|
rootCmd = cobrax.NewCommand("goctl")
|
|
|
|
)
|
|
|
|
|
|
|
|
// Execute executes the given command
|
|
|
|
func Execute() {
|
|
|
|
os.Args = supportGoStdFlag(os.Args)
|
|
|
|
if err := rootCmd.Execute(); err != nil {
|
|
|
|
fmt.Println(aurora.Red(err.Error()))
|
|
|
|
os.Exit(codeFailure)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func supportGoStdFlag(args []string) []string {
|
|
|
|
copyArgs := append([]string(nil), args...)
|
|
|
|
parentCmd, _, err := rootCmd.Traverse(args[:1])
|
|
|
|
if err != nil { // ignore it to let cobra handle the error.
|
|
|
|
return copyArgs
|
|
|
|
}
|
|
|
|
|
|
|
|
for idx, arg := range copyArgs[0:] {
|
|
|
|
parentCmd, _, err = parentCmd.Traverse([]string{arg})
|
|
|
|
if err != nil { // ignore it to let cobra handle the error.
|
|
|
|
break
|
|
|
|
}
|
|
|
|
if !strings.HasPrefix(arg, dash) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
flagExpr := strings.TrimPrefix(arg, doubleDash)
|
|
|
|
flagExpr = strings.TrimPrefix(flagExpr, dash)
|
|
|
|
flagName, flagValue := flagExpr, ""
|
|
|
|
assignIndex := strings.Index(flagExpr, assign)
|
|
|
|
if assignIndex > 0 {
|
|
|
|
flagName = flagExpr[:assignIndex]
|
|
|
|
flagValue = flagExpr[assignIndex:]
|
|
|
|
}
|
|
|
|
|
|
|
|
if !isBuiltin(flagName) {
|
|
|
|
// The method Flag can only match the user custom flags.
|
|
|
|
f := parentCmd.Flag(flagName)
|
|
|
|
if f == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if f.Shorthand == flagName {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
goStyleFlag := doubleDash + flagName
|
|
|
|
if assignIndex > 0 {
|
|
|
|
goStyleFlag += flagValue
|
|
|
|
}
|
|
|
|
|
|
|
|
copyArgs[idx] = goStyleFlag
|
|
|
|
}
|
|
|
|
return copyArgs
|
|
|
|
}
|
|
|
|
|
|
|
|
func isBuiltin(name string) bool {
|
|
|
|
return name == "version" || name == "help"
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
cobra.AddTemplateFuncs(template.FuncMap{
|
|
|
|
"blue": blue,
|
|
|
|
"green": green,
|
|
|
|
"rpadx": rpadx,
|
|
|
|
"rainbow": rainbow,
|
|
|
|
})
|
|
|
|
|
|
|
|
rootCmd.Version = fmt.Sprintf(
|
|
|
|
"%s %s/%s", version.BuildVersion,
|
|
|
|
runtime.GOOS, runtime.GOARCH)
|
|
|
|
|
|
|
|
rootCmd.SetUsageTemplate(usageTpl)
|
|
|
|
rootCmd.AddCommand(api.Cmd, bug.Cmd, docker.Cmd, kube.Cmd, env.Cmd, gateway.Cmd, model.Cmd)
|
|
|
|
rootCmd.AddCommand(migrate.Cmd, quickstart.Cmd, rpc.Cmd, tpl.Cmd, upgrade.Cmd)
|
|
|
|
rootCmd.Command.AddCommand(cobracompletefig.CreateCompletionSpecCommand())
|
|
|
|
rootCmd.MustInit()
|
|
|
|
}
|