pretty: allow tweaking tabwidth in --expand-tabs

When the local convention of the project is to use tab width that is
not 8, it may make sense to allow "git log --expand-tabs=<n>" to
tweak the output to match it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2016-03-29 16:05:39 -07:00
parent 0893eec85f
commit fe37a9c586
4 changed files with 22 additions and 13 deletions

View File

@ -42,16 +42,19 @@ people using 80-column terminals.
verbatim; this means that invalid sequences in the original
commit may be copied to the output.
--expand-tabs=<n>::
--expand-tabs::
--no-expand-tabs::
Perform a tab expansion (replace each tab with enough spaces
to fill to the next display column that is multiple of 8)
to fill to the next display column that is multiple of '<n>')
in the log message before showing it in the output.
`--expand-tabs` is a short-hand for `--expand-tabs=8`, and
`--no-expand-tabs` is a short-hand for `--expand-tabs=0`,
which disables tab expansion.
+
By default, tabs are expanded in pretty formats that indent the log
message by 4 spaces (i.e. 'medium', which is the default, 'full',
and 'fuller'). `--no-expand-tabs` option can be used to disable
this.
and 'fuller').
ifndef::git-rev-list[]
--notes[=<ref>]::

View File

@ -147,7 +147,7 @@ struct pretty_print_context {
int preserve_subject;
struct date_mode date_mode;
unsigned date_mode_explicit:1;
unsigned expand_tabs_in_log:1;
int expand_tabs_in_log;
int need_8bit_cte;
char *notes_message;
struct reflog_walk_info *reflog_info;

View File

@ -89,11 +89,11 @@ static void setup_commit_formats(void)
{
struct cmt_fmt_map builtin_formats[] = {
{ "raw", CMIT_FMT_RAW, 0, 0 },
{ "medium", CMIT_FMT_MEDIUM, 0, 1 },
{ "medium", CMIT_FMT_MEDIUM, 0, 8 },
{ "short", CMIT_FMT_SHORT, 0, 0 },
{ "email", CMIT_FMT_EMAIL, 0, 0 },
{ "fuller", CMIT_FMT_FULLER, 0, 1 },
{ "full", CMIT_FMT_FULL, 0, 1 },
{ "fuller", CMIT_FMT_FULLER, 0, 8 },
{ "full", CMIT_FMT_FULL, 0, 8 },
{ "oneline", CMIT_FMT_ONELINE, 1, 0 }
};
commit_formats_len = ARRAY_SIZE(builtin_formats);
@ -1645,7 +1645,7 @@ static int pp_utf8_width(const char *start, const char *end)
return width;
}
static void strbuf_add_tabexpand(struct strbuf *sb,
static void strbuf_add_tabexpand(struct strbuf *sb, int tabwidth,
const char *line, int linelen)
{
const char *tab;
@ -1666,7 +1666,7 @@ static void strbuf_add_tabexpand(struct strbuf *sb,
strbuf_add(sb, line, tab - line);
/* .. and the de-tabified tab */
strbuf_addchars(sb, ' ', 8 - (width % 8));
strbuf_addchars(sb, ' ', tabwidth - (width % tabwidth));
/* Skip over the printed part .. */
linelen -= tab + 1 - line;
@ -1692,7 +1692,7 @@ static void pp_handle_indent(struct pretty_print_context *pp,
{
strbuf_addchars(sb, ' ', indent);
if (pp->expand_tabs_in_log)
strbuf_add_tabexpand(sb, line, linelen);
strbuf_add_tabexpand(sb, pp->expand_tabs_in_log, line, linelen);
else
strbuf_add(sb, line, linelen);
}
@ -1723,7 +1723,8 @@ void pp_remainder(struct pretty_print_context *pp,
if (indent)
pp_handle_indent(pp, sb, indent, line, linelen);
else if (pp->expand_tabs_in_log)
strbuf_add_tabexpand(sb, line, linelen);
strbuf_add_tabexpand(sb, pp->expand_tabs_in_log,
line, linelen);
else
strbuf_add(sb, line, linelen);
strbuf_addch(sb, '\n');

View File

@ -1415,7 +1415,7 @@ void init_revisions(struct rev_info *revs, const char *prefix)
revs->expand_tabs_in_log = -1;
revs->commit_format = CMIT_FMT_DEFAULT;
revs->expand_tabs_in_log_default = 1;
revs->expand_tabs_in_log_default = 8;
init_grep_defaults();
grep_init(&revs->grep_filter, prefix);
@ -1918,9 +1918,14 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
revs->pretty_given = 1;
get_commit_format(arg+9, revs);
} else if (!strcmp(arg, "--expand-tabs")) {
revs->expand_tabs_in_log = 1;
revs->expand_tabs_in_log = 8;
} else if (!strcmp(arg, "--no-expand-tabs")) {
revs->expand_tabs_in_log = 0;
} else if (skip_prefix(arg, "--expand-tabs=", &arg)) {
int val;
if (strtol_i(arg, 10, &val) < 0 || val < 0)
die("'%s': not a non-negative integer", arg);
revs->expand_tabs_in_log = val;
} else if (!strcmp(arg, "--show-notes") || !strcmp(arg, "--notes")) {
revs->show_notes = 1;
revs->show_notes_given = 1;