diff options
84 files changed, 471 insertions, 373 deletions
diff --git a/meson.build b/meson.build index 0b91a6ff9f..62fedf0da6 100644 --- a/meson.build +++ b/meson.build @@ -815,7 +815,7 @@ endif # features. It is optional if you want to neither execute tests nor use any of # these optional features. perl_required = get_option('perl') -if get_option('tests') or get_option('gitweb').enabled() or 'netrc' in get_option('credential_helpers') or get_option('docs') != [] +if get_option('gitweb').enabled() or 'netrc' in get_option('credential_helpers') or get_option('docs') != [] perl_required = true endif diff --git a/t/Makefile b/t/Makefile index 2994eb5fa9..791e0a0978 100644 --- a/t/Makefile +++ b/t/Makefile @@ -59,16 +59,21 @@ CHAINLINTSUPPRESS = GIT_TEST_EXT_CHAIN_LINT=0 && export GIT_TEST_EXT_CHAIN_LINT all:: $(DEFAULT_TEST_TARGET) -test: pre-clean check-chainlint check-meson $(TEST_LINT) +test: pre-clean check-meson $(TEST_LINT) $(CHAINLINTSUPPRESS) $(MAKE) aggregate-results-and-cleanup +ifneq ($(PERL_PATH),) +test: check-chainlint +prove: check-chainlint +endif + failed: @failed=$$(cd '$(TEST_RESULTS_DIRECTORY_SQ)' && \ grep -l '^failed [1-9]' *.counts | \ sed -n 's/\.counts$$/.sh/p') && \ test -z "$$failed" || $(MAKE) $$failed -prove: pre-clean check-chainlint $(TEST_LINT) +prove: pre-clean $(TEST_LINT) @echo "*** prove (shell & unit tests) ***" @$(CHAINLINTSUPPRESS) TEST_OPTIONS='$(GIT_TEST_OPTS)' TEST_SHELL_PATH='$(TEST_SHELL_PATH_SQ)' $(PROVE) --exec ./run-test.sh $(GIT_PROVE_OPTS) $(T) $(UNIT_TESTS) $(MAKE) clean-except-prove-cache @@ -132,8 +137,13 @@ check-meson: fi; \ done -test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax \ +test-lint: test-lint-duplicates test-lint-executable \ test-lint-filenames +ifneq ($(PERL_PATH),) +test-lint: test-lint-shell-syntax +else +GIT_TEST_CHAIN_LINT = 0 +endif ifneq ($(GIT_TEST_CHAIN_LINT),0) test-lint: test-chainlint endif diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c index f3c59e5028..086238c826 100644 --- a/t/helper/test-path-utils.c +++ b/t/helper/test-path-utils.c @@ -323,6 +323,19 @@ int cmd__path_utils(int argc, const char **argv) return 0; } + if (argc >= 2 && !strcmp(argv[1], "readlink")) { + struct strbuf target = STRBUF_INIT; + while (argc > 2) { + if (strbuf_readlink(&target, argv[2], 0) < 0) + die_errno("cannot read link at '%s'", argv[2]); + puts(target.buf); + argc--; + argv++; + } + strbuf_release(&target); + return 0; + } + if (argc >= 2 && !strcmp(argv[1], "absolute_path")) { while (argc > 2) { puts(absolute_path(argv[2])); diff --git a/t/helper/test-sha1.sh b/t/helper/test-sha1.sh index bf387d3db1..f03b784ddc 100755 --- a/t/helper/test-sha1.sh +++ b/t/helper/test-sha1.sh @@ -15,7 +15,7 @@ do { test -z "$pfx" || echo "$pfx" dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null | - perl -pe 'y/\000/g/' + tr "\000" "g" } | ./t/helper/test-tool $sha1 $cnt ) if test "$expect" = "$actual" @@ -61,7 +61,7 @@ do { test -z "$pfx" || echo "$pfx" dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null | - perl -pe 'y/\000/g/' + tr "\000" "g" } | sha1sum | sed -e 's/ .*//' ) diff --git a/t/lib-diff.sh b/t/lib-diff.sh index c4606bd4b7..12b3c8fcc6 100644 --- a/t/lib-diff.sh +++ b/t/lib-diff.sh @@ -21,8 +21,8 @@ compare_diff_raw_z () { # Also we do not check SHA1 hash generation in this test, which # is a job for t0000-basic.sh - perl -pe 'y/\000/\012/' <"$1" | sed -e "$sanitize_diff_raw_z" >.tmp-1 - perl -pe 'y/\000/\012/' <"$2" | sed -e "$sanitize_diff_raw_z" >.tmp-2 + tr "\000" "\012" <"$1" | sed -e "$sanitize_diff_raw_z" >.tmp-1 + tr "\000" "\012" <"$2" | sed -e "$sanitize_diff_raw_z" >.tmp-2 test_cmp .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2 } diff --git a/t/lib-gpg.sh b/t/lib-gpg.sh index 3845b6ac44..937b876bd0 100644 --- a/t/lib-gpg.sh +++ b/t/lib-gpg.sh @@ -192,9 +192,5 @@ test_lazy_prereq GPGSSH_VERIFYTIME ' ' sanitize_pgp() { - perl -ne ' - /^-----END PGP/ and $in_pgp = 0; - print unless $in_pgp; - /^-----BEGIN PGP/ and $in_pgp = 1; - ' + sed "/^-----BEGIN PGP/,/^-----END PGP/{/^-/p;d;}" } diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh index d83bafeab3..5091db949b 100644 --- a/t/lib-httpd.sh +++ b/t/lib-httpd.sh @@ -165,7 +165,7 @@ prepare_httpd() { install_script broken-smart-http.sh install_script error-smart-http.sh install_script error.sh - install_script apply-one-time-perl.sh + install_script apply-one-time-script.sh install_script nph-custom-auth.sh ln -s "$LIB_HTTPD_MODULE_PATH" "$HTTPD_ROOT_PATH/modules" diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf index 022276a6b9..e631ab0eb5 100644 --- a/t/lib-httpd/apache.conf +++ b/t/lib-httpd/apache.conf @@ -135,7 +135,7 @@ SetEnv PERL_PATH ${PERL_PATH} SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} SetEnv GIT_HTTP_EXPORT_ALL </LocationMatch> -<LocationMatch /one_time_perl/> +<LocationMatch /one_time_script/> SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} SetEnv GIT_HTTP_EXPORT_ALL </LocationMatch> @@ -159,7 +159,7 @@ ScriptAliasMatch /smart_*[^/]*/(.*) ${GIT_EXEC_PATH}/git-http-backend/$1 ScriptAlias /broken_smart/ broken-smart-http.sh/ ScriptAlias /error_smart/ error-smart-http.sh/ ScriptAlias /error/ error.sh/ -ScriptAliasMatch /one_time_perl/(.*) apply-one-time-perl.sh/$1 +ScriptAliasMatch /one_time_script/(.*) apply-one-time-script.sh/$1 ScriptAliasMatch /custom_auth/(.*) nph-custom-auth.sh/$1 <Directory ${GIT_EXEC_PATH}> Options FollowSymlinks @@ -182,7 +182,7 @@ ScriptAliasMatch /custom_auth/(.*) nph-custom-auth.sh/$1 <Files error.sh> Options ExecCGI </Files> -<Files apply-one-time-perl.sh> +<Files apply-one-time-script.sh> Options ExecCGI </Files> <Files ${GIT_EXEC_PATH}/git-http-backend> diff --git a/t/lib-httpd/apply-one-time-perl.sh b/t/lib-httpd/apply-one-time-perl.sh deleted file mode 100644 index d7f9fed6ae..0000000000 --- a/t/lib-httpd/apply-one-time-perl.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -# If "one-time-perl" exists in $HTTPD_ROOT_PATH, run perl on the HTTP response, -# using the contents of "one-time-perl" as the perl command to be run. If the -# response was modified as a result, delete "one-time-perl" so that subsequent -# HTTP responses are no longer modified. -# -# This can be used to simulate the effects of the repository changing in -# between HTTP request-response pairs. -if test -f one-time-perl -then - LC_ALL=C - export LC_ALL - - "$GIT_EXEC_PATH/git-http-backend" >out - "$PERL_PATH" -pe "$(cat one-time-perl)" out >out_modified - - if cmp -s out out_modified - then - cat out - else - cat out_modified - rm one-time-perl - fi -else - "$GIT_EXEC_PATH/git-http-backend" -fi diff --git a/t/lib-httpd/apply-one-time-script.sh b/t/lib-httpd/apply-one-time-script.sh new file mode 100644 index 0000000000..b1682944e2 --- /dev/null +++ b/t/lib-httpd/apply-one-time-script.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +# If "one-time-script" exists in $HTTPD_ROOT_PATH, run the script on the HTTP +# response. If the response was modified as a result, delete "one-time-script" +# so that subsequent HTTP responses are no longer modified. +# +# This can be used to simulate the effects of the repository changing in +# between HTTP request-response pairs. +if test -f one-time-script +then + LC_ALL=C + export LC_ALL + + "$GIT_EXEC_PATH/git-http-backend" >out + ./one-time-script out >out_modified + + if cmp -s out out_modified + then + cat out + else + cat out_modified + rm one-time-script + fi +else + "$GIT_EXEC_PATH/git-http-backend" +fi diff --git a/t/lib-t6000.sh b/t/lib-t6000.sh index fba6778ca3..35c5472465 100644 --- a/t/lib-t6000.sh +++ b/t/lib-t6000.sh @@ -109,13 +109,12 @@ check_output () { # All alphanums translated into -'s which are then compressed and stripped # from front and back. name_from_description () { - perl -pe ' - s/[^A-Za-z0-9.]/-/g; - s/-+/-/g; - s/-$//; - s/^-//; - y/A-Z/a-z/; - ' + sed \ + -e 's/[^A-Za-z0-9.]/-/g' \ + -e 's/--*/-/g' \ + -e 's/-$//' \ + -e 's/^-//' \ + -e 'y/A-Z/a-z/' } diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh index c9376dffb5..273d71411f 100755 --- a/t/t0008-ignores.sh +++ b/t/t0008-ignores.sh @@ -39,11 +39,11 @@ test_stderr () { } broken_c_unquote () { - "$PERL_PATH" -pe 's/^"//; s/\\//; s/"$//; tr/\n/\0/' "$@" + sed -e 's/^"//' -e 's/\\//' -e 's/"$//' "$1" | tr '\n' '\0' } broken_c_unquote_verbose () { - "$PERL_PATH" -pe 's/ "/ /; s/\\//; s/"$//; tr/:\t\n/\0/' "$@" + sed -e 's/ "/ /' -e 's/\\//' -e 's/"$//' "$1" | tr ':\t\n' '\000' } stderr_contains () { diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh index 3f6433d304..bf10d253ec 100755 --- a/t/t0021-conversion.sh +++ b/t/t0021-conversion.sh @@ -20,8 +20,7 @@ EOF generate_random_characters () { LEN=$1 NAME=$2 - test-tool genrandom some-seed $LEN | - perl -pe "s/./chr((ord($&) % 26) + ord('a'))/sge" >"$TEST_ROOT/$NAME" + test-tool genrandom some-seed | tr -dc 'a-z' | test_copy_bytes "$LEN" >"$TEST_ROOT/$NAME" } filter_git () { @@ -841,7 +840,7 @@ test_expect_success 'process filter abort stops processing of all further files' ) ' -test_expect_success PERL 'invalid process filter must fail (and not hang!)' ' +test_expect_success 'invalid process filter must fail (and not hang!)' ' test_config_global filter.protocol.process cat && test_config_global filter.protocol.required true && rm -rf repo && @@ -1111,19 +1110,19 @@ do branch) opt='-f HEAD' ;; esac - test_expect_success PERL,TTY "delayed checkout shows progress by default on tty ($mode checkout)" ' + test_expect_success TTY "delayed checkout shows progress by default on tty ($mode checkout)" ' test_delayed_checkout_progress test_terminal git checkout $opt ' - test_expect_success PERL "delayed checkout omits progress on non-tty ($mode checkout)" ' + test_expect_success "delayed checkout omits progress on non-tty ($mode checkout)" ' test_delayed_checkout_progress ! git checkout $opt ' - test_expect_success PERL,TTY "delayed checkout omits progress with --quiet ($mode checkout)" ' + test_expect_success TTY "delayed checkout omits progress with --quiet ($mode checkout)" ' test_delayed_checkout_progress ! test_terminal git checkout --quiet $opt ' - test_expect_success PERL,TTY "delayed checkout honors --[no]-progress ($mode checkout)" ' + test_expect_success TTY "delayed checkout honors --[no]-progress ($mode checkout)" ' test_delayed_checkout_progress ! test_terminal git checkout --no-progress $opt && test_delayed_checkout_progress test_terminal git checkout --quiet --progress $opt ' diff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh index ab80c9ef13..d901588294 100755 --- a/t/t0090-cache-tree.sh +++ b/t/t0090-cache-tree.sh @@ -128,7 +128,7 @@ test_expect_success 'second commit has cache-tree' ' test_cache_tree ' -test_expect_success PERL 'commit --interactive gives cache-tree on partial commit' ' +test_expect_success 'commit --interactive gives cache-tree on partial commit' ' test_when_finished "git reset --hard" && cat <<-\EOT >foo.c && int foo() @@ -162,7 +162,7 @@ test_expect_success PERL 'commit --interactive gives cache-tree on partial commi test_cache_tree expected.status ' -test_expect_success PERL 'commit -p with shrinking cache-tree' ' +test_expect_success 'commit -p with shrinking cache-tree' ' mkdir -p deep/very-long-subdir && echo content >deep/very-long-subdir/file && git add deep && diff --git a/t/t0210-trace2-normal.sh b/t/t0210-trace2-normal.sh index 4287ed3fbb..96c68f65df 100755 --- a/t/t0210-trace2-normal.sh +++ b/t/t0210-trace2-normal.sh @@ -53,10 +53,41 @@ GIT_TRACE2_BRIEF=1 && export GIT_TRACE2_BRIEF # # Implicit return from cmd_<verb> function propagates <code>. +scrub_normal () { + # Scrub the variable fields from the normal trace2 output to make + # testing easier: + # + # 1. Various messages include an elapsed time in the middle of the + # message. Replace the time with a placeholder to simplify our + # HEREDOC in the test script. + # + # 2. We expect: + # + # start <argv0> [<argv1> [<argv2> [...]]] + # + # where argv0 might be a relative or absolute path, with or + # without quotes, and platform dependent. Replace argv0 with a + # token for HEREDOC matching in the test script. + # + # 3. Likewise, the 'cmd_path' message breaks out argv[0]. + # + # This line is only emitted when RUNTIME_PREFIX is defined, + # so just omit it for testing purposes. + # + # 4. 'cmd_ancestry' is not implemented everywhere, so for portability's + # sake, skip it when parsing normal. + sed \ + -e 's/elapsed:[0-9]*\.[0-9][0-9]*\([eE][-+]\{0,1\}[0-9][0-9]*\)\{0,1\}/elapsed:_TIME_/g' \ + -e "s/^start '[^']*' \(.*\)/start _EXE_ \1/" \ + -e 's/^start [^ ][^ ]* \(.*\)/start _EXE_ \1/' \ + -e '/^cmd_path/d' \ + -e '/^cmd_ancestry/d' +} + test_expect_success 'normal stream, return code 0' ' test_when_finished "rm trace.normal actual expect" && GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 001return 0 && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 001return 0 @@ -70,7 +101,7 @@ test_expect_success 'normal stream, return code 0' ' test_expect_success 'normal stream, return code 1' ' test_when_finished "rm trace.normal actual expect" && test_must_fail env GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 001return 1 && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 001return 1 @@ -85,7 +116,7 @@ test_expect_success 'automatic filename' ' test_when_finished "rm -r traces actual expect" && mkdir traces && GIT_TRACE2="$(pwd)/traces" test-tool trace2 001return 0 && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <"$(ls traces/*)" >actual && + scrub_normal <"$(ls traces/*)" >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 001return 0 @@ -103,7 +134,7 @@ test_expect_success 'automatic filename' ' test_expect_success 'normal stream, exit code 0' ' test_when_finished "rm trace.normal actual expect" && GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 002exit 0 && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 002exit 0 @@ -117,7 +148,7 @@ test_expect_success 'normal stream, exit code 0' ' test_expect_success 'normal stream, exit code 1' ' test_when_finished "rm trace.normal actual expect" && test_must_fail env GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 002exit 1 && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 002exit 1 @@ -135,7 +166,7 @@ test_expect_success 'normal stream, exit code 1' ' test_expect_success 'normal stream, error event' ' test_when_finished "rm trace.normal actual expect" && GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 003error "hello world" "this is a test" && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 003error '\''hello world'\'' '\''this is a test'\'' @@ -155,7 +186,7 @@ test_expect_success 'normal stream, error event' ' test_expect_success 'BUG messages are written to trace2' ' test_when_finished "rm trace.normal actual expect" && test_must_fail env GIT_TRACE2="$(pwd)/trace.normal" test-tool trace2 007bug && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 007bug @@ -179,7 +210,7 @@ test_expect_success 'bug messages with BUG_if_bug() are written to trace2' ' sed "s/^.*: //" <err >actual && test_cmp expect actual && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 008bug @@ -205,7 +236,7 @@ test_expect_success 'bug messages without explicit BUG_if_bug() are written to t sed "s/^.*: //" <err >actual && test_cmp expect actual && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 009bug_BUG @@ -230,7 +261,7 @@ test_expect_success 'bug messages followed by BUG() are written to trace2' ' sed "s/^.*: //" <err >actual && test_cmp expect actual && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 010bug_BUG @@ -262,7 +293,7 @@ test_expect_success 'using global config, normal stream, return code 0' ' test_config_global trace2.normalBrief 1 && test_config_global trace2.normalTarget "$(pwd)/trace.normal" && test-tool trace2 001return 0 && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 001return 0 @@ -280,7 +311,7 @@ test_expect_success 'using global config with include' ' mv "$(pwd)/.gitconfig" "$(pwd)/real.gitconfig" && test_config_global include.path "$(pwd)/real.gitconfig" && test-tool trace2 001return 0 && - perl "$TEST_DIRECTORY/t0210/scrub_normal.perl" <trace.normal >actual && + scrub_normal <trace.normal >actual && cat >expect <<-EOF && version $V start _EXE_ trace2 001return 0 diff --git a/t/t0210/scrub_normal.perl b/t/t0210/scrub_normal.perl deleted file mode 100644 index 7cc4de392a..0000000000 --- a/t/t0210/scrub_normal.perl +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/perl -# -# Scrub the variable fields from the normal trace2 output to -# make testing easier. - -use strict; -use warnings; - -my $float = '[0-9]*\.[0-9]+([eE][-+]?[0-9]+)?'; - -# This code assumes that the trace2 data was written with bare -# turned on (which omits the "<clock> <file>:<line>" prefix. - -while (<>) { - # Various messages include an elapsed time in the middle - # of the message. Replace the time with a placeholder to - # simplify our HEREDOC in the test script. - s/elapsed:$float/elapsed:_TIME_/g; - - my $line = $_; - - # we expect: - # start <argv0> [<argv1> [<argv2> [...]]] - # - # where argv0 might be a relative or absolute path, with - # or without quotes, and platform dependent. Replace argv0 - # with a token for HEREDOC matching in the test script. - - if ($line =~ m/^start/) { - $line =~ /^start\s+(.*)/; - my $argv = $1; - $argv =~ m/(\'[^\']*\'|[^ ]+)\s+(.*)/; - my $argv_0 = $1; - my $argv_rest = $2; - - print "start _EXE_ $argv_rest\n"; - } - elsif ($line =~ m/^cmd_path/) { - # Likewise, the 'cmd_path' message breaks out argv[0]. - # - # This line is only emitted when RUNTIME_PREFIX is defined, - # so just omit it for testing purposes. - # print "cmd_path _EXE_\n"; - } - elsif ($line =~ m/^cmd_ancestry/) { - # 'cmd_ancestry' is not implemented everywhere, so for portability's - # sake, skip it when parsing normal. - # - # print "$line"; - } - else { - print "$line"; - } -} diff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh index bac9046540..760cf69087 100755 --- a/t/t0211-trace2-perf.sh +++ b/t/t0211-trace2-perf.sh @@ -4,6 +4,12 @@ test_description='test trace2 facility (perf target)' . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping trace2 tests; Perl not available' + test_done +fi + # Turn off any inherited trace2 settings for this test. sane_unset GIT_TRACE2 GIT_TRACE2_PERF GIT_TRACE2_EVENT sane_unset GIT_TRACE2_PERF_BRIEF diff --git a/t/t0610-reftable-basics.sh b/t/t0610-reftable-basics.sh index 002a75dee8..1be534a895 100755 --- a/t/t0610-reftable-basics.sh +++ b/t/t0610-reftable-basics.sh @@ -653,9 +653,8 @@ test_expect_success 'basic: commit and list refs' ' test_expect_success 'basic: can write large commit message' ' test_when_finished "rm -rf repo" && git init repo && - perl -e " - print \"this is a long commit message\" x 50000 - " >commit-msg && + + awk "BEGIN { for (i = 0; i < 50000; i++) printf \"%s\", \"this is a long commit message\" }" >commit-msg && git -C repo commit --allow-empty --file=../commit-msg ' diff --git a/t/t0613-reftable-write-options.sh b/t/t0613-reftable-write-options.sh index e2708e11d5..42aa1592f8 100755 --- a/t/t0613-reftable-write-options.sh +++ b/t/t0613-reftable-write-options.sh @@ -145,7 +145,7 @@ test_expect_success 'small block size fails with large reflog message' ' ( cd repo && test_commit A && - perl -e "print \"a\" x 500" >logmsg && + test-tool genzeros 500 | tr "\000" "a" >logmsg && cat >expect <<-EOF && fatal: update_ref failed for ref ${SQ}refs/heads/logme${SQ}: reftable: transaction failure: entry too large EOF diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh index 86a2825473..aa64678c64 100755 --- a/t/t1006-cat-file.sh +++ b/t/t1006-cat-file.sh @@ -1323,7 +1323,7 @@ extract_batch_output () { ' "$@" } -test_expect_success 'cat-file --batch-all-objects --batch ignores replace' ' +test_expect_success PERL_TEST_HELPERS 'cat-file --batch-all-objects --batch ignores replace' ' git cat-file --batch-all-objects --batch >actual.raw && extract_batch_output $orig <actual.raw >actual && { @@ -1376,7 +1376,7 @@ test_expect_success 'batch-command flush without --buffer' ' grep "^fatal:.*flush is only for --buffer mode.*" err ' -script=' +perl_script=' use warnings; use strict; use IPC::Open2; @@ -1398,12 +1398,16 @@ $? == 0 or die "\$?=$?"; expect="$hello_oid blob $hello_size" -test_expect_success PERL '--batch-check is unbuffered by default' ' - perl -e "$script" -- --batch-check $hello_oid "$expect" +test_lazy_prereq PERL_IPC_OPEN2 ' + perl -MIPC::Open2 -e "exit 0" ' -test_expect_success PERL '--batch-command info is unbuffered by default' ' - perl -e "$script" -- --batch-command $hello_oid "$expect" "info " +test_expect_success PERL_IPC_OPEN2 '--batch-check is unbuffered by default' ' + perl -e "$perl_script" -- --batch-check $hello_oid "$expect" +' + +test_expect_success PERL_IPC_OPEN2 '--batch-command info is unbuffered by default' ' + perl -e "$perl_script" -- --batch-command $hello_oid "$expect" "info " ' test_done diff --git a/t/t1007-hash-object.sh b/t/t1007-hash-object.sh index a0481139de..b3cf53ff8c 100755 --- a/t/t1007-hash-object.sh +++ b/t/t1007-hash-object.sh @@ -205,7 +205,7 @@ test_expect_success 'too-short tree' ' grep "too-short tree object" err ' -test_expect_success 'malformed mode in tree' ' +test_expect_success PERL_TEST_HELPERS 'malformed mode in tree' ' hex_oid=$(echo foo | git hash-object --stdin -w) && bin_oid=$(echo $hex_oid | hex2oct) && printf "9100644 \0$bin_oid" >tree-with-malformed-mode && @@ -213,7 +213,7 @@ test_expect_success 'malformed mode in tree' ' grep "malformed mode in tree entry" err ' -test_expect_success 'empty filename in tree' ' +test_expect_success PERL_TEST_HELPERS 'empty filename in tree' ' hex_oid=$(echo foo | git hash-object --stdin -w) && bin_oid=$(echo $hex_oid | hex2oct) && printf "100644 \0$bin_oid" >tree-with-empty-filename && @@ -221,7 +221,7 @@ test_expect_success 'empty filename in tree' ' grep "empty filename in tree entry" err ' -test_expect_success 'duplicate filename in tree' ' +test_expect_success PERL_TEST_HELPERS 'duplicate filename in tree' ' hex_oid=$(echo foo | git hash-object --stdin -w) && bin_oid=$(echo $hex_oid | hex2oct) && { diff --git a/t/t1010-mktree.sh b/t/t1010-mktree.sh index c291a2b33d..e9973f7494 100755 --- a/t/t1010-mktree.sh +++ b/t/t1010-mktree.sh @@ -42,13 +42,13 @@ test_expect_success 'ls-tree piped to mktree (2)' ' ' test_expect_success 'ls-tree output in wrong order given to mktree (1)' ' - perl -e "print reverse <>" <top | + sort -r <top | git mktree >actual && test_cmp tree actual ' test_expect_success 'ls-tree output in wrong order given to mktree (2)' ' - perl -e "print reverse <>" <top.withsub | + sort -r <top.withsub | git mktree >actual && test_cmp tree.withsub actual ' diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index 8a456b1142..0105045376 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -346,7 +346,7 @@ test_expect_success 'unparseable tree object' ' test_grep ! "fatal: empty filename in tree entry" out ' -test_expect_success 'tree entry with type mismatch' ' +test_expect_success PERL_TEST_HELPERS 'tree entry with type mismatch' ' test_when_finished "remove_object \$blob" && test_when_finished "remove_object \$tree" && test_when_finished "remove_object \$commit" && @@ -364,7 +364,7 @@ test_expect_success 'tree entry with type mismatch' ' test_grep ! "dangling blob" out ' -test_expect_success 'tree entry with bogus mode' ' +test_expect_success PERL_TEST_HELPERS 'tree entry with bogus mode' ' test_when_finished "remove_object \$blob" && test_when_finished "remove_object \$tree" && blob=$(echo blob | git hash-object -w --stdin) && @@ -984,7 +984,7 @@ corrupt_index_checksum () { # Corrupt the checksum on the index and then # verify that only fsck notices. -test_expect_success 'detect corrupt index file in fsck' ' +test_expect_success PERL_TEST_HELPERS 'detect corrupt index file in fsck' ' cp .git/index .git/index.backup && test_when_finished "mv .git/index.backup .git/index" && corrupt_index_checksum && diff --git a/t/t3300-funny-names.sh b/t/t3300-funny-names.sh index f5bf16abcd..dd0586b007 100755 --- a/t/t3300-funny-names.sh +++ b/t/t3300-funny-names.sh @@ -70,7 +70,7 @@ test_expect_success 'ls-files -z does not quote funny filename' ' tabs ," (dq) and spaces EOF git ls-files -z >ls-files.z && - perl -pe "y/\000/\012/" <ls-files.z >current && + tr "\000" "\012" <ls-files.z >current && test_cmp expected current ' @@ -107,7 +107,7 @@ test_expect_success 'diff-index -z does not quote funny filename' ' tabs ," (dq) and spaces EOF git diff-index -z --name-status $t0 >diff-index.z && - perl -pe "y/\000/\012/" <diff-index.z >current && + tr "\000" "\012" <diff-index.z >current && test_cmp expected current ' @@ -117,7 +117,7 @@ test_expect_success 'diff-tree -z does not quote funny filename' ' tabs ," (dq) and spaces EOF git diff-tree -z --name-status $t0 $t1 >diff-tree.z && - perl -pe y/\\000/\\012/ <diff-tree.z >current && + tr "\000" "\012" <diff-tree.z >current && test_cmp expected current ' diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh index 3855d68dbc..782d97fb7d 100755 --- a/t/t4013-diff-various.sh +++ b/t/t4013-diff-various.sh @@ -11,6 +11,12 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh . "$TEST_DIRECTORY"/lib-diff.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping diff various tests; Perl not available' + test_done +fi + test_expect_success setup ' GIT_AUTHOR_DATE="2006-06-26 00:00:00 +0000" && diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 884f83fb8a..2782b1fc18 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -448,7 +448,7 @@ cat >>expect.no-threading <<EOF --- EOF -test_expect_success 'no threading' ' +test_expect_success PERL_TEST_HELPERS 'no threading' ' git checkout side && check_threading expect.no-threading main ' @@ -466,11 +466,11 @@ In-Reply-To: <0> References: <0> EOF -test_expect_success 'thread' ' +test_expect_success PERL_TEST_HELPERS 'thread' ' check_threading expect.thread --thread main ' -test_expect_success '--thread overrides format.thread=deep' ' +test_expect_success PERL_TEST_HELPERS '--thread overrides format.thread=deep' ' test_config format.thread deep && check_threading expect.thread --thread main ' @@ -490,7 +490,7 @@ In-Reply-To: <1> References: <1> EOF -test_expect_success 'thread in-reply-to' ' +test_expect_success PERL_TEST_HELPERS 'thread in-reply-to' ' check_threading expect.in-reply-to --in-reply-to="<test.message>" \ --thread main ' @@ -512,7 +512,7 @@ In-Reply-To: <0> References: <0> EOF -test_expect_success 'thread cover-letter' ' +test_expect_success PERL_TEST_HELPERS 'thread cover-letter' ' check_threading expect.cover-letter --cover-letter --thread main ' @@ -538,12 +538,12 @@ References: <1> <0> EOF -test_expect_success 'thread cover-letter in-reply-to' ' +test_expect_success PERL_TEST_HELPERS 'thread cover-letter in-reply-to' ' check_threading expect.cl-irt --cover-letter \ --in-reply-to="<test.message>" --thread main ' -test_expect_success 'thread explicit shallow' ' +test_expect_success PERL_TEST_HELPERS 'thread explicit shallow' ' check_threading expect.cl-irt --cover-letter \ --in-reply-to="<test.message>" --thread=shallow main ' @@ -562,7 +562,7 @@ References: <0> <1> EOF -test_expect_success 'thread deep' ' +test_expect_success PERL_TEST_HELPERS 'thread deep' ' check_threading expect.deep --thread=deep main ' @@ -584,7 +584,7 @@ References: <1> <2> EOF -test_expect_success 'thread deep in-reply-to' ' +test_expect_success PERL_TEST_HELPERS 'thread deep in-reply-to' ' check_threading expect.deep-irt --thread=deep \ --in-reply-to="<test.message>" main ' @@ -609,7 +609,7 @@ References: <0> <2> EOF -test_expect_success 'thread deep cover-letter' ' +test_expect_success PERL_TEST_HELPERS 'thread deep cover-letter' ' check_threading expect.deep-cl --cover-letter --thread=deep main ' @@ -638,27 +638,27 @@ References: <1> <3> EOF -test_expect_success 'thread deep cover-letter in-reply-to' ' +test_expect_success PERL_TEST_HELPERS 'thread deep cover-letter in-reply-to' ' check_threading expect.deep-cl-irt --cover-letter \ --in-reply-to="<test.message>" --thread=deep main ' -test_expect_success 'thread via config' ' +test_expect_success PERL_TEST_HELPERS 'thread via config' ' test_config format.thread true && check_threading expect.thread main ' -test_expect_success 'thread deep via config' ' +test_expect_success PERL_TEST_HELPERS 'thread deep via config' ' test_config format.thread deep && check_threading expect.deep main ' -test_expect_success 'thread config + override' ' +test_expect_success PERL_TEST_HELPERS 'thread config + override' ' test_config format.thread deep && check_threading expect.thread --thread main ' -test_expect_success 'thread config + --no-thread' ' +test_expect_success PERL_TEST_HELPERS 'thread config + --no-thread' ' test_config format.thread deep && check_threading expect.no-threading --no-thread main ' diff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh index f1efe482a5..c8a23d5148 100755 --- a/t/t4020-diff-external.sh +++ b/t/t4020-diff-external.sh @@ -237,7 +237,7 @@ check_external_diff 0 empty empty 0 on --quiet check_external_diff 1 empty empty 1 on --quiet check_external_diff 128 empty error 2 on --quiet -echo NULZbetweenZwords | perl -pe 'y/Z/\000/' > file +echo NULZbetweenZwords | tr "Z" "\000" > file test_expect_success 'force diff with "diff"' ' after=$(git hash-object file) && diff --git a/t/t4029-diff-trailing-space.sh b/t/t4029-diff-trailing-space.sh index 32b6e9a4e7..90cdde88d8 100755 --- a/t/t4029-diff-trailing-space.sh +++ b/t/t4029-diff-trailing-space.sh @@ -31,7 +31,8 @@ test_expect_success "$test_description" ' git config --bool diff.suppressBlankEmpty true && git diff f > actual && test_cmp exp actual && - perl -i.bak -p -e "s/^\$/ /" exp && + sed "s/^\$/ /" exp >exp.munged && + mv exp.munged exp && git config --bool diff.suppressBlankEmpty false && git diff f > actual && test_cmp exp actual && diff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh index daebf9796f..f904fc19f6 100755 --- a/t/t4030-diff-textconv.sh +++ b/t/t4030-diff-textconv.sh @@ -20,13 +20,10 @@ cat >expect.text <<'EOF' +1 EOF -cat >hexdump <<'EOF' -#!/bin/sh -"$PERL_PATH" -e '$/ = undef; $_ = <>; s/./ord($&)/ge; print $_' < "$1" -EOF -chmod +x hexdump - test_expect_success 'setup binary file with history' ' + write_script hexdump <<-\EOF && + tr "\000\001" "01" <"$1" + EOF test_commit --printf one file "\\0\\n" && test_commit --printf --append two file "\\01\\n" ' diff --git a/t/t4031-diff-rewrite-binary.sh b/t/t4031-diff-rewrite-binary.sh index c4394a27b5..15e012ccc7 100755 --- a/t/t4031-diff-rewrite-binary.sh +++ b/t/t4031-diff-rewrite-binary.sh @@ -57,24 +57,19 @@ test_expect_success 'diff --stat counts binary rewrite as 0 lines' ' grep " rewrite file" diff ' -{ - echo "#!$SHELL_PATH" - cat <<'EOF' -"$PERL_PATH" -e '$/ = undef; $_ = <>; s/./ord($&)/ge; print $_' < "$1" -EOF -} >dump -chmod +x dump - test_expect_success 'setup textconv' ' + write_script dump <<-\EOF && + test-tool hexdump <"$1" + EOF echo file diff=foo >.gitattributes && git config diff.foo.textconv "\"$(pwd)\""/dump ' test_expect_success 'rewrite diff respects textconv' ' git diff -B >diff && - grep "dissimilarity index" diff && - grep "^-61" diff && - grep "^-0" diff + test_grep "dissimilarity index" diff && + test_grep "^-3d 0a 00" diff && + test_grep "^+3d 0a 01" diff ' test_done diff --git a/t/t4058-diff-duplicates.sh b/t/t4058-diff-duplicates.sh index 2fce4a9897..16266dff2a 100755 --- a/t/t4058-diff-duplicates.sh +++ b/t/t4058-diff-duplicates.sh @@ -13,6 +13,12 @@ test_description='test tree diff when trees have duplicate entries' . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping diff duplicates tests; Perl not available' + test_done +fi + # make_tree_entry <mode> <mode> <sha1> # # We have to rely on perl here because not all printfs understand diff --git a/t/t4103-apply-binary.sh b/t/t4103-apply-binary.sh index d370ecfe0d..8e302a5a57 100755 --- a/t/t4103-apply-binary.sh +++ b/t/t4103-apply-binary.sh @@ -26,10 +26,10 @@ test_expect_success 'setup' ' git commit -m "Initial Version" 2>/dev/null && git checkout -b binary && - perl -pe "y/x/\000/" <file1 >file3 && + tr "x" "\000" <file1 >file3 && cat file3 >file4 && git add file2 && - perl -pe "y/\000/v/" <file3 >file1 && + tr "y" "\000" <file3 >file1 && rm -f file2 && git update-index --add --remove file1 file2 file3 file4 && git commit -m "Second Version" && @@ -158,7 +158,7 @@ test_expect_success 'apply binary -p0 diff' ' test -z "$(git diff --name-status binary -- file3)" ' -test_expect_success 'reject truncated binary diff' ' +test_expect_success PERL_TEST_HELPERS 'reject truncated binary diff' ' do_reset && # this length is calculated to get us very close to diff --git a/t/t4116-apply-reverse.sh b/t/t4116-apply-reverse.sh index 0784ba033a..1e7beab001 100755 --- a/t/t4116-apply-reverse.sh +++ b/t/t4116-apply-reverse.sh @@ -13,14 +13,14 @@ test_description='git apply in reverse test_expect_success setup ' test_write_lines a b c d e f g h i j k l m n >file1 && - perl -pe "y/ijk/\\000\\001\\002/" <file1 >file2 && + tr "ijk" "\000\001\002" <file1 >file2 && git add file1 file2 && git commit -m initial && git tag initial && test_write_lines a b c g h i J K L m o n p q >file1 && - perl -pe "y/mon/\\000\\001\\002/" <file1 >file2 && + tr "mon" "\000\001\002" <file1 >file2 && git commit -a -m second && git tag second && diff --git a/t/t4150-am.sh b/t/t4150-am.sh index 5e2b6c80ea..2ae93d3c96 100755 --- a/t/t4150-am.sh +++ b/t/t4150-am.sh @@ -1084,13 +1084,13 @@ test_expect_success 'am works with multi-line in-body headers' ' Body test" --author="$LONG <long@example.com>" && git format-patch --stdout -1 >patch && # bump from, date, and subject down to in-body header - perl -lpe " - if (/^From:/) { + awk " + /^From:/{ print \"From: x <x\@example.com>\"; print \"Date: Sat, 1 Jan 2000 00:00:00 +0000\"; print \"Subject: x\n\"; - } - " patch >msg && + }; 1 + " <patch >msg && git checkout HEAD^ && git am msg && # Ensure that the author and full message are present diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh index b0a3e84984..204325f4d5 100755 --- a/t/t4200-rerere.sh +++ b/t/t4200-rerere.sh @@ -81,7 +81,7 @@ test_expect_success 'activate rerere, old style (conflicting merge)' ' test_might_fail git config --unset rerere.enabled && test_must_fail git merge first && - sha1=$(perl -pe "s/ .*//" .git/MERGE_RR) && + sha1=$(sed "s/ .*//" .git/MERGE_RR) && rr=.git/rr-cache/$sha1 && grep "^=======\$" $rr/preimage && ! test -f $rr/postimage && @@ -94,7 +94,7 @@ test_expect_success 'rerere.enabled works, too' ' git reset --hard && test_must_fail git merge first && - sha1=$(perl -pe "s/ .*//" .git/MERGE_RR) && + sha1=$(sed "s/ .*//" .git/MERGE_RR) && rr=.git/rr-cache/$sha1 && grep ^=======$ $rr/preimage ' @@ -104,7 +104,7 @@ test_expect_success 'set up rr-cache' ' git config rerere.enabled true && git reset --hard && test_must_fail git merge first && - sha1=$(perl -pe "s/ .*//" .git/MERGE_RR) && + sha1=$(sed "s/ .*//" .git/MERGE_RR) && rr=.git/rr-cache/$sha1 ' @@ -188,7 +188,7 @@ test_expect_success 'rerere updates postimage timestamp' ' test_expect_success 'rerere clear' ' mv $rr/postimage .git/post-saved && - echo "$sha1 a1" | perl -pe "y/\012/\000/" >.git/MERGE_RR && + echo "$sha1 a1" | tr "\012" "\000" >.git/MERGE_RR && git rerere clear && ! test -d $rr ' diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index f81e42a84d..8f2ba98963 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -698,7 +698,7 @@ test_expect_success '%(trailers:only=no,only=true) shows only "key: value" trail test_cmp expect actual ' -test_expect_success '%(trailers:unfold) unfolds trailers' ' +test_expect_success PERL_TEST_HELPERS '%(trailers:unfold) unfolds trailers' ' git log --no-walk --pretty="%(trailers:unfold)" >actual && { unfold <trailers && @@ -707,7 +707,7 @@ test_expect_success '%(trailers:unfold) unfolds trailers' ' test_cmp expect actual ' -test_expect_success ':only and :unfold work together' ' +test_expect_success PERL_TEST_HELPERS ':only and :unfold work together' ' git log --no-walk --pretty="%(trailers:only,unfold)" >actual && git log --no-walk --pretty="%(trailers:unfold,only)" >reverse && test_cmp actual reverse && @@ -754,7 +754,7 @@ test_expect_success '%(trailers:key=foo) handles multiple lines even if folded' test_cmp expect actual ' -test_expect_success '%(trailers:key=foo,unfold) properly unfolds' ' +test_expect_success PERL_TEST_HELPERS '%(trailers:key=foo,unfold) properly unfolds' ' git log --no-walk --pretty="format:%(trailers:key=Signed-Off-by,unfold)" >actual && unfold <trailers | grep Signed-off-by >expect && test_cmp expect actual diff --git a/t/t4216-log-bloom.sh b/t/t4216-log-bloom.sh index 3f163dc396..8910d53cac 100755 --- a/t/t4216-log-bloom.sh +++ b/t/t4216-log-bloom.sh @@ -738,20 +738,20 @@ check_corrupt_graph () { test_cmp expect.out out } -test_expect_success 'Bloom reader notices too-small data chunk' ' +test_expect_success PERL_TEST_HELPERS 'Bloom reader notices too-small data chunk' ' check_corrupt_graph BDAT clear 00000000 && echo "warning: ignoring too-small changed-path chunk" \ "(4 < 12) in commit-graph file" >expect.err && test_cmp expect.err err ' -test_expect_success 'Bloom reader notices out-of-bounds filter offsets' ' +test_expect_success PERL_TEST_HELPERS 'Bloom reader notices out-of-bounds filter offsets' ' check_corrupt_graph BIDX 12 FFFFFFFF && # use grep to avoid depending on exact chunk size grep "warning: ignoring out-of-range offset (4294967295) for changed-path filter at pos 3 of .git/objects/info/commit-graph" err ' -test_expect_success 'Bloom reader notices too-small index chunk' ' +test_expect_success PERL_TEST_HELPERS 'Bloom reader notices too-small index chunk' ' # replace the index with a single entry, making most # lookups out-of-bounds check_corrupt_graph BIDX clear 00000000 && @@ -760,7 +760,7 @@ test_expect_success 'Bloom reader notices too-small index chunk' ' test_cmp expect.err err ' -test_expect_success 'Bloom reader notices out-of-order index offsets' ' +test_expect_success PERL_TEST_HELPERS 'Bloom reader notices out-of-order index offsets' ' # we do not know any real offsets, but we can pick # something plausible; we should not get to the point of # actually reading from the bogus offsets anyway. diff --git a/t/t5004-archive-corner-cases.sh b/t/t5004-archive-corner-cases.sh index 50344e17ca..5174995191 100755 --- a/t/t5004-archive-corner-cases.sh +++ b/t/t5004-archive-corner-cases.sh @@ -4,6 +4,12 @@ test_description='test corner cases of git-archive' . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping archive corner cases tests; Perl not available' + test_done +fi + # the 10knuls.tar file is used to test for an empty git generated tar # without having to invoke tar because an otherwise valid empty GNU tar # will be considered broken by {Open,Net}BSD tar diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index 5ac8d39094..a5932b6a8b 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -9,9 +9,9 @@ test_description='git pack-object' test_expect_success 'setup' ' rm -f .git/index* && - perl -e "print \"a\" x 4096;" >a && - perl -e "print \"b\" x 4096;" >b && - perl -e "print \"c\" x 4096;" >c && + test-tool genzeros 4096 | tr "\000" "a" >a && + test-tool genzeros 4096 | tr "\000" "b" >b && + test-tool genzeros 4096 | tr "\000" "c" >c && test-tool genrandom "seed a" 2097152 >a_big && test-tool genrandom "seed b" 2097152 >b_big && git update-index --add a a_big b b_big c && @@ -140,7 +140,7 @@ test_expect_success 'pack-object <stdin parsing: --stdin-packs handles garbage' # usage: check_deltas <stderr_from_pack_objects> <cmp_op> <nr_deltas> # e.g.: check_deltas stderr -gt 0 check_deltas() { - deltas=$(perl -lne '/delta (\d+)/ and print $1' "$1") && + deltas=$(sed -n 's/Total [0-9][0-9]* (delta \([0-9][0-9]*\)).*/\1/p' "$1") && shift && if ! test "$deltas" "$@" then @@ -215,7 +215,7 @@ test_expect_success 'unpack with OFS_DELTA (core.fsyncmethod=batch)' ' check_unpack test-3-${packname_3} obj-list "$BATCH_CONFIGURATION" ' -test_expect_success 'compare delta flavors' ' +test_expect_success PERL_TEST_HELPERS 'compare delta flavors' ' perl -e '\'' defined($_ = -s $_) or die for @ARGV; exit 1 if $ARGV[0] <= $ARGV[1]; diff --git a/t/t5303-pack-corruption-resilience.sh b/t/t5303-pack-corruption-resilience.sh index de58ca654a..ab99c8b685 100755 --- a/t/t5303-pack-corruption-resilience.sh +++ b/t/t5303-pack-corruption-resilience.sh @@ -103,7 +103,8 @@ test_expect_success 'create corruption in data of first object' ' create_new_pack && git prune-packed && chmod +w ${pack}.pack && - perl -i.bak -pe "s/ base /abcdef/" ${pack}.pack && + sed "s/ base /abcdef/" ${pack}.pack >${pack}.pack.munged && + mv ${pack}.pack.munged ${pack}.pack && test_must_fail git cat-file blob $blob_1 > /dev/null && test_must_fail git cat-file blob $blob_2 > /dev/null && test_must_fail git cat-file blob $blob_3 > /dev/null @@ -160,7 +161,8 @@ test_expect_success 'create corruption in data of first delta' ' create_new_pack && git prune-packed && chmod +w ${pack}.pack && - perl -i.bak -pe "s/ delta1 /abcdefgh/" ${pack}.pack && + sed "s/ delta1 /abcdefgh/" ${pack}.pack >${pack}.pack.munged && + mv ${pack}.pack.munged ${pack}.pack && git cat-file blob $blob_1 > /dev/null && test_must_fail git cat-file blob $blob_2 > /dev/null && test_must_fail git cat-file blob $blob_3 > /dev/null diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh index 621bbbdd26..a62b463eaf 100755 --- a/t/t5310-pack-bitmaps.sh +++ b/t/t5310-pack-bitmaps.sh @@ -421,7 +421,7 @@ test_bitmap_cases () { # mark the commits which did not receive bitmaps as preferred, # and generate the bitmap again - perl -pe "s{^}{create refs/tags/include/$. }" <before | + sed "s|\(.*\)|create refs/tags/include/\1 \1|" before | git update-ref --stdin && git -c pack.preferBitmapTips=refs/tags/include repack -adb && diff --git a/t/t5316-pack-delta-depth.sh b/t/t5316-pack-delta-depth.sh index 32cf422745..defaa06d65 100755 --- a/t/t5316-pack-delta-depth.sh +++ b/t/t5316-pack-delta-depth.sh @@ -76,11 +76,11 @@ test_expect_success 'create series of packs' ' max_chain() { git index-pack --verify-stat-only "$1" >output && - perl -lne ' - BEGIN { $len = 0 } - /chain length = (\d+)/ and $len = $1; - END { print $len } - ' output + awk ' + BEGIN { len=0 } + /chain length = [0-9]+:/{ len=$4 } + END { print len } + ' <output | tr -d ':' } # Note that this whole setup is pretty reliant on the current diff --git a/t/t5318-commit-graph.sh b/t/t5318-commit-graph.sh index f68f64cd85..0b3404f58f 100755 --- a/t/t5318-commit-graph.sh +++ b/t/t5318-commit-graph.sh @@ -837,7 +837,7 @@ check_corrupt_chunk () { test_cmp expect.out out } -test_expect_success 'reader notices too-small oid fanout chunk' ' +test_expect_success PERL_TEST_HELPERS 'reader notices too-small oid fanout chunk' ' # make it big enough that the graph file is plausible, # otherwise we hit an earlier check check_corrupt_chunk OIDF clear $(printf "000000%02x" $(test_seq 250)) && @@ -848,7 +848,7 @@ test_expect_success 'reader notices too-small oid fanout chunk' ' test_cmp expect.err err ' -test_expect_success 'reader notices fanout/lookup table mismatch' ' +test_expect_success PERL_TEST_HELPERS 'reader notices fanout/lookup table mismatch' ' check_corrupt_chunk OIDF 1020 "FFFFFFFF" && cat >expect.err <<-\EOF && error: commit-graph OID lookup chunk is the wrong size @@ -857,7 +857,7 @@ test_expect_success 'reader notices fanout/lookup table mismatch' ' test_cmp expect.err err ' -test_expect_success 'reader notices out-of-bounds fanout' ' +test_expect_success PERL_TEST_HELPERS 'reader notices out-of-bounds fanout' ' # Rather than try to corrupt a specific hash, we will just # wreck them all. But we cannot just set them all to 0xFFFFFFFF or # similar, as they are used for hi/lo starts in a binary search (so if @@ -873,7 +873,7 @@ test_expect_success 'reader notices out-of-bounds fanout' ' test_cmp expect.err err ' -test_expect_success 'reader notices too-small commit data chunk' ' +test_expect_success PERL_TEST_HELPERS 'reader notices too-small commit data chunk' ' check_corrupt_chunk CDAT clear 00000000 && cat >expect.err <<-\EOF && error: commit-graph commit data chunk is wrong size @@ -882,7 +882,7 @@ test_expect_success 'reader notices too-small commit data chunk' ' test_cmp expect.err err ' -test_expect_success 'reader notices out-of-bounds extra edge' ' +test_expect_success PERL_TEST_HELPERS 'reader notices out-of-bounds extra edge' ' check_corrupt_chunk EDGE clear && cat >expect.err <<-\EOF && error: commit-graph extra-edges pointer out of bounds @@ -890,7 +890,7 @@ test_expect_success 'reader notices out-of-bounds extra edge' ' test_cmp expect.err err ' -test_expect_success 'reader notices too-small generations chunk' ' +test_expect_success PERL_TEST_HELPERS 'reader notices too-small generations chunk' ' check_corrupt_chunk GDA2 clear 00000000 && cat >expect.err <<-\EOF && error: commit-graph generations chunk is wrong size diff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh index 0f215ad2e8..bd75dea950 100755 --- a/t/t5319-multi-pack-index.sh +++ b/t/t5319-multi-pack-index.sh @@ -1120,7 +1120,7 @@ corrupt_chunk () { corrupt_chunk_file $midx "$@" } -test_expect_success 'reader notices too-small oid fanout chunk' ' +test_expect_success PERL_TEST_HELPERS 'reader notices too-small oid fanout chunk' ' corrupt_chunk OIDF clear 00000000 && test_must_fail git log 2>err && cat >expect <<-\EOF && @@ -1130,7 +1130,7 @@ test_expect_success 'reader notices too-small oid fanout chunk' ' test_cmp expect err ' -test_expect_success 'reader notices too-small oid lookup chunk' ' +test_expect_success PERL_TEST_HELPERS 'reader notices too-small oid lookup chunk' ' corrupt_chunk OIDL clear 00000000 && test_must_fail git log 2>err && cat >expect <<-\EOF && @@ -1140,7 +1140,7 @@ test_expect_success 'reader notices too-small oid lookup chunk' ' test_cmp expect err ' -test_expect_success 'reader notices too-small pack names chunk' ' +test_expect_success PERL_TEST_HELPERS 'reader notices too-small pack names chunk' ' # There is no NUL to terminate the name here, so the # chunk is too short. corrupt_chunk PNAM clear 70656666 && @@ -1151,7 +1151,7 @@ test_expect_success 'reader notices too-small pack names chunk' ' test_cmp expect err ' -test_expect_success 'reader handles unaligned chunks' ' +test_expect_success PERL_TEST_HELPERS 'reader handles unaligned chunks' ' # A 9-byte PNAM means all of the subsequent chunks # will no longer be 4-byte aligned, but it is still # a valid one-pack chunk on its own (it is "foo.pack\0"). @@ -1165,7 +1165,7 @@ test_expect_success 'reader handles unaligned chunks' ' test_cmp expect.err err ' -test_expect_success 'reader notices too-small object offset chunk' ' +test_expect_success PERL_TEST_HELPERS 'reader notices too-small object offset chunk' ' corrupt_chunk OOFF clear 00000000 && test_must_fail git log 2>err && cat >expect <<-\EOF && @@ -1175,7 +1175,7 @@ test_expect_success 'reader notices too-small object offset chunk' ' test_cmp expect err ' -test_expect_success 'reader bounds-checks large offset table' ' +test_expect_success PERL_TEST_HELPERS 'reader bounds-checks large offset table' ' # re-use the objects64 dir here to cheaply get access to a midx # with large offsets. git init repo && @@ -1197,7 +1197,7 @@ test_expect_success 'reader bounds-checks large offset table' ' ) ' -test_expect_success 'reader notices too-small revindex chunk' ' +test_expect_success PERL_TEST_HELPERS 'reader notices too-small revindex chunk' ' # We only get a revindex with bitmaps (and likewise only # load it when they are asked for). test_config repack.writeBitmaps true && @@ -1214,7 +1214,7 @@ test_expect_success 'reader notices too-small revindex chunk' ' test_cmp expect.err err ' -test_expect_success 'reader notices out-of-bounds fanout' ' +test_expect_success PERL_TEST_HELPERS 'reader notices out-of-bounds fanout' ' # This is similar to the out-of-bounds fanout test in t5318. The values # in adjacent entries should be large but not identical (they # are used as hi/lo starts for a binary search, which would then abort diff --git a/t/t5324-split-commit-graph.sh b/t/t5324-split-commit-graph.sh index a32be3867d..49a057cc2e 100755 --- a/t/t5324-split-commit-graph.sh +++ b/t/t5324-split-commit-graph.sh @@ -401,7 +401,7 @@ test_expect_success 'verify across alternates' ' ) ' -test_expect_success 'reader bounds-checks base-graph chunk' ' +test_expect_success PERL_TEST_HELPERS 'reader bounds-checks base-graph chunk' ' git clone --no-hardlinks . corrupt-base-chunk && ( cd corrupt-base-chunk && diff --git a/t/t5326-multi-pack-bitmaps.sh b/t/t5326-multi-pack-bitmaps.sh index d27557b9b0..892aeb09e4 100755 --- a/t/t5326-multi-pack-bitmaps.sh +++ b/t/t5326-multi-pack-bitmaps.sh @@ -176,8 +176,8 @@ test_midx_bitmap_cases () { comm -13 bitmaps commits >before && test_line_count = 1 before && - perl -ne "printf(\"create refs/tags/include/%d \", $.); print" \ - <before | git update-ref --stdin && + sed "s|\(.*\)|create refs/tags/include/\1 \1|" before | + git update-ref --stdin && rm -fr $midx-$(midx_checksum $objdir).bitmap && rm -fr $midx && diff --git a/t/t5328-commit-graph-64bit-time.sh b/t/t5328-commit-graph-64bit-time.sh index a766a3e3f8..d8891e6a92 100755 --- a/t/t5328-commit-graph-64bit-time.sh +++ b/t/t5328-commit-graph-64bit-time.sh @@ -74,7 +74,7 @@ test_expect_success 'single commit with generation data exceeding UINT32_MAX' ' git -C repo-uint32-max commit-graph verify ' -test_expect_success 'reader notices out-of-bounds generation overflow' ' +test_expect_success PERL_TEST_HELPERS 'reader notices out-of-bounds generation overflow' ' graph=.git/objects/info/commit-graph && test_when_finished "rm -rf $graph" && git commit-graph write --reachable && diff --git a/t/t5333-pseudo-merge-bitmaps.sh b/t/t5333-pseudo-merge-bitmaps.sh index 3905cb6e4f..56674db562 100755 --- a/t/t5333-pseudo-merge-bitmaps.sh +++ b/t/t5333-pseudo-merge-bitmaps.sh @@ -28,9 +28,8 @@ test_pseudo_merges_reused () { tag_everything () { git rev-list --all --no-object-names >in && - perl -lne ' - print "create refs/tags/" . $. . " " . $1 if /([0-9a-f]+)/ - ' <in | git update-ref --stdin + sed 's|\(.*\)|create refs/tags/\1 \1|' in | + git update-ref --stdin } test_expect_success 'setup' ' @@ -102,7 +101,7 @@ test_expect_success 'stale bitmap traversal with pseudo-merges' ' test_cmp expect actual ' -test_expect_success 'bitmapPseudoMerge.sampleRate adjusts commit selection rate' ' +test_expect_success PERL_TEST_HELPERS 'bitmapPseudoMerge.sampleRate adjusts commit selection rate' ' test_config bitmapPseudoMerge.test.pattern "refs/tags/" && test_config bitmapPseudoMerge.test.maxMerges 1 && test_config bitmapPseudoMerge.test.stableThreshold never && @@ -235,8 +234,7 @@ test_expect_success 'pseudo-merge pattern with capture groups' ' test_commit_bulk 16 && git rev-list HEAD~16.. >in && - - perl -lne "print \"create refs/remotes/$r/tags/\$. \$_\"" <in | + sed "s|\(.*\)|create refs/remotes/$r/tags/\1 \1" in | git update-ref --stdin || return 1 done && @@ -252,7 +250,7 @@ test_expect_success 'pseudo-merge pattern with capture groups' ' do test_pseudo_merge_commits $m >oids && grep -f oids refs | - perl -lne "print \$1 if /refs\/remotes\/([0-9]+)/" | + sed -n "s|refs/remotes/\([0-9][0-9]*\)/|\1|p" && sort -u || return 1 done >remotes && diff --git a/t/t5400-send-pack.sh b/t/t5400-send-pack.sh index 8f018d2f23..83b42ff073 100755 --- a/t/t5400-send-pack.sh +++ b/t/t5400-send-pack.sh @@ -275,7 +275,7 @@ extract_ref_advertisement () { ' } -test_expect_success 'receive-pack de-dupes .have lines' ' +test_expect_success PERL_TEST_HELPERS 'receive-pack de-dupes .have lines' ' git init shared && git -C shared commit --allow-empty -m both && git clone -s shared fork && diff --git a/t/t5410-receive-pack-alternates.sh b/t/t5410-receive-pack-alternates.sh index 0b28e4e452..4e82fd102e 100755 --- a/t/t5410-receive-pack-alternates.sh +++ b/t/t5410-receive-pack-alternates.sh @@ -17,7 +17,7 @@ test_expect_success 'setup' ' ' extract_haves () { - depacketize | perl -lne '/^(\S+) \.have/ and print $1' + depacketize | sed -n 's/^\([^ ][^ ]*\) \.have/\1/p' } test_expect_success 'with core.alternateRefsCommand' ' diff --git a/t/t5503-tagfollow.sh b/t/t5503-tagfollow.sh index 845ca43ea0..febe441041 100755 --- a/t/t5503-tagfollow.sh +++ b/t/t5503-tagfollow.sh @@ -7,6 +7,12 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping tagfollow tests; Perl not available' + test_done +fi + # End state of the repository: # # T - tag1 S - tag2 diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh index 58074506c5..438250c75e 100755 --- a/t/t5504-fetch-receive-strict.sh +++ b/t/t5504-fetch-receive-strict.sh @@ -359,7 +359,7 @@ test_expect_success \ grep "Cannot demote unterminatedheader" act ' -test_expect_success 'badFilemode is not a strict error' ' +test_expect_success PERL_TEST_HELPERS 'badFilemode is not a strict error' ' git init --bare badmode.git && tree=$( cd badmode.git && diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 690755d2a8..7a7818006e 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -8,6 +8,12 @@ test_description='Per branch config variables affects "git fetch". . ./test-lib.sh . "$TEST_DIRECTORY"/lib-bundle.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping fetch tests; Perl not available' + test_done +fi + D=$(pwd) test_expect_success setup ' diff --git a/t/t5532-fetch-proxy.sh b/t/t5532-fetch-proxy.sh index 3755822629..95d0f33b29 100755 --- a/t/t5532-fetch-proxy.sh +++ b/t/t5532-fetch-proxy.sh @@ -4,6 +4,12 @@ test_description='fetching via git:// using core.gitproxy' . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping fetch proxy tests; Perl not available' + test_done +fi + test_expect_success 'setup remote repo' ' git init remote && (cd remote && diff --git a/t/t5534-push-signed.sh b/t/t5534-push-signed.sh index c91a62b77a..2a782214ee 100755 --- a/t/t5534-push-signed.sh +++ b/t/t5534-push-signed.sh @@ -205,7 +205,7 @@ test_expect_success GPG 'inconsistent push options in signed push not allowed' ' # Tweak the push output to make the push option outside the cert # different, then replay it on a fresh dst, checking that ff is not # deleted. - perl -pe "s/([^ ])bar/\$1baz/" push >push.tweak && + sed "s/\([^ ]\)bar/\1baz/" push >push.tweak && prepare_dst && git -C dst config receive.certnonceseed sekrit && git -C dst config receive.advertisepushoptions 1 && diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh index 37f7547a4c..6588ce6226 100755 --- a/t/t5537-fetch-shallow.sh +++ b/t/t5537-fetch-shallow.sh @@ -271,22 +271,21 @@ test_expect_success 'shallow fetches check connectivity before writing shallow f git -C "$REPO" config protocol.version 2 && git -C client config protocol.version 2 && - git -C client fetch --depth=2 "$HTTPD_URL/one_time_perl/repo" main:a_branch && + git -C client fetch --depth=2 "$HTTPD_URL/one_time_script/repo" main:a_branch && # Craft a situation in which the server sends back an unshallow request # with an empty packfile. This is done by refetching with a shorter # depth (to ensure that the packfile is empty), and overwriting the # shallow line in the response with the unshallow line we want. - printf "$(test_oid perl)" \ - "$(git -C "$REPO" rev-parse HEAD)" \ - "$(git -C "$REPO" rev-parse HEAD^)" \ - >"$HTTPD_ROOT_PATH/one-time-perl" && + write_script "$HTTPD_ROOT_PATH/one-time-script" <<-EOF && + sed "$(printf "$(test_oid perl)" "$(git -C "$REPO" rev-parse HEAD)" "$(git -C "$REPO" rev-parse HEAD^)")" "\$1" + EOF test_must_fail env GIT_TEST_SIDEBAND_ALL=0 git -C client \ - fetch --depth=1 "$HTTPD_URL/one_time_perl/repo" \ + fetch --depth=1 "$HTTPD_URL/one_time_script/repo" \ main:a_branch && - # Ensure that the one-time-perl script was used. - ! test -e "$HTTPD_ROOT_PATH/one-time-perl" && + # Ensure that the one-time-script script was used. + ! test -e "$HTTPD_ROOT_PATH/one-time-script" && # Ensure that the resulting repo is consistent, despite our failure to # fetch. diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh index 761fdfcfe6..b0d4ea7801 100755 --- a/t/t5551-http-fetch-smart.sh +++ b/t/t5551-http-fetch-smart.sh @@ -7,6 +7,13 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh . "$TEST_DIRECTORY"/lib-httpd.sh + +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping http fetch smart tests; Perl not available' + test_done +fi + test "$HTTP_PROTO" = "HTTP/2" && enable_http2 start_httpd diff --git a/t/t5562-http-backend-content-length.sh b/t/t5562-http-backend-content-length.sh index f3b158274c..b6ee06f5c8 100755 --- a/t/t5562-http-backend-content-length.sh +++ b/t/t5562-http-backend-content-length.sh @@ -4,6 +4,12 @@ test_description='test git-http-backend respects CONTENT_LENGTH' . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping http backend content tests; Perl not available' + test_done +fi + test_lazy_prereq GZIP 'gzip --version' verify_http_result() { diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index d0c18660e3..d743d986c4 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -649,7 +649,7 @@ test_expect_success 'GIT_TRACE_PACKFILE produces a usable pack' ' git -C replay.git index-pack -v --stdin <tmp.pack ' -test_expect_success 'clone on case-insensitive fs' ' +test_expect_success PERL_TEST_HELPERS 'clone on case-insensitive fs' ' git init icasefs && ( cd icasefs && @@ -662,7 +662,7 @@ test_expect_success 'clone on case-insensitive fs' ' ) ' -test_expect_success CASE_INSENSITIVE_FS 'colliding file detection' ' +test_expect_success PERL_TEST_HELPERS,CASE_INSENSITIVE_FS 'colliding file detection' ' grep X icasefs/warning && grep x icasefs/warning && test_grep "the following paths have collided" icasefs/warning diff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh index 4650451964..1e354e057f 100755 --- a/t/t5616-partial-clone.sh +++ b/t/t5616-partial-clone.sh @@ -737,18 +737,22 @@ intersperse () { sed 's/\(..\)/'$1'\1/g' } -# Create a one-time-perl command to replace the existing packfile with $1. +# Create a one-time-script command to replace the existing packfile with $1. replace_packfile () { - # The protocol requires that the packfile be sent in sideband 1, hence - # the extra \x01 byte at the beginning. - cp $1 "$HTTPD_ROOT_PATH/one-time-pack" && - echo 'if (/packfile/) { - print; - my $length = -s "one-time-pack"; - printf "%04x\x01", $length + 5; - print `cat one-time-pack` . "0000"; - last - }' >"$HTTPD_ROOT_PATH/one-time-perl" + cp "$1" one-time-pack && + write_script "$HTTPD_ROOT_PATH/one-time-script" <<-EOF + if grep packfile "\$1" >/dev/null + then + sed '/packfile/q' "\$1" && + # The protocol requires that the packfile be sent in sideband + # 1, hence the extra \001 byte at the beginning. + printf "%04x\001" \$((\$(wc -c <"$PWD/one-time-pack") + 5)) && + cat "$PWD/one-time-pack" && + printf "0000" + else + cat "\$1" + fi + EOF } test_expect_success 'upon cloning, check that all refs point to objects' ' @@ -776,12 +780,12 @@ test_expect_success 'upon cloning, check that all refs point to objects' ' # section header. test_config -C "$SERVER" protocol.version 2 && test_must_fail git -c protocol.version=2 clone \ - --filter=blob:none $HTTPD_URL/one_time_perl/server repo 2>err && + --filter=blob:none $HTTPD_URL/one_time_script/server repo 2>err && test_grep "did not send all necessary objects" err && - # Ensure that the one-time-perl script was used. - ! test -e "$HTTPD_ROOT_PATH/one-time-perl" + # Ensure that the one-time-script script was used. + ! test -e "$HTTPD_ROOT_PATH/one-time-script" ' test_expect_success 'when partial cloning, tolerate server not sending target of tag' ' @@ -818,14 +822,14 @@ test_expect_success 'when partial cloning, tolerate server not sending target of # Exercise to make sure it works. git -c protocol.version=2 clone \ - --filter=blob:none $HTTPD_URL/one_time_perl/server repo 2> err && + --filter=blob:none $HTTPD_URL/one_time_script/server repo 2> err && ! grep "missing object referenced by" err && - # Ensure that the one-time-perl script was used. - ! test -e "$HTTPD_ROOT_PATH/one-time-perl" + # Ensure that the one-time-script script was used. + ! test -e "$HTTPD_ROOT_PATH/one-time-script" ' -test_expect_success 'tolerate server sending REF_DELTA against missing promisor objects' ' +test_expect_success PERL_TEST_HELPERS 'tolerate server sending REF_DELTA against missing promisor objects' ' SERVER="$HTTPD_DOCUMENT_ROOT_PATH/server" && rm -rf "$SERVER" repo && test_create_repo "$SERVER" && @@ -845,7 +849,7 @@ test_expect_success 'tolerate server sending REF_DELTA against missing promisor # Clone. The client has deltabase_have but not deltabase_missing. git -c protocol.version=2 clone --no-checkout \ - --filter=blob:none $HTTPD_URL/one_time_perl/server repo && + --filter=blob:none $HTTPD_URL/one_time_script/server repo && git -C repo hash-object -w -- "$SERVER/have.txt" && # Sanity check to ensure that the client does not have @@ -899,8 +903,8 @@ test_expect_success 'tolerate server sending REF_DELTA against missing promisor grep "want $(cat deltabase_missing)" trace && ! grep "want $(cat deltabase_have)" trace && - # Ensure that the one-time-perl script was used. - ! test -e "$HTTPD_ROOT_PATH/one-time-perl" + # Ensure that the one-time-script script was used. + ! test -e "$HTTPD_ROOT_PATH/one-time-script" ' # DO NOT add non-httpd-specific tests here, because the last part of this diff --git a/t/t5701-git-serve.sh b/t/t5701-git-serve.sh index 678a346ed0..d4c28bae39 100755 --- a/t/t5701-git-serve.sh +++ b/t/t5701-git-serve.sh @@ -228,7 +228,10 @@ test_expect_success 'ignore very large set of prefixes' ' echo command=ls-refs && echo object-format=$(test_oid algo) && echo 0001 && - perl -le "print \"ref-prefix refs/heads/\$_\" for (1..65536)" && + awk "{ + for (i = 1; i <= 65536; i++) + print \"ref-prefix refs/heads/\", \$i + }" && echo 0000 } | test-tool pkt-line pack >in && diff --git a/t/t5702-protocol-v2.sh b/t/t5702-protocol-v2.sh index 4d0cbe9872..f826ac46a5 100755 --- a/t/t5702-protocol-v2.sh +++ b/t/t5702-protocol-v2.sh @@ -1174,11 +1174,12 @@ test_expect_success 'when server sends "ready", expect DELIM' ' # After "ready" in the acknowledgments section, pretend that a FLUSH # (0000) was sent instead of a DELIM (0001). - printf "\$ready = 1 if /ready/; \$ready && s/0001/0000/" \ - >"$HTTPD_ROOT_PATH/one-time-perl" && + write_script "$HTTPD_ROOT_PATH/one-time-script" <<-\EOF && + sed "/ready/{n;s/0001/0000/;}" "$1" + EOF test_must_fail git -C http_child -c protocol.version=2 \ - fetch "$HTTPD_URL/one_time_perl/http_parent" 2> err && + fetch "$HTTPD_URL/one_time_script/http_parent" 2> err && test_grep "expected packfile to be sent after .ready." err ' @@ -1199,12 +1200,13 @@ test_expect_success 'when server does not send "ready", expect FLUSH' ' # After the acknowledgments section, pretend that a DELIM # (0001) was sent instead of a FLUSH (0000). - printf "\$ack = 1 if /acknowledgments/; \$ack && s/0000/0001/" \ - >"$HTTPD_ROOT_PATH/one-time-perl" && + write_script "$HTTPD_ROOT_PATH/one-time-script" <<-\EOF && + sed "/acknowledgments/,//{s/0000/0001/;}" "$1" + EOF test_must_fail env GIT_TRACE_PACKET="$(pwd)/log" git -C http_child \ -c protocol.version=2 \ - fetch "$HTTPD_URL/one_time_perl/http_parent" 2> err && + fetch "$HTTPD_URL/one_time_script/http_parent" 2> err && grep "fetch< .*acknowledgments" log && ! grep "fetch< .*ready" log && test_grep "expected no other sections to be sent after no .ready." err @@ -1490,12 +1492,13 @@ test_expect_success 'http:// --negotiate-only' ' test_expect_success 'http:// --negotiate-only without wait-for-done support' ' SERVER="server" && - URI="$HTTPD_URL/one_time_perl/server" && + URI="$HTTPD_URL/one_time_script/server" && setup_negotiate_only "$SERVER" "$URI" && - echo "s/ wait-for-done/ xxxx-xxx-xxxx/" \ - >"$HTTPD_ROOT_PATH/one-time-perl" && + write_script "$HTTPD_ROOT_PATH/one-time-script" <<-\EOF && + sed "s/ wait-for-done/ xxxx-xxx-xxxx/" "$1" + EOF test_must_fail git -c protocol.version=2 -C client fetch \ --no-tags \ diff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh index 191097171b..249137b467 100755 --- a/t/t5703-upload-pack-ref-in-want.sh +++ b/t/t5703-upload-pack-ref-in-want.sh @@ -83,18 +83,15 @@ test_expect_success 'setup repository' ' test_expect_success 'config controls ref-in-want advertisement' ' test-tool serve-v2 --advertise-capabilities >out && - perl -ne "/ref-in-want/ and print" out >out.filter && - test_must_be_empty out.filter && + test_grep ! "ref-in-want" out && git config uploadpack.allowRefInWant false && test-tool serve-v2 --advertise-capabilities >out && - perl -ne "/ref-in-want/ and print" out >out.filter && - test_must_be_empty out.filter && + test_grep ! "ref-in-want" out && git config uploadpack.allowRefInWant true && test-tool serve-v2 --advertise-capabilities >out && - perl -ne "/ref-in-want/ and print" out >out.filter && - test_file_not_empty out.filter + test_grep "ref-in-want" out ' test_expect_success 'invalid want-ref line' ' @@ -462,7 +459,7 @@ test_expect_success 'setup repos for change-while-negotiating test' ' test_commit m3 && git tag -d m2 m3 ) && - git -C "$LOCAL_PRISTINE" remote set-url origin "http://127.0.0.1:$LIB_HTTPD_PORT/one_time_perl/repo" && + git -C "$LOCAL_PRISTINE" remote set-url origin "http://127.0.0.1:$LIB_HTTPD_PORT/one_time_script/repo" && git -C "$LOCAL_PRISTINE" config protocol.version 2 ' @@ -475,10 +472,12 @@ inconsistency () { # RPCs during a single negotiation. oid1=$(git -C "$REPO" rev-parse $1) && oid2=$(git -C "$REPO" rev-parse $2) && - echo "s/$oid1/$oid2/" >"$HTTPD_ROOT_PATH/one-time-perl" + write_script "$HTTPD_ROOT_PATH/one-time-script" <<-EOF + sed "s/$oid1/$oid2/" "\$1" + EOF } -test_expect_success 'server is initially ahead - no ref in want' ' +test_expect_success PERL_TEST_HELPERS 'server is initially ahead - no ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant false && rm -rf local && cp -r "$LOCAL_PRISTINE" local && @@ -487,7 +486,7 @@ test_expect_success 'server is initially ahead - no ref in want' ' test_grep "fatal: remote error: upload-pack: not our ref" err ' -test_expect_success 'server is initially ahead - ref in want' ' +test_expect_success PERL_TEST_HELPERS 'server is initially ahead - ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant true && rm -rf local && cp -r "$LOCAL_PRISTINE" local && @@ -499,7 +498,7 @@ test_expect_success 'server is initially ahead - ref in want' ' test_cmp expected actual ' -test_expect_success 'server is initially behind - no ref in want' ' +test_expect_success PERL_TEST_HELPERS 'server is initially behind - no ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant false && rm -rf local && cp -r "$LOCAL_PRISTINE" local && @@ -511,7 +510,7 @@ test_expect_success 'server is initially behind - no ref in want' ' test_cmp expected actual ' -test_expect_success 'server is initially behind - ref in want' ' +test_expect_success PERL_TEST_HELPERS 'server is initially behind - ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant true && rm -rf local && cp -r "$LOCAL_PRISTINE" local && @@ -523,11 +522,13 @@ test_expect_success 'server is initially behind - ref in want' ' test_cmp expected actual ' -test_expect_success 'server loses a ref - ref in want' ' +test_expect_success PERL_TEST_HELPERS 'server loses a ref - ref in want' ' git -C "$REPO" config uploadpack.allowRefInWant true && rm -rf local && cp -r "$LOCAL_PRISTINE" local && - echo "s/main/rain/" >"$HTTPD_ROOT_PATH/one-time-perl" && + write_script "$HTTPD_ROOT_PATH/one-time-script" <<-\EOF && + sed "s/main/rain/" "$1" + EOF test_must_fail git -C local fetch 2>err && test_grep "fatal: remote error: unknown ref refs/heads/rain" err diff --git a/t/t5710-promisor-remote-capability.sh b/t/t5710-promisor-remote-capability.sh index b35b774235..cb061b1f35 100755 --- a/t/t5710-promisor-remote-capability.sh +++ b/t/t5710-promisor-remote-capability.sh @@ -4,6 +4,12 @@ test_description='handling of promisor remote advertisement' . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping promisor remote capabilities tests; Perl not available' + test_done +fi + GIT_TEST_MULTI_PACK_INDEX=0 GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL=0 diff --git a/t/t6011-rev-list-with-bad-commit.sh b/t/t6011-rev-list-with-bad-commit.sh index bad02cf5b8..b6f3344dbf 100755 --- a/t/t6011-rev-list-with-bad-commit.sh +++ b/t/t6011-rev-list-with-bad-commit.sh @@ -35,11 +35,15 @@ test_expect_success 'verify number of revisions' \ first_commit=$(git rev-parse HEAD~3) ' -test_expect_success 'corrupt second commit object' \ - ' - perl -i.bak -pe "s/second commit/socond commit/" .git/objects/pack/*.pack && - test_must_fail git fsck --full - ' +test_expect_success 'corrupt second commit object' ' + for p in .git/objects/pack/*.pack + do + sed "s/second commit/socond commit/" "$p" >"$p.munged" && + mv "$p.munged" "$p" || + return 1 + done && + test_must_fail git fsck --full +' test_expect_success 'rev-list should fail' ' test_must_fail env GIT_TEST_COMMIT_GRAPH=0 git -c core.commitGraph=false rev-list --all > /dev/null diff --git a/t/t6013-rev-list-reverse-parents.sh b/t/t6013-rev-list-reverse-parents.sh index 39793cbbd6..273196f52b 100755 --- a/t/t6013-rev-list-reverse-parents.sh +++ b/t/t6013-rev-list-reverse-parents.sh @@ -26,17 +26,19 @@ test_expect_success 'set up --reverse example' ' commit five ' +reverse () { + awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' +} + test_expect_success '--reverse --parents --full-history combines correctly' ' - git rev-list --parents --full-history main -- foo | - perl -e "print reverse <>" > expected && + git rev-list --parents --full-history main -- foo | reverse >expected && git rev-list --reverse --parents --full-history main -- foo \ > actual && test_cmp expected actual ' test_expect_success '--boundary does too' ' - git rev-list --boundary --parents --full-history main ^root -- foo | - perl -e "print reverse <>" > expected && + git rev-list --boundary --parents --full-history main ^root -- foo | reverse >expected && git rev-list --boundary --reverse --parents --full-history \ main ^root -- foo > actual && test_cmp expected actual diff --git a/t/t6102-rev-list-unexpected-objects.sh b/t/t6102-rev-list-unexpected-objects.sh index 22dfd6d978..eb98b3919c 100755 --- a/t/t6102-rev-list-unexpected-objects.sh +++ b/t/t6102-rev-list-unexpected-objects.sh @@ -4,6 +4,12 @@ test_description='git rev-list should handle unexpected object types' . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping rev-list unexpected objects tests; Perl not available' + test_done +fi + test_expect_success 'setup well-formed objects' ' blob="$(printf "foo" | git hash-object -w --stdin)" && tree="$(printf "100644 blob $blob\tfoo" | git mktree)" && diff --git a/t/t6115-rev-list-du.sh b/t/t6115-rev-list-du.sh index 3385fe9f13..04c577dad6 100755 --- a/t/t6115-rev-list-du.sh +++ b/t/t6115-rev-list-du.sh @@ -22,7 +22,7 @@ test_expect_success 'set up repository' ' disk_usage_slow () { git rev-list --no-object-names "$@" | git cat-file --batch-check="%(objectsize:disk)" | - perl -lne '$total += $_; END { print $total}' + awk '{ i += $1 } END { print i }' } # check behavior with given rev-list options; note that diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index 9b4f4306c4..ce9af79ab1 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -1216,7 +1216,7 @@ test_expect_success '%(raw) with --tcl must fail' ' test_must_fail git for-each-ref --format="%(raw)" --tcl ' -test_expect_success '%(raw) with --perl' ' +test_expect_success PERL_TEST_HELPERS '%(raw) with --perl' ' git for-each-ref --format="\$name= %(raw); print \"\$name\"" refs/myblobs/blob1 --perl | perl >actual && cmp blob1 actual && @@ -1443,9 +1443,14 @@ test_expect_success 'set up trailers for next test' ' ' test_trailer_option () { + if test "$#" -eq 3 + then + prereq="$1" + shift + fi && title=$1 option=$2 cat >expect - test_expect_success "$title" ' + test_expect_success $prereq "$title" ' git for-each-ref --format="%($option)" refs/heads/main >actual && test_cmp expect actual && git for-each-ref --format="%(contents:$option)" refs/heads/main >actual && @@ -1453,7 +1458,7 @@ test_trailer_option () { ' } -test_trailer_option '%(trailers:unfold) unfolds trailers' \ +test_trailer_option PERL_TEST_HELPERS '%(trailers:unfold) unfolds trailers' \ 'trailers:unfold' <<-EOF $(unfold <trailers) @@ -1483,13 +1488,13 @@ test_trailer_option '%(trailers:only=no) shows all trailers' \ EOF -test_trailer_option '%(trailers:only) and %(trailers:unfold) work together' \ +test_trailer_option PERL_TEST_HELPERS '%(trailers:only) and %(trailers:unfold) work together' \ 'trailers:only,unfold' <<-EOF $(grep -v patch.description <trailers | unfold) EOF -test_trailer_option '%(trailers:unfold) and %(trailers:only) work together' \ +test_trailer_option PERL_TEST_HELPERS '%(trailers:unfold) and %(trailers:only) work together' \ 'trailers:unfold,only' <<-EOF $(grep -v patch.description <trailers | unfold) diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh index 932c26cb45..9717e825f0 100755 --- a/t/t7006-pager.sh +++ b/t/t7006-pager.sh @@ -662,9 +662,9 @@ test_expect_success 'setup trace2' ' ' test_expect_success 'setup large log output' ' - perl -e " - print \"this is a long commit message\" x 50000 - " >commit-msg && + test-tool genzeros 50000 | + tr "\000" "a" | + sed "s/a/this is a long commit message/g" >commit-msg && git commit --allow-empty -F commit-msg ' diff --git a/t/t7416-submodule-dash-url.sh b/t/t7416-submodule-dash-url.sh index 0c605fd271..3d944a00e0 100755 --- a/t/t7416-submodule-dash-url.sh +++ b/t/t7416-submodule-dash-url.sh @@ -33,7 +33,8 @@ test_expect_success 'fsck accepts protected dash' ' ' test_expect_success 'remove ./ protection from .gitmodules url' ' - perl -i -pe "s{\./}{}" .gitmodules && + sed "s|\./||" .gitmodules >.gitmodules.munged && + mv .gitmodules.munged .gitmodules && git commit -am "drop protection" ' diff --git a/t/t7501-commit-basic-functionality.sh b/t/t7501-commit-basic-functionality.sh index cc12f99f11..a37509f004 100755 --- a/t/t7501-commit-basic-functionality.sh +++ b/t/t7501-commit-basic-functionality.sh @@ -46,7 +46,7 @@ test_expect_success 'paths and -a do not mix' ' test_must_fail git commit -m foo -a file ' -test_expect_success PERL 'can use paths with --interactive' ' +test_expect_success 'can use paths with --interactive' ' echo bong-o-bong >file && # 2: update, 1:st path, that is all, 7: quit test_write_lines 2 1 "" 7 | @@ -345,12 +345,12 @@ test_expect_success 'overriding author from command line' ' grep Rubber.Duck output ' -test_expect_success PERL 'interactive add' ' +test_expect_success 'interactive add' ' echo 7 | test_must_fail git commit --interactive >out && grep "What now" out ' -test_expect_success PERL "commit --interactive doesn't change index if editor aborts" ' +test_expect_success "commit --interactive doesn't change index if editor aborts" ' echo zoo >file && test_must_fail git diff --exit-code >diff1 && test_write_lines u "*" q | diff --git a/t/t7508-status.sh b/t/t7508-status.sh index b2070d4e39..cdc1d6fcc7 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -1066,7 +1066,7 @@ test_expect_success 'status -s submodule summary (clean submodule)' ' test_expect_success 'status -z implies porcelain' ' git status --porcelain | - perl -pe "s/\012/\000/g" >expect && + tr "\012" "\000" >expect && git status -z >output && test_cmp expect output ' diff --git a/t/t7815-grep-binary.sh b/t/t7815-grep-binary.sh index 90ebb64f46..3bd91da970 100755 --- a/t/t7815-grep-binary.sh +++ b/t/t7815-grep-binary.sh @@ -114,13 +114,10 @@ test_expect_success 'grep respects not-binary diff attribute' ' test_cmp expect actual ' -cat >nul_to_q_textconv <<'EOF' -#!/bin/sh -"$PERL_PATH" -pe 'y/\000/Q/' < "$1" -EOF -chmod +x nul_to_q_textconv - test_expect_success 'setup textconv filters' ' + write_script nul_to_q_textconv <<-\EOF && + tr "\000" "Q" <"$1" + EOF echo a diff=foo >.gitattributes && git config diff.foo.textconv "\"$(pwd)\""/nul_to_q_textconv ' diff --git a/t/t8001-annotate.sh b/t/t8001-annotate.sh index d7167f5539..609845aeb1 100755 --- a/t/t8001-annotate.sh +++ b/t/t8001-annotate.sh @@ -7,6 +7,12 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME TEST_CREATE_REPO_NO_TEMPLATE=1 . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping annotate tests; Perl not available' + test_done +fi + PROG='git annotate' . "$TEST_DIRECTORY"/annotate-tests.sh diff --git a/t/t8002-blame.sh b/t/t8002-blame.sh index e98993276a..7822947f02 100755 --- a/t/t8002-blame.sh +++ b/t/t8002-blame.sh @@ -7,6 +7,12 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME TEST_CREATE_REPO_NO_TEMPLATE=1 . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping blame colors tests; Perl not available' + test_done +fi + PROG='git blame -c' . "$TEST_DIRECTORY"/annotate-tests.sh @@ -101,7 +107,7 @@ test_expect_success 'set up abbrev tests' ' expect=$1 && shift && echo $sha1 | cut -c 1-$expect >expect && git blame "$@" abbrev.t >actual && - perl -lne "/[0-9a-f]+/ and print \$&" <actual >actual.sha && + sed -n "s/^[\^]\{0,1\}\([0-9a-f][0-9a-f]*\).*/\1/p" actual >actual.sha && test_cmp expect actual.sha } ' diff --git a/t/t8006-blame-textconv.sh b/t/t8006-blame-textconv.sh index 07a287ffd3..db1e2afb2c 100755 --- a/t/t8006-blame-textconv.sh +++ b/t/t8006-blame-textconv.sh @@ -11,7 +11,7 @@ find_blame() { cat >helper <<'EOF' #!/bin/sh grep -q '^bin: ' "$1" || { echo "E: $1 is not \"binary\" file" 1>&2; exit 1; } -"$PERL_PATH" -p -e 's/^bin: /converted: /' "$1" +sed 's/^bin: /converted: /' "$1" EOF chmod +x helper diff --git a/t/t8011-blame-split-file.sh b/t/t8011-blame-split-file.sh index c66494f5ba..388057245c 100755 --- a/t/t8011-blame-split-file.sh +++ b/t/t8011-blame-split-file.sh @@ -81,7 +81,7 @@ do git blame --root -C --$output combined >output ' - test_expect_success "$output output finds correct commits" ' + test_expect_success PERL_TEST_HELPERS "$output output finds correct commits" ' generate_expect >expect <<-\EOF && 5 base 1 modified @@ -93,7 +93,7 @@ do test_cmp expect actual ' - test_expect_success "$output output shows correct filenames" ' + test_expect_success PERL_TEST_HELPERS "$output output shows correct filenames" ' generate_expect >expect <<-\EOF && 11 one 11 two @@ -102,7 +102,7 @@ do test_cmp expect actual ' - test_expect_success "$output output shows correct previous pointer" ' + test_expect_success PERL_TEST_HELPERS "$output output shows correct previous pointer" ' generate_expect >expect <<-EOF && 5 NONE 1 $(git rev-parse modified^) one diff --git a/t/t8012-blame-colors.sh b/t/t8012-blame-colors.sh index c3a5f6d01f..3d77352650 100755 --- a/t/t8012-blame-colors.sh +++ b/t/t8012-blame-colors.sh @@ -7,6 +7,12 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME TEST_CREATE_REPO_NO_TEMPLATE=1 . ./test-lib.sh +if ! test_have_prereq PERL_TEST_HELPERS +then + skip_all='skipping blame colors tests; Perl not available' + test_done +fi + PROG='git blame -c' . "$TEST_DIRECTORY"/annotate-tests.sh diff --git a/t/t9137-git-svn-dcommit-clobber-series.sh b/t/t9137-git-svn-dcommit-clobber-series.sh index 067b15bad2..b57a362bb9 100755 --- a/t/t9137-git-svn-dcommit-clobber-series.sh +++ b/t/t9137-git-svn-dcommit-clobber-series.sh @@ -20,8 +20,8 @@ test_expect_success '(supposedly) non-conflicting change from SVN' ' test x"$(sed -n -e 61p < file)" = x61 && svn_cmd co "$svnrepo" tmp && (cd tmp && - perl -i.bak -p -e "s/^58$/5588/" file && - perl -i.bak -p -e "s/^61$/6611/" file && + sed -e "s/^58$/5588/" -e "s/^61$/6611/" file >file.munged && + mv file.munged file && poke file && test x"$(sed -n -e 58p < file)" = x5588 && test x"$(sed -n -e 61p < file)" = x6611 && @@ -40,8 +40,10 @@ test_expect_success 'some unrelated changes to git' " test_expect_success 'change file but in unrelated area' " test x\"\$(sed -n -e 4p < file)\" = x4 && test x\"\$(sed -n -e 7p < file)\" = x7 && - perl -i.bak -p -e 's/^4\$/4444/' file && - perl -i.bak -p -e 's/^7\$/7777/' file && + sed -e 's/^4\$/4444/' \ + -e 's/^7\$/7777/' \ + file >file.munged && + mv file.munged file && test x\"\$(sed -n -e 4p < file)\" = x4444 && test x\"\$(sed -n -e 7p < file)\" = x7777 && git commit -m '4 => 4444, 7 => 7777' file && diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh index 304bac5b1d..dda9e7c3e7 100755 --- a/t/t9350-fast-export.sh +++ b/t/t9350-fast-export.sh @@ -726,7 +726,7 @@ test_expect_success 'directory becomes symlink' ' (cd result && git show main:foo) ' -test_expect_success 'fast-export quotes pathnames' ' +test_expect_success PERL_TEST_HELPERS 'fast-export quotes pathnames' ' git init crazy-paths && test_config -C crazy-paths core.protectNTFS false && (cd crazy-paths && diff --git a/t/t9850-shell.sh b/t/t9850-shell.sh index 36566ace21..21c3af48bd 100755 --- a/t/t9850-shell.sh +++ b/t/t9850-shell.sh @@ -30,7 +30,7 @@ test_expect_success 'shell allows interactive command' ' ' test_expect_success 'shell complains of overlong commands' ' - perl -e "print \"a\" x 2**12 for (0..2**19)" | + test-tool genzeros | tr "\000" "a" | test_must_fail git shell 2>err && grep "too long" err ' diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh index 16eaaaf4c3..bee4a2ca34 100644 --- a/t/test-lib-functions.sh +++ b/t/test-lib-functions.sh @@ -88,15 +88,15 @@ test_decode_color () { } lf_to_nul () { - perl -pe 'y/\012/\000/' + tr '\012' '\000' } nul_to_q () { - perl -pe 'y/\000/Q/' + tr '\000' 'Q' } q_to_nul () { - perl -pe 'y/Q/\000/' + tr 'Q' '\000' } q_to_cr () { @@ -1645,17 +1645,7 @@ test_match_signal () { # Read up to "$1" bytes (or to EOF) from stdin and write them to stdout. test_copy_bytes () { - perl -e ' - my $len = $ARGV[1]; - while ($len > 0) { - my $s; - my $nread = sysread(STDIN, $s, $len); - die "cannot read: $!" unless defined($nread); - last unless $nread; - print $s; - $len -= $nread; - } - ' - "$1" + dd ibs=1 count="$1" 2>/dev/null } # run "$@" inside a non-git directory @@ -1994,7 +1984,7 @@ test_remote_https_urls() { # Print the destination of symlink(s) provided as arguments. Basically # the same as the readlink command, but it's not available everywhere. test_readlink () { - perl -le 'print readlink($_) for @ARGV' "$@" + test-tool path-utils readlink "$@" } # Set mtime to a fixed "magic" timestamp in mid February 2009, before we diff --git a/t/test-lib.sh b/t/test-lib.sh index fffbfb89ef..f0cadc159f 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -499,24 +499,20 @@ EDITOR=: # /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets # deriving from the command substitution clustered with the other # ones. -unset VISUAL EMAIL LANGUAGE $("$PERL_PATH" -e ' - my @env = keys %ENV; - my $ok = join("|", qw( - TRACE - DEBUG - TEST - .*_TEST - PROVE - VALGRIND - UNZIP - PERF_ - CURL_VERBOSE - TRACE_CURL - BUILD_DIR - )); - my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env); - print join("\n", @vars); -') +unset VISUAL EMAIL LANGUAGE $(env | sed -n \ + -e '/^GIT_TRACE/d' \ + -e '/^GIT_DEBUG/d' \ + -e '/^GIT_TEST/d' \ + -e '/^GIT_.*_TEST/d' \ + -e '/^GIT_PROVE/d' \ + -e '/^GIT_VALGRIND/d' \ + -e '/^GIT_UNZIP/d' \ + -e '/^GIT_PERF_/d' \ + -e '/^GIT_CURL_VERBOSE/d' \ + -e '/^GIT_TRACE_CURL/d' \ + -e '/^GIT_BUILD_DIR/d' \ + -e 's/^\(GIT_[^=]*\)=.*/\1/p' +) unset XDG_CACHE_HOME unset XDG_CONFIG_HOME unset GITPERLLIB @@ -1523,6 +1519,22 @@ then export LSAN_OPTIONS fi +if test -z "$PERL_PATH" +then + case "${GIT_TEST_CHAIN_LINT:-unset}" in + unset) + GIT_TEST_CHAIN_LINT=0 + ;; + 0) + # The user has explicitly disabled the chain linter, so we + # don't have anything to worry about. + ;; + *) + BAIL_OUT 'You need Perl for the chain linter' + ;; + esac +fi + if test "${GIT_TEST_CHAIN_LINT:-1}" != 0 && test "${GIT_TEST_EXT_CHAIN_LINT:-1}" != 0 then @@ -1694,6 +1706,7 @@ test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE2 test -z "$NO_GETTEXT" && test_set_prereq GETTEXT test -n "$SANITIZE_LEAK" && test_set_prereq SANITIZE_LEAK test -n "$GIT_VALGRIND_ENABLED" && test_set_prereq VALGRIND +test -n "$PERL_PATH" && test_set_prereq PERL_TEST_HELPERS if test -z "$GIT_TEST_CHECK_CACHE_TREE" then |
