Show changes to 88 files +939 −576
t/Makefile, t/for-each-ref-tests.sh, t/lib-bitmap.sh, t/lib-bundle-uri-protocol.sh, t/lib-httpd.sh, t/lint-style.pl, t/lint-style/grep-assert.expect, t/lint-style/grep-assert.test, t/lint-style/grep-fix.expect, t/lint-style/grep-fix.test, t/lint-style/grep-missing-file.expect, t/lint-style/grep-missing-file.test, t/lint-style/grep-negated.expect, t/lint-style/grep-negated.test, t/lint-style/grep-not-assert.expect, t/lint-style/grep-not-assert.test, t/pack-refs-tests.sh, t/show-ref-exists-tests.sh, t/t0000-basic.sh, t/t0001-init.sh, t/t0008-ignores.sh, t/t0009-git-dir-validation.sh, t/t0012-help.sh, t/t0013-sha1dc.sh, t/t0017-env-helper.sh, t/t0021-conversion.sh, t/t0029-core-unsetenvvars.sh, t/t0030-stripspace.sh, t/t0040-parse-options.sh, t/t0041-usage.sh, t/t0052-simple-ipc.sh, t/t0061-run-command.sh, t/t0066-dir-iterator.sh, t/t0068-for-each-repo.sh, t/t0070-fundamental.sh, t/t0081-find-pack.sh, t/t0091-bugreport.sh, t/t0092-diagnose.sh, t/t0100-previous.sh, t/t0200-gettext-basic.sh, t/t0203-gettext-setlocale-sanity.sh, t/t0204-gettext-reencode-sanity.sh, t/t0210-trace2-normal.sh, t/t0211-trace2-perf.sh, t/t0212-trace2-event.sh, t/t0300-credentials.sh, t/t0410-partial-clone.sh, t/t0450-txt-doc-vs-help.sh, t/t0500-progress-display.sh, t/t0610-reftable-basics.sh, t/t1004-read-tree-m-u-wf.sh, t/t1006-cat-file.sh, t/t1007-hash-object.sh, t/t1011-read-tree-sparse-checkout.sh, t/t1050-large.sh, t/t1091-sparse-checkout-builtin.sh, t/t1092-sparse-checkout-compatibility.sh, t/t1300-config.sh, t/t1305-config-include.sh, t/t1308-config-set.sh, t/t1400-update-ref.sh, t/t1403-show-ref.sh, t/t1410-reflog.sh, t/t1415-worktree-refs.sh, t/t1430-bad-ref-name.sh, t/t1450-fsck.sh, t/t1451-fsck-buffer.sh, t/t1460-refs-migrate.sh, t/t1500-rev-parse.sh, t/t1502-rev-parse-parseopt.sh, t/t1503-rev-parse-verify.sh, t/t1510-repo-setup.sh, t/t1512-rev-parse-disambiguation.sh, t/t1515-rev-parse-outside-repo.sh, t/t1800-hook.sh, t/t2004-checkout-cache-temp.sh, t/t2019-checkout-ambiguous-ref.sh, t/t2024-checkout-dwim.sh, t/t2030-unresolve-info.sh, t/t2060-switch.sh, t/t2070-restore.sh, t/t2080-parallel-checkout-basics.sh, t/t2081-parallel-checkout-collisions.sh, t/t2082-parallel-checkout-attributes.sh, t/t2103-update-index-ignore-missing.sh, t/t2200-add-update.sh, t/t2203-add-intent.sh, t/t2400-worktree-add.sh
diff --git a/t/Makefile b/t/Makefile
index 3a5fa4ce37..9492195511 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 bd2d45c971..6b359d940e 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 <in 2>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 62aa6744a6..2de6646128 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 >/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 >/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 de09b6b02e..ecf3284297 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 fc646447d5..a216e5376f 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 9268577f9b..8b0b44c146 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 @@ do $_lib or die "$0: failed to load $_lib: $@$!\n";
# 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 0000000000..93c518ed43
--- /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 0000000000..1567285754
--- /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 0000000000..04849634c6
--- /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 0000000000..a9202fc177
--- /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 0000000000..8d4dc585b5
--- /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 0000000000..aac0528dfc
--- /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 0000000000..7029b5544a
--- /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 0000000000..862a93b93b
--- /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 0000000000..e69de29bb2
diff --git a/t/lint-style/grep-not-assert.test b/t/lint-style/grep-not-assert.test
new file mode 100644
index 0000000000..a2c38ae4b1
--- /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" <stdin &&
+ grep "pattern" file && # lint-ok
+ cmd | grep "pattern-only" &&
+ cmd |
+ grep "cross-line-pipe" &&
+ grep -r "recursive" dir
+'
+
+test_expect_success 'grep in control flow (not assertion)' '
+ if grep "condition" file
+ then
+ echo yes
+ elif grep "other-condition" file
+ then
+ echo no
+ fi
+'
+
+test_expect_success 'grep in brace group with redirect' '
+ { grep "captured" out; } >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 d76b087b09..a800177446 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 36e8e9df33..1351f690eb 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 2b63e1c86c..7bd1f4e7b7 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) -eq 41 &&
@@ -839,7 +839,7 @@ test_expect_success 'test_oid can look up data for SHA-256' '
test_when_finished "test_detect_hash" &&
test_set_hash sha256 &&
test_oid zero >actual &&
- grep "^00*\$" actual &&
+ test_grep "^00*\$" actual &&
rawsz="$(test_oid rawsz)" &&
hexsz="$(test_oid hexsz)" &&
test $(wc -c <actual) -eq 65 &&
@@ -884,11 +884,11 @@ test_expect_success 'test_bool_env' '
# test script, hence the redirection of fd 7, and aborts
# with "exit 1", hence the subshell.
! ( test_bool_env envvar true ) 7>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 e4d32bb4d2..7dcd1e9d48 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 d77a179bdd..ed95faf327 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 33d21ed9ea..4cba478e50 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 c33501bdcd..48d128ad04 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 ce3d81227a..3ea3169d92 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 32fe848179..da02bce0ef 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 f0d50d769e..50994a6ada 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 baa1b7e85b..975620b389 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 43155f6bd8..d6e2f63c59 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 ca55ea8228..a8348a851c 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 a0f6f134c7..51af7cc030 100755
--- a/t/t0041-usage.sh
+++ b/t/t0041-usage.sh
@@ -13,7 +13,7 @@ test_expect_success 'setup ' '
test_expect_success 'tag --contains <existent_tag>' '
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 ff98be31a5..838ccc0e46 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 <threads> client threads that each make <batchsize>
@@ -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 >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 60cfe65979..dc9d77b0e1 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 df3e9f5fa5..9fbb41bac5 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 80b163ea99..55b37d895a 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 6b9dcf984b..8f573c2a0e 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 <split-sideband 2>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 26f017422d..ff9d56fbf1 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 e38ca7a901..81ed41742c 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 6cabd6e67b..0bc2b1ed5c 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 dd5d9b4e5e..87a9995ea4 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 8853d8afb9..8db26c1ada 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 <git@vger.kernel.org>" 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 <git@vger.kernel.org>" 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 0ce1f22eff..d8af97de23 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 28d92bb9b7..48ccddaf7d 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 <expect) " actual
+ test_grep "^$(iconv -f UTF-8 -t ISO8859-1 <expect) " actual
'
test_done
diff --git a/t/t0210-trace2-normal.sh b/t/t0210-trace2-normal.sh
index 7e1e7af862..beed2b27a5 100755
--- a/t/t0210-trace2-normal.sh
+++ b/t/t0210-trace2-normal.sh
@@ -333,12 +333,12 @@ test_expect_success 'unsafe URLs are redacted by default' '
GIT_TRACE2="$(pwd)/trace.normal" \
git clone https://user:pwd@example.com/ clone &&
- ! grep user:pwd trace.normal &&
+ test_grep ! user:pwd trace.normal &&
GIT_TRACE2_REDACT=0 GIT_TRACE2="$(pwd)/unredacted.normal" \
git clone https://user:pwd@example.com/ clone2 &&
- grep "start .* clone https://user:pwd@example.com" unredacted.normal &&
- grep "remote.origin.url=https://user:pwd@example.com" unredacted.normal
+ test_grep "start .* clone https://user:pwd@example.com" unredacted.normal &&
+ test_grep "remote.origin.url=https://user:pwd@example.com" unredacted.normal
'
test_done
diff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh
index 760cf69087..665c8b3669 100755
--- a/t/t0211-trace2-perf.sh
+++ b/t/t0211-trace2-perf.sh
@@ -283,13 +283,13 @@ test_expect_success 'unsafe URLs are redacted by default' '
GIT_TRACE2_PERF="$(pwd)/trace.perf" \
git clone https://user:pwd@example.com/ clone &&
- ! grep user:pwd trace.perf &&
+ test_grep ! user:pwd trace.perf &&
GIT_TRACE2_REDACT=0 GIT_TRACE2_PERF="$(pwd)/unredacted.perf" \
git clone https://user:pwd@example.com/ clone2 &&
perl "$TEST_DIRECTORY/t0211/scrub_perf.perl" <unredacted.perf >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" <prop.perf >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" <prop.perf >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" <prop.perf >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" <prop.perf >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 1211db9f46..f5358a1dd4 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 64ead1571a..ea11cdb4dc 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 <stdin >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 <stdin >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 52e19728a3..afa890c470 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/" <promisorlist) &&
git verify-pack $PROMISOR_PACKFILE -v >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//" <promisorlist).* &&
@@ -536,10 +536,10 @@ test_expect_success 'gc repacks promisor objects separately from non-promisor ob
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 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 822b0d55a5..e7ba967223 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 d1a498a216..fe2232cce0 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 \
<in 2>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 \
<in 2>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 \
<in 2>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 e19e036898..2f4c5e2a1b 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 11bf10424f..70ba3eea4d 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 8e2c52652c..762c77c351 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)" <blobs >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 <cmd 2>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 <cmd 2>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 <cmd 2>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 <cmd 2>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 <cmd 2>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 <cmd 2>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 de076293b6..4782a6246a 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 742f0fa909..f6a5dbe519 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 7d40d08521..d295c265c7 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 cd0aed9975..74b1761e0c 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 d98cb4ac11..b5b5e615e7 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 11fc976f3a..b337e25d92 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 f3892578e4..f6115269f9 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 e0e49053f0..de95161a83 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 1015f335e3..7c89071662 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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: create: missing <ref>" err
+ test_grep "fatal: create: missing <ref>" err
'
test_expect_success 'stdin fails create with no new value' '
echo "create $a" >stdin &&
test_must_fail git update-ref --stdin <stdin 2>err &&
- grep "fatal: create $a: missing <new-oid>" err
+ test_grep "fatal: create $a: missing <new-oid>" err
'
test_expect_success 'stdin fails create with too many arguments' '
echo "create $a $m $m" >stdin &&
test_must_fail git update-ref --stdin <stdin 2>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 <stdin 2>err &&
- grep "fatal: update: missing <ref>" err
+ test_grep "fatal: update: missing <ref>" err
'
test_expect_success 'stdin fails update with no new value' '
echo "update $a" >stdin &&
test_must_fail git update-ref --stdin <stdin 2>err &&
- grep "fatal: update $a: missing <new-oid>" err
+ test_grep "fatal: update $a: missing <new-oid>" 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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: delete: missing <ref>" err
+ test_grep "fatal: delete: missing <ref>" err
'
test_expect_success 'stdin fails delete with too many arguments' '
echo "delete $a $m $m" >stdin &&
test_must_fail git update-ref --stdin <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: update $c: invalid <old-oid>: does-not-exist" err &&
+ test_grep "fatal: update $c: invalid <old-oid>: 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 <stdin 2>err &&
- grep "fatal: create $c: invalid <new-oid>: does-not-exist" err &&
+ test_grep "fatal: create $c: invalid <new-oid>: 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 <stdin 2>err &&
- grep "fatal: create $c: zero <new-oid>" err &&
+ test_grep "fatal: create $c: zero <new-oid>" 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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: delete $a: zero <old-oid>" err &&
+ test_grep "fatal: delete $a: zero <old-oid>" 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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: create: missing <ref>" err
+ test_grep "fatal: create: missing <ref>" 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 <stdin 2>err &&
- grep "fatal: create $a: unexpected end of input when reading <new-oid>" err
+ test_grep "fatal: create $a: unexpected end of input when reading <new-oid>" 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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: update: missing <ref>" err
+ test_grep "fatal: update: missing <ref>" 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 <stdin 2>err &&
- grep "fatal: update $a: unexpected end of input when reading <old-oid>" err
+ test_grep "fatal: update $a: unexpected end of input when reading <old-oid>" 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 <stdin 2>err &&
- grep "warning: update $a: missing <new-oid>, treating as zero" err &&
+ test_grep "warning: update $a: missing <new-oid>, 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 <stdin 2>err &&
- grep "fatal: update $a: unexpected end of input when reading <new-oid>" err
+ test_grep "fatal: update $a: unexpected end of input when reading <new-oid>" 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 <stdin 2>err &&
- grep "fatal: update $a: unexpected end of input when reading <old-oid>" err
+ test_grep "fatal: update $a: unexpected end of input when reading <old-oid>" 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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: delete: missing <ref>" err
+ test_grep "fatal: delete: missing <ref>" 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 <stdin 2>err &&
- grep "fatal: delete $a: unexpected end of input when reading <old-oid>" err
+ test_grep "fatal: delete $a: unexpected end of input when reading <old-oid>" 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 <stdin 2>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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: verify $a: unexpected end of input when reading <old-oid>" err
+ test_grep "fatal: verify $a: unexpected end of input when reading <old-oid>" err
'
test_expect_success 'stdin -z fails option with unknown name' '
printf $F "option unknown" >stdin &&
test_must_fail git update-ref -z --stdin <stdin 2>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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: update $c: invalid <old-oid>: does-not-exist" err &&
+ test_grep "fatal: update $c: invalid <old-oid>: 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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: create $c: invalid <new-oid>: does-not-exist" err &&
+ test_grep "fatal: create $c: invalid <new-oid>: 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 <stdin 2>err &&
- grep "fatal: create $c: missing <new-oid>" err &&
+ test_grep "fatal: create $c: missing <new-oid>" 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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: delete $a: zero <old-oid>" err &&
+ test_grep "fatal: delete $a: zero <old-oid>" 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 <stdin 2>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 <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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>err &&
- grep "fatal: symref-delete: missing <ref>" err
+ test_grep "fatal: symref-delete: missing <ref>" 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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 36c903ca19..7ce5af4ab8 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 ce71f9a30a..81de1d40eb 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 51d79bae83..6b2ad04aef 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 3ab65f72cd..1ed4c7d2c2 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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 <stdin 2>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 54e81c2636..47d460a699 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 3a3d33f405..14151eabbd 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 5246468024..8f42697143 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 38067d95f7..4174ca40c3 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 3962f1d288..2cab204376 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 -- <spec 2>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 75a708f9ba..87638a4a2c 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 bbfe05b8e4..d330b8df47 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 1a380a4184..0e6b42ec78 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 </dev/null) &&
git update-ref refs/heads/$REF $VAL &&
test $(git rev-parse $REF 2>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 </dev/null) &&
git update-ref refs/heads/$REF $VAL &&
test $(git rev-parse $REF 2>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 75e89c4b6e..2cb3c7cc9c 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 0132e772e4..9aae3ff074 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.<event>.jobs=-1 resolves to online_cpus()' '
@@ -1081,7 +1081,7 @@ test_expect_success 'hook.<event>.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 0afe0ff7ca..db06c321ed 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 1fcef4be95..0ac35798c2 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 a3b1449ef1..752e7f0e61 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.raw >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 be3fcdde07..9af24b1204 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 c91c4db936..cec2fe6876 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 16d6348b69..2c222fb934 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 5ffe1a41e2..88a6ec1826 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 f6fcfc0c1e..db45f5f30f 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 79fb11f139..1f43c2a267 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 6938ecca86..fbfc86b1fa 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 0a96655cfe..bb019d7a7c 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 44c1936e4d..69fef7e646 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 </dev/null) &&
git ls-files -s >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 58b4445cc4..87b926728a 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 wo