Skip to content

Commit 118e39a

Browse files
committed
Carry custom status code for commands to os.Exit()
1 parent a35c1d4 commit 118e39a

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

cmd/cobra.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package caddycmd
22

33
import (
4+
"fmt"
5+
46
"github.com/spf13/cobra"
57
)
68

@@ -123,7 +125,23 @@ func caddyCmdToCobra(caddyCmd Command) *cobra.Command {
123125
// in a cobra command's RunE field.
124126
func WrapCommandFuncForCobra(f CommandFunc) func(cmd *cobra.Command, _ []string) error {
125127
return func(cmd *cobra.Command, _ []string) error {
126-
_, err := f(Flags{cmd.Flags()})
128+
status, err := f(Flags{cmd.Flags()})
129+
if status > 1 {
130+
cmd.SilenceErrors = true
131+
return &customExitError{ExitCode: status, Err: err}
132+
}
127133
return err
128134
}
129135
}
136+
137+
type customExitError struct {
138+
ExitCode int
139+
Err error
140+
}
141+
142+
func (e *customExitError) Error() string {
143+
if e.Err == nil {
144+
return fmt.Sprintf("exiting with status %d", e.ExitCode)
145+
}
146+
return e.Err.Error()
147+
}

cmd/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package caddycmd
1717
import (
1818
"bufio"
1919
"bytes"
20+
"errors"
2021
"flag"
2122
"fmt"
2223
"io"
@@ -63,6 +64,10 @@ func Main() {
6364
}
6465

6566
if err := rootCmd.Execute(); err != nil {
67+
var exitError *customExitError
68+
if errors.As(err, &exitError) {
69+
os.Exit(exitError.ExitCode)
70+
}
6671
os.Exit(1)
6772
}
6873
}

0 commit comments

Comments
 (0)