mirror of
1
0
Fork 0

Add `--force-color` option

This forces Dotbot to produce colored output, regardless of whether it
is outputting to a TTY.

This is useful to support use cases such as piping colored Dotbot output
into another program for formatting (e.g. I want to indent the output as
part of a larger installation script); this was not previously easy to
do as this would cause the output to lose its colored formatting.

This option cannot be provided at the same time as the existing
`--no-color` option, as there's no logical interpretation of what effect
providing both of these should have.

As part of this change I've refactored some existing code determining
whether output should be colored to where options are parsed, as this
made this change simpler and I think it makes sense for all this logic
to be performed in the same place.
This commit is contained in:
Bob Whitelock 2020-08-23 00:02:26 +01:00
parent 1d4f4348bb
commit 2432a2ba87
2 changed files with 15 additions and 7 deletions

View File

@ -1,4 +1,5 @@
import os, glob import os, glob
import sys
from argparse import ArgumentParser from argparse import ArgumentParser
from .config import ConfigReader, ReadingError from .config import ConfigReader, ReadingError
@ -32,6 +33,8 @@ def add_options(parser):
help='only run specified directives', metavar='DIRECTIVE') help='only run specified directives', metavar='DIRECTIVE')
parser.add_argument('--except', nargs='+', dest='skip', parser.add_argument('--except', nargs='+', dest='skip',
help='skip specified directives', metavar='DIRECTIVE') help='skip specified directives', metavar='DIRECTIVE')
parser.add_argument('--force-color', dest='force_color', action='store_true',
help='force color output')
parser.add_argument('--no-color', dest='no_color', action='store_true', parser.add_argument('--no-color', dest='no_color', action='store_true',
help='disable color output') help='disable color output')
parser.add_argument('--version', action='store_true', parser.add_argument('--version', action='store_true',
@ -56,8 +59,17 @@ def main():
log.set_level(Level.INFO) log.set_level(Level.INFO)
if options.verbose: if options.verbose:
log.set_level(Level.DEBUG) log.set_level(Level.DEBUG)
if options.no_color:
if options.force_color and options.no_color:
log.error("`--force-color` and `--no-color` cannot both be provided")
exit(1)
elif options.force_color:
log.use_color(True)
elif options.no_color:
log.use_color(False) log.use_color(False)
else:
log.use_color(sys.stdout.isatty())
plugin_directories = list(options.plugin_dirs) plugin_directories = list(options.plugin_dirs)
if not options.disable_built_in_plugins: if not options.disable_built_in_plugins:
from .plugins import Clean, Create, Link, Shell from .plugins import Clean, Create, Link, Shell

View File

@ -1,4 +1,3 @@
import sys
from ..util.singleton import Singleton from ..util.singleton import Singleton
from ..util.compat import with_metaclass from ..util.compat import with_metaclass
from .color import Color from .color import Color
@ -34,14 +33,11 @@ class Messenger(with_metaclass(Singleton, object)):
def error(self, message): def error(self, message):
self.log(Level.ERROR, message) self.log(Level.ERROR, message)
def _should_use_color(self):
return self._use_color and sys.stdout.isatty()
def _color(self, level): def _color(self, level):
''' '''
Get a color (terminal escape sequence) according to a level. Get a color (terminal escape sequence) according to a level.
''' '''
if not self._should_use_color(): if not self._use_color:
return '' return ''
elif level < Level.DEBUG: elif level < Level.DEBUG:
return '' return ''
@ -60,7 +56,7 @@ class Messenger(with_metaclass(Singleton, object)):
''' '''
Get a reset color (terminal escape sequence). Get a reset color (terminal escape sequence).
''' '''
if not self._should_use_color(): if not self._use_color:
return '' return ''
else: else:
return Color.RESET return Color.RESET