mirror of
https://github.com/goreleaser/goreleaser.git
synced 2024-12-31 01:53:50 +02:00
e132922d23
The __completeNoDesc command is used by bash to request completion without any descriptions. It must be properly supported for cobra.Command.ValidArgsFunction to work with bash completion. Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>
113 lines
2.4 KiB
Go
113 lines
2.4 KiB
Go
package cmd
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
|
|
"github.com/apex/log"
|
|
"github.com/apex/log/handlers/cli"
|
|
"github.com/fatih/color"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func Execute(version string, exit func(int), args []string) {
|
|
// enable colored output on travis
|
|
if os.Getenv("CI") != "" {
|
|
color.NoColor = false
|
|
}
|
|
log.SetHandler(cli.Default)
|
|
newRootCmd(version, exit).Execute(args)
|
|
}
|
|
|
|
func (cmd *rootCmd) Execute(args []string) {
|
|
cmd.cmd.SetArgs(args)
|
|
|
|
if shouldPrependRelease(cmd.cmd, args) {
|
|
cmd.cmd.SetArgs(append([]string{"release"}, args...))
|
|
}
|
|
|
|
if err := cmd.cmd.Execute(); err != nil {
|
|
var code = 1
|
|
var msg = "command failed"
|
|
var eerr = &exitError{}
|
|
if errors.As(err, &eerr) {
|
|
code = eerr.code
|
|
if eerr.details != "" {
|
|
msg = eerr.details
|
|
}
|
|
}
|
|
log.WithError(err).Error(msg)
|
|
cmd.exit(code)
|
|
}
|
|
}
|
|
|
|
type rootCmd struct {
|
|
cmd *cobra.Command
|
|
debug bool
|
|
exit func(int)
|
|
}
|
|
|
|
func newRootCmd(version string, exit func(int)) *rootCmd {
|
|
var root = &rootCmd{
|
|
exit: exit,
|
|
}
|
|
var cmd = &cobra.Command{
|
|
Use: "goreleaser",
|
|
Short: "Deliver Go binaries as fast and easily as possible",
|
|
Version: version,
|
|
SilenceUsage: true,
|
|
SilenceErrors: true,
|
|
Args: cobra.NoArgs,
|
|
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
|
if root.debug {
|
|
log.SetLevel(log.DebugLevel)
|
|
log.Debug("debug logs enabled")
|
|
}
|
|
},
|
|
}
|
|
|
|
cmd.PersistentFlags().BoolVar(&root.debug, "debug", false, "Enable debug mode")
|
|
cmd.AddCommand(
|
|
newBuildCmd().cmd,
|
|
newReleaseCmd().cmd,
|
|
newCheckCmd().cmd,
|
|
newInitCmd().cmd,
|
|
newCompletionCmd().cmd,
|
|
)
|
|
|
|
root.cmd = cmd
|
|
return root
|
|
}
|
|
|
|
func shouldPrependRelease(cmd *cobra.Command, args []string) bool {
|
|
// find current cmd, if its not root, it means the user actively
|
|
// set a command, so let it go
|
|
xmd, _, _ := cmd.Find(args)
|
|
if xmd != cmd {
|
|
return false
|
|
}
|
|
|
|
// allow help and the two __complete commands.
|
|
if len(args) > 0 && (args[0] == "help" ||
|
|
args[0] == cobra.ShellCompRequestCmd || args[0] == cobra.ShellCompNoDescRequestCmd) {
|
|
return false
|
|
}
|
|
|
|
// if we have != 1 args, assume its a release
|
|
if len(args) != 1 {
|
|
return true
|
|
}
|
|
|
|
// given that its 1, check if its one of the valid standalone flags
|
|
// for the root cmd
|
|
for _, s := range []string{"-h", "--help", "-v", "--version"} {
|
|
if s == args[0] {
|
|
// if it is, we should run the root cmd
|
|
return false
|
|
}
|
|
}
|
|
|
|
// otherwise, we should probably prepend release
|
|
return true
|
|
}
|