]> Cypherpunks.ru repositories - goredo.git/blobdiff - log.go
Raise version
[goredo.git] / log.go
diff --git a/log.go b/log.go
index 335ca53c3d0a146079286a4c4b04caed91c6f450..2745fd4ee71a05f90837f80f1fd2e2137f4e304b 100644 (file)
--- a/log.go
+++ b/log.go
@@ -20,12 +20,22 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package main
 
 import (
+       "flag"
        "fmt"
        "os"
        "strings"
+       "sync"
 )
 
 const (
+       EnvLevel   = "REDO_LEVEL"
+       EnvDebug   = "REDO_DEBUG"
+       EnvLogWait = "REDO_LOG_WAIT"
+       EnvLogLock = "REDO_LOG_LOCK"
+       EnvLogPid  = "REDO_LOG_PID"
+       EnvLogJS   = "REDO_LOG_JS"
+       EnvNoColor = "NO_COLOR"
+
        CReset   = "\033[0m"
        CBold    = "\033[1m"
        CBlack   = "\033[30;1m"
@@ -48,14 +58,35 @@ const (
 )
 
 var (
+       Level   = 0
        NoColor bool
        Debug   bool
        LogWait bool
        LogLock bool
        LogJS   bool
        MyPid   int
+
+       flagDebug   = flag.Bool("debug", false, fmt.Sprintf("enable debug logging (%s=1)", EnvDebug))
+       flagLogWait = flag.Bool("log-wait", false, fmt.Sprintf("enable wait messages logging (%s=1)", EnvLogWait))
+       flagLogLock = flag.Bool("log-lock", false, fmt.Sprintf("enable lock messages logging (%s=1)", EnvLogLock))
+       flagLogPid  = flag.Bool("log-pid", false, fmt.Sprintf("append PIDs (%s=1)", EnvLogPid))
+       flagLogJS   = flag.Bool("log-js", false, fmt.Sprintf("enable jobserver messages logging (%s=1)", EnvLogJS))
+
+       LogMutex   sync.Mutex
+       LogLenPrev int
 )
 
+func fillUpToTermSize(s, end string) string {
+       sLen := len(s)
+       if sLen < LogLenPrev {
+               s += strings.Repeat(" ", LogLenPrev-sLen)
+               LogLenPrev = sLen
+       } else {
+               LogLenPrev = sLen
+       }
+       return s + end
+}
+
 func trace(level, format string, args ...interface{}) {
        var p string
        if MyPid != 0 {
@@ -63,7 +94,11 @@ func trace(level, format string, args ...interface{}) {
        }
        switch level {
        case CNone:
-               os.Stderr.WriteString(StderrPrefix + p + fmt.Sprintf(format+"\n", args...))
+               LogMutex.Lock()
+               os.Stderr.WriteString(fillUpToTermSize(
+                       StderrPrefix+p+fmt.Sprintf(format, args...), "\n",
+               ))
+               LogMutex.Unlock()
                return
        case CDebug:
                if !Debug {
@@ -94,7 +129,9 @@ func trace(level, format string, args ...interface{}) {
        }
        msg := fmt.Sprintf(format, args...)
        msg = StderrPrefix + colourize(level, p+strings.Repeat(". ", Level)+msg)
-       os.Stderr.WriteString(msg + "\n")
+       LogMutex.Lock()
+       os.Stderr.WriteString(fillUpToTermSize(msg, "\n"))
+       LogMutex.Unlock()
 }
 
 func colourize(colour, s string) string {