From 43402040bf711e6266cfe664745099b8d3574255 Mon Sep 17 00:00:00 2001 From: Michael Montalbo Date: Wed, 27 May 2026 14:13:53 -0700 Subject: [PATCH 1/6] t/README: document test_grep helper test_grep is a wrapper around grep for test assertions that prints the file contents on failure for easier debugging. It also accepts '!' as its first argument for negation, which preserves the diagnostic output that '! test_grep' would suppress. Despite being widely used (and the preferred replacement for bare grep in assertions), test_grep has no entry in t/README alongside the other documented helpers like test_cmp and test_line_count. Add one. Signed-off-by: Michael Montalbo --- t/README | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/t/README b/t/README index adbbd9acf4ab27..c12a1c317a1263 100644 --- a/t/README +++ b/t/README @@ -1039,6 +1039,27 @@ see test-lib-functions.sh for the full list and their options. Check whether a file has the length it is expected to. + - test_grep [!] [] + + Check whether contains a line matching , or + with '!' that no line matches. Use this instead of bare + 'grep ' in test assertions. On failure, + test_grep prints the contents of for easier debugging, + whereas a bare 'grep' would fail silently. + + For negation, pass '!' as the first argument: + + test_grep ! "^diff --git" actual + + Do not negate by writing '! test_grep', as that suppresses the + diagnostic output. + + test_grep should only be used as a test assertion. When grep + is used as a data filter (e.g. 'grep -v "^index" actual >filtered') + or inside a command substitution (e.g. '$(grep -c ...)'), plain + 'grep' is the right choice because the exit code is not the + assertion itself. + - test_path_is_file test_path_is_dir test_path_is_missing From a1069efa8fafe17b88f701168e7fe7c4ac663304 Mon Sep 17 00:00:00 2001 From: Michael Montalbo Date: Wed, 3 Jun 2026 01:14:06 -0700 Subject: [PATCH 2/6] t: extract chainlint's parser into shared module Move the Lexer, ShellParser, and ScriptParser packages from chainlint.pl into t/lib-shell-parser.pl so they can be reused by other tools. ScriptParser's check_test() is a no-op in the shared module; callers subclass ScriptParser and override it. chainlint.pl defines TestParser (&&-chain detection) and ChainlintParser (a ScriptParser subclass whose check_test runs TestParser and formats the results). The shared module is loaded via do() for portability with minimal Perl installations. A subsequent commit introduces lint-style.pl which needs the same shell parser to properly tokenize test scripts. Sharing the parser avoids reimplementing heredoc handling, $(...) nesting, pipe tracking, quoting, and test body extraction. Signed-off-by: Michael Montalbo --- t/chainlint.pl | 521 ++---------------------------------------- t/lib-shell-parser.pl | 517 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 530 insertions(+), 508 deletions(-) create mode 100644 t/lib-shell-parser.pl diff --git a/t/chainlint.pl b/t/chainlint.pl index f0598e3934bc46..49b7cc6cb848db 100755 --- a/t/chainlint.pl +++ b/t/chainlint.pl @@ -23,458 +23,10 @@ my $show_stats; my $emit_all; -# Lexer tokenizes POSIX shell scripts. It is roughly modeled after section 2.3 -# "Token Recognition" of POSIX chapter 2 "Shell Command Language". Although -# similar to lexical analyzers for other languages, this one differs in a few -# substantial ways due to quirks of the shell command language. -# -# For instance, in many languages, newline is just whitespace like space or -# TAB, but in shell a newline is a command separator, thus a distinct lexical -# token. A newline is significant and returned as a distinct token even at the -# end of a shell comment. -# -# In other languages, `1+2` would typically be scanned as three tokens -# (`1`, `+`, and `2`), but in shell it is a single token. However, the similar -# `1 + 2`, which embeds whitepace, is scanned as three token in shell, as well. -# In shell, several characters with special meaning lose that meaning when not -# surrounded by whitespace. For instance, the negation operator `!` is special -# when standing alone surrounded by whitespace; whereas in `foo!uucp` it is -# just a plain character in the longer token "foo!uucp". In many other -# languages, `"string"/foo:'string'` might be scanned as five tokens ("string", -# `/`, `foo`, `:`, and 'string'), but in shell, it is just a single token. -# -# The lexical analyzer for the shell command language is also somewhat unusual -# in that it recursively invokes the parser to handle the body of `$(...)` -# expressions which can contain arbitrary shell code. Such expressions may be -# encountered both inside and outside of double-quoted strings. -# -# The lexical analyzer is responsible for consuming shell here-doc bodies which -# extend from the line following a `< $parser, - buff => $s, - lineno => 1, - heretags => [] - } => $class; -} - -sub scan_heredoc_tag { - my $self = shift @_; - ${$self->{buff}} =~ /\G(-?)/gc; - my $indented = $1; - my $token = $self->scan_token(); - return "<<$indented" unless $token; - my $tag = $token->[0]; - $tag =~ s/['"\\]//g; - $$token[0] = $indented ? "\t$tag" : "$tag"; - push(@{$self->{heretags}}, $token); - return "<<$indented$tag"; -} - -sub scan_op { - my ($self, $c) = @_; - my $b = $self->{buff}; - return $c unless $$b =~ /\G(.)/sgc; - my $cc = $c . $1; - return scan_heredoc_tag($self) if $cc eq '<<'; - return $cc if $cc =~ /^(?:&&|\|\||>>|;;|<&|>&|<>|>\|)$/; - pos($$b)--; - return $c; -} - -sub scan_sqstring { - my $self = shift @_; - ${$self->{buff}} =~ /\G([^']*'|.*\z)/sgc; - my $s = $1; - $self->{lineno} += () = $s =~ /\n/sg; - return "'" . $s; -} - -sub scan_dqstring { - my $self = shift @_; - my $b = $self->{buff}; - my $s = '"'; - while (1) { - # slurp up non-special characters - $s .= $1 if $$b =~ /\G([^"\$\\]+)/gc; - # handle special characters - last unless $$b =~ /\G(.)/sgc; - my $c = $1; - $s .= '"', last if $c eq '"'; - $s .= '$' . $self->scan_dollar(), next if $c eq '$'; - if ($c eq '\\') { - $s .= '\\', last unless $$b =~ /\G(.)/sgc; - $c = $1; - $self->{lineno}++, next if $c eq "\n"; # line splice - # backslash escapes only $, `, ", \ in dq-string - $s .= '\\' unless $c =~ /^[\$`"\\]$/; - $s .= $c; - next; - } - die("internal error scanning dq-string '$c'\n"); - } - $self->{lineno} += () = $s =~ /\n/sg; - return $s; -} - -sub scan_balanced { - my ($self, $c1, $c2) = @_; - my $b = $self->{buff}; - my $depth = 1; - my $s = $c1; - while ($$b =~ /\G([^\Q$c1$c2\E]*(?:[\Q$c1$c2\E]|\z))/gc) { - $s .= $1; - $depth++, next if $s =~ /\Q$c1\E$/; - $depth--; - last if $depth == 0; - } - $self->{lineno} += () = $s =~ /\n/sg; - return $s; -} - -sub scan_subst { - my $self = shift @_; - my @tokens = $self->{parser}->parse(qr/^\)$/); - $self->{parser}->next_token(); # closing ")" - return @tokens; -} - -sub scan_dollar { - my $self = shift @_; - my $b = $self->{buff}; - return $self->scan_balanced('(', ')') if $$b =~ /\G\((?=\()/gc; # $((...)) - return '(' . join(' ', map {$_->[0]} $self->scan_subst()) . ')' if $$b =~ /\G\(/gc; # $(...) - return $self->scan_balanced('{', '}') if $$b =~ /\G\{/gc; # ${...} - return $1 if $$b =~ /\G(\w+)/gc; # $var - return $1 if $$b =~ /\G([@*#?$!0-9-])/gc; # $*, $1, $$, etc. - return ''; -} - -sub swallow_heredocs { - my $self = shift @_; - my $b = $self->{buff}; - my $tags = $self->{heretags}; - while (my $tag = shift @$tags) { - my $start = pos($$b); - my $indent = $$tag[0] =~ s/^\t// ? '\\s*' : ''; - $$b =~ /(?:\G|\n)$indent\Q$$tag[0]\E(?:\n|\z)/gc; - if (pos($$b) > $start) { - my $body = substr($$b, $start, pos($$b) - $start); - $self->{parser}->{heredocs}->{$$tag[0]} = { - content => substr($body, 0, length($body) - length($&)), - start_line => $self->{lineno}, - }; - $self->{lineno} += () = $body =~ /\n/sg; - next; - } - push(@{$self->{parser}->{problems}}, ['HEREDOC', $tag]); - $$b =~ /(?:\G|\n).*\z/gc; # consume rest of input - my $body = substr($$b, $start, pos($$b) - $start); - $self->{lineno} += () = $body =~ /\n/sg; - last; - } -} - -sub scan_token { - my $self = shift @_; - my $b = $self->{buff}; - my $token = ''; - my ($start, $startln); -RESTART: - $startln = $self->{lineno}; - $$b =~ /\G[ \t]+/gc; # skip whitespace (but not newline) - $start = pos($$b) || 0; - $self->{lineno}++, return ["\n", $start, pos($$b), $startln, $startln] if $$b =~ /\G#[^\n]*(?:\n|\z)/gc; # comment - while (1) { - # slurp up non-special characters - $token .= $1 if $$b =~ /\G([^\\;&|<>(){}'"\$\s]+)/gc; - # handle special characters - last unless $$b =~ /\G(.)/sgc; - my $c = $1; - pos($$b)--, last if $c =~ /^[ \t]$/; # whitespace ends token - pos($$b)--, last if length($token) && $c =~ /^[;&|<>(){}\n]$/; - $token .= $self->scan_sqstring(), next if $c eq "'"; - $token .= $self->scan_dqstring(), next if $c eq '"'; - $token .= $c . $self->scan_dollar(), next if $c eq '$'; - $self->{lineno}++, $self->swallow_heredocs(), $token = $c, last if $c eq "\n"; - $token = $self->scan_op($c), last if $c =~ /^[;&|<>]$/; - $token = $c, last if $c =~ /^[(){}]$/; - if ($c eq '\\') { - $token .= '\\', last unless $$b =~ /\G(.)/sgc; - $c = $1; - $self->{lineno}++, next if $c eq "\n" && length($token); # line splice - $self->{lineno}++, goto RESTART if $c eq "\n"; # line splice - $token .= '\\' . $c; - next; - } - die("internal error scanning character '$c'\n"); - } - return length($token) ? [$token, $start, pos($$b), $startln, $self->{lineno}] : undef; -} - -# ShellParser parses POSIX shell scripts (with minor extensions for Bash). It -# is a recursive descent parser very roughly modeled after section 2.10 "Shell -# Grammar" of POSIX chapter 2 "Shell Command Language". -package ShellParser; - -sub new { - my ($class, $s) = @_; - my $self = bless { - buff => [], - stop => [], - output => [], - heredocs => {}, - insubshell => 0, - } => $class; - $self->{lexer} = Lexer->new($self, $s); - return $self; -} - -sub next_token { - my $self = shift @_; - return pop(@{$self->{buff}}) if @{$self->{buff}}; - return $self->{lexer}->scan_token(); -} - -sub untoken { - my $self = shift @_; - push(@{$self->{buff}}, @_); -} - -sub peek { - my $self = shift @_; - my $token = $self->next_token(); - return undef unless defined($token); - $self->untoken($token); - return $token; -} - -sub stop_at { - my ($self, $token) = @_; - return 1 unless defined($token); - my $stop = ${$self->{stop}}[-1] if @{$self->{stop}}; - return defined($stop) && $token->[0] =~ $stop; -} - -sub expect { - my ($self, $expect) = @_; - my $token = $self->next_token(); - return $token if defined($token) && $token->[0] eq $expect; - push(@{$self->{output}}, "?!ERR?! expected '$expect' but found '" . (defined($token) ? $token->[0] : "") . "'\n"); - $self->untoken($token) if defined($token); - return (); -} - -sub optional_newlines { - my $self = shift @_; - my @tokens; - while (my $token = $self->peek()) { - last unless $token->[0] eq "\n"; - push(@tokens, $self->next_token()); - } - return @tokens; -} - -sub parse_group { - my $self = shift @_; - return ($self->parse(qr/^}$/), - $self->expect('}')); -} - -sub parse_subshell { - my $self = shift @_; - $self->{insubshell}++; - my @tokens = ($self->parse(qr/^\)$/), - $self->expect(')')); - $self->{insubshell}--; - return @tokens; -} - -sub parse_case_pattern { - my $self = shift @_; - my @tokens; - while (defined(my $token = $self->next_token())) { - push(@tokens, $token); - last if $token->[0] eq ')'; - } - return @tokens; -} - -sub parse_case { - my $self = shift @_; - my @tokens; - push(@tokens, - $self->next_token(), # subject - $self->optional_newlines(), - $self->expect('in'), - $self->optional_newlines()); - while (1) { - my $token = $self->peek(); - last unless defined($token) && $token->[0] ne 'esac'; - push(@tokens, - $self->parse_case_pattern(), - $self->optional_newlines(), - $self->parse(qr/^(?:;;|esac)$/)); # item body - $token = $self->peek(); - last unless defined($token) && $token->[0] ne 'esac'; - push(@tokens, - $self->expect(';;'), - $self->optional_newlines()); - } - push(@tokens, $self->expect('esac')); - return @tokens; -} - -sub parse_for { - my $self = shift @_; - my @tokens; - push(@tokens, - $self->next_token(), # variable - $self->optional_newlines()); - my $token = $self->peek(); - if (defined($token) && $token->[0] eq 'in') { - push(@tokens, - $self->expect('in'), - $self->optional_newlines()); - } - push(@tokens, - $self->parse(qr/^do$/), # items - $self->expect('do'), - $self->optional_newlines(), - $self->parse_loop_body(), - $self->expect('done')); - return @tokens; -} - -sub parse_if { - my $self = shift @_; - my @tokens; - while (1) { - push(@tokens, - $self->parse(qr/^then$/), # if/elif condition - $self->expect('then'), - $self->optional_newlines(), - $self->parse(qr/^(?:elif|else|fi)$/)); # if/elif body - my $token = $self->peek(); - last unless defined($token) && $token->[0] eq 'elif'; - push(@tokens, $self->expect('elif')); - } - my $token = $self->peek(); - if (defined($token) && $token->[0] eq 'else') { - push(@tokens, - $self->expect('else'), - $self->optional_newlines(), - $self->parse(qr/^fi$/)); # else body - } - push(@tokens, $self->expect('fi')); - return @tokens; -} - -sub parse_loop_body { - my $self = shift @_; - return $self->parse(qr/^done$/); -} - -sub parse_loop { - my $self = shift @_; - return ($self->parse(qr/^do$/), # condition - $self->expect('do'), - $self->optional_newlines(), - $self->parse_loop_body(), - $self->expect('done')); -} - -sub parse_func { - my $self = shift @_; - return ($self->expect('('), - $self->expect(')'), - $self->optional_newlines(), - $self->parse_cmd()); # body -} - -sub parse_bash_array_assignment { - my $self = shift @_; - my @tokens = $self->expect('('); - while (defined(my $token = $self->next_token())) { - push(@tokens, $token); - last if $token->[0] eq ')'; - } - return @tokens; -} - -my %compound = ( - '{' => \&parse_group, - '(' => \&parse_subshell, - 'case' => \&parse_case, - 'for' => \&parse_for, - 'if' => \&parse_if, - 'until' => \&parse_loop, - 'while' => \&parse_loop); - -sub parse_cmd { - my $self = shift @_; - my $cmd = $self->next_token(); - return () unless defined($cmd); - return $cmd if $cmd->[0] eq "\n"; - - my $token; - my @tokens = $cmd; - if ($cmd->[0] eq '!') { - push(@tokens, $self->parse_cmd()); - return @tokens; - } elsif (my $f = $compound{$cmd->[0]}) { - push(@tokens, $self->$f()); - } elsif (defined($token = $self->peek()) && $token->[0] eq '(') { - if ($cmd->[0] !~ /\w=$/) { - push(@tokens, $self->parse_func()); - return @tokens; - } - my @array = $self->parse_bash_array_assignment(); - $tokens[-1]->[0] .= join(' ', map {$_->[0]} @array); - $tokens[-1]->[2] = $array[$#array][2] if @array; - } - - while (defined(my $token = $self->next_token())) { - $self->untoken($token), last if $self->stop_at($token); - push(@tokens, $token); - last if $token->[0] =~ /^(?:[;&\n|]|&&|\|\|)$/; - } - push(@tokens, $self->next_token()) if $tokens[-1]->[0] ne "\n" && defined($token = $self->peek()) && $token->[0] eq "\n"; - return @tokens; -} - -sub accumulate { - my ($self, $tokens, $cmd) = @_; - push(@$tokens, @$cmd); -} - -sub parse { - my ($self, $stop) = @_; - push(@{$self->{stop}}, $stop); - goto DONE if $self->stop_at($self->peek()); - my @tokens; - while (my @cmd = $self->parse_cmd()) { - $self->accumulate(\@tokens, \@cmd); - last if $self->stop_at($self->peek()); - } -DONE: - pop(@{$self->{stop}}); - return @tokens; -} +use File::Basename; +my $_lib = dirname($0) . "/lib-shell-parser.pl"; +$_lib = "./$_lib" unless $_lib =~ m{^/}; +do $_lib or die "failed to load $_lib: $@$!\n"; # TestParser is a subclass of ShellParser which, beyond parsing shell script # code, is also imbued with semantic knowledge of test construction, and checks @@ -484,7 +36,7 @@ sub parse { # scripts in which the tests are defined. package TestParser; -use base 'ShellParser'; +our @ISA = ('ShellParser'); sub new { my $class = shift @_; @@ -578,14 +130,12 @@ sub accumulate { $self->SUPER::accumulate($tokens, $cmd); } -# ScriptParser is a subclass of ShellParser which identifies individual test -# definitions within test scripts, and passes each test body through TestParser -# to identify possible problems. ShellParser detects test definitions not only -# at the top-level of test scripts but also within compound commands such as -# loops and function definitions. -package ScriptParser; +# ChainlintParser is a subclass of ScriptParser which checks each test +# body for broken &&-chains via TestParser, then formats and collects +# the results. +package ChainlintParser; -use base 'ShellParser'; +our @ISA = ('ScriptParser'); sub new { my $class = shift @_; @@ -595,35 +145,6 @@ sub new { return $self; } -# extract the raw content of a token, which may be a single string or a -# composition of multiple strings and non-string character runs; for instance, -# `"test body"` unwraps to `test body`; `word"a b"42'c d'` to `worda b42c d` -sub unwrap { - my $token = (@_ ? shift @_ : $_)->[0]; - # simple case: 'sqstring' or "dqstring" - return $token if $token =~ s/^'([^']*)'$/$1/; - return $token if $token =~ s/^"([^"]*)"$/$1/; - - # composite case - my ($s, $q, $escaped); - while (1) { - # slurp up non-special characters - $s .= $1 if $token =~ /\G([^\\'"]*)/gc; - # handle special characters - last unless $token =~ /\G(.)/sgc; - my $c = $1; - $q = undef, next if defined($q) && $c eq $q; - $q = $c, next if !defined($q) && $c =~ /^['"]$/; - if ($c eq '\\') { - last unless $token =~ /\G(.)/sgc; - $c = $1; - $s .= '\\' if $c eq "\n"; # preserve line splice - } - $s .= $c; - } - return $s -} - sub format_problem { local $_ = shift; /^AMP$/ && return "missing '&&'"; @@ -635,10 +156,10 @@ sub format_problem { sub check_test { my $self = shift @_; - my $title = unwrap(shift @_); + my $title = ScriptParser::unwrap(shift @_); my $body = shift @_; my $lineno = $body->[3]; - $body = unwrap($body); + $body = ScriptParser::unwrap($body); if ($body eq '-') { my $herebody = shift @_; $body = $herebody->{content}; @@ -673,22 +194,6 @@ sub check_test { push(@{$self->{output}}, "$c->{blue}# chainlint: $title$c->{reset}\n$checked"); } -sub parse_cmd { - my $self = shift @_; - my @tokens = $self->SUPER::parse_cmd(); - return @tokens unless @tokens && $tokens[0]->[0] =~ /^test_expect_(?:success|failure)$/; - my $n = $#tokens; - $n-- while $n >= 0 && $tokens[$n]->[0] =~ /^(?:[;&\n|]|&&|\|\|)$/; - my $herebody; - if ($n >= 2 && $tokens[$n-1]->[0] eq '-' && $tokens[$n]->[0] =~ /^<<-?(.+)$/) { - $herebody = $self->{heredocs}->{$1}; - $n--; - } - $self->check_test($tokens[1], $tokens[2], $herebody) if $n == 2; # title body - $self->check_test($tokens[2], $tokens[3], $herebody) if $n > 2; # prereq title body - return @tokens; -} - # main contains high-level functionality for processing command-line switches, # feeding input test scripts to ScriptParser, and reporting results. package main; @@ -803,7 +308,7 @@ sub check_script { } my $s = do { local $/; <$fh> }; close($fh); - my $parser = ScriptParser->new(\$s); + my $parser = ChainlintParser->new(\$s); 1 while $parser->parse_cmd(); if (@{$parser->{output}}) { my $c = fd_colors(1); diff --git a/t/lib-shell-parser.pl b/t/lib-shell-parser.pl new file mode 100644 index 00000000000000..1e521a94f81ea2 --- /dev/null +++ b/t/lib-shell-parser.pl @@ -0,0 +1,517 @@ +use strict; +use warnings; + +# Copyright (c) 2021-2022 Eric Sunshine +# +# Lexer tokenizes POSIX shell scripts. It is roughly modeled after section 2.3 +# "Token Recognition" of POSIX chapter 2 "Shell Command Language". Although +# similar to lexical analyzers for other languages, this one differs in a few +# substantial ways due to quirks of the shell command language. +# +# For instance, in many languages, newline is just whitespace like space or +# TAB, but in shell a newline is a command separator, thus a distinct lexical +# token. A newline is significant and returned as a distinct token even at the +# end of a shell comment. +# +# In other languages, `1+2` would typically be scanned as three tokens +# (`1`, `+`, and `2`), but in shell it is a single token. However, the similar +# `1 + 2`, which embeds whitepace, is scanned as three token in shell, as well. +# In shell, several characters with special meaning lose that meaning when not +# surrounded by whitespace. For instance, the negation operator `!` is special +# when standing alone surrounded by whitespace; whereas in `foo!uucp` it is +# just a plain character in the longer token "foo!uucp". In many other +# languages, `"string"/foo:'string'` might be scanned as five tokens ("string", +# `/`, `foo`, `:`, and 'string'), but in shell, it is just a single token. +# +# The lexical analyzer for the shell command language is also somewhat unusual +# in that it recursively invokes the parser to handle the body of `$(...)` +# expressions which can contain arbitrary shell code. Such expressions may be +# encountered both inside and outside of double-quoted strings. +# +# The lexical analyzer is responsible for consuming shell here-doc bodies which +# extend from the line following a `< $parser, + buff => $s, + lineno => 1, + heretags => [] + } => $class; +} + +sub scan_heredoc_tag { + my $self = shift @_; + ${$self->{buff}} =~ /\G(-?)/gc; + my $indented = $1; + my $token = $self->scan_token(); + return "<<$indented" unless $token; + my $tag = $token->[0]; + $tag =~ s/['"\\]//g; + $$token[0] = $indented ? "\t$tag" : "$tag"; + push(@{$self->{heretags}}, $token); + return "<<$indented$tag"; +} + +sub scan_op { + my ($self, $c) = @_; + my $b = $self->{buff}; + return $c unless $$b =~ /\G(.)/sgc; + my $cc = $c . $1; + return scan_heredoc_tag($self) if $cc eq '<<'; + return $cc if $cc =~ /^(?:&&|\|\||>>|;;|<&|>&|<>|>\|)$/; + pos($$b)--; + return $c; +} + +sub scan_sqstring { + my $self = shift @_; + ${$self->{buff}} =~ /\G([^']*'|.*\z)/sgc; + my $s = $1; + $self->{lineno} += () = $s =~ /\n/sg; + return "'" . $s; +} + +sub scan_dqstring { + my $self = shift @_; + my $b = $self->{buff}; + my $s = '"'; + while (1) { + # slurp up non-special characters + $s .= $1 if $$b =~ /\G([^"\$\\]+)/gc; + # handle special characters + last unless $$b =~ /\G(.)/sgc; + my $c = $1; + $s .= '"', last if $c eq '"'; + $s .= '$' . $self->scan_dollar(), next if $c eq '$'; + if ($c eq '\\') { + $s .= '\\', last unless $$b =~ /\G(.)/sgc; + $c = $1; + $self->{lineno}++, next if $c eq "\n"; # line splice + # backslash escapes only $, `, ", \ in dq-string + $s .= '\\' unless $c =~ /^[\$`"\\]$/; + $s .= $c; + next; + } + die("internal error scanning dq-string '$c'\n"); + } + $self->{lineno} += () = $s =~ /\n/sg; + return $s; +} + +sub scan_balanced { + my ($self, $c1, $c2) = @_; + my $b = $self->{buff}; + my $depth = 1; + my $s = $c1; + while ($$b =~ /\G([^\Q$c1$c2\E]*(?:[\Q$c1$c2\E]|\z))/gc) { + $s .= $1; + $depth++, next if $s =~ /\Q$c1\E$/; + $depth--; + last if $depth == 0; + } + $self->{lineno} += () = $s =~ /\n/sg; + return $s; +} + +sub scan_subst { + my $self = shift @_; + my @tokens = $self->{parser}->parse(qr/^\)$/); + $self->{parser}->next_token(); # closing ")" + return @tokens; +} + +sub scan_dollar { + my $self = shift @_; + my $b = $self->{buff}; + return $self->scan_balanced('(', ')') if $$b =~ /\G\((?=\()/gc; # $((...)) + return '(' . join(' ', map {$_->[0]} $self->scan_subst()) . ')' if $$b =~ /\G\(/gc; # $(...) + return $self->scan_balanced('{', '}') if $$b =~ /\G\{/gc; # ${...} + return $1 if $$b =~ /\G(\w+)/gc; # $var + return $1 if $$b =~ /\G([@*#?$!0-9-])/gc; # $*, $1, $$, etc. + return ''; +} + +sub swallow_heredocs { + my $self = shift @_; + my $b = $self->{buff}; + my $tags = $self->{heretags}; + while (my $tag = shift @$tags) { + my $start = pos($$b); + my $indent = $$tag[0] =~ s/^\t// ? '\\s*' : ''; + $$b =~ /(?:\G|\n)$indent\Q$$tag[0]\E(?:\n|\z)/gc; + if (pos($$b) > $start) { + my $body = substr($$b, $start, pos($$b) - $start); + $self->{parser}->{heredocs}->{$$tag[0]} = { + content => substr($body, 0, length($body) - length($&)), + start_line => $self->{lineno}, + }; + $self->{lineno} += () = $body =~ /\n/sg; + next; + } + push(@{$self->{parser}->{problems}}, ['HEREDOC', $tag]); + $$b =~ /(?:\G|\n).*\z/gc; # consume rest of input + my $body = substr($$b, $start, pos($$b) - $start); + $self->{lineno} += () = $body =~ /\n/sg; + last; + } +} + +sub scan_token { + my $self = shift @_; + my $b = $self->{buff}; + my $token = ''; + my ($start, $startln); +RESTART: + $startln = $self->{lineno}; + $$b =~ /\G[ \t]+/gc; # skip whitespace (but not newline) + $start = pos($$b) || 0; + $self->{lineno}++, return ["\n", $start, pos($$b), $startln, $startln] if $$b =~ /\G#[^\n]*(?:\n|\z)/gc; # comment + while (1) { + # slurp up non-special characters + $token .= $1 if $$b =~ /\G([^\\;&|<>(){}'"\$\s]+)/gc; + # handle special characters + last unless $$b =~ /\G(.)/sgc; + my $c = $1; + pos($$b)--, last if $c =~ /^[ \t]$/; # whitespace ends token + pos($$b)--, last if length($token) && $c =~ /^[;&|<>(){}\n]$/; + $token .= $self->scan_sqstring(), next if $c eq "'"; + $token .= $self->scan_dqstring(), next if $c eq '"'; + $token .= $c . $self->scan_dollar(), next if $c eq '$'; + $self->{lineno}++, $self->swallow_heredocs(), $token = $c, last if $c eq "\n"; + $token = $self->scan_op($c), last if $c =~ /^[;&|<>]$/; + $token = $c, last if $c =~ /^[(){}]$/; + if ($c eq '\\') { + $token .= '\\', last unless $$b =~ /\G(.)/sgc; + $c = $1; + $self->{lineno}++, next if $c eq "\n" && length($token); # line splice + $self->{lineno}++, goto RESTART if $c eq "\n"; # line splice + $token .= '\\' . $c; + next; + } + die("internal error scanning character '$c'\n"); + } + return length($token) ? [$token, $start, pos($$b), $startln, $self->{lineno}] : undef; +} + +# ShellParser parses POSIX shell scripts (with minor extensions for Bash). It +# is a recursive descent parser very roughly modeled after section 2.10 "Shell +# Grammar" of POSIX chapter 2 "Shell Command Language". +package ShellParser; + +sub new { + my ($class, $s) = @_; + my $self = bless { + buff => [], + stop => [], + output => [], + heredocs => {}, + insubshell => 0, + } => $class; + $self->{lexer} = Lexer->new($self, $s); + return $self; +} + +sub next_token { + my $self = shift @_; + return pop(@{$self->{buff}}) if @{$self->{buff}}; + return $self->{lexer}->scan_token(); +} + +sub untoken { + my $self = shift @_; + push(@{$self->{buff}}, @_); +} + +sub peek { + my $self = shift @_; + my $token = $self->next_token(); + return undef unless defined($token); + $self->untoken($token); + return $token; +} + +sub stop_at { + my ($self, $token) = @_; + return 1 unless defined($token); + my $stop = ${$self->{stop}}[-1] if @{$self->{stop}}; + return defined($stop) && $token->[0] =~ $stop; +} + +sub expect { + my ($self, $expect) = @_; + my $token = $self->next_token(); + return $token if defined($token) && $token->[0] eq $expect; + push(@{$self->{output}}, "?!ERR?! expected '$expect' but found '" . (defined($token) ? $token->[0] : "") . "'\n"); + $self->untoken($token) if defined($token); + return (); +} + +sub optional_newlines { + my $self = shift @_; + my @tokens; + while (my $token = $self->peek()) { + last unless $token->[0] eq "\n"; + push(@tokens, $self->next_token()); + } + return @tokens; +} + +sub parse_group { + my $self = shift @_; + return ($self->parse(qr/^}$/), + $self->expect('}')); +} + +sub parse_subshell { + my $self = shift @_; + $self->{insubshell}++; + my @tokens = ($self->parse(qr/^\)$/), + $self->expect(')')); + $self->{insubshell}--; + return @tokens; +} + +sub parse_case_pattern { + my $self = shift @_; + my @tokens; + while (defined(my $token = $self->next_token())) { + push(@tokens, $token); + last if $token->[0] eq ')'; + } + return @tokens; +} + +sub parse_case { + my $self = shift @_; + my @tokens; + push(@tokens, + $self->next_token(), # subject + $self->optional_newlines(), + $self->expect('in'), + $self->optional_newlines()); + while (1) { + my $token = $self->peek(); + last unless defined($token) && $token->[0] ne 'esac'; + push(@tokens, + $self->parse_case_pattern(), + $self->optional_newlines(), + $self->parse(qr/^(?:;;|esac)$/)); # item body + $token = $self->peek(); + last unless defined($token) && $token->[0] ne 'esac'; + push(@tokens, + $self->expect(';;'), + $self->optional_newlines()); + } + push(@tokens, $self->expect('esac')); + return @tokens; +} + +sub parse_for { + my $self = shift @_; + my @tokens; + push(@tokens, + $self->next_token(), # variable + $self->optional_newlines()); + my $token = $self->peek(); + if (defined($token) && $token->[0] eq 'in') { + push(@tokens, + $self->expect('in'), + $self->optional_newlines()); + } + push(@tokens, + $self->parse(qr/^do$/), # items + $self->expect('do'), + $self->optional_newlines(), + $self->parse_loop_body(), + $self->expect('done')); + return @tokens; +} + +sub parse_if { + my $self = shift @_; + my @tokens; + while (1) { + push(@tokens, + $self->parse(qr/^then$/), # if/elif condition + $self->expect('then'), + $self->optional_newlines(), + $self->parse(qr/^(?:elif|else|fi)$/)); # if/elif body + my $token = $self->peek(); + last unless defined($token) && $token->[0] eq 'elif'; + push(@tokens, $self->expect('elif')); + } + my $token = $self->peek(); + if (defined($token) && $token->[0] eq 'else') { + push(@tokens, + $self->expect('else'), + $self->optional_newlines(), + $self->parse(qr/^fi$/)); # else body + } + push(@tokens, $self->expect('fi')); + return @tokens; +} + +sub parse_loop_body { + my $self = shift @_; + return $self->parse(qr/^done$/); +} + +sub parse_loop { + my $self = shift @_; + return ($self->parse(qr/^do$/), # condition + $self->expect('do'), + $self->optional_newlines(), + $self->parse_loop_body(), + $self->expect('done')); +} + +sub parse_func { + my $self = shift @_; + return ($self->expect('('), + $self->expect(')'), + $self->optional_newlines(), + $self->parse_cmd()); # body +} + +sub parse_bash_array_assignment { + my $self = shift @_; + my @tokens = $self->expect('('); + while (defined(my $token = $self->next_token())) { + push(@tokens, $token); + last if $token->[0] eq ')'; + } + return @tokens; +} + +my %compound = ( + '{' => \&parse_group, + '(' => \&parse_subshell, + 'case' => \&parse_case, + 'for' => \&parse_for, + 'if' => \&parse_if, + 'until' => \&parse_loop, + 'while' => \&parse_loop); + +sub parse_cmd { + my $self = shift @_; + my $cmd = $self->next_token(); + return () unless defined($cmd); + return $cmd if $cmd->[0] eq "\n"; + + my $token; + my @tokens = $cmd; + if ($cmd->[0] eq '!') { + push(@tokens, $self->parse_cmd()); + return @tokens; + } elsif (my $f = $compound{$cmd->[0]}) { + push(@tokens, $self->$f()); + } elsif (defined($token = $self->peek()) && $token->[0] eq '(') { + if ($cmd->[0] !~ /\w=$/) { + push(@tokens, $self->parse_func()); + return @tokens; + } + my @array = $self->parse_bash_array_assignment(); + $tokens[-1]->[0] .= join(' ', map {$_->[0]} @array); + $tokens[-1]->[2] = $array[$#array][2] if @array; + } + + while (defined(my $token = $self->next_token())) { + $self->untoken($token), last if $self->stop_at($token); + push(@tokens, $token); + last if $token->[0] =~ /^(?:[;&\n|]|&&|\|\|)$/; + } + push(@tokens, $self->next_token()) if $tokens[-1]->[0] ne "\n" && defined($token = $self->peek()) && $token->[0] eq "\n"; + return @tokens; +} + +sub accumulate { + my ($self, $tokens, $cmd) = @_; + push(@$tokens, @$cmd); +} + +sub parse { + my ($self, $stop) = @_; + push(@{$self->{stop}}, $stop); + goto DONE if $self->stop_at($self->peek()); + my @tokens; + while (my @cmd = $self->parse_cmd()) { + $self->accumulate(\@tokens, \@cmd); + last if $self->stop_at($self->peek()); + } +DONE: + pop(@{$self->{stop}}); + return @tokens; +} + +# ScriptParser is a subclass of ShellParser which identifies individual test +# definitions within test scripts and calls check_test() for each test body +# found. Callers subclass ScriptParser and override check_test() to +# implement specific checks (e.g. chainlint checks &&-chains, lint-style +# checks grep usage). +package ScriptParser; + +our @ISA = ('ShellParser'); + +# extract the raw content of a token, which may be a single string or a +# composition of multiple strings and non-string character runs; for instance, +# `"test body"` unwraps to `test body`; `word"a b"42'c d'` to `worda b42c d` +sub unwrap { + my $token = (@_ ? shift @_ : $_)->[0]; + # simple case: 'sqstring' or "dqstring" + return $token if $token =~ s/^'([^']*)'$/$1/; + return $token if $token =~ s/^"([^"]*)"$/$1/; + + # composite case + my ($s, $q, $escaped); + while (1) { + # slurp up non-special characters + $s .= $1 if $token =~ /\G([^\\'"]*)/gc; + # handle special characters + last unless $token =~ /\G(.)/sgc; + my $c = $1; + $q = undef, next if defined($q) && $c eq $q; + $q = $c, next if !defined($q) && $c =~ /^['"]$/; + if ($c eq '\\') { + last unless $token =~ /\G(.)/sgc; + $c = $1; + $s .= '\\' if $c eq "\n"; # preserve line splice + } + $s .= $c; + } + return $s +} + +sub check_test { + # no-op; subclasses override to implement specific checks +} + +sub parse_cmd { + my $self = shift @_; + my @tokens = $self->SUPER::parse_cmd(); + return @tokens unless @tokens && $tokens[0]->[0] =~ /^test_expect_(?:success|failure)$/; + my $n = $#tokens; + $n-- while $n >= 0 && $tokens[$n]->[0] =~ /^(?:[;&\n|]|&&|\|\|)$/; + my $herebody; + if ($n >= 2 && $tokens[$n-1]->[0] eq '-' && $tokens[$n]->[0] =~ /^<<-?(.+)$/) { + $herebody = $self->{heredocs}->{$1}; + $n--; + } + $self->check_test($tokens[1], $tokens[2], $herebody) if $n == 2; # title body + $self->check_test($tokens[2], $tokens[3], $herebody) if $n > 2; # prereq title body + return @tokens; +} + +1; From 93c2b29683ff158920013af37cd28e1c2f4e2617 Mon Sep 17 00:00:00 2001 From: Michael Montalbo Date: Wed, 3 Jun 2026 02:13:24 -0700 Subject: [PATCH 3/6] t: fix Lexer line count for $() inside double-quoted strings scan_dqstring's post-loop newline counter re-counts newlines that were already counted during recursive parsing of $() bodies. This happens because scan_dollar's returned text can contain newlines (from token text of multi-line strings and from \n command separator tokens), and the catch-all counter at the end of scan_dqstring counts all of them again. Fix this by counting newlines inline as non-special characters are consumed, and removing the post-loop catch-all. Each newline is now counted exactly once: literal newlines at the inline match, line splices at the \ handler, and $() newlines by scan_token during the recursive parse. This does not affect chainlint's output because chainlint annotates the original body text using byte offsets, not token line numbers. It does matter for tools like lint-style.pl (introduced in a subsequent commit) that use token line numbers to locate and fix specific lines in the original file. Add check-shell-parser.pl to verify that the Lexer reports correct line numbers after multi-line $() in double-quoted strings. Signed-off-by: Michael Montalbo --- t/Makefile | 7 +++-- t/check-shell-parser.pl | 58 +++++++++++++++++++++++++++++++++++++++++ t/lib-shell-parser.pl | 11 +++++--- 3 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 t/check-shell-parser.pl diff --git a/t/Makefile b/t/Makefile index ab8a5b54aa6ce0..25f923fed91ff9 100644 --- a/t/Makefile +++ b/t/Makefile @@ -139,7 +139,7 @@ check-meson: test-lint: test-lint-duplicates test-lint-executable \ test-lint-filenames ifneq ($(PERL_PATH),) -test-lint: test-lint-shell-syntax +test-lint: test-lint-shell-syntax check-shell-parser else GIT_TEST_CHAIN_LINT = 0 endif @@ -160,6 +160,8 @@ test-lint-executable: test-lint-shell-syntax: @'$(PERL_PATH_SQ)' check-non-portable-shell.pl $(T) $(THELPERS) $(TPERF) +check-shell-parser: + @'$(PERL_PATH_SQ)' check-shell-parser.pl test-lint-filenames: @# We do *not* pass a glob to ls-files but use grep instead, to catch @# non-ASCII characters (which are quoted within double-quotes) @@ -185,7 +187,8 @@ perf: $(MAKE) -C perf/ all .PHONY: pre-clean $(T) aggregate-results clean valgrind perf \ - check-chainlint clean-chainlint test-chainlint $(UNIT_TESTS) + check-chainlint clean-chainlint test-chainlint \ + check-shell-parser $(UNIT_TESTS) .PHONY: libgit-sys-test libgit-rs-test libgit-sys-test: diff --git a/t/check-shell-parser.pl b/t/check-shell-parser.pl new file mode 100644 index 00000000000000..7d4ba6da7fb4ff --- /dev/null +++ b/t/check-shell-parser.pl @@ -0,0 +1,58 @@ +#!/usr/bin/perl + +# Tests for the shared shell parser (lib-shell-parser.pl). + +use strict; +use warnings; +use File::Basename; + +my $_lib = dirname($0) . "/lib-shell-parser.pl"; +$_lib = "./$_lib" unless $_lib =~ m{^/}; +do $_lib or die "$0: failed to load $_lib: $@$!\n"; + +my $rc = 0; + +sub check { + my ($desc, $body, $want_token, $want_line) = @_; + my $parser = ShellParser->new(\$body); + my @tokens = $parser->parse(); + for my $t (reverse @tokens) { + next unless $t->[0] eq $want_token && defined $t->[3]; + if ($t->[3] != $want_line) { + print STDERR "FAIL: $desc: " . + "'$want_token' at line $t->[3], " . + "expected line $want_line\n"; + $rc = 1; + } + return; + } + print STDERR "FAIL: $desc: token '$want_token' not found\n"; + $rc = 1; +} + +# Multi-line $() inside a dq-string: MARKER should be at line 3. +check('dq-string with multi-line $()', <<'BODY', 'MARKER', 3); + x="$(echo one + echo two)" && + MARKER here +BODY + +# Two multi-line $() substitutions: verifies drift does not accumulate. +# MARKER should be at line 5. +check('two dq-string $()', <<'BODY', 'MARKER', 5); + x="$(echo a + b)" && + y="$(echo c + d)" && + MARKER here +BODY + +# $() outside a dq-string: no double-counting either way. +# MARKER should be at line 3. +check('bare $() spanning lines', <<'BODY', 'MARKER', 3); + x=$(echo one + echo two) && + MARKER here +BODY + +exit $rc; diff --git a/t/lib-shell-parser.pl b/t/lib-shell-parser.pl index 1e521a94f81ea2..fa9b44d6ecdc60 100644 --- a/t/lib-shell-parser.pl +++ b/t/lib-shell-parser.pl @@ -89,8 +89,14 @@ sub scan_dqstring { my $b = $self->{buff}; my $s = '"'; while (1) { - # slurp up non-special characters - $s .= $1 if $$b =~ /\G([^"\$\\]+)/gc; + # slurp up non-special characters; count newlines + # inline so we don't need a catch-all counter that + # would miscount newlines from recursive $() parsing + if ($$b =~ /\G([^"\$\\]+)/gc) { + my $chunk = $1; + $self->{lineno} += () = $chunk =~ /\n/sg; + $s .= $chunk; + } # handle special characters last unless $$b =~ /\G(.)/sgc; my $c = $1; @@ -107,7 +113,6 @@ sub scan_dqstring { } die("internal error scanning dq-string '$c'\n"); } - $self->{lineno} += () = $s =~ /\n/sg; return $s; } From c1b90101ef5c38a21fc901bd7387acf83eb96806 Mon Sep 17 00:00:00 2001 From: Michael Montalbo Date: Wed, 3 Jun 2026 01:20:34 -0700 Subject: [PATCH 4/6] t: add lint-style.pl with test_grep negation rule Add a mechanical lint checker for test scripts, similar in spirit to check-non-portable-shell.pl but focused on test conventions rather than portability. The tool defines LintParser, a subclass of ScriptParser (from the shared lib-shell-parser.pl module). ScriptParser's parse_cmd() finds test_expect_success blocks and calls check_test() for each body; LintParser overrides check_test() to run lint rules on the parsed commands. A "# lint-ok" comment suppresses all checks for intentional style violations. The first rule detects '! test_grep' and replaces it with 'test_grep !'. Shell-level negation suppresses the diagnostic output that test_grep prints on failure; the built-in negation preserves it. Three violations inside test bodies are converted via --fix. One additional violation in a helper function outside test_expect_success (t7900's test_geometric_repack_needed) is converted manually, since the parser only processes test bodies. Signed-off-by: Michael Montalbo --- t/.gitattributes | 2 + t/Makefile | 32 +++- t/lint-style.pl | 200 +++++++++++++++++++++ t/lint-style/heredoc.expect | 3 + t/lint-style/heredoc.test | 14 ++ t/lint-style/test-grep-negation-fix.expect | 4 + t/lint-style/test-grep-negation-fix.test | 4 + t/lint-style/test-grep-negation.expect | 3 + t/lint-style/test-grep-negation.test | 4 + t/t0031-lockfile-pid.sh | 2 +- t/t5300-pack-object.sh | 2 +- t/t5319-multi-pack-index.sh | 2 +- t/t7900-maintenance.sh | 2 +- 13 files changed, 268 insertions(+), 6 deletions(-) create mode 100755 t/lint-style.pl create mode 100644 t/lint-style/heredoc.expect create mode 100644 t/lint-style/heredoc.test create mode 100644 t/lint-style/test-grep-negation-fix.expect create mode 100644 t/lint-style/test-grep-negation-fix.test create mode 100644 t/lint-style/test-grep-negation.expect create mode 100644 t/lint-style/test-grep-negation.test diff --git a/t/.gitattributes b/t/.gitattributes index 7664c6e027d0ed..aea6889d03b2f6 100644 --- a/t/.gitattributes +++ b/t/.gitattributes @@ -1,5 +1,7 @@ t[0-9][0-9][0-9][0-9]/* -whitespace /chainlint/*.expect eol=lf -whitespace +/lint-style/*.expect eol=lf -whitespace +/lint-style/*.test eol=lf -whitespace /t0110/url-* binary /t3206/* eol=lf /t3900/*.txt eol=lf diff --git a/t/Makefile b/t/Makefile index 25f923fed91ff9..3a5fa4ce37a116 100644 --- a/t/Makefile +++ b/t/Makefile @@ -46,6 +46,7 @@ TPERF = $(sort $(wildcard perf/p[0-9][0-9][0-9][0-9]-*.sh)) TINTEROP = $(sort $(wildcard interop/i[0-9][0-9][0-9][0-9]-*.sh)) CHAINLINTTESTS = $(sort $(patsubst chainlint/%.test,%,$(wildcard chainlint/*.test))) CHAINLINT = '$(PERL_PATH_SQ)' chainlint.pl +LINT_STYLE_TESTS = $(sort $(wildcard lint-style/*.test)) UNIT_TEST_SOURCES = $(wildcard unit-tests/t-*.c) UNIT_TEST_PROGRAMS = $(patsubst unit-tests/%.c,unit-tests/bin/%$(X),$(UNIT_TEST_SOURCES)) UNIT_TEST_PROGRAMS += unit-tests/bin/unit-tests$(X) @@ -139,7 +140,7 @@ check-meson: test-lint: test-lint-duplicates test-lint-executable \ test-lint-filenames ifneq ($(PERL_PATH),) -test-lint: test-lint-shell-syntax check-shell-parser +test-lint: test-lint-shell-syntax test-lint-style check-lint-style check-shell-parser else GIT_TEST_CHAIN_LINT = 0 endif @@ -162,6 +163,32 @@ test-lint-shell-syntax: check-shell-parser: @'$(PERL_PATH_SQ)' check-shell-parser.pl + +test-lint-style: + @'$(PERL_PATH_SQ)' lint-style.pl $(T) $(THELPERS) $(TPERF) + +check-lint-style: + @rc=0; for t in $(LINT_STYLE_TESTS); do \ + base=$${t%.test}; \ + case $$base in \ + *-fix) \ + cp "$$t" "$$t.tmp" && \ + '$(PERL_PATH_SQ)' lint-style.pl --fix "$$t.tmp" >/dev/null 2>&1; \ + fix_rc=$$?; \ + if test $$fix_rc != 0; then \ + echo "FAIL: $$t (--fix exit code $$fix_rc)"; rc=1; \ + elif ! diff -u "$$base.expect" "$$t.tmp"; then \ + echo "FAIL: $$t (--fix output)"; rc=1; \ + fi; \ + rm -f "$$t.tmp" ;; \ + *) \ + if ! '$(PERL_PATH_SQ)' lint-style.pl "$$t" 2>&1 | \ + diff -u "$$base.expect" -; then \ + echo "FAIL: $$t"; rc=1; \ + fi ;; \ + esac; \ + done; test $$rc = 0 + test-lint-filenames: @# We do *not* pass a glob to ls-files but use grep instead, to catch @# non-ASCII characters (which are quoted within double-quotes) @@ -188,7 +215,8 @@ perf: .PHONY: pre-clean $(T) aggregate-results clean valgrind perf \ check-chainlint clean-chainlint test-chainlint \ - check-shell-parser $(UNIT_TESTS) + check-shell-parser \ + check-lint-style test-lint-style $(UNIT_TESTS) .PHONY: libgit-sys-test libgit-rs-test libgit-sys-test: diff --git a/t/lint-style.pl b/t/lint-style.pl new file mode 100755 index 00000000000000..9268577f9b6ba9 --- /dev/null +++ b/t/lint-style.pl @@ -0,0 +1,200 @@ +#!/usr/bin/perl + +# Check test scripts for style violations that can be detected +# mechanically, such as using bare 'grep' where test_grep should +# be used. Use --fix to automatically apply suggested replacements. +# +# Detection uses parsed tokens from the shared shell parser for +# correct handling of heredocs, $(...), pipes, and quoting. +# Fixes modify the original file text to preserve formatting. + +use strict; +use warnings; +use File::Basename; +# Force LF output so check-lint-style's diff against the +# pre-committed .expect files works on Windows. +binmode(STDOUT, ':unix'); +binmode(STDERR, ':unix'); + +my $fix_mode = 0; +if (@ARGV && $ARGV[0] eq '--fix') { + $fix_mode = 1; + shift @ARGV; +} + +# Load the shared shell parser (Lexer, ShellParser, ScriptParser). +my $_lib = dirname($0) . "/lib-shell-parser.pl"; +$_lib = "./$_lib" unless $_lib =~ m{^/}; +do $_lib or die "$0: failed to load $_lib: $@$!\n"; + +# LintParser is a subclass of ScriptParser which runs lint rules +# on each test body. Per-file state (file name, raw lines, dirty +# flag) is stored on the instance before calling parse(). +# +# Subroutines defined below (parse_commands, check_test_grep_negation, +# etc.) are in package main and called with the main:: prefix. +# File-scoped lexicals ($fix_mode, $has_fixable, etc.) are visible +# across packages since 'package' does not introduce a new scope. +package LintParser; +our @ISA = ('ScriptParser'); + +package main; + +my $exit_code = 0; +my $has_fixable = 0; + +sub err { + my ($file, $lineno, $line, $msg, %opts) = @_; + $line =~ s/^\s+//; + $line =~ s/\s+$//; + $line =~ s/\s+/ /g; + my $prefix = ($fix_mode && $opts{fixable}) ? 'fixed' : 'error'; + print "$file:$lineno: $prefix: $msg: $line\n"; + $exit_code = 1 unless $fix_mode && $opts{fixable}; +} + +# Report a lint violation found by a rule. In --fix mode, apply +# the regex substitution on the raw line and report success. +# Otherwise just report. Returns 1 if the line was modified. +sub report_violation { + my ($file, $cmd, $line_ref, $match, $fix, $from) = @_; + my $lineno = $cmd->{lineno}; + my $display = join(' ', @{$cmd->{tokens}}); + $has_fixable++; # count for the "--fix" hint + if ($fix_mode) { + if ($$line_ref =~ s/$match/$fix/) { + err $file, $lineno, $display, + "replace '$from' with '$fix'", + fixable => 1; + return 1; + } + err $file, $lineno, $display, + "replace '$from' with '$fix' (could not auto-fix)"; + } else { + err $file, $lineno, $display, + "replace '$from' with '$fix'"; + } + return 0; +} + +# Split a token stream into commands at &&, ||, ;;, and \n. +sub parse_commands { + my ($content) = @_; + my $parser = ShellParser->new(\$content); + my @all_tokens = $parser->parse(); + + my @commands; + my @current; + my $lineno = 1; + + for (my $ti = 0; $ti < @all_tokens; $ti++) { + my $text = $all_tokens[$ti]->[0]; + if ($text =~ /^(?:&&|\|\||;;|\n)$/) { + if (@current) { + push @commands, { + tokens => [@current], + lineno => $lineno, + }; + @current = (); + } + } else { + $lineno = $all_tokens[$ti]->[3] + if !@current && defined $all_tokens[$ti]->[3]; + push @current, $text; + } + } + if (@current) { + push @commands, { + tokens => [@current], + lineno => $lineno, + }; + } + return @commands; +} + +# --- Rule: '! test_grep' should be 'test_grep !' --- +# Shell-level negation suppresses test_grep's diagnostic output +# on failure. Built-in negation preserves it. +sub check_test_grep_negation { + my ($cmd, $file, $line_ref) = @_; + my @tokens = @{$cmd->{tokens}}; + return unless @tokens >= 2 && $tokens[0] eq '!' && $tokens[1] eq 'test_grep'; + + return report_violation($file, $cmd, $line_ref, + qr/!\s*test_grep/, 'test_grep !', '! test_grep'); +} + +# Map parsed commands back to raw file lines for --fix. +# Detection uses parsed tokens (correct handling of quoting, +# heredocs, pipes) but fixes must modify the original text +# to preserve formatting. +package LintParser; + +sub check_test { + # Called by ScriptParser::parse_cmd for each test_expect_success + # or test_expect_failure block. + my $self = shift @_; + my $title = ScriptParser::unwrap(shift @_); + + # Two test body formats: + # Quoted: test_expect_success 'title' '..body..' + # Heredoc: test_expect_success 'title' - <<\EOF + # ..body.. + # EOF + # For quoted, the body token is the quoted string. + # For heredoc, the body token is '-' and the actual + # code arrives as the next argument from the Lexer. + my $body_token = shift @_; + my $lineno_base = $body_token->[3] || 1; + my $body = ScriptParser::unwrap($body_token); + + if ($body eq '-') { + my $herebody = shift @_; + if ($herebody) { + $body = $herebody->{content}; + $lineno_base = $herebody->{start_line} || 1; + } + } + return unless $body; + + # Map each command back to its file line number. + # $lineno_base is where the body starts in the file; + # $cmd->{lineno} is relative to the body (starting at 1). + my $raw_lines = $self->{raw_lines}; + for my $cmd (main::parse_commands($body)) { + my $ln = ($cmd->{lineno} || 0) + $lineno_base - 1; + $cmd->{lineno} = $ln; + next unless $ln >= 1 && $ln <= @$raw_lines; + next if $raw_lines->[$ln - 1] =~ /#.*lint-ok/; + + if (main::check_test_grep_negation($cmd, $self->{file}, \$raw_lines->[$ln - 1])) { + $self->{dirty} = 1; + } + } +} + +package main; + +for my $file (@ARGV) { + # :unix:crlf strips \r on Windows (same as chainlint.pl) + open(my $fh, '<:unix:crlf', $file) or die "$0: $file: $!\n"; + my @raw_lines = <$fh>; + close $fh; + + my $parser = LintParser->new(\join('', @raw_lines)); + $parser->{file} = $file; + $parser->{raw_lines} = \@raw_lines; + $parser->{dirty} = 0; + $parser->parse(); + + if ($fix_mode && $parser->{dirty}) { + open(my $out, '>', $file) or die "$0: $file: $!\n"; + print $out @{$parser->{raw_lines}}; + close $out; + } +} + +if ($has_fixable && !$fix_mode) { + print "hint: run with --fix to apply the suggested replacements.\n"; +} +exit $exit_code; diff --git a/t/lint-style/heredoc.expect b/t/lint-style/heredoc.expect new file mode 100644 index 00000000000000..7ff6d4a52d2306 --- /dev/null +++ b/t/lint-style/heredoc.expect @@ -0,0 +1,3 @@ +lint-style/heredoc.test:8: error: replace '! test_grep' with 'test_grep !': ! test_grep "after-heredoc-is-caught" actual +lint-style/heredoc.test:13: error: replace '! test_grep' with 'test_grep !': ! test_grep "not-inside-sed-heredoc" actual +hint: run with --fix to apply the suggested replacements. diff --git a/t/lint-style/heredoc.test b/t/lint-style/heredoc.test new file mode 100644 index 00000000000000..4c05831cfbc58b --- /dev/null +++ b/t/lint-style/heredoc.test @@ -0,0 +1,14 @@ +test_expect_success 'greps inside heredocs are skipped' ' + cat <<-EOF && + grep "inside-strip-tabs" file + EOF + cat <<-\EOF && + grep "inside-no-expand" file + EOF + ! test_grep "after-heredoc-is-caught" actual +' + +test_expect_success 'sed with << does not start a heredoc' ' + sed "s/<< foo/bar/" file && + ! test_grep "not-inside-sed-heredoc" actual +' diff --git a/t/lint-style/test-grep-negation-fix.expect b/t/lint-style/test-grep-negation-fix.expect new file mode 100644 index 00000000000000..28ecde1073383e --- /dev/null +++ b/t/lint-style/test-grep-negation-fix.expect @@ -0,0 +1,4 @@ +test_expect_success 'negated test_grep' ' + test_grep ! "pattern" actual && + test_grep ! -i "insensitive" actual +' diff --git a/t/lint-style/test-grep-negation-fix.test b/t/lint-style/test-grep-negation-fix.test new file mode 100644 index 00000000000000..571c150031efdd --- /dev/null +++ b/t/lint-style/test-grep-negation-fix.test @@ -0,0 +1,4 @@ +test_expect_success 'negated test_grep' ' + ! test_grep "pattern" actual && + ! test_grep -i "insensitive" actual +' diff --git a/t/lint-style/test-grep-negation.expect b/t/lint-style/test-grep-negation.expect new file mode 100644 index 00000000000000..1fa9e124aa43a0 --- /dev/null +++ b/t/lint-style/test-grep-negation.expect @@ -0,0 +1,3 @@ +lint-style/test-grep-negation.test:2: error: replace '! test_grep' with 'test_grep !': ! test_grep "pattern" actual +lint-style/test-grep-negation.test:3: error: replace '! test_grep' with 'test_grep !': ! test_grep -i "insensitive" actual +hint: run with --fix to apply the suggested replacements. diff --git a/t/lint-style/test-grep-negation.test b/t/lint-style/test-grep-negation.test new file mode 100644 index 00000000000000..571c150031efdd --- /dev/null +++ b/t/lint-style/test-grep-negation.test @@ -0,0 +1,4 @@ +test_expect_success 'negated test_grep' ' + ! test_grep "pattern" actual && + ! test_grep -i "insensitive" actual +' diff --git a/t/t0031-lockfile-pid.sh b/t/t0031-lockfile-pid.sh index 8ef87addf56f1e..e9e2f0404971ce 100755 --- a/t/t0031-lockfile-pid.sh +++ b/t/t0031-lockfile-pid.sh @@ -29,7 +29,7 @@ test_expect_success 'PID info not shown by default' ' test_must_fail git add . 2>err && # Should not crash, just show normal error without PID test_grep "Unable to create" err && - ! test_grep "is held by process" err + test_grep ! "is held by process" err ) ' diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index 73445782e74451..3179b4963e1600 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -720,7 +720,7 @@ test_expect_success '--name-hash-version=2 and --write-bitmap-index are incompat # --stdout option silently removes --write-bitmap-index git pack-objects --stdout --all --name-hash-version=2 --write-bitmap-index >out 2>err && - ! test_grep "currently, --write-bitmap-index requires --name-hash-version=1" err + test_grep ! "currently, --write-bitmap-index requires --name-hash-version=1" err ' test_expect_success '--path-walk pack everything' ' diff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh index fa0d4046f753b8..9154d9795fe91e 100755 --- a/t/t5319-multi-pack-index.sh +++ b/t/t5319-multi-pack-index.sh @@ -1175,7 +1175,7 @@ test_expect_success 'load reverse index when missing .idx, .pack' ' test_expect_success 'usage shown without sub-command' ' test_expect_code 129 git multi-pack-index 2>err && - ! test_grep "unrecognized subcommand" err + test_grep ! "unrecognized subcommand" err ' test_expect_success 'complains when run outside of a repository' ' diff --git a/t/t7900-maintenance.sh b/t/t7900-maintenance.sh index d7f82e1bec163f..9db4a76f67e3cf 100755 --- a/t/t7900-maintenance.sh +++ b/t/t7900-maintenance.sh @@ -664,7 +664,7 @@ test_geometric_repack_needed () { true) test_grep "\[\"git\",\"repack\"," trace2.txt;; false) - ! test_grep "\[\"git\",\"repack\"," trace2.txt;; + test_grep ! "\[\"git\",\"repack\"," trace2.txt;; *) BUG "invalid parameter: $NEEDED";; esac From c0db9fdb5bf9a9b8218e32de043b8a9ca1aaf023 Mon Sep 17 00:00:00 2001 From: Michael Montalbo Date: Wed, 3 Jun 2026 01:21:22 -0700 Subject: [PATCH 5/6] t: fix grep assertions missing file arguments Three grep assertions were missing their file arguments, causing them to read from empty stdin instead of the intended file: - t2402: '! grep ...' should read from 'out', matching the grep on the preceding line. - t7507: the closing quote is in the wrong place, making the entire 'diff --git actual' a single pattern with no file argument instead of pattern 'diff --git' and file 'actual'. - t7700: '! grep ...' should read from 'packlist', matching the redirect on the preceding line. Without file arguments these greps always succeed (empty stdin matches nothing), so the assertions were not actually checking anything. All three tests pass with the corrected file arguments, confirming the intended behavior is sound. Signed-off-by: Michael Montalbo --- t/t2402-worktree-list.sh | 2 +- t/t7507-commit-verbose.sh | 2 +- t/t7700-repack.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh index e0c6abd2f58e20..93f92e854aa829 100755 --- a/t/t2402-worktree-list.sh +++ b/t/t2402-worktree-list.sh @@ -144,7 +144,7 @@ test_expect_success '"list" all worktrees with prunable annotation' ' rm -rf prunable && git worktree list >out && grep "/prunable *[0-9a-f].* prunable$" out && - ! grep "/unprunable *[0-9a-f].* prunable$" + ! grep "/unprunable *[0-9a-f].* prunable$" out ' test_expect_success '"list" all worktrees --porcelain with prunable' ' diff --git a/t/t7507-commit-verbose.sh b/t/t7507-commit-verbose.sh index b53d71c0862396..acdb6b1455b17e 100755 --- a/t/t7507-commit-verbose.sh +++ b/t/t7507-commit-verbose.sh @@ -163,7 +163,7 @@ done test_expect_success "status ignores commit.verbose=true" ' git -c commit.verbose=true status >actual && - ! grep "^diff --git actual" + ! grep "^diff --git" actual ' test_done diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh index 63ef63fc509a1d..c6ff3aed30b5dd 100755 --- a/t/t7700-repack.sh +++ b/t/t7700-repack.sh @@ -194,7 +194,7 @@ test_expect_success 'local packed unreachable obs that exist in alternate ODB ar rm -f .git/objects/pack/* && mv pack-* .git/objects/pack/ && git verify-pack -v -- .git/objects/pack/*.idx >packlist && - ! grep "^$coid " && + ! grep "^$coid " packlist && echo >.git/objects/info/alternates && test_must_fail git show $coid ' From 1527293f1cb9e7ba2e0b0edeb0761b53d9de368a Mon Sep 17 00:00:00 2001 From: Michael Montalbo Date: Wed, 3 Jun 2026 20:06:19 -0700 Subject: [PATCH 6/6] t: lint and convert grep assertions to test_grep Extend lint-style.pl with a rule that detects bare 'grep' used as a test assertion and converts it to test_grep. test_grep prints the file contents on failure, making test debugging significantly easier. parse_commands() is extended to split at shell structural tokens ({, }, (, ), |) and keywords (if, then, for, etc.), and each command gains a token_pos index so that rules can scan backward and forward in the token stream for context. Three new functions implement the grep-assertion rule: - is_filter_context() scans the surrounding tokens for pipes, control-flow keywords (if/elif/while/until), for-in value lists, and brace groups with output redirects. - is_grep_assertion() classifies a grep command: convertible assertion (pattern and file present), filter (not an assertion), or missing file argument (flagged as a likely bug). - check_bare_grep() ties them together and calls report_violation() with the appropriate fix. The --fix mode handles: - Replacing 'grep' with 'test_grep' - Moving negation from '! grep' to 'test_grep !' - Stripping the -q flag (test_grep inherently checks match status) Five files require '# lint-ok' annotations for intentional grep usage that cannot be mechanically converted: t1400 (packed-refs may not exist on reftable), t3901 (piped stdin via case block), t6437 (glob argument breaks test_grep's test -f check), t7450 (file may not exist after failed MINGW clone), and t7527 ($? capture on the next line). The test-lint-style scope is extended to include sourced test fragments in subdirectories (t5411/*.sh and similar) via a new TSOURCED variable. Run '--fix' to convert all ~2800 grep assertions across ~340 files in the test suite. test-lib-functions.sh and lib-rebase.sh are excluded from linting since they implement test infrastructure rather than test assertions. Signed-off-by: Michael Montalbo --- t/Makefile | 4 +- t/for-each-ref-tests.sh | 12 +- t/lib-bitmap.sh | 12 +- t/lib-bundle-uri-protocol.sh | 26 +- t/lib-httpd.sh | 2 +- t/lint-style.pl | 289 ++++++++++++++-- t/lint-style/grep-assert.expect | 13 + t/lint-style/grep-assert.test | 24 ++ t/lint-style/grep-fix.expect | 16 + t/lint-style/grep-fix.test | 16 + t/lint-style/grep-missing-file.expect | 4 + t/lint-style/grep-missing-file.test | 6 + t/lint-style/grep-negated.expect | 5 + t/lint-style/grep-negated.test | 9 + t/lint-style/grep-not-assert.expect | 0 t/lint-style/grep-not-assert.test | 43 +++ t/pack-refs-tests.sh | 2 +- t/show-ref-exists-tests.sh | 2 +- t/t0000-basic.sh | 16 +- t/t0001-init.sh | 18 +- t/t0008-ignores.sh | 8 +- t/t0009-git-dir-validation.sh | 6 +- t/t0012-help.sh | 4 +- t/t0013-sha1dc.sh | 2 +- t/t0017-env-helper.sh | 4 +- t/t0021-conversion.sh | 18 +- t/t0029-core-unsetenvvars.sh | 4 +- t/t0030-stripspace.sh | 4 +- t/t0040-parse-options.sh | 52 +-- t/t0041-usage.sh | 2 +- t/t0052-simple-ipc.sh | 10 +- t/t0061-run-command.sh | 2 +- t/t0066-dir-iterator.sh | 2 +- t/t0068-for-each-repo.sh | 16 +- t/t0070-fundamental.sh | 6 +- t/t0081-find-pack.sh | 12 +- t/t0091-bugreport.sh | 18 +- t/t0092-diagnose.sh | 12 +- t/t0100-previous.sh | 2 +- t/t0200-gettext-basic.sh | 14 +- t/t0203-gettext-setlocale-sanity.sh | 4 +- t/t0204-gettext-reencode-sanity.sh | 8 +- t/t0210-trace2-normal.sh | 6 +- t/t0211-trace2-perf.sh | 80 ++--- t/t0212-trace2-event.sh | 8 +- t/t0300-credentials.sh | 4 +- t/t0410-partial-clone.sh | 82 ++--- t/t0450-txt-doc-vs-help.sh | 2 +- t/t0500-progress-display.sh | 18 +- t/t0610-reftable-basics.sh | 8 +- t/t1004-read-tree-m-u-wf.sh | 8 +- t/t1006-cat-file.sh | 18 +- t/t1007-hash-object.sh | 8 +- t/t1011-read-tree-sparse-checkout.sh | 10 +- t/t1050-large.sh | 6 +- t/t1091-sparse-checkout-builtin.sh | 24 +- t/t1092-sparse-checkout-compatibility.sh | 44 +-- t/t1300-config.sh | 16 +- t/t1305-config-include.sh | 2 +- t/t1308-config-set.sh | 6 +- t/t1400-update-ref.sh | 170 ++++----- t/t1403-show-ref.sh | 18 +- t/t1410-reflog.sh | 4 +- t/t1415-worktree-refs.sh | 4 +- t/t1430-bad-ref-name.sh | 56 +-- t/t1450-fsck.sh | 12 +- t/t1451-fsck-buffer.sh | 6 +- t/t1460-refs-migrate.sh | 2 +- t/t1500-rev-parse.sh | 6 +- t/t1502-rev-parse-parseopt.sh | 2 +- t/t1503-rev-parse-verify.sh | 10 +- t/t1510-repo-setup.sh | 10 +- t/t1512-rev-parse-disambiguation.sh | 4 +- t/t1515-rev-parse-outside-repo.sh | 2 +- t/t1800-hook.sh | 18 +- t/t2004-checkout-cache-temp.sh | 4 +- t/t2019-checkout-ambiguous-ref.sh | 4 +- t/t2024-checkout-dwim.sh | 8 +- t/t2030-unresolve-info.sh | 6 +- t/t2060-switch.sh | 6 +- t/t2070-restore.sh | 2 +- t/t2080-parallel-checkout-basics.sh | 14 +- t/t2081-parallel-checkout-collisions.sh | 24 +- t/t2082-parallel-checkout-attributes.sh | 12 +- t/t2103-update-index-ignore-missing.sh | 6 +- t/t2200-add-update.sh | 2 +- t/t2203-add-intent.sh | 6 +- t/t2400-worktree-add.sh | 24 +- t/t2402-worktree-list.sh | 16 +- t/t2403-worktree-move.sh | 6 +- t/t2405-worktree-submodule.sh | 6 +- t/t2407-worktree-heads.sh | 26 +- t/t2500-untracked-overwriting.sh | 8 +- t/t2501-cwd-empty.sh | 4 +- t/t3001-ls-files-others-exclude.sh | 6 +- t/t3007-ls-files-recurse-submodules.sh | 6 +- t/t3200-branch.sh | 12 +- t/t3202-show-branch.sh | 10 +- t/t3203-branch-output.sh | 4 +- t/t3206-range-diff.sh | 78 ++--- t/t3207-branch-submodule.sh | 4 +- t/t3301-notes.sh | 32 +- t/t3310-notes-merge-manual-resolve.sh | 16 +- t/t3320-notes-merge-worktrees.sh | 2 +- t/t3400-rebase.sh | 16 +- t/t3402-rebase-merge.sh | 16 +- t/t3404-rebase-interactive.sh | 72 ++-- t/t3406-rebase-message.sh | 6 +- t/t3415-rebase-autosquash.sh | 10 +- t/t3416-rebase-onto-threedots.sh | 4 +- t/t3418-rebase-continue.sh | 10 +- t/t3420-rebase-autostash.sh | 25 +- t/t3422-rebase-incompatible-options.sh | 4 +- t/t3429-rebase-edit-todo.sh | 2 +- t/t3430-rebase-merges.sh | 32 +- t/t3500-cherry.sh | 4 +- t/t3501-revert-cherry-pick.sh | 6 +- t/t3504-cherry-pick-rerere.sh | 6 +- t/t3510-cherry-pick-sequence.sh | 24 +- t/t3602-rm-sparse-checkout.sh | 4 +- t/t3705-add-sparse-checkout.sh | 10 +- t/t3800-mktag.sh | 4 +- t/t3901-i18n-patch.sh | 20 +- t/t3903-stash.sh | 28 +- t/t3904-stash-patch.sh | 4 +- t/t3908-stash-in-worktree.sh | 2 +- t/t4000-diff-format.sh | 2 +- t/t4001-diff-rename.sh | 4 +- t/t4011-diff-symlink.sh | 2 +- t/t4013-diff-various.sh | 2 +- t/t4014-format-patch.sh | 344 +++++++++---------- t/t4015-diff-whitespace.sh | 16 +- t/t4017-diff-retval.sh | 2 +- t/t4018-diff-funcname.sh | 2 +- t/t4019-diff-wserror.sh | 8 +- t/t4020-diff-external.sh | 18 +- t/t4021-format-patch-numbered.sh | 4 +- t/t4022-diff-rewrite.sh | 14 +- t/t4028-format-patch-mime-headers.sh | 6 +- t/t4031-diff-rewrite-binary.sh | 18 +- t/t4033-diff-patience.sh | 2 +- t/t4036-format-patch-signer-mime.sh | 6 +- t/t4038-diff-combined.sh | 6 +- t/t4051-diff-function-context.sh | 38 +- t/t4053-diff-no-index.sh | 4 +- t/t4063-diff-blobs.sh | 2 +- t/t4065-diff-anchored.sh | 26 +- t/t4067-diff-partial-clone.sh | 12 +- t/t4073-diff-stat-name-width.sh | 24 +- t/t4103-apply-binary.sh | 2 +- t/t4120-apply-popt.sh | 2 +- t/t4124-apply-ws-rule.sh | 10 +- t/t4128-apply-root.sh | 2 +- t/t4140-apply-ita.sh | 4 +- t/t4141-apply-too-large.sh | 2 +- t/t4150-am.sh | 48 +-- t/t4200-rerere.sh | 6 +- t/t4201-shortlog.sh | 2 +- t/t4202-log.sh | 84 ++--- t/t4204-patch-id.sh | 2 +- t/t4205-log-pretty-formats.sh | 2 +- t/t4209-log-pickaxe.sh | 10 +- t/t4211-line-log.sh | 72 ++-- t/t4216-log-bloom.sh | 18 +- t/t4252-am-options.sh | 22 +- t/t4254-am-corrupt.sh | 6 +- t/t4258-am-quoted-cr.sh | 2 +- t/t4301-merge-tree-write-tree.sh | 18 +- t/t5000-tar-tree.sh | 10 +- t/t5004-archive-corner-cases.sh | 2 +- t/t5100-mailinfo.sh | 2 +- t/t5150-request-pull.sh | 18 +- t/t5300-pack-object.sh | 20 +- t/t5302-pack-index.sh | 6 +- t/t5304-prune.sh | 8 +- t/t5310-pack-bitmaps.sh | 14 +- t/t5317-pack-objects-filter-objects.sh | 12 +- t/t5318-commit-graph.sh | 8 +- t/t5319-multi-pack-index.sh | 14 +- t/t5324-split-commit-graph.sh | 10 +- t/t5325-reverse-index.sh | 2 +- t/t5326-multi-pack-bitmaps.sh | 28 +- t/t5328-commit-graph-64bit-time.sh | 2 +- t/t5329-pack-objects-cruft.sh | 8 +- t/t5334-incremental-multi-pack-index.sh | 2 +- t/t5335-compact-multi-pack-index.sh | 4 +- t/t5351-unpack-large-objects.sh | 2 +- t/t5402-post-merge-hook.sh | 4 +- t/t5403-post-checkout-hook.sh | 2 +- t/t5404-tracking-branches.sh | 2 +- t/t5406-remote-rejects.sh | 2 +- t/t5407-post-rewrite-hook.sh | 8 +- t/t5409-colorize-remote-messages.sh | 36 +- t/t5411/test-0013-bad-protocol.sh | 14 +- t/t5411/test-0014-bad-protocol--porcelain.sh | 14 +- t/t5500-fetch-pack.sh | 38 +- t/t5504-fetch-receive-strict.sh | 14 +- t/t5505-remote.sh | 20 +- t/t5510-fetch.sh | 10 +- t/t5512-ls-remote.sh | 8 +- t/t5514-fetch-multiple.sh | 2 +- t/t5516-fetch-push.sh | 20 +- t/t5520-pull.sh | 4 +- t/t5524-pull-msg.sh | 6 +- t/t5526-fetch-submodules.sh | 16 +- t/t5529-push-errors.sh | 4 +- t/t5530-upload-pack-error.sh | 18 +- t/t5531-deep-submodule-push.sh | 2 +- t/t5532-fetch-proxy.sh | 2 +- t/t5533-push-cas.sh | 12 +- t/t5534-push-signed.sh | 22 +- t/t5537-fetch-shallow.sh | 2 +- t/t5538-push-shallow.sh | 2 +- t/t5539-fetch-http-shallow.sh | 4 +- t/t5541-http-push-smart.sh | 32 +- t/t5544-pack-objects-hook.sh | 12 +- t/t5550-http-fetch-dumb.sh | 4 +- t/t5551-http-fetch-smart.sh | 46 +-- t/t5552-skipping-fetch-negotiator.sh | 6 +- t/t5554-noop-fetch-negotiator.sh | 4 +- t/t5557-http-get.sh | 2 +- t/t5558-clone-bundle-uri.sh | 38 +- t/t5562-http-backend-content-length.sh | 2 +- t/t5564-http-proxy.sh | 10 +- t/t5581-http-curl-verbose.sh | 2 +- t/t5583-push-branches.sh | 8 +- t/t5601-clone.sh | 28 +- t/t5604-clone-reference.sh | 8 +- t/t5605-clone-local.sh | 2 +- t/t5606-clone-options.sh | 6 +- t/t5612-clone-refspec.sh | 2 +- t/t5616-partial-clone.sh | 60 ++-- t/t5619-clone-local-ambiguous-transport.sh | 2 +- t/t5620-backfill.sh | 12 +- t/t5700-protocol-v1.sh | 46 +-- t/t5701-git-serve.sh | 14 +- t/t5702-protocol-v2.sh | 152 ++++---- t/t5703-upload-pack-ref-in-want.sh | 22 +- t/t5705-session-id-in-capabilities.sh | 12 +- t/t5750-bundle-uri-parse.sh | 8 +- t/t5801-remote-helpers.sh | 4 +- t/t5810-proto-disable-local.sh | 2 +- t/t5813-proto-disable-ssh.sh | 4 +- t/t6000-rev-list-misc.sh | 26 +- t/t6005-rev-list-count.sh | 8 +- t/t6006-rev-list-format.sh | 4 +- t/t6009-rev-list-parent.sh | 4 +- t/t6020-bundle-misc.sh | 12 +- t/t6022-rev-list-missing.sh | 4 +- t/t6030-bisect-porcelain.sh | 150 ++++---- t/t6040-tracking-info.sh | 2 +- t/t6112-rev-list-filters-objects.sh | 24 +- t/t6115-rev-list-du.sh | 4 +- t/t6120-describe.sh | 14 +- t/t6200-fmt-merge-msg.sh | 82 ++--- t/t6402-merge-rename.sh | 4 +- t/t6403-merge-file.sh | 6 +- t/t6404-recursive-merge.sh | 2 +- t/t6406-merge-attr.sh | 20 +- t/t6417-merge-ours-theirs.sh | 30 +- t/t6418-merge-text-auto.sh | 2 +- t/t6422-merge-rename-corner-cases.sh | 8 +- t/t6423-merge-rename-directories.sh | 72 ++-- t/t6424-merge-unrelated-index-changes.sh | 6 +- t/t6427-diff3-conflict-markers.sh | 10 +- t/t6432-merge-recursive-space-options.sh | 4 +- t/t6436-merge-overwrite.sh | 6 +- t/t6437-submodule-merge.sh | 12 +- t/t6500-gc.sh | 8 +- t/t6600-test-reach.sh | 4 +- t/t7001-mv.sh | 16 +- t/t7002-mv-sparse-checkout.sh | 38 +- t/t7003-filter-branch.sh | 16 +- t/t7004-tag.sh | 2 +- t/t7006-pager.sh | 16 +- t/t7012-skip-worktree-writing.sh | 6 +- t/t7030-verify-tag.sh | 52 +-- t/t7031-verify-tag-signed-ssh.sh | 46 +-- t/t7102-reset.sh | 2 +- t/t7110-reset-merge.sh | 40 +-- t/t7201-co.sh | 6 +- t/t7300-clean.sh | 2 +- t/t7301-clean-interactive.sh | 2 +- t/t7400-submodule-basic.sh | 32 +- t/t7402-submodule-rebase.sh | 2 +- t/t7406-submodule-update.sh | 26 +- t/t7416-submodule-dash-url.sh | 20 +- t/t7417-submodule-path-url.sh | 2 +- t/t7450-bad-git-dotfiles.sh | 14 +- t/t7501-commit-basic-functionality.sh | 14 +- t/t7502-commit-porcelain.sh | 2 +- t/t7507-commit-verbose.sh | 6 +- t/t7508-status.sh | 6 +- t/t7510-signed-commit.sh | 68 ++-- t/t7516-commit-races.sh | 4 +- t/t7519-status-fsmonitor.sh | 14 +- t/t7527-builtin-fsmonitor.sh | 84 ++--- t/t7528-signed-commit-ssh.sh | 68 ++-- t/t7600-merge.sh | 10 +- t/t7603-merge-reduce-heads.sh | 20 +- t/t7606-merge-custom.sh | 2 +- t/t7607-merge-state.sh | 4 +- t/t7610-mergetool.sh | 18 +- t/t7700-repack.sh | 14 +- t/t7703-repack-geometric.sh | 4 +- t/t7704-repack-cruft.sh | 12 +- t/t7800-difftool.sh | 26 +- t/t7810-grep.sh | 22 +- t/t7814-grep-recurse-submodules.sh | 2 +- t/t7900-maintenance.sh | 34 +- t/t8008-blame-formats.sh | 2 +- t/t8010-cat-file-filters.sh | 2 +- t/t8012-blame-colors.sh | 2 +- t/t9001-send-email.sh | 190 +++++----- t/t9003-help-autocorrect.sh | 6 +- t/t9106-git-svn-commit-diff-clobber.sh | 2 +- t/t9107-git-svn-migrate.sh | 30 +- t/t9110-git-svn-use-svm-props.sh | 20 +- t/t9111-git-svn-use-svnsync-props.sh | 18 +- t/t9114-git-svn-dcommit-merge.sh | 6 +- t/t9116-git-svn-log.sh | 8 +- t/t9117-git-svn-init-clone.sh | 12 +- t/t9119-git-svn-info.sh | 16 +- t/t9122-git-svn-author.sh | 8 +- t/t9130-git-svn-authors-file.sh | 8 +- t/t9138-git-svn-authors-prog.sh | 14 +- t/t9140-git-svn-reset.sh | 4 +- t/t9153-git-svn-rewrite-uuid.sh | 4 +- t/t9200-git-cvsexportcommit.sh | 2 +- t/t9210-scalar.sh | 34 +- t/t9211-scalar-clone.sh | 16 +- t/t9300-fast-import.sh | 10 +- t/t9350-fast-export.sh | 54 +-- t/t9351-fast-export-anonymize.sh | 36 +- t/t9400-git-cvsserver-server.sh | 4 +- t/t9501-gitweb-standalone-http-status.sh | 58 ++-- t/t9502-gitweb-standalone-parse-output.sh | 38 +- t/t9800-git-p4-basic.sh | 10 +- t/t9801-git-p4-branch.sh | 48 +-- t/t9806-git-p4-options.sh | 10 +- t/t9807-git-p4-submit.sh | 2 +- t/t9810-git-p4-rcs.sh | 8 +- t/t9813-git-p4-preserve-users.sh | 8 +- t/t9814-git-p4-rename.sh | 8 +- t/t9827-git-p4-change-filetype.sh | 4 +- t/t9832-unshelve.sh | 6 +- t/t9833-errors.sh | 4 +- t/t9835-git-p4-metadata-encoding-python2.sh | 36 +- t/t9836-git-p4-metadata-encoding-python3.sh | 38 +- t/t9850-shell.sh | 2 +- t/t9902-completion.sh | 26 +- 351 files changed, 3215 insertions(+), 2853 deletions(-) create mode 100644 t/lint-style/grep-assert.expect create mode 100644 t/lint-style/grep-assert.test create mode 100644 t/lint-style/grep-fix.expect create mode 100644 t/lint-style/grep-fix.test create mode 100644 t/lint-style/grep-missing-file.expect create mode 100644 t/lint-style/grep-missing-file.test create mode 100644 t/lint-style/grep-negated.expect create mode 100644 t/lint-style/grep-negated.test create mode 100644 t/lint-style/grep-not-assert.expect create mode 100644 t/lint-style/grep-not-assert.test diff --git a/t/Makefile b/t/Makefile index 3a5fa4ce37a116..94921955114029 100644 --- a/t/Makefile +++ b/t/Makefile @@ -164,8 +164,10 @@ test-lint-shell-syntax: check-shell-parser: @'$(PERL_PATH_SQ)' check-shell-parser.pl +TSOURCED = $(sort $(wildcard t[0-9]*/*.sh)) + test-lint-style: - @'$(PERL_PATH_SQ)' lint-style.pl $(T) $(THELPERS) $(TPERF) + @'$(PERL_PATH_SQ)' lint-style.pl $(T) $(THELPERS) $(TPERF) $(TSOURCED) check-lint-style: @rc=0; for t in $(LINT_STYLE_TESTS); do \ diff --git a/t/for-each-ref-tests.sh b/t/for-each-ref-tests.sh index bd2d45c9719f06..6b359d940e9267 100644 --- a/t/for-each-ref-tests.sh +++ b/t/for-each-ref-tests.sh @@ -523,7 +523,7 @@ test_expect_success 'Verify descending sort' ' test_expect_success 'Give help even with invalid sort atoms' ' test_expect_code 129 ${git_for_each_ref} --sort=bogus -h >actual 2>&1 && - grep "^usage: ${git_for_each_ref}" actual + test_grep "^usage: ${git_for_each_ref}" actual ' cat >expected <<\EOF @@ -622,7 +622,7 @@ test_expect_success 'Quoting style: tcl' ' for i in "--perl --shell" "-s --python" "--python --tcl" "--tcl --perl"; do test_expect_success "more than one quoting style: $i" " test_must_fail ${git_for_each_ref} $i 2>err && - grep '^error: more than one quoting style' err + test_grep '^error: more than one quoting style' err " done @@ -1892,7 +1892,7 @@ test_expect_success "${git_for_each_ref} --stdin: fails if extra args" ' >in && test_must_fail ${git_for_each_ref} --format="%(refname)" \ --stdin refs/heads/extra err && - grep "unknown arguments supplied with --stdin" err + test_grep "unknown arguments supplied with --stdin" err ' test_expect_success "${git_for_each_ref} --stdin: matches" ' @@ -1955,11 +1955,11 @@ test_expect_success "${git_for_each_ref} with nested tags" ' test_expect_success 'is-base atom with non-commits' ' ${git_for_each_ref} --format="%(is-base:HEAD) %(refname)" >out 2>err && - grep "(HEAD) refs/heads/main" out && + test_grep "(HEAD) refs/heads/main" out && test_line_count = 2 err && - grep "error: object .* is a commit, not a blob" err && - grep "error: bad tag pointer to" err + test_grep "error: object .* is a commit, not a blob" err && + test_grep "error: bad tag pointer to" err ' GRADE_FORMAT="%(signature:grade)%0a%(signature:key)%0a%(signature:signer)%0a%(signature:fingerprint)%0a%(signature:primarykeyfingerprint)" diff --git a/t/lib-bitmap.sh b/t/lib-bitmap.sh index 62aa6744a695f5..2de6646128d87b 100644 --- a/t/lib-bitmap.sh +++ b/t/lib-bitmap.sh @@ -173,7 +173,7 @@ rev_list_tests_head () { test_expect_success "bitmap --objects handles non-commit objects ($state, $branch)" ' git rev-list --objects --use-bitmap-index $branch tagged-blob >actual && - grep $blob actual + test_grep $blob actual ' } @@ -242,16 +242,16 @@ basic_bitmap_tests () { GIT_PROGRESS_DELAY=0 \ git pack-objects --all --stdout --progress \ /dev/null 2>stderr && - grep "Enumerating objects: $count, done" stderr && - grep "pack-reused $count" stderr && + test_grep "Enumerating objects: $count, done" stderr && + test_grep "pack-reused $count" stderr && # now the same but with one non-reused object git commit --allow-empty -m "an extra commit object" && GIT_PROGRESS_DELAY=0 \ git pack-objects --all --stdout --progress \ /dev/null 2>stderr && - grep "Enumerating objects: $((count+1)), done" stderr && - grep "pack-reused $count" stderr + test_grep "Enumerating objects: $((count+1)), done" stderr && + test_grep "pack-reused $count" stderr ' } @@ -283,7 +283,7 @@ test_rev_exists () { then test_path_is_file $midx-$(midx_checksum $objdir).rev fi && - grep "\"category\":\"load_midx_revindex\",\"key\":\"source\",\"value\":\"$kind\"" event.trace + test_grep "\"category\":\"load_midx_revindex\",\"key\":\"source\",\"value\":\"$kind\"" event.trace ' } diff --git a/t/lib-bundle-uri-protocol.sh b/t/lib-bundle-uri-protocol.sh index de09b6b02e2485..ecf32842973797 100644 --- a/t/lib-bundle-uri-protocol.sh +++ b/t/lib-bundle-uri-protocol.sh @@ -63,9 +63,9 @@ test_expect_success "connect with $BUNDLE_URI_PROTOCOL:// using protocol v2: no >actual 2>err && # Server responded using protocol v2 - grep "< version 2" log && + test_grep "< version 2" log && - ! grep bundle-uri log + test_grep ! bundle-uri log ' test_expect_success "connect with $BUNDLE_URI_PROTOCOL:// using protocol v2: have bundle-uri" ' @@ -78,10 +78,10 @@ test_expect_success "connect with $BUNDLE_URI_PROTOCOL:// using protocol v2: hav >actual 2>err && # Server responded using protocol v2 - grep "< version 2" log && + test_grep "< version 2" log && # Server advertised bundle-uri capability - grep "< bundle-uri" log + test_grep "< bundle-uri" log ' test_expect_success "clone with $BUNDLE_URI_PROTOCOL:// using protocol v2: request bundle-uris" ' @@ -95,13 +95,13 @@ test_expect_success "clone with $BUNDLE_URI_PROTOCOL:// using protocol v2: reque >actual 2>err && # Server responded using protocol v2 - grep "< version 2" log && + test_grep "< version 2" log && # Server advertised bundle-uri capability - grep "< bundle-uri" log && + test_grep "< bundle-uri" log && # Client did not issue bundle-uri command - ! grep "> command=bundle-uri" log && + test_grep ! "> command=bundle-uri" log && GIT_TRACE_PACKET="$PWD/log" \ git \ @@ -111,13 +111,13 @@ test_expect_success "clone with $BUNDLE_URI_PROTOCOL:// using protocol v2: reque >actual 2>err && # Server responded using protocol v2 - grep "< version 2" log && + test_grep "< version 2" log && # Server advertised bundle-uri capability - grep "< bundle-uri" log && + test_grep "< bundle-uri" log && # Client issued bundle-uri command - grep "> command=bundle-uri" log && + test_grep "> command=bundle-uri" log && GIT_TRACE_PACKET="$PWD/log3" \ git \ @@ -128,13 +128,13 @@ test_expect_success "clone with $BUNDLE_URI_PROTOCOL:// using protocol v2: reque >actual 2>err && # Server responded using protocol v2 - grep "< version 2" log3 && + test_grep "< version 2" log3 && # Server advertised bundle-uri capability - grep "< bundle-uri" log3 && + test_grep "< bundle-uri" log3 && # Client did not issue bundle-uri command (--bundle-uri override) - ! grep "> command=bundle-uri" log3 + test_grep ! "> command=bundle-uri" log3 ' # The remaining tests will all assume transfer.bundleURI=true diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh index fc646447d5c038..a216e5376fd7de 100644 --- a/t/lib-httpd.sh +++ b/t/lib-httpd.sh @@ -275,7 +275,7 @@ test_http_push_nonff () { ' test_expect_success 'non-fast-forward push show ref status' ' - grep "^ ! \[rejected\][ ]*$BRANCH -> $BRANCH (non-fast-forward)$" output + test_grep "^ ! \[rejected\][ ]*$BRANCH -> $BRANCH (non-fast-forward)$" output ' test_expect_success 'non-fast-forward push shows help message' ' diff --git a/t/lint-style.pl b/t/lint-style.pl index 9268577f9b6ba9..8b0b44c1466bd6 100755 --- a/t/lint-style.pl +++ b/t/lint-style.pl @@ -7,6 +7,11 @@ # Detection uses parsed tokens from the shared shell parser for # correct handling of heredocs, $(...), pipes, and quoting. # Fixes modify the original file text to preserve formatting. +# +# Architecture: the harness (LintParser, parse_commands) tokenizes +# test bodies and splits them into commands. Rules are independent +# functions that examine each command and its surrounding token +# context to decide if there is a violation. use strict; use warnings; @@ -31,10 +36,10 @@ # on each test body. Per-file state (file name, raw lines, dirty # flag) is stored on the instance before calling parse(). # -# Subroutines defined below (parse_commands, check_test_grep_negation, -# etc.) are in package main and called with the main:: prefix. -# File-scoped lexicals ($fix_mode, $has_fixable, etc.) are visible -# across packages since 'package' does not introduce a new scope. +# Subroutines defined below are in package main and called with +# the main:: prefix. File-scoped lexicals ($fix_mode, etc.) are +# visible across packages since 'package' does not introduce a +# new scope. package LintParser; our @ISA = ('ScriptParser'); @@ -43,6 +48,9 @@ package main; my $exit_code = 0; my $has_fixable = 0; +my %skip_file = map { $_ => 1 } + grep { m{(?:test-lib-functions|lib-rebase)\.sh$} } @ARGV; + sub err { my ($file, $lineno, $line, $msg, %opts) = @_; $line =~ s/^\s+//; @@ -53,9 +61,8 @@ sub err { $exit_code = 1 unless $fix_mode && $opts{fixable}; } -# Report a lint violation found by a rule. In --fix mode, apply -# the regex substitution on the raw line and report success. -# Otherwise just report. Returns 1 if the line was modified. +# Report a lint violation. In --fix mode, apply the regex +# substitution on the raw line. Returns 1 if modified. sub report_violation { my ($file, $cmd, $line_ref, $match, $fix, $from) = @_; my $lineno = $cmd->{lineno}; @@ -77,46 +84,70 @@ sub report_violation { return 0; } +# --- Harness: tokenize and split into commands --- +# # Split a token stream into commands at &&, ||, ;;, and \n. +# Each command is {tokens => [...], lineno => N, token_pos => I} +# where token_pos is the index in @all_tokens where the command's +# first token appeared (so rules can look backward for context). sub parse_commands { - my ($content) = @_; - my $parser = ShellParser->new(\$content); - my @all_tokens = $parser->parse(); - + my ($all_tokens) = @_; my @commands; my @current; my $lineno = 1; + my $first_pos = 0; + + my %shell_keyword; + @shell_keyword{qw(if then else elif fi for do done + while until case in esac)} = (); - for (my $ti = 0; $ti < @all_tokens; $ti++) { - my $text = $all_tokens[$ti]->[0]; + for (my $ti = 0; $ti < @$all_tokens; $ti++) { + my $text = $all_tokens->[$ti]->[0]; if ($text =~ /^(?:&&|\|\||;;|\n)$/) { + # Command separators: flush current command + if (@current) { + push @commands, { + tokens => [@current], + lineno => $lineno, + token_pos => $first_pos, + }; + @current = (); + } + } elsif ($text =~ /^[{}()|]$/ || exists $shell_keyword{$text}) { + # Shell structural tokens and keywords: + # flush current command (these are boundaries, + # not part of the command's arguments) if (@current) { push @commands, { - tokens => [@current], - lineno => $lineno, + tokens => [@current], + lineno => $lineno, + token_pos => $first_pos, }; @current = (); } } else { - $lineno = $all_tokens[$ti]->[3] - if !@current && defined $all_tokens[$ti]->[3]; + if (!@current) { + # Record line number of the first token + $lineno = $all_tokens->[$ti]->[3] + if defined $all_tokens->[$ti]->[3]; + $first_pos = $ti; + } push @current, $text; } } if (@current) { push @commands, { - tokens => [@current], - lineno => $lineno, + tokens => [@current], + lineno => $lineno, + token_pos => $first_pos, }; } return @commands; } # --- Rule: '! test_grep' should be 'test_grep !' --- -# Shell-level negation suppresses test_grep's diagnostic output -# on failure. Built-in negation preserves it. sub check_test_grep_negation { - my ($cmd, $file, $line_ref) = @_; + my ($cmd, $file, $line_ref, $all_tokens) = @_; my @tokens = @{$cmd->{tokens}}; return unless @tokens >= 2 && $tokens[0] eq '!' && $tokens[1] eq 'test_grep'; @@ -124,15 +155,197 @@ sub check_test_grep_negation { qr/!\s*test_grep/, 'test_grep !', '! test_grep'); } -# Map parsed commands back to raw file lines for --fix. -# Detection uses parsed tokens (correct handling of quoting, -# heredocs, pipes) but fixes must modify the original text -# to preserve formatting. +# --- Rule: bare 'grep' should be 'test_grep' --- + +# Check if this command is in a filter context by looking at +# the surrounding tokens in the stream. This is grep-rule +# specific: it knows what contexts make a grep not an assertion. +sub is_filter_context { + my ($all_tokens, $cmd) = @_; + my $pos = $cmd->{token_pos}; + + # Scan backward to the previous command separator. + # If we find '|', this command is part of a pipeline. + # If we find if/elif/while/until, it's a condition. + for (my $j = $pos - 1; $j >= 0; $j--) { + my $t = $all_tokens->[$j]->[0]; + # Stop at command separators (but not \n after |) + last if $t =~ /^(?:&&|\|\||;;)$/; + if ($t eq "\n") { + # \n after | is a line continuation, keep scanning + next if $j > 0 && $all_tokens->[$j - 1]->[0] eq '|'; + last; + } + return 1 if $t eq '|'; + return 1 if $t =~ /^(?:if|elif|while|until)$/; + # for ... in ITEMS ... do: if we're between 'in' and 'do', + # we're in a value list, not a command + return 1 if $t eq 'in'; + } + + # Forward: pipe after command + for (my $j = $pos + @{$cmd->{tokens}}; $j < @$all_tokens; $j++) { + my $t = $all_tokens->[$j]->[0]; + last if $t =~ /^(?:&&|\|\||;;|\n)$/; + return 1 if $t eq '|'; + } + + # { cmd; } >output + return 1 if is_in_redirected_brace($all_tokens, $pos); + + return 0; +} + +# Check if position $pos is inside a brace group whose output is +# redirected: { grep ...; } >file. Scan backward for the enclosing +# '{', then forward for the matching '}', and check what follows it. +sub is_in_redirected_brace { + my ($all_tokens, $pos) = @_; + my $brace_depth = 0; + for (my $j = $pos - 1; $j >= 0; $j--) { + my $t = $all_tokens->[$j]->[0]; + $brace_depth++ if $t eq '}'; + if ($t eq '{') { + return 0 if $brace_depth > 0; + $brace_depth--; + # Found our enclosing '{'. Find matching '}' + my $depth = 1; + for (my $k = $j + 1; $k < @$all_tokens; $k++) { + $depth++ if $all_tokens->[$k]->[0] eq '{'; + $depth-- if $all_tokens->[$k]->[0] eq '}'; + if ($depth == 0) { + my $after = $k + 1 < @$all_tokens ? + $all_tokens->[$k + 1]->[0] : ''; + return $after =~ /^>{1,2}/; + } + } + return 0; + } + } + return 0; +} + +# Classify a grep command: assertion, filter, or bug. +# +# Returns: +# 1 assertion (PATTERN + FILE), can be converted to test_grep +# 0 not a grep, or grep used as a filter +# -1 likely bug (e.g., missing file argument) +sub is_grep_assertion { + my ($cmd, $all_tokens) = @_; + my @tokens = @{$cmd->{tokens}}; + + # Find grep, possibly after "!" + my $i = 0; + $i++ if $tokens[0] eq '!'; + return 0 unless defined $tokens[$i] && $tokens[$i] eq 'grep'; + return 0 if grep { $_ eq 'test_grep' } @tokens; + + # Check surrounding context (pipes, control flow, brace redirects) + return 0 if is_filter_context($all_tokens, $cmd); + + $i++; # skip 'grep' + + # Check grep's own flags and arguments + my @positional; + my $has_pattern_flag = 0; + my $end_of_flags = 0; + while ($i < @tokens) { + my $tok = $tokens[$i]; + if ($tok eq '|' || $tok eq '<') { + return 0; + } + if ($tok =~ /^>{1,2}$/) { + # Stdout redirect means filter (grep ... >out). + # Stderr redirect (2>err) is fine: skip the fd + # and the target, and keep classifying. + my $prev = $i > 0 ? $tokens[$i - 1] : ''; + return 0 unless $prev =~ /^\d+$/ && $prev >= 2; + pop @positional if @positional && $positional[-1] eq $prev; + $i += 2; + next; + } + if (!$end_of_flags && $tok =~ /^-\w*[clLrR]/) { + return 0; + } + if (!$end_of_flags && $tok eq '--') { + $end_of_flags = 1; + } elsif (!$end_of_flags && $tok =~ /^-\w*[ef]$/) { + $has_pattern_flag = 1; + $i++; + } elsif (!$end_of_flags && $tok =~ /^-/) { + # skip other flags + } else { + push @positional, $tok; + } + $i++; + } + + my $need = $has_pattern_flag ? 1 : 2; + return 0 if !@positional && !$has_pattern_flag; + return -1 if @positional < $need; + return 0 if $positional[-1] =~ /^-/; + return 1; +} + +sub check_bare_grep { + my ($cmd, $file, $line_ref, $all_tokens) = @_; + my @tokens = @{$cmd->{tokens}}; + + my $result = is_grep_assertion($cmd, $all_tokens); + return unless $result; + + if ($result == -1) { + err $file, $cmd->{lineno}, join(' ', @tokens), + "grep assertion appears to be missing a file argument"; + return 0; + } + + # Determine negation and -q flag + my $negated = $tokens[0] eq '!'; + my $has_q = 0; + my ($pre_q, $post_q) = ('', ''); + for my $tok (@tokens) { + if ($tok =~ /^-(\w*)q(\w*)$/) { + $has_q = 1; + ($pre_q, $post_q) = ($1, $2); + last; + } + last if $tok !~ /^-/ && $tok ne '!' && $tok ne 'grep'; + } + + # Build the replacement + my $fix = "test_grep"; + $fix .= " !" if $negated; + if ($has_q) { + my $rest = "$pre_q$post_q"; + $fix .= " -$rest" if $rest; + } + + # Build the match pattern + my $neg_match = $negated ? '!\s*' : '\b'; + my $neg_from = $negated ? '! ' : ''; + my ($match, $from); + if ($has_q) { + $match = qr/${neg_match}grep\s+-\w*q\w*/; + $from = "${neg_from}grep -${pre_q}q${post_q}"; + } else { + $match = qr/${neg_match}grep\b/; + $from = "${neg_from}grep"; + } + + return report_violation($file, $cmd, $line_ref, + $match, $fix, $from); +} + +# --- Harness: LintParser.check_test --- +# +# Called by ScriptParser::parse_cmd for each test_expect_success +# or test_expect_failure block. Extracts the body, tokenizes it, +# splits into commands, and runs each rule. package LintParser; sub check_test { - # Called by ScriptParser::parse_cmd for each test_expect_success - # or test_expect_failure block. my $self = shift @_; my $title = ScriptParser::unwrap(shift @_); @@ -157,25 +370,37 @@ sub check_test { } return unless $body; + # Tokenize the body once; commands and rules share the stream + my $parser = ShellParser->new(\$body); + my @all_tokens = $parser->parse(); + my @commands = main::parse_commands(\@all_tokens); + # Map each command back to its file line number. # $lineno_base is where the body starts in the file; # $cmd->{lineno} is relative to the body (starting at 1). my $raw_lines = $self->{raw_lines}; - for my $cmd (main::parse_commands($body)) { + for my $cmd (@commands) { my $ln = ($cmd->{lineno} || 0) + $lineno_base - 1; $cmd->{lineno} = $ln; next unless $ln >= 1 && $ln <= @$raw_lines; next if $raw_lines->[$ln - 1] =~ /#.*lint-ok/; - if (main::check_test_grep_negation($cmd, $self->{file}, \$raw_lines->[$ln - 1])) { - $self->{dirty} = 1; - } + my $line_ref = \$raw_lines->[$ln - 1]; + # Stop after the first fix: later rules should not + # re-match against already-modified text. + my $modified = 0; + $modified ||= main::check_test_grep_negation( + $cmd, $self->{file}, $line_ref, \@all_tokens); + $modified ||= main::check_bare_grep( + $cmd, $self->{file}, $line_ref, \@all_tokens); + $self->{dirty} = 1 if $modified; } } package main; for my $file (@ARGV) { + next if $skip_file{$file}; # :unix:crlf strips \r on Windows (same as chainlint.pl) open(my $fh, '<:unix:crlf', $file) or die "$0: $file: $!\n"; my @raw_lines = <$fh>; diff --git a/t/lint-style/grep-assert.expect b/t/lint-style/grep-assert.expect new file mode 100644 index 00000000000000..93c518ed43ed83 --- /dev/null +++ b/t/lint-style/grep-assert.expect @@ -0,0 +1,13 @@ +lint-style/grep-assert.test:2: error: replace 'grep' with 'test_grep': grep "pattern" actual +lint-style/grep-assert.test:3: error: replace 'grep' with 'test_grep': grep -E "extended" actual +lint-style/grep-assert.test:4: error: replace 'grep' with 'test_grep': grep -e "explicit" actual +lint-style/grep-assert.test:5: error: replace 'grep' with 'test_grep': grep -f patterns.txt actual +lint-style/grep-assert.test:6: error: replace 'grep' with 'test_grep': grep -Fe "fixed-explicit" actual +lint-style/grep-assert.test:7: error: replace 'grep' with 'test_grep': grep "^-looks-like-flag" actual +lint-style/grep-assert.test:8: error: replace 'grep' with 'test_grep': grep -v "inverted" actual +lint-style/grep-assert.test:9: error: replace 'grep' with 'test_grep': grep -- "-e" actual +lint-style/grep-assert.test:10: error: replace 'grep' with 'test_grep': grep "with-stderr-redirect" actual 2 > err +lint-style/grep-assert.test:12: error: replace 'grep' with 'test_grep': grep "after-or" actual +lint-style/grep-assert.test:17: error: replace 'grep' with 'test_grep': grep "after-pipe" actual +lint-style/grep-assert.test:22: error: replace 'grep' with 'test_grep': grep "inside-case" actual +hint: run with --fix to apply the suggested replacements. diff --git a/t/lint-style/grep-assert.test b/t/lint-style/grep-assert.test new file mode 100644 index 00000000000000..1567285754009d --- /dev/null +++ b/t/lint-style/grep-assert.test @@ -0,0 +1,24 @@ +test_expect_success 'grep assertions' ' + grep "pattern" actual && + grep -E "extended" actual && + grep -e "explicit" actual && + grep -f patterns.txt actual && + grep -Fe "fixed-explicit" actual && + grep "^-looks-like-flag" actual && + grep -v "inverted" actual && + grep -- "-e" actual && + grep "with-stderr-redirect" actual 2>err && + cmd || + grep "after-or" actual +' + +test_expect_success 'pipe only suppresses first command' ' + cmd | + grep "piped" && grep "after-pipe" actual +' + +test_expect_success 'case pattern does not hide assertion' ' + case foo in + *) grep "inside-case" actual ;; + esac +' diff --git a/t/lint-style/grep-fix.expect b/t/lint-style/grep-fix.expect new file mode 100644 index 00000000000000..04849634c6c24d --- /dev/null +++ b/t/lint-style/grep-fix.expect @@ -0,0 +1,16 @@ +test_expect_success 'all fixable forms' ' + test_grep "pattern" actual && + test_grep -E "extended" actual && + test_grep "quiet" actual && + test_grep -F "combined" actual && + test_grep -i "quiet-insensitive" actual && + test_grep ! "negated" actual && + test_grep ! "neg-quiet" actual && + test_grep ! "shell-neg" actual && + test_grep -e "explicit" actual && + test_grep -Fe "fixed-explicit" actual && + test_grep -f patterns.txt actual && + test_grep -- "-e" actual && + test_grep "continuation" \ + actual +' diff --git a/t/lint-style/grep-fix.test b/t/lint-style/grep-fix.test new file mode 100644 index 00000000000000..a9202fc177ccf8 --- /dev/null +++ b/t/lint-style/grep-fix.test @@ -0,0 +1,16 @@ +test_expect_success 'all fixable forms' ' + grep "pattern" actual && + grep -E "extended" actual && + grep -q "quiet" actual && + grep -qF "combined" actual && + grep -qi "quiet-insensitive" actual && + ! grep "negated" actual && + ! grep -q "neg-quiet" actual && + ! test_grep "shell-neg" actual && + grep -e "explicit" actual && + grep -Fe "fixed-explicit" actual && + grep -f patterns.txt actual && + grep -- "-e" actual && + grep "continuation" \ + actual +' diff --git a/t/lint-style/grep-missing-file.expect b/t/lint-style/grep-missing-file.expect new file mode 100644 index 00000000000000..8d4dc585b565c8 --- /dev/null +++ b/t/lint-style/grep-missing-file.expect @@ -0,0 +1,4 @@ +lint-style/grep-missing-file.test:2: error: grep assertion appears to be missing a file argument: grep "pattern" +lint-style/grep-missing-file.test:3: error: grep assertion appears to be missing a file argument: ! grep "negated" +lint-style/grep-missing-file.test:4: error: grep assertion appears to be missing a file argument: grep -e "pattern-flag-no-file" +lint-style/grep-missing-file.test:5: error: grep assertion appears to be missing a file argument: grep -f patterns.txt diff --git a/t/lint-style/grep-missing-file.test b/t/lint-style/grep-missing-file.test new file mode 100644 index 00000000000000..aac0528dfcf3e4 --- /dev/null +++ b/t/lint-style/grep-missing-file.test @@ -0,0 +1,6 @@ +test_expect_success 'grep missing file argument' ' + grep "pattern" && + ! grep "negated" && + grep -e "pattern-flag-no-file" && + grep -f patterns.txt +' diff --git a/t/lint-style/grep-negated.expect b/t/lint-style/grep-negated.expect new file mode 100644 index 00000000000000..7029b5544a3d89 --- /dev/null +++ b/t/lint-style/grep-negated.expect @@ -0,0 +1,5 @@ +lint-style/grep-negated.test:2: error: replace '! grep' with 'test_grep !': ! grep "pattern" actual +lint-style/grep-negated.test:3: error: replace '! grep' with 'test_grep !': ! grep -i "insensitive" actual +lint-style/grep-negated.test:7: error: replace '! grep -q' with 'test_grep !': ! grep -q "pattern" actual +lint-style/grep-negated.test:8: error: replace '! grep -qF' with 'test_grep ! -F': ! grep -qF "combined" actual +hint: run with --fix to apply the suggested replacements. diff --git a/t/lint-style/grep-negated.test b/t/lint-style/grep-negated.test new file mode 100644 index 00000000000000..862a93b93b8b55 --- /dev/null +++ b/t/lint-style/grep-negated.test @@ -0,0 +1,9 @@ +test_expect_success 'negated grep' ' + ! grep "pattern" actual && + ! grep -i "insensitive" actual +' + +test_expect_success 'negated grep -q' ' + ! grep -q "pattern" actual && + ! grep -qF "combined" actual +' diff --git a/t/lint-style/grep-not-assert.expect b/t/lint-style/grep-not-assert.expect new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/t/lint-style/grep-not-assert.test b/t/lint-style/grep-not-assert.test new file mode 100644 index 00000000000000..a2c38ae4b1a802 --- /dev/null +++ b/t/lint-style/grep-not-assert.test @@ -0,0 +1,43 @@ +test_expect_success 'grep used as filter (not assertion)' ' + grep "pattern" file | wc -l && + grep "pattern" file >output && + grep "pattern" file 1>output && + grep -c "count" file && + grep -ci "count-insensitive" file && + grep -l "list" file && + grep -rl "recursive-list" dir && + grep -L "list-without" file1 file2 && + result=$(grep "pattern" file) && + result=$(echo $(grep "nested-subshell" file)) && + grep "pattern" result +' + +test_expect_success 'grep in for-in value list' ' + for cmd in grep sed awk; do + echo "$cmd" + done +' + +test_expect_success 'grep in subshell' ' + (cd sub && grep "pattern" file >output) && + (cmd | grep "piped-in-subshell") +' diff --git a/t/pack-refs-tests.sh b/t/pack-refs-tests.sh index d76b087b090e75..a8001774462c37 100644 --- a/t/pack-refs-tests.sh +++ b/t/pack-refs-tests.sh @@ -195,7 +195,7 @@ test_expect_success 'delete ref while another dangling packed ref' ' test_expect_success 'pack ref directly below refs/' ' git update-ref refs/top HEAD && git ${pack_refs} --all --prune && - grep refs/top .git/packed-refs && + test_grep refs/top .git/packed-refs && test_path_is_missing .git/refs/top ' diff --git a/t/show-ref-exists-tests.sh b/t/show-ref-exists-tests.sh index 36e8e9df33ac37..1351f690eb57e2 100644 --- a/t/show-ref-exists-tests.sh +++ b/t/show-ref-exists-tests.sh @@ -19,7 +19,7 @@ test_expect_success '--exists with missing reference' ' test_expect_success '--exists does not use DWIM' ' test_expect_code 2 ${git_show_ref_exists} $GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME 2>err && - grep "reference does not exist" err + test_grep "reference does not exist" err ' test_expect_success '--exists with HEAD' ' diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh index 2b63e1c86cae30..7bd1f4e7b7ccfd 100755 --- a/t/t0000-basic.sh +++ b/t/t0000-basic.sh @@ -743,7 +743,7 @@ test_expect_success 'subtest: lazy prereqs do not turn off tracing' ' test_done EOF - grep "echo trace" lazy-prereq-and-tracing/err + test_grep "echo trace" lazy-prereq-and-tracing/err ' test_expect_success 'subtest: tests clean up after themselves' ' @@ -815,7 +815,7 @@ test_expect_success 'subtest: test_atexit is run' ' test_expect_success 'test_oid provides sane info by default' ' test_oid zero >actual && - grep "^00*\$" actual && + test_grep "^00*\$" actual && rawsz="$(test_oid rawsz)" && hexsz="$(test_oid hexsz)" && # +1 accounts for the trailing newline @@ -827,7 +827,7 @@ test_expect_success 'test_oid can look up data for SHA-1' ' test_when_finished "test_detect_hash" && test_set_hash sha1 && test_oid zero >actual && - grep "^00*\$" actual && + test_grep "^00*\$" actual && rawsz="$(test_oid rawsz)" && hexsz="$(test_oid hexsz)" && test $(wc -c actual && - grep "^00*\$" actual && + test_grep "^00*\$" actual && rawsz="$(test_oid rawsz)" && hexsz="$(test_oid hexsz)" && test $(wc -c err && - grep "error: test_bool_env requires bool values" err && + test_grep "error: test_bool_env requires bool values" err && envvar=true && ! ( test_bool_env envvar invalid ) 7>err && - grep "error: test_bool_env requires bool values" err + test_grep "error: test_bool_env requires bool values" err ) ' @@ -1242,12 +1242,12 @@ test_expect_success 'test_must_fail on a failing git command with env' ' test_expect_success 'test_must_fail rejects a non-git command' ' ! test_must_fail grep ^$ notafile 2>err && - grep -F "test_must_fail: only '"'"'git'"'"' is allowed" err + test_grep -F "test_must_fail: only '"'"'git'"'"' is allowed" err ' test_expect_success 'test_must_fail rejects a non-git command with env' ' ! test_must_fail env var1=a var2=b grep ^$ notafile 2>err && - grep -F "test_must_fail: only '"'"'git'"'"' is allowed" err + test_grep -F "test_must_fail: only '"'"'git'"'"' is allowed" err ' test_done diff --git a/t/t0001-init.sh b/t/t0001-init.sh index e4d32bb4d259f6..7dcd1e9d48a11a 100755 --- a/t/t0001-init.sh +++ b/t/t0001-init.sh @@ -278,9 +278,9 @@ test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shar git init --bare --shared=0660 newdir/a/b/c && test_path_is_dir newdir/a/b/c/refs && ls -ld newdir/a newdir/a/b > lsab.out && - ! grep -v "^drwxrw[sx]r-x" lsab.out && + test_grep ! -v "^drwxrw[sx]r-x" lsab.out && ls -ld newdir/a/b/c > lsc.out && - ! grep -v "^drwxrw[sx]---" lsc.out + test_grep ! -v "^drwxrw[sx]---" lsc.out ) ' @@ -619,7 +619,7 @@ test_expect_success DEFAULT_REPO_FORMAT 'extensions.refStorage is not allowed wi git init refstorage && git -C refstorage config extensions.refStorage files && test_must_fail git -C refstorage rev-parse 2>err && - grep "repo version is 0, but v1-only extension found" err + test_grep "repo version is 0, but v1-only extension found" err ' test_expect_success DEFAULT_REPO_FORMAT 'extensions.refStorage with files backend' ' @@ -637,7 +637,7 @@ test_expect_success DEFAULT_REPO_FORMAT 'extensions.refStorage with unknown back git -C refstorage config core.repositoryformatversion 1 && git -C refstorage config extensions.refStorage garbage && test_must_fail git -C refstorage rev-parse 2>err && - grep "invalid value for ${SQ}extensions.refstorage${SQ}: ${SQ}garbage${SQ}" err + test_grep "invalid value for ${SQ}extensions.refstorage${SQ}: ${SQ}garbage${SQ}" err ' test_expect_success 'init with GIT_DEFAULT_REF_FORMAT=garbage' ' @@ -848,8 +848,8 @@ test_expect_success MINGW 'redirect std handles' ' GIT_REDIRECT_STDOUT=output.txt \ GIT_REDIRECT_STDERR="2>&1" \ git rev-parse --git-dir --verify refs/invalid && - grep "^\\.git\$" output.txt && - grep "Needed a single revision" output.txt + test_grep "^\\.git\$" output.txt && + test_grep "Needed a single revision" output.txt ' test_expect_success '--initial-branch' ' @@ -862,14 +862,14 @@ test_expect_success '--initial-branch' ' git init --initial-branch=ignore initial-branch-option 2>err && test_grep "ignored --initial-branch" err && git -C initial-branch-option symbolic-ref HEAD >actual && - grep hello actual + test_grep hello actual ' test_expect_success 'overridden default initial branch name (config)' ' test_config_global init.defaultBranch nmb && GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= git init initial-branch-config && git -C initial-branch-config symbolic-ref HEAD >actual && - grep nmb actual + test_grep nmb actual ' test_expect_success 'advice on unconfigured init.defaultBranch' ' @@ -907,7 +907,7 @@ test_expect_success 'overridden default main branch name (env)' ' test_config_global init.defaultBranch nmb && GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=env git init main-branch-env && git -C main-branch-env symbolic-ref HEAD >actual && - grep env actual + test_grep env actual ' test_expect_success 'invalid default branch name' ' diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh index d77a179bddcbed..ed95faf3272e60 100755 --- a/t/t0008-ignores.sh +++ b/t/t0008-ignores.sh @@ -790,8 +790,8 @@ test_expect_success 'existing file and directory' ' >one && mkdir top-level-dir && git check-ignore one top-level-dir >actual && - grep one actual && - grep top-level-dir actual + test_grep one actual && + test_grep top-level-dir actual ' test_expect_success 'existing directory and file' ' @@ -800,8 +800,8 @@ test_expect_success 'existing directory and file' ' >one && mkdir top-level-dir && git check-ignore top-level-dir one >actual && - grep one actual && - grep top-level-dir actual + test_grep one actual && + test_grep top-level-dir actual ' test_expect_success 'exact prefix matching (with root)' ' diff --git a/t/t0009-git-dir-validation.sh b/t/t0009-git-dir-validation.sh index 33d21ed9ea1061..4cba478e50e712 100755 --- a/t/t0009-git-dir-validation.sh +++ b/t/t0009-git-dir-validation.sh @@ -35,7 +35,7 @@ test_expect_success PIPE 'setup: .git as a FIFO (named pipe) is rejected' ' cd parent/fifo-trap && mkfifo .git && test_must_fail git rev-parse --git-dir 2>stderr && - grep "not a regular file" stderr + test_grep "not a regular file" stderr ) ' @@ -47,7 +47,7 @@ test_expect_success SYMLINKS,PIPE 'setup: .git as a symlink to a FIFO is rejecte mkfifo target-fifo && ln -s target-fifo .git && test_must_fail git rev-parse --git-dir 2>stderr && - grep "not a regular file" stderr + test_grep "not a regular file" stderr ) ' @@ -58,7 +58,7 @@ test_expect_success 'setup: .git with garbage content is rejected' ' cd parent/garbage-trap && echo "garbage" >.git && test_must_fail git rev-parse --git-dir 2>stderr && - grep "invalid gitfile format" stderr + test_grep "invalid gitfile format" stderr ) ' diff --git a/t/t0012-help.sh b/t/t0012-help.sh index c33501bdcd2b9b..48d128ad043ede 100755 --- a/t/t0012-help.sh +++ b/t/t0012-help.sh @@ -131,8 +131,8 @@ test_expect_success 'git help succeeds without git.html' ' test_expect_success 'git help --user-interfaces' ' git help --user-interfaces >help.output && - grep "^ attributes " help.output && - grep "^ mailmap " help.output + test_grep "^ attributes " help.output && + test_grep "^ mailmap " help.output ' test_expect_success 'git help -c' ' diff --git a/t/t0013-sha1dc.sh b/t/t0013-sha1dc.sh index ce3d81227a0f0c..3ea3169d92ff7c 100755 --- a/t/t0013-sha1dc.sh +++ b/t/t0013-sha1dc.sh @@ -16,7 +16,7 @@ fi test_expect_success 'test-sha1 detects shattered pdf' ' test_must_fail test-tool sha1 <"$TEST_DATA/shattered-1.pdf" 2>err && test_grep collision err && - grep 38762cf7f55934b34d179ae6a4c80cadccbb7f0a err + test_grep 38762cf7f55934b34d179ae6a4c80cadccbb7f0a err ' test_done diff --git a/t/t0017-env-helper.sh b/t/t0017-env-helper.sh index 32fe8481792325..da02bce0ef5046 100755 --- a/t/t0017-env-helper.sh +++ b/t/t0017-env-helper.sh @@ -88,7 +88,7 @@ test_expect_success 'test-tool env-helper reads config thanks to trace2' ' test_must_fail \ env HOME="$(pwd)/home" \ git config -l 2>err && - grep "exceeded maximum include depth" err && + test_grep "exceeded maximum include depth" err && # This validates that the assumption that we attempt to # read the configuration and fail very early in the start-up @@ -100,7 +100,7 @@ test_expect_success 'test-tool env-helper reads config thanks to trace2' ' test-tool -C no-such-directory \ env-helper --type=bool --default=0 \ --exit-code GIT_TEST_ENV_HELPER 2>err && - grep "exceeded maximum include depth" err + test_grep "exceeded maximum include depth" err ' test_done diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh index f0d50d769e9fc5..50994a6ada04a4 100755 --- a/t/t0021-conversion.sh +++ b/t/t0021-conversion.sh @@ -731,7 +731,7 @@ test_expect_success 'process filter should restart after unexpected write failur rm -f debug.log && git checkout --quiet --no-progress . 2>git-stderr.log && - grep "smudge write error" git-stderr.log && + test_grep "smudge write error" git-stderr.log && test_grep "error: external filter" git-stderr.log && cat >expected.log <<-EOF && @@ -853,7 +853,7 @@ test_expect_success 'invalid process filter must fail (and not hang!)' ' cp "$TEST_ROOT/test.o" test.r && test_must_fail git add . 2>git-stderr.log && - grep "expected git-filter-server" git-stderr.log + test_grep "expected git-filter-server" git-stderr.log ) ' @@ -953,7 +953,7 @@ test_expect_success 'missing file in delayed checkout' ' rm -rf repo-cloned && test_must_fail git clone repo repo-cloned 2>git-stderr.log && - grep "error: .missing-delay\.a. was not filtered properly" git-stderr.log + test_grep "error: .missing-delay\.a. was not filtered properly" git-stderr.log ' test_expect_success 'invalid file in delayed checkout' ' @@ -974,7 +974,7 @@ test_expect_success 'invalid file in delayed checkout' ' rm -rf repo-cloned && test_must_fail git clone repo repo-cloned 2>git-stderr.log && - grep "error: external filter .* signaled that .unfiltered. is now available although it has not been delayed earlier" git-stderr.log + test_grep "error: external filter .* signaled that .unfiltered. is now available although it has not been delayed earlier" git-stderr.log ' for mode in 'case' 'utf-8' @@ -1015,7 +1015,7 @@ do git clone $mode-collision $mode-collision-cloned && # Make sure z was really delayed - grep "IN: smudge $dir/z .* \\[DELAYED\\]" $mode-collision-cloned/delayed.log && + test_grep "IN: smudge $dir/z .* \\[DELAYED\\]" $mode-collision-cloned/delayed.log && # Should not create $dir/z at $symlink/z test_path_is_missing $mode-collision/target-dir/z @@ -1053,7 +1053,7 @@ test_expect_success SYMLINKS,CASE_INSENSITIVE_FS \ git commit -m super && git checkout --recurse-submodules . && - grep "IN: smudge A/B/y .* \\[DELAYED\\]" delayed.log && + test_grep "IN: smudge A/B/y .* \\[DELAYED\\]" delayed.log && test_path_is_missing target-dir/y ) ' @@ -1144,9 +1144,9 @@ test_expect_success 'delayed checkout correctly reports the number of updated en rm *.a && git checkout . 2>err && - grep "IN: smudge test-delay10.a .* \\[DELAYED\\]" delayed.log && - grep "IN: smudge test-delay11.a .* \\[DELAYED\\]" delayed.log && - grep "Updated 2 paths from the index" err + test_grep "IN: smudge test-delay10.a .* \\[DELAYED\\]" delayed.log && + test_grep "IN: smudge test-delay11.a .* \\[DELAYED\\]" delayed.log && + test_grep "Updated 2 paths from the index" err ) ' diff --git a/t/t0029-core-unsetenvvars.sh b/t/t0029-core-unsetenvvars.sh index baa1b7e85b10b4..975620b3891b76 100755 --- a/t/t0029-core-unsetenvvars.sh +++ b/t/t0029-core-unsetenvvars.sh @@ -20,10 +20,10 @@ test_expect_success 'core.unsetenvvars works' ' HOBBES=Calvin && export HOBBES && git commit --allow-empty -m with 2>err && - grep Calvin err && + test_grep Calvin err && git -c core.unsetenvvars=FINDUS,HOBBES,CALVIN \ commit --allow-empty -m without 2>err && - ! grep Calvin err + test_grep ! Calvin err ' test_done diff --git a/t/t0030-stripspace.sh b/t/t0030-stripspace.sh index 43155f6bd86bf4..d6e2f63c595074 100755 --- a/t/t0030-stripspace.sh +++ b/t/t0030-stripspace.sh @@ -407,12 +407,12 @@ test_expect_success 'strip comments with changed comment string' ' test_expect_success 'newline as commentchar is forbidden' ' test_must_fail git -c core.commentChar="$LF" stripspace -s 2>err && - grep "core.commentchar cannot contain newline" err + test_grep "core.commentchar cannot contain newline" err ' test_expect_success 'empty commentchar is forbidden' ' test_must_fail git -c core.commentchar= stripspace -s 2>err && - grep "core.commentchar must have at least one character" err + test_grep "core.commentchar must have at least one character" err ' test_expect_success '-c with single line' ' diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh index ca55ea8228c378..a8348a851c438c 100755 --- a/t/t0040-parse-options.sh +++ b/t/t0040-parse-options.sh @@ -324,13 +324,13 @@ test_expect_success 'non ambiguous option (after two options it abbreviates)' ' test_expect_success 'Alias options do not contribute to abbreviation' ' test-tool parse-options --alias-source 123 >output && - grep "^string: 123" output && + test_grep "^string: 123" output && test-tool parse-options --alias-target 123 >output && - grep "^string: 123" output && + test_grep "^string: 123" output && test_must_fail test-tool parse-options --alias && GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=false \ test-tool parse-options --alias 123 >output && - grep "^string: 123" output + test_grep "^string: 123" output ' cat >typo.err <<\EOF @@ -582,16 +582,16 @@ test_expect_success 'KEEP_UNKNOWN_OPT works' ' test_expect_success 'NO_INTERNAL_HELP works for -h' ' test_expect_code 129 test-tool parse-options-flags --no-internal-help cmd -h 2>err && - grep "^error: unknown switch \`h$SQ" err && - grep "^usage: " err + test_grep "^error: unknown switch \`h$SQ" err && + test_grep "^usage: " err ' for help_opt in help help-all do test_expect_success "NO_INTERNAL_HELP works for --$help_opt" " test_expect_code 129 test-tool parse-options-flags --no-internal-help cmd --$help_opt 2>err && - grep '^error: unknown option \`'$help_opt\' err && - grep '^usage: ' err + test_grep '^error: unknown option \`'$help_opt\' err && + test_grep '^usage: ' err " done @@ -608,38 +608,38 @@ test_expect_success 'KEEP_UNKNOWN_OPT | NO_INTERNAL_HELP works' ' test_expect_success 'subcommand - no subcommand shows error and usage' ' test_expect_code 129 test-tool parse-subcommand cmd 2>err && - grep "^error: need a subcommand" err && - grep ^usage: err + test_grep "^error: need a subcommand" err && + test_grep ^usage: err ' test_expect_success 'subcommand - subcommand after -- shows error and usage' ' test_expect_code 129 test-tool parse-subcommand cmd -- subcmd-one 2>err && - grep "^error: need a subcommand" err && - grep ^usage: err + test_grep "^error: need a subcommand" err && + test_grep ^usage: err ' test_expect_success 'subcommand - subcommand after --end-of-options shows error and usage' ' test_expect_code 129 test-tool parse-subcommand cmd --end-of-options subcmd-one 2>err && - grep "^error: need a subcommand" err && - grep ^usage: err + test_grep "^error: need a subcommand" err && + test_grep ^usage: err ' test_expect_success 'subcommand - unknown subcommand shows error and usage' ' test_expect_code 129 test-tool parse-subcommand cmd nope 2>err && - grep "^error: unknown subcommand: \`nope$SQ" err && - grep ^usage: err + test_grep "^error: unknown subcommand: \`nope$SQ" err && + test_grep ^usage: err ' test_expect_success 'subcommand - subcommands cannot be abbreviated' ' test_expect_code 129 test-tool parse-subcommand cmd subcmd-o 2>err && - grep "^error: unknown subcommand: \`subcmd-o$SQ$" err && - grep ^usage: err + test_grep "^error: unknown subcommand: \`subcmd-o$SQ$" err && + test_grep ^usage: err ' test_expect_success 'subcommand - no negated subcommands' ' test_expect_code 129 test-tool parse-subcommand cmd no-subcmd-one 2>err && - grep "^error: unknown subcommand: \`no-subcmd-one$SQ" err && - grep ^usage: err + test_grep "^error: unknown subcommand: \`no-subcmd-one$SQ" err && + test_grep ^usage: err ' test_expect_success 'subcommand - simple' ' @@ -709,8 +709,8 @@ test_expect_success 'subcommand - SUBCOMMAND_OPTIONAL + subcommand not given + u test_expect_success 'subcommand - SUBCOMMAND_OPTIONAL + subcommand not given + unknown option' ' test_expect_code 129 test-tool parse-subcommand --subcommand-optional cmd --subcommand-opt 2>err && - grep "^error: unknown option" err && - grep ^usage: err + test_grep "^error: unknown option" err && + test_grep ^usage: err ' test_expect_success 'subcommand - SUBCOMMAND_OPTIONAL | KEEP_UNKNOWN_OPT + subcommand not given + unknown option' ' @@ -778,28 +778,28 @@ test_expect_success 'subcommand - completion helper' ' test_expect_success 'subcommands are incompatible with STOP_AT_NON_OPTION' ' test_must_fail test-tool parse-subcommand --stop-at-non-option cmd subcmd-one 2>err && - grep ^BUG err + test_grep ^BUG err ' test_expect_success 'subcommands are incompatible with KEEP_UNKNOWN_OPT unless in combination with SUBCOMMAND_OPTIONAL' ' test_must_fail test-tool parse-subcommand --keep-unknown-opt cmd subcmd-two 2>err && - grep ^BUG err + test_grep ^BUG err ' test_expect_success 'subcommands are incompatible with KEEP_DASHDASH unless in combination with SUBCOMMAND_OPTIONAL' ' test_must_fail test-tool parse-subcommand --keep-dashdash cmd subcmd-two 2>err && - grep ^BUG err + test_grep ^BUG err ' test_expect_success 'negative unsigned' ' test_must_fail test-tool parse-options --unsigned -1 >out 2>err && - grep "non-negative integer" err && + test_grep "non-negative integer" err && test_must_be_empty out ' test_expect_success 'unsigned with units but no numbers' ' test_must_fail test-tool parse-options --unsigned m >out 2>err && - grep "non-negative integer" err && + test_grep "non-negative integer" err && test_must_be_empty out ' diff --git a/t/t0041-usage.sh b/t/t0041-usage.sh index a0f6f134c71822..51af7cc0300efb 100755 --- a/t/t0041-usage.sh +++ b/t/t0041-usage.sh @@ -13,7 +13,7 @@ test_expect_success 'setup ' ' test_expect_success 'tag --contains ' ' git tag --contains "v1.0" >actual 2>actual.err && - grep "v1.0" actual && + test_grep "v1.0" actual && test_line_count = 0 actual.err ' diff --git a/t/t0052-simple-ipc.sh b/t/t0052-simple-ipc.sh index ff98be31a51b36..838ccc0e4629dc 100755 --- a/t/t0052-simple-ipc.sh +++ b/t/t0052-simple-ipc.sh @@ -33,19 +33,19 @@ test_expect_success 'servers cannot share the same path' ' test_expect_success 'big response' ' test-tool simple-ipc send --token=big >actual && test_line_count -ge 10000 actual && - grep -q "big: [0]*9999\$" actual + test_grep "big: [0]*9999\$" actual ' test_expect_success 'chunk response' ' test-tool simple-ipc send --token=chunk >actual && test_line_count -ge 10000 actual && - grep -q "big: [0]*9999\$" actual + test_grep "big: [0]*9999\$" actual ' test_expect_success 'slow response' ' test-tool simple-ipc send --token=slow >actual && test_line_count -ge 100 actual && - grep -q "big: [0]*99\$" actual + test_grep "big: [0]*99\$" actual ' # Send an IPC with n=100,000 bytes of ballast. This should be large enough @@ -54,7 +54,7 @@ test_expect_success 'slow response' ' # test_expect_success 'sendbytes' ' test-tool simple-ipc sendbytes --bytecount=100000 --byte=A >actual && - grep "sent:A00100000 rcvd:A00100000" actual + test_grep "sent:A00100000 rcvd:A00100000" actual ' # Start a series of client threads that each make @@ -93,7 +93,7 @@ test_expect_success 'stress test threads' ' --batchsize=13 \ >actual && test_line_count = 92 actual && - grep "good 91" actual && + test_grep "good 91" actual && grep "sent:A" actual_a && cat >expect_a <<-EOF && sent:A00000019 rcvd:A00000019 diff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh index 60cfe65979e215..dc9d77b0e14ab4 100755 --- a/t/t0061-run-command.sh +++ b/t/t0061-run-command.sh @@ -97,7 +97,7 @@ test_expect_success POSIXPERM 'run_command reports EACCES' ' chmod -x hello.sh && test_must_fail test-tool run-command run-command ./hello.sh 2>err && - grep "fatal: cannot exec.*hello.sh" err + test_grep "fatal: cannot exec.*hello.sh" err ' test_expect_success POSIXPERM,SANITY 'unreadable directory in PATH' ' diff --git a/t/t0066-dir-iterator.sh b/t/t0066-dir-iterator.sh index df3e9f5fa5d4b5..9fbb41bac5a1b6 100755 --- a/t/t0066-dir-iterator.sh +++ b/t/t0066-dir-iterator.sh @@ -127,7 +127,7 @@ test_expect_success SYMLINKS 'dir-iterator should not follow symlinks by default test_expect_success SYMLINKS 'dir-iterator does not resolve top-level symlinks' ' test_must_fail test-tool dir-iterator ./dir5 >out && - grep "ENOTDIR" out + test_grep "ENOTDIR" out ' test_done diff --git a/t/t0068-for-each-repo.sh b/t/t0068-for-each-repo.sh index 80b163ea99bd75..55b37d895af648 100755 --- a/t/t0068-for-each-repo.sh +++ b/t/t0068-for-each-repo.sh @@ -21,23 +21,23 @@ test_expect_success 'run based on configured value' ' git for-each-repo --config=run.key commit --allow-empty -m "ran" && git -C one log -1 --pretty=format:%s >message && - grep ran message && + test_grep ran message && git -C two log -1 --pretty=format:%s >message && - ! grep ran message && + test_grep ! ran message && git -C three log -1 --pretty=format:%s >message && - grep ran message && + test_grep ran message && git -C ~/four log -1 --pretty=format:%s >message && - grep ran message && + test_grep ran message && git for-each-repo --config=run.key -- commit --allow-empty -m "ran again" && git -C one log -1 --pretty=format:%s >message && - grep again message && + test_grep again message && git -C two log -1 --pretty=format:%s >message && - ! grep again message && + test_grep ! again message && git -C three log -1 --pretty=format:%s >message && - grep again message && + test_grep again message && git -C ~/four log -1 --pretty=format:%s >message && - grep again message && + test_grep again message && git -C three for-each-repo --config=run.key -- \ commit --allow-empty -m "ran from worktree" && diff --git a/t/t0070-fundamental.sh b/t/t0070-fundamental.sh index 6b9dcf984bcb54..8f573c2a0e7f11 100755 --- a/t/t0070-fundamental.sh +++ b/t/t0070-fundamental.sh @@ -10,7 +10,7 @@ Verify wrappers and compatibility functions. test_expect_success 'mktemp to nonexistent directory prints filename' ' test_must_fail test-tool mktemp doesnotexist/testXXXXXX 2>err && - grep "doesnotexist/test" err + test_grep "doesnotexist/test" err ' test_expect_success POSIXPERM,SANITY 'mktemp to unwritable directory prints filename' ' @@ -18,7 +18,7 @@ test_expect_success POSIXPERM,SANITY 'mktemp to unwritable directory prints file test_when_finished "chmod +w cannotwrite" && chmod -w cannotwrite && test_must_fail test-tool mktemp cannotwrite/testXXXXXX 2>err && - grep "cannotwrite/test" err + test_grep "cannotwrite/test" err ' test_expect_success 'git_mkstemps_mode does not fail if fd 0 is not open' ' @@ -33,7 +33,7 @@ test_expect_success 'check for a bug in the regex routines' ' test_expect_success 'incomplete sideband messages are reassembled' ' test-tool pkt-line send-split-sideband >split-sideband && test-tool pkt-line receive-sideband err && - grep "Hello, world" err + test_grep "Hello, world" err ' test_expect_success 'eof on sideband message is reported' ' diff --git a/t/t0081-find-pack.sh b/t/t0081-find-pack.sh index 26f017422d7253..ff9d56fbf10572 100755 --- a/t/t0081-find-pack.sh +++ b/t/t0081-find-pack.sh @@ -52,17 +52,17 @@ test_expect_success 'add more packfiles' ' # HEAD^{tree} is in 2 packfiles test-tool find-pack HEAD^{tree} >head_tree_packs && - grep "$head_commit_pack" head_tree_packs && - grep mypackname1 head_tree_packs && - ! grep mypackname2 head_tree_packs && + test_grep "$head_commit_pack" head_tree_packs && + test_grep mypackname1 head_tree_packs && + test_grep ! mypackname2 head_tree_packs && test-tool find-pack --check-count 2 HEAD^{tree} && ! test-tool find-pack --check-count 1 HEAD^{tree} && # HEAD:five.t is also in 2 packfiles test-tool find-pack HEAD:five.t >five_packs && - grep "$head_commit_pack" five_packs && - ! grep mypackname1 five_packs && - grep mypackname2 five_packs && + test_grep "$head_commit_pack" five_packs && + test_grep ! mypackname1 five_packs && + test_grep mypackname2 five_packs && test-tool find-pack -c 2 HEAD:five.t && ! test-tool find-pack --check-count=0 HEAD:five.t ' diff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh index e38ca7a9018751..81ed41742c504e 100755 --- a/t/t0091-bugreport.sh +++ b/t/t0091-bugreport.sh @@ -40,15 +40,15 @@ test_expect_success 'sanity check "System Info" section' ' # The beginning should match "git version --build-options" verbatim, # but rather than checking bit-for-bit equality, just test some basics. - grep "git version " system && - grep "shell-path: ." system && + test_grep "git version " system && + test_grep "shell-path: ." system && # After the version, there should be some more info. # This is bound to differ from environment to environment, # so we just do some rather high-level checks. - grep "uname: ." system && - grep "compiler info: ." system && - grep "zlib." system + test_grep "uname: ." system && + test_grep "compiler info: ." system && + test_grep "zlib." system ' test_expect_success 'dies if file with same name as report already exists' ' @@ -112,7 +112,7 @@ test_expect_success UNZIP '--diagnose creates diagnostics zip archive' ' git bugreport --diagnose -o report -s test >out && zip_path=report/git-diagnostics-test.zip && - grep "Available space" out && + test_grep "Available space" out && test_path_is_file "$zip_path" && # Check zipped archive content @@ -120,10 +120,10 @@ test_expect_success UNZIP '--diagnose creates diagnostics zip archive' ' test_file_not_empty out && "$GIT_UNZIP" -p "$zip_path" packs-local.txt >out && - grep ".git/objects" out && + test_grep ".git/objects" out && "$GIT_UNZIP" -p "$zip_path" objects-local.txt >out && - grep "^Total: [0-9][0-9]*" out && + test_grep "^Total: [0-9][0-9]*" out && # Should not include .git directory contents by default ! "$GIT_UNZIP" -l "$zip_path" | grep ".git/" @@ -136,7 +136,7 @@ test_expect_success UNZIP '--diagnose=stats excludes .git dir contents' ' # Includes pack quantity/size info "$GIT_UNZIP" -p "$zip_path" packs-local.txt >out && - grep ".git/objects" out && + test_grep ".git/objects" out && # Does not include .git directory contents ! "$GIT_UNZIP" -l "$zip_path" | grep ".git/" diff --git a/t/t0092-diagnose.sh b/t/t0092-diagnose.sh index 6cabd6e67b9a14..0bc2b1ed5c50bb 100755 --- a/t/t0092-diagnose.sh +++ b/t/t0092-diagnose.sh @@ -8,7 +8,7 @@ test_expect_success UNZIP 'creates diagnostics zip archive' ' test_when_finished rm -rf report && git diagnose -o report -s test >out && - grep "Available space" out && + test_grep "Available space" out && zip_path=report/git-diagnostics-test.zip && test_path_is_file "$zip_path" && @@ -18,10 +18,10 @@ test_expect_success UNZIP 'creates diagnostics zip archive' ' test_file_not_empty out && "$GIT_UNZIP" -p "$zip_path" packs-local.txt >out && - grep ".git/objects" out && + test_grep ".git/objects" out && "$GIT_UNZIP" -p "$zip_path" objects-local.txt >out && - grep "^Total: [0-9][0-9]*" out && + test_grep "^Total: [0-9][0-9]*" out && # Should not include .git directory contents by default ! "$GIT_UNZIP" -l "$zip_path" | grep ".git/" @@ -34,7 +34,7 @@ test_expect_success UNZIP 'counts loose objects' ' git diagnose -o test-count -s 1 >out && zip_path=test-count/git-diagnostics-1.zip && "$GIT_UNZIP" -p "$zip_path" objects-local.txt >out && - grep "^Total: [1-9][0-9]* loose objects" out + test_grep "^Total: [1-9][0-9]* loose objects" out ' test_expect_success UNZIP '--mode=stats excludes .git dir contents' ' @@ -45,7 +45,7 @@ test_expect_success UNZIP '--mode=stats excludes .git dir contents' ' # Includes pack quantity/size info zip_path=report/git-diagnostics-test.zip && "$GIT_UNZIP" -p "$zip_path" packs-local.txt >out && - grep ".git/objects" out && + test_grep ".git/objects" out && # Does not include .git directory contents ! "$GIT_UNZIP" -l "$zip_path" | grep ".git/" @@ -59,7 +59,7 @@ test_expect_success UNZIP '--mode=all includes .git dir contents' ' # Includes pack quantity/size info zip_path=report/git-diagnostics-test.zip && "$GIT_UNZIP" -p "$zip_path" packs-local.txt >out && - grep ".git/objects" out && + test_grep ".git/objects" out && # Includes .git directory contents "$GIT_UNZIP" -l "$zip_path" | grep ".git/" && diff --git a/t/t0100-previous.sh b/t/t0100-previous.sh index dd5d9b4e5ebdf2..87a9995ea4eb6a 100755 --- a/t/t0100-previous.sh +++ b/t/t0100-previous.sh @@ -50,7 +50,7 @@ test_expect_success 'merge @{-1}~1' ' git checkout main && git merge @{-1}~1 && git cat-file commit HEAD >actual && - grep "Merge branch '\''other'\''" actual + test_grep "Merge branch '\''other'\''" actual ' test_expect_success 'merge @{-100} before checking out that many branches yet' ' diff --git a/t/t0200-gettext-basic.sh b/t/t0200-gettext-basic.sh index 8853d8afb923e6..8db26c1adad6b6 100755 --- a/t/t0200-gettext-basic.sh +++ b/t/t0200-gettext-basic.sh @@ -16,7 +16,7 @@ test_expect_success 'sanity: $TEXTDOMAIN is git' ' ' test_expect_success 'xgettext sanity: Perl _() strings are not extracted' ' - ! grep "A Perl string xgettext will not get" "$GIT_PO_PATH"/is.po + test_grep ! "A Perl string xgettext will not get" "$GIT_PO_PATH"/is.po ' test_expect_success 'xgettext sanity: Comment extraction with --add-comments' ' @@ -26,8 +26,8 @@ test_expect_success 'xgettext sanity: Comment extraction with --add-comments' ' ' test_expect_success 'xgettext sanity: Comment extraction with --add-comments stops at statements' ' - ! grep "This is a phony" "$GIT_PO_PATH"/is.po && - ! grep "the above comment" "$GIT_PO_PATH"/is.po + test_grep ! "This is a phony" "$GIT_PO_PATH"/is.po && + test_grep ! "the above comment" "$GIT_PO_PATH"/is.po ' test_expect_success GETTEXT 'sanity: $TEXTDOMAINDIR exists without NO_GETTEXT=YesPlease' ' @@ -44,10 +44,10 @@ test_expect_success GETTEXT 'sanity: Icelandic locale was compiled' ' test_expect_success GETTEXT_LOCALE 'sanity: gettext("") metadata is OK' ' # Return value may be non-zero LANGUAGE=is LC_ALL="$is_IS_locale" gettext "" >zero-expect && - grep "Project-Id-Version: Git" zero-expect && - grep "Git Mailing List " zero-expect && - grep "Content-Type: text/plain; charset=UTF-8" zero-expect && - grep "Content-Transfer-Encoding: 8bit" zero-expect + test_grep "Project-Id-Version: Git" zero-expect && + test_grep "Git Mailing List " zero-expect && + test_grep "Content-Type: text/plain; charset=UTF-8" zero-expect && + test_grep "Content-Transfer-Encoding: 8bit" zero-expect ' test_expect_success GETTEXT_LOCALE 'sanity: gettext(unknown) is passed through' ' diff --git a/t/t0203-gettext-setlocale-sanity.sh b/t/t0203-gettext-setlocale-sanity.sh index 0ce1f22eff6628..d8af97de231281 100755 --- a/t/t0203-gettext-setlocale-sanity.sh +++ b/t/t0203-gettext-setlocale-sanity.sh @@ -12,7 +12,7 @@ test_expect_success 'git show a ISO-8859-1 commit under C locale' ' test_commit "iso-c-commit" iso-under-c && git show >out 2>err && test_must_be_empty err && - grep -q "iso-c-commit" out + test_grep "iso-c-commit" out ' test_expect_success GETTEXT_LOCALE 'git show a ISO-8859-1 commit under a UTF-8 locale' ' @@ -20,7 +20,7 @@ test_expect_success GETTEXT_LOCALE 'git show a ISO-8859-1 commit under a UTF-8 l test_commit "iso-utf8-commit" iso-under-utf8 && LANGUAGE=is LC_ALL="$is_IS_locale" git show >out 2>err && test_must_be_empty err && - grep -q "iso-utf8-commit" out + test_grep "iso-utf8-commit" out ' test_done diff --git a/t/t0204-gettext-reencode-sanity.sh b/t/t0204-gettext-reencode-sanity.sh index 28d92bb9b7cade..48ccddaf7deb25 100755 --- a/t/t0204-gettext-reencode-sanity.sh +++ b/t/t0204-gettext-reencode-sanity.sh @@ -66,22 +66,22 @@ test_expect_success GETTEXT_LOCALE 'gettext: Fetching a UTF-8 msgid -> UTF-8' ' # eyes. test_expect_success GETTEXT_ISO_LOCALE 'gettext: Fetching a UTF-8 msgid -> ISO-8859-1' ' LANGUAGE=is LC_ALL="$is_IS_iso_locale" gettext "TEST: ‘single’ and “double” quotes" >actual && - grep "einfaldar" actual && - grep "$(echo tvöfaldar | iconv -f UTF-8 -t ISO8859-1)" actual + test_grep "einfaldar" actual && + test_grep "$(echo tvöfaldar | iconv -f UTF-8 -t ISO8859-1)" actual ' test_expect_success GETTEXT_LOCALE 'gettext.c: git init UTF-8 -> UTF-8' ' printf "Bjó til tóma Git lind" >expect && LANGUAGE=is LC_ALL="$is_IS_locale" git init repo >actual && test_when_finished "rm -rf repo" && - grep "^$(cat expect) " actual + test_grep "^$(cat expect) " actual ' test_expect_success GETTEXT_ISO_LOCALE 'gettext.c: git init UTF-8 -> ISO-8859-1' ' printf "Bjó til tóma Git lind" >expect && LANGUAGE=is LC_ALL="$is_IS_iso_locale" git init repo >actual && test_when_finished "rm -rf repo" && - grep "^$(iconv -f UTF-8 -t ISO8859-1 actual && - grep "d0|main|start|.* clone https://user:pwd@example.com" actual && - grep "d0|main|def_param|.*|remote.origin.url:https://user:pwd@example.com" actual + test_grep "d0|main|start|.* clone https://user:pwd@example.com" actual && + test_grep "d0|main|def_param|.*|remote.origin.url:https://user:pwd@example.com" actual ' # Confirm that the requested command produces a "cmd_name" and a @@ -358,13 +358,13 @@ test_expect_success LIBCURL \ perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" actual && - grep "d0|main|cmd_name|.*|_run_dashed_" actual && - grep "d0|main|def_param|.*|cfg.prop.foo:red" actual && - grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && + test_grep "d0|main|cmd_name|.*|_run_dashed_" actual && + test_grep "d0|main|def_param|.*|cfg.prop.foo:red" actual && + test_grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && - grep "d1|main|cmd_name|.*|remote-curl" actual && - grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && - grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual + test_grep "d1|main|cmd_name|.*|remote-curl" actual && + test_grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && + test_grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual ' # Similarly, `git-http-fetch` is not built from git.c so do a @@ -389,13 +389,13 @@ test_expect_success LIBCURL \ perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" actual && - grep "d0|main|cmd_name|.*|_run_dashed_" actual && - grep "d0|main|def_param|.*|cfg.prop.foo:red" actual && - grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && + test_grep "d0|main|cmd_name|.*|_run_dashed_" actual && + test_grep "d0|main|def_param|.*|cfg.prop.foo:red" actual && + test_grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && - grep "d1|main|cmd_name|.*|http-fetch" actual && - grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && - grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual + test_grep "d1|main|cmd_name|.*|http-fetch" actual && + test_grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && + test_grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual ' # Historically, alias expansion explicitly emitted the def_param @@ -421,22 +421,22 @@ test_expect_success 'expect def_params during git alias expansion' ' perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" actual && # "git xxx" is first mapped to "git-xxx" and the child will fail. - grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_)" actual && + test_grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_)" actual && # We unpeel that and substitute "version" into "xxx" (giving # "git version") and update the cmd_name event. - grep "d0|main|cmd_name|.*|_run_git_alias_ (_run_dashed_/_run_git_alias_)" actual && + test_grep "d0|main|cmd_name|.*|_run_git_alias_ (_run_dashed_/_run_git_alias_)" actual && # These def_param events could be associated with either of the # above cmd_name events. It does not matter. - grep "d0|main|def_param|.*|cfg.prop.foo:red" actual && - grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && + test_grep "d0|main|def_param|.*|cfg.prop.foo:red" actual && + test_grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && # The "git version" child sees a different cmd_name hierarchy. # Also test the def_param (only for completeness). - grep "d1|main|cmd_name|.*|version (_run_dashed_/_run_git_alias_/version)" actual && - grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && - grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual + test_grep "d1|main|cmd_name|.*|version (_run_dashed_/_run_git_alias_/version)" actual && + test_grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && + test_grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual ' test_expect_success 'expect def_params during shell alias expansion' ' @@ -456,25 +456,25 @@ test_expect_success 'expect def_params during shell alias expansion' ' perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" actual && # "git xxx" is first mapped to "git-xxx" and the child will fail. - grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_)" actual && + test_grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_)" actual && # We unpeel that and substitute "git version" for "git xxx" (as a # shell command. Another cmd_name event is emitted as we unpeel. - grep "d0|main|cmd_name|.*|_run_shell_alias_ (_run_dashed_/_run_shell_alias_)" actual && + test_grep "d0|main|cmd_name|.*|_run_shell_alias_ (_run_dashed_/_run_shell_alias_)" actual && # These def_param events could be associated with either of the # above cmd_name events. It does not matter. - grep "d0|main|def_param|.*|cfg.prop.foo:red" actual && - grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && + test_grep "d0|main|def_param|.*|cfg.prop.foo:red" actual && + test_grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && # We get the following only because we used a git command for the # shell command. In general, it could have been a shell script and # we would see nothing. # # The child knows the cmd_name hierarchy so it includes it. - grep "d1|main|cmd_name|.*|version (_run_dashed_/_run_shell_alias_/version)" actual && - grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && - grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual + test_grep "d1|main|cmd_name|.*|version (_run_dashed_/_run_shell_alias_/version)" actual && + test_grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && + test_grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual ' test_expect_success 'expect def_params during nested git alias expansion' ' @@ -496,33 +496,33 @@ test_expect_success 'expect def_params during nested git alias expansion' ' # "git xxx" is first mapped to "git-xxx" and try to spawn "git-xxx" # and the child will fail. - grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_)" actual && - grep "d0|main|child_start|.*|.* class:dashed argv:\[git-xxx\]" actual && + test_grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_)" actual && + test_grep "d0|main|child_start|.*|.* class:dashed argv:\[git-xxx\]" actual && # We unpeel that and substitute "yyy" into "xxx" (giving "git yyy") # and spawn "git-yyy" and the child will fail. - grep "d0|main|alias|.*|alias:xxx argv:\[yyy\]" actual && - grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_/_run_dashed_)" actual && - grep "d0|main|child_start|.*|.* class:dashed argv:\[git-yyy\]" actual && + test_grep "d0|main|alias|.*|alias:xxx argv:\[yyy\]" actual && + test_grep "d0|main|cmd_name|.*|_run_dashed_ (_run_dashed_/_run_dashed_)" actual && + test_grep "d0|main|child_start|.*|.* class:dashed argv:\[git-yyy\]" actual && # We unpeel that and substitute "version" into "xxx" (giving # "git version") and update the cmd_name event. - grep "d0|main|alias|.*|alias:yyy argv:\[version\]" actual && - grep "d0|main|cmd_name|.*|_run_git_alias_ (_run_dashed_/_run_dashed_/_run_git_alias_)" actual && + test_grep "d0|main|alias|.*|alias:yyy argv:\[version\]" actual && + test_grep "d0|main|cmd_name|.*|_run_git_alias_ (_run_dashed_/_run_dashed_/_run_git_alias_)" actual && # These def_param events could be associated with any of the # above cmd_name events. It does not matter. grep "d0|main|def_param|.*|cfg.prop.foo:red" actual >actual.matches && - grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && + test_grep "d0|main|def_param|.*|ENV_PROP_FOO:blue" actual && # However, we do not want them repeated each time we unpeel. test_line_count = 1 actual.matches && # The "git version" child sees a different cmd_name hierarchy. # Also test the def_param (only for completeness). - grep "d1|main|cmd_name|.*|version (_run_dashed_/_run_dashed_/_run_git_alias_/version)" actual && - grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && - grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual + test_grep "d1|main|cmd_name|.*|version (_run_dashed_/_run_dashed_/_run_git_alias_/version)" actual && + test_grep "d1|main|def_param|.*|cfg.prop.foo:red" actual && + test_grep "d1|main|def_param|.*|ENV_PROP_FOO:blue" actual ' test_done diff --git a/t/t0212-trace2-event.sh b/t/t0212-trace2-event.sh index 1211db9f468717..f5358a1dd44991 100755 --- a/t/t0212-trace2-event.sh +++ b/t/t0212-trace2-event.sh @@ -332,7 +332,7 @@ test_expect_success 'unsafe URLs are redacted by default in cmd_start events' ' GIT_TRACE2_EVENT="$(pwd)/trace.event" \ test-tool trace2 300redact_start git clone https://user:pwd@example.com/ clone2 && - ! grep user:pwd trace.event + test_grep ! user:pwd trace.event ' test_expect_success 'unsafe URLs are redacted by default in child_start events' ' @@ -341,7 +341,7 @@ test_expect_success 'unsafe URLs are redacted by default in child_start events' GIT_TRACE2_EVENT="$(pwd)/trace.event" \ test-tool trace2 301redact_child_start git clone https://user:pwd@example.com/ clone2 && - ! grep user:pwd trace.event + test_grep ! user:pwd trace.event ' test_expect_success 'unsafe URLs are redacted by default in exec events' ' @@ -350,7 +350,7 @@ test_expect_success 'unsafe URLs are redacted by default in exec events' ' GIT_TRACE2_EVENT="$(pwd)/trace.event" \ test-tool trace2 302redact_exec git clone https://user:pwd@example.com/ clone2 && - ! grep user:pwd trace.event + test_grep ! user:pwd trace.event ' test_expect_success 'unsafe URLs are redacted by default in def_param events' ' @@ -359,7 +359,7 @@ test_expect_success 'unsafe URLs are redacted by default in def_param events' ' GIT_TRACE2_EVENT="$(pwd)/trace.event" \ test-tool trace2 303redact_def_param url https://user:pwd@example.com/ && - ! grep user:pwd trace.event + test_grep ! user:pwd trace.event ' test_done diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh index 64ead1571ae1e1..ea11cdb4dcd251 100755 --- a/t/t0300-credentials.sh +++ b/t/t0300-credentials.sh @@ -1014,7 +1014,7 @@ test_expect_success 'credential config with partial URLs' ' do git -c credential.$partial.helper=yep \ credential fill stdout && - grep yep stdout || + test_grep yep stdout || return 1 done && @@ -1030,7 +1030,7 @@ test_expect_success 'credential config with partial URLs' ' do git -c credential.$partial.helper=yep \ credential fill stdout && - ! grep yep stdout || + test_grep ! yep stdout || return 1 done && diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh index 52e19728a3fca0..afa890c470b782 100755 --- a/t/t0410-partial-clone.sh +++ b/t/t0410-partial-clone.sh @@ -206,7 +206,7 @@ test_expect_success 'fetching of missing objects' ' git -C repo cat-file -p "$HASH" 2>err && # Ensure that no spurious FETCH_HEAD messages are written - ! grep FETCH_HEAD err && + test_grep ! FETCH_HEAD err && # Ensure that the .promisor file is written, and check that its # associated packfile contains the object @@ -214,7 +214,7 @@ test_expect_success 'fetching of missing objects' ' test_line_count = 1 promisorlist && IDX=$(sed "s/promisor$/idx/" promisorlist) && git verify-pack --verbose "$IDX" >out && - grep "$HASH" out + test_grep "$HASH" out ' test_expect_success 'fetching of a promised object that promisor remote no longer has' ' @@ -228,7 +228,7 @@ test_expect_success 'fetching of a promised object that promisor remote no longe rm -rf unreliable-server/.git/objects/* && test_must_fail git -C unreliable-client checkout HEAD 2>err && - grep "could not fetch.*from promisor remote" err + test_grep "could not fetch.*from promisor remote" err ' test_expect_success 'fetching of missing objects works with ref-in-want enabled' ' @@ -240,7 +240,7 @@ test_expect_success 'fetching of missing objects works with ref-in-want enabled' rm -rf repo/.git/objects/* && rm -f trace && GIT_TRACE_PACKET="$(pwd)/trace" git -C repo cat-file -p "$HASH" && - grep "fetch< fetch=.*ref-in-want" trace + test_grep "fetch< fetch=.*ref-in-want" trace ' test_expect_success 'fetching from another promisor remote' ' @@ -263,7 +263,7 @@ test_expect_success 'fetching from another promisor remote' ' test_line_count = 1 promisorlist && IDX=$(sed "s/promisor$/idx/" promisorlist) && git verify-pack --verbose "$IDX" >out && - grep "$HASH2" out + test_grep "$HASH2" out ' test_expect_success 'fetching with --filter configures a promisor remote' ' @@ -286,7 +286,7 @@ test_expect_success 'fetching with --filter configures a promisor remote' ' test_line_count = 1 promisorlist && IDX=$(sed "s/promisor$/idx/" promisorlist) && git verify-pack --verbose "$IDX" >out && - grep "$HASH3" out + test_grep "$HASH3" out ' test_expect_success 'fetching of missing blobs works' ' @@ -327,8 +327,8 @@ test_expect_success 'fetching of missing trees does not fetch blobs' ' # Ensure that the tree, but not the blob, is fetched git -C repo rev-list --objects --missing=print $(cat treehash) >objects && - grep "^$(cat treehash)" objects && - grep "^[?]$(cat blobhash)" objects + test_grep "^$(cat treehash)" objects && + test_grep "^[?]$(cat blobhash)" objects ' test_expect_success 'rev-list stops traversal at missing and promised commit' ' @@ -343,8 +343,8 @@ test_expect_success 'rev-list stops traversal at missing and promised commit' ' git -C repo config core.repositoryformatversion 1 && git -C repo config extensions.partialclone "arbitrary string" && git -C repo rev-list --exclude-promisor-objects --objects bar >out && - grep $(git -C repo rev-parse bar) out && - ! grep $FOO out + test_grep $(git -C repo rev-parse bar) out && + test_grep ! $FOO out ' test_expect_success 'missing tree objects with --missing=allow-promisor and --exclude-promisor-objects' ' @@ -413,10 +413,10 @@ test_expect_success 'rev-list stops traversal at missing and promised tree' ' git -C repo config core.repositoryformatversion 1 && git -C repo config extensions.partialclone "arbitrary string" && git -C repo rev-list --exclude-promisor-objects --objects HEAD >out && - grep $(git -C repo rev-parse foo) out && - ! grep $TREE out && - grep $(git -C repo rev-parse HEAD) out && - ! grep $TREE2 out + test_grep $(git -C repo rev-parse foo) out && + test_grep ! $TREE out && + test_grep $(git -C repo rev-parse HEAD) out && + test_grep ! $TREE2 out ' test_expect_success 'rev-list stops traversal at missing and promised blob' ' @@ -432,8 +432,8 @@ test_expect_success 'rev-list stops traversal at missing and promised blob' ' git -C repo config core.repositoryformatversion 1 && git -C repo config extensions.partialclone "arbitrary string" && git -C repo rev-list --exclude-promisor-objects --objects HEAD >out && - grep $(git -C repo rev-parse HEAD) out && - ! grep $BLOB out + test_grep $(git -C repo rev-parse HEAD) out && + test_grep ! $BLOB out ' test_expect_success 'rev-list stops traversal at promisor commit, tree, and blob' ' @@ -451,10 +451,10 @@ test_expect_success 'rev-list stops traversal at promisor commit, tree, and blob git -C repo config core.repositoryformatversion 1 && git -C repo config extensions.partialclone "arbitrary string" && git -C repo rev-list --exclude-promisor-objects --objects HEAD >out && - ! grep $COMMIT out && - ! grep $TREE out && - ! grep $BLOB out && - grep $(git -C repo rev-parse bar) out # sanity check that some walking was done + test_grep ! $COMMIT out && + test_grep ! $TREE out && + test_grep ! $BLOB out && + test_grep $(git -C repo rev-parse bar) out # sanity check that some walking was done ' test_expect_success 'rev-list dies for missing objects on cmd line' ' @@ -523,10 +523,10 @@ test_expect_success 'gc repacks promisor objects separately from non-promisor ob test_line_count = 1 promisorlist && PROMISOR_PACKFILE=$(sed "s/.promisor/.pack/" out && - grep "$TREE_ONE" out && - grep "$TREE_TWO" out && - ! grep "$(git -C repo rev-parse one)" out && - ! grep "$(git -C repo rev-parse two)" out && + test_grep "$TREE_ONE" out && + test_grep "$TREE_TWO" out && + test_grep ! "$(git -C repo rev-parse one)" out && + test_grep ! "$(git -C repo rev-parse two)" out && # Remove the promisor packfile and associated files rm $(sed "s/.promisor//" packlist && test_line_count = 1 packlist && git verify-pack repo/.git/objects/pack/pack-*.pack -v >out && - grep "$(git -C repo rev-parse one)" out && - grep "$(git -C repo rev-parse two)" out && - ! grep "$TREE_ONE" out && - ! grep "$TREE_TWO" out + test_grep "$(git -C repo rev-parse one)" out && + test_grep "$(git -C repo rev-parse two)" out && + test_grep ! "$TREE_ONE" out && + test_grep ! "$TREE_TWO" out ' test_expect_success 'gc does not repack promisor objects if there are none' ' @@ -616,8 +616,8 @@ test_expect_success 'gc stops traversal when a missing but promised object is re ls repo/.git/objects/pack/pack-*.pack >packlist && test_line_count = 1 packlist && git verify-pack repo/.git/objects/pack/pack-*.pack -v >out && - grep "$(git -C repo rev-parse HEAD)" out && - ! grep "$TREE_HASH" out + test_grep "$(git -C repo rev-parse HEAD)" out && + test_grep ! "$TREE_HASH" out ' test_expect_success 'do not fetch when checking existence of tree we construct ourselves' ' @@ -647,10 +647,10 @@ test_expect_success 'exact rename does not need to fetch the blob lazily' ' git clone --filter=blob:none --bare "file://$(pwd)/repo" partial.git && git -C partial.git rev-list --objects --missing=print HEAD >out && - grep "[?]$FILE_HASH" out && + test_grep "[?]$FILE_HASH" out && git -C partial.git log --follow -- new-file.txt && git -C partial.git rev-list --objects --missing=print HEAD >out && - grep "[?]$FILE_HASH" out + test_grep "[?]$FILE_HASH" out ' test_expect_success 'lazy-fetch when accessing object not in the_repository' ' @@ -665,7 +665,7 @@ test_expect_success 'lazy-fetch when accessing object not in the_repository' ' # Sanity check that the file is missing git -C partial.git rev-list --objects --missing=print HEAD >out && - grep "[?]$FILE_HASH" out && + test_grep "[?]$FILE_HASH" out && # The no-lazy-fetch mechanism prevents Git from fetching test_must_fail env GIT_NO_LAZY_FETCH=1 \ @@ -680,7 +680,7 @@ test_expect_success 'lazy-fetch when accessing object not in the_repository' ' # Sanity check that the file is still missing git -C partial.git rev-list --objects --missing=print HEAD >out && - grep "[?]$FILE_HASH" out && + test_grep "[?]$FILE_HASH" out && git -C full cat-file -s "$FILE_HASH" >expect && test-tool partial-clone object-info partial.git "$FILE_HASH" >actual && @@ -688,7 +688,7 @@ test_expect_success 'lazy-fetch when accessing object not in the_repository' ' # Sanity check that the file is now present git -C partial.git rev-list --objects --missing=print HEAD >out && - ! grep "[?]$FILE_HASH" out + test_grep ! "[?]$FILE_HASH" out ' test_expect_success 'push should not fetch new commit objects' ' @@ -705,9 +705,9 @@ test_expect_success 'push should not fetch new commit objects' ' COMMIT=$(git -C server rev-parse server2) && test_must_fail git -C client push 2>err && - grep "fetch first" err && + test_grep "fetch first" err && git -C client rev-list --objects --missing=print "$COMMIT" >objects && - grep "^[?]$COMMIT" objects + test_grep "^[?]$COMMIT" objects ' test_expect_success 'setup for promisor.quiet tests' ' @@ -728,7 +728,7 @@ test_expect_success TTY 'promisor.quiet=false shows progress messages' ' test_terminal git -C repo cat-file -p foo:foo.t 2>err && # Ensure that progress messages are written - grep "Receiving objects" err + test_grep "Receiving objects" err ' test_expect_success TTY 'promisor.quiet=true does not show progress messages' ' @@ -739,7 +739,7 @@ test_expect_success TTY 'promisor.quiet=true does not show progress messages' ' test_terminal git -C repo cat-file -p foo:foo.t 2>err && # Ensure that no progress messages are written - ! grep "Receiving objects" err + test_grep ! "Receiving objects" err ' test_expect_success TTY 'promisor.quiet=unconfigured shows progress messages' ' @@ -749,7 +749,7 @@ test_expect_success TTY 'promisor.quiet=unconfigured shows progress messages' ' test_terminal git -C repo cat-file -p foo:foo.t 2>err && # Ensure that progress messages are written - grep "Receiving objects" err + test_grep "Receiving objects" err ' . "$TEST_DIRECTORY"/lib-httpd.sh @@ -776,7 +776,7 @@ test_expect_success 'fetching of missing objects from an HTTP server' ' test_line_count = 1 promisorlist && IDX=$(sed "s/promisor$/idx/" promisorlist) && git verify-pack --verbose "$IDX" >out && - grep "$HASH" out + test_grep "$HASH" out ' # DO NOT add non-httpd-specific tests here, because the last part of this diff --git a/t/t0450-txt-doc-vs-help.sh b/t/t0450-txt-doc-vs-help.sh index 822b0d55a50ae7..e7ba96722323fb 100755 --- a/t/t0450-txt-doc-vs-help.sh +++ b/t/t0450-txt-doc-vs-help.sh @@ -87,7 +87,7 @@ do # -h output assertions test_expect_success "$builtin -h output has no \t" ' h2s="$(help_to_synopsis "$builtin")" && - ! grep "$HT" "$h2s" + test_grep ! "$HT" "$h2s" ' test_expect_success "$builtin -h output has dashed labels" ' diff --git a/t/t0500-progress-display.sh b/t/t0500-progress-display.sh index d1a498a216fb52..fe2232cce0e8ef 100755 --- a/t/t0500-progress-display.sh +++ b/t/t0500-progress-display.sh @@ -320,8 +320,8 @@ test_expect_success 'progress generates traces' ' # t0212/parse_events.perl intentionally omits regions and data. test_region progress "Working hard" trace.event && - grep "\"key\":\"total_objects\",\"value\":\"40\"" trace.event && - grep "\"key\":\"total_bytes\",\"value\":\"409600\"" trace.event + test_grep "\"key\":\"total_objects\",\"value\":\"40\"" trace.event && + test_grep "\"key\":\"total_bytes\",\"value\":\"409600\"" trace.event ' test_expect_success 'progress generates traces: stop / start' ' @@ -344,8 +344,8 @@ test_expect_success 'progress generates traces: start without stop' ' LSAN_OPTIONS=detect_leaks=0 \ test-tool progress \ stderr && - grep region_enter.*progress trace-start.event && - ! grep region_leave.*progress trace-start.event + test_grep region_enter.*progress trace-start.event && + test_grep ! region_leave.*progress trace-start.event ' test_expect_success 'progress generates traces: stop without start' ' @@ -355,8 +355,8 @@ test_expect_success 'progress generates traces: stop without start' ' GIT_TRACE2_EVENT="$PWD/trace-stop.event" test-tool progress \ stderr && - ! grep region_enter.*progress trace-stop.event && - ! grep region_leave.*progress trace-stop.event + test_grep ! region_enter.*progress trace-stop.event && + test_grep ! region_leave.*progress trace-stop.event ' test_expect_success 'progress generates traces: start with active progress bar (no stops)' ' @@ -369,9 +369,9 @@ test_expect_success 'progress generates traces: start with active progress bar ( LSAN_OPTIONS=detect_leaks=0 \ test-tool progress \ stderr && - grep region_enter.*progress.*One trace-2start.event && - grep region_enter.*progress.*Two trace-2start.event && - ! grep region_leave trace-2start.event + test_grep region_enter.*progress.*One trace-2start.event && + test_grep region_enter.*progress.*Two trace-2start.event && + test_grep ! region_leave trace-2start.event ' test_done diff --git a/t/t0610-reftable-basics.sh b/t/t0610-reftable-basics.sh index e19e0368989d50..2f4c5e2a1b9c39 100755 --- a/t/t0610-reftable-basics.sh +++ b/t/t0610-reftable-basics.sh @@ -776,11 +776,11 @@ test_expect_success 'reflog: can delete separate reflog entries' ' test_commit file3 && test_commit file4 && git reflog >actual && - grep file3 actual && + test_grep file3 actual && git reflog delete HEAD@{1} && git reflog >actual && - ! grep file3 actual + test_grep ! file3 actual ) ' @@ -902,8 +902,8 @@ test_expect_success 'reflog: garbage collection deletes reflog entries' ' done && git reflog refs/heads/main >actual && test_line_count = 10 actual && - grep "commit (initial): number 1" actual && - grep "commit: number 10" actual && + test_grep "commit (initial): number 1" actual && + test_grep "commit: number 10" actual && git gc && git reflog refs/heads/main >actual && diff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh index 11bf10424f1620..70ba3eea4d4b63 100755 --- a/t/t1004-read-tree-m-u-wf.sh +++ b/t/t1004-read-tree-m-u-wf.sh @@ -142,8 +142,8 @@ test_expect_success '3-way not overwriting local changes (our side)' ' echo >>file1 "local changes" && read_tree_u_must_succeed -m -u branch-point side-a side-b && - grep "new line to be kept" file1 && - grep "local changes" file1 + test_grep "new line to be kept" file1 && + test_grep "local changes" file1 ' @@ -156,8 +156,8 @@ test_expect_success '3-way not overwriting local changes (their side)' ' echo >>file2 "local changes" && read_tree_u_must_fail -m -u branch-point side-a side-b && - ! grep "new line to be kept" file2 && - grep "local changes" file2 + test_grep ! "new line to be kept" file2 && + test_grep "local changes" file2 ' diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh index 8e2c52652c5185..762c77c3510254 100755 --- a/t/t1006-cat-file.sh +++ b/t/t1006-cat-file.sh @@ -696,8 +696,8 @@ test_expect_success '%(deltabase) reports packed delta bases' ' git repack -ad && git cat-file --batch-check="%(deltabase)" actual && { - grep "$(git rev-parse HEAD:foo)" actual || - grep "$(git rev-parse HEAD:foo-plus)" actual + test_grep "$(git rev-parse HEAD:foo)" actual || + test_grep "$(git rev-parse HEAD:foo-plus)" actual } ' @@ -826,7 +826,7 @@ test_expect_success 'cat-file -t and -s on corrupt loose object' ' # Swap the two to corrupt the repository mv -f "$other_path" "$empty_path" && test_must_fail git fsck 2>err.fsck && - grep "hash-path mismatch" err.fsck && + test_grep "hash-path mismatch" err.fsck && # confirm that cat-file is reading the new swapped-in # blob... @@ -1318,37 +1318,37 @@ test_expect_success 'cat-file --batch-all-objects --batch-check ignores replace' test_expect_success 'batch-command empty command' ' echo "" >cmd && test_expect_code 128 git cat-file --batch-command err && - grep "^fatal:.*empty command in input.*" err + test_grep "^fatal:.*empty command in input.*" err ' test_expect_success 'batch-command whitespace before command' ' echo " info deadbeef" >cmd && test_expect_code 128 git cat-file --batch-command err && - grep "^fatal:.*whitespace before command.*" err + test_grep "^fatal:.*whitespace before command.*" err ' test_expect_success 'batch-command unknown command' ' echo unknown_command >cmd && test_expect_code 128 git cat-file --batch-command err && - grep "^fatal:.*unknown command.*" err + test_grep "^fatal:.*unknown command.*" err ' test_expect_success 'batch-command missing arguments' ' echo "info" >cmd && test_expect_code 128 git cat-file --batch-command err && - grep "^fatal:.*info requires arguments.*" err + test_grep "^fatal:.*info requires arguments.*" err ' test_expect_success 'batch-command flush with arguments' ' echo "flush arg" >cmd && test_expect_code 128 git cat-file --batch-command --buffer err && - grep "^fatal:.*flush takes no arguments.*" err + test_grep "^fatal:.*flush takes no arguments.*" err ' test_expect_success 'batch-command flush without --buffer' ' echo "flush" >cmd && test_expect_code 128 git cat-file --batch-command err && - grep "^fatal:.*flush is only for --buffer mode.*" err + test_grep "^fatal:.*flush is only for --buffer mode.*" err ' perl_script=' diff --git a/t/t1007-hash-object.sh b/t/t1007-hash-object.sh index de076293b62a76..4782a6246afc00 100755 --- a/t/t1007-hash-object.sh +++ b/t/t1007-hash-object.sh @@ -202,7 +202,7 @@ done test_expect_success 'too-short tree' ' echo abc >malformed-tree && test_must_fail git hash-object -t tree malformed-tree 2>err && - grep "too-short tree object" err + test_grep "too-short tree object" err ' test_expect_success PERL_TEST_HELPERS 'malformed mode in tree' ' @@ -210,7 +210,7 @@ test_expect_success PERL_TEST_HELPERS 'malformed mode in tree' ' bin_oid=$(echo $hex_oid | hex2oct) && printf "9100644 \0$bin_oid" >tree-with-malformed-mode && test_must_fail git hash-object -t tree tree-with-malformed-mode 2>err && - grep "malformed mode in tree entry" err + test_grep "malformed mode in tree entry" err ' test_expect_success PERL_TEST_HELPERS 'empty filename in tree' ' @@ -218,7 +218,7 @@ test_expect_success PERL_TEST_HELPERS 'empty filename in tree' ' bin_oid=$(echo $hex_oid | hex2oct) && printf "100644 \0$bin_oid" >tree-with-empty-filename && test_must_fail git hash-object -t tree tree-with-empty-filename 2>err && - grep "empty filename in tree entry" err + test_grep "empty filename in tree entry" err ' test_expect_success PERL_TEST_HELPERS 'duplicate filename in tree' ' @@ -229,7 +229,7 @@ test_expect_success PERL_TEST_HELPERS 'duplicate filename in tree' ' printf "100644 file\0$bin_oid" } >tree-with-duplicate-filename && test_must_fail git hash-object -t tree tree-with-duplicate-filename 2>err && - grep "duplicateEntries" err + test_grep "duplicateEntries" err ' test_expect_success 'corrupt commit' ' diff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh index 742f0fa909fd6e..f6a5dbe519b0f6 100755 --- a/t/t1011-read-tree-sparse-checkout.sh +++ b/t/t1011-read-tree-sparse-checkout.sh @@ -196,7 +196,7 @@ test_expect_success 'read-tree will not throw away dirty changes, non-sparse' ' echo dirty >init.t && read_tree_u_must_fail -m -u HEAD^ && test_path_is_file init.t && - grep -q dirty init.t + test_grep dirty init.t ' test_expect_success 'read-tree will not throw away dirty changes, sparse' ' @@ -207,7 +207,7 @@ test_expect_success 'read-tree will not throw away dirty changes, sparse' ' echo sub/added >.git/info/sparse-checkout && read_tree_u_must_fail -m -u HEAD^ && test_path_is_file init.t && - grep -q dirty init.t + test_grep dirty init.t ' test_expect_success 'read-tree updates worktree, dirty case' ' @@ -215,7 +215,7 @@ test_expect_success 'read-tree updates worktree, dirty case' ' git checkout -f top && echo dirty >init.t && read_tree_u_must_fail -m -u HEAD^ && - grep -q dirty init.t && + test_grep dirty init.t && rm init.t ' @@ -224,7 +224,7 @@ test_expect_success 'read-tree removes worktree, dirty case' ' git checkout -f top && echo dirty >added && read_tree_u_must_succeed -m -u HEAD^ && - grep -q dirty added + test_grep dirty added ' test_expect_success 'read-tree adds to worktree, absent case' ' @@ -240,7 +240,7 @@ test_expect_success 'read-tree adds to worktree, dirty case' ' mkdir sub && echo dirty >sub/added && read_tree_u_must_succeed -u -m HEAD^ && - grep -q dirty sub/added + test_grep dirty sub/added ' test_expect_success 'index removal and worktree narrowing at the same time' ' diff --git a/t/t1050-large.sh b/t/t1050-large.sh index 7d40d0852166b5..d295c265c75c0e 100755 --- a/t/t1050-large.sh +++ b/t/t1050-large.sh @@ -8,7 +8,7 @@ test_description='adding and checking out large blobs' test_expect_success 'core.bigFileThreshold must be non-negative' ' : >input && test_must_fail git -c core.bigFileThreshold=-1 hash-object input >out 2>err && - grep "bad numeric config value" err && + test_grep "bad numeric config value" err && test_must_be_empty out ' @@ -148,12 +148,12 @@ test_expect_success 'diff --stat' ' test_expect_success 'diff' ' git diff HEAD^ HEAD >actual && - grep "Binary files.*differ" actual + test_grep "Binary files.*differ" actual ' test_expect_success 'diff --cached' ' git diff --cached HEAD^ >actual && - grep "Binary files.*differ" actual + test_grep "Binary files.*differ" actual ' test_expect_success 'hash-object' ' diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh index cd0aed9975fe24..74b1761e0c8507 100755 --- a/t/t1091-sparse-checkout-builtin.sh +++ b/t/t1091-sparse-checkout-builtin.sh @@ -129,7 +129,7 @@ test_expect_success 'switching to cone mode with non-cone mode patterns' ' git sparse-checkout add dir && git config --worktree core.sparseCheckoutCone true && test_must_fail git sparse-checkout add dir 2>err && - grep "existing sparse-checkout patterns do not use cone mode" err + test_grep "existing sparse-checkout patterns do not use cone mode" err ) ' @@ -803,7 +803,7 @@ test_expect_success 'cone mode clears ignored subdirectories' ' # When an untracked file is in the way, all untracked files # (even ignored files) are preserved. git -C repo sparse-checkout set folder1 2>err && - grep "contains untracked files" err && + test_grep "contains untracked files" err && test_path_is_file repo/deep/deeper2/ignored.o && test_path_is_file repo/deep/deeper2/untracked && @@ -882,8 +882,8 @@ test_expect_success 'malformed cone-mode patterns' ' # of using the cone-mode translation to a set of directories. git -C repo sparse-checkout list >actual 2>err && test_cmp repo/.git/info/sparse-checkout actual && - grep "warning: your sparse-checkout file may have issues: pattern .* is repeated" err && - grep "warning: disabling cone pattern matching" err + test_grep "warning: your sparse-checkout file may have issues: pattern .* is repeated" err && + test_grep "warning: disabling cone pattern matching" err ' test_expect_success 'set from subdir pays attention to prefix' ' @@ -917,34 +917,34 @@ test_expect_success 'set from subdir in non-cone mode throws an error' ' git -C repo sparse-checkout disable && test_must_fail git -C repo/deep sparse-checkout set --no-cone deeper2 ../folder1 2>error && - grep "run from the toplevel directory in non-cone mode" error + test_grep "run from the toplevel directory in non-cone mode" error ' test_expect_success 'set from subdir in non-cone mode throws an error' ' git -C repo sparse-checkout set --no-cone deep/deeper2 && test_must_fail git -C repo/deep sparse-checkout add deeper1/deepest ../folder1 2>error && - grep "run from the toplevel directory in non-cone mode" error + test_grep "run from the toplevel directory in non-cone mode" error ' test_expect_success 'by default, cone mode will error out when passed files' ' git -C repo sparse-checkout reapply --cone && test_must_fail git -C repo sparse-checkout add .gitignore 2>error && - grep ".gitignore.*is not a directory" error + test_grep ".gitignore.*is not a directory" error ' test_expect_success 'error on mistyped command line options' ' test_must_fail git -C repo sparse-checkout add --sikp-checks .gitignore 2>error && - grep "unknown option.*sikp-checks" error + test_grep "unknown option.*sikp-checks" error ' test_expect_success 'by default, non-cone mode will warn on individual files' ' git -C repo sparse-checkout reapply --no-cone && git -C repo sparse-checkout add .gitignore 2>warning && - grep "pass a leading slash before paths.*if you want a single file" warning + test_grep "pass a leading slash before paths.*if you want a single file" warning ' test_expect_success 'setup bare repo' ' @@ -1108,11 +1108,11 @@ test_expect_success 'clean' ' touch repo/folder1/extra/inside/file && test_must_fail git -C repo sparse-checkout clean 2>err && - grep "refusing to clean" err && + test_grep "refusing to clean" err && git -C repo config clean.requireForce true && test_must_fail git -C repo sparse-checkout clean 2>err && - grep "refusing to clean" err && + test_grep "refusing to clean" err && cat >expect <<-\EOF && Would remove deep/deeper2/ @@ -1255,7 +1255,7 @@ test_expect_success 'sparse-checkout operations with merge conflicts' ' test_must_fail git merge -m "will-conflict" right && test_must_fail git sparse-checkout clean -f 2>err && - grep "failed to convert index to a sparse index" err && + test_grep "failed to convert index to a sparse index" err && echo merged >folder1/even/more/dirs/file && git add --sparse folder1 && diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh index d98cb4ac113c67..b5b5e615e7ed78 100755 --- a/t/t1092-sparse-checkout-compatibility.sh +++ b/t/t1092-sparse-checkout-compatibility.sh @@ -454,10 +454,10 @@ test_expect_success 'add outside sparse cone' ' run_on_sparse ../edit-contents folder1/a && run_on_sparse ../edit-contents folder1/newfile && test_sparse_match test_must_fail git add folder1/a && - grep "Disable or modify the sparsity rules" sparse-checkout-err && + test_grep "Disable or modify the sparsity rules" sparse-checkout-err && test_sparse_unstaged folder1/a && test_sparse_match test_must_fail git add folder1/newfile && - grep "Disable or modify the sparsity rules" sparse-checkout-err && + test_grep "Disable or modify the sparsity rules" sparse-checkout-err && test_sparse_unstaged folder1/newfile ' @@ -509,13 +509,13 @@ test_expect_success 'status/add: outside sparse cone' ' # Adding the path outside of the sparse-checkout cone should fail. test_sparse_match test_must_fail git add folder1/a && - grep "Disable or modify the sparsity rules" sparse-checkout-err && + test_grep "Disable or modify the sparsity rules" sparse-checkout-err && test_sparse_unstaged folder1/a && test_all_match git add --refresh folder1/a && test_must_be_empty sparse-checkout-err && test_sparse_unstaged folder1/a && test_sparse_match test_must_fail git add folder1/new && - grep "Disable or modify the sparsity rules" sparse-checkout-err && + test_grep "Disable or modify the sparsity rules" sparse-checkout-err && test_sparse_unstaged folder1/new && test_sparse_match git add --sparse folder1/a && test_sparse_match git add --sparse folder1/new && @@ -661,8 +661,8 @@ test_expect_success 'checkout and reset (mixed)' ' # in sparse-checkout or sparse-index. git -C full-checkout reset update-folder1 >full-checkout-out && test_sparse_match git reset update-folder1 && - grep "M folder1/a" full-checkout-out && - ! grep "M folder1/a" sparse-checkout-out && + test_grep "M folder1/a" full-checkout-out && + test_grep ! "M folder1/a" sparse-checkout-out && run_on_sparse test_path_is_missing folder1 ' @@ -880,8 +880,8 @@ test_expect_success 'update-index with directories' ' # update-index will exit silently when provided with a directory name # containing a trailing slash test_all_match git update-index deep/ folder1/ && - grep "Ignoring path deep/" sparse-checkout-err && - grep "Ignoring path folder1/" sparse-checkout-err && + test_grep "Ignoring path deep/" sparse-checkout-err && + test_grep "Ignoring path folder1/" sparse-checkout-err && # When update-index is given a directory name WITHOUT a trailing slash, it will # behave in different ways depending on the status of the directory on disk: @@ -1067,7 +1067,7 @@ test_expect_success 'merge with conflict outside cone' ' # 2. Add the file with conflict markers test_sparse_match test_must_fail git add folder1/a && - grep "Disable or modify the sparsity rules" sparse-checkout-err && + test_grep "Disable or modify the sparsity rules" sparse-checkout-err && test_sparse_unstaged folder1/a && test_all_match git add --sparse folder1/a && test_all_match git status --porcelain=v2 && @@ -1076,7 +1076,7 @@ test_expect_success 'merge with conflict outside cone' ' # accept conflict markers as resolved content. run_on_all mv folder2/a folder2/z && test_sparse_match test_must_fail git add folder2 && - grep "Disable or modify the sparsity rules" sparse-checkout-err && + test_grep "Disable or modify the sparsity rules" sparse-checkout-err && test_sparse_unstaged folder2/z && test_all_match git add --sparse folder2 && test_all_match git status --porcelain=v2 && @@ -1107,7 +1107,7 @@ test_expect_success 'cherry-pick/rebase with conflict outside cone' ' # SKIP_WORKTREE bit from the index entry for folder1/a, we should # warn that this is a problematic add. test_sparse_match test_must_fail git add folder1/a && - grep "Disable or modify the sparsity rules" sparse-checkout-err && + test_grep "Disable or modify the sparsity rules" sparse-checkout-err && test_sparse_unstaged folder1/a && test_all_match git add --sparse folder1/a && test_all_match git status --porcelain=v2 && @@ -1119,7 +1119,7 @@ test_expect_success 'cherry-pick/rebase with conflict outside cone' ' # existing index entry with the SKIP_WORKTREE bit cleared. run_on_all mv folder2/a folder2/z && test_sparse_match test_must_fail git add folder2 && - grep "Disable or modify the sparsity rules" sparse-checkout-err && + test_grep "Disable or modify the sparsity rules" sparse-checkout-err && test_sparse_unstaged folder2/z && test_all_match git add --sparse folder2 && test_all_match git status --porcelain=v2 && @@ -1266,7 +1266,7 @@ test_expect_success 'checkout-index with folders' ' run_on_all test_must_fail git checkout-index -f -- folder1/ && test_cmp full-checkout-err sparse-checkout-err && ! test_cmp full-checkout-err sparse-index-err && - grep "is a sparse directory" sparse-index-err + test_grep "is a sparse directory" sparse-index-err ' test_expect_success 'checkout-index --all' ' @@ -1374,8 +1374,8 @@ test_expect_success 'submodule handling' ' # having a submodule prevents "modules" from collapse test_sparse_match git sparse-checkout set deep/deeper1 && git -C sparse-index ls-files --sparse --stage >cache && - grep "100644 .* modules/a" cache && - grep "160000 $(git -C initial-repo rev-parse HEAD) 0 modules/sub" cache + test_grep "100644 .* modules/a" cache && + test_grep "160000 $(git -C initial-repo rev-parse HEAD) 0 modules/sub" cache ' test_expect_success 'git apply functionality' ' @@ -1392,7 +1392,7 @@ test_expect_success 'git apply functionality' ' # Apply a patch to a file outside the sparse definition test_sparse_match test_must_fail git apply ../patch-outside && - grep "No such file or directory" sparse-checkout-err && + test_grep "No such file or directory" sparse-checkout-err && # But it works with --index and --cached test_all_match git apply --index --stat ../patch-outside && @@ -2013,9 +2013,9 @@ test_expect_success 'mv directory from out-of-cone to in-cone' ' test_all_match git status --porcelain=v2 && test_sparse_match git ls-files -t && git -C sparse-checkout ls-files -t >actual && - grep -e "H deep/folder1/0/0/0" actual && - grep -e "H deep/folder1/0/1" actual && - grep -e "H deep/folder1/a" actual && + test_grep -e "H deep/folder1/0/0/0" actual && + test_grep -e "H deep/folder1/0/1" actual && + test_grep -e "H deep/folder1/a" actual && test_all_match git reset --hard && @@ -2025,8 +2025,8 @@ test_expect_success 'mv directory from out-of-cone to in-cone' ' test_sparse_match git status --porcelain=v2 && test_sparse_match git ls-files -t && git -C sparse-checkout ls-files -t >actual && - grep -e "H deep/0/0/0" actual && - grep -e "H deep/0/1" actual + test_grep -e "H deep/0/0/0" actual && + test_grep -e "H deep/0/1" actual ' test_expect_success 'rm pathspec inside sparse definition' ' @@ -2517,7 +2517,7 @@ test_expect_success 'advice.sparseIndexExpanded' ' mkdir -p sparse-index/deep/deeper2/deepest && touch sparse-index/deep/deeper2/deepest/bogus && git -C sparse-index status 2>err && - grep "The sparse index is expanding to a full index" err && + test_grep "The sparse index is expanding to a full index" err && git -C sparse-index sparse-checkout disable 2>err && test_line_count = 0 err diff --git a/t/t1300-config.sh b/t/t1300-config.sh index 11fc976f3ab271..b337e25d92deb5 100755 --- a/t/t1300-config.sh +++ b/t/t1300-config.sh @@ -800,7 +800,7 @@ test_expect_success 'renaming a section with an overly-long line' ' printf "[a] g = h\\n" } >y && test_must_fail git config ${mode_prefix}rename-section -f y a xyz 2>err && - grep "refusing to work with overly long line in .y. on line 2" err + test_grep "refusing to work with overly long line in .y. on line 2" err ' cat >> .git/config << EOF @@ -1615,9 +1615,9 @@ test_expect_success 'git --config-env=key=envvar support' ' test_expect_success 'git --config-env with missing value' ' test_must_fail env ENVVAR=value git --config-env 2>error && - grep "no config key given for --config-env" error && + test_grep "no config key given for --config-env" error && test_must_fail env ENVVAR=value git --config-env config core.name 2>error && - grep "invalid config format: config" error + test_grep "invalid config format: config" error ' test_expect_success 'git --config-env fails with invalid parameters' ' @@ -2048,7 +2048,7 @@ test_expect_success '--unset last key removes section (except if commented)' ' key = true EOF git config ${mode_unset} two.key && - ! grep two .git/config && + test_grep ! two .git/config && q_to_tab >.git/config <<-\EOF && [one] @@ -2068,7 +2068,7 @@ test_expect_success '--unset last key removes section (except if commented)' ' Qkey = true EOF git config ${mode_unset} two.key && - grep two .git/config && + test_grep two .git/config && q_to_tab >.git/config <<-\EOF && [one] @@ -2599,7 +2599,7 @@ test_expect_success '--type rejects unknown specifiers' ' test_expect_success '--type=int requires at least one digit' ' test_must_fail git config --type int --default m some.key >out 2>error && - grep "bad numeric config value" error && + test_grep "bad numeric config value" error && test_must_be_empty out ' @@ -2911,12 +2911,12 @@ test_expect_success 'includeIf.hasconfig:remote.*.url forbids remote url in such # test with any Git command test_must_fail git -C hasremoteurlTest status 2>err && - grep "fatal: remote URLs cannot be configured in file directly or indirectly included by includeIf.hasconfig:remote.*.url" err + test_grep "fatal: remote URLs cannot be configured in file directly or indirectly included by includeIf.hasconfig:remote.*.url" err ' test_expect_success 'negated mode causes failure' ' test_must_fail git config --no-get 2>err && - grep "unknown option \`no-get${SQ}" err + test_grep "unknown option \`no-get${SQ}" err ' test_expect_success 'specifying multiple modes causes failure' ' diff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh index f3892578e4ff86..f6115269f9ede0 100755 --- a/t/t1305-config-include.sh +++ b/t/t1305-config-include.sh @@ -353,7 +353,7 @@ test_expect_success 'include cycles are detected' ' git -C cycle --git-dir=. config include.path cycle && git config -f cycle/cycle include.path config && test_must_fail git -C cycle --git-dir=. config --get-all test.value 2>stderr && - grep "exceeded maximum include depth" stderr + test_grep "exceeded maximum include depth" stderr ' test_expect_success 'onbranch with unborn branch' ' diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh index e0e49053f07fbc..de95161a83c57a 100755 --- a/t/t1308-config-set.sh +++ b/t/t1308-config-set.sh @@ -180,7 +180,7 @@ test_expect_success 'find integer if value is non parse-able' ' test_expect_success 'non parse-able integer value during iteration' ' check_config expect_code 128 git_config_int lamb.head 2>result && - grep "fatal: bad numeric config value .* in file \.git/config" result + test_grep "fatal: bad numeric config value .* in file \.git/config" result ' test_expect_success 'find bool value for the entered key' ' @@ -302,7 +302,7 @@ test_expect_success 'proper error on directory "files"' ' echo "Error (-1) reading configuration file a-directory." >expect && mkdir a-directory && test_expect_code 2 test-tool config configset_get_value foo.bar a-directory 2>output && - grep "^warning:" output && + test_grep "^warning:" output && grep "^Error" output >actual && test_cmp expect actual ' @@ -312,7 +312,7 @@ test_expect_success POSIXPERM,SANITY 'proper error on non-accessible files' ' test_when_finished "chmod +r .git/config" && echo "Error (-1) reading configuration file .git/config." >expect && test_expect_code 2 test-tool config configset_get_value foo.bar .git/config 2>output && - grep "^warning:" output && + test_grep "^warning:" output && grep "^Error" output >actual && test_cmp expect actual ' diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index 1015f335e31611..7c890716624664 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -92,7 +92,7 @@ test_expect_success "deleting current branch adds message to HEAD's log" ' git update-ref -m delete-$m -d $m && test_must_fail git show-ref --verify -q $m && test-tool ref-store main for-each-reflog-ent HEAD >actual && - grep "delete-$m$" actual + test_grep "delete-$m$" actual ' test_expect_success "deleting by HEAD adds message to HEAD's log" ' @@ -102,7 +102,7 @@ test_expect_success "deleting by HEAD adds message to HEAD's log" ' git update-ref -m delete-by-head -d HEAD && test_must_fail git show-ref --verify -q $m && test-tool ref-store main for-each-reflog-ent HEAD >actual && - grep "delete-by-head$" actual + test_grep "delete-by-head$" actual ' test_expect_success 'update-ref does not create reflogs by default' ' @@ -192,7 +192,7 @@ test_expect_success "move $m (by HEAD)" ' test_expect_success "delete $m (by HEAD) should remove both packed and loose $m" ' test_when_finished "git update-ref -d $m" && git update-ref -d HEAD $B && - ! grep "$m" .git/packed-refs && + ! grep "$m" .git/packed-refs && # lint-ok: file may not exist (reftable) test_must_fail git show-ref --verify -q $m ' @@ -575,103 +575,103 @@ test_expect_success 'stdin works with no input' ' test_expect_success 'stdin fails on empty line' ' echo "" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: empty command in input" err + test_grep "fatal: empty command in input" err ' test_expect_success 'stdin fails on only whitespace' ' echo " " >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: whitespace before command: " err + test_grep "fatal: whitespace before command: " err ' test_expect_success 'stdin fails on leading whitespace' ' echo " create $a $m" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: whitespace before command: create $a $m" err + test_grep "fatal: whitespace before command: create $a $m" err ' test_expect_success 'stdin fails on unknown command' ' echo "unknown $a" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: unknown command: unknown $a" err + test_grep "fatal: unknown command: unknown $a" err ' test_expect_success 'stdin fails on unbalanced quotes' ' echo "create $a \"main" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: badly quoted argument: \\\"main" err + test_grep "fatal: badly quoted argument: \\\"main" err ' test_expect_success 'stdin fails on invalid escape' ' echo "create $a \"ma\zn\"" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: badly quoted argument: \\\"ma\\\\zn\\\"" err + test_grep "fatal: badly quoted argument: \\\"ma\\\\zn\\\"" err ' test_expect_success 'stdin fails on junk after quoted argument' ' echo "create \"$a\"main" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: unexpected character after quoted argument: \\\"$a\\\"main" err + test_grep "fatal: unexpected character after quoted argument: \\\"$a\\\"main" err ' test_expect_success 'stdin fails create with no ref' ' echo "create " >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: create: missing " err + test_grep "fatal: create: missing " err ' test_expect_success 'stdin fails create with no new value' ' echo "create $a" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: create $a: missing " err + test_grep "fatal: create $a: missing " err ' test_expect_success 'stdin fails create with too many arguments' ' echo "create $a $m $m" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: create $a: extra input: $m" err + test_grep "fatal: create $a: extra input: $m" err ' test_expect_success 'stdin fails update with no ref' ' echo "update " >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: update: missing " err + test_grep "fatal: update: missing " err ' test_expect_success 'stdin fails update with no new value' ' echo "update $a" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: update $a: missing " err + test_grep "fatal: update $a: missing " err ' test_expect_success 'stdin fails update with too many arguments' ' echo "update $a $m $m $m" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: update $a: extra input: $m" err + test_grep "fatal: update $a: extra input: $m" err ' test_expect_success 'stdin fails delete with no ref' ' echo "delete " >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: delete: missing " err + test_grep "fatal: delete: missing " err ' test_expect_success 'stdin fails delete with too many arguments' ' echo "delete $a $m $m" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: delete $a: extra input: $m" err + test_grep "fatal: delete $a: extra input: $m" err ' test_expect_success 'stdin fails verify with too many arguments' ' echo "verify $a $m $m" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: verify $a: extra input: $m" err + test_grep "fatal: verify $a: extra input: $m" err ' test_expect_success 'stdin fails option with unknown name' ' echo "option unknown" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: option unknown: unknown" err + test_grep "fatal: option unknown: unknown" err ' test_expect_success 'stdin fails with duplicate refs' ' @@ -759,28 +759,28 @@ test_expect_success 'stdin create ref works with path with space to blob' ' test_expect_success 'stdin update ref fails with wrong old value' ' echo "update $c $m $m~1" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: cannot lock ref '"'"'$c'"'"'" err && + test_grep "fatal: cannot lock ref '"'"'$c'"'"'" err && test_must_fail git rev-parse --verify -q $c ' test_expect_success 'stdin update ref fails with bad old value' ' echo "update $c $m does-not-exist" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: update $c: invalid : does-not-exist" err && + test_grep "fatal: update $c: invalid : does-not-exist" err && test_must_fail git rev-parse --verify -q $c ' test_expect_success 'stdin create ref fails with bad new value' ' echo "create $c does-not-exist" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: create $c: invalid : does-not-exist" err && + test_grep "fatal: create $c: invalid : does-not-exist" err && test_must_fail git rev-parse --verify -q $c ' test_expect_success 'stdin create ref fails with zero new value' ' echo "create $c " >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: create $c: zero " err && + test_grep "fatal: create $c: zero " err && test_must_fail git rev-parse --verify -q $c ' @@ -795,7 +795,7 @@ test_expect_success 'stdin update ref works with right old value' ' test_expect_success 'stdin delete ref fails with wrong old value' ' echo "delete $a $m~1" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: cannot lock ref '"'"'$a'"'"'" err && + test_grep "fatal: cannot lock ref '"'"'$a'"'"'" err && git rev-parse $m >expect && git rev-parse $a >actual && test_cmp expect actual @@ -804,7 +804,7 @@ test_expect_success 'stdin delete ref fails with wrong old value' ' test_expect_success 'stdin delete ref fails with zero old value' ' echo "delete $a " >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: delete $a: zero " err && + test_grep "fatal: delete $a: zero " err && git rev-parse $m >expect && git rev-parse $a >actual && test_cmp expect actual @@ -965,7 +965,7 @@ test_expect_success 'stdin update refs fails with wrong old value' ' update $c '' EOF test_must_fail git update-ref --stdin err && - grep "fatal: cannot lock ref '"'"'$c'"'"'" err && + test_grep "fatal: cannot lock ref '"'"'$c'"'"'" err && git rev-parse $m >expect && git rev-parse $a >actual && test_cmp expect actual && @@ -998,123 +998,123 @@ test_expect_success 'stdin -z works on empty input' ' test_expect_success 'stdin -z fails on empty line' ' echo "" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: whitespace before command: " err + test_grep "fatal: whitespace before command: " err ' test_expect_success 'stdin -z fails on empty command' ' printf $F "" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: empty command in input" err + test_grep "fatal: empty command in input" err ' test_expect_success 'stdin -z fails on only whitespace' ' printf $F " " >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: whitespace before command: " err + test_grep "fatal: whitespace before command: " err ' test_expect_success 'stdin -z fails on leading whitespace' ' printf $F " create $a" "$m" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: whitespace before command: create $a" err + test_grep "fatal: whitespace before command: create $a" err ' test_expect_success 'stdin -z fails on unknown command' ' printf $F "unknown $a" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: unknown command: unknown $a" err + test_grep "fatal: unknown command: unknown $a" err ' test_expect_success 'stdin -z fails create with no ref' ' printf $F "create " >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: create: missing " err + test_grep "fatal: create: missing " err ' test_expect_success 'stdin -z fails create with no new value' ' printf $F "create $a" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: create $a: unexpected end of input when reading " err + test_grep "fatal: create $a: unexpected end of input when reading " err ' test_expect_success 'stdin -z fails create with too many arguments' ' printf $F "create $a" "$m" "$m" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: unknown command: $m" err + test_grep "fatal: unknown command: $m" err ' test_expect_success 'stdin -z fails update with no ref' ' printf $F "update " >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: update: missing " err + test_grep "fatal: update: missing " err ' test_expect_success 'stdin -z fails update with too few args' ' printf $F "update $a" "$m" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: update $a: unexpected end of input when reading " err + test_grep "fatal: update $a: unexpected end of input when reading " err ' test_expect_success 'stdin -z emits warning with empty new value' ' git update-ref $a $m && printf $F "update $a" "" "" >stdin && git update-ref -z --stdin err && - grep "warning: update $a: missing , treating as zero" err && + test_grep "warning: update $a: missing , treating as zero" err && test_must_fail git rev-parse --verify -q $a ' test_expect_success 'stdin -z fails update with no new value' ' printf $F "update $a" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: update $a: unexpected end of input when reading " err + test_grep "fatal: update $a: unexpected end of input when reading " err ' test_expect_success 'stdin -z fails update with no old value' ' printf $F "update $a" "$m" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: update $a: unexpected end of input when reading " err + test_grep "fatal: update $a: unexpected end of input when reading " err ' test_expect_success 'stdin -z fails update with too many arguments' ' printf $F "update $a" "$m" "$m" "$m" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: unknown command: $m" err + test_grep "fatal: unknown command: $m" err ' test_expect_success 'stdin -z fails delete with no ref' ' printf $F "delete " >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: delete: missing " err + test_grep "fatal: delete: missing " err ' test_expect_success 'stdin -z fails delete with no old value' ' printf $F "delete $a" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: delete $a: unexpected end of input when reading " err + test_grep "fatal: delete $a: unexpected end of input when reading " err ' test_expect_success 'stdin -z fails delete with too many arguments' ' printf $F "delete $a" "$m" "$m" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: unknown command: $m" err + test_grep "fatal: unknown command: $m" err ' test_expect_success 'stdin -z fails verify with too many arguments' ' printf $F "verify $a" "$m" "$m" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: unknown command: $m" err + test_grep "fatal: unknown command: $m" err ' test_expect_success 'stdin -z fails verify with no old value' ' printf $F "verify $a" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: verify $a: unexpected end of input when reading " err + test_grep "fatal: verify $a: unexpected end of input when reading " err ' test_expect_success 'stdin -z fails option with unknown name' ' printf $F "option unknown" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: option unknown: unknown" err + test_grep "fatal: option unknown: unknown" err ' test_expect_success 'stdin -z fails with duplicate refs' ' @@ -1160,14 +1160,14 @@ test_expect_success 'stdin -z create ref works with path with space to blob' ' test_expect_success 'stdin -z update ref fails with wrong old value' ' printf $F "update $c" "$m" "$m~1" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: cannot lock ref '"'"'$c'"'"'" err && + test_grep "fatal: cannot lock ref '"'"'$c'"'"'" err && test_must_fail git rev-parse --verify -q $c ' test_expect_success 'stdin -z update ref fails with bad old value' ' printf $F "update $c" "$m" "does-not-exist" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: update $c: invalid : does-not-exist" err && + test_grep "fatal: update $c: invalid : does-not-exist" err && test_must_fail git rev-parse --verify -q $c ' @@ -1176,7 +1176,7 @@ test_expect_success 'stdin -z create ref fails when ref exists' ' git rev-parse "$c" >expect && printf $F "create $c" "$m~1" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: cannot lock ref '"'"'$c'"'"'" err && + test_grep "fatal: cannot lock ref '"'"'$c'"'"'" err && git rev-parse "$c" >actual && test_cmp expect actual ' @@ -1185,28 +1185,28 @@ test_expect_success 'stdin -z create ref fails with bad new value' ' git update-ref -d "$c" && printf $F "create $c" "does-not-exist" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: create $c: invalid : does-not-exist" err && + test_grep "fatal: create $c: invalid : does-not-exist" err && test_must_fail git rev-parse --verify -q $c ' test_expect_success 'stdin -z create ref fails with empty new value' ' printf $F "create $c" "" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: create $c: missing " err && + test_grep "fatal: create $c: missing " err && test_must_fail git rev-parse --verify -q $c ' test_expect_success 'stdin -z create ref fails with non commit object' ' printf $F "create $c" "$(test_oid 001)" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: trying to write ref ${SQ}$c${SQ} with nonexistent object" err && + test_grep "fatal: trying to write ref ${SQ}$c${SQ} with nonexistent object" err && test_must_fail git rev-parse --verify -q $c ' test_expect_success 'stdin -z update ref fails with non commit object' ' printf $F "update $b" "$(test_oid 001)" "" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: trying to write ref ${SQ}$b${SQ} with nonexistent object" err && + test_grep "fatal: trying to write ref ${SQ}$b${SQ} with nonexistent object" err && test_must_fail git rev-parse --verify -q $c ' @@ -1221,7 +1221,7 @@ test_expect_success 'stdin -z update ref works with right old value' ' test_expect_success 'stdin -z delete ref fails with wrong old value' ' printf $F "delete $a" "$m~1" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: cannot lock ref '"'"'$a'"'"'" err && + test_grep "fatal: cannot lock ref '"'"'$a'"'"'" err && git rev-parse $m >expect && git rev-parse $a >actual && test_cmp expect actual @@ -1230,7 +1230,7 @@ test_expect_success 'stdin -z delete ref fails with wrong old value' ' test_expect_success 'stdin -z delete ref fails with zero old value' ' printf $F "delete $a" "$Z" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: delete $a: zero " err && + test_grep "fatal: delete $a: zero " err && git rev-parse $m >expect && git rev-parse $a >actual && test_cmp expect actual @@ -1336,7 +1336,7 @@ test_expect_success 'stdin -z update refs fails with wrong old value' ' git update-ref $c $m && printf $F "update $a" "$m" "$m" "update $b" "$m" "$m" "update $c" "$m" "$Z" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: cannot lock ref '"'"'$c'"'"'" err && + test_grep "fatal: cannot lock ref '"'"'$c'"'"'" err && git rev-parse $m >expect && git rev-parse $a >actual && test_cmp expect actual && @@ -1415,13 +1415,13 @@ test_expect_success 'handle per-worktree refs in refs/bisect' ' cd worktree && git commit --allow-empty -m "test commit" && git for-each-ref >for-each-ref.out && - ! grep refs/bisect for-each-ref.out && + test_grep ! refs/bisect for-each-ref.out && git update-ref refs/bisect/something HEAD && git rev-parse refs/bisect/something >../worktree-head && git for-each-ref | grep refs/bisect/something ) && git show-ref >actual && - ! grep 'refs/bisect' actual && + test_grep ! 'refs/bisect' actual && test_must_fail git rev-parse refs/bisect/something && git update-ref refs/bisect/something HEAD && git rev-parse refs/bisect/something >main-head && @@ -1477,7 +1477,7 @@ test_expect_success 'transaction exits on multiple aborts' ' test_must_fail git update-ref --stdin actual 2>err && printf "%s: ok\n" abort >expect && test_cmp expect actual && - grep "fatal: transaction is closed" err + test_grep "fatal: transaction is closed" err ' test_expect_success 'transaction exits on start after prepare' ' @@ -1488,7 +1488,7 @@ test_expect_success 'transaction exits on start after prepare' ' test_must_fail git update-ref --stdin err >actual && printf "%s: ok\n" prepare >expect && test_cmp expect actual && - grep "fatal: prepared transactions can only be closed" err + test_grep "fatal: prepared transactions can only be closed" err ' test_expect_success 'transaction handles empty abort with missing prepare' ' @@ -1648,7 +1648,7 @@ test_expect_success PIPE 'transaction flushes status updates' ' # This must now fail given that we have locked the ref. test_must_fail git update-ref refs/heads/flush $B 2>stderr && - grep "fatal: update_ref failed for ref ${SQ}refs/heads/flush${SQ}: cannot lock ref" stderr && + test_grep "fatal: update_ref failed for ref ${SQ}refs/heads/flush${SQ}: cannot lock ref" stderr && echo commit >&9 && echo "commit: ok" >expected && @@ -1674,7 +1674,7 @@ do git symbolic-ref refs/heads/symref $a && format_command $type "symref-verify refs/heads/symref" "$a" >stdin && test_must_fail git update-ref --stdin $type err && - grep "fatal: symref-verify: cannot operate with deref mode" err + test_grep "fatal: symref-verify: cannot operate with deref mode" err ' test_expect_success "stdin $type symref-verify fails with too many arguments" ' @@ -1682,9 +1682,9 @@ do test_must_fail git update-ref --stdin $type --no-deref err && if test "$type" = "-z" then - grep "fatal: unknown command: $a" err + test_grep "fatal: unknown command: $a" err else - grep "fatal: symref-verify refs/heads/symref: extra input: $a" err + test_grep "fatal: symref-verify refs/heads/symref: extra input: $a" err fi ' @@ -1717,7 +1717,7 @@ do test-tool ref-store main for-each-reflog-ent refs/heads/symref >before && format_command $type "symref-verify refs/heads/missing" "refs/heads/unknown" >stdin && test_must_fail git update-ref --stdin $type --no-deref err && - grep "fatal: cannot lock ref ${SQ}refs/heads/missing${SQ}: unable to resolve reference ${SQ}refs/heads/missing${SQ}" err && + test_grep "fatal: cannot lock ref ${SQ}refs/heads/missing${SQ}: unable to resolve reference ${SQ}refs/heads/missing${SQ}" err && test_must_fail git rev-parse --verify -q refs/heads/missing && test-tool ref-store main for-each-reflog-ent refs/heads/symref >after && test_cmp before after @@ -1743,13 +1743,13 @@ do git symbolic-ref refs/heads/symref $a && format_command $type "symref-delete refs/heads/symref" "$a" >stdin && test_must_fail git update-ref --stdin $type err && - grep "fatal: symref-delete: cannot operate with deref mode" err + test_grep "fatal: symref-delete: cannot operate with deref mode" err ' test_expect_success "stdin $type symref-delete fails with no ref" ' format_command $type "symref-delete " >stdin && test_must_fail git update-ref --stdin $type --no-deref err && - grep "fatal: symref-delete: missing " err + test_grep "fatal: symref-delete: missing " err ' test_expect_success "stdin $type symref-delete fails deleting regular ref" ' @@ -1757,7 +1757,7 @@ do git update-ref refs/heads/regularref $a && format_command $type "symref-delete refs/heads/regularref" "$a" >stdin && test_must_fail git update-ref --stdin $type --no-deref err && - grep "fatal: cannot lock ref ${SQ}refs/heads/regularref${SQ}: expected symref with target ${SQ}$a${SQ}: but is a regular ref" err + test_grep "fatal: cannot lock ref ${SQ}refs/heads/regularref${SQ}: expected symref with target ${SQ}$a${SQ}: but is a regular ref" err ' test_expect_success "stdin $type symref-delete fails with too many arguments" ' @@ -1765,16 +1765,16 @@ do test_must_fail git update-ref --stdin $type --no-deref err && if test "$type" = "-z" then - grep "fatal: unknown command: $a" err + test_grep "fatal: unknown command: $a" err else - grep "fatal: symref-delete refs/heads/symref: extra input: $a" err + test_grep "fatal: symref-delete refs/heads/symref: extra input: $a" err fi ' test_expect_success "stdin $type symref-delete fails with wrong old value" ' format_command $type "symref-delete refs/heads/symref" "$m" >stdin && test_must_fail git update-ref --stdin $type --no-deref err && - grep "fatal: verifying symref target: ${SQ}refs/heads/symref${SQ}: is at $a but expected refs/heads/main" err && + test_grep "fatal: verifying symref target: ${SQ}refs/heads/symref${SQ}: is at $a but expected refs/heads/main" err && git symbolic-ref refs/heads/symref >expect && echo $a >actual && test_cmp expect actual @@ -1812,9 +1812,9 @@ do test_must_fail git update-ref --stdin $type --no-deref err && if test "$type" = "-z" then - grep "fatal: unknown command: $a" err + test_grep "fatal: unknown command: $a" err else - grep "fatal: symref-create refs/heads/symref: extra input: $a" err + test_grep "fatal: symref-create refs/heads/symref: extra input: $a" err fi ' @@ -1877,16 +1877,16 @@ do test_must_fail git update-ref --stdin $type --no-deref err && if test "$type" = "-z" then - grep "fatal: unknown command: $a" err + test_grep "fatal: unknown command: $a" err else - grep "fatal: symref-update refs/heads/symref: extra input: $a" err + test_grep "fatal: symref-update refs/heads/symref: extra input: $a" err fi ' test_expect_success "stdin $type symref-update fails with wrong old value argument" ' format_command $type "symref-update refs/heads/symref" "$a" "foo" "$a" "$a" >stdin && test_must_fail git update-ref --stdin $type --no-deref err && - grep "fatal: symref-update refs/heads/symref: invalid arg ${SQ}foo${SQ} for old value" err + test_grep "fatal: symref-update refs/heads/symref: invalid arg ${SQ}foo${SQ} for old value" err ' test_expect_success "stdin $type symref-update creates with zero old value" ' @@ -1922,7 +1922,7 @@ do git symbolic-ref refs/heads/symref $a && format_command $type "symref-update refs/heads/symref" "$m" "ref" "$b" >stdin && test_must_fail git update-ref --stdin $type --no-deref err && - grep "fatal: verifying symref target: ${SQ}refs/heads/symref${SQ}: is at $a but expected $b" err && + test_grep "fatal: verifying symref target: ${SQ}refs/heads/symref${SQ}: is at $a but expected $b" err && test_must_fail git rev-parse --verify -q $c ' @@ -1997,7 +1997,7 @@ do git symbolic-ref --no-recurse refs/heads/symref >actual && test_cmp expect actual && test-tool ref-store main for-each-reflog-ent refs/heads/symref >actual && - grep "$Z $(git rev-parse $a)" actual + test_grep "$Z $(git rev-parse $a)" actual ' test_expect_success "stdin $type symref-update regular ref to symref with correct old-oid" ' @@ -2009,7 +2009,7 @@ do git symbolic-ref --no-recurse refs/heads/regularref >actual && test_cmp expect actual && test-tool ref-store main for-each-reflog-ent refs/heads/regularref >actual && - grep "$(git rev-parse $a) $(git rev-parse $a)" actual + test_grep "$(git rev-parse $a) $(git rev-parse $a)" actual ' test_expect_success "stdin $type symref-update regular ref to symref fails with wrong old-oid" ' @@ -2017,7 +2017,7 @@ do git update-ref --no-deref refs/heads/regularref $a && format_command $type "symref-update refs/heads/regularref" "$a" "oid" "$(git rev-parse refs/heads/target2)" >stdin && test_must_fail git update-ref --stdin $type err && - grep "fatal: cannot lock ref ${SQ}refs/heads/regularref${SQ}: is at $(git rev-parse $a) but expected $(git rev-parse refs/heads/target2)" err && + test_grep "fatal: cannot lock ref ${SQ}refs/heads/regularref${SQ}: is at $(git rev-parse $a) but expected $(git rev-parse refs/heads/target2)" err && echo $(git rev-parse $a) >expect && git rev-parse refs/heads/regularref >actual && test_cmp expect actual @@ -2028,7 +2028,7 @@ do git update-ref --no-deref refs/heads/regularref $a && format_command $type "symref-update refs/heads/regularref" "$a" "oid" "not-a-ref-oid" >stdin && test_must_fail git update-ref --stdin $type err && - grep "fatal: symref-update refs/heads/regularref: invalid oid: not-a-ref-oid" err && + test_grep "fatal: symref-update refs/heads/regularref: invalid oid: not-a-ref-oid" err && echo $(git rev-parse $a) >expect && git rev-parse refs/heads/regularref >actual && test_cmp expect actual @@ -2039,7 +2039,7 @@ do git symbolic-ref refs/heads/symref refs/heads/target2 && format_command $type "symref-update refs/heads/symref" "$a" "oid" "$Z" >stdin && test_must_fail git update-ref --stdin $type err && - grep "fatal: cannot lock ref ${SQ}refs/heads/symref${SQ}: reference already exists" err && + test_grep "fatal: cannot lock ref ${SQ}refs/heads/symref${SQ}: reference already exists" err && echo refs/heads/target2 >expect && git symbolic-ref refs/heads/symref >actual && test_cmp expect actual @@ -2059,7 +2059,7 @@ do git symbolic-ref --no-recurse refs/heads/symref >actual && test_cmp expect actual && test-tool ref-store main for-each-reflog-ent refs/heads/symref >actual && - grep "$(git rev-parse $a) $(git rev-parse $a)" actual + test_grep "$(git rev-parse $a) $(git rev-parse $a)" actual ' test_expect_success "stdin $type symref-update regular ref to symref" ' @@ -2071,7 +2071,7 @@ do git symbolic-ref --no-recurse refs/heads/regularref >actual && test_cmp expect actual && test-tool ref-store main for-each-reflog-ent refs/heads/regularref >actual && - grep "$(git rev-parse $a) $(git rev-parse $a)" actual + test_grep "$(git rev-parse $a) $(git rev-parse $a)" actual ' test_expect_success "stdin $type batch-updates" ' diff --git a/t/t1403-show-ref.sh b/t/t1403-show-ref.sh index 36c903ca1901bf..7ce5af4ab8bd06 100755 --- a/t/t1403-show-ref.sh +++ b/t/t1403-show-ref.sh @@ -213,19 +213,19 @@ test_expect_success 'show-ref --verify with dangling ref' ' test_expect_success 'show-ref sub-modes are mutually exclusive' ' test_must_fail git show-ref --verify --exclude-existing 2>err && - grep "verify" err && - grep "exclude-existing" err && - grep "cannot be used together" err && + test_grep "verify" err && + test_grep "exclude-existing" err && + test_grep "cannot be used together" err && test_must_fail git show-ref --verify --exists 2>err && - grep "verify" err && - grep "exists" err && - grep "cannot be used together" err && + test_grep "verify" err && + test_grep "exists" err && + test_grep "cannot be used together" err && test_must_fail git show-ref --exclude-existing --exists 2>err && - grep "exclude-existing" err && - grep "exists" err && - grep "cannot be used together" err + test_grep "exclude-existing" err && + test_grep "exists" err && + test_grep "cannot be used together" err ' test_done diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh index ce71f9a30ae1ee..81de1d40eba7fd 100755 --- a/t/t1410-reflog.sh +++ b/t/t1410-reflog.sh @@ -108,12 +108,12 @@ test_expect_success setup ' test_expect_success 'correct usage on sub-command -h' ' test_expect_code 129 git reflog expire -h >err && - grep "git reflog expire" err + test_grep "git reflog expire" err ' test_expect_success 'correct usage on "git reflog show -h"' ' test_expect_code 129 git reflog show -h >err && - grep -F "git reflog [show]" err + test_grep -F "git reflog [show]" err ' test_expect_success 'pass through -- to sub-command' ' diff --git a/t/t1415-worktree-refs.sh b/t/t1415-worktree-refs.sh index 51d79bae83b429..6b2ad04aef1d0e 100755 --- a/t/t1415-worktree-refs.sh +++ b/t/t1415-worktree-refs.sh @@ -32,7 +32,7 @@ test_expect_success 'ambiguous main-worktree/HEAD' ' test_when_finished git update-ref -d refs/heads/main-worktree/HEAD && git update-ref refs/heads/main-worktree/HEAD $(git rev-parse HEAD) && git rev-parse main-worktree/HEAD 2>warn && - grep "main-worktree/HEAD.*ambiguous" warn + test_grep "main-worktree/HEAD.*ambiguous" warn ' test_expect_success 'resolve worktrees/xx/HEAD' ' @@ -45,7 +45,7 @@ test_expect_success 'ambiguous worktrees/xx/HEAD' ' git update-ref refs/heads/worktrees/wt1/HEAD $(git rev-parse HEAD) && test_when_finished git update-ref -d refs/heads/worktrees/wt1/HEAD && git rev-parse worktrees/wt1/HEAD 2>warn && - grep "worktrees/wt1/HEAD.*ambiguous" warn + test_grep "worktrees/wt1/HEAD.*ambiguous" warn ' test_expect_success 'reflog of main-worktree/HEAD' ' diff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh index 3ab65f72cdec88..1ed4c7d2c233a8 100755 --- a/t/t1430-bad-ref-name.sh +++ b/t/t1430-bad-ref-name.sh @@ -47,7 +47,7 @@ test_expect_success 'git branch shows badly named ref as warning' ' test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && git branch >output 2>error && test_grep -e "ignoring ref with broken name refs/heads/broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" output ' test_expect_success 'branch -d can delete badly named ref' ' @@ -55,8 +55,8 @@ test_expect_success 'branch -d can delete badly named ref' ' test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && git branch -d broken...ref && git branch >output 2>error && - ! grep -e "broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" error && + test_grep ! -e "broken\.\.\.ref" output ' test_expect_success 'branch -D can delete badly named ref' ' @@ -64,8 +64,8 @@ test_expect_success 'branch -D can delete badly named ref' ' test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && git branch -D broken...ref && git branch >output 2>error && - ! grep -e "broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" error && + test_grep ! -e "broken\.\.\.ref" output ' test_expect_success 'branch -D cannot delete non-ref in .git dir' ' @@ -93,8 +93,8 @@ test_expect_success 'git branch cannot create a badly named ref' ' test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && test_must_fail git branch broken...ref && git branch >output 2>error && - ! grep -e "broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" error && + test_grep ! -e "broken\.\.\.ref" output ' test_expect_success 'branch -m cannot rename to a bad ref name' ' @@ -104,8 +104,8 @@ test_expect_success 'branch -m cannot rename to a bad ref name' ' test_must_fail git branch -m goodref broken...ref && test_cmp_rev main goodref && git branch >output 2>error && - ! grep -e "broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" error && + test_grep ! -e "broken\.\.\.ref" output ' test_expect_failure 'branch -m can rename from a bad ref name' ' @@ -115,16 +115,16 @@ test_expect_failure 'branch -m can rename from a bad ref name' ' git branch -m broken...ref renamed && test_cmp_rev main renamed && git branch >output 2>error && - ! grep -e "broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" error && + test_grep ! -e "broken\.\.\.ref" output ' test_expect_success 'push cannot create a badly named ref' ' test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && test_must_fail git push "file://$(pwd)" HEAD:refs/heads/broken...ref && git branch >output 2>error && - ! grep -e "broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" error && + test_grep ! -e "broken\.\.\.ref" output ' test_expect_failure 'push --mirror can delete badly named ref' ' @@ -144,8 +144,8 @@ test_expect_failure 'push --mirror can delete badly named ref' ' ) && git -C src push --mirror "file://$top/dest" && git -C dest branch >output 2>error && - ! grep -e "broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" error && + test_grep ! -e "broken\.\.\.ref" output ' test_expect_success 'rev-parse skips symref pointing to broken name' ' @@ -168,9 +168,9 @@ test_expect_success 'for-each-ref emits warnings for broken names' ' test-tool ref-store main create-symref refs/heads/broken...symref refs/heads/main && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && git for-each-ref >output 2>error && - ! grep -e "broken\.\.\.ref" output && - ! grep -e "badname" output && - ! grep -e "broken\.\.\.symref" output && + test_grep ! -e "broken\.\.\.ref" output && + test_grep ! -e "badname" output && + test_grep ! -e "broken\.\.\.symref" output && test_grep "ignoring ref with broken name refs/heads/broken\.\.\.ref" error && test_grep ! "ignoring broken ref refs/heads/badname" error && test_grep "ignoring ref with broken name refs/heads/broken\.\.\.symref" error @@ -183,8 +183,8 @@ test_expect_success 'update-ref -d can delete broken name' ' test_must_be_empty output && test_must_be_empty error && git branch >output 2>error && - ! grep -e "broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" error && + test_grep ! -e "broken\.\.\.ref" output ' test_expect_success 'branch -d can delete broken name' ' @@ -194,8 +194,8 @@ test_expect_success 'branch -d can delete broken name' ' test_grep "Deleted branch broken...ref (was broken)" output && test_must_be_empty error && git branch >output 2>error && - ! grep -e "broken\.\.\.ref" error && - ! grep -e "broken\.\.\.ref" output + test_grep ! -e "broken\.\.\.ref" error && + test_grep ! -e "broken\.\.\.ref" output ' test_expect_success 'update-ref --no-deref -d can delete symref to broken name' ' @@ -313,37 +313,37 @@ test_expect_success 'update-ref -d cannot delete absolute path' ' test_expect_success 'update-ref --stdin fails create with bad ref name' ' echo "create ~a refs/heads/main" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: invalid ref format: ~a" err + test_grep "fatal: invalid ref format: ~a" err ' test_expect_success 'update-ref --stdin fails update with bad ref name' ' echo "update ~a refs/heads/main" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: invalid ref format: ~a" err + test_grep "fatal: invalid ref format: ~a" err ' test_expect_success 'update-ref --stdin fails delete with bad ref name' ' echo "delete ~a refs/heads/main" >stdin && test_must_fail git update-ref --stdin err && - grep "fatal: invalid ref format: ~a" err + test_grep "fatal: invalid ref format: ~a" err ' test_expect_success 'update-ref --stdin -z fails create with bad ref name' ' printf "%s\0" "create ~a " refs/heads/main >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: invalid ref format: ~a " err + test_grep "fatal: invalid ref format: ~a " err ' test_expect_success 'update-ref --stdin -z fails update with bad ref name' ' printf "%s\0" "update ~a" refs/heads/main "" >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: invalid ref format: ~a" err + test_grep "fatal: invalid ref format: ~a" err ' test_expect_success 'update-ref --stdin -z fails delete with bad ref name' ' printf "%s\0" "delete ~a" refs/heads/main >stdin && test_must_fail git update-ref -z --stdin err && - grep "fatal: invalid ref format: ~a" err + test_grep "fatal: invalid ref format: ~a" err ' test_expect_success 'branch rejects HEAD as a branch name' ' diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index 54e81c263686de..47d460a69959ea 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -68,7 +68,7 @@ test_expect_success 'object with hash mismatch' ' git update-ref refs/heads/bogus $cmt && test_must_fail git fsck 2>out && - grep "$oldoid: hash-path mismatch, found at: .*$new" out + test_grep "$oldoid: hash-path mismatch, found at: .*$new" out ) ' @@ -172,7 +172,7 @@ test_expect_success 'commit with multiple signatures is okay' ' test_when_finished "git update-ref -d refs/heads/bogus" && git fsck 2>out && cat out && - ! grep "commit $new" out + test_grep ! "commit $new" out ' test_expect_success 'email without @ is okay' ' @@ -183,7 +183,7 @@ test_expect_success 'email without @ is okay' ' git update-ref refs/heads/bogus "$new" && test_when_finished "git update-ref -d refs/heads/bogus" && git fsck 2>out && - ! grep "commit $new" out + test_grep ! "commit $new" out ' test_expect_success 'email with embedded > is not okay' ' @@ -626,7 +626,7 @@ test_expect_success 'fsck notices excessively large tree entry name' ' cd large-name && test_commit a-long-name && git -c fsck.largePathname=warn:10 fsck 2>out && - grep "warning.*large pathname" out + test_grep "warning.*large pathname" out ) ' @@ -849,7 +849,7 @@ test_expect_success 'fsck errors in packed objects' ' test_must_fail git fsck 2>out && test_grep "error in commit $one.* - bad name" out && test_grep "error in commit $two.* - bad name" out && - ! grep corrupt out + test_grep ! corrupt out ' test_expect_success 'fsck handles multiple packfiles with big blobs' ' @@ -1027,7 +1027,7 @@ test_expect_success 'bogus head does not fallback to all heads' ' test_when_finished "git rm --cached foo" && remove_object $blob && test_must_fail git fsck $ZERO_OID >out 2>&1 && - ! grep $blob out + test_grep ! $blob out ' # Corrupt the checksum on the index. diff --git a/t/t1451-fsck-buffer.sh b/t/t1451-fsck-buffer.sh index 3a3d33f4054895..14151eabbd9ffa 100755 --- a/t/t1451-fsck-buffer.sh +++ b/t/t1451-fsck-buffer.sh @@ -46,7 +46,7 @@ check () { echo "$content" } >input && test_must_fail git hash-object -t "$type" input 2>err && - grep "$fsck" err + test_grep "$fsck" err ' } @@ -125,7 +125,7 @@ ident_checks tag tagger test_expect_success 'truncated tree (short hash)' ' printf "100644 foo\0\1\1\1\1" >input && test_must_fail git hash-object -t tree input 2>err && - grep badTree err + test_grep badTree err ' test_expect_success 'truncated tree (missing nul)' ' @@ -135,7 +135,7 @@ test_expect_success 'truncated tree (missing nul)' ' # parser does not walk past the end of the buffer). printf "100644 a long filename, or a hash with missing nul?" >input && test_must_fail git hash-object -t tree input 2>err && - grep badTree err + test_grep badTree err ' test_done diff --git a/t/t1460-refs-migrate.sh b/t/t1460-refs-migrate.sh index 52464680243753..8f426971435309 100755 --- a/t/t1460-refs-migrate.sh +++ b/t/t1460-refs-migrate.sh @@ -212,7 +212,7 @@ do test_commit -C repo initial && git -C repo refs migrate --dry-run \ --ref-format=$to_format >output && - grep "Finished dry-run migration of refs" output && + test_grep "Finished dry-run migration of refs" output && test_path_is_dir repo/.git/ref_migration.* && echo $from_format >expect && git -C repo rev-parse --show-ref-format >actual && diff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh index 38067d95f7f12b..4174ca40c342a9 100755 --- a/t/t1500-rev-parse.sh +++ b/t/t1500-rev-parse.sh @@ -204,7 +204,7 @@ test_expect_success 'rev-parse --show-object-format in repo' ' git rev-parse --show-object-format=output >actual && test_cmp expect actual && test_must_fail git rev-parse --show-object-format=squeamish-ossifrage 2>err && - grep "unknown mode for --show-object-format: squeamish-ossifrage" err + test_grep "unknown mode for --show-object-format: squeamish-ossifrage" err ' @@ -228,7 +228,7 @@ test_expect_success RUST 'rev-parse --show-object-format in repo with compat mod git rev-parse --show-object-format=compat >actual && test_cmp expect actual && test_must_fail git rev-parse --show-object-format=squeamish-ossifrage 2>err && - grep "unknown mode for --show-object-format: squeamish-ossifrage" err + test_grep "unknown mode for --show-object-format: squeamish-ossifrage" err ) && mkdir repo2 && ( @@ -254,7 +254,7 @@ test_expect_success 'rev-parse --show-ref-format with invalid storage' ' cd repo && git config extensions.refstorage broken && test_must_fail git rev-parse --show-ref-format 2>err && - grep "error: invalid value for ${SQ}extensions.refstorage${SQ}: ${SQ}broken${SQ}" err + test_grep "error: invalid value for ${SQ}extensions.refstorage${SQ}: ${SQ}broken${SQ}" err ) ' diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh index 3962f1d2882a1f..2cab2043760f62 100755 --- a/t/t1502-rev-parse-parseopt.sh +++ b/t/t1502-rev-parse-parseopt.sh @@ -331,7 +331,7 @@ test_expect_success 'ambiguous: --no matches both --noble and --no-noble' ' EOF test_expect_code 129 env GIT_TEST_DISALLOW_ABBREVIATED_OPTIONS=false \ git rev-parse --parseopt -- err --no && - grep "error: ambiguous option: no (could be --noble or --no-noble)" err + test_grep "error: ambiguous option: no (could be --noble or --no-noble)" err ' test_done diff --git a/t/t1503-rev-parse-verify.sh b/t/t1503-rev-parse-verify.sh index 75a708f9ba5f22..87638a4a2c71f9 100755 --- a/t/t1503-rev-parse-verify.sh +++ b/t/t1503-rev-parse-verify.sh @@ -62,15 +62,15 @@ test_expect_success 'works with one good rev' ' test_expect_success 'fails with any bad rev or many good revs' ' test_must_fail git rev-parse --verify 2>error && - grep "single revision" error && + test_grep "single revision" error && test_must_fail git rev-parse --verify foo 2>error && - grep "single revision" error && + test_grep "single revision" error && test_must_fail git rev-parse --verify HEAD bar 2>error && - grep "single revision" error && + test_grep "single revision" error && test_must_fail git rev-parse --verify baz HEAD 2>error && - grep "single revision" error && + test_grep "single revision" error && test_must_fail git rev-parse --verify $HASH2 HEAD 2>error && - grep "single revision" error + test_grep "single revision" error ' test_expect_success 'fails silently when using -q' ' diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh index bbfe05b8e4a5c4..d330b8df476152 100755 --- a/t/t1510-repo-setup.sh +++ b/t/t1510-repo-setup.sh @@ -604,7 +604,7 @@ test_expect_success '#20b/c: core.worktree and core.bare conflict' ' cd 20b/.git && test_must_fail git status >/dev/null ) 2>message && - grep "core.bare and core.worktree" message + test_grep "core.bare and core.worktree" message ' test_expect_success '#20d: core.worktree and core.bare OK when working tree not needed' ' @@ -721,8 +721,8 @@ test_expect_success '#22.2: core.worktree and core.bare conflict' ' export GIT_DIR && test_must_fail git status 2>result ) && - grep "core.bare and core.worktree" 22/.git/result && - grep "core.bare and core.worktree" 22/result + test_grep "core.bare and core.worktree" 22/.git/result && + test_grep "core.bare and core.worktree" 22/result ' # Case #23: GIT_DIR + GIT_WORK_TREE(+core.worktree) suppresses bareness. @@ -767,7 +767,7 @@ test_expect_success '#28: core.worktree and core.bare conflict (gitfile case)' ' cd 28 && test_must_fail git status ) 2>message && - grep "core.bare and core.worktree" message + test_grep "core.bare and core.worktree" message ' # Case #29: GIT_WORK_TREE(+core.worktree) overrides core.bare (gitfile case). @@ -791,7 +791,7 @@ test_expect_success '#30: core.worktree and core.bare conflict (gitfile version) cd 30 && test_must_fail env GIT_DIR=.git git status 2>result ) && - grep "core.bare and core.worktree" 30/result + test_grep "core.bare and core.worktree" 30/result ' # Case #31: GIT_DIR + GIT_WORK_TREE(+core.worktree) suppresses diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh index 1a380a418425a4..0e6b42ec7825da 100755 --- a/t/t1512-rev-parse-disambiguation.sh +++ b/t/t1512-rev-parse-disambiguation.sh @@ -378,7 +378,7 @@ test_expect_success 'ambiguous 40-hex ref' ' VAL=$(git commit-tree $TREE err) = $REF && - grep "refname.*${REF}.*ambiguous" err + test_grep "refname.*${REF}.*ambiguous" err ' test_expect_success 'ambiguous short sha1 ref' ' @@ -387,7 +387,7 @@ test_expect_success 'ambiguous short sha1 ref' ' VAL=$(git commit-tree $TREE err) = $VAL && - grep "refname.*${REF}.*ambiguous" err + test_grep "refname.*${REF}.*ambiguous" err ' test_expect_success 'ambiguity errors are not repeated (raw)' ' diff --git a/t/t1515-rev-parse-outside-repo.sh b/t/t1515-rev-parse-outside-repo.sh index 75e89c4b6e23c2..2cb3c7cc9c4bb2 100755 --- a/t/t1515-rev-parse-outside-repo.sh +++ b/t/t1515-rev-parse-outside-repo.sh @@ -32,7 +32,7 @@ test_expect_success 'rev-parse --local-env-vars' ' git rev-parse --local-env-vars >actual && # we do not want to depend on the complete list here, # so just look for something plausible - grep ^GIT_DIR actual + test_grep ^GIT_DIR actual ' test_expect_success 'rev-parse --resolve-git-dir' ' diff --git a/t/t1800-hook.sh b/t/t1800-hook.sh index 0132e772e472e2..9aae3ff0745191 100755 --- a/t/t1800-hook.sh +++ b/t/t1800-hook.sh @@ -79,7 +79,7 @@ test_expect_success 'git hook usage' ' test_expect_code 129 git hook run --unknown 2>err && test_expect_code 129 git hook list && test_expect_code 129 git hook list -h && - grep "unknown option" err + test_grep "unknown option" err ' test_expect_success 'git hook list: unknown hook name is rejected' ' @@ -361,9 +361,9 @@ test_expect_success 'hook can be configured for multiple events' ' # 'ghi' should be included in both 'pre-commit' and 'test-hook' git hook list pre-commit >actual && - grep "ghi" actual && + test_grep "ghi" actual && git hook list --allow-unknown-hook-name test-hook >actual && - grep "ghi" actual + test_grep "ghi" actual ' test_expect_success 'git hook list shows hooks from the hookdir' ' @@ -569,7 +569,7 @@ test_expect_success 'git hook run a hook with a bad shebang' ' # TODO: We should emit the same (or at least a more similar) # error on MINGW (essentially Git for Windows) and all other # platforms.. See the OS-specific code in start_command() - grep -E "^(error|fatal): cannot (exec|spawn) .*bad-hooks/test-hook" err + test_grep -E "^(error|fatal): cannot (exec|spawn) .*bad-hooks/test-hook" err ' test_expect_success 'stdin to hooks' ' @@ -826,8 +826,8 @@ test_expect_success 'git hook run -j2 warns for hooks not marked parallel=true' # neither hook has parallel=true git hook run --allow-unknown-hook-name -j2 test-hook >out 2>err && - grep "hook .hook-1. is not marked as parallel=true" err && - grep "hook .hook-2. is not marked as parallel=true" err + test_grep "hook .hook-1. is not marked as parallel=true" err && + test_grep "hook .hook-2. is not marked as parallel=true" err ' test_expect_success 'hook.jobs=1 config runs hooks in series' ' @@ -1068,7 +1068,7 @@ test_expect_success 'hook.jobs=-1 resolves to online_cpus()' ' cpus=$(test-tool online-cpus) && GIT_TRACE2_EVENT="$(pwd)/trace.txt" \ git hook run --allow-unknown-hook-name test-hook >out 2>err && - grep "\"region_enter\".*\"hook\".*\"test-hook\".*\"max:$cpus\"" trace.txt + test_grep "\"region_enter\".*\"hook\".*\"test-hook\".*\"max:$cpus\"" trace.txt ' test_expect_success 'hook..jobs=-1 resolves to online_cpus()' ' @@ -1081,7 +1081,7 @@ test_expect_success 'hook..jobs=-1 resolves to online_cpus()' ' cpus=$(test-tool online-cpus) && GIT_TRACE2_EVENT="$(pwd)/trace.txt" \ git hook run --allow-unknown-hook-name test-hook >out 2>err && - grep "\"region_enter\".*\"hook\".*\"test-hook\".*\"max:$cpus\"" trace.txt + test_grep "\"region_enter\".*\"hook\".*\"test-hook\".*\"max:$cpus\"" trace.txt ' test_expect_success 'git hook run -j-1 resolves to online_cpus()' ' @@ -1092,7 +1092,7 @@ test_expect_success 'git hook run -j-1 resolves to online_cpus()' ' cpus=$(test-tool online-cpus) && GIT_TRACE2_EVENT="$(pwd)/trace.txt" \ git hook run --allow-unknown-hook-name -j-1 test-hook >out 2>err && - grep "\"region_enter\".*\"hook\".*\"test-hook\".*\"max:$cpus\"" trace.txt + test_grep "\"region_enter\".*\"hook\".*\"test-hook\".*\"max:$cpus\"" trace.txt ' test_expect_success 'hook.jobs rejects values less than -1' ' diff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh index 0afe0ff7ca1f31..db06c321ed9cdd 100755 --- a/t/t2004-checkout-cache-temp.sh +++ b/t/t2004-checkout-cache-temp.sh @@ -132,8 +132,8 @@ test_expect_success 'overriding --stage=all resets implied --temp' ' test_expect_success '--stage=all --no-temp is rejected' ' rm -f path* .merge_* actual && test_must_fail git checkout-index --stage=all --no-temp -- path1 2>err && - grep -v "already exists" err && - grep "options .--stage=all. and .--no-temp. cannot be used together" err + test_grep -v "already exists" err && + test_grep "options .--stage=all. and .--no-temp. cannot be used together" err ' test_expect_success 'checkout some stages/one file to temporary files' ' diff --git a/t/t2019-checkout-ambiguous-ref.sh b/t/t2019-checkout-ambiguous-ref.sh index 1fcef4be95ce14..0ac35798c26010 100755 --- a/t/t2019-checkout-ambiguous-ref.sh +++ b/t/t2019-checkout-ambiguous-ref.sh @@ -19,7 +19,7 @@ test_expect_success 'checkout ambiguous ref succeeds' ' ' test_expect_success 'checkout produces ambiguity warning' ' - grep "warning.*ambiguous" stderr + test_grep "warning.*ambiguous" stderr ' test_expect_success 'checkout chooses branch over tag' ' @@ -41,7 +41,7 @@ test_expect_success 'checkout vague ref succeeds' ' ' test_expect_success VAGUENESS_SUCCESS 'checkout produces ambiguity warning' ' - grep "warning.*ambiguous" stderr + test_grep "warning.*ambiguous" stderr ' test_expect_success VAGUENESS_SUCCESS 'checkout chooses branch over tag' ' diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh index a3b1449ef11667..752e7f0e6130d7 100755 --- a/t/t2024-checkout-dwim.sh +++ b/t/t2024-checkout-dwim.sh @@ -311,7 +311,7 @@ test_expect_success 'loosely defined local base branch is reported correctly' ' git checkout loose >actual.raw 2>&1 && sed -e "s/loose/BRANCHNAME/g" actual && status_uno_is_clean && - grep BRANCHNAME actual && + test_grep BRANCHNAME actual && test_cmp expect actual ' @@ -324,7 +324,7 @@ test_expect_success 'reject when arg could be part of dwim branch' ' echo bar >dwim-arg && test_must_fail git checkout dwim-arg && test_must_fail git rev-parse refs/heads/dwim-arg -- && - grep bar dwim-arg + test_grep bar dwim-arg ' test_expect_success 'disambiguate dwim branch and checkout path (1)' ' @@ -334,7 +334,7 @@ test_expect_success 'disambiguate dwim branch and checkout path (1)' ' echo bar >dwim-arg1 && git checkout -- dwim-arg1 && test_must_fail git rev-parse refs/heads/dwim-arg1 -- && - grep foo dwim-arg1 + test_grep foo dwim-arg1 ' test_expect_success 'disambiguate dwim branch and checkout path (2)' ' @@ -344,7 +344,7 @@ test_expect_success 'disambiguate dwim branch and checkout path (2)' ' echo bar >dwim-arg2 && git checkout dwim-arg2 -- && git rev-parse refs/heads/dwim-arg2 -- && - grep bar dwim-arg2 + test_grep bar dwim-arg2 ' test_done diff --git a/t/t2030-unresolve-info.sh b/t/t2030-unresolve-info.sh index be3fcdde07562c..9af24b12040672 100755 --- a/t/t2030-unresolve-info.sh +++ b/t/t2030-unresolve-info.sh @@ -122,7 +122,7 @@ test_expect_success 'add records checkout -m undoes' ' check_resolve_undo removed && echo the index and the work tree is unmerged again && git diff >actual && - grep "^++<<<<<<<" actual + test_grep "^++<<<<<<<" actual ' test_expect_success 'unmerge with plumbing' ' @@ -173,7 +173,7 @@ test_expect_success 'rerere and rerere forget' ' test -f .git/rr-cache/$rerere_id/postimage && git checkout -m fi/le && echo resurrect the conflict && - grep "^=======" fi/le && + test_grep "^=======" fi/le && echo reresolve the conflict && git rerere && test "z$(cat fi/le)" = zdifferent && @@ -199,7 +199,7 @@ test_expect_success 'rerere and rerere forget (subdirectory)' ' test -f .git/rr-cache/$rerere_id/postimage && (cd fi && git checkout -m le) && echo resurrect the conflict && - grep "^=======" fi/le && + test_grep "^=======" fi/le && echo reresolve the conflict && (cd fi && git rerere) && test "z$(cat fi/le)" = zdifferent && diff --git a/t/t2060-switch.sh b/t/t2060-switch.sh index c91c4db9361133..cec2fe6876c2fe 100755 --- a/t/t2060-switch.sh +++ b/t/t2060-switch.sh @@ -34,13 +34,13 @@ test_expect_success 'switch and detach' ' test_expect_success 'suggestion to detach' ' test_must_fail git switch main^{commit} 2>stderr && - grep "try again with the --detach option" stderr + test_grep "try again with the --detach option" stderr ' test_expect_success 'suggestion to detach is suppressed with advice.suggestDetachingHead=false' ' test_config advice.suggestDetachingHead false && test_must_fail git switch main^{commit} 2>stderr && - ! grep "try again with the --detach option" stderr + test_grep ! "try again with the --detach option" stderr ' test_expect_success 'switch and detach current branch' ' @@ -76,7 +76,7 @@ test_expect_success 'new orphan branch from empty' ' git switch --orphan new-orphan && test_commit orphan && git cat-file commit refs/heads/new-orphan >commit && - ! grep ^parent commit && + test_grep ! ^parent commit && git ls-files >tracked-files && echo orphan.t >expected && test_cmp expected tracked-files diff --git a/t/t2070-restore.sh b/t/t2070-restore.sh index 16d6348b692806..2c222fb9342777 100755 --- a/t/t2070-restore.sh +++ b/t/t2070-restore.sh @@ -216,7 +216,7 @@ test_expect_success 'restore with merge options are incompatible with certain op "--staged --worktree --conflict=zdiff3" do test_must_fail git restore $opts . 2>err && - grep "cannot be used" err || return + test_grep "cannot be used" err || return done ' diff --git a/t/t2080-parallel-checkout-basics.sh b/t/t2080-parallel-checkout-basics.sh index 5ffe1a41e2cd72..88a6ec1826224e 100755 --- a/t/t2080-parallel-checkout-basics.sh +++ b/t/t2080-parallel-checkout-basics.sh @@ -200,13 +200,13 @@ test_expect_success 'parallel checkout respects --[no]-force' ' # We expect 0 workers because there is nothing to be done test_checkout_workers 0 git checkout HEAD && test_path_is_file D && - grep changed D && - grep changed F.t && + test_grep changed D && + test_grep changed F.t && test_checkout_workers 2 git checkout --force HEAD && test_path_is_dir D && - grep D/F D/F.t && - grep F F.t + test_grep D/F D/F.t && + test_grep F F.t ) ' @@ -224,8 +224,8 @@ test_expect_success SYMLINKS 'parallel checkout checks for symlinks in leading d test_checkout_workers 2 git checkout --force HEAD && ! test -h D && - grep D/A D/A.t && - grep D/B D/B.t + test_grep D/A D/A.t && + test_grep D/B D/B.t ) ' @@ -268,7 +268,7 @@ test_expect_success '"git checkout ." report should not include failed entries' # - missing-delay.a: the delay filter will drop this path # - parallel-*.a: the blob will be missing # - grep "Updated 3 paths from the index" err && + test_grep "Updated 3 paths from the index" err && test_stdout_line_count = 3 ls *.b && ! ls *.a ) diff --git a/t/t2081-parallel-checkout-collisions.sh b/t/t2081-parallel-checkout-collisions.sh index f6fcfc0c1e4039..db45f5f30fc172 100755 --- a/t/t2081-parallel-checkout-collisions.sh +++ b/t/t2081-parallel-checkout-collisions.sh @@ -78,8 +78,8 @@ test_expect_success CASE_INSENSITIVE_FS 'worker detects dirname collision' ' # Check that it used the right number of workers and detected the collisions test_workers_in_event_trace 2 trace && - grep "category.:.pcheckout.,.key.:.collision/dirname.,.value.:.A/B.}" trace && - grep "category.:.pcheckout.,.key.:.collision/dirname.,.value.:.A/C.}" trace + test_grep "category.:.pcheckout.,.key.:.collision/dirname.,.value.:.A/B.}" trace && + test_grep "category.:.pcheckout.,.key.:.collision/dirname.,.value.:.A/C.}" trace ' test_expect_success SYMLINKS,CASE_INSENSITIVE_FS 'do not follow symlinks colliding with leading dir' ' @@ -115,11 +115,11 @@ test_expect_success CASE_INSENSITIVE_FS 'collision report on clone (w/ racy file set_checkout_config 2 0 && test_checkout_workers 2 git clone . clone-repo 2>stderr && - grep FILE_X stderr && - grep FILE_x stderr && - grep file_X stderr && - grep file_x stderr && - grep "the following paths have collided" stderr + test_grep FILE_X stderr && + test_grep FILE_x stderr && + test_grep file_X stderr && + test_grep file_x stderr && + test_grep "the following paths have collided" stderr ' # This test ensures that the collision report code is correctly looking for @@ -148,11 +148,11 @@ test_expect_success CASE_INSENSITIVE_FS,!MINGW,!CYGWIN \ test_checkout_workers 2 \ git -c core.ignoreCase=false clone . clone-repo 2>stderr && - grep FILE_X stderr && - grep FILE_x stderr && - grep file_X stderr && - grep file_x stderr && - grep "the following paths have collided" stderr && + test_grep FILE_X stderr && + test_grep FILE_x stderr && + test_grep file_X stderr && + test_grep file_x stderr && + test_grep "the following paths have collided" stderr && # Check that only "file_x" was filtered echo file_x >expected.log && diff --git a/t/t2082-parallel-checkout-attributes.sh b/t/t2082-parallel-checkout-attributes.sh index 79fb11f139a2c1..1f43c2a267b316 100755 --- a/t/t2082-parallel-checkout-attributes.sh +++ b/t/t2082-parallel-checkout-attributes.sh @@ -28,8 +28,8 @@ test_expect_success 'parallel-checkout with ident' ' rm A B && test_checkout_workers 2 git reset --hard && hexsz=$(test_oid hexsz) && - grep -E "\\\$Id: [0-9a-f]{$hexsz} \\\$" A && - grep "\\\$Id\\\$" B + test_grep -E "\\\$Id: [0-9a-f]{$hexsz} \\\$" A && + test_grep "\\\$Id\\\$" B ) ' @@ -175,15 +175,15 @@ test_expect_success 'parallel-checkout and delayed checkout' ' verify_checkout delayed && # Check that the *.d files got to the delay queue and were filtered - grep "smudge W.d .* \[DELAYED\]" delayed.log && - grep "smudge X.d .* \[DELAYED\]" delayed.log && + test_grep "smudge W.d .* \[DELAYED\]" delayed.log && + test_grep "smudge X.d .* \[DELAYED\]" delayed.log && test_cmp delayed/W.d original && test_cmp delayed/X.d original && # Check that the parallel-eligible entries went to the right queue and # were not filtered - ! grep "smudge Y .* \[DELAYED\]" delayed.log && - ! grep "smudge Z .* \[DELAYED\]" delayed.log && + test_grep ! "smudge Y .* \[DELAYED\]" delayed.log && + test_grep ! "smudge Z .* \[DELAYED\]" delayed.log && test_cmp delayed/Y original && test_cmp delayed/Z original ' diff --git a/t/t2103-update-index-ignore-missing.sh b/t/t2103-update-index-ignore-missing.sh index 6938ecca868366..fbfc86b1fa6749 100755 --- a/t/t2103-update-index-ignore-missing.sh +++ b/t/t2103-update-index-ignore-missing.sh @@ -63,9 +63,9 @@ test_expect_success '--unmerged --refresh' ' git update-index --unmerged --refresh && echo 2 >two && test_must_fail git update-index --unmerged --refresh >actual && - grep two actual && - ! grep one actual && - ! grep three actual + test_grep two actual && + test_grep ! one actual && + test_grep ! three actual ' test_expect_success '--ignore-submodules --refresh (1)' ' diff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh index 0a96655cfe7348..bb019d7a7ce439 100755 --- a/t/t2200-add-update.sh +++ b/t/t2200-add-update.sh @@ -241,7 +241,7 @@ test_expect_success 'add -u avoids rename pairing on unmerged paths' ' test_expect_success '"add -u non-existent" should fail' ' test_must_fail git add -u non-existent && git ls-files >actual && - ! grep "non-existent" actual + test_grep ! "non-existent" actual ' test_expect_success '"commit -a" implies "add -u" if index becomes empty' ' diff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh index 44c1936e4d698b..69fef7e6463cc3 100755 --- a/t/t2203-add-intent.sh +++ b/t/t2203-add-intent.sh @@ -57,7 +57,7 @@ test_expect_success 'intent to add does not clobber existing paths' ' git add -N file elif && empty=$(git hash-object --stdin actual && - ! grep "$empty" actual + test_grep ! "$empty" actual ' test_expect_success 'i-t-a entry is simply ignored' ' @@ -124,7 +124,7 @@ test_expect_success 'cache-tree does not ignore dir that has i-t-a entries' ' git add -N 2/1 && git commit -m committed && git ls-tree -r HEAD >actual && - grep 2/2 actual + test_grep 2/2 actual ) ' @@ -312,7 +312,7 @@ test_expect_success 'apply --intent-to-add' ' echo new >new-ita && git add -N new-ita && git diff >expected && - grep "new file" expected && + test_grep "new file" expected && git reset --hard && git apply --intent-to-add expected && git diff >actual && diff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh index 58b4445cc441a8..87b926728ad8cf 100755 --- a/t/t2400-worktree-add.sh +++ b/t/t2400-worktree-add.sh @@ -122,7 +122,7 @@ test_expect_success 'die the same branch is already checked out' ' ( cd here && test_must_fail git checkout newmain 2>actual && - grep "already used by worktree at" actual + test_grep "already used by worktree at" actual ) ' @@ -139,7 +139,7 @@ test_expect_success 'refuse to reset a branch in use elsewhere' ' git rev-parse --verify refs/heads/newmain >new.branch && git rev-parse --verify HEAD >new.head && - grep "already used by worktree at" error && + test_grep "already used by worktree at" error && test_cmp old.branch new.branch && test_cmp old.head new.head && @@ -328,7 +328,7 @@ test_wt_add_excl () { local opts="$*" && test_expect_success "'worktree add' with '$opts' has mutually exclusive options" ' test_must_fail git worktree add $opts 2>actual && - grep -E "fatal:( options)? .* cannot be used together" actual + test_grep -E "fatal:( options)? .* cannot be used together" actual ' } @@ -436,13 +436,13 @@ test_wt_add_orphan_hint () { (cd repo && test_commit commit) && git -C repo switch --orphan noref && test_must_fail git -C repo worktree add $opts foobar/ 2>actual && - ! grep "error: unknown switch" actual && - grep "hint: If you meant to create a worktree containing a new unborn branch" actual && + test_grep ! "error: unknown switch" actual && + test_grep "hint: If you meant to create a worktree containing a new unborn branch" actual && if [ $use_branch -eq 1 ] then - grep -E "^hint: +git worktree add --orphan -b [^ ]+ [^ ]+$" actual + test_grep -E "^hint: +git worktree add --orphan -b [^ ]+ [^ ]+$" actual else - grep -E "^hint: +git worktree add --orphan [^ ]+$" actual + test_grep -E "^hint: +git worktree add --orphan [^ ]+$" actual fi ' @@ -457,8 +457,8 @@ test_expect_success "'worktree add' doesn't show orphan hint in bad/orphan HEAD git init repo && (cd repo && test_commit commit) && test_must_fail git -C repo worktree add --quiet foobar_branch foobar/ 2>actual && - ! grep "error: unknown switch" actual && - ! grep "hint: If you meant to create a worktree containing a new unborn branch" actual + test_grep ! "error: unknown switch" actual && + test_grep ! "hint: If you meant to create a worktree containing a new unborn branch" actual ' test_expect_success 'local clone from linked checkout' ' @@ -469,7 +469,7 @@ test_expect_success 'local clone from linked checkout' ' test_expect_success 'local clone --shared from linked checkout' ' git -C bare worktree add --detach ../baretree && git clone --local --shared baretree bare-clone && - grep /bare/ bare-clone/.git/objects/info/alternates + test_grep /bare/ bare-clone/.git/objects/info/alternates ' test_expect_success '"add" worktree with --no-checkout' ' @@ -491,7 +491,7 @@ test_expect_success 'put a worktree under rebase' ' set_fake_editor && FAKE_LINES="edit 1" git rebase -i HEAD^ && git worktree list >actual && - grep "under-rebase.*detached HEAD" actual + test_grep "under-rebase.*detached HEAD" actual ) ' @@ -533,7 +533,7 @@ test_expect_success 'checkout a branch under bisect' ' git bisect bad && git bisect good HEAD~2 && git worktree list >actual && - grep "under-bisect.*detached HEAD" actual && + test_grep "under-bisect.*detached HEAD" actual && test_must_fail git worktree add new-bisect under-bisect && test_path_is_missing new-bisect ) diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh index 93f92e854aa829..eeaf800d74fc5f 100755 --- a/t/t2402-worktree-list.sh +++ b/t/t2402-worktree-list.sh @@ -101,8 +101,8 @@ test_expect_success '"list" all worktrees with locked annotation' ' git worktree lock locked && test_when_finished "git worktree unlock locked" && git worktree list >out && - grep "/locked *[0-9a-f].* locked$" out && - ! grep "/unlocked *[0-9a-f].* locked$" out + test_grep "/locked *[0-9a-f].* locked$" out && + test_grep ! "/unlocked *[0-9a-f].* locked$" out ' test_expect_success '"list" all worktrees --porcelain with locked' ' @@ -143,8 +143,8 @@ test_expect_success '"list" all worktrees with prunable annotation' ' git worktree add --detach unprunable && rm -rf prunable && git worktree list >out && - grep "/prunable *[0-9a-f].* prunable$" out && - ! grep "/unprunable *[0-9a-f].* prunable$" out + test_grep "/prunable *[0-9a-f].* prunable$" out && + test_grep ! "/unprunable *[0-9a-f].* prunable$" out ' test_expect_success '"list" all worktrees --porcelain with prunable' ' @@ -162,8 +162,8 @@ test_expect_success '"list" all worktrees with prunable consistent with "prune"' git worktree add --detach unprunable && rm -rf prunable && git worktree list >out && - grep "/prunable *[0-9a-f].* prunable$" out && - ! grep "/unprunable *[0-9a-f].* unprunable$" out && + test_grep "/prunable *[0-9a-f].* prunable$" out && + test_grep ! "/unprunable *[0-9a-f].* unprunable$" out && git worktree prune --verbose 2>out && test_grep "^Removing worktrees/prunable" out && test_grep ! "^Removing worktrees/unprunable" out @@ -184,7 +184,7 @@ test_expect_success '"list" all worktrees --verbose with locked' ' echo "$(git -C locked2 rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >expect && printf "\tlocked: with reason\n" >>expect && git worktree list --verbose >out && - grep "/locked1 *[0-9a-f].* locked$" out && + test_grep "/locked1 *[0-9a-f].* locked$" out && sed -n "s/ */ /g;/\/locked2 *[0-9a-f].*$/,/locked: .*$/p" actual && test_cmp actual expect ' @@ -266,7 +266,7 @@ test_expect_success 'broken main worktree still at the top' ' test_cmp ../expected actual && git worktree list >out && head -n 1 out >actual.2 && - grep -F "(error)" actual.2 + test_grep -F "(error)" actual.2 ) ' diff --git a/t/t2403-worktree-move.sh b/t/t2403-worktree-move.sh index 0bb33e8b1b90fb..69768c120773f4 100755 --- a/t/t2403-worktree-move.sh +++ b/t/t2403-worktree-move.sh @@ -75,8 +75,8 @@ test_expect_success 'move worktree' ' git worktree move source destination && test_path_is_missing source && git worktree list --porcelain >out && - grep "^worktree.*/destination$" out && - ! grep "^worktree.*/source$" out && + test_grep "^worktree.*/destination$" out && + test_grep ! "^worktree.*/source$" out && git -C destination log --format=%s >actual2 && echo init >expected2 && test_cmp expected2 actual2 @@ -92,7 +92,7 @@ test_expect_success 'move worktree to another dir' ' test_when_finished "git worktree move some-dir/destination destination" && test_path_is_missing destination && git worktree list --porcelain >out && - grep "^worktree.*/some-dir/destination$" out && + test_grep "^worktree.*/some-dir/destination$" out && git -C some-dir/destination log --format=%s >actual2 && echo init >expected2 && test_cmp expected2 actual2 diff --git a/t/t2405-worktree-submodule.sh b/t/t2405-worktree-submodule.sh index 11018f37c70c02..f5c94d490be6da 100755 --- a/t/t2405-worktree-submodule.sh +++ b/t/t2405-worktree-submodule.sh @@ -36,7 +36,7 @@ test_expect_success 'add superproject worktree' ' test_expect_failure 'submodule is checked out just after worktree add' ' git -C worktree diff --submodule main"^!" >out && - grep "file1 updated" out + test_grep "file1 updated" out ' test_expect_success 'add superproject worktree and initialize submodules' ' @@ -46,7 +46,7 @@ test_expect_success 'add superproject worktree and initialize submodules' ' test_expect_success 'submodule is checked out just after submodule update in linked worktree' ' git -C worktree-submodule-update diff --submodule main"^!" >out && - grep "file1 updated" out + test_grep "file1 updated" out ' test_expect_success 'add superproject worktree and manually add submodule worktree' ' @@ -56,7 +56,7 @@ test_expect_success 'add superproject worktree and manually add submodule worktr test_expect_success 'submodule is checked out after manually adding submodule worktree' ' git -C linked_submodule diff --submodule main"^!" >out && - grep "file1 updated" out + test_grep "file1 updated" out ' test_expect_success 'checkout --recurse-submodules uses $GIT_DIR for submodules in a linked worktree' ' diff --git a/t/t2407-worktree-heads.sh b/t/t2407-worktree-heads.sh index 57c201869f02e6..a6d7e0f83bb575 100755 --- a/t/t2407-worktree-heads.sh +++ b/t/t2407-worktree-heads.sh @@ -41,10 +41,10 @@ test_expect_success 'refuse to overwrite: checked out in worktree' ' for i in 1 2 3 4 do test_must_fail git branch -f wt-$i HEAD 2>err && - grep "cannot force update the branch" err && + test_grep "cannot force update the branch" err && test_must_fail git branch -D wt-$i 2>err && - grep "cannot delete branch" err || return 1 + test_grep "cannot delete branch" err || return 1 done ' @@ -57,7 +57,7 @@ test_expect_success 'refuse to overwrite: worktree in bisect' ' git -C wt-4 bisect good wt-1 && test_must_fail git branch -f wt-4 HEAD 2>err && - grep "cannot force update the branch '\''wt-4'\'' used by worktree at.*wt-4" err + test_grep "cannot force update the branch '\''wt-4'\'' used by worktree at.*wt-4" err ' test_expect_success 'refuse to overwrite: worktree in rebase (apply)' ' @@ -67,7 +67,7 @@ test_expect_success 'refuse to overwrite: worktree in rebase (apply)' ' test_must_fail git -C wt-2 rebase --apply conflict-2 && test_must_fail git branch -f wt-2 HEAD 2>err && - grep "cannot force update the branch '\''wt-2'\'' used by worktree at.*wt-2" err + test_grep "cannot force update the branch '\''wt-2'\'' used by worktree at.*wt-2" err ' test_expect_success 'refuse to overwrite: worktree in rebase (merge)' ' @@ -77,7 +77,7 @@ test_expect_success 'refuse to overwrite: worktree in rebase (merge)' ' test_must_fail git -C wt-2 rebase conflict-2 && test_must_fail git branch -f wt-2 HEAD 2>err && - grep "cannot force update the branch '\''wt-2'\'' used by worktree at.*wt-2" err + test_grep "cannot force update the branch '\''wt-2'\'' used by worktree at.*wt-2" err ' test_expect_success 'refuse to overwrite: worktree in rebase with --update-refs' ' @@ -89,19 +89,19 @@ test_expect_success 'refuse to overwrite: worktree in rebase with --update-refs' for i in 3 4 do test_must_fail git branch -f can-be-updated HEAD 2>err && - grep "cannot force update the branch '\''can-be-updated'\'' used by worktree at.*wt-3" err || + test_grep "cannot force update the branch '\''can-be-updated'\'' used by worktree at.*wt-3" err || return 1 done ' test_expect_success 'refuse to fetch over ref: checked out' ' test_must_fail git fetch server +refs/heads/wt-3:refs/heads/wt-3 2>err && - grep "refusing to fetch into branch '\''refs/heads/wt-3'\''" err && + test_grep "refusing to fetch into branch '\''refs/heads/wt-3'\''" err && # General fetch into refs/heads/ will fail on first ref, # so use a generic error message check. test_must_fail git fetch server +refs/heads/*:refs/heads/* 2>err && - grep "refusing to fetch into branch" err + test_grep "refusing to fetch into branch" err ' test_expect_success 'refuse to fetch over ref: worktree in bisect' ' @@ -113,7 +113,7 @@ test_expect_success 'refuse to fetch over ref: worktree in bisect' ' git -C wt-4 bisect good wt-1 && test_must_fail git fetch server +refs/heads/wt-4:refs/heads/wt-4 2>err && - grep "refusing to fetch into branch" err + test_grep "refusing to fetch into branch" err ' test_expect_success 'refuse to fetch over ref: worktree in rebase' ' @@ -123,7 +123,7 @@ test_expect_success 'refuse to fetch over ref: worktree in rebase' ' test_must_fail git -C wt-3 rebase conflict-3 && test_must_fail git fetch server +refs/heads/wt-3:refs/heads/wt-3 2>err && - grep "refusing to fetch into branch" err + test_grep "refusing to fetch into branch" err ' test_expect_success 'refuse to overwrite when in error states' ' @@ -149,7 +149,7 @@ test_expect_success 'refuse to overwrite when in error states' ' for i in 1 2 do test_must_fail git branch -f fake-$i HEAD 2>err && - grep "cannot force update the branch '\''fake-$i'\'' used by worktree at" err || + test_grep "cannot force update the branch '\''fake-$i'\'' used by worktree at" err || return 1 done ' @@ -161,13 +161,13 @@ test_expect_success 'refuse to overwrite during rebase with --update-refs' ' ( set_cat_todo_editor && test_must_fail git rebase -i --update-refs HEAD~3 >todo && - ! grep "update-refs" todo + test_grep ! "update-refs" todo ) && git branch -f allow-update HEAD~2 && ( set_cat_todo_editor && test_must_fail git rebase -i --update-refs HEAD~3 >todo && - grep "update-ref refs/heads/allow-update" todo + test_grep "update-ref refs/heads/allow-update" todo ) ' diff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh index 5c0bf4d21fcbb2..8e84f29e8d9394 100755 --- a/t/t2500-untracked-overwriting.sh +++ b/t/t2500-untracked-overwriting.sh @@ -51,7 +51,7 @@ test_expect_success 'reset --merge will preserve untracked files/dirs' ' test_must_fail git reset --merge work 2>error && test_cmp expect foo.t/file && - grep "Updating .foo.t. would lose untracked files" error + test_grep "Updating .foo.t. would lose untracked files" error ) ' @@ -66,7 +66,7 @@ test_expect_success 'reset --keep will preserve untracked files/dirs' ' test_must_fail git reset --merge work 2>error && test_cmp expect foo.t/file && - grep "Updating.*foo.t.*would lose untracked files" error + test_grep "Updating.*foo.t.*would lose untracked files" error ) ' @@ -214,7 +214,7 @@ test_expect_success 'git am --abort and untracked dir vs. unmerged file' ' test_must_fail git am --abort 2>errors && test_path_is_dir filler && - grep "Updating .filler. would lose untracked files in it" errors + test_grep "Updating .filler. would lose untracked files in it" errors ) ' @@ -237,7 +237,7 @@ test_expect_success 'git am --skip and untracked dir vs deleted file' ' # Change our mind about resolutions, just skip this patch test_must_fail git am --skip 2>errors && test_path_is_dir newfile && - grep "Updating .newfile. would lose untracked files in it" errors + test_grep "Updating .newfile. would lose untracked files in it" errors ) ' diff --git a/t/t2501-cwd-empty.sh b/t/t2501-cwd-empty.sh index be9140bbaa46e7..eb6451d71d636a 100755 --- a/t/t2501-cwd-empty.sh +++ b/t/t2501-cwd-empty.sh @@ -114,7 +114,7 @@ test_expect_success 'merge fails if cwd needs to be removed; recursive friendly' ) && test_path_is_dir dirORfile && - grep "Refusing to remove the current working directory" error + test_grep "Refusing to remove the current working directory" error ' test_expect_success 'merge fails if cwd needs to be removed' ' @@ -179,7 +179,7 @@ test_incidental_untracked_dir_removal () { test_expect_success 'clean does not remove cwd incidentally' ' test_incidental_untracked_dir_removal \ git -C .. clean -fd -e warnings . >warnings && - grep "Refusing to remove current working directory" warnings + test_grep "Refusing to remove current working directory" warnings ' test_expect_success 'stash does not remove cwd incidentally' ' diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh index 202fb8d9eacc2c..29a0a25b30bdf5 100755 --- a/t/t3001-ls-files-others-exclude.sh +++ b/t/t3001-ls-files-others-exclude.sh @@ -161,21 +161,21 @@ test_expect_success 'trailing slash in exclude forces directory match (1)' ' >two && git ls-files --others --exclude=two/ >output && - grep "^two" output + test_grep "^two" output ' test_expect_success 'trailing slash in exclude forces directory match (2)' ' git ls-files --others --exclude=one/a.1/ >output && - grep "^one/a.1" output + test_grep "^one/a.1" output ' test_expect_success 'negated exclude matches can override previous ones' ' git ls-files --others --exclude="a.*" --exclude="!a.1" >output && - grep "^a.1" output + test_grep "^a.1" output ' test_expect_success 'excluded directory overrides content patterns' ' diff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh index 61771eec830c06..218964edab00a7 100755 --- a/t/t3007-ls-files-recurse-submodules.sh +++ b/t/t3007-ls-files-recurse-submodules.sh @@ -302,7 +302,7 @@ test_expect_success '--recurse-submodules does not support --error-unmatch' ' test_expect_success '--recurse-submodules parses submodule repo config' ' test_config -C submodule index.sparse "invalid non-boolean value" && test_must_fail git ls-files --recurse-submodules 2>err && - grep "bad boolean config value" err + test_grep "bad boolean config value" err ' test_expect_success '--recurse-submodules parses submodule worktree config' ' @@ -310,7 +310,7 @@ test_expect_success '--recurse-submodules parses submodule worktree config' ' test_config -C submodule --worktree index.sparse "invalid non-boolean value" && test_must_fail git ls-files --recurse-submodules 2>err && - grep "bad boolean config value" err + test_grep "bad boolean config value" err ' test_expect_success '--recurse-submodules submodules ignore super project worktreeConfig extension' ' @@ -329,7 +329,7 @@ test_expect_success '--recurse-submodules submodules ignore super project worktr # With extensions.worktreeConfig disabled in the submodule, the invalid # worktree config is not picked up. git ls-files --recurse-submodules 2>err && - ! grep "bad boolean config value" err + test_grep ! "bad boolean config value" err ' test_incompatible_with_recurse_submodules () { diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index e7829c2c4bfdc3..bd839998b1f092 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -204,7 +204,7 @@ test_expect_success 'git branch -M baz bam should succeed when baz is checked ou test_expect_success 'git branch -M baz bam should add entries to HEAD reflog' ' git reflog show HEAD >actual && - grep "HEAD@{0}: Branch: renamed refs/heads/baz to refs/heads/bam" actual + test_grep "HEAD@{0}: Branch: renamed refs/heads/baz to refs/heads/bam" actual ' test_expect_success 'git branch -M should leave orphaned HEAD alone' ' @@ -339,7 +339,7 @@ test_expect_success 'git branch -d on orphan HEAD (unmerged)' ' test_when_finished "git branch -D to-delete" && git branch to-delete main && test_must_fail git branch -d to-delete 2>err && - grep "not fully merged" err + test_grep "not fully merged" err ' test_expect_success 'git branch -d on orphan HEAD (unmerged, graph)' ' @@ -350,7 +350,7 @@ test_expect_success 'git branch -d on orphan HEAD (unmerged, graph)' ' test_when_finished "rm -rf .git/objects/commit-graph*" && git commit-graph write --reachable && test_must_fail git branch -d to-delete 2>err && - grep "not fully merged" err + test_grep "not fully merged" err ' test_expect_success 'git branch -v -d t should work' ' @@ -712,7 +712,7 @@ test_expect_success 'git branch -C c1 c2 should succeed when c1 is checked out' test_expect_success 'git branch -C c1 c2 should never touch HEAD' ' msg="Branch: copied refs/heads/c1 to refs/heads/c2" && git reflog HEAD >actual && - ! grep "$msg$" actual + test_grep ! "$msg$" actual ' test_expect_success 'git branch -C main should work when main is checked out' ' @@ -930,7 +930,7 @@ test_expect_success 'deleting currently checked out branch fails' ' git worktree add -b my7 my7 && test_must_fail git -C my7 branch -d my7 && test_must_fail git branch -d my7 2>actual && - grep "^error: cannot delete branch .my7. used by worktree at " actual && + test_grep "^error: cannot delete branch .my7. used by worktree at " actual && rm -r my7 && git worktree prune ' @@ -941,7 +941,7 @@ test_expect_success 'deleting in-use branch fails' ' git -C my7 bisect start HEAD HEAD~2 && test_must_fail git -C my7 branch -d my7 && test_must_fail git branch -d my7 2>actual && - grep "^error: cannot delete branch .my7. used by worktree at " actual && + test_grep "^error: cannot delete branch .my7. used by worktree at " actual && rm -r my7 && git worktree prune ' diff --git a/t/t3202-show-branch.sh b/t/t3202-show-branch.sh index a1139f79e2ccfd..f402334936466d 100755 --- a/t/t3202-show-branch.sh +++ b/t/t3202-show-branch.sh @@ -123,13 +123,13 @@ test_expect_success 'show-branch --sparse' ' git commit --allow-empty -m "another" && git show-branch --sparse >out && - grep "merge 1 and 10 to make A" out && + test_grep "merge 1 and 10 to make A" out && git show-branch >out && - ! grep "merge 1 and 10 to make A" out && + test_grep ! "merge 1 and 10 to make A" out && git show-branch --no-sparse >out && - ! grep "merge 1 and 10 to make A" out + test_grep ! "merge 1 and 10 to make A" out ' test_expect_success 'setup show branch --list' ' @@ -189,7 +189,7 @@ while read combo do test_expect_success "show-branch $combo (should fail)" ' test_must_fail git show-branch $combo 2>error && - grep -e "cannot be used together" -e "usage:" error + test_grep -e "cannot be used together" -e "usage:" error ' done <<\EOF --all --reflog @@ -203,7 +203,7 @@ for opt in topo-order date-order reflog do test_expect_success "show-branch --no-$opt (should fail)" ' test_must_fail git show-branch --no-$opt 2>err && - grep "unknown option .no-$opt." err + test_grep "unknown option .no-$opt." err ' done diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh index a6bd88a58d0a8c..7c441863418260 100755 --- a/t/t3203-branch-output.sh +++ b/t/t3203-branch-output.sh @@ -64,7 +64,7 @@ test_expect_success 'git branch -r shows remote branches' ' test_expect_success 'git branch --no-remotes is rejected' ' test_must_fail git branch --no-remotes 2>err && - grep "unknown option .no-remotes." err + test_grep "unknown option .no-remotes." err ' cat >expect <<'EOF' @@ -85,7 +85,7 @@ test_expect_success 'git branch -a shows local and remote branches' ' test_expect_success 'git branch --no-all is rejected' ' test_must_fail git branch --no-all 2>err && - grep "unknown option .no-all." err + test_grep "unknown option .no-all." err ' cat >expect <<'EOF' diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh index 1e812df806bbbf..ef92704de39830 100755 --- a/t/t3206-range-diff.sh +++ b/t/t3206-range-diff.sh @@ -538,10 +538,10 @@ do main..unmodified >actual && test_line_count = 5 actual && test_grep "^Range-diff:$" 0000-* && - grep "= 1: .* s/5/A" 0000-* && - grep "= 2: .* s/4/A" 0000-* && - grep "= 3: .* s/11/B" 0000-* && - grep "= 4: .* s/12/B" 0000-* + test_grep "= 1: .* s/5/A" 0000-* && + test_grep "= 2: .* s/4/A" 0000-* && + test_grep "= 3: .* s/11/B" 0000-* && + test_grep "= 4: .* s/12/B" 0000-* ' done @@ -564,7 +564,7 @@ test_expect_success 'format-patch --range-diff as commentary' ' git format-patch --range-diff=HEAD~1 HEAD~1 >actual && test_line_count = 1 actual && test_grep "^Range-diff:$" 0001-* && - grep "> 1: .* new message" 0001-* + test_grep "> 1: .* new message" 0001-* ' test_expect_success 'format-patch --range-diff reroll-count with a non-integer' ' @@ -572,7 +572,7 @@ test_expect_success 'format-patch --range-diff reroll-count with a non-integer' git format-patch --range-diff=HEAD~1 -v2.9 HEAD~1 >actual && test_line_count = 1 actual && test_grep "^Range-diff:$" v2.9-0001-* && - grep "> 1: .* new message" v2.9-0001-* + test_grep "> 1: .* new message" v2.9-0001-* ' test_expect_success 'format-patch --range-diff reroll-count with a integer' ' @@ -580,7 +580,7 @@ test_expect_success 'format-patch --range-diff reroll-count with a integer' ' git format-patch --range-diff=HEAD~1 -v2 HEAD~1 >actual && test_line_count = 1 actual && test_grep "^Range-diff ..* v1:$" v2-0001-* && - grep "> 1: .* new message" v2-0001-* + test_grep "> 1: .* new message" v2-0001-* ' test_expect_success 'format-patch --range-diff with v0' ' @@ -588,7 +588,7 @@ test_expect_success 'format-patch --range-diff with v0' ' git format-patch --range-diff=HEAD~1 -v0 HEAD~1 >actual && test_line_count = 1 actual && test_grep "^Range-diff:$" v0-0001-* && - grep "> 1: .* new message" v0-0001-* + test_grep "> 1: .* new message" v0-0001-* ' test_expect_success 'range-diff overrides diff.noprefix internally' ' @@ -686,8 +686,8 @@ test_expect_success 'range-diff with --notes=custom does not show default notes' git notes --ref=custom add -m "unmodified note" unmodified && git range-diff --notes=custom main..topic main..unmodified \ >actual && - ! grep "## Notes ##" actual && - grep "## Notes (custom) ##" actual + test_grep ! "## Notes ##" actual && + test_grep "## Notes (custom) ##" actual ' test_expect_success 'format-patch --range-diff does not compare notes by default' ' @@ -699,12 +699,12 @@ test_expect_success 'format-patch --range-diff does not compare notes by default main..unmodified >actual && test_line_count = 5 actual && test_grep "^Range-diff:$" 0000-* && - grep "= 1: .* s/5/A" 0000-* && - grep "= 2: .* s/4/A" 0000-* && - grep "= 3: .* s/11/B" 0000-* && - grep "= 4: .* s/12/B" 0000-* && - ! grep "Notes" 0000-* && - ! grep "note" 0000-* + test_grep "= 1: .* s/5/A" 0000-* && + test_grep "= 2: .* s/4/A" 0000-* && + test_grep "= 3: .* s/11/B" 0000-* && + test_grep "= 4: .* s/12/B" 0000-* && + test_grep ! "Notes" 0000-* && + test_grep ! "note" 0000-* ' test_expect_success 'format-patch --notes=custom --range-diff --cover-letter only compares custom notes' ' @@ -717,8 +717,8 @@ test_expect_success 'format-patch --notes=custom --range-diff --cover-letter onl test_when_finished "rm -f 000?-*" && git format-patch --notes=custom --cover-letter --range-diff=$prev \ main..unmodified >actual && - grep "## Notes (custom) ##" 0000-* && - ! grep "## Notes ##" 0000-* + test_grep "## Notes (custom) ##" 0000-* && + test_grep ! "## Notes ##" 0000-* ' # --range-diff on a single commit requires --no-cover-letter @@ -744,12 +744,12 @@ test_expect_success 'format-patch --range-diff with --no-notes' ' main..unmodified >actual && test_line_count = 5 actual && test_grep "^Range-diff:$" 0000-* && - grep "= 1: .* s/5/A" 0000-* && - grep "= 2: .* s/4/A" 0000-* && - grep "= 3: .* s/11/B" 0000-* && - grep "= 4: .* s/12/B" 0000-* && - ! grep "Notes" 0000-* && - ! grep "note" 0000-* + test_grep "= 1: .* s/5/A" 0000-* && + test_grep "= 2: .* s/4/A" 0000-* && + test_grep "= 3: .* s/11/B" 0000-* && + test_grep "= 4: .* s/12/B" 0000-* && + test_grep ! "Notes" 0000-* && + test_grep ! "note" 0000-* ' test_expect_success 'format-patch --range-diff with --notes' ' @@ -761,10 +761,10 @@ test_expect_success 'format-patch --range-diff with --notes' ' main..unmodified >actual && test_line_count = 5 actual && test_grep "^Range-diff:$" 0000-* && - grep "= 1: .* s/5/A" 0000-* && - grep "= 2: .* s/4/A" 0000-* && - grep "= 3: .* s/11/B" 0000-* && - grep "! 4: .* s/12/B" 0000-* && + test_grep "= 1: .* s/5/A" 0000-* && + test_grep "= 2: .* s/4/A" 0000-* && + test_grep "= 3: .* s/11/B" 0000-* && + test_grep "! 4: .* s/12/B" 0000-* && sed s/Z/\ /g >expect <<-EOF && @@ Commit message Z @@ -790,10 +790,10 @@ test_expect_success 'format-patch --range-diff with format.notes config' ' main..unmodified >actual && test_line_count = 5 actual && test_grep "^Range-diff:$" 0000-* && - grep "= 1: .* s/5/A" 0000-* && - grep "= 2: .* s/4/A" 0000-* && - grep "= 3: .* s/11/B" 0000-* && - grep "! 4: .* s/12/B" 0000-* && + test_grep "= 1: .* s/5/A" 0000-* && + test_grep "= 2: .* s/4/A" 0000-* && + test_grep "= 3: .* s/11/B" 0000-* && + test_grep "! 4: .* s/12/B" 0000-* && sed s/Z/\ /g >expect <<-EOF && @@ Commit message Z @@ -821,10 +821,10 @@ test_expect_success 'format-patch --range-diff with multiple notes' ' main..unmodified >actual && test_line_count = 5 actual && test_grep "^Range-diff:$" 0000-* && - grep "= 1: .* s/5/A" 0000-* && - grep "= 2: .* s/4/A" 0000-* && - grep "= 3: .* s/11/B" 0000-* && - grep "! 4: .* s/12/B" 0000-* && + test_grep "= 1: .* s/5/A" 0000-* && + test_grep "= 2: .* s/4/A" 0000-* && + test_grep "= 3: .* s/11/B" 0000-* && + test_grep "! 4: .* s/12/B" 0000-* && sed s/Z/\ /g >expect <<-EOF && @@ Commit message Z @@ -866,9 +866,9 @@ test_expect_success 'ranges with pathspecs' ' topic_oid=$(git rev-parse --short topic) && mode_change_oid=$(git rev-parse --short mode-only-change^) && file_change_oid=$(git rev-parse --short mode-only-change) && - grep "$mode_change_oid" actual && - ! grep "$file_change_oid" actual && - ! grep "$topic_oid" actual + test_grep "$mode_change_oid" actual && + test_grep ! "$file_change_oid" actual && + test_grep ! "$topic_oid" actual ' test_expect_success 'submodule changes are shown irrespective of diff.submodule' ' diff --git a/t/t3207-branch-submodule.sh b/t/t3207-branch-submodule.sh index fe72b247164e56..4afb2d3198d79d 100755 --- a/t/t3207-branch-submodule.sh +++ b/t/t3207-branch-submodule.sh @@ -136,7 +136,7 @@ test_expect_success 'should not create any branches if branch is not valid for a git -C sub branch branch-a && test_must_fail git branch --recurse-submodules branch-a 2>actual && test_no_branch . branch-a && - grep "submodule .sub.: fatal: a branch named .branch-a. already exists" actual + test_grep "submodule .sub.: fatal: a branch named .branch-a. already exists" actual ) ' @@ -251,7 +251,7 @@ test_expect_success 'should get fatal error upon branch creation when submodule git branch --recurse-submodules branch-a origin/branch-a && # This should fail because super-clone does not have sub2 .git/modules test_must_fail git branch --recurse-submodules branch-b origin/branch-b 2>actual && - grep "fatal: submodule .sub2.: unable to find submodule" actual && + test_grep "fatal: submodule .sub2.: unable to find submodule" actual && test_no_branch . branch-b && test_no_branch sub branch-b && # User can fix themselves by initializing the submodule diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh index d6c50460d08648..18a60001714875 100755 --- a/t/t3301-notes.sh +++ b/t/t3301-notes.sh @@ -164,7 +164,7 @@ test_expect_success 'show notes' ' ${indent}b1 EOF git cat-file commit HEAD >commits && - ! grep b1 commits && + test_grep ! b1 commits && git log -1 >actual && test_cmp expect actual ' @@ -248,17 +248,17 @@ test_expect_success 'git log --show-notes' ' test_expect_success 'git log --no-notes' ' git log -1 --no-notes >actual && - ! grep xyzzy actual + test_grep ! xyzzy actual ' test_expect_success 'git format-patch does not show notes' ' git format-patch -1 --stdout >actual && - ! grep xyzzy actual + test_grep ! xyzzy actual ' test_expect_success 'git format-patch --show-notes does show notes' ' git format-patch --show-notes -1 --stdout >actual && - grep xyzzy actual + test_grep xyzzy actual ' for pretty in \ @@ -281,36 +281,36 @@ test_expect_success 'setup alternate notes ref' ' test_expect_success 'git log --notes shows default notes' ' git log -1 --notes >actual && - grep xyzzy actual && - ! grep alternate actual + test_grep xyzzy actual && + test_grep ! alternate actual ' test_expect_success 'git log --notes=X shows only X' ' git log -1 --notes=alternate >actual && - ! grep xyzzy actual && - grep alternate actual + test_grep ! xyzzy actual && + test_grep alternate actual ' test_expect_success 'git log --notes --notes=X shows both' ' git log -1 --notes --notes=alternate >actual && - grep xyzzy actual && - grep alternate actual + test_grep xyzzy actual && + test_grep alternate actual ' test_expect_success 'git log --no-notes resets default state' ' git log -1 --notes --notes=alternate \ --no-notes --notes=alternate \ >actual && - ! grep xyzzy actual && - grep alternate actual + test_grep ! xyzzy actual && + test_grep alternate actual ' test_expect_success 'git log --no-notes resets ref list' ' git log -1 --notes --notes=alternate \ --no-notes --notes \ >actual && - grep xyzzy actual && - ! grep alternate actual + test_grep xyzzy actual && + test_grep ! alternate actual ' test_expect_success 'show -m notes' ' @@ -543,7 +543,7 @@ test_expect_success 'list notes with "git notes"' ' test_expect_success '"git notes" without subcommand does not take arguments' ' test_expect_code 129 git notes HEAD^^ 2>err && - grep "^error: unknown subcommand" err + test_grep "^error: unknown subcommand" err ' test_expect_success 'list specific note with "git notes list "' ' @@ -1464,7 +1464,7 @@ test_expect_success 'GIT_NOTES_REWRITE_REF overrides config' ' GIT_NOTES_REWRITE_REF=refs/notes/commits \ git notes copy --for-rewrite=foo actual && - grep "replacement note 3" actual + test_grep "replacement note 3" actual ' test_expect_success 'git notes copy diagnoses too many or too few arguments' ' diff --git a/t/t3310-notes-merge-manual-resolve.sh b/t/t3310-notes-merge-manual-resolve.sh index 0bb366fdb8fce1..caa1bf250b6e42 100755 --- a/t/t3310-notes-merge-manual-resolve.sh +++ b/t/t3310-notes-merge-manual-resolve.sh @@ -382,12 +382,12 @@ EOF test_cmp pre_merge_z actual && # Merge commit mentions the notes refs merged git log -1 --format=%B refs/notes/m > merge_commit_msg && - grep -q refs/notes/m merge_commit_msg && - grep -q refs/notes/z merge_commit_msg && + test_grep refs/notes/m merge_commit_msg && + test_grep refs/notes/z merge_commit_msg && # Merge commit mentions conflicting notes - grep -q "Conflicts" merge_commit_msg && + test_grep "Conflicts" merge_commit_msg && ( for sha1 in $(cat expect_conflicts); do - grep -q "$sha1" merge_commit_msg || + test_grep "$sha1" merge_commit_msg || exit 1 done ) && # Verify contents of merge result @@ -512,12 +512,12 @@ EOF test_cmp pre_merge_z actual && # Merge commit mentions the notes refs merged git log -1 --format=%B refs/notes/m > merge_commit_msg && - grep -q refs/notes/m merge_commit_msg && - grep -q refs/notes/z merge_commit_msg && + test_grep refs/notes/m merge_commit_msg && + test_grep refs/notes/z merge_commit_msg && # Merge commit mentions conflicting notes - grep -q "Conflicts" merge_commit_msg && + test_grep "Conflicts" merge_commit_msg && ( for sha1 in $(cat expect_conflicts); do - grep -q "$sha1" merge_commit_msg || + test_grep "$sha1" merge_commit_msg || exit 1 done ) && # Verify contents of merge result diff --git a/t/t3320-notes-merge-worktrees.sh b/t/t3320-notes-merge-worktrees.sh index 96243b72222420..9a2c3ac3f706af 100755 --- a/t/t3320-notes-merge-worktrees.sh +++ b/t/t3320-notes-merge-worktrees.sh @@ -67,7 +67,7 @@ test_expect_success 'merge z into x while mid-merge on y succeeds' ' git config core.notesRef refs/notes/x && test_must_fail git notes merge z >out 2>&1 && test_grep "Automatic notes merge failed" out && - grep -v "A notes merge into refs/notes/x is already in-progress in" out + test_grep -v "A notes merge into refs/notes/x is already in-progress in" out ) && echo "refs/notes/x" >expect && git -C worktree2 symbolic-ref NOTES_MERGE_REF >actual && diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh index c0c00fbb7b1e4e..e62e07b894669e 100755 --- a/t/t3400-rebase.sh +++ b/t/t3400-rebase.sh @@ -287,16 +287,16 @@ test_expect_success 'rebase commit with an ancient timestamp' ' git commit --date="@34567 +0600" -m "Old three" && git cat-file commit HEAD^^ >actual && - grep "author .* 12345 +0400$" actual && + test_grep "author .* 12345 +0400$" actual && git cat-file commit HEAD^ >actual && - grep "author .* 23456 +0500$" actual && + test_grep "author .* 23456 +0500$" actual && git cat-file commit HEAD >actual && - grep "author .* 34567 +0600$" actual && + test_grep "author .* 34567 +0600$" actual && git rebase --onto HEAD^^ HEAD^ && git cat-file commit HEAD >actual && - grep "author .* 34567 +0600$" actual + test_grep "author .* 34567 +0600$" actual ' test_expect_success 'rebase with "From " line in commit message' ' @@ -333,7 +333,7 @@ test_expect_success 'rebase --apply and --show-current-patch' ' git tag two && test_must_fail git rebase --apply -f --onto init HEAD^ && GIT_TRACE=1 git rebase --show-current-patch >/dev/null 2>stderr && - grep "show.*$(git rev-parse two)" stderr + test_grep "show.*$(git rev-parse two)" stderr ) ' @@ -364,12 +364,12 @@ test_expect_success 'rebase --apply and .gitattributes' ' git checkout test && git rebase main && - grep "smudged" a.txt && + test_grep "smudged" a.txt && git checkout removal && git reset --hard && git rebase main && - grep "clean" a.txt + test_grep "clean" a.txt ) ' @@ -386,7 +386,7 @@ test_expect_success 'rebase--merge.sh and --show-current-patch' ' test_must_fail git rebase --merge --onto init HEAD^ && git rebase --show-current-patch >actual.patch && GIT_TRACE=1 git rebase --show-current-patch >/dev/null 2>stderr && - grep "show.*REBASE_HEAD" stderr && + test_grep "show.*REBASE_HEAD" stderr && test "$(git rev-parse REBASE_HEAD)" = "$(git rev-parse two)" ) ' diff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh index 761de63b6b9822..41ebcdec9f7117 100755 --- a/t/t3402-rebase-merge.sh +++ b/t/t3402-rebase-merge.sh @@ -84,8 +84,8 @@ test_expect_success 'rebase -Xtheirs' ' echo "AB $T" >> original && git commit -mconflicting original && git rebase -Xtheirs main && - grep AB original && - ! grep 11 original + test_grep AB original && + test_grep ! 11 original ' test_expect_success 'rebase -Xtheirs from orphan' ' @@ -93,8 +93,8 @@ test_expect_success 'rebase -Xtheirs from orphan' ' echo "AB $T" >> original && git commit -morphan-conflicting original && git rebase -Xtheirs main && - grep AB original && - ! grep 11 original + test_grep AB original && + test_grep ! 11 original ' test_expect_success 'merge and rebase should match' ' @@ -210,15 +210,15 @@ test_expect_success '--reapply-cherry-picks refrains from reading unneeded blobs git -C client rev-list --objects --all --missing=print >missing_list && MERGE_BASE_BLOB=$(git -C server rev-parse main^^:file.txt) && ADD_11_BLOB=$(git -C server rev-parse main^:file.txt) && - grep "[?]$MERGE_BASE_BLOB" missing_list && - grep "[?]$ADD_11_BLOB" missing_list && + test_grep "[?]$MERGE_BASE_BLOB" missing_list && + test_grep "[?]$ADD_11_BLOB" missing_list && git -C client rebase --merge --reapply-cherry-picks origin/main && # The blob from the merge base had to be fetched, but not "add 11" git -C client rev-list --objects --all --missing=print >missing_list && - ! grep "[?]$MERGE_BASE_BLOB" missing_list && - grep "[?]$ADD_11_BLOB" missing_list + test_grep ! "[?]$MERGE_BASE_BLOB" missing_list && + test_grep "[?]$ADD_11_BLOB" missing_list ' test_done diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 58b3bb0c271aae..a11c6d3714908c 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -144,7 +144,7 @@ test_expect_success 'rebase -i sets work tree properly' ' mkdir subdir && git rebase -x "(cd subdir && git rev-parse --show-toplevel)" HEAD^ \ >actual && - ! grep "/subdir$" actual + test_grep ! "/subdir$" actual ' test_expect_success 'rebase -i with the exec command checks tree cleanness' ' @@ -196,7 +196,7 @@ test_expect_success 'rebase -i with exec of inexistent command' ' test_must_fail env FAKE_LINES="exec_this-command-does-not-exist 1" \ git rebase -i HEAD^ >actual 2>&1 ) && - ! grep "Maybe git-rebase is broken" actual + test_grep ! "Maybe git-rebase is broken" actual ' test_expect_success 'implicit interactive rebase does not invoke sequence editor' ' @@ -293,7 +293,7 @@ test_expect_success 'stop on conflicting pick' ' test_expect_success 'show conflicted patch' ' GIT_TRACE=1 git rebase --show-current-patch >/dev/null 2>stderr && - grep "show.*REBASE_HEAD" stderr && + test_grep "show.*REBASE_HEAD" stderr && # the original stopped-sha1 is abbreviated stopped_sha1="$(git rev-parse $(cat ".git/rebase-merge/stopped-sha"))" && test "$(git rev-parse REBASE_HEAD)" = "$stopped_sha1" @@ -326,7 +326,7 @@ test_expect_success 'retain authorship' ' git tag twerp && git rebase -i --onto primary HEAD^ && git show HEAD >actual && - grep "^Author: Twerp Snog" actual + test_grep "^Author: Twerp Snog" actual ' test_expect_success 'retain authorship w/ conflicts' ' @@ -348,7 +348,7 @@ test_expect_success 'retain authorship w/ conflicts' ' git rebase --continue && test_cmp_rev conflict-a^0 HEAD^ && git show >out && - grep AttributeMe out + test_grep AttributeMe out ' test_expect_success 'squash' ' @@ -368,7 +368,7 @@ test_expect_success 'squash' ' test_expect_success 'retain authorship when squashing' ' git show HEAD >actual && - grep "^Author: Twerp Snog" actual + test_grep "^Author: Twerp Snog" actual ' test_expect_success '--continue tries to commit' ' @@ -383,7 +383,7 @@ test_expect_success '--continue tries to commit' ' ) && test_cmp_rev HEAD^ new-branch1 && git show HEAD >actual && - grep chouette actual + test_grep chouette actual ' test_expect_success 'verbose flag is heeded, even after --continue' ' @@ -393,7 +393,7 @@ test_expect_success 'verbose flag is heeded, even after --continue' ' echo resolved > file1 && git add file1 && git rebase --continue > output && - grep "^ file1 | 2 +-$" output + test_grep "^ file1 | 2 +-$" output ' test_expect_success 'multi-squash only fires up editor once' ' @@ -422,7 +422,7 @@ test_expect_success 'multi-fixup does not fire up editor' ' ) && test $base = $(git rev-parse HEAD^) && git show >output && - ! grep NEVER output && + test_grep ! NEVER output && git checkout @{-1} && git branch -D multi-fixup ' @@ -487,9 +487,9 @@ test_expect_success 'squash and fixup generate correct log messages' ' git cat-file commit HEAD | sed -e 1,/^\$/d > actual-squash-fixup && test_cmp expect-squash-fixup actual-squash-fixup && git cat-file commit HEAD@{2} >actual && - grep "^# This is a combination of 3 commits\." actual && + test_grep "^# This is a combination of 3 commits\." actual && git cat-file commit HEAD@{3} >actual && - grep "^# This is a combination of 2 commits\." actual && + test_grep "^# This is a combination of 2 commits\." actual && git checkout @{-1} && git branch -D squash-fixup ' @@ -593,7 +593,7 @@ test_expect_success '--continue tries to commit, even for "edit"' ' ) && test edited = $(git show HEAD:file7) && git show HEAD >actual && - grep chouette actual && + test_grep chouette actual && test $parent = $(git rev-parse HEAD^) ' @@ -779,22 +779,22 @@ test_expect_success 'reword' ' FAKE_LINES="1 2 3 reword 4" FAKE_COMMIT_MESSAGE="E changed" \ git rebase -i A && git show HEAD >actual && - grep "E changed" actual && + test_grep "E changed" actual && test $(git rev-parse primary) != $(git rev-parse HEAD) && test_cmp_rev primary^ HEAD^ && FAKE_LINES="1 2 reword 3 4" FAKE_COMMIT_MESSAGE="D changed" \ git rebase -i A && git show HEAD^ >actual && - grep "D changed" actual && + test_grep "D changed" actual && FAKE_LINES="reword 1 2 3 4" FAKE_COMMIT_MESSAGE="B changed" \ git rebase -i A && git show HEAD~3 >actual && - grep "B changed" actual && + test_grep "B changed" actual && FAKE_LINES="1 r 2 pick 3 p 4" FAKE_COMMIT_MESSAGE="C changed" \ git rebase -i A ) && git show HEAD~2 >actual && - grep "C changed" actual + test_grep "C changed" actual ' test_expect_success 'reword fast-forwarded empty commit' ' @@ -1043,9 +1043,9 @@ test_expect_success 'rebase -i --root retain root commit author and message' ' FAKE_LINES="2" git rebase -i --root ) && git cat-file commit HEAD >output && - grep -q "^author Twerp Snog" output && + test_grep "^author Twerp Snog" output && git cat-file commit HEAD >actual && - grep -q "^different author$" actual + test_grep "^different author$" actual ' test_expect_success 'rebase -i --root temporary sentinel commit' ' @@ -1055,7 +1055,7 @@ test_expect_success 'rebase -i --root temporary sentinel commit' ' test_must_fail env FAKE_LINES="2" git rebase -i --root ) && git cat-file commit HEAD >actual && - grep "^tree $EMPTY_TREE" actual && + test_grep "^tree $EMPTY_TREE" actual && git rebase --abort ' @@ -1079,7 +1079,7 @@ test_expect_success 'rebase -i --root reword original root commit' ' git rebase -i --root ) && git show HEAD^ >actual && - grep "A changed" actual && + test_grep "A changed" actual && test -z "$(git show -s --format=%p HEAD^)" ' @@ -1092,7 +1092,7 @@ test_expect_success 'rebase -i --root reword new root commit' ' git rebase -i --root ) && git show HEAD^ >actual && - grep "C changed" actual && + test_grep "C changed" actual && test -z "$(git show -s --format=%p HEAD^)" ' @@ -1315,11 +1315,11 @@ test_expect_success 'short commit ID collide' ' FAKE_COMMIT_MESSAGE="collide2 $(test_oid t3404_collider)" \ FAKE_LINES="reword 1 break 2" git rebase -i HEAD~2 && test $colliding_id = "$(git rev-parse HEAD | cut -c 1-4)" && - grep "^pick $colliding_id " \ + test_grep "^pick $colliding_id " \ .git/rebase-merge/git-rebase-todo.tmp && - grep -E "^pick [0-9a-f]{$hexsz}" \ + test_grep -E "^pick [0-9a-f]{$hexsz}" \ .git/rebase-merge/git-rebase-todo && - grep -E "^pick [0-9a-f]{$hexsz}" \ + test_grep -E "^pick [0-9a-f]{$hexsz}" \ .git/rebase-merge/git-rebase-todo.backup && git rebase --continue ) && @@ -1371,7 +1371,7 @@ test_expect_success 'rebase -i commits that overwrite untracked files (pick)' ' echo changed >file1 && git add file1 && test_must_fail git rebase --continue 2>err && - grep "error: you have staged changes in your working tree" err && + test_grep "error: you have staged changes in your working tree" err && git reset --hard HEAD && git rebase --continue && test_cmp_rev HEAD D && @@ -1398,7 +1398,7 @@ test_expect_success 'rebase -i commits that overwrite untracked files (squash)' echo changed >file1 && git add file1 && test_must_fail git rebase --continue 2>err && - grep "error: you have staged changes in your working tree" err && + test_grep "error: you have staged changes in your working tree" err && git reset --hard HEAD && git rebase --continue && test $(git cat-file commit HEAD | sed -ne \$p) = I && @@ -1423,7 +1423,7 @@ test_expect_success 'rebase -i commits that overwrite untracked files (no ff)' ' echo changed >file1 && git add file1 && test_must_fail git rebase --continue 2>err && - grep "error: you have staged changes in your working tree" err && + test_grep "error: you have staged changes in your working tree" err && git reset --hard HEAD && git rebase --continue && test $(git cat-file commit HEAD | sed -ne \$p) = I @@ -1709,15 +1709,15 @@ test_expect_success 'the first command cannot be a fixup' ' set_replace_editor orig && test_must_fail git rebase -i A 2>actual ) && - grep "cannot .fixup. without a previous commit" actual && - grep "You can fix this with .git rebase --edit-todo.." actual && + test_grep "cannot .fixup. without a previous commit" actual && + test_grep "You can fix this with .git rebase --edit-todo.." actual && # verify that the todo list has not been truncated grep -v "^#" .git/rebase-merge/git-rebase-todo >actual && test_cmp orig actual && test_must_fail git rebase --edit-todo 2>actual && - grep "cannot .fixup. without a previous commit" actual && - grep "You can fix this with .git rebase --edit-todo.." actual && + test_grep "cannot .fixup. without a previous commit" actual && + test_grep "You can fix this with .git rebase --edit-todo.." actual && # verify that the todo list has not been truncated grep -v "^#" .git/rebase-merge/git-rebase-todo >actual && test_cmp orig actual @@ -2252,7 +2252,7 @@ test_expect_success '--update-refs: check failed ref update' ' git update-ref refs/heads/second third && test_must_fail git rebase --continue 2>err && - grep "update_ref failed for ref '\''refs/heads/second'\''" err && + test_grep "update_ref failed for ref '\''refs/heads/second'\''" err && q_to_tab >expect <<-\EOF && Updated the following refs with --update-refs: @@ -2283,10 +2283,10 @@ test_expect_success 'bad labels and refs rejected when parsing todo list' ' set_replace_editor todo && test_must_fail git rebase -i HEAD 2>err ) && - grep "'\''#'\'' is not a valid label" err && - grep "'\'':invalid'\'' is not a valid label" err && - grep "'\'':bad'\'' is not a valid refname" err && - grep "update-ref requires a fully qualified refname e.g. refs/heads/topic" \ + test_grep "'\''#'\'' is not a valid label" err && + test_grep "'\'':invalid'\'' is not a valid label" err && + test_grep "'\'':bad'\'' is not a valid refname" err && + test_grep "update-ref requires a fully qualified refname e.g. refs/heads/topic" \ err && test_path_is_missing execed ' diff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh index bc51a9d3a70d55..7b61188e1fba7c 100755 --- a/t/t3406-rebase-message.sh +++ b/t/t3406-rebase-message.sh @@ -62,21 +62,21 @@ test_expect_success 'rebase fast-forward to main' ' test_expect_success 'rebase --stat' ' git reset --hard start && git rebase --stat main >diffstat.txt && - grep "^ fileX | *1 +$" diffstat.txt + test_grep "^ fileX | *1 +$" diffstat.txt ' test_expect_success 'rebase w/config rebase.stat' ' git reset --hard start && git config rebase.stat true && git rebase main >diffstat.txt && - grep "^ fileX | *1 +$" diffstat.txt + test_grep "^ fileX | *1 +$" diffstat.txt ' test_expect_success 'rebase -n overrides config rebase.stat config' ' git reset --hard start && git config rebase.stat true && git rebase -n main >diffstat.txt && - ! grep "^ fileX | *1 +$" diffstat.txt + test_grep ! "^ fileX | *1 +$" diffstat.txt ' test_expect_success 'rebase --onto outputs the invalid ref' ' diff --git a/t/t3415-rebase-autosquash.sh b/t/t3415-rebase-autosquash.sh index 5033411a431833..07a5a11678cda1 100755 --- a/t/t3415-rebase-autosquash.sh +++ b/t/t3415-rebase-autosquash.sh @@ -223,7 +223,7 @@ test_expect_success 'auto squash that matches a sha1' ' git cat-file blob HEAD^:file1 >actual && test_cmp expect actual && git cat-file commit HEAD^ >commit && - ! grep "squash" commit && + test_grep ! "squash" commit && grep "^extra para" commit >actual && test_line_count = 1 actual ' @@ -245,7 +245,7 @@ test_expect_success 'auto squash that matches longer sha1' ' git cat-file blob HEAD^:file1 >actual && test_cmp expect actual && git cat-file commit HEAD^ >commit && - ! grep "squash" commit && + test_grep ! "squash" commit && grep "^extra para" commit >actual && test_line_count = 1 actual ' @@ -377,7 +377,7 @@ test_expect_success 'autosquash with custom inst format' ' git cat-file blob HEAD^:file1 >actual && test_cmp expect actual && git cat-file commit HEAD^ >commit && - ! grep "squash" commit && + test_grep ! "squash" commit && grep first commit >actual && test_line_count = 3 actual ' @@ -424,7 +424,7 @@ test_expect_success 'autosquash with multiple empty patches' ' set_backup_editor && GIT_USE_REBASE_HELPER=false \ git rebase -i --force-rebase --autosquash HEAD~4 && - grep empty2 .git/backup-git-rebase-todo + test_grep empty2 .git/backup-git-rebase-todo ) ' @@ -467,7 +467,7 @@ test_expect_success 'abort last squash' ' git commit --allow-empty --amend -m edited-first && git rebase --skip && git show >actual && - ! grep first actual + test_grep ! first actual ' test_expect_success 'fixup a fixup' ' diff --git a/t/t3416-rebase-onto-threedots.sh b/t/t3416-rebase-onto-threedots.sh index ea501f2b42b8cc..e7f725b8d0c709 100755 --- a/t/t3416-rebase-onto-threedots.sh +++ b/t/t3416-rebase-onto-threedots.sh @@ -107,7 +107,7 @@ test_expect_success 'rebase --onto main...side requires a single merge-base' ' git reset --hard K && test_must_fail git rebase -i --onto main...side J 2>err && - grep "need exactly one merge base" err + test_grep "need exactly one merge base" err ' test_expect_success 'rebase --keep-base --onto incompatible' ' @@ -196,7 +196,7 @@ test_expect_success 'rebase --keep-base requires a single merge base' ' git reset --hard K && test_must_fail git rebase -i --keep-base main 2>err && - grep "need exactly one merge base with branch" err + test_grep "need exactly one merge base with branch" err ' test_expect_success 'rebase --keep-base keeps cherry picks' ' diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh index f9b8999db50f1b..03e0714864c5fd 100755 --- a/t/t3418-rebase-continue.sh +++ b/t/t3418-rebase-continue.sh @@ -289,18 +289,18 @@ test_expect_success 'patch file is removed before break command' ' test_expect_success '--reschedule-failed-exec' ' test_when_finished "git rebase --abort" && test_must_fail git rebase -x false --reschedule-failed-exec HEAD^ && - grep "^exec false" .git/rebase-merge/git-rebase-todo && + test_grep "^exec false" .git/rebase-merge/git-rebase-todo && git rebase --abort && test_must_fail git -c rebase.rescheduleFailedExec=true \ rebase -x false HEAD^ 2>err && - grep "^exec false" .git/rebase-merge/git-rebase-todo && + test_grep "^exec false" .git/rebase-merge/git-rebase-todo && test_grep "has been rescheduled" err ' test_expect_success 'rebase.rescheduleFailedExec only affects `rebase -i`' ' test_config rebase.rescheduleFailedExec true && test_must_fail git rebase -x false HEAD^ && - grep "^exec false" .git/rebase-merge/git-rebase-todo && + test_grep "^exec false" .git/rebase-merge/git-rebase-todo && git rebase --abort && git rebase HEAD^ ' @@ -310,7 +310,7 @@ test_expect_success 'rebase.rescheduleFailedExec=true & --no-reschedule-failed-e test_config rebase.rescheduleFailedExec true && test_must_fail git rebase -x false --no-reschedule-failed-exec HEAD~2 && test_must_fail git rebase --continue 2>err && - ! grep "has been rescheduled" err + test_grep ! "has been rescheduled" err ' test_expect_success 'new rebase.rescheduleFailedExec=true setting in an ongoing rebase is ignored' ' @@ -318,7 +318,7 @@ test_expect_success 'new rebase.rescheduleFailedExec=true setting in an ongoing test_must_fail git rebase -x false HEAD~2 && test_config rebase.rescheduleFailedExec true && test_must_fail git rebase --continue 2>err && - ! grep "has been rescheduled" err + test_grep ! "has been rescheduled" err ' test_expect_success 'there is no --no-reschedule-failed-exec in an ongoing rebase' ' diff --git a/t/t3420-rebase-autostash.sh b/t/t3420-rebase-autostash.sh index f0bbc476ff8f4d..c78052690edbd3 100755 --- a/t/t3420-rebase-autostash.sh +++ b/t/t3420-rebase-autostash.sh @@ -141,8 +141,8 @@ testrebase () { git checkout -b rebased-feature-branch feature-branch && echo dirty >>file3 && git rebase$type unrelated-onto-branch >actual 2>&1 && - grep unrelated file4 && - grep dirty file3 && + test_grep unrelated file4 && + test_grep dirty file3 && git checkout feature-branch ' @@ -165,8 +165,8 @@ testrebase () { echo dirty >>file3 && git add file3 && git rebase$type unrelated-onto-branch && - grep unrelated file4 && - grep dirty file3 && + test_grep unrelated file4 && + test_grep dirty file3 && git checkout feature-branch ' @@ -197,7 +197,7 @@ testrebase () { git add file2 && git rebase --continue && test_path_is_missing $dotest/autostash && - grep dirty file3 && + test_grep dirty file3 && git checkout feature-branch ' @@ -212,7 +212,7 @@ testrebase () { test_path_is_missing file3 && git rebase --skip && test_path_is_missing $dotest/autostash && - grep dirty file3 && + test_grep dirty file3 && git checkout feature-branch ' @@ -227,7 +227,7 @@ testrebase () { test_path_is_missing file3 && git rebase --abort && test_path_is_missing $dotest/autostash && - grep dirty file3 && + test_grep dirty file3 && git checkout feature-branch ' @@ -244,7 +244,6 @@ testrebase () { git rebase --quit && test_when_finished git stash drop && test_path_is_missing $dotest/autostash && - ! grep dirty file3 && git stash show -p >actual && test_cmp expect actual && git reset --hard && @@ -260,11 +259,11 @@ testrebase () { git rebase$type unrelated-onto-branch >actual 2>&1 && test_path_is_missing $dotest && git reset --hard && - grep unrelated file4 && - ! grep dirty file4 && + test_grep unrelated file4 && + test_grep ! dirty file4 && git checkout feature-branch && git stash pop && - grep dirty file4 + test_grep dirty file4 ' test_expect_success "rebase$type: check output with conflicting stash" ' @@ -286,7 +285,7 @@ test_expect_success "rebase: fast-forward rebase" ' test_when_finished git branch -D behind-feature-branch && echo dirty >>file1 && git rebase feature-branch && - grep dirty file1 && + test_grep dirty file1 && git checkout feature-branch ' @@ -297,7 +296,7 @@ test_expect_success "rebase: noop rebase" ' test_when_finished git branch -D same-feature-branch && echo dirty >>file1 && git rebase feature-branch && - grep dirty file1 && + test_grep dirty file1 && git checkout feature-branch ' diff --git a/t/t3422-rebase-incompatible-options.sh b/t/t3422-rebase-incompatible-options.sh index b9408f9ba1285f..d6830b82e000d9 100755 --- a/t/t3422-rebase-incompatible-options.sh +++ b/t/t3422-rebase-incompatible-options.sh @@ -102,13 +102,13 @@ test_rebase_am_only () { test_expect_success "$opt incompatible with rebase.rebaseMerges" " git checkout B^0 && test_must_fail git -c rebase.rebaseMerges=true rebase $opt A 2>err && - grep -e --no-rebase-merges err + test_grep -e --no-rebase-merges err " test_expect_success "$opt incompatible with rebase.updateRefs" " git checkout B^0 && test_must_fail git -c rebase.updateRefs=true rebase $opt A 2>err && - grep -e --no-update-refs err + test_grep -e --no-update-refs err " test_expect_success "$opt okay with overridden rebase.rebaseMerges" " diff --git a/t/t3429-rebase-edit-todo.sh b/t/t3429-rebase-edit-todo.sh index abd66f360213e1..28e4bdd0d93a1a 100755 --- a/t/t3429-rebase-edit-todo.sh +++ b/t/t3429-rebase-edit-todo.sh @@ -19,7 +19,7 @@ test_expect_success 'rebase exec modifies rebase-todo' ' test_expect_success 'rebase exec with an empty list does not exec anything' ' git rebase HEAD -x "true" 2>output && - ! grep "Executing: true" output + test_grep ! "Executing: true" output ' test_expect_success 'loose object cache vs re-reading todo list' ' diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh index 84b2d0e664e58f..9bd61c58b38d4c 100755 --- a/t/t3430-rebase-merges.sh +++ b/t/t3430-rebase-merges.sh @@ -161,7 +161,7 @@ test_expect_success '`reset` rejects trees' ' test_when_finished "test_might_fail git rebase --abort" && test_must_fail env GIT_SEQUENCE_EDITOR="echo reset A^{tree} >" \ git rebase -i B C >out 2>err && - grep "object .* is a tree" err && + test_grep "object .* is a tree" err && test_must_be_empty out ' @@ -170,7 +170,7 @@ test_expect_success '`reset` only looks for labels under refs/rewritten/' ' git branch refs/rewritten/my-label A && test_must_fail env GIT_SEQUENCE_EDITOR="echo reset my-label >" \ git rebase -i B C >out 2>err && - grep "could not resolve ${SQ}my-label${SQ}" err && + test_grep "could not resolve ${SQ}my-label${SQ}" err && test_must_be_empty out ' @@ -185,18 +185,18 @@ test_expect_success 'failed `merge -C` writes patch (may be rescheduled, too)' ' test_tick && test_must_fail git rebase -ir HEAD && test_cmp_rev REBASE_HEAD H^0 && - grep "^merge -C .* G$" .git/rebase-merge/done && - grep "^merge -C .* G$" .git/rebase-merge/git-rebase-todo && + test_grep "^merge -C .* G$" .git/rebase-merge/done && + test_grep "^merge -C .* G$" .git/rebase-merge/git-rebase-todo && test_path_is_missing .git/rebase-merge/patch && echo changed >file1 && git add file1 && test_must_fail git rebase --continue 2>err && - grep "error: you have staged changes in your working tree" err && + test_grep "error: you have staged changes in your working tree" err && : fail because of merge conflict && git reset --hard conflicting-G && test_must_fail git rebase --continue && - ! grep "^merge -C .* G$" .git/rebase-merge/git-rebase-todo && + test_grep ! "^merge -C .* G$" .git/rebase-merge/git-rebase-todo && test_path_is_file .git/rebase-merge/patch ' @@ -208,8 +208,8 @@ test_expect_success 'failed `merge ` does not crash' ' test_config sequence.editor \""$PWD"/replace-editor.sh\" && test_tick && test_must_fail git rebase -ir HEAD && - ! grep "^merge G$" .git/rebase-merge/git-rebase-todo && - grep "^Merge branch ${SQ}G${SQ}$" .git/rebase-merge/message + test_grep ! "^merge G$" .git/rebase-merge/git-rebase-todo && + test_grep "^Merge branch ${SQ}G${SQ}$" .git/rebase-merge/message ' test_expect_success 'merge -c commits before rewording and reloads todo-list' ' @@ -481,8 +481,8 @@ test_expect_success 'labels that are object IDs are rewritten' ' test_config sequence.editor \""$PWD"/replace-editor.sh\" && test_tick && git rebase -i -r A && - grep "^label $third-" .git/ORIGINAL-TODO && - ! grep "^label $third$" .git/ORIGINAL-TODO + test_grep "^label $third-" .git/ORIGINAL-TODO && + test_grep ! "^label $third$" .git/ORIGINAL-TODO ' test_expect_success 'octopus merges' ' @@ -533,9 +533,9 @@ test_expect_success 'with --autosquash and --exec' ' EOF test_tick && git rebase -ir --autosquash --exec ./show.sh A >actual && - grep "B: +Booh" actual && - grep "E: +Booh" actual && - grep "G: +G" actual + test_grep "B: +Booh" actual && + test_grep "E: +Booh" actual && + test_grep "G: +G" actual ' test_expect_success '--continue after resolving conflicts after a merge' ' @@ -546,7 +546,7 @@ test_expect_success '--continue after resolving conflicts after a merge' ' git checkout -b conflicts-in-merge H && test_commit H2 H2.t conflicts H2-conflict && test_must_fail git rebase -r already-has-g && - grep conflicts H2.t && + test_grep conflicts H2.t && echo resolved >H2.t && git add -u && git rebase --continue && @@ -616,9 +616,9 @@ test_expect_success 'truncate label names' ' done="$(git rev-parse --git-path rebase-merge/done)" && git -c rebase.maxLabelLength=14 rebase --rebase-merges -x "cp \"$done\" out" --root && - grep "label 0123456789-我$" out && + test_grep "label 0123456789-我$" out && git -c rebase.maxLabelLength=13 rebase --rebase-merges -x "cp \"$done\" out" --root && - grep "label 0123456789-$" out + test_grep "label 0123456789-$" out ' test_expect_success 'reword fast-forwarded empty merge commit' ' diff --git a/t/t3500-cherry.sh b/t/t3500-cherry.sh index 3e66827d7641d8..03655c8a481aa1 100755 --- a/t/t3500-cherry.sh +++ b/t/t3500-cherry.sh @@ -100,8 +100,8 @@ test_expect_success 'cherry in partial clone does bulk prefetch' ' GIT_TRACE2_EVENT="$(pwd)/trace2.output" git cherry upstream-with-space feature-without-space >actual && test_cmp ../expect actual && - ! grep "child_start.*fetch.negotiationAlgorithm" trace2.output && - ! grep "\"key\":\"fetch_count\"" trace2.output + test_grep ! "child_start.*fetch.negotiationAlgorithm" trace2.output && + test_grep ! "\"key\":\"fetch_count\"" trace2.output ) ' diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh index 8025a28cfddb08..7291a8fae127cd 100755 --- a/t/t3501-revert-cherry-pick.sh +++ b/t/t3501-revert-cherry-pick.sh @@ -67,7 +67,7 @@ test_expect_success 'cherry-pick after renaming branch' ' git checkout rename2 && git cherry-pick added && test_cmp_rev rename2 HEAD^ && - grep "Add extra line at the end" opos && + test_grep "Add extra line at the end" opos && git reflog -1 | grep cherry-pick ' @@ -162,7 +162,7 @@ test_expect_success 'cherry-pick works with dirty renamed file' ' echo modified >renamed && git cherry-pick refs/heads/unrelated && test $(git rev-parse :0:renamed) = $(git rev-parse HEAD~2:to-rename.t) && - grep -q "^modified$" renamed + test_grep "^modified$" renamed ' test_expect_success 'advice from failed revert' ' @@ -253,7 +253,7 @@ test_expect_success 'identification of reverted commit (revert.reference)' ' test_expect_success 'cherry-pick is unaware of --reference (for now)' ' test_when_finished "git reset --hard" && test_must_fail git cherry-pick --reference HEAD 2>actual && - grep "^usage: git cherry-pick" actual + test_grep "^usage: git cherry-pick" actual ' test_done diff --git a/t/t3504-cherry-pick-rerere.sh b/t/t3504-cherry-pick-rerere.sh index 18aeba161c0ae4..462973fa9191ce 100755 --- a/t/t3504-cherry-pick-rerere.sh +++ b/t/t3504-cherry-pick-rerere.sh @@ -98,9 +98,9 @@ test_expect_success 'cherry-pick --rerere-autoupdate more than once' ' test_expect_success 'cherry-pick conflict without rerere' ' test_config rerere.enabled false && test_must_fail git cherry-pick foo-main && - grep ===== foo && - grep foo-dev foo && - grep foo-main foo + test_grep ===== foo && + test_grep foo-dev foo && + test_grep foo-main foo ' test_done diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh index 66ff9db2702a35..5777dff4964381 100755 --- a/t/t3510-cherry-pick-sequence.sh +++ b/t/t3510-cherry-pick-sequence.sh @@ -580,10 +580,10 @@ test_expect_success '--continue respects opts' ' git cat-file commit HEAD~1 >picked_msg && git cat-file commit HEAD~2 >unrelatedpick_msg && git cat-file commit HEAD~3 >initial_msg && - ! grep "cherry picked from" initial_msg && - grep "cherry picked from" unrelatedpick_msg && - grep "cherry picked from" picked_msg && - grep "cherry picked from" anotherpick_msg + test_grep ! "cherry picked from" initial_msg && + test_grep "cherry picked from" unrelatedpick_msg && + test_grep "cherry picked from" picked_msg && + test_grep "cherry picked from" anotherpick_msg ' test_expect_success '--continue of single-pick respects -x' ' @@ -594,7 +594,7 @@ test_expect_success '--continue of single-pick respects -x' ' git cherry-pick --continue && test_path_is_missing .git/sequencer && git cat-file commit HEAD >msg && - grep "cherry picked from" msg + test_grep "cherry picked from" msg ' test_expect_success '--continue respects -x in first commit in multi-pick' ' @@ -606,7 +606,7 @@ test_expect_success '--continue respects -x in first commit in multi-pick' ' test_path_is_missing .git/sequencer && git cat-file commit HEAD^ >msg && picked=$(git rev-parse --verify picked) && - grep "cherry picked from.*$picked" msg + test_grep "cherry picked from.*$picked" msg ' test_expect_failure '--signoff is automatically propagated to resolved conflict' ' @@ -621,10 +621,10 @@ test_expect_failure '--signoff is automatically propagated to resolved conflict' git cat-file commit HEAD~1 >picked_msg && git cat-file commit HEAD~2 >unrelatedpick_msg && git cat-file commit HEAD~3 >initial_msg && - ! grep "Signed-off-by:" initial_msg && - grep "Signed-off-by:" unrelatedpick_msg && - ! grep "Signed-off-by:" picked_msg && - grep "Signed-off-by:" anotherpick_msg + test_grep ! "Signed-off-by:" initial_msg && + test_grep "Signed-off-by:" unrelatedpick_msg && + test_grep ! "Signed-off-by:" picked_msg && + test_grep "Signed-off-by:" anotherpick_msg ' test_expect_failure '--signoff dropped for implicit commit of resolution, multi-pick case' ' @@ -637,7 +637,7 @@ test_expect_failure '--signoff dropped for implicit commit of resolution, multi- git diff --exit-code HEAD && test_cmp_rev initial HEAD^^ && git cat-file commit HEAD^ >msg && - ! grep Signed-off-by: msg + test_grep ! Signed-off-by: msg ' test_expect_failure 'sign-off needs to be reaffirmed after conflict resolution, single-pick case' ' @@ -650,7 +650,7 @@ test_expect_failure 'sign-off needs to be reaffirmed after conflict resolution, git diff --exit-code HEAD && test_cmp_rev initial HEAD^ && git cat-file commit HEAD >msg && - ! grep Signed-off-by: msg + test_grep ! Signed-off-by: msg ' test_expect_success 'malformed instruction sheet 1' ' diff --git a/t/t3602-rm-sparse-checkout.sh b/t/t3602-rm-sparse-checkout.sh index 02c7acd61784ad..252df28bbf4329 100755 --- a/t/t3602-rm-sparse-checkout.sh +++ b/t/t3602-rm-sparse-checkout.sh @@ -79,8 +79,8 @@ test_expect_success 'do not advice about sparse entries when they do not match t git reset --hard && git sparse-checkout set a && test_must_fail git rm nonexistent 2>stderr && - grep "fatal: pathspec .nonexistent. did not match any files" stderr && - ! grep -F -f sparse_error_header stderr + test_grep "fatal: pathspec .nonexistent. did not match any files" stderr && + test_grep ! -F -f sparse_error_header stderr ' test_expect_success 'do not warn about sparse entries when pathspec matches dense entries' ' diff --git a/t/t3705-add-sparse-checkout.sh b/t/t3705-add-sparse-checkout.sh index 53a4782267b705..64ad7a2949bf0c 100755 --- a/t/t3705-add-sparse-checkout.sh +++ b/t/t3705-add-sparse-checkout.sh @@ -149,8 +149,8 @@ test_expect_success 'git add --dry-run --ignore-missing warn on sparse path' ' test_expect_success 'do not advice about sparse entries when they do not match the pathspec' ' setup_sparse_entry && test_must_fail git add nonexistent 2>stderr && - grep "fatal: pathspec .nonexistent. did not match any files" stderr && - ! grep -F -f sparse_error_header stderr + test_grep "fatal: pathspec .nonexistent. did not match any files" stderr && + test_grep ! -F -f sparse_error_header stderr ' test_expect_success 'do not warn when pathspec matches dense entries' ' @@ -184,19 +184,19 @@ test_expect_success 'git add fails outside of sparse-checkout definition' ' git -c core.autocrlf=input add --sparse sparse_entry 2>stderr && test_must_be_empty stderr && git ls-files --stage >actual && - grep "^100644 .*sparse_entry\$" actual && + test_grep "^100644 .*sparse_entry\$" actual && git add --sparse --chmod=+x sparse_entry 2>stderr && test_must_be_empty stderr && git ls-files --stage >actual && - grep "^100755 .*sparse_entry\$" actual && + test_grep "^100755 .*sparse_entry\$" actual && git reset && # This will print a message over stderr on Windows. git add --sparse --renormalize sparse_entry && git status --porcelain >actual && - grep "^M sparse_entry\$" actual + test_grep "^M sparse_entry\$" actual ' test_expect_success 'add obeys advice.updateSparsePath' ' diff --git a/t/t3800-mktag.sh b/t/t3800-mktag.sh index e3cf0ffbe59c44..d3ddf076c48458 100755 --- a/t/t3800-mktag.sh +++ b/t/t3800-mktag.sh @@ -535,9 +535,9 @@ test_expect_success 'invalid header entry config & fsck' ' git fsck && git -c fsck.extraHeaderEntry=warn fsck 2>err && - grep "warning .*extraHeaderEntry:" err && + test_grep "warning .*extraHeaderEntry:" err && test_must_fail git -c fsck.extraHeaderEntry=error 2>err fsck && - grep "error .* extraHeaderEntry:" err + test_grep "error .* extraHeaderEntry:" err ' cat >tag.sig <out-l1 && git format-patch --stdout HEAD^ >out-l2 && - grep "^Content-Type: text/plain; charset=ISO8859-1" out-l1 && - grep "^From: =?ISO8859-1?q?=C1=E9=ED=20=F3=FA?=" out-l1 && - grep "^Content-Type: text/plain; charset=ISO8859-1" out-l2 && - grep "^From: =?ISO8859-1?q?=C1=E9=ED=20=F3=FA?=" out-l2 + test_grep "^Content-Type: text/plain; charset=ISO8859-1" out-l1 && + test_grep "^From: =?ISO8859-1?q?=C1=E9=ED=20=F3=FA?=" out-l1 && + test_grep "^Content-Type: text/plain; charset=ISO8859-1" out-l2 && + test_grep "^From: =?ISO8859-1?q?=C1=E9=ED=20=F3=FA?=" out-l2 ' test_expect_success 'format-patch output (UTF-8)' ' @@ -92,10 +92,10 @@ test_expect_success 'format-patch output (UTF-8)' ' git format-patch --stdout main..HEAD^ >out-u1 && git format-patch --stdout HEAD^ >out-u2 && - grep "^Content-Type: text/plain; charset=UTF-8" out-u1 && - grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD=20=C3=B3=C3=BA?=" out-u1 && - grep "^Content-Type: text/plain; charset=UTF-8" out-u2 && - grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD=20=C3=B3=C3=BA?=" out-u2 + test_grep "^Content-Type: text/plain; charset=UTF-8" out-u1 && + test_grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD=20=C3=B3=C3=BA?=" out-u1 && + test_grep "^Content-Type: text/plain; charset=UTF-8" out-u2 && + test_grep "^From: =?UTF-8?q?=C3=81=C3=A9=C3=AD=20=C3=B3=C3=BA?=" out-u2 ' test_expect_success 'rebase (U/U)' ' diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index ecc35aae82a5fe..53328b84755511 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -20,21 +20,21 @@ test_expect_success 'setup' ' test_expect_success 'usage on cmd and subcommand invalid option' ' test_expect_code 129 git stash --invalid-option 2>usage && - grep "or: git stash" usage && + test_grep "or: git stash" usage && test_expect_code 129 git stash push --invalid-option 2>usage && - ! grep "or: git stash" usage + test_grep ! "or: git stash" usage ' test_expect_success 'usage on main command -h emits a summary of subcommands' ' test_expect_code 129 git stash -h >usage && - grep -F "usage: git stash list" usage && - grep -F "or: git stash show" usage + test_grep -F "usage: git stash list" usage && + test_grep -F "or: git stash show" usage ' test_expect_success 'usage for subcommands should emit subcommand usage' ' test_expect_code 129 git stash push -h >usage && - grep -F "usage: git stash [push" usage + test_grep -F "usage: git stash [push" usage ' diff_cmp () { @@ -965,7 +965,7 @@ test_expect_success 'store updates stash ref and reflog' ' test $(git rev-parse stash) = $STASH_ID && git reflog --format=%H stash| grep $STASH_ID && git stash pop && - grep quux bazzy + test_grep quux bazzy ' test_expect_success 'handle stash specification with spaces' ' @@ -977,7 +977,7 @@ test_expect_success 'handle stash specification with spaces' ' echo cow >file && git stash && git stash apply "stash@{$stamp}" && - grep pig file + test_grep pig file ' test_expect_success 'setup stash with index and worktree changes' ' @@ -1500,9 +1500,9 @@ test_expect_success 'stash export can accept specified stashes' ' test_expect_success 'stash export rejects invalid arguments' ' test_must_fail git stash export --print --to-ref refs/heads/invalid 2>err && - grep "exactly one of --print and --to-ref is required" err && + test_grep "exactly one of --print and --to-ref is required" err && test_must_fail git stash export 2>err2 && - grep "exactly one of --print and --to-ref is required" err2 + test_grep "exactly one of --print and --to-ref is required" err2 ' test_expect_success 'stash can import and export zero stashes' ' @@ -1519,7 +1519,7 @@ test_expect_success 'stash rejects invalid attempts to import commits' ' git stash import foo && test_must_fail git stash import HEAD 2>output && oid=$(git rev-parse HEAD) && - grep "$oid is not a valid exported stash commit" output && + test_grep "$oid is not a valid exported stash commit" output && test_cmp_rev stash@{0} t-stash0 && git checkout --orphan orphan && @@ -1527,7 +1527,7 @@ test_expect_success 'stash rejects invalid attempts to import commits' ' git update-ref refs/heads/orphan "$(cat fake-commit)" && oid=$(git rev-parse HEAD) && test_must_fail git stash import orphan 2>output && - grep "found stash commit $oid without expected prefix" output && + test_grep "found stash commit $oid without expected prefix" output && test_cmp_rev stash@{0} t-stash0 && git checkout --orphan orphan2 && @@ -1535,7 +1535,7 @@ test_expect_success 'stash rejects invalid attempts to import commits' ' git update-ref refs/heads/orphan2 "$(cat fake-commit)" && oid=$(git rev-parse HEAD) && test_must_fail git stash import orphan2 2>output && - grep "found root commit $oid with invalid data" output && + test_grep "found root commit $oid with invalid data" output && test_cmp_rev stash@{0} t-stash0 ' @@ -1741,7 +1741,7 @@ test_expect_success 'submodules does not affect the branch recorded in stash mes git stash push -m "custom stash for work_branch" && git stash list >../actual_stash_list.txt && - grep "On work_branch: custom stash for work_branch" ../actual_stash_list.txt + test_grep "On work_branch: custom stash for work_branch" ../actual_stash_list.txt ) ' @@ -1751,7 +1751,7 @@ test_expect_success SANITIZE_LEAK 'stash show handles -- without leaking' ' test_expect_success 'controlled error return on unrecognized option' ' test_expect_code 129 git stash show -p --invalid 2>usage && - grep -e "^usage: git stash show" usage + test_grep -e "^usage: git stash show" usage ' test_expect_success 'stash.index=true implies --index' ' diff --git a/t/t3904-stash-patch.sh b/t/t3904-stash-patch.sh index 90a4ff2c102cef..adc45c7073c777 100755 --- a/t/t3904-stash-patch.sh +++ b/t/t3904-stash-patch.sh @@ -103,8 +103,8 @@ test_expect_success 'stash -p with split hunk' ' printf "%s\n" s n y q | git stash -p 2>error && test_must_be_empty error && - grep "added line 1" test && - ! grep "added line 2" test + test_grep "added line 1" test && + test_grep ! "added line 2" test ' test_expect_success 'stash -p not confused by GIT_PAGER_IN_USE' ' diff --git a/t/t3908-stash-in-worktree.sh b/t/t3908-stash-in-worktree.sh index 2b2b366ef94b7c..e7ae838bb21eee 100755 --- a/t/t3908-stash-in-worktree.sh +++ b/t/t3908-stash-in-worktree.sh @@ -21,7 +21,7 @@ test_expect_success 'apply in subdirectory' ' git stash && git stash apply >out ) && - grep "\.\.\/initial\.t" wt/subdir/out + test_grep "\.\.\/initial\.t" wt/subdir/out ' test_done diff --git a/t/t4000-diff-format.sh b/t/t4000-diff-format.sh index 32b14e3a714b0b..bc46c2a2a9b6d3 100755 --- a/t/t4000-diff-format.sh +++ b/t/t4000-diff-format.sh @@ -84,7 +84,7 @@ test_expect_success 'git diff-files --no-patch --patch shows the patch' ' test_expect_success 'git diff-files --no-patch --patch-with-raw shows the patch and raw data' ' git diff-files --no-patch --patch-with-raw >actual && - grep -q "^:100644 100755 .* $ZERO_OID M path0\$" actual && + test_grep "^:100644 100755 .* $ZERO_OID M path0\$" actual && tail -n +4 actual >actual-patch && compare_diff_patch expected actual-patch ' diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh index 4f520d600de495..ad474100affa0b 100755 --- a/t/t4001-diff-rename.sh +++ b/t/t4001-diff-rename.sh @@ -189,7 +189,7 @@ test_expect_success 'setup for many rename source candidates' ' M path1 EOF test_cmp expect actual.munged && - grep warning actual.err + test_grep warning actual.err ' test_expect_success 'rename pretty print with nothing in common' ' @@ -258,7 +258,7 @@ test_expect_success 'diff-tree -l0 defaults to a big rename limit, not zero' ' git diff-tree -M -l0 HEAD HEAD^ >actual && # Verify that a rename from myotherfile to myfile was detected - grep "myotherfile.*myfile" actual + test_grep "myotherfile.*myfile" actual ' test_expect_success 'basename similarity vs best similarity' ' diff --git a/t/t4011-diff-symlink.sh b/t/t4011-diff-symlink.sh index ac837b6c9ecd7b..4103bd69890692 100755 --- a/t/t4011-diff-symlink.sh +++ b/t/t4011-diff-symlink.sh @@ -140,7 +140,7 @@ test_expect_success SYMLINKS 'diff symlinks with non-existing targets' ' ln -s narf pinky && ln -s take\ over brain && test_must_fail git diff --no-index pinky brain >output 2>output.err && - grep narf output && + test_grep narf output && test_must_be_empty output.err ' diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh index d35695f5b0bcf2..b7a382c88130ec 100755 --- a/t/t4013-diff-various.sh +++ b/t/t4013-diff-various.sh @@ -778,7 +778,7 @@ test_expect_success 'diff.{src,dst}Prefix ignored with --default-prefix' ' test_expect_success 'diff --no-renames cannot be abbreviated' ' test_expect_code 129 git diff --no-rename >actual 2>error && test_must_be_empty actual && - grep "invalid option: --no-rename" error + test_grep "invalid option: --no-rename" error ' test_done diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 0b89d127b5a95d..4afcd8577937e9 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -119,17 +119,17 @@ test_expect_success 'format-patch --ignore-if-in-upstream result applies' ' test_expect_success 'commit did not screw up the log message' ' git cat-file commit side >actual && - grep "^Side .* with .* backslash-n" actual + test_grep "^Side .* with .* backslash-n" actual ' test_expect_success 'format-patch did not screw up the log message' ' - grep "^Subject: .*Side changes #3 with .* backslash-n" patch0 && - grep "^Subject: .*Side changes #3 with .* backslash-n" patch1 + test_grep "^Subject: .*Side changes #3 with .* backslash-n" patch0 && + test_grep "^Subject: .*Side changes #3 with .* backslash-n" patch1 ' test_expect_success 'replay did not screw up the log message' ' git cat-file commit rebuild-1 >actual && - grep "^Side .* with .* backslash-n" actual + test_grep "^Side .* with .* backslash-n" actual ' test_expect_success 'format-patch empty commit' ' @@ -145,8 +145,8 @@ test_expect_success 'extra headers' ' " && git format-patch --stdout main..side >patch2 && sed -e "/^\$/q" patch2 >hdrs2 && - grep "^To: R E Cipient \$" hdrs2 && - grep "^Cc: S E Cipient \$" hdrs2 + test_grep "^To: R E Cipient \$" hdrs2 && + test_grep "^Cc: S E Cipient \$" hdrs2 ' test_expect_success 'extra headers without newlines' ' @@ -154,8 +154,8 @@ test_expect_success 'extra headers without newlines' ' git config --add format.headers "Cc: S E Cipient " && git format-patch --stdout main..side >patch3 && sed -e "/^\$/q" patch3 >hdrs3 && - grep "^To: R E Cipient \$" hdrs3 && - grep "^Cc: S E Cipient \$" hdrs3 + test_grep "^To: R E Cipient \$" hdrs3 && + test_grep "^Cc: S E Cipient \$" hdrs3 ' test_expect_success 'extra headers with multiple To:s' ' @@ -163,79 +163,79 @@ test_expect_success 'extra headers with multiple To:s' ' git config --add format.headers "To: S E Cipient " && git format-patch --stdout main..side >patch4 && sed -e "/^\$/q" patch4 >hdrs4 && - grep "^To: R E Cipient ,\$" hdrs4 && - grep "^ *S E Cipient \$" hdrs4 + test_grep "^To: R E Cipient ,\$" hdrs4 && + test_grep "^ *S E Cipient \$" hdrs4 ' test_expect_success 'additional command line cc (ascii)' ' git config --replace-all format.headers "Cc: R E Cipient " && git format-patch --cc="S E Cipient " --stdout main..side >patch5 && sed -e "/^\$/q" patch5 >hdrs5 && - grep "^Cc: R E Cipient ,\$" hdrs5 && - grep "^ *S E Cipient \$" hdrs5 + test_grep "^Cc: R E Cipient ,\$" hdrs5 && + test_grep "^ *S E Cipient \$" hdrs5 ' test_expect_failure 'additional command line cc (rfc822)' ' git config --replace-all format.headers "Cc: R E Cipient " && git format-patch --cc="S. E. Cipient " --stdout main..side >patch5 && sed -e "/^\$/q" patch5 >hdrs5 && - grep "^Cc: R E Cipient ,\$" hdrs5 && - grep "^ *\"S. E. Cipient\" \$" hdrs5 + test_grep "^Cc: R E Cipient ,\$" hdrs5 && + test_grep "^ *\"S. E. Cipient\" \$" hdrs5 ' test_expect_success 'command line headers' ' git config --unset-all format.headers && git format-patch --add-header="Cc: R E Cipient " --stdout main..side >patch6 && sed -e "/^\$/q" patch6 >hdrs6 && - grep "^Cc: R E Cipient \$" hdrs6 + test_grep "^Cc: R E Cipient \$" hdrs6 ' test_expect_success 'configuration headers and command line headers' ' git config --replace-all format.headers "Cc: R E Cipient " && git format-patch --add-header="Cc: S E Cipient " --stdout main..side >patch7 && sed -e "/^\$/q" patch7 >hdrs7 && - grep "^Cc: R E Cipient ,\$" hdrs7 && - grep "^ *S E Cipient \$" hdrs7 + test_grep "^Cc: R E Cipient ,\$" hdrs7 && + test_grep "^ *S E Cipient \$" hdrs7 ' test_expect_success 'command line To: header (ascii)' ' git config --unset-all format.headers && git format-patch --to="R E Cipient " --stdout main..side >patch8 && sed -e "/^\$/q" patch8 >hdrs8 && - grep "^To: R E Cipient \$" hdrs8 + test_grep "^To: R E Cipient \$" hdrs8 ' test_expect_failure 'command line To: header (rfc822)' ' git format-patch --to="R. E. Cipient " --stdout main..side >patch8 && sed -e "/^\$/q" patch8 >hdrs8 && - grep "^To: \"R. E. Cipient\" \$" hdrs8 + test_grep "^To: \"R. E. Cipient\" \$" hdrs8 ' test_expect_failure 'command line To: header (rfc2047)' ' git format-patch --to="R Ä Cipient " --stdout main..side >patch8 && sed -e "/^\$/q" patch8 >hdrs8 && - grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= \$" hdrs8 + test_grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= \$" hdrs8 ' test_expect_success 'configuration To: header (ascii)' ' git config format.to "R E Cipient " && git format-patch --stdout main..side >patch9 && sed -e "/^\$/q" patch9 >hdrs9 && - grep "^To: R E Cipient \$" hdrs9 + test_grep "^To: R E Cipient \$" hdrs9 ' test_expect_failure 'configuration To: header (rfc822)' ' git config format.to "R. E. Cipient " && git format-patch --stdout main..side >patch9 && sed -e "/^\$/q" patch9 >hdrs9 && - grep "^To: \"R. E. Cipient\" \$" hdrs9 + test_grep "^To: \"R. E. Cipient\" \$" hdrs9 ' test_expect_failure 'configuration To: header (rfc2047)' ' git config format.to "R Ä Cipient " && git format-patch --stdout main..side >patch9 && sed -e "/^\$/q" patch9 >hdrs9 && - grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= \$" hdrs9 + test_grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= \$" hdrs9 ' # check_patch : Verify that looks like a half-sane @@ -250,35 +250,35 @@ test_expect_success 'format.from=false' ' git -c format.from=false format-patch --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch patch && - ! grep "^From: C O Mitter \$" hdrs + test_grep ! "^From: C O Mitter \$" hdrs ' test_expect_success 'format.from=true' ' git -c format.from=true format-patch --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch hdrs && - grep "^From: C O Mitter \$" hdrs + test_grep "^From: C O Mitter \$" hdrs ' test_expect_success 'format.from with address' ' git -c format.from="F R Om " format-patch --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch hdrs && - grep "^From: F R Om \$" hdrs + test_grep "^From: F R Om \$" hdrs ' test_expect_success '--no-from overrides format.from' ' git -c format.from="F R Om " format-patch --no-from --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch hdrs && - ! grep "^From: F R Om \$" hdrs + test_grep ! "^From: F R Om \$" hdrs ' test_expect_success '--from overrides format.from' ' git -c format.from="F R Om " format-patch --from --stdout main..side >patch && sed -e "/^\$/q" patch >hdrs && check_patch hdrs && - ! grep "^From: F R Om \$" hdrs + test_grep ! "^From: F R Om \$" hdrs ' test_expect_success '--no-to overrides config.to' ' @@ -287,7 +287,7 @@ test_expect_success '--no-to overrides config.to' ' git format-patch --no-to --stdout main..side >patch10 && sed -e "/^\$/q" patch10 >hdrs10 && check_patch hdrs10 && - ! grep "^To: R E Cipient \$" hdrs10 + test_grep ! "^To: R E Cipient \$" hdrs10 ' test_expect_success '--no-to and --to replaces config.to' ' @@ -297,8 +297,8 @@ test_expect_success '--no-to and --to replaces config.to' ' --stdout main..side >patch11 && sed -e "/^\$/q" patch11 >hdrs11 && check_patch hdrs11 && - ! grep "^To: Someone \$" hdrs11 && - grep "^To: Someone Else \$" hdrs11 + test_grep ! "^To: Someone \$" hdrs11 && + test_grep "^To: Someone Else \$" hdrs11 ' test_expect_success '--no-cc overrides config.cc' ' @@ -307,7 +307,7 @@ test_expect_success '--no-cc overrides config.cc' ' git format-patch --no-cc --stdout main..side >patch12 && sed -e "/^\$/q" patch12 >hdrs12 && check_patch hdrs12 && - ! grep "^Cc: C E Cipient \$" hdrs12 + test_grep ! "^Cc: C E Cipient \$" hdrs12 ' test_expect_success '--no-add-header overrides config.headers' ' @@ -316,7 +316,7 @@ test_expect_success '--no-add-header overrides config.headers' ' git format-patch --no-add-header --stdout main..side >patch13 && sed -e "/^\$/q" patch13 >hdrs13 && check_patch hdrs13 && - ! grep "^Header1: B E Cipient \$" hdrs13 + test_grep ! "^Header1: B E Cipient \$" hdrs13 ' test_expect_success 'multiple files' ' @@ -508,41 +508,41 @@ test_expect_success 'cover letter config commitlistformat not set' ' test_expect_success 'reroll count' ' rm -fr patches && git format-patch -o patches --cover-letter --reroll-count 4 main..side >list && - ! grep -v "^patches/v4-000[0-3]-" list && + test_grep ! -v "^patches/v4-000[0-3]-" list && sed -n -e "/^Subject: /p" $(cat list) >subjects && - ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects + test_grep ! -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects ' test_expect_success 'reroll count (-v)' ' rm -fr patches && git format-patch -o patches --cover-letter -v4 main..side >list && - ! grep -v "^patches/v4-000[0-3]-" list && + test_grep ! -v "^patches/v4-000[0-3]-" list && sed -n -e "/^Subject: /p" $(cat list) >subjects && - ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects + test_grep ! -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects ' test_expect_success 'reroll count (-v) with a fractional number' ' rm -fr patches && git format-patch -o patches --cover-letter -v4.4 main..side >list && - ! grep -v "^patches/v4.4-000[0-3]-" list && + test_grep ! -v "^patches/v4.4-000[0-3]-" list && sed -n -e "/^Subject: /p" $(cat list) >subjects && - ! grep -v "^Subject: \[PATCH v4.4 [0-3]/3\] " subjects + test_grep ! -v "^Subject: \[PATCH v4.4 [0-3]/3\] " subjects ' test_expect_success 'reroll (-v) count with a non number' ' rm -fr patches && git format-patch -o patches --cover-letter -v4rev2 main..side >list && - ! grep -v "^patches/v4rev2-000[0-3]-" list && + test_grep ! -v "^patches/v4rev2-000[0-3]-" list && sed -n -e "/^Subject: /p" $(cat list) >subjects && - ! grep -v "^Subject: \[PATCH v4rev2 [0-3]/3\] " subjects + test_grep ! -v "^Subject: \[PATCH v4rev2 [0-3]/3\] " subjects ' test_expect_success 'reroll (-v) count with a non-pathname character' ' rm -fr patches && git format-patch -o patches --cover-letter -v4---..././../--1/.2// main..side >list && - ! grep -v "patches/v4-\.-\.-\.-1-\.2-000[0-3]-" list && + test_grep ! -v "patches/v4-\.-\.-\.-1-\.2-000[0-3]-" list && sed -n -e "/^Subject: /p" $(cat list) >subjects && - ! grep -v "^Subject: \[PATCH v4---\.\.\./\./\.\./--1/\.2// [0-3]/3\] " subjects + test_grep ! -v "^Subject: \[PATCH v4---\.\.\./\./\.\./--1/\.2// [0-3]/3\] " subjects ' check_threading () { @@ -813,9 +813,9 @@ test_expect_success 'cover-letter inherits diff options' ' git commit -m foo && git format-patch --no-renames --cover-letter -1 && check_patch 0000-cover-letter.patch && - ! grep "file => foo .* 0 *\$" 0000-cover-letter.patch && + test_grep ! "file => foo .* 0 *\$" 0000-cover-letter.patch && git format-patch --cover-letter -1 -M && - grep "file => foo .* 0 *\$" 0000-cover-letter.patch + test_grep "file => foo .* 0 *\$" 0000-cover-letter.patch ' cat >expect <patch8 && - grep "^In-Reply-To: " patch8 && - grep "^References: " patch8 + test_grep "^In-Reply-To: " patch8 && + test_grep "^References: " patch8 ' test_expect_success 'format-patch --signoff' ' git format-patch -1 --signoff --stdout >out && - grep "^Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" out + test_grep "^Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" out ' test_expect_success 'format-patch --notes --signoff' ' @@ -949,27 +949,27 @@ test_expect_success 'format-patch notes output control' ' git notes add -m "notes config message" HEAD && git format-patch -1 --stdout >out && - ! grep "notes config message" out && + test_grep ! "notes config message" out && git format-patch -1 --stdout --notes >out && - grep "notes config message" out && + test_grep "notes config message" out && git format-patch -1 --stdout --no-notes >out && - ! grep "notes config message" out && + test_grep ! "notes config message" out && git format-patch -1 --stdout --notes --no-notes >out && - ! grep "notes config message" out && + test_grep ! "notes config message" out && git format-patch -1 --stdout --no-notes --notes >out && - grep "notes config message" out && + test_grep "notes config message" out && test_config format.notes true && git format-patch -1 --stdout >out && - grep "notes config message" out && + test_grep "notes config message" out && git format-patch -1 --stdout --notes >out && - grep "notes config message" out && + test_grep "notes config message" out && git format-patch -1 --stdout --no-notes >out && - ! grep "notes config message" out && + test_grep ! "notes config message" out && git format-patch -1 --stdout --notes --no-notes >out && - ! grep "notes config message" out && + test_grep ! "notes config message" out && git format-patch -1 --stdout --no-notes --notes >out && - grep "notes config message" out + test_grep "notes config message" out ' test_expect_success 'format-patch with multiple notes refs' ' @@ -979,39 +979,39 @@ test_expect_success 'format-patch with multiple notes refs' ' git notes --ref note2 add -m "this is note 2" HEAD && git format-patch -1 --stdout >out && - ! grep "this is note 1" out && - ! grep "this is note 2" out && + test_grep ! "this is note 1" out && + test_grep ! "this is note 2" out && git format-patch -1 --stdout --notes=note1 >out && - grep "this is note 1" out && - ! grep "this is note 2" out && + test_grep "this is note 1" out && + test_grep ! "this is note 2" out && git format-patch -1 --stdout --notes=note2 >out && - ! grep "this is note 1" out && - grep "this is note 2" out && + test_grep ! "this is note 1" out && + test_grep "this is note 2" out && git format-patch -1 --stdout --notes=note1 --notes=note2 >out && - grep "this is note 1" out && - grep "this is note 2" out && + test_grep "this is note 1" out && + test_grep "this is note 2" out && test_config format.notes note1 && git format-patch -1 --stdout >out && - grep "this is note 1" out && - ! grep "this is note 2" out && + test_grep "this is note 1" out && + test_grep ! "this is note 2" out && git format-patch -1 --stdout --no-notes >out && - ! grep "this is note 1" out && - ! grep "this is note 2" out && + test_grep ! "this is note 1" out && + test_grep ! "this is note 2" out && git format-patch -1 --stdout --notes=note2 >out && - grep "this is note 1" out && - grep "this is note 2" out && + test_grep "this is note 1" out && + test_grep "this is note 2" out && git format-patch -1 --stdout --no-notes --notes=note2 >out && - ! grep "this is note 1" out && - grep "this is note 2" out && + test_grep ! "this is note 1" out && + test_grep "this is note 2" out && git config --add format.notes note2 && git format-patch -1 --stdout >out && - grep "this is note 1" out && - grep "this is note 2" out && + test_grep "this is note 1" out && + test_grep "this is note 2" out && git format-patch -1 --stdout --no-notes >out && - ! grep "this is note 1" out && - ! grep "this is note 2" out + test_grep ! "this is note 1" out && + test_grep ! "this is note 2" out ' test_expect_success 'format-patch with multiple notes refs in config' ' @@ -1024,26 +1024,26 @@ test_expect_success 'format-patch with multiple notes refs in config' ' git config format.notes note1 && git format-patch -1 --stdout >out && - grep "this is note 1" out && - ! grep "this is note 2" out && + test_grep "this is note 1" out && + test_grep ! "this is note 2" out && git config format.notes note2 && git format-patch -1 --stdout >out && - ! grep "this is note 1" out && - grep "this is note 2" out && + test_grep ! "this is note 1" out && + test_grep "this is note 2" out && git config --add format.notes note1 && git format-patch -1 --stdout >out && - grep "this is note 1" out && - grep "this is note 2" out && + test_grep "this is note 1" out && + test_grep "this is note 2" out && git config --replace-all format.notes note1 && git config --add format.notes false && git format-patch -1 --stdout >out && - ! grep "this is note 1" out && - ! grep "this is note 2" out && + test_grep ! "this is note 1" out && + test_grep ! "this is note 2" out && git config --add format.notes note2 && git format-patch -1 --stdout >out && - ! grep "this is note 1" out && - grep "this is note 2" out + test_grep ! "this is note 1" out && + test_grep "this is note 2" out ' echo "fatal: --name-only does not make sense" >expect.name-only @@ -1095,7 +1095,7 @@ test_expect_success 'format-patch -- ' ' git format-patch main..pathspec -- file_a >output && test_cmp expect output && - ! grep file_b *.patch + test_grep ! file_b *.patch ' test_expect_success 'format-patch --ignore-if-in-upstream HEAD' ' @@ -1129,14 +1129,14 @@ test_expect_success 'format-patch --signature' ' test_expect_success 'format-patch with format.signature config' ' git config format.signature "config sig" && git format-patch --stdout -1 >output && - grep "config sig" output + test_grep "config sig" output ' test_expect_success 'format-patch --signature overrides format.signature' ' git config format.signature "config sig" && git format-patch --stdout --signature="overrides" -1 >output && - ! grep "config sig" output && - grep "overrides" output + test_grep ! "config sig" output && + test_grep "overrides" output ' test_expect_success 'format-patch --no-signature ignores format.signature' ' @@ -1144,9 +1144,9 @@ test_expect_success 'format-patch --no-signature ignores format.signature' ' git format-patch --stdout --signature="my sig" --no-signature \ -1 >output && check_patch output && - ! grep "config sig" output && - ! grep "my sig" output && - ! grep "^-- \$" output + test_grep ! "config sig" output && + test_grep ! "my sig" output && + test_grep ! "^-- \$" output ' test_expect_success 'format-patch --signature --cover-letter' ' @@ -1161,20 +1161,20 @@ test_expect_success 'format.signature="" suppresses signatures' ' git config format.signature "" && git format-patch --stdout -1 >output && check_patch output && - ! grep "^-- \$" output + test_grep ! "^-- \$" output ' test_expect_success 'format-patch --no-signature suppresses signatures' ' git config --unset-all format.signature && git format-patch --stdout --no-signature -1 >output && check_patch output && - ! grep "^-- \$" output + test_grep ! "^-- \$" output ' test_expect_success 'format-patch --signature="" suppresses signatures' ' git format-patch --stdout --signature="" -1 >output && check_patch output && - ! grep "^-- \$" output + test_grep ! "^-- \$" output ' test_expect_success 'prepare mail-signature input' ' @@ -1213,7 +1213,7 @@ test_expect_success '--no-signature suppresses format.signaturefile ' ' test_config format.signaturefile mail-signature && git format-patch --stdout --no-signature -1 >output && check_patch output && - ! grep "^-- \$" output + test_grep ! "^-- \$" output ' test_expect_success '--signature-file overrides format.signaturefile' ' @@ -1235,7 +1235,7 @@ test_expect_success '--signature overrides format.signaturefile' ' test_config format.signaturefile mail-signature && git format-patch --stdout --signature="my sig" -1 >output && check_patch output && - grep "my sig" output + test_grep "my sig" output ' test_expect_success TTY 'format-patch --stdout paginates' ' @@ -2001,10 +2001,10 @@ body" && test_config format.coverFromDescription default && git checkout rebuild-1 && git format-patch --stdout --cover-letter main >actual && - grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - grep "^config subject$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep "^config subject$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with --cover-from-description default' ' @@ -2013,10 +2013,10 @@ test_expect_success 'cover letter with --cover-from-description default' ' body" && git checkout rebuild-1 && git format-patch --stdout --cover-letter --cover-from-description default main >actual && - grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - grep "^config subject$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep "^config subject$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with format.coverFromDescription = none' ' @@ -2026,10 +2026,10 @@ body" && test_config format.coverFromDescription none && git checkout rebuild-1 && git format-patch --stdout --cover-letter main >actual && - grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && - grep "^\*\*\* BLURB HERE \*\*\*$" actual && - ! grep "^config subject$" actual && - ! grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + test_grep "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep ! "^config subject$" actual && + test_grep ! "^body$" actual ' test_expect_success 'cover letter with --cover-from-description none' ' @@ -2038,10 +2038,10 @@ test_expect_success 'cover letter with --cover-from-description none' ' body" && git checkout rebuild-1 && git format-patch --stdout --cover-letter --cover-from-description none main >actual && - grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && - grep "^\*\*\* BLURB HERE \*\*\*$" actual && - ! grep "^config subject$" actual && - ! grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + test_grep "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep ! "^config subject$" actual && + test_grep ! "^body$" actual ' test_expect_success 'cover letter with format.coverFromDescription = message' ' @@ -2051,10 +2051,10 @@ body" && test_config format.coverFromDescription message && git checkout rebuild-1 && git format-patch --stdout --cover-letter main >actual && - grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - grep "^config subject$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep "^config subject$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with --cover-from-description message' ' @@ -2063,10 +2063,10 @@ test_expect_success 'cover letter with --cover-from-description message' ' body" && git checkout rebuild-1 && git format-patch --stdout --cover-letter --cover-from-description message main >actual && - grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - grep "^config subject$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep "^config subject$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with format.coverFromDescription = subject' ' @@ -2076,10 +2076,10 @@ body" && test_config format.coverFromDescription subject && git checkout rebuild-1 && git format-patch --stdout --cover-letter main >actual && - grep "^Subject: \[PATCH 0/2\] config subject$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - ! grep "^config subject$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] config subject$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep ! "^config subject$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with --cover-from-description subject' ' @@ -2088,10 +2088,10 @@ test_expect_success 'cover letter with --cover-from-description subject' ' body" && git checkout rebuild-1 && git format-patch --stdout --cover-letter --cover-from-description subject main >actual && - grep "^Subject: \[PATCH 0/2\] config subject$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - ! grep "^config subject$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] config subject$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep ! "^config subject$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with --cover-from-description subject (UTF-8 subject line)' ' @@ -2100,8 +2100,8 @@ test_expect_success 'cover letter with --cover-from-description subject (UTF-8 s body" && git checkout rebuild-1 && git format-patch --stdout --cover-letter --cover-from-description subject --encode-email-headers main >actual && - grep "^Subject: \[PATCH 0/2\] =?UTF-8?q?Caf=C3=A9=3F?=$" actual && - ! grep "Café" actual + test_grep "^Subject: \[PATCH 0/2\] =?UTF-8?q?Caf=C3=A9=3F?=$" actual && + test_grep ! "Café" actual ' test_expect_success 'cover letter with format.coverFromDescription = auto (short subject line)' ' @@ -2111,10 +2111,10 @@ body" && test_config format.coverFromDescription auto && git checkout rebuild-1 && git format-patch --stdout --cover-letter main >actual && - grep "^Subject: \[PATCH 0/2\] config subject$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - ! grep "^config subject$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] config subject$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep ! "^config subject$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with --cover-from-description auto (short subject line)' ' @@ -2123,10 +2123,10 @@ test_expect_success 'cover letter with --cover-from-description auto (short subj body" && git checkout rebuild-1 && git format-patch --stdout --cover-letter --cover-from-description auto main >actual && - grep "^Subject: \[PATCH 0/2\] config subject$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - ! grep "^config subject$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] config subject$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep ! "^config subject$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with format.coverFromDescription = auto (long subject line)' ' @@ -2136,10 +2136,10 @@ body" && test_config format.coverFromDescription auto && git checkout rebuild-1 && git format-patch --stdout --cover-letter main >actual && - grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with --cover-from-description auto (long subject line)' ' @@ -2148,10 +2148,10 @@ test_expect_success 'cover letter with --cover-from-description auto (long subje body" && git checkout rebuild-1 && git format-patch --stdout --cover-letter --cover-from-description auto main >actual && - grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter with command-line --cover-from-description overrides config' ' @@ -2161,52 +2161,52 @@ body" && test_config format.coverFromDescription none && git checkout rebuild-1 && git format-patch --stdout --cover-letter --cover-from-description subject main >actual && - grep "^Subject: \[PATCH 0/2\] config subject$" actual && - ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && - ! grep "^config subject$" actual && - grep "^body$" actual + test_grep "^Subject: \[PATCH 0/2\] config subject$" actual && + test_grep ! "^\*\*\* BLURB HERE \*\*\*$" actual && + test_grep ! "^config subject$" actual && + test_grep "^body$" actual ' test_expect_success 'cover letter using branch description (1)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && git format-patch --stdout --cover-letter main >actual && - grep hello actual + test_grep hello actual ' test_expect_success 'cover letter using branch description (2)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && git format-patch --stdout --cover-letter rebuild-1~2..rebuild-1 >actual && - grep hello actual + test_grep hello actual ' test_expect_success 'cover letter using branch description (3)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && git format-patch --stdout --cover-letter ^main rebuild-1 >actual && - grep hello actual + test_grep hello actual ' test_expect_success 'cover letter using branch description (4)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && git format-patch --stdout --cover-letter main.. >actual && - grep hello actual + test_grep hello actual ' test_expect_success 'cover letter using branch description (5)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && git format-patch --stdout --cover-letter -2 HEAD >actual && - grep hello actual + test_grep hello actual ' test_expect_success 'cover letter using branch description (6)' ' git checkout rebuild-1 && test_config branch.rebuild-1.description hello && git format-patch --stdout --cover-letter -2 >actual && - grep hello actual + test_grep hello actual ' test_expect_success 'cover letter with --description-file' ' @@ -2219,8 +2219,8 @@ test_expect_success 'cover letter with --description-file' ' git checkout rebuild-1 && git format-patch --stdout --cover-letter --cover-from-description auto \ --description-file description.txt main >actual && - grep "^Subject: \[PATCH 0/2\] subject from file$" actual && - grep "^body from file$" actual + test_grep "^Subject: \[PATCH 0/2\] subject from file$" actual && + test_grep "^body from file$" actual ' test_expect_success 'cover letter with nothing' ' @@ -2467,7 +2467,7 @@ test_expect_success 'format-patch errors out when history involves criss-cross' test_expect_success 'format-patch format.useAutoBase whenAble history involves criss-cross' ' test_config format.useAutoBase whenAble && git format-patch -1 >patch && - ! grep "^base-commit:" patch + test_grep ! "^base-commit:" patch ' test_expect_success 'format-patch format.useAutoBase option' ' @@ -2502,13 +2502,13 @@ test_expect_success 'format-patch --base overrides format.useAutoBase' ' test_expect_success 'format-patch --no-base overrides format.useAutoBase' ' test_config format.useAutoBase true && git format-patch --stdout --no-base -1 >patch && - ! grep "^base-commit:" patch + test_grep ! "^base-commit:" patch ' test_expect_success 'format-patch --no-base overrides format.useAutoBase whenAble' ' test_config format.useAutoBase whenAble && git format-patch --stdout --no-base -1 >patch && - ! grep "^base-commit:" patch + test_grep ! "^base-commit:" patch ' test_expect_success 'format-patch --base with --attach' ' @@ -2521,7 +2521,7 @@ test_expect_success 'format-patch --base with --attach' ' test_expect_success 'format-patch --attach cover-letter only is non-multipart' ' test_when_finished "rm -fr patches" && git format-patch -o patches --cover-letter --attach=mimemime --base=HEAD~ -1 && - ! grep -E "^--+mimemime" patches/0000*.patch && + test_grep ! -E "^--+mimemime" patches/0000*.patch && grep -E "^--+mimemime$" patches/0001*.patch >output && test_line_count = 2 output && grep -E "^--+mimemime--$" patches/0001*.patch >output && @@ -2533,7 +2533,7 @@ test_expect_success 'format-patch with format.attach' ' separator=attachment-separator && test_config format.attach "$separator" && filename=$(git format-patch -o patches -1) && - grep "^Content-Type: multipart/.*$separator" "$filename" + test_grep "^Content-Type: multipart/.*$separator" "$filename" ' test_expect_success 'format-patch with format.attach=disabled' ' @@ -2543,7 +2543,7 @@ test_expect_success 'format-patch with format.attach=disabled' ' test_config format.attach "" && filename=$(git format-patch -o patches -1) && # The output should not even declare content type for text/plain. - ! grep "^Content-Type: multipart/" "$filename" + test_grep ! "^Content-Type: multipart/" "$filename" ' test_expect_success '-c format.mboxrd format-patch' ' @@ -2674,23 +2674,23 @@ test_expect_success 'interdiff: explicit --no-cover-letter defeats implied --cov test_expect_success 'format-patch does not respect diff.noprefix' ' git -c diff.noprefix format-patch -1 --stdout >actual && - grep "^--- a/blorp" actual + test_grep "^--- a/blorp" actual ' test_expect_success 'format-patch respects format.noprefix' ' git -c format.noprefix format-patch -1 --stdout >actual && - grep "^--- blorp" actual + test_grep "^--- blorp" actual ' test_expect_success 'format.noprefix=false' ' git -c format.noprefix=false format-patch -1 --stdout >actual && - grep "^--- a/blorp" actual + test_grep "^--- a/blorp" actual ' test_expect_success 'format-patch --default-prefix overrides format.noprefix' ' git -c format.noprefix \ format-patch -1 --default-prefix --stdout >actual && - grep "^--- a/blorp" actual + test_grep "^--- a/blorp" actual ' test_expect_success 'errors on format.noprefix which is not boolean' ' diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh index b691d2947943c8..6e7ba8abf682b3 100755 --- a/t/t4015-diff-whitespace.sh +++ b/t/t4015-diff-whitespace.sh @@ -638,14 +638,14 @@ test_expect_success 'check mixed spaces and tabs in indent' ' # This is indented with SP HT SP. echo " foo();" >x && test_must_fail git diff --check >check && - grep "space before tab in indent" check + test_grep "space before tab in indent" check ' test_expect_success 'check mixed tabs and spaces in indent' ' # This is indented with HT SP HT. echo " foo();" >x && test_must_fail git diff --check >check && - grep "space before tab in indent" check + test_grep "space before tab in indent" check ' test_expect_success 'check with no whitespace errors' ' @@ -891,14 +891,14 @@ test_expect_success 'line numbers in --check output are correct' ' echo "" >x && echo "foo(); " >>x && test_must_fail git diff --check >check && - grep "x:2:" check + test_grep "x:2:" check ' test_expect_success 'checkdiff detects new trailing blank lines (1)' ' echo "foo();" >x && echo "" >>x && test_must_fail git diff --check >check && - grep "new blank line" check + test_grep "new blank line" check ' test_expect_success 'checkdiff detects new trailing blank lines (2)' ' @@ -906,7 +906,7 @@ test_expect_success 'checkdiff detects new trailing blank lines (2)' ' git add x && test_write_lines a "" "" "" "" >x && test_must_fail git diff --check >check && - grep "new blank line" check + test_grep "new blank line" check ' test_expect_success 'checkdiff allows new blank lines' ' @@ -1018,7 +1018,7 @@ test_expect_success 'combined diff with autocrlf conversion' ' git diff >actual.raw && sed -e "1,/^@@@/d" actual.raw >actual && - ! grep "^-" actual + test_grep ! "^-" actual ' @@ -2166,8 +2166,8 @@ test_expect_success 'move detection with submodules' ' # no move detection as the moved line is across repository boundaries. test_decode_color decoded_actual && - ! grep BGREEN decoded_actual && - ! grep BRED decoded_actual && + test_grep ! BGREEN decoded_actual && + test_grep ! BRED decoded_actual && # nor did we mess with it another way git diff --submodule=diff --color >expect.raw && diff --git a/t/t4017-diff-retval.sh b/t/t4017-diff-retval.sh index c2863c99b71fac..5ec6f5c612e004 100755 --- a/t/t4017-diff-retval.sh +++ b/t/t4017-diff-retval.sh @@ -139,7 +139,7 @@ test_expect_success 'check honors conflict marker length' ' test_expect_success 'option errors are not confused by --exit-code' ' test_must_fail git diff --exit-code --nonsense 2>err && - grep '^usage:' err + test_grep '^usage:' err ' for option in --exit-code --quiet diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh index e026fac1f40903..b538b715f5a54f 100755 --- a/t/t4018-diff-funcname.sh +++ b/t/t4018-diff-funcname.sh @@ -115,7 +115,7 @@ for i in $(git ls-files) do test_expect_success "hunk header: $i" " git diff -U1 $i >actual && - grep '@@ .* @@.*RIGHT' actual + test_grep '@@ .* @@.*RIGHT' actual " done diff --git a/t/t4019-diff-wserror.sh b/t/t4019-diff-wserror.sh index 4001dacee39193..939ec8a0b4a198 100755 --- a/t/t4019-diff-wserror.sh +++ b/t/t4019-diff-wserror.sh @@ -251,8 +251,8 @@ test_expect_success 'trailing empty lines (1)' ' rm -f .gitattributes && test_must_fail git diff --check >output && - grep "new blank line at" output && - grep "trailing whitespace" output + test_grep "new blank line at" output && + test_grep "trailing whitespace" output ' @@ -280,8 +280,8 @@ test_expect_success 'do not color trailing cr in context' ' git add G && echo BBBQ | tr Q "\015" >>G && git diff --color G | tr "\015" Q >output && - grep "BBB.*${blue_grep}Q" output && - grep "AAA.*\[mQ" output + test_grep "BBB.*${blue_grep}Q" output && + test_grep "AAA.*\[mQ" output ' diff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh index 7ec5854f74d651..93d37230c61e19 100755 --- a/t/t4020-diff-external.sh +++ b/t/t4020-diff-external.sh @@ -34,13 +34,13 @@ test_expect_success 'GIT_EXTERNAL_DIFF environment' ' test_expect_success 'GIT_EXTERNAL_DIFF environment should apply only to diff' ' GIT_EXTERNAL_DIFF=echo git log -p -1 HEAD >out && - grep "^diff --git a/file b/file" out + test_grep "^diff --git a/file b/file" out ' test_expect_success 'GIT_EXTERNAL_DIFF environment and --no-ext-diff' ' GIT_EXTERNAL_DIFF=echo git diff --no-ext-diff >out && - grep "^diff --git a/file b/file" out + test_grep "^diff --git a/file b/file" out ' @@ -86,13 +86,13 @@ test_expect_success 'diff.external' ' test_expect_success 'diff.external should apply only to diff' ' test_config diff.external echo && git log -p -1 HEAD >out && - grep "^diff --git a/file b/file" out + test_grep "^diff --git a/file b/file" out ' test_expect_success 'diff.external and --no-ext-diff' ' test_config diff.external echo && git diff --no-ext-diff >out && - grep "^diff --git a/file b/file" out + test_grep "^diff --git a/file b/file" out ' test_expect_success 'diff attribute' ' @@ -113,13 +113,13 @@ test_expect_success 'diff attribute' ' test_expect_success 'diff attribute should apply only to diff' ' git log -p -1 HEAD >out && - grep "^diff --git a/file b/file" out + test_grep "^diff --git a/file b/file" out ' test_expect_success 'diff attribute and --no-ext-diff' ' git diff --no-ext-diff >out && - grep "^diff --git a/file b/file" out + test_grep "^diff --git a/file b/file" out ' @@ -140,13 +140,13 @@ test_expect_success 'diff attribute' ' test_expect_success 'diff attribute should apply only to diff' ' git log -p -1 HEAD >out && - grep "^diff --git a/file b/file" out + test_grep "^diff --git a/file b/file" out ' test_expect_success 'diff attribute and --no-ext-diff' ' git diff --no-ext-diff >out && - grep "^diff --git a/file b/file" out + test_grep "^diff --git a/file b/file" out ' @@ -178,7 +178,7 @@ test_expect_success 'attributes trump GIT_EXTERNAL_DIFF and diff.external' ' test_expect_success 'no diff with -diff' ' echo >.gitattributes "file -diff" && git diff >out && - grep Binary out + test_grep Binary out ' check_external_diff () { diff --git a/t/t4021-format-patch-numbered.sh b/t/t4021-format-patch-numbered.sh index 9be65fd4440a68..204851f061b22c 100755 --- a/t/t4021-format-patch-numbered.sh +++ b/t/t4021-format-patch-numbered.sh @@ -94,7 +94,7 @@ test_expect_success 'format.numbered && --no-numbered' ' test_expect_success 'format.numbered && --keep-subject' ' git format-patch --keep-subject --stdout HEAD^ >patch4a && - grep "^Subject: Third" patch4a + test_grep "^Subject: Third" patch4a ' @@ -123,7 +123,7 @@ test_expect_success 'format.numbered = auto && --no-numbered' ' test_expect_success '--start-number && --numbered' ' git format-patch --start-number 3 --numbered --stdout HEAD~1 > patch8 && - grep "^Subject: \[PATCH 3/3\]" patch8 + test_grep "^Subject: \[PATCH 3/3\]" patch8 ' test_expect_success 'single patch with cover-letter defaults to numbers' ' diff --git a/t/t4022-diff-rewrite.sh b/t/t4022-diff-rewrite.sh index 6fed993ea0b34d..b5c1b6868f93ee 100755 --- a/t/t4022-diff-rewrite.sh +++ b/t/t4022-diff-rewrite.sh @@ -58,13 +58,13 @@ test_expect_success 'suppress deletion diff with -D' ' test_expect_success 'show deletion diff with -B' ' git diff -B -- test >actual && - grep "Linus Torvalds" actual + test_grep "Linus Torvalds" actual ' test_expect_success 'suppress deletion diff with -B -D' ' git diff -B -D -- test >actual && - grep -v "Linus Torvalds" actual + test_grep -v "Linus Torvalds" actual ' test_expect_success 'prepare a file that ends with an incomplete line' ' @@ -82,19 +82,19 @@ test_expect_success 'rewrite the middle 90% of sequence file and terminate with test_expect_success 'confirm that sequence file is considered a rewrite' ' git diff -B seq >res && - grep "dissimilarity index" res + test_grep "dissimilarity index" res ' test_expect_success 'no newline at eof is on its own line without -B' ' git diff seq >res && - grep "^\\\\ " res && - ! grep "^..*\\\\ " res + test_grep "^\\\\ " res && + test_grep ! "^..*\\\\ " res ' test_expect_success 'no newline at eof is on its own line with -B' ' git diff -B seq >res && - grep "^\\\\ " res && - ! grep "^..*\\\\ " res + test_grep "^\\\\ " res && + test_grep ! "^..*\\\\ " res ' test_done diff --git a/t/t4028-format-patch-mime-headers.sh b/t/t4028-format-patch-mime-headers.sh index a06a7479260fa9..39344cf761c646 100755 --- a/t/t4028-format-patch-mime-headers.sh +++ b/t/t4028-format-patch-mime-headers.sh @@ -17,15 +17,15 @@ test_expect_success 'create commit with utf-8 body' ' test_expect_success 'patch has mime headers' ' rm -f 0001-two.patch && git format-patch HEAD^ && - grep -i "content-type: text/plain; charset=utf-8" 0001-two.patch + test_grep -i "content-type: text/plain; charset=utf-8" 0001-two.patch ' test_expect_success 'patch has mime and extra headers' ' rm -f 0001-two.patch && git config format.headers "x-foo: bar" && git format-patch HEAD^ && - grep -i "x-foo: bar" 0001-two.patch && - grep -i "content-type: text/plain; charset=utf-8" 0001-two.patch + test_grep -i "x-foo: bar" 0001-two.patch && + test_grep -i "content-type: text/plain; charset=utf-8" 0001-two.patch ' test_done diff --git a/t/t4031-diff-rewrite-binary.sh b/t/t4031-diff-rewrite-binary.sh index 15e012ccc7c02e..5b31ca02fe7431 100755 --- a/t/t4031-diff-rewrite-binary.sh +++ b/t/t4031-diff-rewrite-binary.sh @@ -29,32 +29,32 @@ test_expect_success 'create binary file with changes' ' test_expect_success 'vanilla diff is binary' ' git diff >diff && - grep "Binary files a/file and b/file differ" diff + test_grep "Binary files a/file and b/file differ" diff ' test_expect_success 'rewrite diff is binary' ' git diff -B >diff && - grep "dissimilarity index" diff && - grep "Binary files a/file and b/file differ" diff + test_grep "dissimilarity index" diff && + test_grep "Binary files a/file and b/file differ" diff ' test_expect_success 'rewrite diff can show binary patch' ' git diff -B --binary >diff && - grep "dissimilarity index" diff && - grep "GIT binary patch" diff + test_grep "dissimilarity index" diff && + test_grep "GIT binary patch" diff ' test_expect_success 'rewrite diff --numstat shows binary changes' ' git diff -B --numstat --summary >diff && - grep -e "- - " diff && - grep " rewrite file" diff + test_grep -e "- - " diff && + test_grep " rewrite file" diff ' test_expect_success 'diff --stat counts binary rewrite as 0 lines' ' git diff -B --stat --summary >diff && - grep "Bin" diff && + test_grep "Bin" diff && test_grep "0 insertions.*0 deletions" diff && - grep " rewrite file" diff + test_grep " rewrite file" diff ' test_expect_success 'setup textconv' ' diff --git a/t/t4033-diff-patience.sh b/t/t4033-diff-patience.sh index 113304dc596034..8002c0f434cf2c 100755 --- a/t/t4033-diff-patience.sh +++ b/t/t4033-diff-patience.sh @@ -10,7 +10,7 @@ test_expect_success '--ignore-space-at-eol with a single appended character' ' printf "a\nbX\nc\n" >post && test_must_fail git diff --no-index \ --patience --ignore-space-at-eol pre post >diff && - grep "^+.*X" diff + test_grep "^+.*X" diff ' test_diff_frobnitz "patience" diff --git a/t/t4036-format-patch-signer-mime.sh b/t/t4036-format-patch-signer-mime.sh index 98d9713d8b2454..f57d3dc9fbdc9f 100755 --- a/t/t4036-format-patch-signer-mime.sh +++ b/t/t4036-format-patch-signer-mime.sh @@ -19,14 +19,14 @@ test_expect_success setup ' test_expect_success 'format normally' ' git format-patch --stdout -1 >output && - ! grep Content-Type output + test_grep ! Content-Type output ' test_expect_success 'format with signoff without funny signer name' ' git format-patch -s --stdout -1 >output && - ! grep Content-Type output + test_grep ! Content-Type output ' @@ -34,7 +34,7 @@ test_expect_success 'format with non ASCII signer name' ' GIT_COMMITTER_NAME="はまの ふにおう" \ git format-patch -s --stdout -1 >output && - grep Content-Type output + test_grep Content-Type output ' diff --git a/t/t4038-diff-combined.sh b/t/t4038-diff-combined.sh index 2ce26e585c98c1..e11b7113886821 100755 --- a/t/t4038-diff-combined.sh +++ b/t/t4038-diff-combined.sh @@ -100,7 +100,7 @@ test_expect_success 'diagnose truncated file' ' git add file && git commit --amend -C HEAD && git show >out && - grep "diff --cc file" out + test_grep "diff --cc file" out ' test_expect_success 'setup for --cc --raw' ' @@ -118,13 +118,13 @@ test_expect_success 'check --cc --raw with four trees' ' four_trees=$(echo "$trees" | sed -e 4q) && git diff --cc --raw $four_trees $base_tree >out && # Check for four leading colons in the output: - grep "^::::[^:]" out + test_grep "^::::[^:]" out ' test_expect_success 'check --cc --raw with forty trees' ' git diff --cc --raw $trees $base_tree >out && # Check for forty leading colons in the output: - grep "^::::::::::::::::::::::::::::::::::::::::[^:]" out + test_grep "^::::::::::::::::::::::::::::::::::::::::[^:]" out ' test_expect_success 'setup combined ignore spaces' ' diff --git a/t/t4051-diff-function-context.sh b/t/t4051-diff-function-context.sh index 4838a1df8b4369..117eaede8ab299 100755 --- a/t/t4051-diff-function-context.sh +++ b/t/t4051-diff-function-context.sh @@ -86,15 +86,15 @@ test_expect_success 'setup' ' check_diff changed_hello 'changed function' test_expect_success ' context includes comment' ' - grep "^ .*Hello comment" changed_hello.diff + test_grep "^ .*Hello comment" changed_hello.diff ' test_expect_success ' context includes begin' ' - grep "^ .*Begin of hello" changed_hello.diff + test_grep "^ .*Begin of hello" changed_hello.diff ' test_expect_success ' context includes end' ' - grep "^ .*End of hello" changed_hello.diff + test_grep "^ .*End of hello" changed_hello.diff ' test_expect_success ' context does not include other functions' ' @@ -112,11 +112,11 @@ test_expect_success ' context does not include trailing empty lines' ' check_diff changed_includes 'changed includes' test_expect_success ' context includes begin' ' - grep "^ .*Begin.h" changed_includes.diff + test_grep "^ .*Begin.h" changed_includes.diff ' test_expect_success ' context includes end' ' - grep "^ .*End.h" changed_includes.diff + test_grep "^ .*End.h" changed_includes.diff ' test_expect_success ' context does not include other functions' ' @@ -130,11 +130,11 @@ test_expect_success ' context does not include trailing empty lines' ' check_diff appended 'appended function' test_expect_success ' context includes begin' ' - grep "^[+].*Begin of first part" appended.diff + test_grep "^[+].*Begin of first part" appended.diff ' test_expect_success ' context includes end' ' - grep "^[+].*End of first part" appended.diff + test_grep "^[+].*End of first part" appended.diff ' test_expect_success ' context does not include other functions' ' @@ -144,11 +144,11 @@ test_expect_success ' context does not include other functions' ' check_diff extended 'appended function part' test_expect_success ' context includes begin' ' - grep "^ .*Begin of first part" extended.diff + test_grep "^ .*Begin of first part" extended.diff ' test_expect_success ' context includes end' ' - grep "^[+].*End of second part" extended.diff + test_grep "^[+].*End of second part" extended.diff ' test_expect_success ' context does not include other functions' ' @@ -162,11 +162,11 @@ test_expect_success ' context does not include preceding empty lines' ' check_diff long_common_tail 'change with long common tail and no context' -U0 test_expect_success ' context includes begin' ' - grep "^ .*Begin of first part" long_common_tail.diff + test_grep "^ .*Begin of first part" long_common_tail.diff ' test_expect_success ' context includes end' ' - grep "^ .*End of second part" long_common_tail.diff + test_grep "^ .*End of second part" long_common_tail.diff ' test_expect_success ' context does not include other functions' ' @@ -180,13 +180,13 @@ test_expect_success ' context does not include preceding empty lines' ' check_diff changed_hello_appended 'changed function plus appended function' test_expect_success ' context includes begin' ' - grep "^ .*Begin of hello" changed_hello_appended.diff && - grep "^[+].*Begin of first part" changed_hello_appended.diff + test_grep "^ .*Begin of hello" changed_hello_appended.diff && + test_grep "^[+].*Begin of first part" changed_hello_appended.diff ' test_expect_success ' context includes end' ' - grep "^ .*End of hello" changed_hello_appended.diff && - grep "^[+].*End of first part" changed_hello_appended.diff + test_grep "^ .*End of hello" changed_hello_appended.diff && + test_grep "^[+].*End of first part" changed_hello_appended.diff ' test_expect_success ' context does not include other functions' ' @@ -196,13 +196,13 @@ test_expect_success ' context does not include other functions' ' check_diff changed_hello_dummy 'changed two consecutive functions' test_expect_success ' context includes begin' ' - grep "^ .*Begin of hello" changed_hello_dummy.diff && - grep "^ .*Begin of dummy" changed_hello_dummy.diff + test_grep "^ .*Begin of hello" changed_hello_dummy.diff && + test_grep "^ .*Begin of dummy" changed_hello_dummy.diff ' test_expect_success ' context includes end' ' - grep "^ .*End of hello" changed_hello_dummy.diff && - grep "^ .*End of dummy" changed_hello_dummy.diff + test_grep "^ .*End of hello" changed_hello_dummy.diff && + test_grep "^ .*End of dummy" changed_hello_dummy.diff ' test_expect_success ' overlapping hunks are merged' ' diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh index 15076dfe0dcb07..8e0394cf5afd95 100755 --- a/t/t4053-diff-no-index.sh +++ b/t/t4053-diff-no-index.sh @@ -283,14 +283,14 @@ test_expect_success "diff --no-index -R treats '-' as stdin" ' test_expect_success 'diff --no-index refuses to diff stdin and a directory' ' test_must_fail git diff --no-index -- - a err && - grep "fatal: cannot compare stdin to a directory" err + test_grep "fatal: cannot compare stdin to a directory" err ' test_expect_success PIPE 'diff --no-index refuses to diff a named pipe and a directory' ' test_when_finished "rm -f pipe" && mkfifo pipe && test_must_fail git diff --no-index -- pipe a 2>err && - grep "fatal: cannot compare a named pipe to a directory" err + test_grep "fatal: cannot compare a named pipe to a directory" err ' test_expect_success PIPE,SYMLINKS 'diff --no-index reads from pipes' ' diff --git a/t/t4063-diff-blobs.sh b/t/t4063-diff-blobs.sh index 50fdb5ea529234..1318cceb19a48a 100755 --- a/t/t4063-diff-blobs.sh +++ b/t/t4063-diff-blobs.sh @@ -47,7 +47,7 @@ test_expect_success 'sha1 diff uses arguments as paths' ' check_paths $sha1_one $sha1_two ' test_expect_success 'sha1 diff has no mode change' ' - ! grep mode diff + test_grep ! mode diff ' test_expect_success 'diff by tree:path (run)' ' diff --git a/t/t4065-diff-anchored.sh b/t/t4065-diff-anchored.sh index b3f510f040ec3b..9f06ac65be3a36 100755 --- a/t/t4065-diff-anchored.sh +++ b/t/t4065-diff-anchored.sh @@ -10,11 +10,11 @@ test_expect_success '--anchored' ' # normally, c is moved to produce the smallest diff test_expect_code 1 git diff --no-index pre post >diff && - grep "^+c" diff && + test_grep "^+c" diff && # with anchor, a is moved test_expect_code 1 git diff --no-index --anchored=c pre post >diff && - grep "^+a" diff + test_grep "^+a" diff ' test_expect_success '--anchored multiple' ' @@ -23,13 +23,13 @@ test_expect_success '--anchored multiple' ' # with 1 anchor, c is not moved, but f is moved test_expect_code 1 git diff --no-index --anchored=c pre post >diff && - grep "^+a" diff && # a is moved instead of c - grep "^+f" diff && + test_grep "^+a" diff && # a is moved instead of c + test_grep "^+f" diff && # with 2 anchors, c and f are not moved test_expect_code 1 git diff --no-index --anchored=c --anchored=f pre post >diff && - grep "^+a" diff && - grep "^+d" diff # d is moved instead of f + test_grep "^+a" diff && + test_grep "^+d" diff # d is moved instead of f ' test_expect_success '--anchored with nonexistent line has no effect' ' @@ -37,7 +37,7 @@ test_expect_success '--anchored with nonexistent line has no effect' ' printf "c\na\nb\n" >post && test_expect_code 1 git diff --no-index --anchored=x pre post >diff && - grep "^+c" diff + test_grep "^+c" diff ' test_expect_success '--anchored with non-unique line has no effect' ' @@ -45,7 +45,7 @@ test_expect_success '--anchored with non-unique line has no effect' ' printf "c\na\nb\nc\nd\ne\n" >post && test_expect_code 1 git diff --no-index --anchored=c pre post >diff && - grep "^+c" diff + test_grep "^+c" diff ' test_expect_success 'diff still produced with impossible multiple --anchored' ' @@ -66,16 +66,16 @@ test_expect_success 'later algorithm arguments override earlier ones' ' printf "c\na\nb\n" >post && test_expect_code 1 git diff --no-index --patience --anchored=c pre post >diff && - grep "^+a" diff && + test_grep "^+a" diff && test_expect_code 1 git diff --no-index --anchored=c --patience pre post >diff && - grep "^+c" diff && + test_grep "^+c" diff && test_expect_code 1 git diff --no-index --histogram --anchored=c pre post >diff && - grep "^+a" diff && + test_grep "^+a" diff && test_expect_code 1 git diff --no-index --anchored=c --histogram pre post >diff && - grep "^+c" diff + test_grep "^+c" diff ' test_expect_success '--anchored works with other commands like "git show"' ' @@ -88,7 +88,7 @@ test_expect_success '--anchored works with other commands like "git show"' ' # with anchor, a is moved git show --patience --anchored=c >diff && - grep "^+a" diff + test_grep "^+a" diff ' test_done diff --git a/t/t4067-diff-partial-clone.sh b/t/t4067-diff-partial-clone.sh index 30813109ac044e..142abdf74ac16d 100755 --- a/t/t4067-diff-partial-clone.sh +++ b/t/t4067-diff-partial-clone.sh @@ -70,9 +70,9 @@ test_expect_success 'diff skips same-OID blobs' ' # Ensure that only a and another-a are fetched. GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD && - grep "want $(cat hash-old-a)" trace && - grep "want $(cat hash-new-a)" trace && - ! grep "want $(cat hash-b)" trace + test_grep "want $(cat hash-old-a)" trace && + test_grep "want $(cat hash-new-a)" trace && + test_grep ! "want $(cat hash-b)" trace ' test_expect_success 'when fetching missing objects, diff skips GITLINKs' ' @@ -103,8 +103,8 @@ test_expect_success 'when fetching missing objects, diff skips GITLINKs' ' # Ensure that a and another-a are fetched, and check (by successful # execution of the diff) that no invalid OIDs are sent. GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD && - grep "want $(cat hash-old-a)" trace && - grep "want $(cat hash-new-a)" trace + test_grep "want $(cat hash-old-a)" trace && + test_grep "want $(cat hash-new-a)" trace ' test_expect_success 'diff with rename detection batches blobs' ' @@ -127,7 +127,7 @@ test_expect_success 'diff with rename detection batches blobs' ' # Ensure that there is exactly 1 negotiation by checking that there is # only 1 "done" line sent. ("done" marks the end of negotiation.) GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff --raw -M HEAD^ HEAD >out && - grep ":100644 100644.*R[0-9][0-9][0-9].*b.*c" out && + test_grep ":100644 100644.*R[0-9][0-9][0-9].*b.*c" out && grep "fetch> done" trace >done_lines && test_line_count = 1 done_lines ' diff --git a/t/t4073-diff-stat-name-width.sh b/t/t4073-diff-stat-name-width.sh index ec5d3c3c1ffc9d..241242064538df 100755 --- a/t/t4073-diff-stat-name-width.sh +++ b/t/t4073-diff-stat-name-width.sh @@ -21,41 +21,41 @@ test_expect_success 'setup' ' test_expect_success 'test name-width long enough for filepath' ' git diff HEAD~1 HEAD --stat --stat-name-width=12 >out && - grep "d你好/f再见 |" out && + test_grep "d你好/f再见 |" out && git diff HEAD~1 HEAD --stat --stat-name-width=11 >out && - grep "d你好/f再见 |" out + test_grep "d你好/f再见 |" out ' test_expect_success 'test name-width not long enough for dir name' ' git diff HEAD~1 HEAD --stat --stat-name-width=10 >out && - grep ".../f再见 |" out && + test_grep ".../f再见 |" out && git diff HEAD~1 HEAD --stat --stat-name-width=9 >out && - grep ".../f再见 |" out + test_grep ".../f再见 |" out ' test_expect_success 'test name-width not long enough for slash' ' git diff HEAD~1 HEAD --stat --stat-name-width=8 >out && - grep "...f再见 |" out + test_grep "...f再见 |" out ' test_expect_success 'test name-width not long enough for file name' ' git diff HEAD~1 HEAD --stat --stat-name-width=7 >out && - grep "...再见 |" out && + test_grep "...再见 |" out && git diff HEAD~1 HEAD --stat --stat-name-width=6 >out && - grep "...见 |" out && + test_grep "...见 |" out && git diff HEAD~1 HEAD --stat --stat-name-width=5 >out && - grep "...见 |" out && + test_grep "...见 |" out && git diff HEAD~1 HEAD --stat --stat-name-width=4 >out && - grep "... |" out + test_grep "... |" out ' test_expect_success 'test name-width minimum length' ' git diff HEAD~1 HEAD --stat --stat-name-width=3 >out && - grep "... |" out && + test_grep "... |" out && git diff HEAD~1 HEAD --stat --stat-name-width=2 >out && - grep "... |" out && + test_grep "... |" out && git diff HEAD~1 HEAD --stat --stat-name-width=1 >out && - grep "... |" out + test_grep "... |" out ' test_done diff --git a/t/t4103-apply-binary.sh b/t/t4103-apply-binary.sh index f2d41e06bcdd63..bdd4ccf9e31cbd 100755 --- a/t/t4103-apply-binary.sh +++ b/t/t4103-apply-binary.sh @@ -181,7 +181,7 @@ test_expect_success PERL_TEST_HELPERS 'reject truncated binary diff' ' do_reset && test_must_fail git apply patch.trunc 2>err && line=$(awk "END { print NR + 1 }" patch.trunc) && - grep "error: corrupt binary patch at patch.trunc:$line: " err + test_grep "error: corrupt binary patch at patch.trunc:$line: " err ' test_expect_success 'reject unrecognized binary diff' ' diff --git a/t/t4120-apply-popt.sh b/t/t4120-apply-popt.sh index c960fdf622512f..c7801aec2c3e67 100755 --- a/t/t4120-apply-popt.sh +++ b/t/t4120-apply-popt.sh @@ -18,7 +18,7 @@ test_expect_success setup ' git mv sub süb && echo B >süb/file1 && git diff >patch.escaped && - grep "[\]" patch.escaped && + test_grep "[\]" patch.escaped && rm süb/file1 && rmdir süb ' diff --git a/t/t4124-apply-ws-rule.sh b/t/t4124-apply-ws-rule.sh index 205d86d05edfec..4c487fb5763123 100755 --- a/t/t4124-apply-ws-rule.sh +++ b/t/t4124-apply-ws-rule.sh @@ -222,8 +222,8 @@ test_expect_success 'trailing whitespace & no newline at the end of file' ' >target && create_patch >patch-file && git apply --whitespace=fix patch-file && - grep "newline$" target && - grep "^$" target + test_grep "newline$" target && + test_grep "^$" target ' test_expect_success 'blank at EOF with --whitespace=fix (1)' ' @@ -287,7 +287,7 @@ test_expect_success 'blank at EOF with --whitespace=warn' ' git checkout one && git apply --whitespace=warn patch 2>error && test_cmp expect one && - grep "new blank line at EOF" error + test_grep "new blank line at EOF" error ' test_expect_success 'blank at EOF with --whitespace=error' ' @@ -300,7 +300,7 @@ test_expect_success 'blank at EOF with --whitespace=error' ' git checkout one && test_must_fail git apply --whitespace=error patch 2>error && test_cmp expect one && - grep "new blank line at EOF" error + test_grep "new blank line at EOF" error ' test_expect_success 'blank but not empty at EOF' ' @@ -313,7 +313,7 @@ test_expect_success 'blank but not empty at EOF' ' git checkout one && git apply --whitespace=warn patch 2>error && test_cmp expect one && - grep "new blank line at EOF" error + test_grep "new blank line at EOF" error ' test_expect_success 'applying beyond EOF requires one non-blank context line' ' diff --git a/t/t4128-apply-root.sh b/t/t4128-apply-root.sh index 5eba15fa66b956..c772faea62ea3f 100755 --- a/t/t4128-apply-root.sh +++ b/t/t4128-apply-root.sh @@ -138,7 +138,7 @@ test_expect_success 'apply --directory (delete file)' ' git add some/sub/dir/delfile && git apply --directory=some/sub/dir/ --index patch && git ls-files >out && - ! grep delfile out + test_grep ! delfile out ' cat > patch << 'EOF' diff --git a/t/t4140-apply-ita.sh b/t/t4140-apply-ita.sh index 0b11a8aef4fa12..49ebb51564b667 100755 --- a/t/t4140-apply-ita.sh +++ b/t/t4140-apply-ita.sh @@ -14,11 +14,11 @@ test_expect_success setup ' cat blueprint >test-file && git add -N test-file && git diff >creation-patch && - grep "new file mode 100644" creation-patch && + test_grep "new file mode 100644" creation-patch && rm -f test-file && git diff >deletion-patch && - grep "deleted file mode 100644" deletion-patch && + test_grep "deleted file mode 100644" deletion-patch && git rm -f test-file && test_write_lines 6 >>committed-file && diff --git a/t/t4141-apply-too-large.sh b/t/t4141-apply-too-large.sh index eac6f7e151b562..b114a7adf76995 100755 --- a/t/t4141-apply-too-large.sh +++ b/t/t4141-apply-too-large.sh @@ -16,7 +16,7 @@ test_expect_success EXPENSIVE 'git apply rejects patches that are too large' ' EOF test-tool genzeros } | test_copy_bytes $sz | test_must_fail git apply 2>err && - grep "patch too large" err + test_grep "patch too large" err ' test_done diff --git a/t/t4150-am.sh b/t/t4150-am.sh index 699a81ab5cc6d2..61c3ce90182295 100755 --- a/t/t4150-am.sh +++ b/t/t4150-am.sh @@ -580,7 +580,7 @@ test_expect_success 'am --keep really keeps the subject' ' git am --keep patch4 && test_path_is_missing .git/rebase-apply && git cat-file commit HEAD >actual && - grep "Re: Re: Re: \[PATCH 1/5 v2\] \[foo\] third" actual + test_grep "Re: Re: Re: \[PATCH 1/5 v2\] \[foo\] third" actual ' test_expect_success 'am --keep-non-patch really keeps the non-patch part' ' @@ -590,7 +590,7 @@ test_expect_success 'am --keep-non-patch really keeps the non-patch part' ' git am --keep-non-patch patch4 && test_path_is_missing .git/rebase-apply && git cat-file commit HEAD >actual && - grep "^\[foo\] third" actual + test_grep "^\[foo\] third" actual ' test_expect_success 'setup am -3' ' @@ -642,7 +642,7 @@ test_expect_success 'am with config am.threeWay overridden by --no-3way' ' ' test_expect_success 'am can rename a file' ' - grep "^rename from" rename.patch && + test_grep "^rename from" rename.patch && rm -fr .git/rebase-apply && git reset --hard && git checkout lorem^0 && @@ -653,7 +653,7 @@ test_expect_success 'am can rename a file' ' ' test_expect_success 'am -3 can rename a file' ' - grep "^rename from" rename.patch && + test_grep "^rename from" rename.patch && rm -fr .git/rebase-apply && git reset --hard && git checkout lorem^0 && @@ -664,7 +664,7 @@ test_expect_success 'am -3 can rename a file' ' ' test_expect_success 'am -3 can rename a file after falling back to 3-way merge' ' - grep "^rename from" rename-add.patch && + test_grep "^rename from" rename-add.patch && rm -fr .git/rebase-apply && git reset --hard && git checkout lorem^0 && @@ -884,7 +884,7 @@ test_expect_success 'am --ignore-date' ' git am --ignore-date patch1 && git cat-file commit HEAD | sed -e "/^\$/q" >head1 && sed -ne "/^author /s/.*> //p" head1 >at && - grep "+0000" at + test_grep "+0000" at ' test_expect_success 'am into an unborn branch' ' @@ -1066,7 +1066,7 @@ test_expect_success 'am --patch-format=mboxrd handles mboxrd' ' INPUT_END git commit -F msg && git -c format.mboxrd format-patch --stdout -1 >mboxrd1 && - grep "^>From could trip up a loose mbox parser" mboxrd1 && + test_grep "^>From could trip up a loose mbox parser" mboxrd1 && git checkout -f first && git am --patch-format=mboxrd mboxrd1 && git cat-file commit HEAD | tail -n4 >out && @@ -1144,21 +1144,21 @@ test_expect_success 'am and .gitattibutes' ' git format-patch --stdout main..HEAD >patches && git reset --hard main && git am patches && - grep "smudged" a.txt && + test_grep "smudged" a.txt && git checkout removal && git reset --hard && git format-patch --stdout main..HEAD >patches && git reset --hard main && git am patches && - grep "clean" a.txt && + test_grep "clean" a.txt && git checkout conflict && git reset --hard && git format-patch --stdout main..HEAD >patches && git reset --hard fourth && test_must_fail git am -3 patches && - grep "<<<<<<<<<<" a.txt + test_grep "<<<<<<<<<<" a.txt ) ' @@ -1196,13 +1196,13 @@ test_expect_success 'invalid when passing the --empty option alone' ' test_expect_success 'a message without a patch is an error (default)' ' test_when_finished "git am --abort || :" && test_must_fail git am empty-commit.patch >err && - grep "Patch is empty" err + test_grep "Patch is empty" err ' test_expect_success 'a message without a patch is an error where an explicit "--empty=stop" is given' ' test_when_finished "git am --abort || :" && test_must_fail git am --empty=stop empty-commit.patch >err && - grep "Patch is empty." err + test_grep "Patch is empty." err ' test_expect_success 'a message without a patch will be skipped when "--empty=drop" is given' ' @@ -1210,7 +1210,7 @@ test_expect_success 'a message without a patch will be skipped when "--empty=dro git rev-parse empty-commit^ >expected && git rev-parse HEAD >actual && test_cmp expected actual && - grep "Skipping: empty commit" output + test_grep "Skipping: empty commit" output ' test_expect_success 'record as an empty commit when meeting e-mail message that lacks a patch' ' @@ -1218,15 +1218,15 @@ test_expect_success 'record as an empty commit when meeting e-mail message that test_path_is_missing .git/rebase-apply && git show empty-commit --format="%B" >expected && git show HEAD --format="%B" >actual && - grep -f actual expected && - grep "Creating an empty commit: empty commit" output + test_grep -f actual expected && + test_grep "Creating an empty commit: empty commit" output ' test_expect_success 'skip an empty patch in the middle of an am session' ' git checkout empty-commit^ && test_must_fail git am empty-commit.patch >out 2>err && - grep "Patch is empty." out && - grep "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err && + test_grep "Patch is empty." out && + test_grep "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err && git am --skip && test_path_is_missing .git/rebase-apply && git rev-parse empty-commit^ >expected && @@ -1237,14 +1237,14 @@ test_expect_success 'skip an empty patch in the middle of an am session' ' test_expect_success 'record an empty patch as an empty commit in the middle of an am session' ' git checkout empty-commit^ && test_must_fail git am empty-commit.patch >out 2>err && - grep "Patch is empty." out && - grep "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err && + test_grep "Patch is empty." out && + test_grep "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err && git am --allow-empty >output && - grep "No changes - recorded it as an empty commit." output && + test_grep "No changes - recorded it as an empty commit." output && test_path_is_missing .git/rebase-apply && git show empty-commit --format="%B" >expected && git show HEAD --format="%B" >actual && - grep -f actual expected + test_grep -f actual expected ' test_expect_success 'create an non-empty commit when the index IS changed though "--allow-empty" is given' ' @@ -1255,7 +1255,7 @@ test_expect_success 'create an non-empty commit when the index IS changed though git am --allow-empty && git show empty-commit --format="%B" >expected && git show HEAD --format="%B" >actual && - grep -f actual expected && + test_grep -f actual expected && git diff HEAD^..HEAD --name-only ' @@ -1264,7 +1264,7 @@ test_expect_success 'cannot create empty commits when there is a clean index due git rev-parse HEAD >expected && test_must_fail git am seq.patch && test_must_fail git am --allow-empty >err && - ! grep "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err && + test_grep ! "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err && git rev-parse HEAD >actual && test_cmp actual expected ' @@ -1274,7 +1274,7 @@ test_expect_success 'cannot create empty commits when there is unmerged index du git rev-parse HEAD >expected && test_must_fail git am -3 seq.patch && test_must_fail git am --allow-empty >err && - ! grep "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err && + test_grep ! "To record the empty patch as an empty commit, run \"git am --allow-empty\"." err && git rev-parse HEAD >actual && test_cmp actual expected ' diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh index 1717f407c80d86..5466fb78bc9a8b 100755 --- a/t/t4200-rerere.sh +++ b/t/t4200-rerere.sh @@ -83,7 +83,7 @@ test_expect_success 'activate rerere, old style (conflicting merge)' ' sha1=$(sed "s/ .*//" .git/MERGE_RR) && rr=.git/rr-cache/$sha1 && - grep "^=======\$" $rr/preimage && + test_grep "^=======\$" $rr/preimage && test_path_is_missing $rr/postimage && test_path_is_missing $rr/thisimage ' @@ -96,7 +96,7 @@ test_expect_success 'rerere.enabled works, too' ' sha1=$(sed "s/ .*//" .git/MERGE_RR) && rr=.git/rr-cache/$sha1 && - grep ^=======$ $rr/preimage + test_grep ^=======$ $rr/preimage ' test_expect_success 'set up rr-cache' ' @@ -177,7 +177,7 @@ test_expect_success 'first postimage wins' ' test_must_fail git merge first && # rerere kicked in - ! grep "^=======\$" a1 && + test_grep ! "^=======\$" a1 && test_cmp expect a1 ' diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh index 9f41d56d9a556c..023fbff546b87f 100755 --- a/t/t4201-shortlog.sh +++ b/t/t4201-shortlog.sh @@ -267,7 +267,7 @@ test_expect_success 'shortlog --group= DWIM' ' test_expect_success 'shortlog bogus --group' ' test_must_fail git shortlog --group=bogus HEAD 2>err && - grep "unknown group type" err + test_grep "unknown group type" err ' test_expect_success 'trailer idents are split' ' diff --git a/t/t4202-log.sh b/t/t4202-log.sh index 05cee9e41bb48d..6dc134fa8e653b 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -668,12 +668,12 @@ test_expect_success 'log --graph with merge with log.graphColors' ' test_expect_success 'log --raw --graph -m with merge' ' git log --raw --graph --oneline -m main | head -n 500 >actual && - grep "initial" actual + test_grep "initial" actual ' test_expect_success 'diff-tree --graph' ' git diff-tree --graph main^ | head -n 500 >actual && - grep "one" actual + test_grep "one" actual ' cat > expect <<\EOF @@ -1082,13 +1082,13 @@ test_expect_success 'decorate-refs and simplify-by-decoration without output' ' test_expect_success 'decorate-refs-exclude HEAD' ' git log --decorate=full --oneline \ --decorate-refs-exclude="HEAD" >actual && - ! grep HEAD actual + test_grep ! HEAD actual ' test_expect_success 'decorate-refs focus from default' ' git log --decorate=full --oneline \ --decorate-refs="refs/heads" >actual && - ! grep HEAD actual + test_grep ! HEAD actual ' test_expect_success '--clear-decorations overrides defaults' ' @@ -2055,45 +2055,45 @@ test_expect_success GPGSSH 'log ssh key fingerprint' ' test_expect_success GPG 'log --graph --show-signature' ' git log --graph --show-signature -n1 signed >actual && - grep "^| gpg: Signature made" actual && - grep "^| gpg: Good signature" actual + test_grep "^| gpg: Signature made" actual && + test_grep "^| gpg: Good signature" actual ' test_expect_success GPGSM 'log --graph --show-signature x509' ' git log --graph --show-signature -n1 signed-x509 >actual && - grep "^| gpgsm: Signature made" actual && - grep "^| gpgsm: Good signature" actual + test_grep "^| gpgsm: Signature made" actual && + test_grep "^| gpgsm: Good signature" actual ' test_expect_success GPGSSH 'log --graph --show-signature ssh' ' test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" && git log --graph --show-signature -n1 signed-ssh >actual && - grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual + test_grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual ' test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'log shows failure on expired signature key' ' test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" && git log --graph --show-signature -n1 expired-signed >actual && - ! grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual + test_grep ! "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual ' test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'log shows failure on not yet valid signature key' ' test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" && git log --graph --show-signature -n1 notyetvalid-signed >actual && - ! grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual + test_grep ! "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual ' test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'log show success with commit date and key validity matching' ' test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" && git log --graph --show-signature -n1 timeboxedvalid-signed >actual && - grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual && - ! grep "${GPGSSH_BAD_SIGNATURE}" actual + test_grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual && + test_grep ! "${GPGSSH_BAD_SIGNATURE}" actual ' test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'log shows failure with commit date outside of key validity' ' test_config gpg.ssh.allowedSignersFile "${GPGSSH_ALLOWED_SIGNERS}" && git log --graph --show-signature -n1 timeboxedinvalid-signed >actual && - ! grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual + test_grep ! "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual ' test_expect_success GPG 'log --graph --show-signature for merged tag' ' @@ -2110,9 +2110,9 @@ test_expect_success GPG 'log --graph --show-signature for merged tag' ' git checkout plain && git merge --no-ff -m msg signed_tag && git log --graph --show-signature -n1 plain >actual && - grep "^|\\\ merged tag" actual && - grep "^| | gpg: Signature made" actual && - grep "^| | gpg: Good signature" actual + test_grep "^|\\\ merged tag" actual && + test_grep "^| | gpg: Signature made" actual && + test_grep "^| | gpg: Good signature" actual ' test_expect_success GPG 'log --graph --show-signature for merged tag in shallow clone' ' @@ -2132,7 +2132,7 @@ test_expect_success GPG 'log --graph --show-signature for merged tag in shallow git clone --depth 1 --no-local . shallow && test_when_finished "rm -rf shallow" && git -C shallow log --graph --show-signature -n1 plain-shallow >actual && - grep "tag signed_tag_shallow names a non-parent $hash" actual + test_grep "tag signed_tag_shallow names a non-parent $hash" actual ' test_expect_success GPG 'log --graph --show-signature for merged tag with missing key' ' @@ -2149,9 +2149,9 @@ test_expect_success GPG 'log --graph --show-signature for merged tag with missin git checkout plain-nokey && git merge --no-ff -m msg signed_tag_nokey && GNUPGHOME=. git log --graph --show-signature -n1 plain-nokey >actual && - grep "^|\\\ merged tag" actual && - grep "^| | gpg: Signature made" actual && - grep -E "^| | gpg: Can'"'"'t check signature: (public key not found|No public key)" actual + test_grep "^|\\\ merged tag" actual && + test_grep "^| | gpg: Signature made" actual && + test_grep -E "^| | gpg: Can'"'"'t check signature: (public key not found|No public key)" actual ' test_expect_success GPG 'log --graph --show-signature for merged tag with bad signature' ' @@ -2171,9 +2171,9 @@ test_expect_success GPG 'log --graph --show-signature for merged tag with bad si git checkout plain-bad && git merge --no-ff -m msg "$(cat forged.tag)" && git log --graph --show-signature -n1 plain-bad >actual && - grep "^|\\\ merged tag" actual && - grep "^| | gpg: Signature made" actual && - grep "^| | gpg: BAD signature from" actual + test_grep "^|\\\ merged tag" actual && + test_grep "^| | gpg: Signature made" actual && + test_grep "^| | gpg: BAD signature from" actual ' test_expect_success GPG 'log --show-signature for merged tag with GPG failure' ' @@ -2192,9 +2192,9 @@ test_expect_success GPG 'log --show-signature for merged tag with GPG failure' ' if ! test_have_prereq VALGRIND then TMPDIR="$(pwd)/bogus" git log --show-signature -n1 plain-fail >actual && - grep "^merged tag" actual && - grep "^No signature" actual && - ! grep "^gpg: Signature made" actual + test_grep "^merged tag" actual && + test_grep "^No signature" actual && + test_grep ! "^gpg: Signature made" actual fi ' @@ -2214,9 +2214,9 @@ test_expect_success GPGSM 'log --graph --show-signature for merged tag x509' ' git checkout plain-x509 && git merge --no-ff -m msg signed_tag_x509 && git log --graph --show-signature -n1 plain-x509 >actual && - grep "^|\\\ merged tag" actual && - grep "^| | gpgsm: Signature made" actual && - grep "^| | gpgsm: Good signature" actual + test_grep "^|\\\ merged tag" actual && + test_grep "^| | gpgsm: Signature made" actual && + test_grep "^| | gpgsm: Good signature" actual ' test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 missing key' ' @@ -2235,8 +2235,8 @@ test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 miss git checkout plain-x509-nokey && git merge --no-ff -m msg signed_tag_x509_nokey && GNUPGHOME=. git log --graph --show-signature -n1 plain-x509-nokey >actual && - grep "^|\\\ merged tag" actual && - grep -e "^| | gpgsm: certificate not found" \ + test_grep "^|\\\ merged tag" actual && + test_grep -e "^| | gpgsm: certificate not found" \ -e "^| | gpgsm: failed to find the certificate: Not found" actual ' @@ -2259,35 +2259,35 @@ test_expect_success GPGSM 'log --graph --show-signature for merged tag x509 bad git checkout plain-x509-bad && git merge --no-ff -m msg "$(cat forged.tag)" && git log --graph --show-signature -n1 plain-x509-bad >actual && - grep "^|\\\ merged tag" actual && - grep "^| | gpgsm: Signature made" actual && - grep "^| | gpgsm: invalid signature" actual + test_grep "^|\\\ merged tag" actual && + test_grep "^| | gpgsm: Signature made" actual && + test_grep "^| | gpgsm: invalid signature" actual ' test_expect_success GPG '--no-show-signature overrides --show-signature' ' git log -1 --show-signature --no-show-signature signed >actual && - ! grep "^gpg:" actual + test_grep ! "^gpg:" actual ' test_expect_success GPG 'log.showsignature=true behaves like --show-signature' ' test_config log.showsignature true && git log -1 signed >actual && - grep "gpg: Signature made" actual && - grep "gpg: Good signature" actual + test_grep "gpg: Signature made" actual && + test_grep "gpg: Good signature" actual ' test_expect_success GPG '--no-show-signature overrides log.showsignature=true' ' test_config log.showsignature true && git log -1 --no-show-signature signed >actual && - ! grep "^gpg:" actual + test_grep ! "^gpg:" actual ' test_expect_success GPG '--show-signature overrides log.showsignature=false' ' test_config log.showsignature false && git log -1 --show-signature signed >actual && - grep "gpg: Signature made" actual && - grep "gpg: Good signature" actual + test_grep "gpg: Signature made" actual && + test_grep "gpg: Good signature" actual ' test_expect_success 'log --graph --no-walk is forbidden' ' @@ -2383,7 +2383,7 @@ test_expect_success 'log --decorate does not include things outside filter' ' git log --decorate=full --oneline >actual && # None of the refs are visible: - ! grep /fake actual + test_grep ! /fake actual ' test_expect_success 'log --end-of-options' ' diff --git a/t/t4204-patch-id.sh b/t/t4204-patch-id.sh index 605faea0c7baae..90e661fe98437a 100755 --- a/t/t4204-patch-id.sh +++ b/t/t4204-patch-id.sh @@ -44,7 +44,7 @@ test_expect_success 'setup' ' test_expect_success 'patch-id output is well-formed' ' git log -p -1 >log.output && git patch-id output && - grep "^$OID_REGEX $(git rev-parse HEAD)$" output + test_grep "^$OID_REGEX $(git rev-parse HEAD)$" output ' #calculate patch id. Make sure output is not empty. diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 3865f6abc70caa..4be5c51489ab79 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -535,7 +535,7 @@ test_expect_success 'strbuf_utf8_replace() not producing NUL' ' git log --color --pretty="tformat:%<(10,trunc)%s%>>(10,ltrunc)%C(auto)%d" | test_decode_color | nul_to_q >actual && - ! grep Q actual + test_grep ! Q actual ' # --date=[XXX] and corresponding %a[X] %c[X] format equivalency diff --git a/t/t4209-log-pickaxe.sh b/t/t4209-log-pickaxe.sh index 0e2f80a268ed0d..802597efc793f9 100755 --- a/t/t4209-log-pickaxe.sh +++ b/t/t4209-log-pickaxe.sh @@ -64,21 +64,21 @@ test_expect_success 'usage' ' test_grep "switch.*requires a value" err && test_expect_code 128 git log -Gregex -Sstring 2>err && - grep "cannot be used together" err && + test_grep "cannot be used together" err && test_expect_code 128 git log -Gregex --find-object=HEAD 2>err && - grep "cannot be used together" err && + test_grep "cannot be used together" err && test_expect_code 128 git log -Sstring --find-object=HEAD 2>err && - grep "cannot be used together" err && + test_grep "cannot be used together" err && test_expect_code 128 git log --pickaxe-all --find-object=HEAD 2>err && - grep "cannot be used together" err + test_grep "cannot be used together" err ' test_expect_success 'usage: --pickaxe-regex' ' test_expect_code 128 git log -Gregex --pickaxe-regex 2>err && - grep "cannot be used together" err + test_grep "cannot be used together" err ' test_expect_success 'usage: --no-pickaxe-regex' ' diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh index aaf197d2edc4d8..6cd80a92bb9514 100755 --- a/t/t4211-line-log.sh +++ b/t/t4211-line-log.sh @@ -356,14 +356,14 @@ test_expect_success '-L diff output includes index and new file mode' ' git log -L:func2:file.c --format= >actual && # Output should contain index headers (not present in old code path) - grep "^index $head_blob_old\.\.$head_blob_new 100644" actual && + test_grep "^index $head_blob_old\.\.$head_blob_new 100644" actual && # Root commit should show new file mode and null index - grep "^new file mode 100644" actual && - grep "^index $null_blob\.\.$root_blob$" actual && + test_grep "^new file mode 100644" actual && + test_grep "^index $null_blob\.\.$root_blob$" actual && # Hunk headers should include funcname context - grep "^@@ .* @@ int func1()" actual + test_grep "^@@ .* @@ int func1()" actual ' test_expect_success '-L with --word-diff' ' @@ -396,15 +396,15 @@ test_expect_success '-L with --word-diff' ' test_expect_success '-L with --no-prefix' ' git log -L:func2:file.c --no-prefix --format= >actual && - grep "^diff --git file.c file.c" actual && - grep "^--- file.c" actual && - ! grep "^--- a/" actual + test_grep "^diff --git file.c file.c" actual && + test_grep "^--- file.c" actual && + test_grep ! "^--- a/" actual ' test_expect_success '-L with --full-index' ' git log -L:func2:file.c --full-index --format= >actual && - grep "^index $head_blob_old_full\.\.$head_blob_new_full 100644" actual && - grep "^index $null_blob_full\.\.$root_blob_full$" actual + test_grep "^index $head_blob_old_full\.\.$head_blob_new_full 100644" actual && + test_grep "^index $null_blob_full\.\.$root_blob_full$" actual ' test_expect_success 'setup -L with whitespace change' ' @@ -521,29 +521,29 @@ test_expect_success '-L with --word-diff-regex' ' git log -L:func2:file.c --word-diff \ --word-diff-regex="[a-zA-Z0-9_]+" --format= >actual && # Word-diff markers must be present - grep "{+" actual && - grep "+}" actual && + test_grep "{+" actual && + test_grep "+}" actual && # No line-level +/- markers (word-diff replaces them); # exclude --- header lines from the check - ! grep "^+[^+]" actual && - ! grep "^-[^-]" actual + test_grep ! "^+[^+]" actual && + test_grep ! "^-[^-]" actual ' test_expect_success '-L with --src-prefix and --dst-prefix' ' git checkout parent-oids && git log -L:func2:file.c --src-prefix=old/ --dst-prefix=new/ \ --format= >actual && - grep "^diff --git old/file.c new/file.c" actual && - grep "^--- old/file.c" actual && - grep "^+++ new/file.c" actual && - ! grep "^--- a/" actual + test_grep "^diff --git old/file.c new/file.c" actual && + test_grep "^--- old/file.c" actual && + test_grep "^+++ new/file.c" actual && + test_grep ! "^--- a/" actual ' test_expect_success '-L with --abbrev' ' git checkout parent-oids && git log -L:func2:file.c --abbrev=4 --format= -1 >actual && # 4-char abbreviated hashes on index line - grep "^index [0-9a-f]\{4\}\.\.[0-9a-f]\{4\}" actual + test_grep "^index [0-9a-f]\{4\}\.\.[0-9a-f]\{4\}" actual ' test_expect_success '-L with -b suppresses whitespace-only diff' ' @@ -559,24 +559,24 @@ test_expect_success '-L with --output-indicator-*' ' git log -L:func2:file.c --output-indicator-new=">" \ --output-indicator-old="<" --output-indicator-context="|" \ --format= -1 >actual && - grep "^>" actual && - grep "^<" actual && - grep "^|" actual && + test_grep "^>" actual && + test_grep "^<" actual && + test_grep "^|" actual && # No standard +/-/space content markers; exclude ---/+++ headers - ! grep "^+[^+]" actual && - ! grep "^-[^-]" actual && - ! grep "^ " actual + test_grep ! "^+[^+]" actual && + test_grep ! "^-[^-]" actual && + test_grep ! "^ " actual ' test_expect_success '-L with -R reverses diff' ' git checkout parent-oids && git log -L:func2:file.c -R --format= -1 >actual && - grep "^diff --git b/file.c a/file.c" actual && - grep "^--- b/file.c" actual && - grep "^+++ a/file.c" actual && + test_grep "^diff --git b/file.c a/file.c" actual && + test_grep "^--- b/file.c" actual && + test_grep "^+++ a/file.c" actual && # The modification added "F2 + 2", so reversed it is removed - grep "^-.*F2 + 2" actual && - grep "^+.*return F2;" actual + test_grep "^-.*F2 + 2" actual && + test_grep "^+.*return F2;" actual ' test_expect_success 'setup for color-moved test' ' @@ -602,8 +602,8 @@ test_expect_success '-L with --color-moved' ' --color=always --format= -1 >actual.raw && test_decode_color actual && # Old moved lines: bold magenta; new moved lines: bold cyan - grep "BOLD;MAGENTA" actual && - grep "BOLD;CYAN" actual + test_grep "BOLD;MAGENTA" actual && + test_grep "BOLD;CYAN" actual ' test_expect_success 'setup for no-newline-at-eof tests' ' @@ -623,14 +623,14 @@ test_expect_success 'setup for no-newline-at-eof tests' ' # newline, the "\ No newline at end of file" marker should appear. test_expect_success '-L no-newline-at-eof appears in tracked range' ' git log -L:bot:noeol.c --format= -1 HEAD~1 >actual && - grep "No newline at end of file" actual + test_grep "No newline at end of file" actual ' # When tracking a function that ends before the no-newline content, # the marker should not appear in the output. test_expect_success '-L no-newline-at-eof suppressed outside range' ' git log -L:top:noeol.c --format= >actual && - ! grep "No newline at end of file" actual + test_grep ! "No newline at end of file" actual ' # When a commit removes a no-newline last line and replaces it with @@ -638,7 +638,7 @@ test_expect_success '-L no-newline-at-eof suppressed outside range' ' # old side of the diff). test_expect_success '-L no-newline-at-eof marker with deleted line' ' git log -L:bot:noeol.c --format= -1 >actual && - grep "No newline at end of file" actual + test_grep "No newline at end of file" actual ' test_expect_success 'setup for range boundary deletion test' ' @@ -698,7 +698,7 @@ test_expect_success '-L with -S filters to string-count changes' ' # combined with the -L range walk, this selects commits that # both touch func2 and change the count of "F2 + 2" in the file. test $(grep -c "^diff --git" actual) = 1 && - grep "F2 + 2" actual + test_grep "F2 + 2" actual ' test_expect_success '-L with -G filters to diff-text matches' ' @@ -708,7 +708,7 @@ test_expect_success '-L with -G filters to diff-text matches' ' # combined with -L, this selects commits that both touch func2 # and have "F2 + 2" in their diff. test $(grep -c "^diff --git" actual) = 1 && - grep "F2 + 2" actual + test_grep "F2 + 2" actual ' test_done diff --git a/t/t4216-log-bloom.sh b/t/t4216-log-bloom.sh index 1064990de31413..c66f25b932719e 100755 --- a/t/t4216-log-bloom.sh +++ b/t/t4216-log-bloom.sh @@ -224,10 +224,10 @@ test_expect_success 'persist filter settings' ' GIT_TEST_BLOOM_SETTINGS_NUM_HASHES=9 \ GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY=15 \ git commit-graph write --reachable --changed-paths && - grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15,\"max_changed_paths\":512" trace2.txt && + test_grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15,\"max_changed_paths\":512" trace2.txt && GIT_TRACE2_EVENT="$(pwd)/trace2-auto.txt" \ git commit-graph write --reachable --changed-paths && - grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15,\"max_changed_paths\":512" trace2-auto.txt + test_grep "{\"hash_version\":1,\"num_hashes\":9,\"bits_per_entry\":15,\"max_changed_paths\":512" trace2-auto.txt ' test_max_changed_paths () { @@ -494,7 +494,7 @@ test_expect_success 'ensure Bloom filters with incompatible settings are ignored >expect 2>err && git -C $repo log --oneline --no-decorate -- file >actual 2>err && test_cmp expect actual && - grep "disabling Bloom filters for commit-graph layer .$layer." err + test_grep "disabling Bloom filters for commit-graph layer .$layer." err ' test_expect_success 'merge graph layers with incompatible Bloom settings' ' @@ -503,8 +503,8 @@ test_expect_success 'merge graph layers with incompatible Bloom settings' ' >trace2.txt && GIT_TRACE2_EVENT="$(pwd)/trace2.txt" \ git -C $repo commit-graph write --reachable --changed-paths 2>err && - grep "disabling Bloom filters for commit-graph layer .$layer." err && - grep "{\"hash_version\":1,\"num_hashes\":7,\"bits_per_entry\":10,\"max_changed_paths\":512" trace2.txt && + test_grep "disabling Bloom filters for commit-graph layer .$layer." err && + test_grep "{\"hash_version\":1,\"num_hashes\":7,\"bits_per_entry\":10,\"max_changed_paths\":512" trace2.txt && test_path_is_file $repo/$graph && test_dir_is_empty $repo/$graphdir && @@ -516,7 +516,7 @@ test_expect_success 'merge graph layers with incompatible Bloom settings' ' git -C $repo log --oneline --no-decorate -- file >actual 2>err && test_cmp expect actual && - grep "statistics:{\"filter_not_present\":0," trace.perf && + test_grep "statistics:{\"filter_not_present\":0," trace.perf && test_must_be_empty err ' @@ -554,8 +554,8 @@ test_expect_success 'ensure Bloom filter with incompatible versions are ignored' >trace2.txt && GIT_TRACE2_EVENT="$(pwd)/trace2.txt" \ git -C $repo -c commitGraph.changedPathsVersion=2 commit-graph write --reachable --changed-paths 2>err && - grep "disabling Bloom filters for commit-graph layer .$layer." err && - grep "{\"hash_version\":2,\"num_hashes\":7,\"bits_per_entry\":10,\"max_changed_paths\":512" trace2.txt + test_grep "disabling Bloom filters for commit-graph layer .$layer." err && + test_grep "{\"hash_version\":2,\"num_hashes\":7,\"bits_per_entry\":10,\"max_changed_paths\":512" trace2.txt ' get_first_changed_path_filter () { @@ -776,7 +776,7 @@ test_expect_success PERL_TEST_HELPERS 'Bloom reader notices too-small data chunk test_expect_success PERL_TEST_HELPERS 'Bloom reader notices out-of-bounds filter offsets' ' check_corrupt_graph BIDX 12 FFFFFFFF && # use grep to avoid depending on exact chunk size - grep "warning: ignoring out-of-range offset (4294967295) for changed-path filter at pos 3 of .git/objects/info/commit-graph" err + test_grep "warning: ignoring out-of-range offset (4294967295) for changed-path filter at pos 3 of .git/objects/info/commit-graph" err ' test_expect_success PERL_TEST_HELPERS 'Bloom reader notices too-small index chunk' ' diff --git a/t/t4252-am-options.sh b/t/t4252-am-options.sh index bda8822b3d1eb6..c36c7e90176f55 100755 --- a/t/t4252-am-options.sh +++ b/t/t4252-am-options.sh @@ -20,8 +20,8 @@ test_expect_success 'interrupted am --whitespace=fix' ' git reset --hard initial && test_must_fail git am --whitespace=fix "$tm"/am-test-1-? && git am --skip && - grep 3 file-1 && - grep "^Six$" file-2 + test_grep 3 file-1 && + test_grep "^Six$" file-2 ' test_expect_success 'interrupted am -C1' ' @@ -29,8 +29,8 @@ test_expect_success 'interrupted am -C1' ' git reset --hard initial && test_must_fail git am -C1 "$tm"/am-test-2-? && git am --skip && - grep 3 file-1 && - grep "^Three$" file-2 + test_grep 3 file-1 && + test_grep "^Three$" file-2 ' test_expect_success 'interrupted am -p2' ' @@ -38,8 +38,8 @@ test_expect_success 'interrupted am -p2' ' git reset --hard initial && test_must_fail git am -p2 "$tm"/am-test-3-? && git am --skip && - grep 3 file-1 && - grep "^Three$" file-2 + test_grep 3 file-1 && + test_grep "^Three$" file-2 ' test_expect_success 'interrupted am -C1 -p2' ' @@ -47,8 +47,8 @@ test_expect_success 'interrupted am -C1 -p2' ' git reset --hard initial && test_must_fail git am -p2 -C1 "$tm"/am-test-4-? && git am --skip && - grep 3 file-1 && - grep "^Three$" file-2 + test_grep 3 file-1 && + test_grep "^Three$" file-2 ' test_expect_success 'interrupted am --directory="frotz nitfol"' ' @@ -56,7 +56,7 @@ test_expect_success 'interrupted am --directory="frotz nitfol"' ' git reset --hard initial && test_must_fail git am --directory="frotz nitfol" "$tm"/am-test-5-? && git am --skip && - grep One "frotz nitfol/file-5" + test_grep One "frotz nitfol/file-5" ' test_expect_success 'apply to a funny path' ' @@ -71,9 +71,9 @@ test_expect_success 'am --reject' ' rm -rf .git/rebase-apply && git reset --hard initial && test_must_fail git am --reject "$tm"/am-test-6-1 && - grep "@@ -1,3 +1,3 @@" file-2.rej && + test_grep "@@ -1,3 +1,3 @@" file-2.rej && test_must_fail git diff-files --exit-code --quiet file-2 && - grep "[-]-reject" .git/rebase-apply/apply-opt + test_grep "[-]-reject" .git/rebase-apply/apply-opt ' test_done diff --git a/t/t4254-am-corrupt.sh b/t/t4254-am-corrupt.sh index 96ddf3c53a45b9..f68b5d3127d3d7 100755 --- a/t/t4254-am-corrupt.sh +++ b/t/t4254-am-corrupt.sh @@ -73,16 +73,16 @@ test_expect_success "NUL in commit message's body" ' test_when_finished "git am --abort" && make_mbox_with_nul body >body.patch && test_must_fail git am body.patch 2>err && - grep "a NUL byte in commit log message not allowed" err + test_grep "a NUL byte in commit log message not allowed" err ' test_expect_success "NUL in commit message's header" " test_when_finished 'git am --abort' && make_mbox_with_nul subject >subject.patch && test_must_fail git mailinfo msg patch err && - grep \"a NUL byte in 'Subject' is not allowed\" err && + test_grep \"a NUL byte in 'Subject' is not allowed\" err && test_must_fail git am subject.patch 2>err && - grep \"a NUL byte in 'Subject' is not allowed\" err + test_grep \"a NUL byte in 'Subject' is not allowed\" err " test_done diff --git a/t/t4258-am-quoted-cr.sh b/t/t4258-am-quoted-cr.sh index 201915b45a8bd6..50e81b93305c0f 100755 --- a/t/t4258-am-quoted-cr.sh +++ b/t/t4258-am-quoted-cr.sh @@ -16,7 +16,7 @@ test_expect_success 'setup' ' test_expect_success 'am warn if quoted-cr is found' ' git reset --hard one && test_must_fail git am "$DATA/mbox" 2>err && - grep "quoted CRLF detected" err + test_grep "quoted CRLF detected" err ' test_expect_success 'am --quoted-cr=strip' ' diff --git a/t/t4301-merge-tree-write-tree.sh b/t/t4301-merge-tree-write-tree.sh index 6e117ee93c8b5b..b2684911d19cea 100755 --- a/t/t4301-merge-tree-write-tree.sh +++ b/t/t4301-merge-tree-write-tree.sh @@ -88,7 +88,7 @@ test_expect_success 'Clean merge' ' # Repeat the previous test, but turn off rename detection test_expect_success 'Failed merge without rename detection' ' test_must_fail git -c diff.renames=false merge-tree --write-tree side1 side3 >out && - grep "CONFLICT (modify/delete): numbers deleted" out + test_grep "CONFLICT (modify/delete): numbers deleted" out ' test_expect_success '--quiet on conflicted merge' ' @@ -161,13 +161,13 @@ test_expect_success 'Barf on misspelled option, with exit code other than 0 or 1 # Mis-spell with single "s" instead of double "s" test_expect_code 129 git merge-tree --write-tree --mesages FOOBAR side1 side2 2>expect && - grep "error: unknown option.*mesages" expect + test_grep "error: unknown option.*mesages" expect ' test_expect_success 'Barf on too many arguments' ' test_expect_code 129 git merge-tree --write-tree side1 side2 invalid 2>expect && - grep "^usage: git merge-tree" expect + test_grep "^usage: git merge-tree" expect ' anonymize_hash() { @@ -352,7 +352,7 @@ test_expect_success 'rename/add handling' ' # hash=$(tr "\0" "\n" all_blobs && - ! grep $hash all_blobs && + test_grep ! $hash all_blobs && # # Second, check anonymized hash output against expectation @@ -419,7 +419,7 @@ test_expect_success SYMLINKS 'rename/add, where add is a mode conflict' ' # hash=$(tr "\0" "\n" all_blobs && - ! grep $hash all_blobs && + test_grep ! $hash all_blobs && # # Second, check anonymized hash output against expectation @@ -670,8 +670,8 @@ test_expect_success 'mod6: chains of rename/rename(1to2) and add/add via collidi hash1=$(tr "\0" "\n" all_blobs && - ! grep $hash1 all_blobs && - ! grep $hash2 all_blobs && + test_grep ! $hash1 all_blobs && + test_grep ! $hash2 all_blobs && # # Now compare anonymized hash output with expectation @@ -857,7 +857,7 @@ test_expect_success 'NUL terminated conflicted file "lines"' ' test_expect_success 'error out by default for unrelated histories' ' test_expect_code 128 git merge-tree --write-tree side1 unrelated 2>error && - grep "refusing to merge unrelated histories" error + test_grep "refusing to merge unrelated histories" error ' test_expect_success 'can override merge of unrelated histories' ' @@ -924,7 +924,7 @@ test_expect_success '--stdin with both a successful and a conflicted merge' ' test_expect_success '--merge-base is incompatible with --stdin' ' test_must_fail git merge-tree --merge-base=side1 --stdin 2>expect && - grep "^fatal: .*merge-base.*stdin.* cannot be used together" expect + test_grep "^fatal: .*merge-base.*stdin.* cannot be used together" expect ' # specify merge-base as parent of branch2 diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh index a8c28533dc73f8..3ad600c7932b68 100755 --- a/t/t5000-tar-tree.sh +++ b/t/t5000-tar-tree.sh @@ -323,14 +323,14 @@ test_expect_success 'setup tar filters' ' test_expect_success 'archive --list mentions user filter' ' git archive --list >output && - grep "^tar\.foo\$" output && - grep "^bar\$" output + test_grep "^tar\.foo\$" output && + test_grep "^bar\$" output ' test_expect_success 'archive --list shows only enabled remote filters' ' git archive --list --remote=. >output && - ! grep "^tar\.foo\$" output && - grep "^bar\$" output + test_grep ! "^tar\.foo\$" output && + test_grep "^bar\$" output ' test_expect_success 'invoke tar filter by format' ' @@ -440,7 +440,7 @@ test_expect_success 'catch non-matching pathspec' ' test_expect_success 'reject paths outside the current directory' ' test_must_fail git -C a/bin archive HEAD .. >/dev/null 2>err && - grep "outside the current directory" err + test_grep "outside the current directory" err ' test_expect_success 'allow pathspecs that resolve to the current directory' ' diff --git a/t/t5004-archive-corner-cases.sh b/t/t5004-archive-corner-cases.sh index df513a42694966..768b0ff85d031e 100755 --- a/t/t5004-archive-corner-cases.sh +++ b/t/t5004-archive-corner-cases.sh @@ -205,7 +205,7 @@ test_expect_success EXPENSIVE,LONG_IS_64BIT,UNZIP,UNZIP_ZIP64_SUPPORT,ZIPINFO \ "$GIT_UNZIP" -t big.zip && "$ZIPINFO" big.zip >big.lst && - grep $size big.lst + test_grep $size big.lst ' build_tree() { diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh index e57e1ae7395b13..e01078abe748aa 100755 --- a/t/t5100-mailinfo.sh +++ b/t/t5100-mailinfo.sh @@ -265,7 +265,7 @@ test_expect_success 'mailinfo warn CR in base64 encoded email' ' check_quoted_cr_mail quoted-cr/0001 && test_must_be_empty quoted-cr/0001.err && check_quoted_cr_mail quoted-cr/0002 && - grep "quoted CRLF detected" quoted-cr/0002.err && + test_grep "quoted CRLF detected" quoted-cr/0002.err && check_quoted_cr_mail quoted-cr/0001 --quoted-cr=nowarn && test_must_be_empty quoted-cr/0001.err && check_quoted_cr_mail quoted-cr/0002 --quoted-cr=nowarn && diff --git a/t/t5150-request-pull.sh b/t/t5150-request-pull.sh index 270ce6ea48796a..67c5dc7e85fddb 100755 --- a/t/t5150-request-pull.sh +++ b/t/t5150-request-pull.sh @@ -130,8 +130,8 @@ test_expect_success 'pull request when forgot to push' ' test_must_fail git request-pull initial "$downstream_url" \ 2>../err ) && - grep "No match for commit .*" err && - grep "Are you sure you pushed" err + test_grep "No match for commit .*" err && + test_grep "Are you sure you pushed" err ' @@ -230,7 +230,7 @@ test_expect_success 'pull request format' ' cd local && git request-pull initial "$downstream_url" full ) >request && - grep " tags/full\$" request + test_grep " tags/full\$" request ' test_expect_success 'request-pull ignores OPTIONS_KEEPDASHDASH poison' ' @@ -260,8 +260,8 @@ test_expect_success 'request-pull quotes regex metacharacters properly' ' test_must_fail git request-pull initial "$downstream_url" tags/v2.0 \ 2>../err ) && - grep "No match for commit .*" err && - grep "Are you sure you pushed" err + test_grep "No match for commit .*" err && + test_grep "Are you sure you pushed" err ' @@ -277,8 +277,8 @@ test_expect_success 'pull request with mismatched object' ' test_must_fail git request-pull initial "$downstream_url" tags/full \ 2>../err ) && - grep "points to a different object" err && - grep "Are you sure you pushed" err + test_grep "points to a different object" err && + test_grep "Are you sure you pushed" err ' @@ -295,8 +295,8 @@ test_expect_success 'pull request with stale object' ' test_must_fail git request-pull initial "$downstream_url" tags/full \ 2>../err ) && - grep "points to a different object" err && - grep "Are you sure you pushed" err + test_grep "points to a different object" err && + test_grep "Are you sure you pushed" err ' diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index 3179b4963e1600..9dabb3615aff56 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -548,18 +548,18 @@ test_expect_success !PTHREADS,!FAIL_PREREQS \ test_must_fail git index-pack --threads=2 2>err && grep ^warning: err >warnings && test_line_count = 1 warnings && - grep -F "no threads support, ignoring --threads=2" err && + test_grep -F "no threads support, ignoring --threads=2" err && test_must_fail git -c pack.threads=2 index-pack 2>err && grep ^warning: err >warnings && test_line_count = 1 warnings && - grep -F "no threads support, ignoring pack.threads" err && + test_grep -F "no threads support, ignoring pack.threads" err && test_must_fail git -c pack.threads=2 index-pack --threads=4 2>err && grep ^warning: err >warnings && test_line_count = 2 warnings && - grep -F "no threads support, ignoring --threads=4" err && - grep -F "no threads support, ignoring pack.threads" err + test_grep -F "no threads support, ignoring --threads=4" err && + test_grep -F "no threads support, ignoring pack.threads" err ' test_expect_success !PTHREADS,!FAIL_PREREQS \ @@ -567,18 +567,18 @@ test_expect_success !PTHREADS,!FAIL_PREREQS \ git pack-objects --threads=2 --stdout --all /dev/null 2>err && grep ^warning: err >warnings && test_line_count = 1 warnings && - grep -F "no threads support, ignoring --threads" err && + test_grep -F "no threads support, ignoring --threads" err && git -c pack.threads=2 pack-objects --stdout --all /dev/null 2>err && grep ^warning: err >warnings && test_line_count = 1 warnings && - grep -F "no threads support, ignoring pack.threads" err && + test_grep -F "no threads support, ignoring pack.threads" err && git -c pack.threads=2 pack-objects --threads=4 --stdout --all /dev/null 2>err && grep ^warning: err >warnings && test_line_count = 2 warnings && - grep -F "no threads support, ignoring --threads" err && - grep -F "no threads support, ignoring pack.threads" err + test_grep -F "no threads support, ignoring --threads" err && + test_grep -F "no threads support, ignoring pack.threads" err ' test_expect_success 'pack-objects in too-many-packs mode' ' @@ -727,7 +727,7 @@ test_expect_success '--path-walk pack everything' ' git -C server rev-parse HEAD >in && GIT_PROGRESS_DELAY=0 git -C server pack-objects \ --stdout --revs --path-walk --progress out.pack 2>err && - grep "Compressing objects by path" err && + test_grep "Compressing objects by path" err && git -C server index-pack --stdin out.pack 2>err && - grep "Compressing objects by path" err && + test_grep "Compressing objects by path" err && git -C server index-pack --fix-thin --stdin err && - grep "^warning:.* expected .tagger. line" err + test_grep "^warning:.* expected .tagger. line" err ' test_expect_success 'index-pack --fsck-objects also warns upon missing tagger in tag' ' git index-pack --fsck-objects tag-test-${pack1}.pack 2>err && - grep "^warning:.* expected .tagger. line" err + test_grep "^warning:.* expected .tagger. line" err ' test_expect_success 'index-pack -v --stdin produces progress for both phases' ' @@ -290,7 +290,7 @@ test_expect_success 'too-large packs report the breach' ' sz="$(test_file_size pack-$pack.pack)" && test "$sz" -gt 20 && test_must_fail git index-pack --max-input-size=20 pack-$pack.pack 2>err && - grep "maximum allowed size (20 bytes)" err + test_grep "maximum allowed size (20 bytes)" err ' # git-index-pack(1) uses the default hash algorithm outside of the repository, diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh index 2be7cd30dece6e..db8e389c2c13b1 100755 --- a/t/t5304-prune.sh +++ b/t/t5304-prune.sh @@ -120,7 +120,7 @@ test_expect_success 'prune: prune former HEAD after checking out branch' ' git checkout --quiet main && git reflog expire --all && git prune -v >prune_actual && - grep "$head_oid" prune_actual + test_grep "$head_oid" prune_actual ' test_expect_success 'prune: do not prune heads listed as an argument' ' @@ -214,7 +214,7 @@ test_expect_success 'garbage report in count-objects -v' ' >.git/objects/pack/fake2.keep && >.git/objects/pack/fake3.idx && git count-objects -v 2>stderr && - grep "index file .git/objects/pack/fake.idx is too small" stderr && + test_grep "index file .git/objects/pack/fake.idx is too small" stderr && grep "^warning:" stderr | sort >actual && cat >expected <<\EOF && warning: garbage found: .git/objects/pack/fake.bar @@ -252,8 +252,8 @@ test_expect_success 'prune .git/shallow' ' oid=$(echo hi|git commit-tree HEAD^{tree}) && echo $oid >.git/shallow && git prune --dry-run >out && - grep $oid .git/shallow && - grep $oid out && + test_grep $oid .git/shallow && + test_grep $oid out && git prune && test_path_is_missing .git/shallow ' diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh index efeb71593bf7f6..33ccb579c5e87b 100755 --- a/t/t5310-pack-bitmaps.sh +++ b/t/t5310-pack-bitmaps.sh @@ -81,8 +81,8 @@ test_bitmap_cases () { git repack -ad && ls .git/objects/pack/ | grep bitmap >output && test_line_count = 1 output && - grep "\"key\":\"num_selected_commits\",\"value\":\"106\"" trace && - grep "\"key\":\"num_maximal_commits\",\"value\":\"107\"" trace + test_grep "\"key\":\"num_selected_commits\",\"value\":\"106\"" trace && + test_grep "\"key\":\"num_maximal_commits\",\"value\":\"107\"" trace ' basic_bitmap_tests @@ -532,8 +532,8 @@ test_bitmap_cases () { test_line_count = 2 bitmaps && GIT_TRACE2_EVENT=$(pwd)/trace2.txt git rev-list --use-bitmap-index HEAD && - grep "opened bitmap" trace2.txt && - grep "ignoring extra bitmap" trace2.txt + test_grep "opened bitmap" trace2.txt && + test_grep "ignoring extra bitmap" trace2.txt ) ' @@ -598,7 +598,7 @@ test_expect_success 'boundary-based traversal is used when requested' ' do eval "GIT_TRACE2_EVENT=1 $argv rev-list --objects \ --use-bitmap-index second..other 2>perf" && - grep "\"region_enter\".*\"label\":\"haves/boundary\"" perf || + test_grep "\"region_enter\".*\"label\":\"haves/boundary\"" perf || return 1 done && @@ -610,7 +610,7 @@ test_expect_success 'boundary-based traversal is used when requested' ' do eval "GIT_TRACE2_EVENT=1 $argv rev-list --objects \ --use-bitmap-index second..other 2>perf" && - grep "\"region_enter\".*\"label\":\"haves/classic\"" perf || + test_grep "\"region_enter\".*\"label\":\"haves/classic\"" perf || return 1 done ' @@ -632,7 +632,7 @@ test_bitmap_cases "pack.writeBitmapLookupTable" test_expect_success 'verify writing bitmap lookup table when enabled' ' GIT_TRACE2_EVENT="$(pwd)/trace2" \ git repack -ad && - grep "\"label\":\"writing_lookup_table\"" trace2 + test_grep "\"label\":\"writing_lookup_table\"" trace2 ' test_expect_success 'truncated bitmap fails gracefully (lookup table)' ' diff --git a/t/t5317-pack-objects-filter-objects.sh b/t/t5317-pack-objects-filter-objects.sh index dddb79ba627036..2948a7cd2ae19f 100755 --- a/t/t5317-pack-objects-filter-objects.sh +++ b/t/t5317-pack-objects-filter-objects.sh @@ -49,7 +49,7 @@ test_expect_success 'verify blob:none packfile has no blobs' ' git -C r1 index-pack ../filter.pack && git -C r1 verify-pack -v ../filter.pack >verify_result && - ! grep blob verify_result + test_grep ! blob verify_result ' test_expect_success 'verify blob:none packfile without --stdout' ' @@ -57,7 +57,7 @@ test_expect_success 'verify blob:none packfile without --stdout' ' HEAD EOF git -C r1 verify-pack -v "mypackname-$(cat packhash).pack" >verify_result && - ! grep blob verify_result + test_grep ! blob verify_result ' test_expect_success 'verify normal and blob:none packfiles have same commits/trees' ' @@ -85,7 +85,7 @@ test_expect_success 'get an error for missing tree object' ' test_must_fail git -C r5 pack-objects --revs --stdout 2>bad_tree <<-EOF && HEAD EOF - grep "bad tree object" bad_tree + test_grep "bad tree object" bad_tree ' test_expect_success 'setup for tests of tree:0' ' @@ -101,7 +101,7 @@ test_expect_success 'verify tree:0 packfile has no blobs or trees' ' EOF git -C r1 index-pack ../commitsonly.pack && git -C r1 verify-pack -v ../commitsonly.pack >objs && - ! grep -E "tree|blob" objs + test_grep ! -E "tree|blob" objs ' test_expect_success 'grab tree directly when using tree:0' ' @@ -156,7 +156,7 @@ test_expect_success 'verify blob:limit=500 omits all blobs' ' git -C r2 index-pack ../filter.pack && git -C r2 verify-pack -v ../filter.pack >verify_result && - ! grep blob verify_result + test_grep ! blob verify_result ' test_expect_success 'verify blob:limit=1000' ' @@ -166,7 +166,7 @@ test_expect_success 'verify blob:limit=1000' ' git -C r2 index-pack ../filter.pack && git -C r2 verify-pack -v ../filter.pack >verify_result && - ! grep blob verify_result + test_grep ! blob verify_result ' test_expect_success 'verify blob:limit=1001' ' diff --git a/t/t5318-commit-graph.sh b/t/t5318-commit-graph.sh index 1c40f904f8bb31..6cecfbeaa1dc70 100755 --- a/t/t5318-commit-graph.sh +++ b/t/t5318-commit-graph.sh @@ -14,7 +14,7 @@ test_expect_success 'usage' ' test_expect_success 'usage shown without sub-command' ' test_expect_code 129 git commit-graph 2>err && - grep usage: err + test_grep usage: err ' test_expect_success 'usage shown with an error on unknown sub-command' ' @@ -679,12 +679,12 @@ test_expect_success 'git fsck (checks commit-graph when config unset)' ' test_expect_success 'git fsck shows commit-graph output with --progress' ' git -C "$TRASH_DIRECTORY/full" fsck --progress 2>err && - grep "Verifying commits in commit graph" err + test_grep "Verifying commits in commit graph" err ' test_expect_success 'git fsck suppresses commit-graph output with --no-progress' ' git -C "$TRASH_DIRECTORY/full" fsck --no-progress 2>err && - ! grep "Verifying commits in commit graph" err + test_grep ! "Verifying commits in commit graph" err ' test_expect_success 'setup non-the_repository tests' ' @@ -962,7 +962,7 @@ test_expect_success 'stale commit cannot be parsed when traversing graph' ' git rev-parse HEAD~2 && # ... but fail when we are paranoid. test_must_fail env GIT_COMMIT_GRAPH_PARANOIA=true git rev-parse HEAD~2 2>error && - grep "error: commit $oid exists in commit-graph but not in the object database" error + test_grep "error: commit $oid exists in commit-graph but not in the object database" error ) ' diff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh index 9154d9795fe91e..68143cb5b76952 100755 --- a/t/t5319-multi-pack-index.sh +++ b/t/t5319-multi-pack-index.sh @@ -130,7 +130,7 @@ test_expect_success 'corrupt idx reports errors' ' test_copy_bytes 1064 $objdir/pack/$idx && git -c core.multiPackIndex=true rev-list --objects --all 2>err && - grep "index unavailable" err + test_grep "index unavailable" err ' test_expect_success 'add more objects' ' @@ -326,7 +326,7 @@ test_expect_success 'preferred packs must be non-empty' ' test_must_fail git multi-pack-index write \ --preferred-pack=pack-$empty.pack 2>err && - grep "with no objects" err + test_grep "with no objects" err ) ' @@ -548,14 +548,14 @@ test_expect_success 'git-fsck incorrect offset' ' test_expect_success 'git fsck shows MIDX output with --progress' ' git fsck --progress 2>err && - grep "Verifying OID order in multi-pack-index" err && - grep "Verifying object offsets" err + test_grep "Verifying OID order in multi-pack-index" err && + test_grep "Verifying object offsets" err ' test_expect_success 'git fsck suppresses MIDX output with --no-progress' ' git fsck --no-progress 2>err && - ! grep "Verifying OID order in multi-pack-index" err && - ! grep "Verifying object offsets" err + test_grep ! "Verifying OID order in multi-pack-index" err && + test_grep ! "Verifying object offsets" err ' test_expect_success 'corrupt MIDX is not reused' ' @@ -1180,7 +1180,7 @@ test_expect_success 'usage shown without sub-command' ' test_expect_success 'complains when run outside of a repository' ' nongit test_must_fail git multi-pack-index write 2>err && - grep "not a git repository" err + test_grep "not a git repository" err ' test_expect_success 'repack with delta islands' ' diff --git a/t/t5324-split-commit-graph.sh b/t/t5324-split-commit-graph.sh index 49a057cc2eb65d..89c0c4f9017296 100755 --- a/t/t5324-split-commit-graph.sh +++ b/t/t5324-split-commit-graph.sh @@ -297,7 +297,7 @@ test_expect_success 'verify notices chain slice which is bogus (base)' ' echo "garbage" >$base_file && test_must_fail git commit-graph verify 2>test_err && grep -v "^+" test_err >err && - grep "commit-graph file is too small" err + test_grep "commit-graph file is too small" err ) ' @@ -310,7 +310,7 @@ test_expect_success 'verify notices chain slice which is bogus (tip)' ' echo "garbage" >$tip_file && test_must_fail git commit-graph verify 2>test_err && grep -v "^+" test_err >err && - grep "commit-graph file is too small" err + test_grep "commit-graph file is too small" err ) ' @@ -379,7 +379,7 @@ test_expect_success 'verify notices too-short chain file' ' echo "garbage" >$graphdir/commit-graph-chain && test_must_fail git commit-graph verify 2>test_err && grep -v "^+" test_err >err && - grep "commit-graph chain file too small" err + test_grep "commit-graph chain file too small" err ) ' @@ -410,7 +410,7 @@ test_expect_success PERL_TEST_HELPERS 'reader bounds-checks base-graph chunk' ' git -c core.commitGraph=false log >expect.out && git -c core.commitGraph=true log >out 2>err && test_cmp expect.out out && - grep "commit-graph base graphs chunk is too small" err + test_grep "commit-graph base graphs chunk is too small" err ) ' @@ -421,7 +421,7 @@ test_expect_success 'add octopus merge' ' git commit-graph write --reachable --split && git commit-graph verify --progress 2>err && test_line_count = 1 err && - grep "Verifying commits in commit graph: 100% (18/18)" err && + test_grep "Verifying commits in commit graph: 100% (18/18)" err && test_grep ! warning err && test_line_count = 3 $graphdir/commit-graph-chain ' diff --git a/t/t5325-reverse-index.sh b/t/t5325-reverse-index.sh index 285c8b4a49555b..54937919381707 100755 --- a/t/t5325-reverse-index.sh +++ b/t/t5325-reverse-index.sh @@ -65,7 +65,7 @@ test_expect_success 'index-pack can verify reverse indexes' ' test_must_fail git index-pack --rev-index --verify \ $packdir/pack-$pack.pack 2>err && - grep "validation error" err + test_grep "validation error" err ' test_expect_success 'index-pack infers reverse index name with -o' ' diff --git a/t/t5326-multi-pack-bitmaps.sh b/t/t5326-multi-pack-bitmaps.sh index 62bd973d92afc9..18464d2fc03780 100755 --- a/t/t5326-multi-pack-bitmaps.sh +++ b/t/t5326-multi-pack-bitmaps.sh @@ -121,7 +121,7 @@ test_midx_bitmap_cases () { EOF test_must_fail git multi-pack-index write --bitmap 2>err && - grep "doesn.t have full closure" err && + test_grep "doesn.t have full closure" err && test_path_is_missing $midx ) ' @@ -215,8 +215,8 @@ test_midx_bitmap_cases () { test_path_is_file $midx-$(midx_checksum $objdir).bitmap && test-tool bitmap list-commits | sort >bitmaps && - grep "$(git rev-parse one)" bitmaps && - grep "$(git rev-parse two)" bitmaps && + test_grep "$(git rev-parse one)" bitmaps && + test_grep "$(git rev-parse two)" bitmaps && rm -fr $midx-$(midx_checksum $objdir).bitmap && rm -fr $midx && @@ -229,8 +229,8 @@ test_midx_bitmap_cases () { test_path_is_file $midx-$(midx_checksum $objdir).bitmap && test-tool bitmap list-commits | sort >bitmaps && - grep "$(git rev-parse one)" bitmaps && - ! grep "$(git rev-parse two)" bitmaps + test_grep "$(git rev-parse one)" bitmaps && + test_grep ! "$(git rev-parse two)" bitmaps ) ' @@ -258,7 +258,7 @@ test_midx_bitmap_cases () { test_line_count = 1 before && ( - grep -vf before commits.raw && + test_grep -vf before commits.raw && # mark missing commits as preferred sed "s/^/+/" before ) >snapshot && @@ -321,7 +321,7 @@ test_midx_bitmap_cases () { git multi-pack-index write --bitmap --stdin-packs \ err && - grep "bitmap without any objects" err && + test_grep "bitmap without any objects" err && test_path_is_file $midx && test_path_is_missing $midx-$(midx_checksum $objdir).bitmap @@ -344,7 +344,7 @@ test_midx_bitmap_cases () { GIT_TEST_MIDX_READ_RIDX=0 \ git rev-list --use-bitmap-index HEAD 2>err && - ! grep "ignoring extra bitmap file" err + test_grep ! "ignoring extra bitmap file" err ) ' } @@ -364,7 +364,7 @@ test_expect_success 'multi-pack-index write writes lookup table if enabled' ' git repack -ad && GIT_TRACE2_EVENT="$(pwd)/trace" \ git multi-pack-index write --bitmap && - grep "\"label\":\"writing_lookup_table\"" trace + test_grep "\"label\":\"writing_lookup_table\"" trace ) ' @@ -432,7 +432,7 @@ test_expect_success 'tagged commits are selected for bitmapping' ' git rev-parse HEAD >want && test-tool bitmap list-commits >actual && - grep $(cat want) actual + test_grep $(cat want) actual ) ' @@ -488,17 +488,17 @@ test_expect_success 'git fsck correctly identifies good and bad bitmaps' ' corrupt_file "$packbitmap" && test_must_fail git fsck 2>err && - grep "bitmap file '\''$packbitmap'\'' has invalid checksum" err && + test_grep "bitmap file '\''$packbitmap'\'' has invalid checksum" err && cp "$packbitmap.bak" "$packbitmap" && corrupt_file "$midxbitmap" && test_must_fail git fsck 2>err && - grep "bitmap file '\''$midxbitmap'\'' has invalid checksum" err && + test_grep "bitmap file '\''$midxbitmap'\'' has invalid checksum" err && corrupt_file "$packbitmap" && test_must_fail git fsck 2>err && - grep "bitmap file '\''$midxbitmap'\'' has invalid checksum" err && - grep "bitmap file '\''$packbitmap'\'' has invalid checksum" err + test_grep "bitmap file '\''$midxbitmap'\'' has invalid checksum" err && + test_grep "bitmap file '\''$packbitmap'\'' has invalid checksum" err ' test_expect_success 'corrupt MIDX with bitmap causes fallback' ' diff --git a/t/t5328-commit-graph-64bit-time.sh b/t/t5328-commit-graph-64bit-time.sh index d8891e6a922463..4e86aff5099362 100755 --- a/t/t5328-commit-graph-64bit-time.sh +++ b/t/t5328-commit-graph-64bit-time.sh @@ -80,7 +80,7 @@ test_expect_success PERL_TEST_HELPERS 'reader notices out-of-bounds generation o git commit-graph write --reachable && corrupt_chunk_file $graph GDO2 clear && test_must_fail git log 2>err && - grep "commit-graph overflow generation data is too small" err + test_grep "commit-graph overflow generation data is too small" err ' test_done diff --git a/t/t5329-pack-objects-cruft.sh b/t/t5329-pack-objects-cruft.sh index 25ddda5cf3832e..12cda063730372 100755 --- a/t/t5329-pack-objects-cruft.sh +++ b/t/t5329-pack-objects-cruft.sh @@ -468,8 +468,8 @@ test_expect_success 'cruft --local drops unreachable objects' ' test-tool pack-mtimes "$(basename $(ls $packdir/pack-*.mtimes))" \ >objects && - ! grep $object objects && - grep $cruft objects + test_grep ! $object objects && + test_grep $cruft objects ) ' @@ -515,7 +515,7 @@ test_expect_success 'cruft objects are freshend via loose' ' test_path_is_missing "$loose" && test-tool pack-mtimes "$(basename "$(ls $packdir/pack-*.mtimes)")" >cruft && - grep "$blob" cruft && + test_grep "$blob" cruft && # write the same object again git hash-object -w -t blob contents && @@ -657,7 +657,7 @@ test_expect_success 'multi-valued gc.recentObjectsHook' ' # ensure that a dirty exit halts cruft pack generation git config --add gc.recentObjectsHook ./extra-tips.c && test_must_fail git repack --cruft --cruft-expiration=now -d 2>err && - grep "unable to enumerate additional recent objects" err && + test_grep "unable to enumerate additional recent objects" err && # and that the existing cruft pack is left alone test_path_is_file "$mtimes" diff --git a/t/t5334-incremental-multi-pack-index.sh b/t/t5334-incremental-multi-pack-index.sh index 68a103d13d23c3..f0b82b5f65cf40 100755 --- a/t/t5334-incremental-multi-pack-index.sh +++ b/t/t5334-incremental-multi-pack-index.sh @@ -29,7 +29,7 @@ test_expect_success 'convert non-incremental MIDX to incremental' ' test_path_is_missing $packdir/multi-pack-index && test_path_is_file $midx_chain && test_line_count = 2 $midx_chain && - grep $old_hash $midx_chain + test_grep $old_hash $midx_chain ' compare_results_with_midx 'incremental MIDX' diff --git a/t/t5335-compact-multi-pack-index.sh b/t/t5335-compact-multi-pack-index.sh index ec1dafe89fcfce..0f75ef2ccc96b3 100755 --- a/t/t5335-compact-multi-pack-index.sh +++ b/t/t5335-compact-multi-pack-index.sh @@ -321,8 +321,8 @@ test_expect_success 'MIDX compaction with --no-write-chain-file' ' } >$midx_chain && test-tool read-midx $objdir $layer >midx.data && - grep "^pack-B-.*\.idx" midx.data && - grep "^pack-C-.*\.idx" midx.data + test_grep "^pack-B-.*\.idx" midx.data && + test_grep "^pack-C-.*\.idx" midx.data ) ' diff --git a/t/t5351-unpack-large-objects.sh b/t/t5351-unpack-large-objects.sh index d76eb4be932eeb..7f621c53311539 100755 --- a/t/t5351-unpack-large-objects.sh +++ b/t/t5351-unpack-large-objects.sh @@ -32,7 +32,7 @@ test_expect_success 'set memory limitation to 1MB' ' test_expect_success 'unpack-objects failed under memory limitation' ' prepare_dest 2m && test_must_fail git -C dest.git unpack-objects err && - grep "fatal: attempting to allocate" err + test_grep "fatal: attempting to allocate" err ' test_expect_success 'unpack-objects works with memory limitation in dry-run mode' ' diff --git a/t/t5402-post-merge-hook.sh b/t/t5402-post-merge-hook.sh index 915af2de95e162..c77aa56421c5e2 100755 --- a/t/t5402-post-merge-hook.sh +++ b/t/t5402-post-merge-hook.sh @@ -46,7 +46,7 @@ test_expect_success 'post-merge runs as expected ' ' ' test_expect_success 'post-merge from normal merge receives the right argument ' ' - grep 0 clone1/.git/post-merge.args + test_grep 0 clone1/.git/post-merge.args ' test_expect_success 'post-merge from squash merge runs as expected ' ' @@ -55,7 +55,7 @@ test_expect_success 'post-merge from squash merge runs as expected ' ' ' test_expect_success 'post-merge from squash merge receives the right argument ' ' - grep 1 clone2/.git/post-merge.args + test_grep 1 clone2/.git/post-merge.args ' test_done diff --git a/t/t5403-post-checkout-hook.sh b/t/t5403-post-checkout-hook.sh index cb0300b2d2b2f0..39009ce327b6bd 100755 --- a/t/t5403-post-checkout-hook.sh +++ b/t/t5403-post-checkout-hook.sh @@ -100,7 +100,7 @@ test_rebase () { echo untracked >three.t && test_when_finished "rm three.t" && test_must_fail git rebase $args HEAD rebase-fast-forward 2>err && - grep "untracked working tree files would be overwritten by checkout" err && + test_grep "untracked working tree files would be overwritten by checkout" err && test_path_is_missing .git/post-checkout.args ' diff --git a/t/t5404-tracking-branches.sh b/t/t5404-tracking-branches.sh index cc078896673ae2..a1661d34f24509 100755 --- a/t/t5404-tracking-branches.sh +++ b/t/t5404-tracking-branches.sh @@ -59,7 +59,7 @@ test_expect_success 'deleted branches have their tracking branches removed' ' test_expect_success 'already deleted tracking branches ignored' ' git branch -d -r origin/b3 && git push origin :b3 >output 2>&1 && - ! grep "^error: " output + test_grep ! "^error: " output ' test_done diff --git a/t/t5406-remote-rejects.sh b/t/t5406-remote-rejects.sh index dcbeb42082791b..bb293b70103fc7 100755 --- a/t/t5406-remote-rejects.sh +++ b/t/t5406-remote-rejects.sh @@ -19,6 +19,6 @@ test_expect_success 'setup' ' test_expect_success 'push reports error' 'test_must_fail git push 2>stderr' -test_expect_success 'individual ref reports error' 'grep rejected stderr' +test_expect_success 'individual ref reports error' 'test_grep rejected stderr' test_done diff --git a/t/t5407-post-rewrite-hook.sh b/t/t5407-post-rewrite-hook.sh index ad7f8c6f00202c..ed9896e27a4e78 100755 --- a/t/t5407-post-rewrite-hook.sh +++ b/t/t5407-post-rewrite-hook.sh @@ -195,19 +195,19 @@ test_expect_success 'git rebase with failed pick' ' set_replace_editor todo && test_must_fail git rebase -i D D 2>err ) && - grep "would be overwritten" err && + test_grep "would be overwritten" err && rm bar && test_must_fail git rebase --continue 2>err && - grep "would be overwritten" err && + test_grep "would be overwritten" err && rm G && test_must_fail git rebase --continue 2>err && - grep "would be overwritten" err && + test_grep "would be overwritten" err && rm H && test_must_fail git rebase --continue 2>err && - grep "would be overwritten" err && + test_grep "would be overwritten" err && rm I && git rebase --continue && diff --git a/t/t5409-colorize-remote-messages.sh b/t/t5409-colorize-remote-messages.sh index 3010913bb113e4..5da8b0ad649640 100755 --- a/t/t5409-colorize-remote-messages.sh +++ b/t/t5409-colorize-remote-messages.sh @@ -32,70 +32,70 @@ test_expect_success 'setup' ' test_expect_success 'keywords' ' git --git-dir child/.git -c color.remote=always push -f origin HEAD:refs/heads/keywords 2>output && test_decode_color decoded && - grep "error: error" decoded && - grep "hint:" decoded && - grep "success:" decoded && - grep "SUCCESS" decoded && - grep "warning:" decoded + test_grep "error: error" decoded && + test_grep "hint:" decoded && + test_grep "success:" decoded && + test_grep "SUCCESS" decoded && + test_grep "warning:" decoded ' test_expect_success 'whole words at line start' ' git --git-dir child/.git -c color.remote=always push -f origin HEAD:refs/heads/whole-words 2>output && test_decode_color decoded && - grep "hint:" decoded && - grep "hinting: not highlighted" decoded && - grep "prefixerror: error" decoded + test_grep "hint:" decoded && + test_grep "hinting: not highlighted" decoded && + test_grep "prefixerror: error" decoded ' test_expect_success 'short line' ' git -C child -c color.remote=always push -f origin HEAD:short-line 2>output && test_decode_color decoded && - grep "remote: Err" decoded + test_grep "remote: Err" decoded ' test_expect_success 'case-insensitive' ' git --git-dir child/.git -c color.remote=always push -f origin HEAD:refs/heads/case-insensitive 2>output && test_decode_color decoded && - grep "error: error" decoded && - grep "ERROR: also highlighted" decoded + test_grep "error: error" decoded && + test_grep "ERROR: also highlighted" decoded ' test_expect_success 'leading space' ' git --git-dir child/.git -c color.remote=always push -f origin HEAD:refs/heads/leading-space 2>output && test_decode_color decoded && - grep " error: leading space" decoded + test_grep " error: leading space" decoded ' test_expect_success 'spaces only' ' git -C child -c color.remote=always push -f origin HEAD:only-space 2>output && test_decode_color decoded && - grep "remote: " decoded + test_grep "remote: " decoded ' test_expect_success 'no coloring for redirected output' ' git --git-dir child/.git push -f origin HEAD:refs/heads/redirected-output 2>output && test_decode_color decoded && - grep "error: error" decoded + test_grep "error: error" decoded ' test_expect_success 'push with customized color' ' git --git-dir child/.git -c color.remote=always -c color.remote.error=blue push -f origin HEAD:refs/heads/customized-color 2>output && test_decode_color decoded && - grep "error:" decoded && - grep "success:" decoded + test_grep "error:" decoded && + test_grep "success:" decoded ' test_expect_success 'error in customized color' ' git --git-dir child/.git -c color.remote=always -c color.remote.error=i-am-not-a-color push -f origin HEAD:refs/heads/error-customized-color 2>output && test_decode_color decoded && - grep "success:" decoded + test_grep "success:" decoded ' test_expect_success 'fallback to color.ui' ' git --git-dir child/.git -c color.ui=always push -f origin HEAD:refs/heads/fallback-color-ui 2>output && test_decode_color decoded && - grep "error: error" decoded + test_grep "error: error" decoded ' test_expect_success 'disallow (color) control sequences in sideband' ' diff --git a/t/t5411/test-0013-bad-protocol.sh b/t/t5411/test-0013-bad-protocol.sh index 8d22e17aee31a5..83e4eb2df67079 100644 --- a/t/t5411/test-0013-bad-protocol.sh +++ b/t/t5411/test-0013-bad-protocol.sh @@ -62,8 +62,8 @@ test_expect_success "proc-receive: bad protocol (hook --die-read-version, $PROTO ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-read-version option" out-$test_count && - grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && + test_grep "remote: fatal: die with the --die-read-version option" out-$test_count && + test_grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && test_cmp_refs -C "$upstream" <<-\EOF refs/heads/main @@ -93,8 +93,8 @@ test_expect_success "proc-receive: bad protocol (hook --die-write-version, $PROT ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-write-version option" out-$test_count && - grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && + test_grep "remote: fatal: die with the --die-write-version option" out-$test_count && + test_grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && test_cmp_refs -C "$upstream" <<-EOF refs/heads/main @@ -124,7 +124,7 @@ test_expect_success "proc-receive: bad protocol (hook --die-read-commands, $PROT ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-read-commands option" out-$test_count && + test_grep "remote: fatal: die with the --die-read-commands option" out-$test_count && test_cmp_refs -C "$upstream" <<-EOF refs/heads/main @@ -156,7 +156,7 @@ test_expect_success "proc-receive: bad protocol (hook --die-read-push-options, $ ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-read-push-options option" out-$test_count && + test_grep "remote: fatal: die with the --die-read-push-options option" out-$test_count && test_cmp_refs -C "$upstream" <<-EOF refs/heads/main @@ -186,7 +186,7 @@ test_expect_success "proc-receive: bad protocol (hook --die-write-report, $PROTO ! [remote rejected] HEAD -> refs/for/main/topic (fail to run proc-receive hook) EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-write-report option" out-$test_count && + test_grep "remote: fatal: die with the --die-write-report option" out-$test_count && test_cmp_refs -C "$upstream" <<-EOF refs/heads/main diff --git a/t/t5411/test-0014-bad-protocol--porcelain.sh b/t/t5411/test-0014-bad-protocol--porcelain.sh index 298a3d1feca1ff..6258e575ff1ce2 100644 --- a/t/t5411/test-0014-bad-protocol--porcelain.sh +++ b/t/t5411/test-0014-bad-protocol--porcelain.sh @@ -62,8 +62,8 @@ test_expect_success "proc-receive: bad protocol (hook --die-read-version, $PROTO Done EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-read-version option" out-$test_count && - grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && + test_grep "remote: fatal: die with the --die-read-version option" out-$test_count && + test_grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && test_cmp_refs -C "$upstream" <<-EOF refs/heads/main @@ -93,8 +93,8 @@ test_expect_success "proc-receive: bad protocol (hook --die-write-version, $PROT Done EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-write-version option" out-$test_count && - grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && + test_grep "remote: fatal: die with the --die-write-version option" out-$test_count && + test_grep "remote: error: fail to negotiate version with proc-receive hook" out-$test_count && test_cmp_refs -C "$upstream" <<-EOF refs/heads/main @@ -124,7 +124,7 @@ test_expect_success "proc-receive: bad protocol (hook --die-read-commands, $PROT Done EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-read-commands option" out-$test_count && + test_grep "remote: fatal: die with the --die-read-commands option" out-$test_count && test_cmp_refs -C "$upstream" <<-EOF refs/heads/main @@ -156,7 +156,7 @@ test_expect_success "proc-receive: bad protocol (hook --die-read-push-options, $ Done EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-read-push-options option" out-$test_count && + test_grep "remote: fatal: die with the --die-read-push-options option" out-$test_count && test_cmp_refs -C "$upstream" <<-EOF refs/heads/main @@ -186,7 +186,7 @@ test_expect_success "proc-receive: bad protocol (hook --die-write-report, $PROTO Done EOF test_cmp expect actual && - grep "remote: fatal: die with the --die-write-report option" out-$test_count && + test_grep "remote: fatal: die with the --die-write-report option" out-$test_count && test_cmp_refs -C "$upstream" <<-EOF refs/heads/main diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh index 649a615ec9af15..6c1edf2117277a 100755 --- a/t/t5500-fetch-pack.sh +++ b/t/t5500-fetch-pack.sh @@ -135,15 +135,15 @@ test_expect_success 'single given branch clone' ' GIT_TRACE2_EVENT="$(pwd)/branch-a/trace2_event" \ git clone --single-branch --branch A "file://$(pwd)/." branch-a && test_must_fail git --git-dir=branch-a/.git rev-parse origin/B && - grep \"fetch-info\".*\"haves\":0 branch-a/trace2_event && - grep \"fetch-info\".*\"wants\":1 branch-a/trace2_event + test_grep \"fetch-info\".*\"haves\":0 branch-a/trace2_event && + test_grep \"fetch-info\".*\"wants\":1 branch-a/trace2_event ' test_expect_success 'clone shallow depth 1' ' GIT_TRACE2_EVENT="$(pwd)/shallow0/trace2_event" \ git clone --no-single-branch --depth 1 "file://$(pwd)/." shallow0 && test "$(git --git-dir=shallow0/.git rev-list --count HEAD)" = 1 && - grep \"fetch-info\".*\"depth\":1 shallow0/trace2_event + test_grep \"fetch-info\".*\"depth\":1 shallow0/trace2_event ' test_expect_success 'clone shallow depth 1 with fsck' ' @@ -167,7 +167,7 @@ test_expect_success 'clone shallow object count' ' cd shallow && git count-objects -v ) > count.shallow && - grep "^in-pack: 12" count.shallow + test_grep "^in-pack: 12" count.shallow ' test_expect_success 'clone shallow object count (part 2)' ' @@ -230,7 +230,7 @@ test_expect_success 'clone shallow object count' ' cd shallow && git count-objects -v ) > count.shallow && - grep "^count: 6" count.shallow + test_grep "^count: 6" count.shallow ' test_expect_success 'add two more (part 2)' ' @@ -243,8 +243,8 @@ test_expect_success 'deepening pull in shallow repo' ' cd shallow && GIT_TRACE2_EVENT="$(pwd)/trace2_event" \ git pull --depth 4 .. B && - grep \"fetch-info\".*\"depth\":4 trace2_event && - grep \"fetch-info\".*\"shallows\":2 trace2_event + test_grep \"fetch-info\".*\"depth\":4 trace2_event && + test_grep \"fetch-info\".*\"shallows\":2 trace2_event ) ' @@ -253,7 +253,7 @@ test_expect_success 'clone shallow object count' ' cd shallow && git count-objects -v ) > count.shallow && - grep "^count: 12" count.shallow + test_grep "^count: 12" count.shallow ' test_expect_success 'deepening fetch in shallow repo' ' @@ -268,7 +268,7 @@ test_expect_success 'clone shallow object count' ' cd shallow && git count-objects -v ) > count.shallow && - grep "^count: 18" count.shallow + test_grep "^count: 18" count.shallow ' test_expect_success 'pull in shallow repo with missing merge base' ' @@ -298,7 +298,7 @@ test_expect_success 'clone shallow object count' ' git prune && git count-objects -v ) > count.shallow && - grep "^count: 54" count.shallow + test_grep "^count: 54" count.shallow ' test_expect_success 'fetch --no-shallow on full repo' ' @@ -319,8 +319,8 @@ test_expect_success 'turn shallow to complete repository' ' git fetch --unshallow && ! test -f .git/shallow && git fsck --full && - grep \"fetch-info\".*\"shallows\":2 trace2_event && - grep \"fetch-info\".*\"depth\":2147483647 trace2_event + test_grep \"fetch-info\".*\"shallows\":2 trace2_event && + test_grep \"fetch-info\".*\"depth\":2147483647 trace2_event ) ' @@ -333,7 +333,7 @@ test_expect_success 'clone shallow object count' ' cd shallow2 && git count-objects -v ) > count.shallow2 && - grep "^in-pack: 3" count.shallow2 + test_grep "^in-pack: 3" count.shallow2 ' test_expect_success 'clone shallow with --branch' ' @@ -446,7 +446,7 @@ test_expect_success 'in_vain reset upon ACK' ' # and should reset in_vain. This allows negotiation to continue until # the client reports that first_anotherbranch_commit is common. GIT_TRACE2_EVENT="$(pwd)/trace2" git -C myclient fetch --progress origin main 2>log && - grep \"key\":\"total_rounds\",\"value\":\"6\" trace2 && + test_grep \"key\":\"total_rounds\",\"value\":\"6\" trace2 && test_grep "Total 3 " log ' @@ -852,7 +852,7 @@ test_expect_success 'fetch shallow since ...' ' two EOF test_cmp expected actual && - grep \"fetch-info\".*\"deepen-since\":true shallow11/trace2_event + test_grep \"fetch-info\".*\"deepen-since\":true shallow11/trace2_event ' test_expect_success 'clone shallow since selects no commits' ' @@ -935,7 +935,7 @@ test_expect_success 'fetch exclude tag one as revision' ' test_when_finished rm -f rev err && git -C shallow-exclude rev-parse one >rev && test_must_fail git -C shallow12 fetch --shallow-exclude $(cat rev) origin 2>err && - grep "deepen-not is not a ref:" err + test_grep "deepen-not is not a ref:" err ' test_expect_success 'fetching deepen' ' @@ -1059,9 +1059,9 @@ test_expect_success 'filtering by size' ' commit=$(git -C server rev-parse HEAD) && blob=$(git hash-object server/one.t) && git -C client rev-list --objects --missing=allow-any "$commit" >oids && - ! grep "$blob" oids && + test_grep ! "$blob" oids && - grep \"fetch-info\".*\"filter\":\"blob:limit\" client/trace2_event + test_grep \"fetch-info\".*\"filter\":\"blob:limit\" client/trace2_event ' test_expect_success 'filtering by size has no effect if support for it is not advertised' ' @@ -1076,7 +1076,7 @@ test_expect_success 'filtering by size has no effect if support for it is not ad commit=$(git -C server rev-parse HEAD) && blob=$(git hash-object server/one.t) && git -C client rev-list --objects --missing=allow-any "$commit" >oids && - grep "$blob" oids && + test_grep "$blob" oids && test_grep "filtering not recognized by server" err ' diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh index 438250c75ed0a2..75b2b87999a08d 100755 --- a/t/t5504-fetch-receive-strict.sh +++ b/t/t5504-fetch-receive-strict.sh @@ -298,13 +298,13 @@ test_expect_success 'push with receive.fsck.missingEmail=warn' ' git --git-dir=dst/.git config \ receive.fsck.missingEmail warn && git push --porcelain dst bogus >act 2>&1 && - grep "missingEmail" act && + test_grep "missingEmail" act && test_grep "skipping unknown msg id.*whatever" act && git --git-dir=dst/.git branch -D bogus && git --git-dir=dst/.git config --add \ receive.fsck.missingEmail ignore && git push --porcelain dst bogus >act 2>&1 && - ! grep "missingEmail" act + test_grep ! "missingEmail" act ' test_expect_success 'fetch with fetch.fsck.missingEmail=warn' ' @@ -326,7 +326,7 @@ test_expect_success 'fetch with fetch.fsck.missingEmail=warn' ' git --git-dir=dst/.git config \ fetch.fsck.missingEmail warn && git --git-dir=dst/.git fetch "file://$(pwd)" $refspec >act 2>&1 && - grep "missingEmail" act && + test_grep "missingEmail" act && test_grep "Skipping unknown msg id.*whatever" act && rm -rf dst && git init dst && @@ -334,7 +334,7 @@ test_expect_success 'fetch with fetch.fsck.missingEmail=warn' ' git --git-dir=dst/.git config \ fetch.fsck.missingEmail ignore && git --git-dir=dst/.git fetch "file://$(pwd)" $refspec >act 2>&1 && - ! grep "missingEmail" act + test_grep ! "missingEmail" act ' test_expect_success \ @@ -345,7 +345,7 @@ test_expect_success \ git --git-dir=dst/.git config \ receive.fsck.unterminatedheader warn && test_must_fail git push --porcelain dst HEAD >act 2>&1 && - grep "Cannot demote unterminatedheader" act + test_grep "Cannot demote unterminatedheader" act ' test_expect_success \ @@ -356,7 +356,7 @@ test_expect_success \ git --git-dir=dst/.git config \ fetch.fsck.unterminatedheader warn && test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" HEAD && - grep "Cannot demote unterminatedheader" act + test_grep "Cannot demote unterminatedheader" act ' test_expect_success PERL_TEST_HELPERS 'badFilemode is not a strict error' ' @@ -373,7 +373,7 @@ test_expect_success PERL_TEST_HELPERS 'badFilemode is not a strict error' ' git -C dst.git config transfer.fsckObjects true && git -C badmode.git push ../dst.git $tree:refs/tags/tree 2>err && - grep "$tree: badFilemode" err + test_grep "$tree: badFilemode" err ' test_done diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index e592c0bcde91e9..6f5e86dedeb209 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -91,28 +91,28 @@ test_expect_success 'filters for promisor remotes are listed by git remote -v' ' test_when_finished "rm -rf pc" && git clone --filter=blob:none "file://$(pwd)/srv.bare" pc && git -C pc remote -v >out && - grep "srv.bare (fetch) \[blob:none\]" out && + test_grep "srv.bare (fetch) \[blob:none\]" out && git -C pc config remote.origin.partialCloneFilter object:type=commit && git -C pc remote -v >out && - grep "srv.bare (fetch) \[object:type=commit\]" out + test_grep "srv.bare (fetch) \[object:type=commit\]" out ' test_expect_success 'filters should not be listed for non promisor remotes (remote -v)' ' test_when_finished "rm -rf pc" && git clone one pc && git -C pc remote -v >out && - ! grep "(fetch) \[.*\]" out + test_grep ! "(fetch) \[.*\]" out ' test_expect_success 'filters are listed by git remote -v only' ' test_when_finished "rm -rf pc" && git clone --filter=blob:none "file://$(pwd)/srv.bare" pc && git -C pc remote >out && - ! grep "\[blob:none\]" out && + test_grep ! "\[blob:none\]" out && git -C pc remote show >out && - ! grep "\[blob:none\]" out + test_grep ! "\[blob:none\]" out ' test_expect_success 'check remote-tracking' ' @@ -261,7 +261,7 @@ test_expect_success 'without subcommand accepts -v' ' test_expect_success 'without subcommand does not take arguments' ' test_expect_code 129 git -C test remote origin 2>err && - grep "^error: unknown subcommand:" err + test_grep "^error: unknown subcommand:" err ' cat >test/expect <../test/output && git tag -l foobar-tag >../test/output && git config remote.origin.tagopt >>../test/output @@ -972,7 +972,7 @@ test_expect_success 'rename a remote' ' GIT_TRACE2_EVENT=$(pwd)/trace \ git remote rename --progress origin upstream && test_region progress "Renaming remote references" trace && - grep "pushRemote" .git/config && + test_grep "pushRemote" .git/config && test -z "$(git for-each-ref refs/remotes/origin)" && test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/main" && test "$(git rev-parse upstream/main)" = "$(git rev-parse main)" && @@ -989,7 +989,7 @@ test_expect_success 'rename a remote renames repo remote.pushDefault' ' cd four.1 && git config remote.pushDefault origin && git remote rename origin upstream && - grep pushDefault .git/config && + test_grep pushDefault .git/config && test "$(git config --local remote.pushDefault)" = "upstream" ) ' @@ -1198,7 +1198,7 @@ test_expect_success 'remote prune to cause a dangling symref' ' cd eight && git branch -a ) 2>err && - ! grep "points nowhere" err && + test_grep ! "points nowhere" err && ( cd eight && test_must_fail git branch nomore origin diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index eca9a973b5cb16..a0bbbce0f7d345 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -750,7 +750,7 @@ test_expect_success 'fetch from GIT URL with a non-applying branch..merge # the strange name is: a\!'b test_expect_success 'quoting of a strangely named repo' ' test_must_fail git fetch "a\\!'\''b" > result 2>&1 && - grep "fatal: '\''a\\\\!'\''b'\''" result + test_grep "fatal: '\''a\\\\!'\''b'\''" result ' test_expect_success 'bundle should record HEAD correctly' ' @@ -904,14 +904,14 @@ test_expect_success 'fetch --dry-run does not touch FETCH_HEAD, but still prints rm -f .git/FETCH_HEAD err && git fetch --dry-run . 2>err && ! test -f .git/FETCH_HEAD && - grep FETCH_HEAD err + test_grep FETCH_HEAD err ' test_expect_success '--no-write-fetch-head does not touch FETCH_HEAD, and does not print what would be written' ' rm -f .git/FETCH_HEAD err && git fetch --no-write-fetch-head . 2>err && ! test -f .git/FETCH_HEAD && - ! grep FETCH_HEAD err + test_grep ! FETCH_HEAD err ' test_expect_success '--write-fetch-head gets defeated by --dry-run' ' @@ -1329,7 +1329,7 @@ test_expect_success 'fetching with auto-gc does not lock up' ' git config maintenance.strategy gc && GIT_ASK_YESNO="$TRASH_DIRECTORY/askyesno" git fetch --verbose >fetch.out 2>&1 && test_grep "Auto packing the repository" fetch.out && - ! grep "Should I try again" fetch.out + test_grep ! "Should I try again" fetch.out ) ' @@ -1338,7 +1338,7 @@ do test_expect_success "$section.hideRefs affects connectivity check" ' GIT_TRACE="$PWD"/trace git -c $section.hideRefs=refs -c \ $section.hideRefs="!refs/tags/" fetch && - grep "git rev-list .*--exclude-hidden=fetch" trace + test_grep "git rev-list .*--exclude-hidden=fetch" trace ' done diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh index 5930f55186db23..fe44f39871cde9 100755 --- a/t/t5512-ls-remote.sh +++ b/t/t5512-ls-remote.sh @@ -245,8 +245,8 @@ do git config --add $configsection.hiderefs "!refs/tags/magic" && git config --add $configsection.hiderefs refs/tags/magic/one && git ls-remote . >actual && - grep refs/tags/magic/two actual && - ! grep refs/tags/magic/one actual + test_grep refs/tags/magic/two actual && + test_grep ! refs/tags/magic/one actual ' done @@ -255,13 +255,13 @@ test_expect_success 'overrides work between mixed transfer/upload-pack hideRefs' test_config uploadpack.hiderefs refs/tags && test_config transfer.hiderefs "!refs/tags/magic" && git ls-remote . >actual && - grep refs/tags/magic actual + test_grep refs/tags/magic actual ' test_expect_success 'protocol v2 supports hiderefs' ' test_config uploadpack.hiderefs refs/tags && git -c protocol.version=2 ls-remote . >actual && - ! grep refs/tags actual + test_grep ! refs/tags actual ' test_expect_success 'ls-remote --symref' ' diff --git a/t/t5514-fetch-multiple.sh b/t/t5514-fetch-multiple.sh index 523aff626828ae..5d79472c39f671 100755 --- a/t/t5514-fetch-multiple.sh +++ b/t/t5514-fetch-multiple.sh @@ -217,7 +217,7 @@ test_expect_success 'parallel' ' test_must_fail env GIT_TRACE="$PWD/trace" \ git fetch --jobs=2 --multiple one two 2>err && - grep "preparing to run up to 2 tasks" trace && + test_grep "preparing to run up to 2 tasks" trace && test_grep "could not fetch .one.*128" err && test_grep "could not fetch .two.*128" err ' diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 4d1672de1e264b..49d01f74d505c3 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -124,7 +124,7 @@ do do test_expect_success "reject 'git $cmd --no-$opt'" ' test_must_fail git $cmd --no-$opt 2>err && - grep "unknown option .no-$opt" err + test_grep "unknown option .no-$opt" err ' done done @@ -212,7 +212,7 @@ test_expect_success 'push with negotiation' ' GIT_TRACE2_EVENT="$(pwd)/event" \ git -c protocol.version=2 -c push.negotiate=1 \ push testrepo refs/heads/main:refs/remotes/origin/main && - grep \"key\":\"total_rounds\",\"value\":\"1\" event && + test_grep \"key\":\"total_rounds\",\"value\":\"1\" event && grep_wrote 2 event # 1 commit, 1 tree ' @@ -250,8 +250,8 @@ test_expect_success 'push with negotiation does not attempt to fetch submodules' GIT_TRACE2_EVENT="$(pwd)/event" git -c submodule.recurse=true \ -c protocol.version=2 -c push.negotiate=1 \ push testrepo refs/heads/main:refs/remotes/origin/main 2>err && - grep \"key\":\"total_rounds\",\"value\":\"1\" event && - ! grep "Fetching submodule" err + test_grep \"key\":\"total_rounds\",\"value\":\"1\" event && + test_grep ! "Fetching submodule" err ' test_expect_success 'push with negotiation and remote..negotiationInclude' ' @@ -637,7 +637,7 @@ test_expect_success 'push rejects empty branch name entries' ' test_config branch.main.remote one && test_config branch.main.merge refs/heads/main && test_must_fail git push 2>err && - grep "bad config variable .branch\.\." err + test_grep "bad config variable .branch\.\." err ' test_expect_success 'push ignores "branch." config without subsection' ' @@ -923,7 +923,7 @@ test_expect_success 'warn on push to HEAD of non-bare repository' ' git config receive.denyCurrentBranch warn ) && git push testrepo main 2>stderr && - grep "warning: updating the current branch" stderr + test_grep "warning: updating the current branch" stderr ' test_expect_success 'deny push to HEAD of non-bare repository' ' @@ -945,7 +945,7 @@ test_expect_success 'allow push to HEAD of bare repository (bare)' ' git config core.bare true ) && git push testrepo main 2>stderr && - ! grep "warning: updating the current branch" stderr + test_grep ! "warning: updating the current branch" stderr ' test_expect_success 'allow push to HEAD of non-bare repository (config)' ' @@ -956,7 +956,7 @@ test_expect_success 'allow push to HEAD of non-bare repository (config)' ' git config receive.denyCurrentBranch false ) && git push testrepo main 2>stderr && - ! grep "warning: updating the current branch" stderr + test_grep ! "warning: updating the current branch" stderr ' test_expect_success !WITH_BREAKING_CHANGES 'fetch with branches' ' @@ -1068,7 +1068,7 @@ test_expect_success 'push into aliased refs (inconsistent)' ' git commit -a -m child2 && git branch bar && test_must_fail git push ../child1 foo bar 2>stderr && - grep "refusing inconsistent update" stderr + test_grep "refusing inconsistent update" stderr ) ' @@ -1161,7 +1161,7 @@ test_expect_success 'push --porcelain' ' test_expect_success 'push --porcelain bad url' ' mk_empty testrepo && test_must_fail git push >.git/bar --porcelain asdfasdfasd refs/heads/main:refs/remotes/origin/main && - ! grep -q Done .git/bar + test_grep ! Done .git/bar ' test_expect_success 'push --porcelain rejected' ' diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh index 0e0019347e85e9..4ae3b4fd59908d 100755 --- a/t/t5520-pull.sh +++ b/t/t5520-pull.sh @@ -356,8 +356,8 @@ test_expect_success '--rebase with rebase.autostash succeeds on ff' ' echo "dirty" >>dst/file && test_config -C dst rebase.autostash true && git -C dst pull --rebase >actual 2>&1 && - grep -q "Fast-forward" actual && - grep -q "Applied autostash." actual + test_grep "Fast-forward" actual && + test_grep "Applied autostash." actual ' test_expect_success '--rebase with conflicts shows advice' ' diff --git a/t/t5524-pull-msg.sh b/t/t5524-pull-msg.sh index b2be3605f5a3f0..493156a2b8843f 100755 --- a/t/t5524-pull-msg.sh +++ b/t/t5524-pull-msg.sh @@ -31,7 +31,7 @@ test_expect_success pull ' git pull --no-rebase --log && git log -2 && git cat-file commit HEAD >result && - grep Dollar result + test_grep Dollar result ) ' @@ -44,8 +44,8 @@ test_expect_success '--log=1 limits shortlog length' ' git pull --no-rebase --log=1 && git log -3 && git cat-file commit HEAD >result && - grep Dollar result && - ! grep "second commit" result + test_grep Dollar result && + test_grep ! "second commit" result ) ' diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh index 1242ee918526ea..7b3b7359da0108 100755 --- a/t/t5526-fetch-submodules.sh +++ b/t/t5526-fetch-submodules.sh @@ -199,7 +199,7 @@ test_expect_success "fetch --recurse-submodules -j2 has the same output behaviou ) && test_must_be_empty actual.out && verify_fetch_result actual.err && - grep "2 tasks" trace.out + test_grep "2 tasks" trace.out ' test_expect_success "fetch alone only fetches superproject" ' @@ -723,25 +723,25 @@ test_expect_success 'fetching submodules respects parallel settings' ' ( cd downstream && GIT_TRACE=$(pwd)/trace.out git fetch && - grep "1 tasks" trace.out && + test_grep "1 tasks" trace.out && >trace.out && GIT_TRACE=$(pwd)/trace.out git fetch --jobs 7 && - grep "7 tasks" trace.out && + test_grep "7 tasks" trace.out && >trace.out && git config submodule.fetchJobs 8 && GIT_TRACE=$(pwd)/trace.out git fetch && - grep "8 tasks" trace.out && + test_grep "8 tasks" trace.out && >trace.out && GIT_TRACE=$(pwd)/trace.out git fetch --jobs 9 && - grep "9 tasks" trace.out && + test_grep "9 tasks" trace.out && >trace.out && GIT_TRACE=$(pwd)/trace.out git -c submodule.fetchJobs=0 fetch && - grep "preparing to run up to [0-9]* tasks" trace.out && - ! grep "up to 0 tasks" trace.out && + test_grep "preparing to run up to [0-9]* tasks" trace.out && + test_grep ! "up to 0 tasks" trace.out && >trace.out ) ' @@ -1259,7 +1259,7 @@ test_expect_success "fetch --all with --no-recurse-submodules only fetches super git config submodule.recurse true && git fetch --all --no-recurse-submodules 2>../fetch-log ) && - ! grep "Fetching submodule" fetch-log + test_grep ! "Fetching submodule" fetch-log ' test_done diff --git a/t/t5529-push-errors.sh b/t/t5529-push-errors.sh index 80b06a0cd2886d..35b1f212a8156f 100755 --- a/t/t5529-push-errors.sh +++ b/t/t5529-push-errors.sh @@ -44,14 +44,14 @@ test_expect_success 'detect missing sha1 expressions early' ' # 'builtin/push.c:set_refspecs()' and we want to test that regression. test_expect_success 'detect empty remote with existing local ref' ' test_must_fail git push "" main 2> stderr && - grep "fatal: bad repository ${SQ}${SQ}" stderr + test_grep "fatal: bad repository ${SQ}${SQ}" stderr ' # While similar to the previous test, here we want to ensure that # even targeted refspecs are handled. test_expect_success 'detect empty remote with targeted refspec' ' test_must_fail git push "" HEAD:refs/heads/main 2> stderr && - grep "fatal: bad repository ${SQ}${SQ}" stderr + test_grep "fatal: bad repository ${SQ}${SQ}" stderr ' test_expect_success 'detect ambiguous refs early' ' diff --git a/t/t5530-upload-pack-error.sh b/t/t5530-upload-pack-error.sh index d40292cfb7b48f..25d409fc94d2be 100755 --- a/t/t5530-upload-pack-error.sh +++ b/t/t5530-upload-pack-error.sh @@ -44,16 +44,16 @@ test_expect_success 'upload-pack fails due to error in rev-list' ' $(($hexsz + 10)) $(git rev-parse HEAD) \ $(($hexsz + 12)) $(git rev-parse HEAD^) >input && test_must_fail git upload-pack . /dev/null 2>output.err && - grep "bad tree object" output.err + test_grep "bad tree object" output.err ' test_expect_success 'upload-pack fails due to bad want (no object)' ' printf "%04xwant %s multi_ack_detailed\n00000009done\n0000" \ $(($hexsz + 29)) $(test_oid deadbeef) >input && test_must_fail git upload-pack . output 2>output.err && - grep "not our ref" output.err && - grep "ERR" output && - ! grep multi_ack_detailed output.err + test_grep "not our ref" output.err && + test_grep "ERR" output && + test_grep ! multi_ack_detailed output.err ' test_expect_success 'upload-pack fails due to bad want (not tip)' ' @@ -61,17 +61,17 @@ test_expect_success 'upload-pack fails due to bad want (not tip)' ' printf "%04xwant %s multi_ack_detailed\n00000009done\n0000" \ $(($hexsz + 29)) "$oid" >input && test_must_fail git upload-pack . output 2>output.err && - grep "not our ref" output.err && - grep "ERR" output && - ! grep multi_ack_detailed output.err + test_grep "not our ref" output.err && + test_grep "ERR" output && + test_grep ! multi_ack_detailed output.err ' test_expect_success 'upload-pack fails due to error in pack-objects enumeration' ' printf "%04xwant %s\n00000009done\n0000" \ $((hexsz + 10)) $(git rev-parse HEAD) >input && test_must_fail git upload-pack . /dev/null 2>output.err && - grep "bad tree object" output.err && - grep "pack-objects died" output.err + test_grep "bad tree object" output.err && + test_grep "pack-objects died" output.err ' test_expect_success 'upload-pack tolerates EOF just after stateless client wants' ' diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh index 05debd1134db49..7d239dd31f5ef6 100755 --- a/t/t5531-deep-submodule-push.sh +++ b/t/t5531-deep-submodule-push.sh @@ -559,7 +559,7 @@ test_expect_success 'push with push.recurseSubmodules=only on superproject and t test_must_fail git -C upstream rev-parse refs/heads/downstream-branch && git -C upstream/sub rev-parse refs/heads/downstream-branch && git -C upstream/sub/deepsub rev-parse refs/heads/downstream-branch && - grep "recursing into submodule with push.recurseSubmodules=only; using on-demand instead" err + test_grep "recursing into submodule with push.recurseSubmodules=only; using on-demand instead" err ' test_expect_success 'push propagating the remotes name to a submodule' ' diff --git a/t/t5532-fetch-proxy.sh b/t/t5532-fetch-proxy.sh index 95d0f33b29531c..ccbca7c2f28e97 100755 --- a/t/t5532-fetch-proxy.sh +++ b/t/t5532-fetch-proxy.sh @@ -52,7 +52,7 @@ test_expect_success 'fetch through proxy works' ' test_expect_success 'funny hostnames are rejected before running proxy' ' test_must_fail git fetch git://-remote/repo.git 2>stderr && - ! grep "proxying for" stderr + test_grep ! "proxying for" stderr ' test_done diff --git a/t/t5533-push-cas.sh b/t/t5533-push-cas.sh index cba26a872dde46..2e14aecaa2ba29 100755 --- a/t/t5533-push-cas.sh +++ b/t/t5533-push-cas.sh @@ -69,7 +69,7 @@ test_expect_success 'push to update (protected)' ' cd dst && test_commit D && test_must_fail git push --force-with-lease=main:main origin main 2>err && - grep "stale info" err + test_grep "stale info" err ) && git ls-remote . refs/heads/main >expect && git ls-remote src refs/heads/main >actual && @@ -82,7 +82,7 @@ test_expect_success 'push to update (protected, forced)' ' cd dst && test_commit D && git push --force --force-with-lease=main:main origin main 2>err && - grep "forced update" err + test_grep "forced update" err ) && git ls-remote dst refs/heads/main >expect && git ls-remote src refs/heads/main >actual && @@ -147,7 +147,7 @@ test_expect_success 'push to update (allowed, tracking)' ' cd dst && test_commit D && git push --force-with-lease=main origin main 2>err && - ! grep "forced update" err + test_grep ! "forced update" err ) && git ls-remote dst refs/heads/main >expect && git ls-remote src refs/heads/main >actual && @@ -161,7 +161,7 @@ test_expect_success 'push to update (allowed even though no-ff)' ' git reset --hard HEAD^ && test_commit D && git push --force-with-lease=main origin main 2>err && - grep "forced update" err + test_grep "forced update" err ) && git ls-remote dst refs/heads/main >expect && git ls-remote src refs/heads/main >actual && @@ -194,7 +194,7 @@ test_expect_success 'push to delete (allowed)' ' ( cd dst && git push --force-with-lease=main origin :main 2>err && - grep deleted err + test_grep deleted err ) && git ls-remote src refs/heads/main >actual && test_must_be_empty actual @@ -350,7 +350,7 @@ test_expect_success '"--force-if-includes" should be disabled for --force-with-l remote_head="$(git rev-parse refs/remotes/origin/main)" && git fetch --all && test_must_fail git push --force-if-includes --force-with-lease="main:$remote_head" 2>err && - grep "stale info" err + test_grep "stale info" err ) && git ls-remote dst refs/heads/main >actual.main && test_cmp expect.main actual.main diff --git a/t/t5534-push-signed.sh b/t/t5534-push-signed.sh index 2a782214ee1f64..21f0262cbdf09a 100755 --- a/t/t5534-push-signed.sh +++ b/t/t5534-push-signed.sh @@ -126,8 +126,8 @@ test_expect_success GPG 'signed push sends push certificate' ' noop=$(git rev-parse noop) && ff=$(git rev-parse ff) && noff=$(git rev-parse noff) && - grep "$noop $ff refs/heads/ff" dst/push-cert && - grep "$noop $noff refs/heads/noff" dst/push-cert && + test_grep "$noop $ff refs/heads/ff" dst/push-cert && + test_grep "$noop $noff refs/heads/noff" dst/push-cert && test_cmp expect dst/push-cert-status ' @@ -172,8 +172,8 @@ test_expect_success GPGSSH 'ssh signed push sends push certificate' ' noop=$(git rev-parse noop) && ff=$(git rev-parse ff) && noff=$(git rev-parse noff) && - grep "$noop $ff refs/heads/ff" dst/push-cert && - grep "$noop $noff refs/heads/noff" dst/push-cert && + test_grep "$noop $ff refs/heads/ff" dst/push-cert && + test_grep "$noop $noff refs/heads/noff" dst/push-cert && test_cmp expect dst/push-cert-status ' @@ -211,7 +211,7 @@ test_expect_success GPG 'inconsistent push options in signed push not allowed' ' git -C dst config receive.advertisepushoptions 1 && git receive-pack dst out && git -C dst rev-parse ff && - grep "inconsistent push options" out + test_grep "inconsistent push options" out ' test_expect_success GPG 'fail without key and heed user.signingkey' ' @@ -257,8 +257,8 @@ test_expect_success GPG 'fail without key and heed user.signingkey' ' noop=$(git rev-parse noop) && ff=$(git rev-parse ff) && noff=$(git rev-parse noff) && - grep "$noop $ff refs/heads/ff" dst/push-cert && - grep "$noop $noff refs/heads/noff" dst/push-cert && + test_grep "$noop $ff refs/heads/ff" dst/push-cert && + test_grep "$noop $noff refs/heads/noff" dst/push-cert && test_cmp expect dst/push-cert-status ' @@ -309,8 +309,8 @@ test_expect_success GPGSM 'fail without key and heed user.signingkey x509' ' noop=$(git rev-parse noop) && ff=$(git rev-parse ff) && noff=$(git rev-parse noff) && - grep "$noop $ff refs/heads/ff" dst/push-cert && - grep "$noop $noff refs/heads/noff" dst/push-cert && + test_grep "$noop $ff refs/heads/ff" dst/push-cert && + test_grep "$noop $noff refs/heads/noff" dst/push-cert && test_cmp expect dst/push-cert-status ' @@ -362,8 +362,8 @@ test_expect_success GPGSSH 'fail without key and heed user.signingkey ssh' ' noop=$(git rev-parse noop) && ff=$(git rev-parse ff) && noff=$(git rev-parse noff) && - grep "$noop $ff refs/heads/ff" dst/push-cert && - grep "$noop $noff refs/heads/noff" dst/push-cert && + test_grep "$noop $ff refs/heads/ff" dst/push-cert && + test_grep "$noop $noff refs/heads/noff" dst/push-cert && test_cmp expect dst/push-cert-status ' diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh index 9982dd2aa6d499..f323ceebd2a7c2 100755 --- a/t/t5537-fetch-shallow.sh +++ b/t/t5537-fetch-shallow.sh @@ -244,7 +244,7 @@ test_expect_success '.git/shallow is edited by repack' ' origin "+refs/heads/*:refs/remotes/origin/*" && git -C shallow-client repack -adfl && test_must_fail git -C shallow-client rev-parse --verify $d^0 && - ! grep $d shallow-client/.git/shallow && + test_grep ! $d shallow-client/.git/shallow && git -C shallow-server branch branch-orig $d && git -C shallow-client fetch --prune --depth=2 \ diff --git a/t/t5538-push-shallow.sh b/t/t5538-push-shallow.sh index dc0e972943a6f6..afab456b327049 100755 --- a/t/t5538-push-shallow.sh +++ b/t/t5538-push-shallow.sh @@ -65,7 +65,7 @@ test_expect_success 'push from shallow clone, with grafted roots' ' ( cd shallow2 && test_must_fail git push ../.git +main:refs/remotes/shallow2/main 2>err && - grep "shallow2/main.*shallow update not allowed" err + test_grep "shallow2/main.*shallow update not allowed" err ) && test_must_fail git rev-parse shallow2/main && git fsck diff --git a/t/t5539-fetch-http-shallow.sh b/t/t5539-fetch-http-shallow.sh index 3ea75d34ca0e7a..44e6f609dff761 100755 --- a/t/t5539-fetch-http-shallow.sh +++ b/t/t5539-fetch-http-shallow.sh @@ -76,8 +76,8 @@ test_expect_success 'no shallow lines after receiving ACK ready' ' # might be able to run this test in all protocol versions. GIT_TRACE_PACKET="$TRASH_DIRECTORY/trace" GIT_TEST_PROTOCOL_VERSION=0 \ git fetch --depth=2 && - grep "fetch-pack< ACK .* ready" ../trace && - ! grep "fetch-pack> done" ../trace + test_grep "fetch-pack< ACK .* ready" ../trace && + test_grep ! "fetch-pack> done" ../trace ) ' diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh index 538b603f03a1f8..8c348330277907 100755 --- a/t/t5541-http-push-smart.sh +++ b/t/t5541-http-push-smart.sh @@ -56,8 +56,8 @@ test_expect_success 'push to remote repository (standard)' ' git commit -m path2 && HEAD=$(git rev-parse --verify HEAD) && GIT_TRACE_CURL=true git push -v -v 2>err && - ! grep "Expect: 100-continue" err && - grep "POST git-receive-pack ([0-9]* bytes)" err && + test_grep ! "Expect: 100-continue" err && + test_grep "POST git-receive-pack ([0-9]* bytes)" err && (cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git && test $HEAD = $(git rev-parse --verify HEAD)) ' @@ -84,7 +84,7 @@ test_expect_success 'push to remote repository (standard) with sending Accept-La git commit -m path_lang && HEAD=$(git rev-parse --verify HEAD) && GIT_TRACE_CURL=true LANGUAGE="ko_KR.UTF-8" git push -v -v 2>err && - ! grep "Expect: 100-continue" err && + test_grep ! "Expect: 100-continue" err && grep "=> Send header: Accept-Language:" err >err.language && test_cmp exp err.language @@ -148,8 +148,8 @@ test_expect_success 'push fails for non-fast-forward refs unmatched by remote he test_must_fail git push -v origin +main main:niam >output 2>&1' test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper: remote output' ' - grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *main -> main (forced update)$" output && - grep "^ ! \[rejected\] *main -> niam (non-fast-forward)$" output + test_grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *main -> main (forced update)$" output && + test_grep "^ ! \[rejected\] *main -> niam (non-fast-forward)$" output ' test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper: our output' ' @@ -163,7 +163,7 @@ test_expect_success 'push (chunked)' ' HEAD=$(git rev-parse --verify HEAD) && test_config http.postbuffer 4 && git push -v -v origin $BRANCH 2>err && - grep "POST git-receive-pack (chunked)" err && + test_grep "POST git-receive-pack (chunked)" err && (cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git && test $HEAD = $(git rev-parse --verify HEAD)) ' @@ -215,15 +215,15 @@ test_expect_success 'push --atomic also prevents branch creation, reports collat test_cmp expected actual && # the failed refs should be indicated to the user - grep "^ ! .*rejected.* main -> main" output && + test_grep "^ ! .*rejected.* main -> main" output && # the collateral failure refs should be indicated to the user - grep "^ ! .*rejected.* atomic -> atomic .*atomic push failed" output && - grep "^ ! .*rejected.* collateral -> collateral .*atomic push failed" output && + test_grep "^ ! .*rejected.* atomic -> atomic .*atomic push failed" output && + test_grep "^ ! .*rejected.* collateral -> collateral .*atomic push failed" output && # never report what we do not push - ! grep "^ ! .*rejected.* atomic1 " output && - ! grep "^ ! .*rejected.* other " output + test_grep ! "^ ! .*rejected.* atomic1 " output && + test_grep ! "^ ! .*rejected.* other " output ' test_expect_success 'push --atomic fails on server-side errors' ' @@ -247,10 +247,10 @@ test_expect_success 'push --atomic fails on server-side errors' ' test_must_fail git -C "$d" show-ref --verify refs/heads/other && # the failed refs should be indicated to the user - grep "^ ! .*rejected.* other -> other .*atomic transaction failed" output && + test_grep "^ ! .*rejected.* other -> other .*atomic transaction failed" output && # the collateral failure refs should be indicated to the user - grep "^ ! .*rejected.* atomic -> atomic .*atomic transaction failed" output + test_grep "^ ! .*rejected.* atomic -> atomic .*atomic transaction failed" output ' test_expect_success 'push --all can push to empty repo' ' @@ -442,7 +442,7 @@ test_expect_success 'push status output scrubs password' ' "$HTTPD_URL_USER_PASS/smart/test_repo.git" \ +HEAD:scrub >status && # should have been scrubbed down to vanilla URL - grep "^To $HTTPD_URL/smart/test_repo.git" status + test_grep "^To $HTTPD_URL/smart/test_repo.git" status ' test_expect_success 'clone/fetch scrubs password from reflogs' ' @@ -456,8 +456,8 @@ test_expect_success 'clone/fetch scrubs password from reflogs' ' +main:main && # should have been scrubbed down to vanilla URL git log -g main >reflog && - grep "$HTTPD_URL" reflog && - ! grep "$HTTPD_URL_USER_PASS" reflog + test_grep "$HTTPD_URL" reflog && + test_grep ! "$HTTPD_URL_USER_PASS" reflog ' test_expect_success 'Non-ASCII branch name can be used with --force-with-lease' ' diff --git a/t/t5544-pack-objects-hook.sh b/t/t5544-pack-objects-hook.sh index 89147a052e72cd..908d3b8ebea08d 100755 --- a/t/t5544-pack-objects-hook.sh +++ b/t/t5544-pack-objects-hook.sh @@ -27,7 +27,7 @@ test_expect_success 'hook runs via global config' ' clear_hook_results && test_config_global uploadpack.packObjectsHook ./hook && git clone --no-local . dst.git 2>stderr && - grep "hook running" stderr + test_grep "hook running" stderr ' test_expect_success 'hook outputs are sane' ' @@ -38,7 +38,7 @@ test_expect_success 'hook outputs are sane' ' # the full argument list or the exact pack contents, as it would make # the test brittle. So just sanity check that we could replay # the packing procedure. - grep "^git" .git/hook.args && + test_grep "^git" .git/hook.args && $(cat .git/hook.args) <.git/hook.stdin >replay ' @@ -47,14 +47,14 @@ test_expect_success 'hook runs from -c config' ' git clone --no-local \ -u "git -c uploadpack.packObjectsHook=./hook upload-pack" \ . dst.git 2>stderr && - grep "hook running" stderr + test_grep "hook running" stderr ' test_expect_success 'hook does not run from repo config' ' clear_hook_results && test_config uploadpack.packObjectsHook "./hook" && git clone --no-local . dst.git 2>stderr && - ! grep "hook running" stderr && + test_grep ! "hook running" stderr && test_path_is_missing .git/hook.args && test_path_is_missing .git/hook.stdin && test_path_is_missing .git/hook.stdout && @@ -62,7 +62,7 @@ test_expect_success 'hook does not run from repo config' ' # check that global config is used instead test_config_global uploadpack.packObjectsHook ./hook && git clone --no-local . dst2.git 2>stderr && - grep "hook running" stderr + test_grep "hook running" stderr ' test_expect_success 'hook works with partial clone' ' @@ -72,7 +72,7 @@ test_expect_success 'hook works with partial clone' ' git clone --bare --no-local --filter=blob:none . dst.git && git -C dst.git rev-list --objects --missing=allow-any --no-object-names --all >objects && git -C dst.git cat-file --batch-check="%(objecttype)" types && - ! grep blob types + test_grep ! blob types ' test_done diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh index b0080bf2047899..f00eeae48f8554 100755 --- a/t/t5550-http-fetch-dumb.sh +++ b/t/t5550-http-fetch-dumb.sh @@ -124,7 +124,7 @@ test_expect_success 'netrc authorized but forbidden credentials (fail on 403)' ' set_netrc 127.0.0.1 forbidden-user@host pass@host && test_must_fail git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-netrc-403 2>err && expect_askpass none && - grep "The requested URL returned error: 403" err + test_grep "The requested URL returned error: 403" err ' test_expect_success 'http auth can use user/pass in URL' ' @@ -280,7 +280,7 @@ test_expect_success 'http-fetch --packfile' ' --index-pack-arg=--keep \ "$HTTPD_URL"/dumb/repo_pack.git/$p >out && - grep -E "^keep.[0-9a-f]{16,}$" out && + test_grep -E "^keep.[0-9a-f]{16,}$" out && cut -c6- out >packhash && # Ensure that the expected files are generated diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh index e236e526f0defb..76d3060fcaddc0 100755 --- a/t/t5551-http-fetch-smart.sh +++ b/t/t5551-http-fetch-smart.sh @@ -164,8 +164,8 @@ test_expect_success 'fetch changes via http' ' test_expect_success 'used upload-pack service' ' strip_access_log >log && - grep "GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/[0-9.]* 200" log && - grep "POST /smart/repo.git/git-upload-pack HTTP/[0-9.]* 200" log + test_grep "GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/[0-9.]* 200" log && + test_grep "POST /smart/repo.git/git-upload-pack HTTP/[0-9.]* 200" log ' test_expect_success 'follow redirects (301)' ' @@ -264,8 +264,8 @@ test_expect_success 'GIT_TRACE_CURL redacts auth details' ' # Ensure that there is no "Basic" followed by a base64 string, but that # the auth details are redacted - ! grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace && - grep -i "Authorization: Basic " trace + test_grep ! -i "Authorization: Basic [0-9a-zA-Z+/]" trace && + test_grep -i "Authorization: Basic " trace ' test_expect_success 'GIT_CURL_VERBOSE redacts auth details' ' @@ -276,8 +276,8 @@ test_expect_success 'GIT_CURL_VERBOSE redacts auth details' ' # Ensure that there is no "Basic" followed by a base64 string, but that # the auth details are redacted - ! grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace && - grep -i "Authorization: Basic " trace + test_grep ! -i "Authorization: Basic [0-9a-zA-Z+/]" trace && + test_grep -i "Authorization: Basic " trace ' test_expect_success 'GIT_TRACE_CURL does not redact auth details if GIT_TRACE_REDACT=0' ' @@ -287,7 +287,7 @@ test_expect_success 'GIT_TRACE_CURL does not redact auth details if GIT_TRACE_RE git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth && expect_askpass both user%40host && - grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace + test_grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace ' test_expect_success 'disable dumb http on server' ' @@ -418,7 +418,7 @@ test_expect_success 'large fetch-pack requests can be sent using chunked encodin clone --bare "$HTTPD_URL/smart/repo.git" split.git 2>err && { test_have_prereq HTTP2 || - grep "^=> Send header: Transfer-Encoding: chunked" err + test_grep "^=> Send header: Transfer-Encoding: chunked" err } ' @@ -553,10 +553,10 @@ test_expect_success 'cookies are redacted by default' ' GIT_TRACE_CURL=true \ git -c "http.cookieFile=$(pwd)/cookies" clone \ $HTTPD_URL/smart/repo.git clone 2>err && - grep -i "Cookie:.*Foo=" err && - grep -i "Cookie:.*Bar=" err && - ! grep -i "Cookie:.*Foo=1" err && - ! grep -i "Cookie:.*Bar=2" err + test_grep -i "Cookie:.*Foo=" err && + test_grep -i "Cookie:.*Bar=" err && + test_grep ! -i "Cookie:.*Foo=1" err && + test_grep ! -i "Cookie:.*Bar=2" err ' test_expect_success 'empty values of cookies are also redacted' ' @@ -565,7 +565,7 @@ test_expect_success 'empty values of cookies are also redacted' ' GIT_TRACE_CURL=true \ git -c "http.cookieFile=$(pwd)/cookies" clone \ $HTTPD_URL/smart/repo.git clone 2>err && - grep -i "Cookie:.*Foo=" err + test_grep -i "Cookie:.*Foo=" err ' test_expect_success 'GIT_TRACE_REDACT=0 disables cookie redaction' ' @@ -575,20 +575,20 @@ test_expect_success 'GIT_TRACE_REDACT=0 disables cookie redaction' ' GIT_TRACE_REDACT=0 GIT_TRACE_CURL=true \ git -c "http.cookieFile=$(pwd)/cookies" clone \ $HTTPD_URL/smart/repo.git clone 2>err && - grep -i "Cookie:.*Foo=1" err && - grep -i "Cookie:.*Bar=2" err + test_grep -i "Cookie:.*Foo=1" err && + test_grep -i "Cookie:.*Bar=2" err ' test_expect_success 'GIT_TRACE_CURL_NO_DATA prevents data from being traced' ' rm -rf clone && GIT_TRACE_CURL=true \ git clone $HTTPD_URL/smart/repo.git clone 2>err && - grep "=> Send data" err && + test_grep "=> Send data" err && rm -rf clone && GIT_TRACE_CURL=true GIT_TRACE_CURL_NO_DATA=1 \ git clone $HTTPD_URL/smart/repo.git clone 2>err && - ! grep "=> Send data" err + test_grep ! "=> Send data" err ' test_expect_success 'server-side error detected' ' @@ -643,7 +643,7 @@ test_expect_success 'client falls back from v2 to v0 to match server' ' git clone $HTTPD_URL/smart_v0/repo.git repo-v0 && # check for v0; there the HEAD symref is communicated in the capability # line; v2 uses a different syntax on each ref advertisement line - grep symref=HEAD:refs/heads/ trace + test_grep symref=HEAD:refs/heads/ trace ' test_expect_success 'create empty http-accessible SHA-256 repository' ' @@ -691,7 +691,7 @@ test_expect_success 'clone warns or fails when using username:password' ' git -c transfer.credentialsInUrl=allow \ clone $url_userpass attempt1 2>err && - ! grep "$message" err && + test_grep ! "$message" err && git -c transfer.credentialsInUrl=warn \ clone $url_userpass attempt2 2>err && @@ -720,12 +720,12 @@ test_expect_success 'clone does not detect username:password when it is https:// esac && git -c transfer.credentialsInUrl=warn clone $url_user attempt1 2>err && - ! grep "uses plaintext credentials" err + test_grep ! "uses plaintext credentials" err ' test_expect_success 'fetch warns or fails when using username:password' ' git -c transfer.credentialsInUrl=allow fetch $url_userpass 2>err && - ! grep "$message" err && + test_grep ! "$message" err && git -c transfer.credentialsInUrl=warn fetch $url_userpass 2>err && grep "warning: $message" err >warnings && @@ -745,7 +745,7 @@ test_expect_success 'fetch warns or fails when using username:password' ' test_expect_success 'push warns or fails when using username:password' ' git -c transfer.credentialsInUrl=allow push $url_userpass 2>err && - ! grep "$message" err && + test_grep ! "$message" err && git -c transfer.credentialsInUrl=warn push $url_userpass 2>err && grep "warning: $message" err >warnings && @@ -762,7 +762,7 @@ test_expect_success 'no empty path components' ' git clone $HTTPD_URL/smart/repo.git/ clone-with-slash && strip_access_log >log && - ! grep "//" log + test_grep ! "//" log ' test_expect_success 'tag following always works over v0 http' ' diff --git a/t/t5552-skipping-fetch-negotiator.sh b/t/t5552-skipping-fetch-negotiator.sh index eeddb85b1deaea..96e224168eb9f5 100755 --- a/t/t5552-skipping-fetch-negotiator.sh +++ b/t/t5552-skipping-fetch-negotiator.sh @@ -201,7 +201,7 @@ test_expect_success 'do not send "have" with ancestors of commits that server AC export GIT_TEST_PROTOCOL_VERSION && trace_fetch client "$(pwd)/server" to_fetch ) && - grep " fetch" trace && + test_grep " fetch" trace && # fetch-pack sends 2 requests each containing 16 "have" lines before # processing the first response. In these 2 requests, 4 commits from @@ -211,8 +211,8 @@ test_expect_success 'do not send "have" with ancestors of commits that server AC # While fetch-pack is processing the first response, it should read that # the server ACKs b1.c19 and b1.c17. - grep "fetch< ACK $(git -C client rev-parse b1.c19) common" trace && - grep "fetch< ACK $(git -C client rev-parse b1.c17) common" trace && + test_grep "fetch< ACK $(git -C client rev-parse b1.c19) common" trace && + test_grep "fetch< ACK $(git -C client rev-parse b1.c17) common" trace && # fetch-pack should thus not send any more commits in the b1 branch, but # should still send the others (in this test, just check b2). diff --git a/t/t5554-noop-fetch-negotiator.sh b/t/t5554-noop-fetch-negotiator.sh index 17e73b606d5324..d50ffe55b6b755 100755 --- a/t/t5554-noop-fetch-negotiator.sh +++ b/t/t5554-noop-fetch-negotiator.sh @@ -16,8 +16,8 @@ test_expect_success 'noop negotiator does not emit any "have"' ' test_config -C client fetch.negotiationalgorithm noop && GIT_TRACE_PACKET="$(pwd)/trace" git -C client fetch "$(pwd)/server" && - ! grep "fetch> have" trace && - grep "fetch> done" trace + test_grep ! "fetch> have" trace && + test_grep "fetch> done" trace ' test_done diff --git a/t/t5557-http-get.sh b/t/t5557-http-get.sh index 67fcc23f1105c1..e8ffe3f8e9714b 100755 --- a/t/t5557-http-get.sh +++ b/t/t5557-http-get.sh @@ -18,7 +18,7 @@ test_expect_success 'get by URL: 404' ' test_must_fail git remote-http $url err && test_path_is_missing file1 && - grep "failed to download file at URL" err + test_grep "failed to download file at URL" err ' test_expect_success 'get by URL: 200' ' diff --git a/t/t5558-clone-bundle-uri.sh b/t/t5558-clone-bundle-uri.sh index 7a0943bd365a1a..0d5be0d56e5d0e 100755 --- a/t/t5558-clone-bundle-uri.sh +++ b/t/t5558-clone-bundle-uri.sh @@ -8,14 +8,14 @@ test_description='test fetching bundles with --bundle-uri' test_expect_success 'fail to clone from non-existent file' ' test_when_finished rm -rf test && git clone --bundle-uri="$(pwd)/does-not-exist" . test 2>err && - grep "failed to download bundle from URI" err + test_grep "failed to download bundle from URI" err ' test_expect_success 'fail to clone from non-bundle file' ' test_when_finished rm -rf test && echo bogus >bogus && git clone --bundle-uri="$(pwd)/bogus" . test 2>err && - grep "is not a bundle" err + test_grep "is not a bundle" err ' test_expect_success 'create bundle' ' @@ -197,7 +197,7 @@ test_expect_success 'clone bundle list (file, no heuristic)' ' git clone --bundle-uri="file://$(pwd)/bundle-list" \ clone-from clone-list-file 2>err && - ! grep "Repository lacks these prerequisite commits" err && + test_grep ! "Repository lacks these prerequisite commits" err && git -C clone-from for-each-ref --format="%(objectname)" >oids && git -C clone-list-file cat-file --batch-check err && - ! grep "Repository lacks these prerequisite commits" err && - ! grep "fatal" err && - grep "warning: failed to download bundle from URI" err && + test_grep ! "Repository lacks these prerequisite commits" err && + test_grep ! "fatal" err && + test_grep "warning: failed to download bundle from URI" err && git -C clone-from for-each-ref --format="%(objectname)" >oids && git -C clone-all-some cat-file --batch-check err && - ! grep "Repository lacks these prerequisite commits" err && - ! grep "fatal" err && - grep "warning: failed to download bundle from URI" err && + test_grep ! "Repository lacks these prerequisite commits" err && + test_grep ! "fatal" err && + test_grep "warning: failed to download bundle from URI" err && git -C clone-from for-each-ref --format="%(objectname)" >oids && git -C clone-all-fail cat-file --batch-check refs && - ! grep "refs/bundles/heads/" refs + test_grep ! "refs/bundles/heads/" refs ' test_expect_success 'clone bundle list (file, any mode)' ' @@ -306,7 +306,7 @@ test_expect_success 'clone bundle list (file, any mode)' ' git clone --bundle-uri="file://$(pwd)/bundle-list" \ clone-from clone-any-file 2>err && - ! grep "Repository lacks these prerequisite commits" err && + test_grep ! "Repository lacks these prerequisite commits" err && git -C clone-from for-each-ref --format="%(objectname)" >oids && git -C clone-any-file cat-file --batch-check err && - ! grep "fatal" err && - grep "warning: failed to download bundle from URI" err && + test_grep ! "fatal" err && + test_grep "warning: failed to download bundle from URI" err && git -C clone-from for-each-ref --format="%(objectname)" >oids && git -C clone-any-fail cat-file --batch-check refs && - ! grep "refs/bundles/heads/" refs + test_grep ! "refs/bundles/heads/" refs ' test_expect_success 'negotiation: bundle with part of wanted commits' ' @@ -477,14 +477,14 @@ start_httpd test_expect_success 'fail to fetch from non-existent HTTP URL' ' test_when_finished rm -rf test && git clone --bundle-uri="$HTTPD_URL/does-not-exist" . test 2>err && - grep "failed to download bundle from URI" err + test_grep "failed to download bundle from URI" err ' test_expect_success 'fail to fetch from non-bundle HTTP URL' ' test_when_finished rm -rf test && echo bogus >"$HTTPD_DOCUMENT_ROOT_PATH/bogus" && git clone --bundle-uri="$HTTPD_URL/bogus" . test 2>err && - grep "is not a bundle" err + test_grep "is not a bundle" err ' test_expect_success 'clone HTTP bundle' ' @@ -536,7 +536,7 @@ test_expect_success 'clone bundle list (HTTP, no heuristic)' ' GIT_TRACE2_EVENT="$(pwd)/trace-clone.txt" \ git clone --bundle-uri="$HTTPD_URL/bundle-list" \ clone-from clone-list-http 2>err && - ! grep "Repository lacks these prerequisite commits" err && + test_grep ! "Repository lacks these prerequisite commits" err && git -C clone-from for-each-ref --format="%(objectname)" >oids && git -C clone-list-http cat-file --batch-check err && - ! grep "fatal" err && - grep "warning: failed to download bundle from URI" err && + test_grep ! "fatal" err && + test_grep "warning: failed to download bundle from URI" err && git -C clone-from for-each-ref --format="%(objectname)" >oids && git -C clone-any-http cat-file --batch-check /dev/null 2>err && - grep "fatal:.*CONTENT_LENGTH" err + test_grep "fatal:.*CONTENT_LENGTH" err ' test_expect_success 'empty CONTENT_LENGTH' ' diff --git a/t/t5564-http-proxy.sh b/t/t5564-http-proxy.sh index 817cd1f98418d3..866e2b4e93560b 100755 --- a/t/t5564-http-proxy.sh +++ b/t/t5564-http-proxy.sh @@ -20,14 +20,14 @@ setup_askpass_helper test_expect_success 'proxy requires password' ' test_config_global http.proxy $HTTPD_DEST && test_must_fail git clone $HTTPD_URL/smart/repo.git 2>err && - grep "error.*407" err + test_grep "error.*407" err ' test_expect_success 'clone through proxy with auth' ' test_when_finished "rm -rf clone" && test_config_global http.proxy http://proxuser:proxpass@$HTTPD_DEST && GIT_TRACE_CURL=$PWD/trace git clone $HTTPD_URL/smart/repo.git clone && - grep -i "Proxy-Authorization: Basic " trace + test_grep -i "Proxy-Authorization: Basic " trace ' test_expect_success 'clone can prompt for proxy password' ' @@ -82,7 +82,7 @@ test_expect_success SOCKS_PROXY 'clone via Unix socket' ' GIT_TRACE_CURL=$PWD/trace \ GIT_TRACE_CURL_COMPONENTS=socks \ git clone "$HTTPD_URL/smart/repo.git" clone 2>err && - grep -i "SOCKS4 request granted" trace + test_grep -i "SOCKS4 request granted" trace } || old_libcurl_error err } @@ -90,14 +90,14 @@ test_expect_success SOCKS_PROXY 'clone via Unix socket' ' test_expect_success 'Unix socket requires socks*:' - <<\EOT ! git clone -c http.proxy=localhost/path https://example.com/repo.git 2>err && { - grep -Fx "fatal: Invalid proxy URL 'localhost/path': only SOCKS proxies support paths" err || + test_grep -Fx "fatal: Invalid proxy URL 'localhost/path': only SOCKS proxies support paths" err || old_libcurl_error err } EOT test_expect_success 'Unix socket requires localhost' - <<\EOT ! git clone -c http.proxy=socks4://127.0.0.1/path https://example.com/repo.git 2>err && { - grep -Fx "fatal: Invalid proxy URL 'socks4://127.0.0.1/path': host must be localhost if a path is present" err || + test_grep -Fx "fatal: Invalid proxy URL 'socks4://127.0.0.1/path': host must be localhost if a path is present" err || old_libcurl_error err } EOT diff --git a/t/t5581-http-curl-verbose.sh b/t/t5581-http-curl-verbose.sh index cded79c16b5d60..6788cf817180e3 100755 --- a/t/t5581-http-curl-verbose.sh +++ b/t/t5581-http-curl-verbose.sh @@ -23,7 +23,7 @@ test_expect_success 'failure in git-upload-pack is shown' ' test_might_fail env GIT_CURL_VERBOSE=1 \ git clone "$HTTPD_URL/error_git_upload_pack/smart/repo.git" \ 2>curl_log && - grep "<= Recv header: HTTP/1.1 500 Intentional Breakage" curl_log + test_grep "<= Recv header: HTTP/1.1 500 Intentional Breakage" curl_log ' test_done diff --git a/t/t5583-push-branches.sh b/t/t5583-push-branches.sh index e7e1b6dab66fb3..1ccfaee75ae75f 100755 --- a/t/t5583-push-branches.sh +++ b/t/t5583-push-branches.sh @@ -60,21 +60,21 @@ test_expect_success '--all or --branches can not be combined with refspecs' ' test_must_fail git push remote-1 --all main >actual.all 2>&1 && test_must_fail git push remote-1 --branches main >actual.branches 2>&1 && test_cmp actual.all actual.branches && - grep "be combined with refspecs" actual.all + test_grep "be combined with refspecs" actual.all ' test_expect_success '--all or --branches can not be combined with --mirror' ' test_must_fail git push remote-1 --all --mirror >actual.all 2>&1 && test_must_fail git push remote-1 --branches --mirror >actual.branches 2>&1 && test_cmp actual.all actual.branches && - grep "cannot be used together" actual.all + test_grep "cannot be used together" actual.all ' test_expect_success '--all or --branches can not be combined with --tags' ' test_must_fail git push remote-1 --all --tags >actual.all 2>&1 && test_must_fail git push remote-1 --branches --tags >actual.branches 2>&1 && test_cmp actual.all actual.branches && - grep "cannot be used together" actual.all + test_grep "cannot be used together" actual.all ' @@ -82,7 +82,7 @@ test_expect_success '--all or --branches can not be combined with --delete' ' test_must_fail git push remote-1 --all --delete >actual.all 2>&1 && test_must_fail git push remote-1 --branches --delete >actual.branches 2>&1 && test_cmp actual.all actual.branches && - grep "cannot be used together" actual.all + test_grep "cannot be used together" actual.all ' test_expect_success '--all or --branches combines with --follow-tags have same behavior' ' diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index 3dd229c1867244..b6167582a185c0 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -159,8 +159,8 @@ test_expect_success 'clone --mirror does not repeat tags' ' git clone --mirror src mirror2 && (cd mirror2 && git show-ref 2> clone.err > clone.out) && - ! grep Duplicate mirror2/clone.err && - grep some-tag mirror2/clone.out + test_grep ! Duplicate mirror2/clone.err && + test_grep some-tag mirror2/clone.out ' @@ -224,12 +224,12 @@ test_expect_success 'clone a void' ' cd src-0 && git init ) && git clone "file://$(pwd)/src-0" target-6 2>err-6 && - ! grep "fatal:" err-6 && + test_grep ! "fatal:" err-6 && ( cd src-0 && test_commit A ) && git clone "file://$(pwd)/src-0" target-7 2>err-7 && - ! grep "fatal:" err-7 && + test_grep ! "fatal:" err-7 && # There is no reason to insist they are bit-for-bit # identical, but this test should suffice for now. test_cmp target-6/.git/config target-7/.git/config @@ -298,22 +298,22 @@ test_expect_success 'clone separate gitdir where target already exists' ' rm -rf dst && echo foo=bar >>realgitdir/config && test_must_fail git clone --separate-git-dir realgitdir src dst && - grep foo=bar realgitdir/config + test_grep foo=bar realgitdir/config ' test_expect_success 'clone --reference from original' ' git clone --shared --bare src src-1 && git clone --bare src src-2 && git clone --reference=src-2 --bare src-1 target-8 && - grep /src-2/ target-8/objects/info/alternates + test_grep /src-2/ target-8/objects/info/alternates ' test_expect_success 'clone with more than one --reference' ' git clone --bare src src-3 && git clone --bare src src-4 && git clone --reference=src-3 --reference=src-4 src target-9 && - grep /src-3/ target-9/.git/objects/info/alternates && - grep /src-4/ target-9/.git/objects/info/alternates + test_grep /src-3/ target-9/.git/objects/info/alternates && + test_grep /src-4/ target-9/.git/objects/info/alternates ' test_expect_success 'clone from original with relative alternate' ' @@ -321,7 +321,7 @@ test_expect_success 'clone from original with relative alternate' ' git clone --bare src nest/src-5 && echo ../../../src/.git/objects >nest/src-5/objects/info/alternates && git clone --bare nest/src-5 target-10 && - grep /src/\\.git/objects target-10/objects/info/alternates + test_grep /src/\\.git/objects target-10/objects/info/alternates ' test_expect_success 'clone checking out a tag' ' @@ -663,8 +663,8 @@ test_expect_success PERL_TEST_HELPERS 'clone on case-insensitive fs' ' ' test_expect_success PERL_TEST_HELPERS,CASE_INSENSITIVE_FS 'colliding file detection' ' - grep X icasefs/warning && - grep x icasefs/warning && + test_grep X icasefs/warning && + test_grep x icasefs/warning && test_grep "the following paths have collided" icasefs/warning ' @@ -857,7 +857,7 @@ test_expect_success 'auto-discover bundle URI from HTTP clone' ' cat >pattern <<-EOF && "event":"child_start".*"argv":\["git-remote-https","$HTTPD_URL/everything.bundle"\] EOF - grep -f pattern trace.txt + test_grep -f pattern trace.txt ' test_expect_success 'auto-discover multiple bundles from HTTP clone' ' @@ -888,11 +888,11 @@ test_expect_success 'auto-discover multiple bundles from HTTP clone' ' cat >pattern <<-EOF && "event":"child_start".*"argv":\["git-remote-https","$HTTPD_URL/everything.bundle"\] EOF - grep -f pattern trace.txt && + test_grep -f pattern trace.txt && cat >pattern <<-EOF && "event":"child_start".*"argv":\["git-remote-https","$HTTPD_URL/new.bundle"\] EOF - grep -f pattern trace.txt + test_grep -f pattern trace.txt ' test_expect_success 'auto-discover multiple bundles from HTTP clone: creationToken heuristic' ' diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh index c232ab8c15a59d..39a0c318dfb2d4 100755 --- a/t/t5604-clone-reference.sh +++ b/t/t5604-clone-reference.sh @@ -65,7 +65,7 @@ test_expect_success 'cloning with reference (no -l -s)' ' test_expect_success 'fetched no objects' ' test -s "$U.D" && - ! grep " want" "$U.D" + test_grep ! " want" "$U.D" ' test_expect_success 'existence of info/alternates' ' @@ -157,9 +157,9 @@ test_expect_success 'fetch with incomplete alternates' ' ) && main_object=$(git -C A rev-parse --verify refs/heads/main) && test -s "$U.K" && - ! grep " want $main_object" "$U.K" && + test_grep ! " want $main_object" "$U.K" && tag_object=$(git -C A rev-parse --verify refs/tags/foo) && - ! grep " want $tag_object" "$U.K" + test_grep ! " want $tag_object" "$U.K" ' test_expect_success 'clone using repo with gitfile as a reference' ' @@ -357,7 +357,7 @@ test_expect_success SYMLINKS 'clone repo with symlinked objects directory' ' test_must_fail git clone --local malicious clone 2>err && test_path_is_missing clone && - grep "is a symlink, refusing to clone with --local" err + test_grep "is a symlink, refusing to clone with --local" err ' test_expect_success 'dissociate from repo with commit graph' ' diff --git a/t/t5605-clone-local.sh b/t/t5605-clone-local.sh index 2397f8fa618054..156362f145b071 100755 --- a/t/t5605-clone-local.sh +++ b/t/t5605-clone-local.sh @@ -172,7 +172,7 @@ test_expect_success REFFILES 'local clone from repo with corrupt refs fails grac echo a >corrupt/.git/refs/heads/topic && test_must_fail git clone corrupt working 2>err && - grep "has neither a valid OID nor a target" err + test_grep "has neither a valid OID nor a target" err ' test_done diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh index 8a1523773684bc..1b48da496b346e 100755 --- a/t/t5606-clone-options.sh +++ b/t/t5606-clone-options.sh @@ -63,7 +63,7 @@ test_expect_success 'disallows --bundle-uri with shallow options' ' for option in --depth=1 --shallow-since=01-01-2000 --shallow-exclude=HEAD do test_must_fail git clone --bundle-uri=bundle $option from to 2>err && - grep "bundle-uri.* cannot be used together" err || return 1 + test_grep "bundle-uri.* cannot be used together" err || return 1 done ' @@ -147,7 +147,7 @@ test_expect_success 'prefers --origin over -c config' ' test_expect_success 'redirected clone does not show progress' ' git clone "file://$(pwd)/parent" clone-redirected >out 2>err && - ! grep % err && + test_grep ! % err && test_grep ! "Checking connectivity" err ' @@ -156,7 +156,7 @@ test_expect_success 'redirected clone -v does show progress' ' git clone --progress "file://$(pwd)/parent" clone-redirected-progress \ >out 2>err && - grep % err + test_grep % err ' diff --git a/t/t5612-clone-refspec.sh b/t/t5612-clone-refspec.sh index 3126cfd7e9d6bd..dd1fe0abb46b6a 100755 --- a/t/t5612-clone-refspec.sh +++ b/t/t5612-clone-refspec.sh @@ -97,7 +97,7 @@ test_expect_success 'by default no tags will be kept updated' ' test_expect_success 'clone with --no-tags' ' ( cd dir_all_no_tags && - grep tagOpt .git/config && + test_grep tagOpt .git/config && git fetch && git for-each-ref refs/tags >../actual ) && diff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh index 1c2805accac636..ddbf2b72c6cd39 100755 --- a/t/t5616-partial-clone.sh +++ b/t/t5616-partial-clone.sh @@ -60,8 +60,8 @@ test_expect_success 'verify that .promisor file contains refs fetched' ' ls pc1/.git/objects/pack/pack-*.promisor >promisorlist && test_line_count = 1 promisorlist && git -C srv.bare rev-parse --verify HEAD >headhash && - grep "$(cat headhash) HEAD" $(cat promisorlist) && - grep "$(cat headhash) refs/heads/main" $(cat promisorlist) + test_grep "$(cat headhash) HEAD" $(cat promisorlist) && + test_grep "$(cat headhash) refs/heads/main" $(cat promisorlist) ' # checkout main to force dynamic object fetch of blobs at HEAD. @@ -230,8 +230,8 @@ test_expect_success 'fetch --refetch triggers repacking' ' GIT_TRACE2_EVENT="$PWD/trace1.event" \ git -C pc1 fetch --refetch origin && test_subcommand git maintenance run --auto --no-quiet --no-detach tree_contents && - grep file.txt tree_contents && + test_grep file.txt tree_contents && # fsck still works after an auto-fetch of a tree. git -C dst fsck && @@ -333,14 +333,14 @@ test_expect_success 'implicitly construct combine: filter with repeated flags' ' GIT_TRACE=$(pwd)/trace git clone --bare \ --filter=blob:none --filter=tree:1 \ "file://$(pwd)/srv.bare" pc2 && - grep "trace:.* git pack-objects .*--filter=combine:blob:none+tree:1" \ + test_grep "trace:.* git pack-objects .*--filter=combine:blob:none+tree:1" \ trace && git -C pc2 rev-list --objects --missing=allow-any HEAD >objects && # We should have gotten some root trees. - grep " $" objects && + test_grep " $" objects && # Should not have gotten any non-root trees or blobs. - ! grep " ." objects && + test_grep ! " ." objects && xargs -n 1 git -C pc2 cat-file -t types && sort -u types >unique_types.actual && @@ -409,7 +409,7 @@ test_expect_success 'partial clone fetches blobs pointed to by refs even if norm git -C src tag myblob "$BLOB" && git clone --filter="blob:none" "file://$(pwd)/src" dst 2>err && - ! grep "does not point to a valid object" err && + test_grep ! "does not point to a valid object" err && git -C dst fsck ' @@ -424,10 +424,10 @@ test_expect_success 'fetch what is specified on CLI even if already promised' ' git clone --bare --filter=blob:none "file://$(pwd)/src" dst.git && git -C dst.git rev-list --objects --quiet --missing=print HEAD >missing_before && - grep "?$(cat blob)" missing_before && + test_grep "?$(cat blob)" missing_before && git -C dst.git fetch origin $(cat blob) && git -C dst.git rev-list --objects --quiet --missing=print HEAD >missing_after && - ! grep "?$(cat blob)" missing_after + test_grep ! "?$(cat blob)" missing_after ' test_expect_success 'setup src repo for sparse filter' ' @@ -449,8 +449,8 @@ test_expect_success 'partial clone with sparse filter succeeds' ' ( cd dst.git && git rev-list --objects --missing=print HEAD >out && - grep "^$(git rev-parse HEAD:one.t)" out && - grep "^?$(git rev-parse HEAD:two.t)" out + test_grep "^$(git rev-parse HEAD:one.t)" out && + test_grep "^?$(git rev-parse HEAD:two.t)" out ) ' @@ -521,7 +521,7 @@ test_expect_success 'fetch lazy-fetches only to resolve deltas' ' # Verify the assumption that the client needed to fetch the delta base # to resolve the delta. git -C server rev-parse HEAD~1^{tree} >hash && - grep "want $(cat hash)" trace + test_grep "want $(cat hash)" trace ' test_expect_success 'fetch lazy-fetches only to resolve deltas, protocol v2' ' @@ -538,12 +538,12 @@ test_expect_success 'fetch lazy-fetches only to resolve deltas, protocol v2' ' fetch "file://$(pwd)/server" main && # Verify that protocol version 2 was used. - grep "fetch< version 2" trace && + test_grep "fetch< version 2" trace && # Verify the assumption that the client needed to fetch the delta base # to resolve the delta. git -C server rev-parse HEAD~1^{tree} >hash && - grep "want $(cat hash)" trace + test_grep "want $(cat hash)" trace ' test_expect_success 'fetch does not lazy-fetch missing targets of its refs' ' @@ -563,7 +563,7 @@ test_expect_success 'fetch does not lazy-fetch missing targets of its refs' ' --no-tags --recurse-submodules=no \ origin refs/tags/bar && FOO_HASH=$(git -C server rev-parse foo) && - ! grep "want $FOO_HASH" trace + test_grep ! "want $FOO_HASH" trace ' # The following two tests must be in this order. It is important that @@ -621,7 +621,7 @@ test_expect_success 'fetch from a partial clone, protocol v0' ' test_config -C client protocol.version 0 && test_commit -C client bar && GIT_TRACE_PACKET="$(pwd)/trace" git -C client fetch "file://$(pwd)/server" && - ! grep "version 2" trace + test_grep ! "version 2" trace ' test_expect_success 'fetch from a partial clone, protocol v2' ' @@ -640,7 +640,7 @@ test_expect_success 'fetch from a partial clone, protocol v2' ' test_config -C client protocol.version 2 && test_commit -C client bar && GIT_TRACE_PACKET="$(pwd)/trace" git -C client fetch "file://$(pwd)/server" && - grep "version 2" trace + test_grep "version 2" trace ' test_expect_success 'repack does not loosen promisor objects' ' @@ -648,7 +648,7 @@ test_expect_success 'repack does not loosen promisor objects' ' git clone --bare --filter=blob:none "file://$(pwd)/srv.bare" client && test_when_finished "rm -rf client trace" && GIT_TRACE2_PERF="$(pwd)/trace" git -C client repack -A -d && - grep "loosen_unused_packed_objects/loosened:0" trace + test_grep "loosen_unused_packed_objects/loosened:0" trace ' test_expect_success 'lazy-fetch in submodule succeeds' ' @@ -824,7 +824,7 @@ test_expect_success 'when partial cloning, tolerate server not sending target of # Exercise to make sure it works. git -c protocol.version=2 clone \ --filter=blob:none $HTTPD_URL/one_time_script/server repo 2> err && - ! grep "missing object referenced by" err && + test_grep ! "missing object referenced by" err && # Ensure that the one-time-script script was used. ! test -e "$HTTPD_ROOT_PATH/one-time-script" @@ -881,13 +881,13 @@ test_expect_success PERL_TEST_HELPERS 'tolerate server sending REF_DELTA against # by any 3 nybbles, then the OID of the delta base. printf "f.,..%s" $(intersperse "," want && hex_unpack have && - grep $(cat want) have && + test_grep $(cat want) have && # Ensure that the pack contains one delta against HEAD^:have.txt, # similar to the above. printf "f.,..%s" $(intersperse "," want && hex_unpack have && - grep $(cat want) have && + test_grep $(cat want) have && replace_packfile thin.pack && @@ -901,8 +901,8 @@ test_expect_success PERL_TEST_HELPERS 'tolerate server sending REF_DELTA against # Ensure that the missing delta base was directly fetched, but not the # one that the client has. - grep "want $(cat deltabase_missing)" trace && - ! grep "want $(cat deltabase_have)" trace && + test_grep "want $(cat deltabase_missing)" trace && + test_grep ! "want $(cat deltabase_have)" trace && # Ensure that the one-time-script script was used. ! test -e "$HTTPD_ROOT_PATH/one-time-script" diff --git a/t/t5619-clone-local-ambiguous-transport.sh b/t/t5619-clone-local-ambiguous-transport.sh index cce62bf78d3351..e4218e5c7f9f50 100755 --- a/t/t5619-clone-local-ambiguous-transport.sh +++ b/t/t5619-clone-local-ambiguous-transport.sh @@ -64,7 +64,7 @@ test_expect_success 'ambiguous transport does not lead to arbitrary file-inclusi # # This works for now, and if we ever fix the URL detection, it # is OK to change this to detect the transport error. - grep "protocol .* is not supported" err + test_grep "protocol .* is not supported" err ' test_done diff --git a/t/t5620-backfill.sh b/t/t5620-backfill.sh index d2ea68e065304d..74622804700d99 100755 --- a/t/t5620-backfill.sh +++ b/t/t5620-backfill.sh @@ -144,7 +144,7 @@ test_expect_success 'do partial clone 2, backfill min batch size' ' test_expect_success 'backfill --sparse without sparse-checkout fails' ' git init not-sparse && test_must_fail git -C not-sparse backfill --sparse 2>err && - grep "problem loading sparse-checkout" err + test_grep "problem loading sparse-checkout" err ' test_expect_success 'backfill --sparse' ' @@ -422,7 +422,7 @@ test_expect_success 'backfill range with include-edges enables fetch-free git-lo -C backfill-log log -p HEAD~2..HEAD >log-output && # No promisor fetches should have been needed. - ! grep "fetch_count" log-trace + test_grep ! "fetch_count" log-trace ' test_expect_success 'backfill range without include edges causes on-demand fetches in git-log' ' @@ -439,7 +439,7 @@ test_expect_success 'backfill range without include edges causes on-demand fetch GIT_TRACE2_EVENT="$(pwd)/log-no-bdy-trace" git \ -C backfill-log-no-bdy log -p HEAD~2..HEAD >log-output && - grep "fetch_count" log-no-bdy-trace + test_grep "fetch_count" log-no-bdy-trace ' test_expect_success 'backfill range enables fetch-free replay' ' @@ -470,7 +470,7 @@ test_expect_success 'backfill range enables fetch-free replay' ' GIT_TRACE2_EVENT="$(pwd)/replay-trace" git -C replay-dest.git \ replay --onto main topic~1..topic >replay-out && - ! grep "fetch_count" replay-trace + test_grep ! "fetch_count" replay-trace ' test_expect_success 'backfill enables fetch-free merge' ' @@ -501,7 +501,7 @@ test_expect_success 'backfill enables fetch-free merge' ' GIT_TRACE2_EVENT="$(pwd)/merge-trace" git -C merge-dest \ merge origin/side -m "test merge" && - ! grep "fetch_count" merge-trace + test_grep ! "fetch_count" merge-trace ' . "$TEST_DIRECTORY"/lib-httpd.sh @@ -530,7 +530,7 @@ test_expect_success 'backfilling over HTTP succeeds' ' awk "{print \$1;}" oids && GIT_TRACE2_EVENT="$(pwd)/walk-trace" git -C backfill-http \ cat-file --batch-check batch-out && - ! grep missing batch-out + test_grep ! missing batch-out ' # DO NOT add non-httpd-specific tests here, because the last part of this diff --git a/t/t5700-protocol-v1.sh b/t/t5700-protocol-v1.sh index a73b4d4ff6a0d2..ffeb01afaef462 100755 --- a/t/t5700-protocol-v1.sh +++ b/t/t5700-protocol-v1.sh @@ -33,9 +33,9 @@ test_expect_success 'clone with git:// using protocol v1' ' test_cmp expect actual && # Client requested to use protocol v1 - grep "clone> .*\\\0\\\0version=1\\\0$" log && + test_grep "clone> .*\\\0\\\0version=1\\\0$" log && # Server responded using protocol v1 - grep "clone< version 1" log + test_grep "clone< version 1" log ' test_expect_success 'fetch with git:// using protocol v1' ' @@ -49,9 +49,9 @@ test_expect_success 'fetch with git:// using protocol v1' ' test_cmp expect actual && # Client requested to use protocol v1 - grep "fetch> .*\\\0\\\0version=1\\\0$" log && + test_grep "fetch> .*\\\0\\\0version=1\\\0$" log && # Server responded using protocol v1 - grep "fetch< version 1" log + test_grep "fetch< version 1" log ' test_expect_success 'pull with git:// using protocol v1' ' @@ -63,9 +63,9 @@ test_expect_success 'pull with git:// using protocol v1' ' test_cmp expect actual && # Client requested to use protocol v1 - grep "fetch> .*\\\0\\\0version=1\\\0$" log && + test_grep "fetch> .*\\\0\\\0version=1\\\0$" log && # Server responded using protocol v1 - grep "fetch< version 1" log + test_grep "fetch< version 1" log ' test_expect_success 'push with git:// using protocol v1' ' @@ -81,9 +81,9 @@ test_expect_success 'push with git:// using protocol v1' ' test_cmp expect actual && # Client requested to use protocol v1 - grep "push> .*\\\0\\\0version=1\\\0$" log && + test_grep "push> .*\\\0\\\0version=1\\\0$" log && # Server responded using protocol v1 - grep "push< version 1" log + test_grep "push< version 1" log ' stop_git_daemon @@ -104,7 +104,7 @@ test_expect_success 'clone with file:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "clone< version 1" log + test_grep "clone< version 1" log ' test_expect_success 'fetch with file:// using protocol v1' ' @@ -118,7 +118,7 @@ test_expect_success 'fetch with file:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "fetch< version 1" log + test_grep "fetch< version 1" log ' test_expect_success 'pull with file:// using protocol v1' ' @@ -130,7 +130,7 @@ test_expect_success 'pull with file:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "fetch< version 1" log + test_grep "fetch< version 1" log ' test_expect_success 'push with file:// using protocol v1' ' @@ -146,7 +146,7 @@ test_expect_success 'push with file:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "push< version 1" log + test_grep "push< version 1" log ' test_expect_success 'cloning branchless tagless but not refless remote' ' @@ -196,7 +196,7 @@ test_expect_success 'clone with ssh:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "clone< version 1" log + test_grep "clone< version 1" log ' test_expect_success 'fetch with ssh:// using protocol v1' ' @@ -211,7 +211,7 @@ test_expect_success 'fetch with ssh:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "fetch< version 1" log + test_grep "fetch< version 1" log ' test_expect_success 'pull with ssh:// using protocol v1' ' @@ -224,7 +224,7 @@ test_expect_success 'pull with ssh:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "fetch< version 1" log + test_grep "fetch< version 1" log ' test_expect_success 'push with ssh:// using protocol v1' ' @@ -241,7 +241,7 @@ test_expect_success 'push with ssh:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "push< version 1" log + test_grep "push< version 1" log ' test_expect_success 'clone propagates object-format from empty repo' ' @@ -277,9 +277,9 @@ test_expect_success 'clone with http:// using protocol v1' ' test_cmp expect actual && # Client requested to use protocol v1 - grep "Git-Protocol: version=1" log && + test_grep "Git-Protocol: version=1" log && # Server responded using protocol v1 - grep "git< version 1" log + test_grep "git< version 1" log ' test_expect_success 'clone with http:// using protocol v1 with empty SHA-256 repo' ' @@ -291,9 +291,9 @@ test_expect_success 'clone with http:// using protocol v1 with empty SHA-256 rep test_cmp expect actual && # Client requested to use protocol v1 - grep "Git-Protocol: version=1" log && + test_grep "Git-Protocol: version=1" log && # Server responded using protocol v1 - grep "git< version 1" log + test_grep "git< version 1" log ' test_expect_success 'fetch with http:// using protocol v1' ' @@ -307,7 +307,7 @@ test_expect_success 'fetch with http:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "git< version 1" log + test_grep "git< version 1" log ' test_expect_success 'pull with http:// using protocol v1' ' @@ -319,7 +319,7 @@ test_expect_success 'pull with http:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "git< version 1" log + test_grep "git< version 1" log ' test_expect_success 'push with http:// using protocol v1' ' @@ -335,7 +335,7 @@ test_expect_success 'push with http:// using protocol v1' ' test_cmp expect actual && # Server responded using protocol v1 - grep "git< version 1" log + test_grep "git< version 1" log ' # DO NOT add non-httpd-specific tests here, because the last part of this diff --git a/t/t5701-git-serve.sh b/t/t5701-git-serve.sh index d4c28bae39e2ad..108eb30945247b 100755 --- a/t/t5701-git-serve.sh +++ b/t/t5701-git-serve.sh @@ -97,7 +97,7 @@ test_expect_success 'request capability as command' ' 0000 EOF test_must_fail test-tool serve-v2 --stateless-rpc 2>err err err err /dev/null 2>err && - grep "unexpected line: .this-is-not-a-command." err + test_grep "unexpected line: .this-is-not-a-command." err ' # Test the basics of object-info @@ -410,7 +410,7 @@ test_expect_success 'object-info missing from capabilities when disabled' ' --advertise-capabilities >out && test-tool pkt-line unpack actual && - ! grep object.info actual + test_grep ! object.info actual ' test_expect_success 'object-info commands rejected when disabled' ' @@ -421,7 +421,7 @@ test_expect_success 'object-info commands rejected when disabled' ' EOF test_must_fail test-tool serve-v2 --stateless-rpc err && - grep invalid.command err + test_grep invalid.command err ' test_done diff --git a/t/t5702-protocol-v2.sh b/t/t5702-protocol-v2.sh index 9f6cf4142d5b83..46f24dc0a37d19 100755 --- a/t/t5702-protocol-v2.sh +++ b/t/t5702-protocol-v2.sh @@ -27,9 +27,9 @@ test_expect_success 'list refs with git:// using protocol v2' ' ls-remote --symref "$GIT_DAEMON_URL/parent" >actual && # Client requested to use protocol v2 - grep "ls-remote> .*\\\0\\\0version=2\\\0$" log && + test_grep "ls-remote> .*\\\0\\\0version=2\\\0$" log && # Server responded using protocol v2 - grep "ls-remote< version 2" log && + test_grep "ls-remote< version 2" log && git ls-remote --symref "$GIT_DAEMON_URL/parent" >expect && test_cmp expect actual @@ -59,9 +59,9 @@ test_expect_success 'clone with git:// using protocol v2' ' test_cmp expect actual && # Client requested to use protocol v2 - grep "clone> .*\\\0\\\0version=2\\\0$" log && + test_grep "clone> .*\\\0\\\0version=2\\\0$" log && # Server responded using protocol v2 - grep "clone< version 2" log + test_grep "clone< version 2" log ' test_expect_success 'fetch with git:// using protocol v2' ' @@ -77,9 +77,9 @@ test_expect_success 'fetch with git:// using protocol v2' ' test_cmp expect actual && # Client requested to use protocol v2 - grep "fetch> .*\\\0\\\0version=2\\\0$" log && + test_grep "fetch> .*\\\0\\\0version=2\\\0$" log && # Server responded using protocol v2 - grep "fetch< version 2" log + test_grep "fetch< version 2" log ' test_expect_success 'fetch by hash without tag following with protocol v2 does not list refs' ' @@ -91,8 +91,8 @@ test_expect_success 'fetch by hash without tag following with protocol v2 does n GIT_TRACE_PACKET="$(pwd)/log" git -C daemon_child -c protocol.version=2 \ fetch --no-tags origin $(cat two_a_hash) && - grep "fetch< version 2" log && - ! grep "fetch> command=ls-refs" log + test_grep "fetch< version 2" log && + test_grep ! "fetch> command=ls-refs" log ' test_expect_success 'pull with git:// using protocol v2' ' @@ -106,9 +106,9 @@ test_expect_success 'pull with git:// using protocol v2' ' test_cmp expect actual && # Client requested to use protocol v2 - grep "fetch> .*\\\0\\\0version=2\\\0$" log && + test_grep "fetch> .*\\\0\\\0version=2\\\0$" log && # Server responded using protocol v2 - grep "fetch< version 2" log + test_grep "fetch< version 2" log ' test_expect_success 'push with git:// and a config of v2 does not request v2' ' @@ -130,9 +130,9 @@ test_expect_success 'push with git:// and a config of v2 does not request v2' ' test_cmp expect actual && # Client requested to use protocol v2 - ! grep "push> .*\\\0\\\0version=2\\\0$" log && + test_grep ! "push> .*\\\0\\\0version=2\\\0$" log && # Server responded using protocol v2 - ! grep "push< version 2" log + test_grep ! "push< version 2" log ' stop_git_daemon @@ -151,7 +151,7 @@ test_expect_success 'list refs with file:// using protocol v2' ' ls-remote --symref "file://$(pwd)/file_parent" >actual && # Server responded using protocol v2 - grep "ls-remote< version 2" log && + test_grep "ls-remote< version 2" log && git ls-remote --symref "file://$(pwd)/file_parent" >expect && test_cmp expect actual @@ -181,8 +181,8 @@ test_expect_success 'server-options are sent when using ls-remote' ' EOF test_cmp expect actual && - grep "server-option=hello" log && - grep "server-option=world" log + test_grep "server-option=hello" log && + test_grep "server-option=world" log ' test_expect_success 'server-options from configuration are used by ls-remote' ' @@ -241,12 +241,12 @@ test_expect_success 'clone with file:// using protocol v2' ' test_cmp expect actual && # Server responded using protocol v2 - grep "clone< version 2" log && + test_grep "clone< version 2" log && # Client sent ref-prefixes to filter the ref-advertisement - grep "ref-prefix HEAD" log && - grep "ref-prefix refs/heads/" log && - grep "ref-prefix refs/tags/" log + test_grep "ref-prefix HEAD" log && + test_grep "ref-prefix refs/heads/" log && + test_grep "ref-prefix refs/tags/" log ' test_expect_success 'clone of empty repo propagates name of default branch' ' @@ -311,7 +311,7 @@ test_expect_success 'clone propagates unborn HEAD from non-empty repo' ' echo "refs/heads/mydefaultbranch" >expect && git -C file_unborn_child symbolic-ref HEAD >actual && test_cmp expect actual && - grep "warning: remote HEAD refers to nonexistent ref" stderr + test_grep "warning: remote HEAD refers to nonexistent ref" stderr ' test_expect_success 'clone propagates object-format from empty repo' ' @@ -343,7 +343,7 @@ test_expect_success 'bare clone propagates unborn HEAD from non-empty repo' ' echo "refs/heads/mydefaultbranch" >expect && git -C file_unborn_child.git symbolic-ref HEAD >actual && test_cmp expect actual && - ! grep "warning:" stderr + test_grep ! "warning:" stderr ' test_expect_success 'defaulted HEAD uses remote branch if available' ' @@ -366,7 +366,7 @@ test_expect_success 'defaulted HEAD uses remote branch if available' ' git -C file_unborn_child symbolic-ref HEAD >actual && test_cmp expect actual && test_path_is_file file_unborn_child/stuff.t && - ! grep "warning:" stderr + test_grep ! "warning:" stderr ' test_expect_success 'fetch with file:// using protocol v2' ' @@ -382,7 +382,7 @@ test_expect_success 'fetch with file:// using protocol v2' ' test_cmp expect actual && # Server responded using protocol v2 - grep "fetch< version 2" log + test_grep "fetch< version 2" log ' test_expect_success 'ref advertisement is filtered during fetch using protocol v2' ' @@ -398,8 +398,8 @@ test_expect_success 'ref advertisement is filtered during fetch using protocol v git -C file_parent log -1 --format=%s >expect && test_cmp expect actual && - grep "refs/heads/main" log && - ! grep "refs/heads/unwanted-branch" log + test_grep "refs/heads/main" log && + test_grep ! "refs/heads/unwanted-branch" log ' test_expect_success 'server-options are sent when fetching' ' @@ -414,8 +414,8 @@ test_expect_success 'server-options are sent when fetching' ' git -C file_parent log -1 --format=%s >expect && test_cmp expect actual && - grep "server-option=hello" log && - grep "server-option=world" log + test_grep "server-option=hello" log && + test_grep "server-option=world" log ' test_expect_success 'server-options are sent when fetch multiple remotes' ' @@ -485,8 +485,8 @@ test_expect_success 'server-options are sent when cloning' ' clone --server-option=hello --server-option=world \ "file://$(pwd)/file_parent" myclone && - grep "server-option=hello" log && - grep "server-option=world" log + test_grep "server-option=hello" log && + test_grep "server-option=world" log ' test_expect_success 'server-options from configuration are used by git-clone' ' @@ -578,12 +578,12 @@ test_expect_success 'setup filter tests' ' test_expect_success 'partial clone' ' GIT_TRACE_PACKET="$(pwd)/trace" git -c protocol.version=2 \ clone --filter=blob:none "file://$(pwd)/server" client && - grep "version 2" trace && + test_grep "version 2" trace && # Ensure that the old version of the file is missing git -C client rev-list --quiet --objects --missing=print main \ >observed.oids && - grep "$(git -C server rev-parse message1:a.txt)" observed.oids && + test_grep "$(git -C server rev-parse message1:a.txt)" observed.oids && # Ensure that client passes fsck git -C client fsck @@ -593,11 +593,11 @@ test_expect_success 'dynamically fetch missing object' ' rm "$(pwd)/trace" && GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \ cat-file -p $(git -C server rev-parse message1:a.txt) && - grep "version 2" trace + test_grep "version 2" trace ' test_expect_success 'when dynamically fetching missing object, do not list refs' ' - ! grep "git> command=ls-refs" trace + test_grep ! "git> command=ls-refs" trace ' test_expect_success 'partial fetch' ' @@ -607,12 +607,12 @@ test_expect_success 'partial fetch' ' GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \ fetch --filter=blob:none "$SERVER" main:refs/heads/other && - grep "version 2" trace && + test_grep "version 2" trace && # Ensure that the old version of the file is missing git -C client rev-list --quiet --objects --missing=print other \ >observed.oids && - grep "$(git -C server rev-parse message1:a.txt)" observed.oids && + test_grep "$(git -C server rev-parse message1:a.txt)" observed.oids && # Ensure that client passes fsck git -C client fsck @@ -625,14 +625,14 @@ test_expect_success 'do not advertise filter if not configured to do so' ' git -C server config uploadpack.allowfilter 1 && GIT_TRACE_PACKET="$(pwd)/trace" git -c protocol.version=2 \ ls-remote "$SERVER" && - grep "fetch=.*filter" trace && + test_grep "fetch=.*filter" trace && rm "$(pwd)/trace" && git -C server config uploadpack.allowfilter 0 && GIT_TRACE_PACKET="$(pwd)/trace" git -c protocol.version=2 \ ls-remote "$SERVER" && grep "fetch=" trace >fetch_capabilities && - ! grep filter fetch_capabilities + test_grep ! filter fetch_capabilities ' test_expect_success 'partial clone warns if filter is not advertised' ' @@ -658,7 +658,7 @@ test_expect_success 'even with handcrafted request, filter does not work if not test_must_fail test-tool -C server serve-v2 --stateless-rpc \ /dev/null 2>err && - grep "unexpected line: .filter blob:none." err && + test_grep "unexpected line: .filter blob:none." err && # Exercise to ensure that if advertised, filter works git -C server config uploadpack.allowfilter 1 && @@ -675,8 +675,8 @@ test_expect_success 'default refspec is used to filter ref when fetching' ' git -C file_parent log -1 --format=%s three >expect && test_cmp expect actual && - grep "ref-prefix refs/heads/" log && - grep "ref-prefix refs/tags/" log + test_grep "ref-prefix refs/heads/" log && + test_grep "ref-prefix refs/tags/" log ' test_expect_success 'set up parent for prefix tests' ' @@ -750,9 +750,9 @@ test_expect_success 'fetch supports various ways of have lines' ' "$(git -C server rev-parse fetch-by-sha1)" && # Ensure that the appropriate prefixes are sent (using a sample) - grep "fetch> ref-prefix dwim" trace && - grep "fetch> ref-prefix refs/heads/dwim" trace && - grep "fetch> ref-prefix refs/tags/prefix" trace && + test_grep "fetch> ref-prefix dwim" trace && + test_grep "fetch> ref-prefix refs/heads/dwim" trace && + test_grep "fetch> ref-prefix refs/tags/prefix" trace && # Ensure that the correct objects are returned git -C client cat-file -e $(git -C server rev-parse dwim) && @@ -779,9 +779,9 @@ test_expect_success 'fetch supports include-tag and tag following' ' GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \ fetch "$(pwd)/server" to_fetch:to_fetch && - grep "fetch> ref-prefix to_fetch" trace && - grep "fetch> ref-prefix refs/tags/" trace && - grep "fetch> include-tag" trace && + test_grep "fetch> ref-prefix to_fetch" trace && + test_grep "fetch> ref-prefix refs/tags/" trace && + test_grep "fetch> include-tag" trace && git -C client cat-file -e $(git -C client rev-parse annotated_tag) ' @@ -805,7 +805,7 @@ test_expect_success 'upload-pack respects client shallows' ' GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \ fetch origin newbranch && # Ensure that protocol v2 is used - grep "fetch< version 2" trace + test_grep "fetch< version 2" trace ' test_expect_success 'ensure that multiple fetches in same process from a shallow repo works' ' @@ -823,7 +823,7 @@ test_expect_success 'ensure that multiple fetches in same process from a shallow GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \ fetch --shallow-exclude one origin && # Ensure that protocol v2 is used - grep "fetch< version 2" trace + test_grep "fetch< version 2" trace ' test_expect_success 'deepen-relative' ' @@ -844,7 +844,7 @@ test_expect_success 'deepen-relative' ' GIT_TRACE_PACKET="$(pwd)/trace" git -C client -c protocol.version=2 \ fetch --deepen=1 origin && # Ensure that protocol v2 is used - grep "fetch< version 2" trace && + test_grep "fetch< version 2" trace && git -C client log --pretty=tformat:%s origin/main >actual && cat >expected <<-\EOF && @@ -909,7 +909,7 @@ test_expect_success 'file:// --negotiate-only' ' --negotiation-tip=$(git -C client rev-parse HEAD) \ origin >out && COMMON=$(git -C "$SERVER" rev-parse two) && - grep "$COMMON" out + test_grep "$COMMON" out ' test_expect_success 'file:// --negotiate-only with protocol v0' ' @@ -932,7 +932,7 @@ test_expect_success 'push with custom path does not request v2' ' --receive-pack="env >../env.trace; git-receive-pack" \ origin HEAD:refs/heads/custom-push-test && test_path_is_file env.trace && - ! grep ^GIT_PROTOCOL env.trace + test_grep ! ^GIT_PROTOCOL env.trace ' test_expect_success 'fetch with custom path does request v2' ' @@ -940,7 +940,7 @@ test_expect_success 'fetch with custom path does request v2' ' git -C client fetch \ --upload-pack="env >../env.trace; git-upload-pack" \ origin HEAD && - grep ^GIT_PROTOCOL=version=2 env.trace + test_grep ^GIT_PROTOCOL=version=2 env.trace ' test_expect_success 'archive with custom path does not request v2' ' @@ -950,7 +950,7 @@ test_expect_success 'archive with custom path does not request v2' ' --remote=origin \ HEAD >/dev/null && test_path_is_file env.trace && - ! grep ^GIT_PROTOCOL env.trace + test_grep ! ^GIT_PROTOCOL env.trace ' test_expect_success 'reject client packfile-uris if not advertised' ' @@ -994,11 +994,11 @@ test_expect_success 'clone with http:// using protocol v2' ' test_cmp expect actual && # Client requested to use protocol v2 - grep "Git-Protocol: version=2" log && + test_grep "Git-Protocol: version=2" log && # Server responded using protocol v2 - grep "git< version 2" log && + test_grep "git< version 2" log && # Verify that the chunked encoding sending codepath is NOT exercised - ! grep "Send header: Transfer-Encoding: chunked" log + test_grep ! "Send header: Transfer-Encoding: chunked" log ' test_expect_success 'clone repository with http:// using protocol v2 with incomplete pktline length' ' @@ -1011,9 +1011,9 @@ test_expect_success 'clone repository with http:// using protocol v2 with incomp clone "$HTTPD_URL/smart/incomplete_length" incomplete_length_child 2>err && # Client requested to use protocol v2 - grep "Git-Protocol: version=2" log && + test_grep "Git-Protocol: version=2" log && # Server responded using protocol v2 - grep "git< version 2" log && + test_grep "git< version 2" log && # Client reported appropriate failure test_grep "bytes of length header were received" err ' @@ -1028,9 +1028,9 @@ test_expect_success 'clone repository with http:// using protocol v2 with incomp clone "$HTTPD_URL/smart/incomplete_body" incomplete_body_child 2>err && # Client requested to use protocol v2 - grep "Git-Protocol: version=2" log && + test_grep "Git-Protocol: version=2" log && # Server responded using protocol v2 - grep "git< version 2" log && + test_grep "git< version 2" log && # Client reported appropriate failure test_grep "bytes of body are still expected" err ' @@ -1043,9 +1043,9 @@ test_expect_success 'clone with http:// using protocol v2 and invalid parameters clone --shallow-since=20151012 "$HTTPD_URL/smart/http_parent" http_child_invalid && # Client requested to use protocol v2 - grep "Git-Protocol: version=2" log && + test_grep "Git-Protocol: version=2" log && # Server responded using protocol v2 - grep "git< version 2" log + test_grep "git< version 2" log ' test_expect_success 'clone big repository with http:// using protocol v2' ' @@ -1070,11 +1070,11 @@ test_expect_success 'clone big repository with http:// using protocol v2' ' clone "$HTTPD_URL/smart/big" big_child && # Client requested to use protocol v2 - grep "Git-Protocol: version=2" log && + test_grep "Git-Protocol: version=2" log && # Server responded using protocol v2 - grep "git< version 2" log && + test_grep "git< version 2" log && # Verify that the chunked encoding sending codepath is exercised - grep "Send header: Transfer-Encoding: chunked" log + test_grep "Send header: Transfer-Encoding: chunked" log ' test_expect_success 'fetch with http:// using protocol v2' ' @@ -1090,7 +1090,7 @@ test_expect_success 'fetch with http:// using protocol v2' ' test_cmp expect actual && # Server responded using protocol v2 - grep "git< version 2" log + test_grep "git< version 2" log ' test_expect_success 'fetch with http:// by hash without tag following with protocol v2 does not list refs' ' @@ -1102,8 +1102,8 @@ test_expect_success 'fetch with http:// by hash without tag following with proto GIT_TRACE_PACKET="$(pwd)/log" git -C http_child -c protocol.version=2 \ fetch --no-tags origin $(cat two_a_hash) && - grep "fetch< version 2" log && - ! grep "fetch> command=ls-refs" log + test_grep "fetch< version 2" log && + test_grep ! "fetch> command=ls-refs" log ' test_expect_success 'fetch from namespaced repo respects namespaces' ' @@ -1120,7 +1120,7 @@ test_expect_success 'fetch from namespaced repo respects namespaces' ' refs/heads/main:refs/heads/theirs && # Server responded using protocol v2 - grep "fetch< version 2" log && + test_grep "fetch< version 2" log && git -C "$HTTPD_DOCUMENT_ROOT_PATH/nsrepo" rev-parse one >expect && git -C http_child rev-parse theirs >actual && @@ -1157,9 +1157,9 @@ test_expect_success 'push with http:// and a config of v2 does not request v2' ' test_cmp expect actual && # Client did not request to use protocol v2 - ! grep "Git-Protocol: version=2" log && + test_grep ! "Git-Protocol: version=2" log && # Server did not respond using protocol v2 - ! grep "git< version 2" log + test_grep ! "git< version 2" log ' test_expect_success 'when server sends "ready", expect DELIM' ' @@ -1207,8 +1207,8 @@ test_expect_success 'when server does not send "ready", expect FLUSH' ' test_must_fail env GIT_TRACE_PACKET="$(pwd)/log" git -C http_child \ -c protocol.version=2 \ fetch "$HTTPD_URL/one_time_script/http_parent" 2> err && - grep "fetch< .*acknowledgments" log && - ! grep "fetch< .*ready" log && + test_grep "fetch< .*acknowledgments" log && + test_grep ! "fetch< .*ready" log && test_grep "expected no other sections to be sent after no .ready." err ' @@ -1446,7 +1446,7 @@ test_expect_success 'packfile-uri path redacted in trace' ' -c fetch.uriprotocols=http,https \ clone "$HTTPD_URL/smart/http_parent" http_child && - grep -F "clone< \\1$(cat packh) $HTTPD_URL/" log + test_grep -F "clone< \\1$(cat packh) $HTTPD_URL/" log ' test_expect_success 'packfile-uri path not redacted in trace when GIT_TRACE_REDACT=0' ' @@ -1472,7 +1472,7 @@ test_expect_success 'packfile-uri path not redacted in trace when GIT_TRACE_REDA -c fetch.uriprotocols=http,https \ clone "$HTTPD_URL/smart/http_parent" http_child && - grep -F "clone< \\1$(cat packh) $HTTPD_URL/dumb/mypack-$(cat packh).pack" log + test_grep -F "clone< \\1$(cat packh) $HTTPD_URL/dumb/mypack-$(cat packh).pack" log ' test_expect_success 'http:// --negotiate-only' ' @@ -1487,7 +1487,7 @@ test_expect_success 'http:// --negotiate-only' ' --negotiation-tip=$(git -C client rev-parse HEAD) \ origin >out && COMMON=$(git -C "$SERVER" rev-parse two) && - grep "$COMMON" out + test_grep "$COMMON" out ' test_expect_success 'http:// --negotiate-only without wait-for-done support' ' diff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh index 249137b46734e0..330d049b2c05b5 100755 --- a/t/t5703-upload-pack-ref-in-want.sh +++ b/t/t5703-upload-pack-ref-in-want.sh @@ -101,7 +101,7 @@ test_expect_success 'invalid want-ref line' ' test-tool pkt-line pack in && test_must_fail test-tool serve-v2 --stateless-rpc 2>out expected && git -C local rev-parse refs/heads/actual >actual && test_cmp expected actual && - grep "want $oid" log + test_grep "want $oid" log ' test_expect_success 'fetching multiple refs' ' @@ -252,8 +252,8 @@ test_expect_success 'fetching multiple refs' ' git -C "$REPO" rev-parse "main" "baz" >expected && git -C local rev-parse refs/remotes/origin/main refs/remotes/origin/baz >actual && test_cmp expected actual && - grep "want-ref refs/heads/main" log && - grep "want-ref refs/heads/baz" log + test_grep "want-ref refs/heads/main" log && + test_grep "want-ref refs/heads/baz" log ' test_expect_success 'fetching ref and exact OID' ' @@ -268,8 +268,8 @@ test_expect_success 'fetching ref and exact OID' ' git -C "$REPO" rev-parse "main" "b" >expected && git -C local rev-parse refs/remotes/origin/main refs/heads/actual >actual && test_cmp expected actual && - grep "want $oid" log && - grep "want-ref refs/heads/main" log + test_grep "want $oid" log && + test_grep "want-ref refs/heads/main" log ' test_expect_success 'fetching with wildcard that does not match any refs' ' @@ -291,8 +291,8 @@ test_expect_success 'fetching with wildcard that matches multiple refs' ' git -C "$REPO" rev-parse "o/foo" "o/bar" >expected && git -C local rev-parse "o/foo" "o/bar" >actual && test_cmp expected actual && - grep "want-ref refs/heads/o/foo" log && - grep "want-ref refs/heads/o/bar" log + test_grep "want-ref refs/heads/o/foo" log && + test_grep "want-ref refs/heads/o/bar" log ' REPO="$(pwd)/repo-ns" @@ -345,7 +345,7 @@ test_expect_success 'with namespace: want-ref outside namespace is unknown' ' test_must_fail env GIT_NAMESPACE=ns \ test-tool -C "$REPO" serve-v2 --stateless-rpc >out out