Merge branch 'jk/ref-filter-colors-fix' into maint

This is the "theoretically more correct" approach of simply
stepping back to the state before plumbing commands started paying
attention to "color.ui" configuration variable.

* jk/ref-filter-colors-fix:
  tag: respect color.ui config
  Revert "color: check color.ui in git_default_config()"
  Revert "t6006: drop "always" color config tests"
  Revert "color: make "always" the same as "auto" in config"
  color: make "always" the same as "auto" in config
  provide --color option for all ref-filter users
  t3205: use --color instead of color.branch=always
  t3203: drop "always" color test
  t6006: drop "always" color config tests
  t7502: use diff.noprefix for --verbose test
  t7508: use test_terminal for color output
  t3701: use test-terminal to collect color output
  t4015: prefer --color to -c color.diff=always
  test-terminal: set TERM=vt100
maint
Junio C Hamano 2017-10-18 14:20:43 +09:00
commit e3e3c6a43e
23 changed files with 103 additions and 71 deletions

View File

@ -57,6 +57,11 @@ OPTIONS
`xx`; for example `%00` interpolates to `\0` (NUL), `xx`; for example `%00` interpolates to `\0` (NUL),
`%09` to `\t` (TAB) and `%0a` to `\n` (LF). `%09` to `\t` (TAB) and `%0a` to `\n` (LF).


--color[=<when>]:
Respect any colors specified in the `--format` option. The
`<when>` field must be one of `always`, `never`, or `auto` (if
`<when>` is absent, behave as if `always` was given).

--shell:: --shell::
--perl:: --perl::
--python:: --python::

View File

@ -115,6 +115,11 @@ options for details.
variable if it exists, or lexicographic order otherwise. See variable if it exists, or lexicographic order otherwise. See
linkgit:git-config[1]. linkgit:git-config[1].


--color[=<when>]:
Respect any colors specified in the `--format` option. The
`<when>` field must be one of `always`, `never`, or `auto` (if
`<when>` is absent, behave as if `always` was given).

-i:: -i::
--ignore-case:: --ignore-case::
Sorting and filtering tags are case insensitive. Sorting and filtering tags are case insensitive.

View File

@ -92,7 +92,7 @@ static int git_branch_config(const char *var, const char *value, void *cb)
return config_error_nonbool(var); return config_error_nonbool(var);
return color_parse(value, branch_colors[slot]); return color_parse(value, branch_colors[slot]);
} }
return git_default_config(var, value, cb); return git_color_default_config(var, value, cb);
} }


static const char *branch_get_color(enum color_branch ix) static const char *branch_get_color(enum color_branch ix)

View File

@ -125,7 +125,8 @@ static int git_clean_config(const char *var, const char *value, void *cb)
return 0; return 0;
} }


return git_default_config(var, value, cb); /* inspect the color.ui config variable and others */
return git_color_default_config(var, value, cb);
} }


static const char *clean_get_color(enum color_clean ix) static const char *clean_get_color(enum color_clean ix)

View File

