cli: ANSI color is now also disabled by -o/--output-file (#1533)
ANSI color on stdout (not stderr) is now disabled if the -o/--output-file option is detected (and its value is not "-"). Added outputFileOption, and more advice in comments.
This commit is contained in:
		
							parent
							
								
									fe846a0c7f
								
							
						
					
					
						commit
						483fa9682e
					
				| @ -155,6 +155,7 @@ traceWith f a = trace (f a) a | |||||||
| -- touch and reload this module to see the effect of a new --debug option. | -- touch and reload this module to see the effect of a new --debug option. | ||||||
| -- {-# OPTIONS_GHC -fno-cse #-} | -- {-# OPTIONS_GHC -fno-cse #-} | ||||||
| -- {-# NOINLINE debugLevel #-} | -- {-# NOINLINE debugLevel #-} | ||||||
|  | -- Avoid using dbg* in this function (infinite loop). | ||||||
| debugLevel :: Int | debugLevel :: Int | ||||||
| debugLevel = case snd $ break (=="--debug") args of | debugLevel = case snd $ break (=="--debug") args of | ||||||
|                "--debug":[]  -> 1 |                "--debug":[]  -> 1 | ||||||
| @ -167,28 +168,33 @@ debugLevel = case snd $ break (=="--debug") args of | |||||||
|     where |     where | ||||||
|       args = unsafePerformIO getArgs |       args = unsafePerformIO getArgs | ||||||
| 
 | 
 | ||||||
|  | -- Avoid using dbg*, pshow etc. in this function (infinite loop). | ||||||
| -- | Check the IO environment to see if ANSI colour codes should be used on stdout. | -- | 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  | -- 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. | -- low-level debug utilities, which should be ok since we are just reading. | ||||||
| -- The logic is: use color if  | -- The logic is: use color if  | ||||||
| -- a NO_COLOR environment variable is not defined | -- a NO_COLOR environment variable is not defined | ||||||
| -- and the program was not started with --color=no|never | -- and the program was not started with --color=no|never | ||||||
| -- and stdout supports ANSI color, or the program was started with --color=yes|always. | -- and ( | ||||||
|  | --   the program was started with --color=yes|always | ||||||
|  | --   or stdout supports ANSI color and -o/--output-file was not used or is "-" | ||||||
|  | -- ). | ||||||
| -- Caveats: | -- Caveats: | ||||||
| -- Existence of the NO_COLOR variable, and whether the output handle supports ANSI color, |  | ||||||
| -- might not be checked at program startup, but rather when this is (first?) evaluated. |  | ||||||
| -- When running code in GHCI, this module must be reloaded to see a change. | -- When running code in GHCI, this module must be reloaded to see a change. | ||||||
| -- {-# OPTIONS_GHC -fno-cse #-} | -- {-# OPTIONS_GHC -fno-cse #-} | ||||||
| -- {-# NOINLINE useColorOnStdout #-} | -- {-# NOINLINE useColorOnStdout #-} | ||||||
| useColorOnStdout :: Bool | useColorOnStdout :: Bool | ||||||
| useColorOnStdout = useColorOnHandle stdout | useColorOnStdout = not hasOutputFile && useColorOnHandle stdout | ||||||
| 
 | 
 | ||||||
| -- | Like useColorOnStdout, but checks for ANSI color support on stderr. | -- Avoid using dbg*, pshow etc. in this function (infinite loop). | ||||||
|  | -- | Like useColorOnStdout, but checks for ANSI color support on stderr, | ||||||
|  | -- and is not affected by -o/--output-file. | ||||||
| -- {-# OPTIONS_GHC -fno-cse #-} | -- {-# OPTIONS_GHC -fno-cse #-} | ||||||
| -- {-# NOINLINE useColorOnStdout #-} | -- {-# NOINLINE useColorOnStdout #-} | ||||||
| useColorOnStderr :: Bool | useColorOnStderr :: Bool | ||||||
| useColorOnStderr = useColorOnHandle stderr | useColorOnStderr = useColorOnHandle stderr | ||||||
| 
 | 
 | ||||||
|  | -- Avoid using dbg*, pshow etc. in this function (infinite loop). | ||||||
| -- XXX sorry, I'm just cargo-culting these pragmas: | -- XXX sorry, I'm just cargo-culting these pragmas: | ||||||
| -- {-# OPTIONS_GHC -fno-cse #-} | -- {-# OPTIONS_GHC -fno-cse #-} | ||||||
| -- {-# NOINLINE useColorOnHandle #-} | -- {-# NOINLINE useColorOnHandle #-} | ||||||
| @ -203,12 +209,13 @@ useColorOnHandle h = unsafePerformIO $ do | |||||||
|     ,coloroption `elem` ["always","yes"] || supports_color |     ,coloroption `elem` ["always","yes"] || supports_color | ||||||
|     ] |     ] | ||||||
| 
 | 
 | ||||||
|  | -- Keep synced with color/colour flag definition in hledger:CliOptions. | ||||||
|  | -- Avoid using dbg*, pshow etc. in this function (infinite loop). | ||||||
| -- | Read the value of the --color or --colour command line option provided at program startup | -- | Read the value of the --color or --colour command line option provided at program startup | ||||||
| -- using unsafePerformIO. If this option was not provided, returns the empty string. | -- using unsafePerformIO. If this option was not provided, returns the empty string. | ||||||
| -- (When running code in GHCI, this module must be reloaded to see a change.) | -- (When running code in GHCI, this module must be reloaded to see a change.) | ||||||
| -- {-# OPTIONS_GHC -fno-cse #-} | -- {-# OPTIONS_GHC -fno-cse #-} | ||||||
| -- {-# NOINLINE colorOption #-} | -- {-# NOINLINE colorOption #-} | ||||||
| -- Keep synced with color/colour flag definition in hledger:CliOptions |  | ||||||
| colorOption :: String | colorOption :: String | ||||||
| colorOption =  | colorOption =  | ||||||
|   -- similar to debugLevel |   -- similar to debugLevel | ||||||
| @ -230,6 +237,39 @@ colorOption = | |||||||
|                 ['-':'-':'c':'o':'l':'o':'u':'r':'=':v] -> v |                 ['-':'-':'c':'o':'l':'o':'u':'r':'=':v] -> v | ||||||
|                 _ -> "" |                 _ -> "" | ||||||
| 
 | 
 | ||||||
|  | -- Avoid using dbg*, pshow etc. in this function (infinite loop). | ||||||
|  | -- | Check whether the -o/--output-file option has been used at program startup | ||||||
|  | -- with an argument other than "-", using unsafePerformIO. | ||||||
|  | -- {-# OPTIONS_GHC -fno-cse #-} | ||||||
|  | -- {-# NOINLINE hasOutputFile #-} | ||||||
|  | hasOutputFile :: Bool | ||||||
|  | hasOutputFile = not $ outputFileOption `elem` [Nothing, Just "-"] | ||||||
|  | 
 | ||||||
|  | -- Keep synced with output-file flag definition in hledger:CliOptions. | ||||||
|  | -- Avoid using dbg*, pshow etc. in this function (infinite loop). | ||||||
|  | -- | Read the value of the -o/--output-file command line option provided at program startup, | ||||||
|  | -- if any, using unsafePerformIO. | ||||||
|  | -- (When running code in GHCI, this module must be reloaded to see a change.) | ||||||
|  | -- {-# OPTIONS_GHC -fno-cse #-} | ||||||
|  | -- {-# NOINLINE outputFileOption #-} | ||||||
|  | outputFileOption :: Maybe String | ||||||
|  | outputFileOption =  | ||||||
|  |   let args = unsafePerformIO getArgs in | ||||||
|  |   case snd $ break ("-o" `isPrefixOf`) args of | ||||||
|  |     -- -oARG | ||||||
|  |     ('-':'o':v@(_:_)):_ -> Just v | ||||||
|  |     -- -o ARG | ||||||
|  |     "-o":v:_ -> Just v | ||||||
|  |     _ -> | ||||||
|  |       case snd $ break (=="--output-file") args of | ||||||
|  |         -- --output-file ARG | ||||||
|  |         "--output-file":v:_ -> Just v | ||||||
|  |         _ -> | ||||||
|  |           case take 1 $ filter ("--output-file=" `isPrefixOf`) args of | ||||||
|  |             -- --output=file=ARG | ||||||
|  |             ['-':'-':'o':'u':'t':'p':'u':'t':'-':'f':'i':'l':'e':'=':v] -> Just v | ||||||
|  |             _ -> Nothing | ||||||
|  | 
 | ||||||
| -- | Trace (print to stderr) a string if the global debug level is at | -- | Trace (print to stderr) a string if the global debug level is at | ||||||
| -- or above the specified level. At level 0, always prints. Otherwise, | -- or above the specified level. At level 0, always prints. Otherwise, | ||||||
| -- uses unsafePerformIO. | -- uses unsafePerformIO. | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user