Fixed #147: If an error occurs Glide exists with a non-0 exit code
diff --git a/glide.go b/glide.go
index e7900a8..eb3b61b 100644
--- a/glide.go
+++ b/glide.go
@@ -40,6 +40,7 @@
 	"path/filepath"
 
 	"github.com/Masterminds/glide/action"
+	"github.com/Masterminds/glide/msg"
 	gpath "github.com/Masterminds/glide/path"
 	"github.com/Masterminds/glide/repo"
 
@@ -111,7 +112,18 @@
 	app.Before = startup
 	app.Commands = commands()
 
-	app.Run(os.Args)
+	// Detect errors from the Before and After calls and exit on them.
+	if err := app.Run(os.Args); err != nil {
+		msg.Error(err.Error())
+		os.Exit(1)
+	}
+
+	// If there was a Error message exit non-zero.
+	if msg.HasErrored() {
+		m := msg.Color(msg.Red, "An Error has occured")
+		msg.Msg(m)
+		os.Exit(2)
+	}
 }
 
 func commands() []cli.Command {
diff --git a/msg/msg.go b/msg/msg.go
index 880afb5..7c9f705 100644
--- a/msg/msg.go
+++ b/msg/msg.go
@@ -33,6 +33,9 @@
 
 	// The default exit code to use when dyping
 	ecode int
+
+	// If an error was been sent.
+	hasErrored bool
 }
 
 // NewMessanger creates a default Messanger to display output.
@@ -96,6 +99,7 @@
 func (m *Messanger) Error(msg string, args ...interface{}) {
 	prefix := m.Color(Red, "[ERROR] ")
 	m.Msg(prefix+msg, args...)
+	m.hasErrored = true
 }
 
 // Error logs and error using the Default Messanger
@@ -212,3 +216,25 @@
 func Print(msg string) {
 	Default.Print(msg)
 }
+
+// HasErrored returns if Error has been called.
+//
+// This is useful if you want to known if Error was called to exit with a
+// non-zero exit code.
+func (m *Messanger) HasErrored() bool {
+	return m.hasErrored
+}
+
+// HasErrored returns if Error has been called on the Default Messanger.
+//
+// This is useful if you want to known if Error was called to exit with a
+// non-zero exit code.
+func HasErrored() bool {
+	return Default.HasErrored()
+}
+
+// Color returns a string in a certain color if colors are enabled and
+// available on that platform.
+func Color(code, msg string) string {
+	return Default.Color(code, msg)
+}