@ -36,6 +36,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
OPT_GROUP(""), OPT_GROUP(""),
OPT_INTEGER( 0 , "count", &maxcount, N_("show only <n> matched refs")), OPT_INTEGER( 0 , "count", &maxcount, N_("show only <n> matched refs")),
OPT_STRING( 0 , "format", &format.format, N_("format"), N_("format to use for the output")), OPT_STRING( 0 , "format", &format.format, N_("format"), N_("format to use for the output")),
OPT__COLOR(&format.use_color, N_("respect format colors")),
OPT_CALLBACK(0 , "sort", sorting_tail, N_("key"), OPT_CALLBACK(0 , "sort", sorting_tail, N_("key"),
N_("field name to sort on"), &parse_opt_ref_sorting), N_("field name to sort on"), &parse_opt_ref_sorting),
OPT_CALLBACK(0, "points-at", &filter.points_at, OPT_CALLBACK(0, "points-at", &filter.points_at,

View File

@ -284,7 +284,7 @@ static int wait_all(void)
static int grep_cmd_config(const char *var, const char *value, void *cb) static int grep_cmd_config(const char *var, const char *value, void *cb)
{ {
int st = grep_config(var, value, cb); int st = grep_config(var, value, cb);
if (git_default_config(var, value, cb) < 0) if (git_color_default_config(var, value, cb) < 0)
st = -1; st = -1;


if (!strcmp(var, "grep.threads")) { if (!strcmp(var, "grep.threads")) {

View File

@ -554,7 +554,7 @@ static int git_show_branch_config(const char *var, const char *value, void *cb)
return 0; return 0;
} }


return git_default_config(var, value, cb); return git_color_default_config(var, value, cb);
} }


static int omit_in_dense(struct commit *commit, struct commit **rev, int n) static int omit_in_dense(struct commit *commit, struct commit **rev, int n)

View File

@ -158,7 +158,7 @@ static int git_tag_config(const char *var, const char *value, void *cb)


if (starts_with(var, "column.")) if (starts_with(var, "column."))
return git_column_config(var, value, "tag", &colopts); return git_column_config(var, value, "tag", &colopts);
return git_default_config(var, value, cb); return git_color_default_config(var, value, cb);
} }


static void write_tag_body(int fd, const struct object_id *oid) static void write_tag_body(int fd, const struct object_id *oid)
@ -411,6 +411,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
}, },
OPT_STRING( 0 , "format", &format.format, N_("format"), OPT_STRING( 0 , "format", &format.format, N_("format"),
N_("format to use for the output")), N_("format to use for the output")),
OPT__COLOR(&format.use_color, N_("respect format colors")),
OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")), OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
OPT_END() OPT_END()
}; };

View File

@ -361,6 +361,14 @@ int git_color_config(const char *var, const char *value, void *cb)
return 0; return 0;
} }


int git_color_default_config(const char *var, const char *value, void *cb)
{
if (git_color_config(var, value, cb) < 0)
return -1;

return git_default_config(var, value, cb);
}

void color_print_strbuf(FILE *fp, const char *color, const struct strbuf *sb) void color_print_strbuf(FILE *fp, const char *color, const struct strbuf *sb)
{ {
if (*color) if (*color)

View File

@ -16,7 +16,6 @@
#include "string-list.h" #include "string-list.h"
#include "utf8.h" #include "utf8.h"
#include "dir.h" #include "dir.h"
#include "color.h"


struct config_source { struct config_source {
struct config_source *prev; struct config_source *prev;
@ -1351,9 +1350,6 @@ int git_default_config(const char *var, const char *value, void *dummy)
if (starts_with(var, "advice.")) if (starts_with(var, "advice."))
return git_default_advice_config(var, value); return git_default_advice_config(var, value);


if (git_color_config(var, value, dummy) < 0)
return -1;

if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) { if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) {
pager_use_color = git_config_bool(var,value); pager_use_color = git_config_bool(var,value);
return 0; return 0;

3
diff.c
View File

@ -299,6 +299,9 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
return 0; return 0;
} }


if (git_color_config(var, value, cb) < 0)
return -1;

return git_diff_basic_config(var, value, cb); return git_diff_basic_config(var, value, cb);
} }



View File

@ -253,13 +253,7 @@ test_expect_success '%(color) omitted without tty' '
' '


test_expect_success TTY '%(color) present with tty' ' test_expect_success TTY '%(color) present with tty' '
test_terminal env TERM=vt100 git branch $color_args >actual.raw && test_terminal git branch $color_args >actual.raw &&
test_decode_color <actual.raw >actual &&
test_cmp expect.color actual
'

test_expect_success 'color.branch=always overrides auto-color' '
git -c color.branch=always branch $color_args >actual.raw &&
test_decode_color <actual.raw >actual && test_decode_color <actual.raw >actual &&
test_cmp expect.color actual test_cmp expect.color actual
' '

