Added function "colored()" that prints text with a color that is passed in. Converted many calls to "print" to being calls to "print colored()". The prompt, the header, and the help output are the 3 types of colorized output, and each has its own color. Colorization is done through Term::ANSIColor, which is included with modern versions of perl. This is optional, and should not need to be present if color.interactive is not turned on. Signed-off-by: Dan Zwell <dzwell@xxxxxxxxx> --- Documentation/config.txt | 6 ++++ git-add--interactive.perl | 66 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 8d5d200..3712d6a 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -382,6 +382,12 @@ color.diff.<slot>:: whitespace). The values of these variables may be specified as in color.branch.<slot>. +color.interactive:: + When true (or `always`), always use colors in `git add + --interactive`. When false (or `never`), never. When set to + `auto`, use colors only when the output is to the + terminal. Defaults to false. + color.pager:: A boolean to enable/disable colored output when the pager is in use (default is true). diff --git a/git-add--interactive.perl b/git-add--interactive.perl index ac598f8..2b5559f 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -1,6 +1,58 @@ #!/usr/bin/perl -w use strict; +use Git; + +my ($use_color, $prompt_color, $header_color, $help_color, $normal_color); + +{ + # set color options: + my $repo = Git->repository(); + my $color_config = $repo->config('color.interactive'); + $use_color = 0; + if (!defined $color_config) { + $use_color = 0; + } + elsif ($color_config =~ /true|always/) { + $use_color = 1; + } + elsif ($color_config eq 'auto' && -t STDOUT && + $ENV{'TERM'} ne 'dumb') { + $use_color = 1; + } + + if ($use_color) { + eval { require Term::ANSIColor; }; + if ($@) { + # library did not load. + $use_color = 0; + } + else { # set up colors + # Sane (visible) defaults: + $prompt_color = Term::ANSIColor::color('blue bold'); + $header_color = Term::ANSIColor::color('bold'); + $help_color = Term::ANSIColor::color('red bold'); + $normal_color = Term::ANSIColor::color('reset'); + } + } +} + +sub colored { + my $color = shift; + my $string = join('', @_); + + if ($use_color) { + # Put a color code at the beginning of each line, a reset at the end + # color after newlines that are not at the end of the string + $string =~ s/(\n+)(.)/$1$color$2/g; + # reset before newlines + $string =~ s/(\n+)/$normal_color$1/g; + # codes at beginning and end (if necessary): + $string =~ s/^/$color/; + $string =~ s/$/$normal_color/ unless $string =~ /\n$/; + } + return $string; +} sub run_cmd_pipe { if ($^O eq 'MSWin32') { @@ -175,7 +227,7 @@ sub list_and_choose { if (!$opts->{LIST_FLAT}) { print " "; } - print "$opts->{HEADER}\n"; + print colored($header_color, "$opts->{HEADER}\n"); } for ($i = 0; $i < @stuff; $i++) { my $chosen = $chosen[$i] ? '*' : ' '; @@ -205,7 +257,7 @@ sub list_and_choose { return if ($opts->{LIST_ONLY}); - print $opts->{PROMPT}; + print colored($prompt_color, $opts->{PROMPT}); if ($opts->{SINGLETON}) { print "> "; } @@ -544,7 +596,7 @@ sub coalesce_overlapping_hunks { } sub help_patch_cmd { - print <<\EOF ; + print colored($help_color, <<\EOF ); y - stage this hunk n - do not stage this hunk a - stage this and all the remaining hunks @@ -619,7 +671,7 @@ sub patch_update_cmd { for (@{$hunk[$ix]{TEXT}}) { print; } - print "Stage this hunk [y/n/a/d$other/?]? "; + print colored($prompt_color, "Stage this hunk [y/n/a/d$other/?]? "); my $line = <STDIN>; if ($line) { if ($line =~ /^y/i) { @@ -673,8 +725,8 @@ sub patch_update_cmd { elsif ($other =~ /s/ && $line =~ /^s/) { my @split = split_hunk($hunk[$ix]{TEXT}); if (1 < @split) { - print "Split into ", - scalar(@split), " hunks.\n"; + print colored($header_color, "Split into ", + scalar(@split), " hunks.\n"); } splice(@hunk, $ix, 1, map { +{ TEXT => $_, USE => undef } } @@ -766,7 +818,7 @@ sub quit_cmd { } sub help_cmd { - print <<\EOF ; + print colored($help_color, <<\EOF ); status - show paths with changes update - add working tree state to the staged set of changes revert - revert staged set of changes back to the HEAD version -- 1.5.3.5.565.gf0b83-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html