mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
lib: debug output checks for color support on stderr, not stdout
This is more accurate. useColor is replaced by useColorOnStdout, useColorOnStderr.
This commit is contained in:
parent
2b04b76448
commit
6298722ade
@ -216,7 +216,7 @@ rawOptsToReportOpts rawopts = do
|
||||
,percent_ = boolopt "percent" rawopts
|
||||
,invert_ = boolopt "invert" rawopts
|
||||
,pretty_tables_ = boolopt "pretty-tables" rawopts
|
||||
,color_ = useColor -- a lower-level helper
|
||||
,color_ = useColorOnStdout -- a lower-level helper
|
||||
,forecast_ = forecastPeriodFromRawOpts d rawopts
|
||||
,transpose_ = boolopt "transpose" rawopts
|
||||
}
|
||||
|
@ -94,7 +94,9 @@ module Hledger.Utils.Debug (
|
||||
,traceParse
|
||||
,dbgparse
|
||||
,module Debug.Trace
|
||||
,useColor)
|
||||
,useColorOnStdout
|
||||
,useColorOnStderr
|
||||
)
|
||||
where
|
||||
|
||||
import Control.Monad (when)
|
||||
@ -113,7 +115,7 @@ import Text.Printf
|
||||
import Text.Pretty.Simple -- (defaultOutputOptionsDarkBg, OutputOptions(..), pShowOpt, pPrintOpt)
|
||||
import Data.Maybe (isJust)
|
||||
import System.Console.ANSI (hSupportsANSIColor)
|
||||
import System.IO (stdout)
|
||||
import System.IO (stdout, Handle, stderr)
|
||||
|
||||
prettyopts =
|
||||
baseopts
|
||||
@ -122,8 +124,8 @@ prettyopts =
|
||||
}
|
||||
where
|
||||
baseopts
|
||||
| useColor = defaultOutputOptionsDarkBg -- defaultOutputOptionsLightBg
|
||||
| otherwise = defaultOutputOptionsNoColor
|
||||
| useColorOnStderr = defaultOutputOptionsDarkBg -- defaultOutputOptionsLightBg
|
||||
| otherwise = defaultOutputOptionsNoColor
|
||||
|
||||
-- | Pretty print. Generic alias for pretty-simple's pPrint.
|
||||
pprint :: Show a => a -> IO ()
|
||||
@ -144,7 +146,28 @@ ptrace = traceWith pshow
|
||||
traceWith :: Show a => (a -> String) -> a -> a
|
||||
traceWith f a = trace (f a) a
|
||||
|
||||
-- | Check the IO environment to see if ANSI colour codes should be used in output.
|
||||
-- | Global debug level, which controls the verbosity of debug errput
|
||||
-- on the console. The default is 0 meaning no debug errput. The
|
||||
-- @--debug@ command line flag sets it to 1, or @--debug=N@ sets it to
|
||||
-- a higher value (note: not @--debug N@ for some reason). This uses
|
||||
-- unsafePerformIO and can be accessed from anywhere and before normal
|
||||
-- command-line processing. When running with :main in GHCI, you must
|
||||
-- touch and reload this module to see the effect of a new --debug option.
|
||||
-- {-# OPTIONS_GHC -fno-cse #-}
|
||||
-- {-# NOINLINE debugLevel #-}
|
||||
debugLevel :: Int
|
||||
debugLevel = case snd $ break (=="--debug") args of
|
||||
"--debug":[] -> 1
|
||||
"--debug":n:_ -> readDef 1 n
|
||||
_ ->
|
||||
case take 1 $ filter ("--debug" `isPrefixOf`) args of
|
||||
['-':'-':'d':'e':'b':'u':'g':'=':v] -> readDef 1 v
|
||||
_ -> 0
|
||||
|
||||
where
|
||||
args = unsafePerformIO getArgs
|
||||
|
||||
-- | Check the IO environment to see if ANSI colour codes should be used on stdout.
|
||||
-- This is done using unsafePerformIO so it can be used anywhere, eg in
|
||||
-- low-level debug utilities, which should be ok since we are just reading.
|
||||
-- (When running code in GHCI, this module must be reloaded to see a change.)
|
||||
@ -153,11 +176,23 @@ traceWith f a = trace (f a) a
|
||||
-- and the program was not started with --color=no|never
|
||||
-- and stdout supports ANSI color, or the program was started with --color=yes|always.
|
||||
-- {-# OPTIONS_GHC -fno-cse #-}
|
||||
-- {-# NOINLINE useColor #-}
|
||||
useColor :: Bool
|
||||
useColor = unsafePerformIO $ do
|
||||
-- {-# NOINLINE useColorOnStdout #-}
|
||||
useColorOnStdout :: Bool
|
||||
useColorOnStdout = useColorOnHandle stdout
|
||||
|
||||
-- | Like useColorOnStdout, but checks for ANSI color support on stderr.
|
||||
-- {-# OPTIONS_GHC -fno-cse #-}
|
||||
-- {-# NOINLINE useColorOnStdout #-}
|
||||
useColorOnStderr :: Bool
|
||||
useColorOnStderr = useColorOnHandle stderr
|
||||
|
||||
-- XXX sorry, I'm just cargo-culting these pragmas:
|
||||
-- {-# OPTIONS_GHC -fno-cse #-}
|
||||
-- {-# NOINLINE useColorOnHandle #-}
|
||||
useColorOnHandle :: Handle -> Bool
|
||||
useColorOnHandle h = unsafePerformIO $ do
|
||||
no_color <- isJust <$> lookupEnv "NO_COLOR"
|
||||
supports_color <- hSupportsANSIColor stdout
|
||||
supports_color <- hSupportsANSIColor h
|
||||
let coloroption = colorOption
|
||||
return $ and [
|
||||
not no_color
|
||||
@ -187,27 +222,6 @@ colorOption =
|
||||
['-':'-':'c':'o':'l':'o':'u':'r':'=':v] -> v
|
||||
_ -> ""
|
||||
|
||||
-- | Global debug level, which controls the verbosity of debug output
|
||||
-- on the console. The default is 0 meaning no debug output. The
|
||||
-- @--debug@ command line flag sets it to 1, or @--debug=N@ sets it to
|
||||
-- a higher value (note: not @--debug N@ for some reason). This uses
|
||||
-- unsafePerformIO and can be accessed from anywhere and before normal
|
||||
-- command-line processing. When running with :main in GHCI, you must
|
||||
-- touch and reload this module to see the effect of a new --debug option.
|
||||
-- {-# OPTIONS_GHC -fno-cse #-}
|
||||
-- {-# NOINLINE debugLevel #-}
|
||||
debugLevel :: Int
|
||||
debugLevel = case snd $ break (=="--debug") args of
|
||||
"--debug":[] -> 1
|
||||
"--debug":n:_ -> readDef 1 n
|
||||
_ ->
|
||||
case take 1 $ filter ("--debug" `isPrefixOf`) args of
|
||||
['-':'-':'d':'e':'b':'u':'g':'=':v] -> readDef 1 v
|
||||
_ -> 0
|
||||
|
||||
where
|
||||
args = unsafePerformIO getArgs
|
||||
|
||||
-- | Trace (print to stderr) a string if the global debug level is at
|
||||
-- or above the specified level. At level 0, always prints. Otherwise,
|
||||
-- uses unsafePerformIO.
|
||||
|
Loading…
Reference in New Issue
Block a user