View File

@ -12,7 +12,6 @@ test_expect_success 'set up some sample branches' '
# choose non-default colors to make sure config # choose non-default colors to make sure config
# is taking effect # is taking effect
test_expect_success 'set up some color config' ' test_expect_success 'set up some color config' '
git config color.branch always &&
git config color.branch.local blue && git config color.branch.local blue &&
git config color.branch.remote yellow && git config color.branch.remote yellow &&
git config color.branch.current cyan git config color.branch.current cyan
@ -24,7 +23,7 @@ test_expect_success 'regular output shows colors' '
<BLUE>other<RESET> <BLUE>other<RESET>
<YELLOW>remotes/origin/master<RESET> <YELLOW>remotes/origin/master<RESET>
EOF EOF
git branch -a >actual.raw && git branch --color -a >actual.raw &&
test_decode_color <actual.raw >actual && test_decode_color <actual.raw >actual &&
test_cmp expect actual test_cmp expect actual
' '
@ -36,7 +35,7 @@ test_expect_success 'verbose output shows colors' '
<BLUE>other <RESET> $oid foo <BLUE>other <RESET> $oid foo
<YELLOW>remotes/origin/master<RESET> $oid foo <YELLOW>remotes/origin/master<RESET> $oid foo
EOF EOF
git branch -v -a >actual.raw && git branch --color -v -a >actual.raw &&
test_decode_color <actual.raw >actual && test_decode_color <actual.raw >actual &&
test_cmp expect actual test_cmp expect actual
' '

View File

@ -2,6 +2,7 @@


test_description='add -i basic tests' test_description='add -i basic tests'
. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-terminal.sh


if ! test_have_prereq PERL if ! test_have_prereq PERL
then then
@ -380,14 +381,11 @@ test_expect_success 'patch mode ignores unmerged entries' '
test_cmp expected diff test_cmp expected diff
' '


test_expect_success 'diffs can be colorized' ' test_expect_success TTY 'diffs can be colorized' '
git reset --hard && git reset --hard &&


# force color even though the test script has no terminal
test_config color.ui always &&

echo content >test && echo content >test &&
printf y | git add -p >output 2>&1 && printf y | test_terminal git add -p >output 2>&1 &&


# We do not want to depend on the exact coloring scheme # We do not want to depend on the exact coloring scheme
# git uses for diffs, so just check that we saw some kind of color. # git uses for diffs, so just check that we saw some kind of color.
@ -485,4 +483,14 @@ test_expect_success 'hunk-editing handles custom comment char' '
git diff --exit-code git diff --exit-code
' '


test_expect_success 'add -p works even with color.ui=always' '
git reset --hard &&
echo change >>file &&
test_config color.ui always &&
echo y | git add -p &&
echo file >expect &&
git diff --cached --name-only >actual &&
test_cmp expect actual
'

test_done test_done

View File

@ -821,7 +821,7 @@ test_expect_success 'diff that introduces a line with only tabs' '
echo "test" >x && echo "test" >x &&
git commit -m "initial" x && git commit -m "initial" x &&
echo "{NTN}" | tr "NT" "\n\t" >>x && echo "{NTN}" | tr "NT" "\n\t" >>x &&
git -c color.diff=always diff | test_decode_color >current && git diff --color | test_decode_color >current &&


cat >expected <<-\EOF && cat >expected <<-\EOF &&
<BOLD>diff --git a/x b/x<RESET> <BOLD>diff --git a/x b/x<RESET>
@ -851,7 +851,7 @@ test_expect_success 'diff that introduces and removes ws breakages' '
echo "2. and a new line " echo "2. and a new line "
} >x && } >x &&


git -c color.diff=always diff | git diff --color |
test_decode_color >current && test_decode_color >current &&


