Update the printing of VCS debug messages
This update is for better concurrent handling. When the original
message gives up the lock there is a race for a concurrent or the
following debug message to print the next element. This update
removes the race to the next message. The vcs debug output will
always be next.
diff --git a/msg/msg.go b/msg/msg.go
index b0961d3..8b0f077 100644
--- a/msg/msg.go
+++ b/msg/msg.go
@@ -177,7 +177,7 @@
// When operations in Glide are happening concurrently messaging needs to be
// locked to avoid displaying one message in the middle of another one.
m.Lock()
-
+ defer m.Unlock()
// Get rid of the annoying fact that messages need \n at the end, but do
// it in a backward compatible way.
if !strings.HasSuffix(msg, "\n") {
@@ -190,25 +190,22 @@
fmt.Fprintf(m.Stderr, msg, args...)
}
- m.Unlock()
-
- if len(args) != 0 {
+ // If an arg is a vcs error print the output if in debug mode. This is
+ // capured here rather than calling Debug because concurrent operations
+ // could cause other messages to appear between the initial error and the
+ // debug output by unlocking and calling Debug.
+ if len(args) != 0 && !m.Quiet && m.IsDebugging {
if err, ok := args[len(args)-1].(error); ok {
- m.printErrorAsDebug(err)
+ switch t := err.(type) {
+ case *vcs.LocalError:
+ fmt.Fprintf(m.Stderr, "[DEBUG]\tOutput was: %s", strings.TrimSpace(t.Out()))
+ case *vcs.RemoteError:
+ fmt.Fprintf(m.Stderr, "[DEBUG]\tOutput was: %s", strings.TrimSpace(t.Out()))
+ }
}
}
}
-func (m *Messenger) printErrorAsDebug(err error) {
- // TODO: It'd be nice if the error was an interface, not a struct
- switch t := err.(type) {
- case *vcs.LocalError:
- m.Debug("Output was: %s", strings.TrimSpace(t.Out()))
- case *vcs.RemoteError:
- m.Debug("Output was: %s", strings.TrimSpace(t.Out()))
- }
-}
-
// Msg prints a message with optional arguments, that can be printed, of
// varying types using the Default Messenger.
func Msg(msg string, args ...interface{}) {