From afddd62b52567fc1834e658b968f5a62334ea63c Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Sat, 30 May 2009 13:13:26 +0100 Subject: [PATCH] Use the default git colouring scheme rather than specific scripts Organization: Straylight/Edgeware From: Catalin Marinas This patch adds the mechanism to check if the output is tty for the diff and show commands and passes the --color option to git if the color.diff config option is set auto or true. The patch also changes the default pager to 'less -FRSX' from the diffcol.sh script. Signed-off-by: Catalin Marinas --- contrib/diffcol.sh | 51 ---------------------------------------- examples/gitconfig | 4 ++-- setup.py | 3 +-- stgit/commands/common.py | 9 +++++++ stgit/commands/diff.py | 2 ++ stgit/commands/show.py | 1 + stgit/config.py | 13 ++++++---- 7 files changed, 23 insertions(+), 60 deletions(-) delete mode 100755 contrib/diffcol.sh diff --git a/contrib/diffcol.sh b/contrib/diffcol.sh deleted file mode 100755 index eecc87a..0000000 --- a/contrib/diffcol.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash - -# Code copied from Quilt (http://savannah.nongnu.org/projects/quilt) -# -# Copyright 2006 - the Quilt authors -# -# This script is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. - -setup_colors() -{ - local C="diffhdr=1;36:diffhdradd=1;32:diffadd=32:diffhdrmod=1;35:diffmod=35:diffhdrrem=1;31:diffrem=31:diffhunk=36:diffctx=34:diffcctx=33:default=0" - [ -n "$DIFF_COLORS" ] && C="$C:$DIFF_COLORS" - - C=${C//=/=\'$'\e'[} - C=col${C//:/m\'; col}m\' - #coldefault=$(tput op) - eval $C -} - -setup_colors - -gawk '{ - if (/^(Index:|diff --git) /) - print "'$coldiffhdr'" $0 "'$coldefault'" - else if (/^======*$/) - print "'$coldiffhdr'" $0 "'$coldefault'" - else if (/^\+\+\+/) - print "'$coldiffhdradd'" $0 "'$coldefault'" - else if (/^\*\*\*/) - print "'$coldiffhdrmod'" $0 "'$coldefault'" - else if (/^---/) - print "'$coldiffhdrrem'" $0 "'$coldefault'" - else if (/^(\+|new( file)? mode )/) - print "'$coldiffadd'" $0 "'$coldefault'" - else if (/^(-|(deleted file|old) mode )/) - print "'$coldiffrem'" $0 "'$coldefault'" - else if (/^!/) - print "'$coldiffmod'" $0 "'$coldefault'" - else if (/^@@ \-[0-9]+(,[0-9]+)? \+[0-9]+(,[0-9]+)? @@/) - print gensub(/^(@@[^@]*@@)([ \t]*)(.*)/, - "'$coldiffhunk'" "\\1" "'$coldefault'" \ - "\\2" \ - "'$coldiffctx'" "\\3" "'$coldefault'", "") - else if (/^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/) - print "'$coldiffcctx'" $0 "'$coldefault'" - else { - print - } -}' $1 | less -R -S diff --git a/examples/gitconfig b/examples/gitconfig index f6e3a79..e235e14 100644 --- a/examples/gitconfig +++ b/examples/gitconfig @@ -42,8 +42,8 @@ #editor = /usr/bin/vi # this value overrides the default PAGER environment variable - #pager = ~/share/stgit/contrib/diffcol.sh - #pager = filterdiff --annotate | colordiff | less -FRX + #pager = less -FRSX + #pager = filterdiff --annotate | colordiff | less -FRSX # GIT pull and fetch commands (should take the same arguments as # git fetch or git pull). By default: diff --git a/setup.py b/setup.py index fb67958..73ce2e5 100755 --- a/setup.py +++ b/setup.py @@ -58,8 +58,7 @@ def __run_setup(): ('share/stgit/templates', glob.glob('templates/*.tmpl')), ('share/stgit/examples', glob.glob('examples/*.tmpl')), ('share/stgit/examples', ['examples/gitconfig']), - ('share/stgit/contrib', ['contrib/diffcol.sh', - 'contrib/stgbashprompt.sh']), + ('share/stgit/contrib', ['contrib/stgbashprompt.sh']), ('share/stgit/completion', ['stgit-completion.bash']) ]) diff --git a/stgit/commands/common.py b/stgit/commands/common.py index dfd7e26..1bc162f 100644 --- a/stgit/commands/common.py +++ b/stgit/commands/common.py @@ -97,6 +97,15 @@ def git_commit(name, repository, branch_name = None): except libgit.RepositoryException: raise CmdException('%s: Unknown patch or revision name' % name) +def color_diff_flags(): + """Return the git flags for coloured diff output if the configuration and + stdout allows.""" + stdout_is_tty = (sys.stdout.isatty() and 'true') or 'false' + if config.get_colorbool('color.diff', stdout_is_tty) == 'true': + return ['--color'] + else: + return [] + def check_local_changes(): if git.local_changes(): raise CmdException('local changes in the tree. Use "refresh" or' diff --git a/stgit/commands/diff.py b/stgit/commands/diff.py index 568651c..a6cd013 100644 --- a/stgit/commands/diff.py +++ b/stgit/commands/diff.py @@ -68,6 +68,8 @@ def func(parser, options, args): rev1 = 'HEAD' rev2 = None + if not options.stat: + options.diff_flags.extend(color_diff_flags()) diff_str = git.diff(args, git_id(crt_series, rev1), rev2 and git_id(crt_series, rev2), diff_flags = options.diff_flags) diff --git a/stgit/commands/show.py b/stgit/commands/show.py index 895943a..b7a8aa9 100644 --- a/stgit/commands/show.py +++ b/stgit/commands/show.py @@ -61,6 +61,7 @@ def func(parser, options, args): # individual patches or commit ids patches = args + options.diff_flags.extend(color_diff_flags()) commit_ids = [git_id(crt_series, patch) for patch in patches] commit_str = '\n'.join([git.pretty_commit(commit_id, flags = options.diff_flags) diff --git a/stgit/config.py b/stgit/config.py index dc9c9eb..b6d32b5 100644 --- a/stgit/config.py +++ b/stgit/config.py @@ -37,7 +37,8 @@ class GitConfig: 'stgit.autoimerge': 'no', 'stgit.keepoptimized': 'no', 'stgit.extensions': '.ancestor .current .patched', - 'stgit.shortnr': '5' + 'stgit.shortnr': '5', + 'stgit.pager': 'less -FRSX' } __cache = None @@ -109,16 +110,18 @@ class GitConfig: if m: result.append(m.group(1)) return result + + def get_colorbool(self, name, stdout_is_tty): + """Invoke 'git config --get-colorbool' and return the result.""" + return Run('git', 'config', '--get-colorbool', name, + stdout_is_tty).output_one_line() config=GitConfig() def config_setup(): global config - # Set the PAGER environment to the config value (if any) - pager = config.get('stgit.pager') - if pager: - os.environ['PAGER'] = pager + os.environ.setdefault('PAGER', config.get('stgit.pager')) # FIXME: handle EDITOR the same way ? class ConfigOption: -- [mdw]