cat >expected <<-\EOF && cat >expected <<-\EOF &&
@ -923,15 +923,15 @@ test_expect_success 'ws-error-highlight test setup' '


test_expect_success 'test --ws-error-highlight option' ' test_expect_success 'test --ws-error-highlight option' '


git -c color.diff=always diff --ws-error-highlight=default,old | git diff --color --ws-error-highlight=default,old |
test_decode_color >current && test_decode_color >current &&
test_cmp expect.default-old current && test_cmp expect.default-old current &&


git -c color.diff=always diff --ws-error-highlight=all | git diff --color --ws-error-highlight=all |
test_decode_color >current && test_decode_color >current &&
test_cmp expect.all current && test_cmp expect.all current &&


git -c color.diff=always diff --ws-error-highlight=none | git diff --color --ws-error-highlight=none |
test_decode_color >current && test_decode_color >current &&
test_cmp expect.none current test_cmp expect.none current


@ -939,15 +939,15 @@ test_expect_success 'test --ws-error-highlight option' '


test_expect_success 'test diff.wsErrorHighlight config' ' test_expect_success 'test diff.wsErrorHighlight config' '


git -c color.diff=always -c diff.wsErrorHighlight=default,old diff | git -c diff.wsErrorHighlight=default,old diff --color |
test_decode_color >current && test_decode_color >current &&
test_cmp expect.default-old current && test_cmp expect.default-old current &&


git -c color.diff=always -c diff.wsErrorHighlight=all diff | git -c diff.wsErrorHighlight=all diff --color |
test_decode_color >current && test_decode_color >current &&
test_cmp expect.all current && test_cmp expect.all current &&


git -c color.diff=always -c diff.wsErrorHighlight=none diff | git -c diff.wsErrorHighlight=none diff --color |
test_decode_color >current && test_decode_color >current &&
test_cmp expect.none current test_cmp expect.none current


@ -955,18 +955,18 @@ test_expect_success 'test diff.wsErrorHighlight config' '


test_expect_success 'option overrides diff.wsErrorHighlight' ' test_expect_success 'option overrides diff.wsErrorHighlight' '


git -c color.diff=always -c diff.wsErrorHighlight=none \ git -c diff.wsErrorHighlight=none \
diff --ws-error-highlight=default,old | diff --color --ws-error-highlight=default,old |
test_decode_color >current && test_decode_color >current &&
test_cmp expect.default-old current && test_cmp expect.default-old current &&


git -c color.diff=always -c diff.wsErrorHighlight=default \ git -c diff.wsErrorHighlight=default \
diff --ws-error-highlight=all | diff --color --ws-error-highlight=all |
test_decode_color >current && test_decode_color >current &&
test_cmp expect.all current && test_cmp expect.all current &&


git -c color.diff=always -c diff.wsErrorHighlight=all \ git -c diff.wsErrorHighlight=all \
diff --ws-error-highlight=none | diff --color --ws-error-highlight=none |
test_decode_color >current && test_decode_color >current &&
test_cmp expect.none current test_cmp expect.none current



View File

@ -750,7 +750,7 @@ test_expect_success 'log.decorate config parsing' '
' '


test_expect_success TTY 'log output on a TTY' ' test_expect_success TTY 'log output on a TTY' '
git log --oneline --decorate >expect.short && git log --color --oneline --decorate >expect.short &&


test_terminal git log --oneline >actual && test_terminal git log --oneline >actual &&
test_cmp expect.short actual test_cmp expect.short actual

View File

@ -229,8 +229,7 @@ do
' '


test_expect_success TTY "$desc respects --color=auto (stdout is tty)" ' test_expect_success TTY "$desc respects --color=auto (stdout is tty)" '
test_terminal env TERM=vt100 \ test_terminal git log --format=$color -1 --color=auto >actual &&
git log --format=$color -1 --color=auto >actual &&
has_color actual has_color actual
' '



View File

