##// END OF EJS Templates
fix up a bunch of check-code warnings
fix up a bunch of check-code warnings

File last commit:

r10282:08a0f04b default
r10413:e433002a default
Show More
color.py
368 lines | 13.0 KiB | text/x-python | PythonLexer
Kevin Christen
Add colored output to status and qseries commands
r5787 # color.py color output for the status and qseries commands
#
# Copyright (C) 2007 Kevin Christen <kevin.christen@gmail.com>
#
Kevin Christen
color extension: change from GPL3 to 2
r5792 # This program is free software; you can redistribute it and/or modify it
Kevin Christen
Add colored output to status and qseries commands
r5787 # under the terms of the GNU General Public License as published by the
Kevin Christen
color extension: change from GPL3 to 2
r5792 # Free Software Foundation; either version 2 of the License, or (at your
Kevin Christen
Add colored output to status and qseries commands
r5787 # option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
Kevin Christen
color extension: change from GPL3 to 2
r5792 # with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Kevin Christen
Add colored output to status and qseries commands
r5787
Cédric Duval
extensions: improve the consistency of synopses...
r8894 '''colorize output from some commands
Kevin Christen
Add colored output to status and qseries commands
r5787
Georg Brandl
color: colorize output of hg resolve -l
r10223 This extension modifies the status and resolve commands to add color to their
output to reflect file status, the qseries command to add color to reflect
Martin Geisler
color: word-wrap help texts at 70 characters
r7988 patch status (applied, unapplied, missing), and to diff-related
commands to highlight additions, removals, diff headers, and trailing
whitespace.
Georg Brandl
diff colorization: finish highlighting trailing whitespace
r7457
Martin Geisler
color: word-wrap help texts at 70 characters
r7988 Other effects in addition to color, like bold and underlined text, are
also available. Effects are rendered with the ECMA-48 SGR control
function (aka ANSI escape codes). This module also provides the
render_text function, which can be used to add effects to any text.
Kevin Christen
Add colored output to status and qseries commands
r5787
Martin Geisler
color: use reST syntax for literal block
r9206 Default effects may be overridden from the .hgrc file::
Kevin Christen
Add colored output to status and qseries commands
r5787
Martin Geisler
color: use reST syntax for literal block
r9206 [color]
status.modified = blue bold underline red_background
status.added = green bold
status.removed = red bold blue_background
status.deleted = cyan bold underline
status.unknown = magenta bold underline
status.ignored = black bold
Kevin Christen
Add colored output to status and qseries commands
r5787
Martin Geisler
color: use reST syntax for literal block
r9206 # 'none' turns off all effects
status.clean = none
status.copied = none
Kevin Christen
Add colored output to status and qseries commands
r5787
Martin Geisler
color: use reST syntax for literal block
r9206 qseries.applied = blue bold underline
qseries.unapplied = black bold
qseries.missing = red bold
Brodie Rao
color: diff colorization...
r7456
Martin Geisler
color: use reST syntax for literal block
r9206 diff.diffline = bold
diff.extended = cyan bold
diff.file_a = red bold
diff.file_b = green bold
diff.hunk = magenta
diff.deleted = red
diff.inserted = green
diff.changed = white
diff.trailingwhitespace = bold red_background
David Soria Parra
color: Add support for bookmarks
r10046
Georg Brandl
color: colorize output of hg resolve -l
r10223 resolve.unresolved = red bold
resolve.resolved = green bold
David Soria Parra
color: Add support for bookmarks
r10046 bookmarks.current = green
Kevin Christen
Add colored output to status and qseries commands
r5787 '''
Martin Geisler
color: replace re.split with ui.configlist
r8623 import os, sys
Kevin Christen
Add colored output to status and qseries commands
r5787
Brodie Rao
color: wrap qdiff/qseries after all extensions are loaded
r8963 from mercurial import cmdutil, commands, extensions, error
Kevin Christen
Add colored output to status and qseries commands
r5787 from mercurial.i18n import _
# start and stop parameters for effects
Brodie Rao
color: replace effect-specific reset control codes with general purpose one
r7459 _effect_params = {'none': 0,
'black': 30,
'red': 31,
'green': 32,
'yellow': 33,
'blue': 34,
'magenta': 35,
'cyan': 36,
'white': 37,
'bold': 1,
'italic': 3,
'underline': 4,
'inverse': 7,
'black_background': 40,
'red_background': 41,
'green_background': 42,
'yellow_background': 43,
'blue_background': 44,
'purple_background': 45,
'cyan_background': 46,
'white_background': 47}
Kevin Christen
Add colored output to status and qseries commands
r5787
Martin Geisler
color: use lists instead of tuples for effects
r8622 def render_effects(text, effects):
Kevin Christen
Add colored output to status and qseries commands
r5787 'Wrap text in commands to turn on each effect.'
Martin Geisler
color: use lists instead of tuples for effects
r8622 start = [str(_effect_params[e]) for e in ['none'] + effects]
Kevin Christen
Add colored output to status and qseries commands
r5787 start = '\033[' + ';'.join(start) + 'm'
Brodie Rao
color: replace effect-specific reset control codes with general purpose one
r7459 stop = '\033[' + str(_effect_params['none']) + 'm'
return ''.join([start, text, stop])
Kevin Christen
Add colored output to status and qseries commands
r5787
Georg Brandl
color: colorize output of hg resolve -l
r10223 def _colorstatuslike(abbreviations, effectdefs, orig, ui, repo, *pats, **opts):
'''run a status-like command with colorized output'''
delimiter = opts.get('print0') and '\0' or '\n'
Kevin Christen
Add colored output to status and qseries commands
r5787
Brendan Cully
color: don't run status twice for -n...
r7419 nostatus = opts.get('no_status')
opts['no_status'] = False
Georg Brandl
color: colorize output of hg resolve -l
r10223 # run original command and capture its output
Kevin Christen
Add colored output to status and qseries commands
r5787 ui.pushbuffer()
Matt Mackall
extensions: use new wrapper functions
r7216 retval = orig(ui, repo, *pats, **opts)
Kevin Christen
Add colored output to status and qseries commands
r5787 # filter out empty strings
Benoit Boissinot
color: improve coding style
r10222 lines_with_status = [line for line in ui.popbuffer().split(delimiter) if line]
Kevin Christen
Add colored output to status and qseries commands
r5787
Brendan Cully
color: don't run status twice for -n...
r7419 if nostatus:
lines = [l[2:] for l in lines_with_status]
Kevin Christen
Add colored output to status and qseries commands
r5787 else:
Brendan Cully
color: don't run status twice for -n...
r7419 lines = lines_with_status
Kevin Christen
Add colored output to status and qseries commands
r5787
# apply color to output and display it
Martin Geisler
replace xrange(0, n) with xrange(n)
r8624 for i in xrange(len(lines)):
Georg Brandl
color: colorize output of hg resolve -l
r10223 status = abbreviations[lines_with_status[i][0]]
effects = effectdefs[status]
Kevin Christen
Add colored output to status and qseries commands
r5787 if effects:
Martin Geisler
color: use lists instead of tuples for effects
r8622 lines[i] = render_effects(lines[i], effects)
Brodie Rao
color: add --color switch...
r7455 ui.write(lines[i] + delimiter)
Kevin Christen
Add colored output to status and qseries commands
r5787 return retval
Georg Brandl
color: colorize output of hg resolve -l
r10223
Kevin Christen
Add colored output to status and qseries commands
r5787 _status_abbreviations = { 'M': 'modified',
'A': 'added',
'R': 'removed',
Thomas Arendsen Hein
Fix status char in color extension for deleted (missing) files.
r5796 '!': 'deleted',
Kevin Christen
Add colored output to status and qseries commands
r5787 '?': 'unknown',
'I': 'ignored',
'C': 'clean',
' ': 'copied', }
Martin Geisler
color: use lists instead of tuples for effects
r8622 _status_effects = { 'modified': ['blue', 'bold'],
'added': ['green', 'bold'],
'removed': ['red', 'bold'],
'deleted': ['cyan', 'bold', 'underline'],
'unknown': ['magenta', 'bold', 'underline'],
'ignored': ['black', 'bold'],
'clean': ['none'],
'copied': ['none'], }
Kevin Christen
Add colored output to status and qseries commands
r5787
Georg Brandl
color: colorize output of hg resolve -l
r10223 def colorstatus(orig, ui, repo, *pats, **opts):
'''run the status command with colored output'''
return _colorstatuslike(_status_abbreviations, _status_effects,
orig, ui, repo, *pats, **opts)
_resolve_abbreviations = { 'U': 'unresolved',
'R': 'resolved', }
_resolve_effects = { 'unresolved': ['red', 'bold'],
'resolved': ['green', 'bold'], }
def colorresolve(orig, ui, repo, *pats, **opts):
'''run the resolve command with colored output'''
if not opts.get('list'):
# only colorize for resolve -l
return orig(ui, repo, *pats, **opts)
return _colorstatuslike(_resolve_abbreviations, _resolve_effects,
orig, ui, repo, *pats, **opts)
David Soria Parra
color: Add support for bookmarks
r10046 _bookmark_effects = { 'current': ['green'] }
def colorbookmarks(orig, ui, repo, *pats, **opts):
def colorize(orig, s):
lines = s.split('\n')
for i, line in enumerate(lines):
if line.startswith(" *"):
lines[i] = render_effects(line, _bookmark_effects['current'])
orig('\n'.join(lines))
oldwrite = extensions.wrapfunction(ui, 'write', colorize)
try:
orig(ui, repo, *pats, **opts)
finally:
ui.write = oldwrite
Matt Mackall
extensions: use new wrapper functions
r7216 def colorqseries(orig, ui, repo, *dummy, **opts):
Kevin Christen
Add colored output to status and qseries commands
r5787 '''run the qseries command with colored output'''
ui.pushbuffer()
Matt Mackall
extensions: use new wrapper functions
r7216 retval = orig(ui, repo, **opts)
Dan Villiom Podlaski Christiansen
color: simplify & improve colorization of qseries...
r9311 patchlines = ui.popbuffer().splitlines()
patchnames = repo.mq.series
Kevin Christen
Apply color to output of qseries --verbose...
r6855
Patrick Mezard
color: no need for itertools, zip() is good enough
r9374 for patch, patchname in zip(patchlines, patchnames):
Kevin Christen
Add colored output to status and qseries commands
r5787 if opts['missing']:
effects = _patch_effects['missing']
Kevin Christen
Apply color to output of qseries --verbose...
r6855 # Determine if patch is applied.
Matt Mackall
many, many trivial check-code fixups
r10282 elif [applied for applied in repo.mq.applied
if patchname == applied.name]:
Kevin Christen
Add colored output to status and qseries commands
r5787 effects = _patch_effects['applied']
else:
effects = _patch_effects['unapplied']
Dan Villiom Podlaski Christiansen
color: don't highlight the summary part of the qseries command
r9017
patch = patch.replace(patchname, render_effects(patchname, effects), 1)
ui.write(patch + '\n')
Kevin Christen
Add colored output to status and qseries commands
r5787 return retval
Martin Geisler
color: use lists instead of tuples for effects
r8622 _patch_effects = { 'applied': ['blue', 'bold', 'underline'],
Kevin Bullock
color: allow multiple args to ui.write()
r9520 'missing': ['red', 'bold'],
'unapplied': ['black', 'bold'], }
Kevin Bullock
color: allow multiple args to ui.write()
r9551 def colorwrap(orig, *args):
Brodie Rao
color: diff colorization...
r7456 '''wrap ui.write for colored diff output'''
Kevin Bullock
color: allow multiple args to ui.write()
r9551 def _colorize(s):
lines = s.split('\n')
for i, line in enumerate(lines):
stripline = line
if line and line[0] in '+-':
# highlight trailing whitespace, but only in changed lines
stripline = line.rstrip()
for prefix, style in _diff_prefixes:
if stripline.startswith(prefix):
lines[i] = render_effects(stripline, _diff_effects[style])
break
if line != stripline:
lines[i] += render_effects(
line[len(stripline):], _diff_effects['trailingwhitespace'])
return '\n'.join(lines)
orig(*[_colorize(s) for s in args])
Brodie Rao
color: diff colorization...
r7456
def colorshowpatch(orig, self, node):
'''wrap cmdutil.changeset_printer.showpatch with colored output'''
oldwrite = extensions.wrapfunction(self.ui, 'write', colorwrap)
try:
orig(self, node)
finally:
self.ui.write = oldwrite
Brodie Rao
color: colorize diff --stat
r9641 def colordiffstat(orig, s):
lines = s.split('\n')
for i, line in enumerate(lines):
if line and line[-1] in '+-':
name, graph = line.rsplit(' ', 1)
graph = graph.replace('-',
render_effects('-', _diff_effects['deleted']))
graph = graph.replace('+',
render_effects('+', _diff_effects['inserted']))
lines[i] = ' '.join([name, graph])
orig('\n'.join(lines))
Brodie Rao
color: diff colorization...
r7456 def colordiff(orig, ui, repo, *pats, **opts):
'''run the diff command with colored output'''
Brodie Rao
color: colorize diff --stat
r9641 if opts.get('stat'):
wrapper = colordiffstat
else:
wrapper = colorwrap
oldwrite = extensions.wrapfunction(ui, 'write', wrapper)
Brodie Rao
color: diff colorization...
r7456 try:
orig(ui, repo, *pats, **opts)
finally:
ui.write = oldwrite
Alexander Solovyov
color: add support for churn --diffstat
r10004 def colorchurn(orig, ui, repo, *pats, **opts):
'''run the churn command with colored output'''
if not opts.get('diffstat'):
return orig(ui, repo, *pats, **opts)
oldwrite = extensions.wrapfunction(ui, 'write', colordiffstat)
try:
orig(ui, repo, *pats, **opts)
finally:
ui.write = oldwrite
Brodie Rao
color: diff colorization...
r7456 _diff_prefixes = [('diff', 'diffline'),
('copy', 'extended'),
('rename', 'extended'),
Gilles Moris
color: fix colorization of the 'old mode' git diff metadata
r7539 ('old', 'extended'),
Brodie Rao
color: diff colorization...
r7456 ('new', 'extended'),
('deleted', 'extended'),
('---', 'file_a'),
('+++', 'file_b'),
('@', 'hunk'),
('-', 'deleted'),
('+', 'inserted')]
Martin Geisler
color: cleanup extra commas
r8630 _diff_effects = {'diffline': ['bold'],
Martin Geisler
color: use lists instead of tuples for effects
r8622 'extended': ['cyan', 'bold'],
'file_a': ['red', 'bold'],
'file_b': ['green', 'bold'],
Martin Geisler
color: cleanup extra commas
r8630 'hunk': ['magenta'],
'deleted': ['red'],
'inserted': ['green'],
'changed': ['white'],
'trailingwhitespace': ['bold', 'red_background']}
Brodie Rao
color: diff colorization...
r7456
Martin Geisler
color: wrap qrecord...
r9711 def extsetup(ui):
Kevin Christen
Add colored output to status and qseries commands
r5787 '''Initialize the extension.'''
Brodie Rao
color: diff colorization...
r7456 _setupcmd(ui, 'diff', commands.table, colordiff, _diff_effects)
_setupcmd(ui, 'incoming', commands.table, None, _diff_effects)
_setupcmd(ui, 'log', commands.table, None, _diff_effects)
_setupcmd(ui, 'outgoing', commands.table, None, _diff_effects)
_setupcmd(ui, 'tip', commands.table, None, _diff_effects)
Matt Mackall
extensions: use new wrapper functions
r7216 _setupcmd(ui, 'status', commands.table, colorstatus, _status_effects)
Georg Brandl
color: colorize output of hg resolve -l
r10223 _setupcmd(ui, 'resolve', commands.table, colorresolve, _resolve_effects)
Brodie Rao
color: wrap qdiff/qseries after all extensions are loaded
r8963
Martin Geisler
color: look for mq with extensions.find
r8278 try:
mq = extensions.find('mq')
Martin Geisler
color: do all setup in uisetup...
r9412 _setupcmd(ui, 'qdiff', mq.cmdtable, colordiff, _diff_effects)
_setupcmd(ui, 'qseries', mq.cmdtable, colorqseries, _patch_effects)
Martin Geisler
color: look for mq with extensions.find
r8278 except KeyError:
Martin Geisler
color: wrap qrecord...
r9711 mq = None
Kevin Christen
Add colored output to status and qseries commands
r5787
TK Soh
color: add support for record extension
r9550 try:
rec = extensions.find('record')
_setupcmd(ui, 'record', rec.cmdtable, colordiff, _diff_effects)
except KeyError:
Martin Geisler
color: wrap qrecord...
r9711 rec = None
if mq and rec:
_setupcmd(ui, 'qrecord', rec.cmdtable, colordiff, _diff_effects)
Alexander Solovyov
color: add support for churn --diffstat
r10004 try:
churn = extensions.find('churn')
_setupcmd(ui, 'churn', churn.cmdtable, colorchurn, _diff_effects)
except KeyError:
churn = None
TK Soh
color: add support for record extension
r9550
David Soria Parra
color: Add support for bookmarks
r10046 try:
bookmarks = extensions.find('bookmarks')
_setupcmd(ui, 'bookmarks', bookmarks.cmdtable, colorbookmarks,
_bookmark_effects)
except KeyError:
# The bookmarks extension is not enabled
pass
Matt Mackall
extensions: use new wrapper functions
r7216 def _setupcmd(ui, cmd, table, func, effectsmap):
'''patch in command to command table and load effect map'''
Brodie Rao
color: add --color switch...
r7455 def nocolor(orig, *args, **opts):
if (opts['no_color'] or opts['color'] == 'never' or
(opts['color'] == 'auto' and (os.environ.get('TERM') == 'dumb'
or not sys.__stdout__.isatty()))):
David Soria Parra
color: Do not pass --color, --no-color parameters to wrapped function...
r10045 del opts['no_color']
del opts['color']
Brodie Rao
color: add --color switch...
r7455 return orig(*args, **opts)
Brodie Rao
color: diff colorization...
r7456 oldshowpatch = extensions.wrapfunction(cmdutil.changeset_printer,
'showpatch', colorshowpatch)
David Soria Parra
color: Do not pass --color, --no-color parameters to wrapped function...
r10045 del opts['no_color']
del opts['color']
Brodie Rao
color: diff colorization...
r7456 try:
if func is not None:
return func(orig, *args, **opts)
return orig(*args, **opts)
finally:
cmdutil.changeset_printer.showpatch = oldshowpatch
Kevin Christen
Add colored output to status and qseries commands
r5787
Matt Mackall
extensions: use new wrapper functions
r7216 entry = extensions.wrapcommand(table, cmd, nocolor)
Brodie Rao
color: add --color switch...
r7455 entry[1].extend([
('', 'color', 'auto', _("when to colorize (always, auto, or never)")),
Brodie Rao
color: mark --no-color as deprecated (--color=never has the same effect)...
r9478 ('', 'no-color', None, _("don't colorize output (DEPRECATED)")),
Brodie Rao
color: add --color switch...
r7455 ])
Kevin Christen
Add colored output to status and qseries commands
r5787
for status in effectsmap:
Greg Ward
color: don't blow up if configured with unknown color (just warn).
r8945 configkey = cmd + '.' + status
effects = ui.configlist('color', configkey)
Kevin Christen
Add colored output to status and qseries commands
r5787 if effects:
Greg Ward
color: don't blow up if configured with unknown color (just warn).
r8945 good = []
for e in effects:
if e in _effect_params:
good.append(e)
else:
ui.warn(_("ignoring unknown color/effect %r "
"(configured in color.%s)\n")
% (e, configkey))
effectsmap[status] = good