From 3e5b4066d2a067ef49f6ca39b3f84d2ebcad25ba Mon Sep 17 00:00:00 2001
From: KUOKA Yusuke <ykuoka@gmail.com>
Date: Tue, 24 Jul 2018 04:49:42 +0900
Subject: [PATCH] feat(helm): Detailed exit code for helm plugins (#4367)

Resolves #4170
---
 cmd/helm/helm.go         |  7 ++++++-
 cmd/helm/load_plugins.go | 12 +++++++++++-
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go
index be3ced376..3f859392d 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 f4c97bde7..67de8bae5 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
 				}
-- 
GitLab