@ -426,8 +426,7 @@ test_expect_success 'set up color tests' '
' '


test_expect_success TTY '%(color) shows color with a tty' ' test_expect_success TTY '%(color) shows color with a tty' '
test_terminal env TERM=vt100 \ test_terminal git for-each-ref --format="$color_format" >actual.raw &&
git for-each-ref --format="$color_format" >actual.raw &&
test_decode_color <actual.raw >actual && test_decode_color <actual.raw >actual &&
test_cmp expected.color actual test_cmp expected.color actual
' '
@ -437,12 +436,17 @@ test_expect_success '%(color) does not show color without tty' '
test_cmp expected.bare actual test_cmp expected.bare actual
' '


test_expect_success 'color.ui=always can override tty check' ' test_expect_success '--color can override tty check' '
git -c color.ui=always for-each-ref --format="$color_format" >actual.raw && git for-each-ref --color --format="$color_format" >actual.raw &&
test_decode_color <actual.raw >actual && test_decode_color <actual.raw >actual &&
test_cmp expected.color actual test_cmp expected.color actual
' '


test_expect_success 'color.ui=always does not override tty check' '
git -c color.ui=always for-each-ref --format="$color_format" >actual &&
test_cmp expected.bare actual
'

cat >expected <<\EOF cat >expected <<\EOF
heads/master heads/master
tags/master tags/master

View File

@ -1914,7 +1914,13 @@ test_expect_success '%(color) omitted without tty' '
' '


test_expect_success TTY '%(color) present with tty' ' test_expect_success TTY '%(color) present with tty' '
test_terminal env TERM=vt100 git tag $color_args >actual.raw && test_terminal git tag $color_args >actual.raw &&
test_decode_color <actual.raw >actual &&
test_cmp expect.color actual
'

test_expect_success '--color overrides auto-color' '
git tag --color $color_args >actual.raw &&
test_decode_color <actual.raw >actual && test_decode_color <actual.raw >actual &&
test_cmp expect.color actual test_cmp expect.color actual
' '

View File

@ -239,7 +239,7 @@ test_expect_success 'no color when stdout is a regular file' '
test_expect_success TTY 'color when writing to a pager' ' test_expect_success TTY 'color when writing to a pager' '
rm -f paginated.out && rm -f paginated.out &&
test_config color.ui auto && test_config color.ui auto &&
test_terminal env TERM=vt100 git log && test_terminal git log &&
colorful paginated.out colorful paginated.out
' '


@ -247,7 +247,7 @@ test_expect_success TTY 'colors are suppressed by color.pager' '
rm -f paginated.out && rm -f paginated.out &&
test_config color.ui auto && test_config color.ui auto &&
test_config color.pager false && test_config color.pager false &&
test_terminal env TERM=vt100 git log && test_terminal git log &&
! colorful paginated.out ! colorful paginated.out
' '


@ -266,7 +266,7 @@ test_expect_success 'color when writing to a file intended for a pager' '
test_expect_success TTY 'colors are sent to pager for external commands' ' test_expect_success TTY 'colors are sent to pager for external commands' '
test_config alias.externallog "!git log" && test_config alias.externallog "!git log" &&
test_config color.ui auto && test_config color.ui auto &&
test_terminal env TERM=vt100 git -p externallog && test_terminal git -p externallog &&
colorful paginated.out colorful paginated.out
' '



View File

@ -171,9 +171,9 @@ test_expect_success 'verbose' '


test_expect_success 'verbose respects diff config' ' test_expect_success 'verbose respects diff config' '


test_config color.diff always && test_config diff.noprefix true &&
git status -v >actual && git status -v >actual &&
grep "\[1mdiff --git" actual grep "diff --git negative negative" actual
' '


mesg_with_comment_and_newlines=' mesg_with_comment_and_newlines='

View File

@ -6,6 +6,7 @@
test_description='git status' test_description='git status'


