From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Cc: Tian Yuchen <a3205153416@gmail.com>, Scott Baker <scott@perturb.org>
Subject: [PATCH v2 7/8] diff-highlight: allow module callers to pass in color config
Date: Mon, 23 Mar 2026 02:02:15 -0400 [thread overview]
Message-ID: <20260323060215.GG10482@coredump.intra.peff.net> (raw)
In-Reply-To: <20260323060139.GA10215@coredump.intra.peff.net>
From: Scott Baker <scott@perturb.org>
Users of the module may want to pass in their own color config for a few
obvious reasons:
- they are pulling the config from different variables than
diff-highlight itself uses
- they are loading the config in a more efficient way (say, by parsing
git-config --list) and don't want to incur the six (!) git-config
calls that DiffHighlight.pm runs to check all config
Let's allow users of the module to pass in the color config, and
lazy-load it when needed if they haven't.
Signed-off-by: Scott Baker <scott@perturb.org>
Signed-off-by: Jeff King <peff@peff.net>
---
contrib/diff-highlight/DiffHighlight.pm | 41 +++++++++++++++++--------
contrib/diff-highlight/README | 6 ++++
2 files changed, 35 insertions(+), 12 deletions(-)
diff --git a/contrib/diff-highlight/DiffHighlight.pm b/contrib/diff-highlight/DiffHighlight.pm
index a5e5de3b18..96369eadf9 100644
--- a/contrib/diff-highlight/DiffHighlight.pm
+++ b/contrib/diff-highlight/DiffHighlight.pm
@@ -9,18 +9,11 @@ package DiffHighlight;
my $NULL = File::Spec->devnull();
-# Highlight by reversing foreground and background. You could do
-# other things like bold or underline if you prefer.
-my @OLD_HIGHLIGHT = (
- color_config('color.diff-highlight.oldnormal'),
- color_config('color.diff-highlight.oldhighlight', "\x1b[7m"),
- color_config('color.diff-highlight.oldreset', "\x1b[27m")
-);
-my @NEW_HIGHLIGHT = (
- color_config('color.diff-highlight.newnormal', $OLD_HIGHLIGHT[0]),
- color_config('color.diff-highlight.newhighlight', $OLD_HIGHLIGHT[1]),
- color_config('color.diff-highlight.newreset', $OLD_HIGHLIGHT[2])
-);
+# The color theme is initially set to nothing here to allow outside callers
+# to set the colors for their application. If nothing is sent in we use
+# colors from git config in load_color_config().
+our @OLD_HIGHLIGHT = ();
+our @NEW_HIGHLIGHT = ();
my $RESET = "\x1b[m";
my $COLOR = qr/\x1b\[[0-9;]*m/;
@@ -170,6 +163,29 @@ sub show_hunk {
$line_cb->(@queue);
}
+sub load_color_config {
+ # If the colors were NOT set from outside this module we load them on-demand
+ # from the git config. Note that only one of elements 0 and 2 in each
+ # array is used (depending on whether you are doing set/unset on an
+ # attribute, or specifying normal vs highlighted coloring). So we use
+ # element 1 as our check for whether colors were passed in; it should
+ # always be set if you want highlighting to do anything.
+ if (!defined $OLD_HIGHLIGHT[1]) {
+ @OLD_HIGHLIGHT = (
+ color_config('color.diff-highlight.oldnormal'),
+ color_config('color.diff-highlight.oldhighlight', "\x1b[7m"),
+ color_config('color.diff-highlight.oldreset', "\x1b[27m")
+ );
+ }
+ if (!defined $NEW_HIGHLIGHT[1]) {
+ @NEW_HIGHLIGHT = (
+ color_config('color.diff-highlight.newnormal', $OLD_HIGHLIGHT[0]),
+ color_config('color.diff-highlight.newhighlight', $OLD_HIGHLIGHT[1]),
+ color_config('color.diff-highlight.newreset', $OLD_HIGHLIGHT[2])
+ );
+ };
+}
+
sub highlight_pair {
my @a = split_line(shift);
my @b = split_line(shift);
@@ -218,6 +234,7 @@ sub highlight_pair {
}
if (is_pair_interesting(\@a, $pa, $sa, \@b, $pb, $sb)) {
+ load_color_config();
return highlight_line(\@a, $pa, $sa, \@OLD_HIGHLIGHT),
highlight_line(\@b, $pb, $sb, \@NEW_HIGHLIGHT);
}
diff --git a/contrib/diff-highlight/README b/contrib/diff-highlight/README
index 9c89146fb0..ed8d876a18 100644
--- a/contrib/diff-highlight/README
+++ b/contrib/diff-highlight/README
@@ -138,6 +138,12 @@ Your script may set up one or more of the following variables:
processing a logical chunk of input). The default function flushes
stdout.
+ - @DiffHighlight::OLD_HIGHLIGHT and @DiffHighlight::NEW_HIGHLIGHT - these
+ arrays specify the normal, highlighted, and reset colors (in that order)
+ for old/new lines. If unset, values will be retrieved by calling `git
+ config` (see "Color Config" above). Note that these should be the literal
+ color bytes (starting with an ANSI escape code), not color names.
+
The script may then feed lines, one at a time, to DiffHighlight::handle_line().
When lines are done processing, they will be fed to $line_cb. Note that
DiffHighlight may queue up many input lines (to analyze a whole hunk)
--
2.53.0.1051.ga14e96f895
next prev parent reply other threads:[~2026-03-23 6:02 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-20 0:41 [PATCH 0/8] some diff-highlight tweaks Jeff King
2026-03-20 0:42 ` [PATCH 1/8] diff-highlight: mention build instructions Jeff King
2026-03-20 0:42 ` [PATCH 2/8] diff-highlight: drop perl version dependency back to 5.8 Jeff King
2026-03-20 0:43 ` [PATCH 3/8] diff-highlight: check diff-highlight exit status in tests Jeff King
2026-03-20 0:43 ` [PATCH 4/8] t: add matching negative attributes to test_decode_color Jeff King
2026-03-20 0:44 ` [PATCH 5/8] diff-highlight: use test_decode_color in tests Jeff King
2026-03-22 17:24 ` Tian Yuchen
2026-03-22 20:47 ` Jeff King
2026-03-23 5:48 ` Tian Yuchen
2026-03-23 5:53 ` Jeff King
2026-03-20 0:45 ` [PATCH 6/8] diff-highlight: test color config Jeff King
2026-03-20 0:47 ` [PATCH 7/8] diff-highlight: allow module callers to pass in " Jeff King
2026-03-20 0:48 ` [PATCH 8/8] diff-highlight: fetch all config with one process Jeff King
2026-03-22 17:18 ` Tian Yuchen
2026-03-22 20:45 ` Jeff King
2026-03-23 5:39 ` Tian Yuchen
2026-03-23 5:57 ` Jeff King
2026-03-23 6:01 ` [PATCH v2 0/8] some diff-highlight tweaks Jeff King
2026-03-23 6:01 ` [PATCH v2 1/8] diff-highlight: mention build instructions Jeff King
2026-03-23 6:02 ` [PATCH v2 2/8] diff-highlight: drop perl version dependency back to 5.8 Jeff King
2026-03-23 6:02 ` [PATCH v2 3/8] diff-highlight: check diff-highlight exit status in tests Jeff King
2026-03-23 6:02 ` [PATCH v2 4/8] t: add matching negative attributes to test_decode_color Jeff King
2026-03-23 6:02 ` [PATCH v2 5/8] diff-highlight: use test_decode_color in tests Jeff King
2026-03-23 6:02 ` [PATCH v2 6/8] diff-highlight: test color config Jeff King
2026-03-23 6:02 ` Jeff King [this message]
2026-03-23 6:02 ` [PATCH v2 8/8] diff-highlight: fetch all config with one process Jeff King
2026-03-23 16:38 ` [PATCH v2 0/8] some diff-highlight tweaks Junio C Hamano
2026-03-24 6:50 ` Patrick Steinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260323060215.GG10482@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=a3205153416@gmail.com \
--cc=git@vger.kernel.org \
--cc=scott@perturb.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.