diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go index be3ced3761142e6db3c3101dcfa28165f5e04411..3f859392d369665f361436b3aa4472a45b9ea717 100644 --- a/cmd/helm/helm.go +++ b/cmd/helm/helm.go @@ -158,7 +158,12 @@ func init() { func main() { cmd := newRootCmd(os.Args[1:]) if err := cmd.Execute(); err != nil { - os.Exit(1) + switch e := err.(type) { + case pluginError: + os.Exit(e.code) + default: + os.Exit(1) + } } } diff --git a/cmd/helm/load_plugins.go b/cmd/helm/load_plugins.go index f4c97bde7031e82bca8773d12c3dc7c3ef4994cd..67de8bae537a153e025141fab5f1491927dc4520 100644 --- a/cmd/helm/load_plugins.go +++ b/cmd/helm/load_plugins.go @@ -22,12 +22,18 @@ import ( "os/exec" "path/filepath" "strings" + "syscall" "github.com/spf13/cobra" "k8s.io/helm/pkg/plugin" ) +type pluginError struct { + error + code int +} + // loadPlugins loads plugins into the command list. // // This follows a different pattern than the other commands because it has @@ -87,7 +93,11 @@ func loadPlugins(baseCmd *cobra.Command, out io.Writer) { if err := prog.Run(); err != nil { if eerr, ok := err.(*exec.ExitError); ok { os.Stderr.Write(eerr.Stderr) - return fmt.Errorf("plugin %q exited with error", md.Name) + status := eerr.Sys().(syscall.WaitStatus) + return pluginError{ + error: fmt.Errorf("plugin %q exited with error", md.Name), + code: status.ExitStatus(), + } } return err }