. ./test-lib.sh . ./test-lib.sh
. "$TEST_DIRECTORY"/lib-terminal.sh


test_expect_success 'status -h in broken repository' ' test_expect_success 'status -h in broken repository' '
git config --global advice.statusuoption false && git config --global advice.statusuoption false &&
@ -667,7 +668,7 @@ test_expect_success 'setup unique colors' '


' '


test_expect_success 'status with color.ui' ' test_expect_success TTY 'status with color.ui' '
cat >expect <<\EOF && cat >expect <<\EOF &&
On branch <GREEN>master<RESET> On branch <GREEN>master<RESET>
Your branch and '\''upstream'\'' have diverged, Your branch and '\''upstream'\'' have diverged,
@ -694,14 +695,14 @@ Untracked files:
<BLUE>untracked<RESET> <BLUE>untracked<RESET>


EOF EOF
test_config color.ui always && test_config color.ui auto &&
git status | test_decode_color >output && test_terminal git status | test_decode_color >output &&
test_i18ncmp expect output test_i18ncmp expect output
' '


test_expect_success 'status with color.status' ' test_expect_success TTY 'status with color.status' '
test_config color.status always && test_config color.status auto &&
git status | test_decode_color >output && test_terminal git status | test_decode_color >output &&
test_i18ncmp expect output test_i18ncmp expect output
' '


@ -714,19 +715,19 @@ cat >expect <<\EOF
<BLUE>??<RESET> untracked <BLUE>??<RESET> untracked
EOF EOF


test_expect_success 'status -s with color.ui' ' test_expect_success TTY 'status -s with color.ui' '


git config color.ui always && git config color.ui auto &&
git status -s | test_decode_color >output && test_terminal git status -s | test_decode_color >output &&
test_cmp expect output test_cmp expect output


' '


test_expect_success 'status -s with color.status' ' test_expect_success TTY 'status -s with color.status' '


git config --unset color.ui && git config --unset color.ui &&
git config color.status always && git config color.status auto &&
git status -s | test_decode_color >output && test_terminal git status -s | test_decode_color >output &&
test_cmp expect output test_cmp expect output


' '
@ -741,9 +742,9 @@ cat >expect <<\EOF
<BLUE>??<RESET> untracked <BLUE>??<RESET> untracked
EOF EOF


test_expect_success 'status -s -b with color.status' ' test_expect_success TTY 'status -s -b with color.status' '


git status -s -b | test_decode_color >output && test_terminal git status -s -b | test_decode_color >output &&
test_i18ncmp expect output test_i18ncmp expect output


' '
@ -757,20 +758,20 @@ A dir2/added
?? untracked ?? untracked
EOF EOF


test_expect_success 'status --porcelain ignores color.ui' ' test_expect_success TTY 'status --porcelain ignores color.ui' '


git config --unset color.status && git config --unset color.status &&
git config color.ui always && git config color.ui auto &&
git status --porcelain | test_decode_color >output && test_terminal git status --porcelain | test_decode_color >output &&
test_cmp expect output test_cmp expect output


' '


test_expect_success 'status --porcelain ignores color.status' ' test_expect_success TTY 'status --porcelain ignores color.status' '


git config --unset color.ui && git config --unset color.ui &&
git config color.status always && git config color.status auto &&
git status --porcelain | test_decode_color >output && test_terminal git status --porcelain | test_decode_color >output &&
test_cmp expect output test_cmp expect output


' '

View File

@ -80,6 +80,7 @@ sub copy_stdio {
if ($#ARGV < 1) { if ($#ARGV < 1) {
die "usage: test-terminal program args"; die "usage: test-terminal program args";
} }
$ENV{TERM} = 'vt100';
my $master_in = new IO::Pty; my $master_in = new IO::Pty;
my $master_out = new IO::Pty; my $master_out = new IO::Pty;
my $master_err = new IO::Pty; my $master_err = new IO::Pty;