Skip to content

Commit 0114384

Browse files
peffgitster
authored andcommitted
add--interactive: allow custom diff highlighting programs
The patch hunk selector of add--interactive knows how ask git for colorized diffs, and correlate them with the uncolored diffs we apply. But there's not any way for somebody who uses a diff-filter tool like contrib's diff-highlight to see their normal highlighting. This patch lets users define an arbitrary shell command to pipe the colorized diff through. The exact output shouldn't matter (since we just show the result to humans) as long as it is line-compatible with the original diff (so that hunk-splitting can split the colorized version, too). I left two minor issues with the new system that I don't think are worth fixing right now, but could be done later: 1. We only filter colorized diffs. Theoretically a user could want to filter a non-colorized diff, but I find it unlikely in practice. Users who are doing things like diff-highlighting are likely to want color, too. 2. add--interactive will re-colorize a diff which has been hand-edited, but it won't have run through the filter. Fixing this is conceptually easy (just pipe the diff through the filter), but practically hard to do without using tempfiles (it would need to feed data to and read the result from the filter without deadlocking; this raises portability questions with respect to Windows). I've punted on both issues for now, and if somebody really cares later, they can do a patch on top. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent f02fbc4 commit 0114384

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

Documentation/config.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1886,6 +1886,14 @@ interactive.singleKey::
18861886
setting is silently ignored if portable keystroke input
18871887
is not available; requires the Perl module Term::ReadKey.
18881888

1889+
interactive.diffFilter::
1890+
When an interactive command (such as `git add --patch`) shows
1891+
a colorized diff, git will pipe the diff through the shell
1892+
command defined by this configuration variable. The command may
1893+
mark up the diff further for human consumption, provided that it
1894+
retains a one-to-one correspondence with the lines in the
1895+
original diff. Defaults to disabled (no filtering).
1896+
18891897
log.abbrevCommit::
18901898
If true, makes linkgit:git-log[1], linkgit:git-show[1], and
18911899
linkgit:git-whatchanged[1] assume `--abbrev-commit`. You may

git-add--interactive.perl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
my $normal_color = $repo->get_color("", "reset");
4646

4747
my $diff_algorithm = $repo->config('diff.algorithm');
48+
my $diff_filter = $repo->config('interactive.difffilter');
4849

4950
my $use_readkey = 0;
5051
my $use_termcap = 0;
@@ -754,7 +755,14 @@ sub parse_diff {
754755
my @diff = run_cmd_pipe("git", @diff_cmd, "--", $path);
755756
my @colored = ();
756757
if ($diff_use_color) {
757-
@colored = run_cmd_pipe("git", @diff_cmd, qw(--color --), $path);
758+
my @display_cmd = ("git", @diff_cmd, qw(--color --), $path);
759+
if (defined $diff_filter) {
760+
# quotemeta is overkill, but sufficient for shell-quoting
761+
my $diff = join(' ', map { quotemeta } @display_cmd);
762+
@display_cmd = ("$diff | $diff_filter");
763+
}
764+
765+
@colored = run_cmd_pipe(@display_cmd);
758766
}
759767
my (@hunk) = { TEXT => [], DISPLAY => [], TYPE => 'header' };
760768

@@ -765,7 +773,7 @@ sub parse_diff {
765773
}
766774
push @{$hunk[-1]{TEXT}}, $diff[$i];
767775
push @{$hunk[-1]{DISPLAY}},
768-
($diff_use_color ? $colored[$i] : $diff[$i]);
776+
(@colored ? $colored[$i] : $diff[$i]);
769777
}
770778
return @hunk;
771779
}

0 commit comments

Comments
 (0)