Added and integrated method "color_diff_hunk", which colors lines, and returns them in an array. Coloring bad whitespace is not yet supported. Signed-off-by: Dan Zwell <dzwell@xxxxxxxxx> --- git-add--interactive.perl | 58 ++++++++++++++++++++++++++++++++++++++------ 1 files changed, 50 insertions(+), 8 deletions(-) diff --git a/git-add--interactive.perl b/git-add--interactive.perl index 508531f..d92e8ed 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -3,7 +3,11 @@ use strict; use Git; +# Prompt colors: my ($use_color, $prompt_color, $header_color, $help_color, $normal_color); +# Diff colors: +my ($diff_use_color, $new_color, $old_color, $fraginfo_color, + $metainfo_color, $whitespace_color); my $color_config = qx(git config --get color.interactive); if ($color_config=~/true|always/ || -t STDOUT && $color_config=~/auto/) { eval { require Term::ANSIColor; }; @@ -21,6 +25,24 @@ if ($color_config=~/true|always/ || -t STDOUT && $color_config=~/auto/) { $help_color = Git::color_to_ansi_code( Git::config($repo, "color.interactive.help") || "red bold"); $normal_color = Git::color_to_ansi_code("normal"); + + # Do we also set diff colors? + my $diff_colors = Git::config($repo, "color.diff"); + if ($diff_colors=~/true/ || + -t STDOUT && $diff_colors=~/auto/) { + $diff_use_color = 1; + $new_color = Git::color_to_ansi_code( + Git::config($repo, "color.diff.new") || "green"); + $old_color = Git::color_to_ansi_code( + Git::config($repo, "color.diff.old") || "red"); + $fraginfo_color = Git::color_to_ansi_code( + Git::config($repo, "color.diff.frag") || "cyan"); + $metainfo_color = Git::color_to_ansi_code( + Git::config($repo, "color.diff.meta") || "bold"); + # Not implemented: + #$whitespace_color = Git::color_to_ansi_code( + #Git::config($repo, "color.diff.whitespace") || "normal red"); + } } } @@ -389,6 +411,31 @@ sub parse_diff { return @hunk; } +sub colored_diff_hunk { + my ($text) = @_; + # return the text, so that it can be passed to print() + my @ret; + for (@$text) { + if (!$diff_use_color) { + push @ret, $_; + next; + } + + if (/^\+/) { + push @ret, colored($new_color, $_); + } elsif (/^\-/) { + push @ret, colored($old_color, $_); + } elsif (/^\@/) { + push @ret, colored($fraginfo_color, $_); + } elsif (/^ /) { + push @ret, colored($normal_color, $_); + } else { + push @ret, colored($metainfo_color, $_); + } + } + return @ret; +} + sub hunk_splittable { my ($text) = @_; @@ -611,9 +658,7 @@ sub patch_update_cmd { my ($ix, $num); my $path = $it->{VALUE}; my ($head, @hunk) = parse_diff($path); - for (@{$head->{TEXT}}) { - print; - } + print colored_diff_hunk($head->{TEXT}); $num = scalar @hunk; $ix = 0; @@ -655,9 +700,7 @@ sub patch_update_cmd { if (hunk_splittable($hunk[$ix]{TEXT})) { $other .= '/s'; } - for (@{$hunk[$ix]{TEXT}}) { - print; - } + print colored_diff_hunk($hunk[$ix]{TEXT}); print colored $prompt_color, "Stage this hunk [y/n/a/d$other/?]? "; my $line = <STDIN>; if ($line) { @@ -795,8 +838,7 @@ sub diff_cmd { HEADER => $status_head, }, @mods); return if (!@them); - system(qw(git diff-index -p --cached HEAD --), - map { $_->{VALUE} } @them); + system(qw(git diff -p --cached HEAD --), map { $_->{VALUE} } @them); } sub quit_cmd { -- 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