From: Stefan Beller <sbeller@google.com>
To: git@vger.kernel.org
Cc: Stefan Beller <sbeller@google.com>
Subject: [PATCH 2/4] builtin/blame: dim uninteresting metadata
Date: Thu, 9 Nov 2017 17:10:00 -0800 [thread overview]
Message-ID: <20171110011002.10179-3-sbeller@google.com> (raw)
In-Reply-To: <20171110011002.10179-1-sbeller@google.com>
When using git-blame lots of lines contain redundant information, for
example in hunks that consist of multiple lines, the metadata (commit
name, author, date) are repeated. A reader may not be interested in those,
so offer an option to color the information that is repeated from the
previous line differently.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
Documentation/config.txt | 5 ++++
builtin/blame.c | 68 ++++++++++++++++++++++++++++++++++++++----------
color.h | 1 +
t/t8012-blame-colors.sh | 18 +++++++++++++
4 files changed, 78 insertions(+), 14 deletions(-)
create mode 100755 t/t8012-blame-colors.sh
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 5f0d62753d..85dfdc6a9b 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1189,6 +1189,11 @@ color.status.<slot>::
status short-format), or
`unmerged` (files which have unmerged changes).
+color.blame.repeatedMeta::
+ Use the customized color for the part of git-blame output that
+ is repeated meta information per line (such as commit id,
+ author name, date and timezone). Defaults to dark gray.
+
color.ui::
This variable determines the default value for variables such
as `color.diff` and `color.grep` that control the use of color
diff --git a/builtin/blame.c b/builtin/blame.c
index 67adaef4d8..d15e901357 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -7,6 +7,7 @@
#include "cache.h"
#include "config.h"
+#include "color.h"
#include "builtin.h"
#include "commit.h"
#include "diff.h"
@@ -46,6 +47,7 @@ static int xdl_opts;
static int abbrev = -1;
static int no_whole_file_rename;
static int show_progress;
+static char *repeated_meta_color;
static struct date_mode blame_date_mode = { DATE_ISO8601 };
static size_t blame_date_width;
@@ -316,10 +318,11 @@ static const char *format_time(timestamp_t time, const char *tz_str,
#define OUTPUT_PORCELAIN 010
#define OUTPUT_SHOW_NAME 020
#define OUTPUT_SHOW_NUMBER 040
-#define OUTPUT_SHOW_SCORE 0100
-#define OUTPUT_NO_AUTHOR 0200
+#define OUTPUT_SHOW_SCORE 0100
+#define OUTPUT_NO_AUTHOR 0200
#define OUTPUT_SHOW_EMAIL 0400
-#define OUTPUT_LINE_PORCELAIN 01000
+#define OUTPUT_LINE_PORCELAIN 01000
+#define OUTPUT_COLOR_LINE 02000
static void emit_porcelain_details(struct blame_origin *suspect, int repeat)
{
@@ -367,6 +370,28 @@ static void emit_porcelain(struct blame_scoreboard *sb, struct blame_entry *ent,
putchar('\n');
}
+static inline void colors_unset(const char **use_color, const char **reset_color)
+{
+ *use_color = "";
+ *reset_color = "";
+}
+
+static inline void colors_set(const char **use_color, const char **reset_color)
+{
+ *use_color = repeated_meta_color;
+ *reset_color = GIT_COLOR_RESET;
+}
+
+static void setup_line_color(int opt, int cnt,
+ const char **use_color,
+ const char **reset_color)
+{
+ colors_unset(use_color, reset_color);
+
+ if ((opt & OUTPUT_COLOR_LINE) && cnt > 0)
+ colors_set(use_color, reset_color);
+}
+
static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int opt)
{
int cnt;
@@ -383,6 +408,7 @@ static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int
for (cnt = 0; cnt < ent->num_lines; cnt++) {
char ch;
int length = (opt & OUTPUT_LONG_OBJECT_NAME) ? GIT_SHA1_HEXSZ : abbrev;
+ const char *col, *rcol;
if (suspect->commit->object.flags & UNINTERESTING) {
if (blank_boundary)
@@ -393,7 +419,8 @@ static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int
}
}
- printf("%.*s", length, hex);
+ setup_line_color(opt, cnt, &col, &rcol);
+ printf("%s%.*s%s", col, length, hex, rcol);
if (opt & OUTPUT_ANNOTATE_COMPAT) {
const char *name;
if (opt & OUTPUT_SHOW_EMAIL)
@@ -406,16 +433,17 @@ static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int
ent->lno + 1 + cnt);
} else {
if (opt & OUTPUT_SHOW_SCORE)
- printf(" %*d %02d",
+ printf(" %s%*d %02d%s", col,
max_score_digits, ent->score,
- ent->suspect->refcnt);
+ ent->suspect->refcnt, rcol);
if (opt & OUTPUT_SHOW_NAME)
- printf(" %-*.*s", longest_file, longest_file,
- suspect->path);
+ printf(" %s%-*.*s%s", col, longest_file,
+ longest_file,
+ suspect->path,
+ rcol);
if (opt & OUTPUT_SHOW_NUMBER)
- printf(" %*d", max_orig_digits,
- ent->s_lno + 1 + cnt);
-
+ printf(" %s%*d%s", col, max_orig_digits,
+ ent->s_lno + 1 + cnt, rcol);
if (!(opt & OUTPUT_NO_AUTHOR)) {
const char *name;
int pad;
@@ -424,11 +452,12 @@ static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int
else
name = ci.author.buf;
pad = longest_author - utf8_strwidth(name);
- printf(" (%s%*s %10s",
+ printf(" %s(%s%*s %10s%s", col,
name, pad, "",
format_time(ci.author_time,
ci.author_tz.buf,
- show_raw_time));
+ show_raw_time),
+ rcol);
}
printf(" %*d) ",
max_digits, ent->lno + 1 + cnt);
@@ -607,6 +636,12 @@ static int git_blame_config(const char *var, const char *value, void *cb)
parse_date_format(value, &blame_date_mode);
return 0;
}
+ if (!strcmp(var, "color.blame.repeatedmeta")) {
+ if (color_parse_mem(value, strlen(value), repeated_meta_color))
+ warning(_("ignore invalid color '%s' in color.blame.repeatedMeta"),
+ value);
+ return 0;
+ }
if (git_diff_heuristic_config(var, value, cb) < 0)
return -1;
@@ -681,6 +716,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
OPT_BIT('s', NULL, &output_option, N_("Suppress author name and timestamp (Default: off)"), OUTPUT_NO_AUTHOR),
OPT_BIT('e', "show-email", &output_option, N_("Show author email instead of name (Default: off)"), OUTPUT_SHOW_EMAIL),
OPT_BIT('w', NULL, &xdl_opts, N_("Ignore whitespace differences"), XDF_IGNORE_WHITESPACE),
+ OPT_BIT(0, "color-lines", &output_option, N_("color redundant metadata from previous line"), OUTPUT_COLOR_LINE),
/*
* The following two options are parsed by parse_revision_opt()
@@ -940,8 +976,12 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
blame_coalesce(&sb);
- if (!(output_option & OUTPUT_PORCELAIN))
+ if (!(output_option & OUTPUT_PORCELAIN)) {
find_alignment(&sb, &output_option);
+ if ((output_option & OUTPUT_COLOR_LINE) &&
+ !repeated_meta_color)
+ repeated_meta_color = GIT_COLOR_DARK;
+ }
output(&sb, output_option);
free((void *)sb.final_buf);
diff --git a/color.h b/color.h
index 6cd632c0d8..fce5588df9 100644
--- a/color.h
+++ b/color.h
@@ -30,6 +30,7 @@ struct strbuf;
#define GIT_COLOR_BLUE "\033[34m"
#define GIT_COLOR_MAGENTA "\033[35m"
#define GIT_COLOR_CYAN "\033[36m"
+#define GIT_COLOR_DARK "\033[1;30m"
#define GIT_COLOR_BOLD_RED "\033[1;31m"
#define GIT_COLOR_BOLD_GREEN "\033[1;32m"
#define GIT_COLOR_BOLD_YELLOW "\033[1;33m"
diff --git a/t/t8012-blame-colors.sh b/t/t8012-blame-colors.sh
new file mode 100755
index 0000000000..b2de03b777
--- /dev/null
+++ b/t/t8012-blame-colors.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+test_description='colored git blame'
+. ./test-lib.sh
+
+PROG='git blame -c'
+. "$TEST_DIRECTORY"/annotate-tests.sh
+
+test_expect_success 'colored blame colors continuous lines' '
+ git blame --abbrev=12 --color-lines hello.c >actual.raw &&
+ test_decode_color <actual.raw >actual &&
+ grep "<BOLD;BLACK>(F" actual > F.expect &&
+ grep "<BOLD;BLACK>(H" actual > H.expect &&
+ test_line_count = 2 F.expect &&
+ test_line_count = 3 H.expect
+'
+
+test_done
--
2.15.0.128.gcadd42da22
next prev parent reply other threads:[~2017-11-10 1:10 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-10 1:09 [RFC PATCH 0/4] blame: (dim rep. metadata lines or fields, decay date coloring) Stefan Beller
2017-11-10 1:09 ` [PATCH 1/4] color.h: modernize header Stefan Beller
2017-11-10 1:10 ` Stefan Beller [this message]
2017-11-10 1:10 ` [PATCH 3/4] builtin/blame: add option to color metadata fields separately Stefan Beller
2017-11-10 1:10 ` [PATCH 4/4] builtin/blame: highlight recently changed lines Stefan Beller
2018-01-04 22:40 ` [PATCHv3 0/4] blame: (dim rep. metadata lines or fields, decay date coloring) Stefan Beller
2018-01-04 22:40 ` [PATCHv3 1/4] color.h: document and modernize header Stefan Beller
2018-01-08 19:14 ` Junio C Hamano
2018-01-04 22:40 ` [PATCHv3 2/4] builtin/blame: dim uninteresting metadata Stefan Beller
2018-01-08 19:34 ` Junio C Hamano
2018-02-08 21:19 ` Stefan Beller
2018-01-04 22:40 ` [PATCHv3 3/4] builtin/blame: add option to color metadata fields separately Stefan Beller
2018-01-04 22:40 ` [PATCHv3 4/4] builtin/blame: highlight recently changed lines Stefan Beller
2018-01-08 19:56 ` Junio C Hamano
2018-01-08 20:09 ` Stefan Beller
2018-02-01 19:29 ` [PATCHv3 0/4] blame: (dim rep. metadata lines or fields, decay date coloring) Ævar Arnfjörð Bjarmason
2018-02-01 20:24 ` Stefan Beller
-- strict thread matches above, loose matches on Subject: below --
2017-12-28 21:03 [PATCHv2 " Stefan Beller
2017-12-28 21:03 ` [PATCH 2/4] builtin/blame: dim uninteresting metadata Stefan Beller
2017-12-28 22:29 ` Eric Sunshine
2018-01-04 22:10 ` Stefan Beller
2018-01-06 8:26 ` Eric Sunshine
2018-01-08 19:38 ` Stefan Beller
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=20171110011002.10179-3-sbeller@google.com \
--to=sbeller@google.com \
--cc=git@vger.kernel.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.