diff options
Diffstat (limited to 't')
356 files changed, 5692 insertions, 1935 deletions
diff --git a/t/Makefile b/t/Makefile index 3e00cdd801..fae301248f 100644 --- a/t/Makefile +++ b/t/Makefile @@ -90,20 +90,12 @@ check-chainlint: echo "# chainlint: $(CHAINLINTTMP_SQ)/tests" && \ for i in $(CHAINLINTTESTS); do \ echo "# chainlint: $$i" && \ - sed -e '/^[ ]*$$/d' chainlint/$$i.expect; \ + cat chainlint/$$i.expect; \ done \ } >'$(CHAINLINTTMP_SQ)'/expect && \ $(CHAINLINT) --emit-all '$(CHAINLINTTMP_SQ)'/tests | \ - sed -e 's/^[1-9][0-9]* //;/^[ ]*$$/d' >'$(CHAINLINTTMP_SQ)'/actual && \ - if test -f ../GIT-BUILD-OPTIONS; then \ - . ../GIT-BUILD-OPTIONS; \ - fi && \ - if test -x ../git$$X; then \ - DIFFW="../git$$X --no-pager diff -w --no-index"; \ - else \ - DIFFW="diff -w -u"; \ - fi && \ - $$DIFFW '$(CHAINLINTTMP_SQ)'/expect '$(CHAINLINTTMP_SQ)'/actual + sed -e 's/^[1-9][0-9]* //' >'$(CHAINLINTTMP_SQ)'/actual && \ + diff -u '$(CHAINLINTTMP_SQ)'/expect '$(CHAINLINTTMP_SQ)'/actual test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax \ test-lint-filenames @@ -32,7 +32,7 @@ the tests. ok 2 - plain with GIT_WORK_TREE ok 3 - plain bare -Since the tests all output TAP (see http://testanything.org) they can +Since the tests all output TAP (see https://testanything.org) they can be run with any TAP harness. Here's an example of parallel testing powered by a recent version of prove(1): @@ -262,8 +262,8 @@ The argument for --run, <test-selector>, is a list of description substrings or globs or individual test numbers or ranges with an optional negation prefix (of '!') that define what tests in a test suite to include (or exclude, if negated) in the run. A range is two -numbers separated with a dash and matches a range of tests with both -ends been included. You may omit the first or the second number to +numbers separated with a dash and specifies an inclusive range of tests +to run. You may omit the first or the second number to mean "from the first test" or "up to the very last test" respectively. The argument to --run is split on commas into separate strings, @@ -274,10 +274,10 @@ text that you want to match includes a comma, use the glob character on all tests that match either the glob *rebase* or the glob *merge?cherry-pick*. -If --run starts with an unprefixed number or range the initial -set of tests to run is empty. If the first item starts with '!' +If --run starts with an unprefixed number or range, the initial +set of tests to run is empty. If the first item starts with '!', all the tests are added to the initial set. After initial set is -determined every test number or range is added or excluded from +determined, every test number or range is added or excluded from the set one by one, from left to right. For example, to run only tests up to a specific test (21), one @@ -579,11 +579,11 @@ This test harness library does the following things: Recommended style ----------------- -Here are some recommented styles when writing test case. - - Keep test title the same line with test helper function itself. + - Keep the test_expect_* function call and test title on + the same line. - Take test_expect_success helper for example, write it like: + For example, with test_expect_success, write it like: test_expect_success 'test title' ' ... test body ... @@ -595,10 +595,9 @@ Here are some recommented styles when writing test case. 'test title' \ '... test body ...' + - End the line with an opening single quote. - - End the line with a single quote. - - - Indent the body of here-document, and use "<<-" instead of "<<" + - Indent here-document bodies, and use "<<-" instead of "<<" to strip leading TABs used for indentation: test_expect_success 'test something' ' @@ -624,7 +623,7 @@ Here are some recommented styles when writing test case. ' - Quote or escape the EOF delimiter that begins a here-document if - there is no parameter and other expansion in it, to signal readers + there is no parameter or other expansion in it, to signal readers that they can skim it more casually: cmd <<-\EOF @@ -638,7 +637,7 @@ Do's & don'ts Here are a few examples of things you probably should and shouldn't do when writing tests. -Here are the "do's:" +The "do's:" - Put all code inside test_expect_success and other assertions. @@ -888,7 +887,7 @@ see test-lib-functions.sh for the full list and their options. rare case where your test depends on more than one: test_expect_success PERL,PYTHON 'yo dawg' \ - ' test $(perl -E 'print eval "1 +" . qx[python -c "print 2"]') == "4" ' + ' test $(perl -E '\''print eval "1 +" . qx[python -c "print(2)"]'\'') = "4" ' - test_expect_failure [<prereq>] <message> <script> @@ -1237,8 +1236,8 @@ and it knows that the object ID of an empty tree is a certain because the things the very basic core test tries to achieve is to serve as a basis for people who are changing the Git internals drastically. For these people, after making certain changes, -not seeing failures from the basic test _is_ a failure. And -such drastic changes to the core Git that even changes these +not seeing failures from the basic test _is_ a failure. Any +Git core changes so drastic that they change even these otherwise supposedly stable object IDs should be accompanied by an update to t0000-basic.sh. @@ -1248,7 +1247,7 @@ knowledge of the core Git internals. If all the test scripts hardcoded the object IDs like t0000-basic.sh does, that defeats the purpose of t0000-basic.sh, which is to isolate that level of validation in one place. Your test also ends up needing -updating when such a change to the internal happens, so do _not_ +an update whenever the internals change, so do _not_ do it and leave the low level of validation to t0000-basic.sh. Test coverage @@ -1279,7 +1278,7 @@ Devel::Cover module. To install it do: sudo aptitude install libdevel-cover-perl # From the CPAN with cpanminus - curl -L http://cpanmin.us | perl - --sudo --self-upgrade + curl -L https://cpanmin.us/ | perl - --sudo --self-upgrade cpanm --sudo Devel::Cover Then, at the top-level: diff --git a/t/chainlint/blank-line-before-esac.expect b/t/chainlint/blank-line-before-esac.expect index 48ed4eb124..056e03003d 100644 --- a/t/chainlint/blank-line-before-esac.expect +++ b/t/chainlint/blank-line-before-esac.expect @@ -1,11 +1,11 @@ -test_done ( ) { +test_done () { case "$test_failure" in - 0 ) + 0) test_at_end_hook_ exit 0 ;; - * ) + *) if test $test_external_has_tap -eq 0 then say_color error "# failed $test_failure among $msg" @@ -14,5 +14,5 @@ test_done ( ) { exit 1 ;; - esac + esac } diff --git a/t/chainlint/blank-line.expect b/t/chainlint/blank-line.expect index f76fde1ffb..b47827d749 100644 --- a/t/chainlint/blank-line.expect +++ b/t/chainlint/blank-line.expect @@ -1,4 +1,8 @@ ( + nothing && + something + + ) diff --git a/t/chainlint/block.expect b/t/chainlint/block.expect index a3bcea492a..1c87326364 100644 --- a/t/chainlint/block.expect +++ b/t/chainlint/block.expect @@ -12,9 +12,9 @@ ) && { - echo a ; ?!AMP?! echo b + echo a; ?!AMP?! echo b } && -{ echo a ; ?!AMP?! echo b ; } && +{ echo a; ?!AMP?! echo b; } && { echo "${var}9" && diff --git a/t/chainlint/chain-break-background.expect b/t/chainlint/chain-break-background.expect index 28f9114f42..20d0bb5333 100644 --- a/t/chainlint/chain-break-background.expect +++ b/t/chainlint/chain-break-background.expect @@ -1,9 +1,9 @@ JGIT_DAEMON_PID= && git init --bare empty.git && -> empty.git/git-daemon-export-ok && +>empty.git/git-daemon-export-ok && mkfifo jgit_daemon_output && { - jgit daemon --port="$JGIT_DAEMON_PORT" . > jgit_daemon_output & + jgit daemon --port="$JGIT_DAEMON_PORT" . >jgit_daemon_output & JGIT_DAEMON_PID=$! } && test_expect_code 2 git ls-remote --exit-code git://localhost:$JGIT_DAEMON_PORT/empty.git diff --git a/t/chainlint/chain-break-return-exit.expect b/t/chainlint/chain-break-return-exit.expect index 1732d221c3..4cd18e2edf 100644 --- a/t/chainlint/chain-break-return-exit.expect +++ b/t/chainlint/chain-break-return-exit.expect @@ -1,16 +1,16 @@ case "$(git ls-files)" in -one ) echo pass one ;; -* ) echo bad one ; return 1 ;; +one) echo pass one ;; +*) echo bad one; return 1 ;; esac && ( case "$(git ls-files)" in - two ) echo pass two ;; - * ) echo bad two ; exit 1 ;; -esac + two) echo pass two ;; + *) echo bad two; exit 1 ;; + esac ) && case "$(git ls-files)" in -dir/two"$LF"one ) echo pass both ;; -* ) echo bad ; return 1 ;; +dir/two"$LF"one) echo pass both ;; +*) echo bad; return 1 ;; esac && for i in 1 2 3 4 ; do diff --git a/t/chainlint/chain-break-status.expect b/t/chainlint/chain-break-status.expect index f4bada9463..e6b3b2193e 100644 --- a/t/chainlint/chain-break-status.expect +++ b/t/chainlint/chain-break-status.expect @@ -1,7 +1,7 @@ -OUT=$(( ( large_git ; echo $? 1 >& 3 ) | : ) 3 >& 1) && +OUT=$( ((large_git; echo $? 1>&3) | :) 3>&1 ) && test_match_signal 13 "$OUT" && -{ test-tool sigchain > actual ; ret=$? ; } && +{ test-tool sigchain >actual; ret=$?; } && { test_match_signal 15 "$ret" || test "$ret" = 3 diff --git a/t/chainlint/chained-subshell.expect b/t/chainlint/chained-subshell.expect index af0369d328..83810ea7ec 100644 --- a/t/chainlint/chained-subshell.expect +++ b/t/chainlint/chained-subshell.expect @@ -4,7 +4,7 @@ mkdir sub && ( nuff said ) && -cut "-d " -f actual | ( read s1 s2 s3 && +cut "-d " -f actual | (read s1 s2 s3 && test -f $s1 ?!AMP?! test $(cat $s2) = tree2path1 && -test $(cat $s3) = tree3path1 ) +test $(cat $s3) = tree3path1) diff --git a/t/chainlint/command-substitution-subsubshell.expect b/t/chainlint/command-substitution-subsubshell.expect index ab2f79e845..ec42f2c30c 100644 --- a/t/chainlint/command-substitution-subsubshell.expect +++ b/t/chainlint/command-substitution-subsubshell.expect @@ -1,2 +1,2 @@ -OUT=$(( ( large_git 1 >& 3 ) | : ) 3 >& 1) && +OUT=$( ((large_git 1>&3) | :) 3>&1 ) && test_match_signal 13 "$OUT" diff --git a/t/chainlint/dqstring-line-splice.expect b/t/chainlint/dqstring-line-splice.expect index bf9ced60d4..37eab80738 100644 --- a/t/chainlint/dqstring-line-splice.expect +++ b/t/chainlint/dqstring-line-splice.expect @@ -1,3 +1,5 @@ -echo 'fatal: reword option of --fixup is mutually exclusive with' '--patch/--interactive/--all/--include/--only' > expect && -test_must_fail git commit --fixup=reword:HEAD~ $1 2 > actual && + +echo 'fatal: reword option of --fixup is mutually exclusive with' '--patch/--interactive/--all/--include/--only' >expect && +test_must_fail git commit --fixup=reword:HEAD~ $1 2>actual && test_cmp expect actual + diff --git a/t/chainlint/dqstring-no-interpolate.expect b/t/chainlint/dqstring-no-interpolate.expect index 10724987a5..087eda15e4 100644 --- a/t/chainlint/dqstring-no-interpolate.expect +++ b/t/chainlint/dqstring-no-interpolate.expect @@ -6,6 +6,7 @@ grep "^\.git$" output.txt && ( cd client$version && GIT_TEST_PROTOCOL_VERSION=$version git fetch-pack --no-progress .. $(cat ../input) -) > output && - cut -d ' ' -f 2 < output | sort > actual && +) >output && + cut -d ' ' -f 2 <output | sort >actual && test_cmp expect actual + diff --git a/t/chainlint/empty-here-doc.expect b/t/chainlint/empty-here-doc.expect index e8733c97c6..8507721192 100644 --- a/t/chainlint/empty-here-doc.expect +++ b/t/chainlint/empty-here-doc.expect @@ -1,4 +1,4 @@ -git ls-tree $tree path > current && -cat > expected <<\EOF && +git ls-tree $tree path >current && +cat >expected <<\EOF && EOF test_output diff --git a/t/chainlint/exclamation.expect b/t/chainlint/exclamation.expect index 2d961a58c6..765a35bb4c 100644 --- a/t/chainlint/exclamation.expect +++ b/t/chainlint/exclamation.expect @@ -1,4 +1,4 @@ -if ! condition ; then echo nope ; else yep ; fi && +if ! condition; then echo nope; else yep; fi && test_prerequisite !MINGW && mail uucp!address && echo !whatever! diff --git a/t/chainlint/for-loop-abbreviated.expect b/t/chainlint/for-loop-abbreviated.expect index a21007a63f..02c0d15cca 100644 --- a/t/chainlint/for-loop-abbreviated.expect +++ b/t/chainlint/for-loop-abbreviated.expect @@ -1,5 +1,5 @@ for it do - path=$(expr "$it" : ( [^:]*) ) && + path=$(expr "$it" : ([^:]*)) && git update-index --add "$path" || exit done diff --git a/t/chainlint/for-loop.expect b/t/chainlint/for-loop.expect index d65c82129a..d2237f1e38 100644 --- a/t/chainlint/for-loop.expect +++ b/t/chainlint/for-loop.expect @@ -6,6 +6,7 @@ bar EOF done ?!AMP?! + for i in a b c; do echo $i && cat $i ?!LOOP?! diff --git a/t/chainlint/function.expect b/t/chainlint/function.expect index a14388e6b9..dd7c997a3c 100644 --- a/t/chainlint/function.expect +++ b/t/chainlint/function.expect @@ -1,8 +1,8 @@ -sha1_file ( ) { +sha1_file() { echo "$*" | sed "s#..#.git/objects/&/#" } && -remove_object ( ) { +remove_object() { file=$(sha1_file "$*") && test -e "$file" ?!AMP?! rm -f "$file" diff --git a/t/chainlint/here-doc.expect b/t/chainlint/here-doc.expect index 1df3f78282..91b961242a 100644 --- a/t/chainlint/here-doc.expect +++ b/t/chainlint/here-doc.expect @@ -1,6 +1,6 @@ boodle wobba \ - gorgo snoot \ - wafta snurb <<EOF && + gorgo snoot \ + wafta snurb <<EOF && quoth the raven, nevermore... EOF diff --git a/t/chainlint/loop-detect-status.expect b/t/chainlint/loop-detect-status.expect index 24da9e86d5..7ce3a34806 100644 --- a/t/chainlint/loop-detect-status.expect +++ b/t/chainlint/loop-detect-status.expect @@ -1,18 +1,18 @@ -( while test $i -le $blobcount -do - printf "Generating blob $i/$blobcount\r" >& 2 && +(while test $i -le $blobcount + do + printf "Generating blob $i/$blobcount\r" >&2 && printf "blob\nmark :$i\ndata $blobsize\n" && #test-tool genrandom $i $blobsize && printf "%-${blobsize}s" $i && echo "M 100644 :$i $i" >> commit && i=$(($i+1)) || echo $? > exit-status -done && -echo "commit refs/heads/main" && -echo "author A U Thor <author@email.com> 123456789 +0000" && -echo "committer C O Mitter <committer@email.com> 123456789 +0000" && -echo "data 5" && -echo ">2gb" && -cat commit ) | + done && + echo "commit refs/heads/main" && + echo "author A U Thor <author@email.com> 123456789 +0000" && + echo "committer C O Mitter <committer@email.com> 123456789 +0000" && + echo "data 5" && + echo ">2gb" && + cat commit) | git fast-import --big-file-threshold=2 && test ! -f exit-status diff --git a/t/chainlint/nested-cuddled-subshell.expect b/t/chainlint/nested-cuddled-subshell.expect index 2a86885ee6..3836049cc4 100644 --- a/t/chainlint/nested-cuddled-subshell.expect +++ b/t/chainlint/nested-cuddled-subshell.expect @@ -2,18 +2,24 @@ (cd foo && bar ) && + (cd foo && bar ) ?!AMP?! + ( cd foo && bar) && + ( cd foo && bar) ?!AMP?! + (cd foo && bar) && + (cd foo && bar) ?!AMP?! + foobar ) diff --git a/t/chainlint/nested-loop-detect-failure.expect b/t/chainlint/nested-loop-detect-failure.expect index 4793a0e8e1..3461df40e5 100644 --- a/t/chainlint/nested-loop-detect-failure.expect +++ b/t/chainlint/nested-loop-detect-failure.expect @@ -1,31 +1,31 @@ -for i in 0 1 2 3 4 5 6 7 8 9 ; +for i in 0 1 2 3 4 5 6 7 8 9; do - for j in 0 1 2 3 4 5 6 7 8 9 ; + for j in 0 1 2 3 4 5 6 7 8 9; do - echo "$i$j" > "path$i$j" ?!LOOP?! + echo "$i$j" >"path$i$j" ?!LOOP?! done ?!LOOP?! done && -for i in 0 1 2 3 4 5 6 7 8 9 ; +for i in 0 1 2 3 4 5 6 7 8 9; do - for j in 0 1 2 3 4 5 6 7 8 9 ; + for j in 0 1 2 3 4 5 6 7 8 9; do - echo "$i$j" > "path$i$j" || return 1 + echo "$i$j" >"path$i$j" || return 1 done done && -for i in 0 1 2 3 4 5 6 7 8 9 ; +for i in 0 1 2 3 4 5 6 7 8 9; do - for j in 0 1 2 3 4 5 6 7 8 9 ; + for j in 0 1 2 3 4 5 6 7 8 9; do - echo "$i$j" > "path$i$j" ?!LOOP?! + echo "$i$j" >"path$i$j" ?!LOOP?! done || return 1 done && -for i in 0 1 2 3 4 5 6 7 8 9 ; +for i in 0 1 2 3 4 5 6 7 8 9; do - for j in 0 1 2 3 4 5 6 7 8 9 ; + for j in 0 1 2 3 4 5 6 7 8 9; do - echo "$i$j" > "path$i$j" || return 1 + echo "$i$j" >"path$i$j" || return 1 done || return 1 done diff --git a/t/chainlint/nested-subshell.expect b/t/chainlint/nested-subshell.expect index 02e0a9f1bb..73ff28546a 100644 --- a/t/chainlint/nested-subshell.expect +++ b/t/chainlint/nested-subshell.expect @@ -4,6 +4,7 @@ echo a && echo b ) >file && + cd foo && ( echo a ?!AMP?! diff --git a/t/chainlint/pipe.expect b/t/chainlint/pipe.expect index 2cfc028297..811971b1a3 100644 --- a/t/chainlint/pipe.expect +++ b/t/chainlint/pipe.expect @@ -2,7 +2,9 @@ foo | bar | baz && + fish | cow ?!AMP?! + sunder ) diff --git a/t/chainlint/subshell-here-doc.expect b/t/chainlint/subshell-here-doc.expect index 52789278d1..75d6f607e2 100644 --- a/t/chainlint/subshell-here-doc.expect +++ b/t/chainlint/subshell-here-doc.expect @@ -1,7 +1,7 @@ ( echo wobba \ - gorgo snoot \ - wafta snurb <<-EOF && + gorgo snoot \ + wafta snurb <<-EOF && quoth the raven, nevermore... EOF diff --git a/t/chainlint/subshell-one-liner.expect b/t/chainlint/subshell-one-liner.expect index b7015361bf..8f694990e8 100644 --- a/t/chainlint/subshell-one-liner.expect +++ b/t/chainlint/subshell-one-liner.expect @@ -2,13 +2,18 @@ (foo && bar) && (foo && bar) | (foo && bar) >baz && + (foo; ?!AMP?! bar) && (foo; ?!AMP?! bar) | (foo; ?!AMP?! bar) >baz && + (foo || exit 1) && (foo || exit 1) | (foo || exit 1) >baz && + (foo && bar) ?!AMP?! + (foo && bar; ?!AMP?! baz) ?!AMP?! + foobar ) diff --git a/t/chainlint/t7900-subtree.expect b/t/chainlint/t7900-subtree.expect index 71b3b3bc20..02f3129232 100644 --- a/t/chainlint/t7900-subtree.expect +++ b/t/chainlint/t7900-subtree.expect @@ -15,6 +15,7 @@ main-sub4" && $chkms TXT ) && + subfiles=$(git ls-files) && check_equal "$subfiles" "$chkms $chks" diff --git a/t/chainlint/token-pasting.expect b/t/chainlint/token-pasting.expect index 342360bcd0..6a387917a7 100644 --- a/t/chainlint/token-pasting.expect +++ b/t/chainlint/token-pasting.expect @@ -4,22 +4,22 @@ git config filter.rot13.clean ./rot13.sh && { echo "*.t filter=rot13" ?!AMP?! echo "*.i ident" -} > .gitattributes && +} >.gitattributes && { echo a b c d e f g h i j k l m ?!AMP?! echo n o p q r s t u v w x y z ?!AMP?! echo '$Id$' -} > test && -cat test > test.t && -cat test > test.o && -cat test > test.i && +} >test && +cat test >test.t && +cat test >test.o && +cat test >test.i && git add test test.t test.i && rm -f test test.t test.i && git checkout -- test test.t test.i && -echo "content-test2" > test2.o && -echo "content-test3 - filename with special characters" > "test3 'sq',$x=.o" ?!AMP?! +echo "content-test2" >test2.o && +echo "content-test3 - filename with special characters" >"test3 'sq',$x=.o" ?!AMP?! downstream_url_for_sed=$( printf "%sn" "$downstream_url" | diff --git a/t/chainlint/while-loop.expect b/t/chainlint/while-loop.expect index 1f5eaea0fd..06c1567f48 100644 --- a/t/chainlint/while-loop.expect +++ b/t/chainlint/while-loop.expect @@ -6,6 +6,7 @@ bar EOF done ?!AMP?! + while true; do echo foo && cat bar ?!LOOP?! diff --git a/t/helper/test-bloom.c b/t/helper/test-bloom.c index aabe31d724..1281e66876 100644 --- a/t/helper/test-bloom.c +++ b/t/helper/test-bloom.c @@ -40,7 +40,6 @@ static void get_bloom_filter_for_commit(const struct object_id *commit_oid) { struct commit *c; struct bloom_filter *filter; - setup_git_directory(); c = lookup_commit(the_repository, commit_oid); filter = get_or_compute_bloom_filter(the_repository, c, 1, &settings, diff --git a/t/helper/test-bundle-uri.c b/t/helper/test-bundle-uri.c index 475058592d..09dc78733c 100644 --- a/t/helper/test-bundle-uri.c +++ b/t/helper/test-bundle-uri.c @@ -5,9 +5,7 @@ #include "strbuf.h" #include "string-list.h" #include "transport.h" -#include "ref-filter.h" #include "remote.h" -#include "refs.h" enum input_mode { KEY_VALUE_PAIRS, diff --git a/t/helper/test-env-helper.c b/t/helper/test-env-helper.c index 66c88b8ff3..1c486888a4 100644 --- a/t/helper/test-env-helper.c +++ b/t/helper/test-env-helper.c @@ -1,5 +1,5 @@ #include "test-tool.h" -#include "config.h" +#include "parse.h" #include "parse-options.h" static char const * const env__helper_usage[] = { diff --git a/t/helper/test-find-pack.c b/t/helper/test-find-pack.c new file mode 100644 index 0000000000..e8bd793e58 --- /dev/null +++ b/t/helper/test-find-pack.c @@ -0,0 +1,50 @@ +#include "test-tool.h" +#include "object-name.h" +#include "object-store.h" +#include "packfile.h" +#include "parse-options.h" +#include "setup.h" + +/* + * Display the path(s), one per line, of the packfile(s) containing + * the given object. + * + * If '--check-count <n>' is passed, then error out if the number of + * packfiles containing the object is not <n>. + */ + +static const char *find_pack_usage[] = { + "test-tool find-pack [--check-count <n>] <object>", + NULL +}; + +int cmd__find_pack(int argc, const char **argv) +{ + struct object_id oid; + struct packed_git *p; + int count = -1, actual_count = 0; + const char *prefix = setup_git_directory(); + + struct option options[] = { + OPT_INTEGER('c', "check-count", &count, "expected number of packs"), + OPT_END(), + }; + + argc = parse_options(argc, argv, prefix, options, find_pack_usage, 0); + if (argc != 1) + usage(find_pack_usage[0]); + + if (repo_get_oid(the_repository, argv[0], &oid)) + die("cannot parse %s as an object name", argv[0]); + + for (p = get_all_packs(the_repository); p; p = p->next) + if (find_pack_entry_one(oid.hash, p)) { + printf("%s\n", p->pack_name); + actual_count++; + } + + if (count > -1 && count != actual_count) + die("bad packfile count %d instead of %d", actual_count, count); + + return 0; +} diff --git a/t/helper/test-index-version.c b/t/helper/test-index-version.c deleted file mode 100644 index f3c2dbe0a2..0000000000 --- a/t/helper/test-index-version.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "test-tool.h" -#include "read-cache-ll.h" - -int cmd__index_version(int argc UNUSED, const char **argv UNUSED) -{ - struct cache_header hdr; - int version; - - memset(&hdr,0,sizeof(hdr)); - if (read(0, &hdr, sizeof(hdr)) != sizeof(hdr)) - return 0; - version = ntohl(hdr.hdr_version); - printf("%d\n", version); - return 0; -} diff --git a/t/helper/test-parse-options.c b/t/helper/test-parse-options.c index a4f6e24b0c..ded8116cc5 100644 --- a/t/helper/test-parse-options.c +++ b/t/helper/test-parse-options.c @@ -21,6 +21,19 @@ static struct { int unset; } length_cb; +static int mode34_callback(const struct option *opt, const char *arg, int unset) +{ + if (unset) + *(int *)opt->value = 0; + else if (!strcmp(arg, "3")) + *(int *)opt->value = 3; + else if (!strcmp(arg, "4")) + *(int *)opt->value = 4; + else + return error("invalid value for '%s': '%s'", "--mode34", arg); + return 0; +} + static int length_callback(const struct option *opt, const char *arg, int unset) { length_cb.called = 1; @@ -124,6 +137,9 @@ int cmd__parse_options(int argc, const char **argv) OPT_SET_INT(0, "set23", &integer, "set integer to 23", 23), OPT_CMDMODE(0, "mode1", &integer, "set integer to 1 (cmdmode option)", 1), OPT_CMDMODE(0, "mode2", &integer, "set integer to 2 (cmdmode option)", 2), + OPT_CALLBACK_F(0, "mode34", &integer, "(3|4)", + "set integer to 3 or 4 (cmdmode option)", + PARSE_OPT_CMDMODE, mode34_callback), OPT_CALLBACK('L', "length", &integer, "str", "get length of <str>", length_callback), OPT_FILENAME('F', "file", &file, "set file to <file>"), diff --git a/t/helper/test-pkt-line.c b/t/helper/test-pkt-line.c index f4d134a145..4daa82f00f 100644 --- a/t/helper/test-pkt-line.c +++ b/t/helper/test-pkt-line.c @@ -1,7 +1,9 @@ #include "git-compat-util.h" #include "test-tool.h" #include "pkt-line.h" +#include "sideband.h" #include "write-or-die.h" +#include "parse-options.h" static void pack_line(const char *line) { @@ -64,12 +66,33 @@ static void unpack(void) } } -static void unpack_sideband(void) +static void unpack_sideband(int argc, const char **argv) { struct packet_reader reader; - packet_reader_init(&reader, 0, NULL, 0, - PACKET_READ_GENTLE_ON_EOF | - PACKET_READ_CHOMP_NEWLINE); + int options = PACKET_READ_GENTLE_ON_EOF; + int chomp_newline = 1; + int reader_use_sideband = 0; + const char *const unpack_sideband_usage[] = { + "test_tool unpack_sideband [options...]", NULL + }; + struct option cmd_options[] = { + OPT_BOOL(0, "reader-use-sideband", &reader_use_sideband, + "set use_sideband bit for packet reader (Default: off)"), + OPT_BOOL(0, "chomp-newline", &chomp_newline, + "chomp newline in packet (Default: on)"), + OPT_END() + }; + + argc = parse_options(argc, argv, "", cmd_options, unpack_sideband_usage, + 0); + if (argc > 0) + usage_msg_opt(_("too many arguments"), unpack_sideband_usage, + cmd_options); + + if (chomp_newline) + options |= PACKET_READ_CHOMP_NEWLINE; + packet_reader_init(&reader, 0, NULL, 0, options); + reader.use_sideband = reader_use_sideband; while (packet_reader_read(&reader) != PACKET_READ_EOF) { int band; @@ -79,6 +102,17 @@ static void unpack_sideband(void) case PACKET_READ_EOF: break; case PACKET_READ_NORMAL: + /* + * When the "use_sideband" field of the reader is turned + * on, sideband packets other than the payload have been + * parsed and consumed in packet_reader_read(), and only + * the payload arrives here. + */ + if (reader.use_sideband) { + write_or_die(1, reader.line, reader.pktlen - 1); + break; + } + band = reader.line[0] & 0xff; if (band < 1 || band > 2) continue; /* skip non-sideband packets */ @@ -97,15 +131,31 @@ static void unpack_sideband(void) static int send_split_sideband(void) { + const char *foo = "Foo.\n"; + const char *bar = "Bar.\n"; const char *part1 = "Hello,"; const char *primary = "\001primary: regular output\n"; const char *part2 = " world!\n"; + /* Each sideband message has a trailing newline character. */ + send_sideband(1, 2, foo, strlen(foo), LARGE_PACKET_MAX); + send_sideband(1, 2, bar, strlen(bar), LARGE_PACKET_MAX); + + /* + * One sideband message is divided into part1 and part2 + * by the primary message. + */ send_sideband(1, 2, part1, strlen(part1), LARGE_PACKET_MAX); packet_write(1, primary, strlen(primary)); send_sideband(1, 2, part2, strlen(part2), LARGE_PACKET_MAX); packet_response_end(1); + /* + * We use unpack_sideband() to consume packets. A flush packet + * is required to end parsing. + */ + packet_flush(1); + return 0; } @@ -126,7 +176,7 @@ int cmd__pkt_line(int argc, const char **argv) else if (!strcmp(argv[1], "unpack")) unpack(); else if (!strcmp(argv[1], "unpack-sideband")) - unpack_sideband(); + unpack_sideband(argc - 1, argv + 1); else if (!strcmp(argv[1], "send-split-sideband")) send_split_sideband(); else if (!strcmp(argv[1], "receive-sideband")) diff --git a/t/helper/test-reach.c b/t/helper/test-reach.c index 3e173399a0..1e159a754d 100644 --- a/t/helper/test-reach.c +++ b/t/helper/test-reach.c @@ -1,11 +1,9 @@ #include "test-tool.h" #include "commit.h" #include "commit-reach.h" -#include "config.h" #include "gettext.h" #include "hex.h" #include "object-name.h" -#include "parse-options.h" #include "ref-filter.h" #include "setup.h" #include "string-list.h" diff --git a/t/helper/test-regex.c b/t/helper/test-regex.c index bd871a735b..80042eafc2 100644 --- a/t/helper/test-regex.c +++ b/t/helper/test-regex.c @@ -30,7 +30,7 @@ static int test_regex_bug(void) if (regexec(&r, str, 1, m, 0)) die("no match of pattern '%s' to string '%s'", pat, str); - /* http://sourceware.org/bugzilla/show_bug.cgi?id=3957 */ + /* https://sourceware.org/bugzilla/show_bug.cgi?id=3957 */ if (m[0].rm_so == 3) /* matches '\n' when it should not */ die("regex bug confirmed: re-build git with NO_REGEX=1"); diff --git a/t/helper/test-repository.c b/t/helper/test-repository.c index 4cd8a952e5..0c7c5aa4dd 100644 --- a/t/helper/test-repository.c +++ b/t/helper/test-repository.c @@ -1,10 +1,8 @@ #include "test-tool.h" #include "commit-graph.h" #include "commit.h" -#include "config.h" #include "environment.h" #include "hex.h" -#include "object-store-ll.h" #include "object.h" #include "repository.h" #include "setup.h" diff --git a/t/helper/test-simple-ipc.c b/t/helper/test-simple-ipc.c index 3d1436da59..fb5927775d 100644 --- a/t/helper/test-simple-ipc.c +++ b/t/helper/test-simple-ipc.c @@ -4,7 +4,6 @@ #include "test-tool.h" #include "gettext.h" -#include "strbuf.h" #include "simple-ipc.h" #include "parse-options.h" #include "thread-utils.h" @@ -278,7 +277,8 @@ static int daemon__run_server(void) static start_bg_wait_cb bg_wait_cb; -static int bg_wait_cb(const struct child_process *cp, void *cb_data) +static int bg_wait_cb(const struct child_process *cp UNUSED, + void *cb_data UNUSED) { int s = ipc_get_active_state(cl_args.path); diff --git a/t/helper/test-submodule.c b/t/helper/test-submodule.c index 356e0a26c5..50c154d037 100644 --- a/t/helper/test-submodule.c +++ b/t/helper/test-submodule.c @@ -4,6 +4,7 @@ #include "remote.h" #include "repository.h" #include "setup.h" +#include "strbuf.h" #include "submodule-config.h" #include "submodule.h" diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c index abe8a785eb..876cd2dc31 100644 --- a/t/helper/test-tool.c +++ b/t/helper/test-tool.c @@ -31,6 +31,7 @@ static struct test_cmd cmds[] = { { "env-helper", cmd__env_helper }, { "example-decorate", cmd__example_decorate }, { "fast-rebase", cmd__fast_rebase }, + { "find-pack", cmd__find_pack }, { "fsmonitor-client", cmd__fsmonitor_client }, { "genrandom", cmd__genrandom }, { "genzeros", cmd__genzeros }, @@ -38,7 +39,6 @@ static struct test_cmd cmds[] = { { "hashmap", cmd__hashmap }, { "hash-speed", cmd__hash_speed }, { "hexdump", cmd__hexdump }, - { "index-version", cmd__index_version }, { "json-writer", cmd__json_writer }, { "lazy-init-name-hash", cmd__lazy_init_name_hash }, { "match-trees", cmd__match_trees }, @@ -86,6 +86,7 @@ static struct test_cmd cmds[] = { { "submodule-nested-repo-config", cmd__submodule_nested_repo_config }, { "subprocess", cmd__subprocess }, { "trace2", cmd__trace2 }, + { "truncate", cmd__truncate }, { "userdiff", cmd__userdiff }, { "urlmatch-normalization", cmd__urlmatch_normalization }, { "xml-encode", cmd__xml_encode }, diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h index ea2672436c..70dd4eba11 100644 --- a/t/helper/test-tool.h +++ b/t/helper/test-tool.h @@ -25,6 +25,7 @@ int cmd__dump_reftable(int argc, const char **argv); int cmd__env_helper(int argc, const char **argv); int cmd__example_decorate(int argc, const char **argv); int cmd__fast_rebase(int argc, const char **argv); +int cmd__find_pack(int argc, const char **argv); int cmd__fsmonitor_client(int argc, const char **argv); int cmd__genrandom(int argc, const char **argv); int cmd__genzeros(int argc, const char **argv); @@ -32,7 +33,6 @@ int cmd__getcwd(int argc, const char **argv); int cmd__hashmap(int argc, const char **argv); int cmd__hash_speed(int argc, const char **argv); int cmd__hexdump(int argc, const char **argv); -int cmd__index_version(int argc, const char **argv); int cmd__json_writer(int argc, const char **argv); int cmd__lazy_init_name_hash(int argc, const char **argv); int cmd__match_trees(int argc, const char **argv); @@ -79,6 +79,7 @@ int cmd__submodule_config(int argc, const char **argv); int cmd__submodule_nested_repo_config(int argc, const char **argv); int cmd__subprocess(int argc, const char **argv); int cmd__trace2(int argc, const char **argv); +int cmd__truncate(int argc, const char **argv); int cmd__userdiff(int argc, const char **argv); int cmd__urlmatch_normalization(int argc, const char **argv); int cmd__xml_encode(int argc, const char **argv); diff --git a/t/helper/test-trace2.c b/t/helper/test-trace2.c index 20c7495f38..1adac29a57 100644 --- a/t/helper/test-trace2.c +++ b/t/helper/test-trace2.c @@ -45,7 +45,7 @@ static int get_i(int *p_value, const char *data) * [] "def_param" events for all of the "interesting" pre-defined * config settings. */ -static int ut_001return(int argc, const char **argv) +static int ut_001return(int argc UNUSED, const char **argv) { int rc; @@ -65,7 +65,7 @@ static int ut_001return(int argc, const char **argv) * [] "def_param" events for all of the "interesting" pre-defined * config settings. */ -static int ut_002exit(int argc, const char **argv) +static int ut_002exit(int argc UNUSED, const char **argv) { int rc; @@ -201,7 +201,7 @@ static int ut_006data(int argc, const char **argv) return 0; } -static int ut_007BUG(int argc, const char **argv) +static int ut_007BUG(int argc UNUSED, const char **argv UNUSED) { /* * Exercise BUG() to ensure that the message is printed to trace2. @@ -412,6 +412,56 @@ static int ut_201counter(int argc, const char **argv) return 0; } +static int ut_300redact_start(int argc, const char **argv) +{ + if (!argc) + die("expect <argv...>"); + + trace2_cmd_start(argv); + + return 0; +} + +static int ut_301redact_child_start(int argc, const char **argv) +{ + struct child_process cmd = CHILD_PROCESS_INIT; + int k; + + if (!argc) + die("expect <argv...>"); + + for (k = 0; argv[k]; k++) + strvec_push(&cmd.args, argv[k]); + + trace2_child_start(&cmd); + + strvec_clear(&cmd.args); + + return 0; +} + +static int ut_302redact_exec(int argc, const char **argv) +{ + if (!argc) + die("expect <exe> <argv...>"); + + trace2_exec(argv[0], &argv[1]); + + return 0; +} + +static int ut_303redact_def_param(int argc, const char **argv) +{ + struct key_value_info kvi = KVI_INIT; + + if (argc < 2) + die("expect <key> <value>"); + + trace2_def_param(argv[0], argv[1], &kvi); + + return 0; +} + /* * Usage: * test-tool trace2 <ut_name_1> <ut_usage_1> @@ -438,6 +488,11 @@ static struct unit_test ut_table[] = { { ut_200counter, "200counter", "<v1> [<v2> [<v3> [...]]]" }, { ut_201counter, "201counter", "<v1> <v2> <threads>" }, + + { ut_300redact_start, "300redact_start", "<argv...>" }, + { ut_301redact_child_start, "301redact_child_start", "<argv...>" }, + { ut_302redact_exec, "302redact_exec", "<exe> <argv...>" }, + { ut_303redact_def_param, "303redact_def_param", "<key> <value>" }, }; /* clang-format on */ diff --git a/t/helper/test-truncate.c b/t/helper/test-truncate.c new file mode 100644 index 0000000000..3931deaec7 --- /dev/null +++ b/t/helper/test-truncate.c @@ -0,0 +1,25 @@ +#include "test-tool.h" +#include "git-compat-util.h" + +/* + * Truncate a file to the given size. + */ +int cmd__truncate(int argc, const char **argv) +{ + char *p = NULL; + uintmax_t sz = 0; + int fd = -1; + + if (argc != 3) + die("expected filename and size"); + + sz = strtoumax(argv[2], &p, 0); + if (*p) + die("invalid size"); + + fd = xopen(argv[1], O_WRONLY | O_CREAT, 0600); + + if (ftruncate(fd, (off_t) sz) < 0) + die_errno("failed to truncate file"); + return 0; +} diff --git a/t/lib-chunk.sh b/t/lib-chunk.sh new file mode 100644 index 0000000000..a7cd9c3c6d --- /dev/null +++ b/t/lib-chunk.sh @@ -0,0 +1,17 @@ +# Shell library for working with "chunk" files (commit-graph, midx, etc). + +# corrupt_chunk_file <fn> <chunk> <offset> <bytes> +# +# Corrupt a chunk-based file (like a commit-graph) by overwriting the bytes +# found in the chunk specified by the 4-byte <chunk> identifier. If <offset> is +# "clear", replace the chunk entirely. Otherwise, overwrite data <offset> bytes +# into the chunk. +# +# The <bytes> are interpreted as pairs of hex digits (so "000000FE" would be +# big-endian 254). +corrupt_chunk_file () { + fn=$1; shift + perl "$TEST_DIRECTORY"/lib-chunk/corrupt-chunk-file.pl \ + "$@" <"$fn" >"$fn.tmp" && + mv "$fn.tmp" "$fn" +} diff --git a/t/lib-chunk/corrupt-chunk-file.pl b/t/lib-chunk/corrupt-chunk-file.pl new file mode 100644 index 0000000000..0e11aadda8 --- /dev/null +++ b/t/lib-chunk/corrupt-chunk-file.pl @@ -0,0 +1,90 @@ +#!/usr/bin/perl + +my ($chunk, $seek, $bytes) = @ARGV; +$bytes =~ s/../chr(hex($&))/ge; + +binmode STDIN; +binmode STDOUT; + +# A few helpers to read bytes, or read and copy them to the +# output. +sub get { + my $n = shift; + return unless $n; + read(STDIN, my $buf, $n) + or die "read error or eof: $!\n"; + return $buf; +} +sub copy { + my $buf = get(@_); + print $buf; + return $buf; +} + +# Some platforms' perl builds don't support 64-bit integers, and hence do not +# allow packing/unpacking quadwords with "Q". The chunk format uses 64-bit file +# offsets to support files of any size, but in practice our test suite will +# only use small files. So we can fake it by asking for two 32-bit values and +# discarding the first (most significant) one, which is equivalent as long as +# it's just zero. +sub unpack_quad { + my $bytes = shift; + my ($n1, $n2) = unpack("NN", $bytes); + die "quad value exceeds 32 bits" if $n1; + return $n2; +} +sub pack_quad { + my $n = shift; + my $ret = pack("NN", 0, $n); + # double check that our original $n did not exceed the 32-bit limit. + # This is presumably impossible on a 32-bit system (which would have + # truncated much earlier), but would still alert us on a 64-bit build + # of a new test that would fail on a 32-bit build (though we'd + # presumably see the die() from unpack_quad() in such a case). + die "quad round-trip failed" if unpack_quad($ret) != $n; + return $ret; +} + +# read until we find table-of-contents entry for chunk; +# note that we cheat a bit by assuming 4-byte alignment and +# that no ToC entry will accidentally look like a header. +# +# If we don't find the entry, copy() will hit EOF and exit +# (which should cause the caller to fail the test). +while (copy(4) ne $chunk) { } +my $offset = unpack_quad(copy(8)); + +# In clear mode, our length will change. So figure out +# the length by comparing to the offset of the next chunk, and +# then adjust that offset (and all subsequent) ones. +my $len; +if ($seek eq "clear") { + my $id; + do { + $id = copy(4); + my $next = unpack_quad(get(8)); + if (!defined $len) { + $len = $next - $offset; + } + print pack_quad($next - $len + length($bytes)); + } while (unpack("N", $id)); +} + +# and now copy up to our existing chunk data +copy($offset - tell(STDIN)); +if ($seek eq "clear") { + # if clearing, skip past existing data + get($len); +} else { + # otherwise, copy up to the requested offset, + # and skip past the overwritten bytes + copy($seek); + get(length($bytes)); +} + +# now write out the requested bytes, along +# with any other remaining data +print $bytes; +while (read(STDIN, my $buf, 4096)) { + print $buf; +} diff --git a/t/lib-credential.sh b/t/lib-credential.sh index 032b2d8fcc..15fc9a31e2 100644 --- a/t/lib-credential.sh +++ b/t/lib-credential.sh @@ -43,6 +43,8 @@ helper_test_clean() { reject $1 https example.com store-user reject $1 https example.com user1 reject $1 https example.com user2 + reject $1 https example.com user-expiry + reject $1 https example.com user-expiry-overwrite reject $1 https example.com user4 reject $1 https example.com user-distinct-pass reject $1 https example.com user-overwrite @@ -431,6 +433,81 @@ helper_test_timeout() { ' } +helper_test_password_expiry_utc() { + HELPER=$1 + + test_expect_success "helper ($HELPER) stores password_expiry_utc" ' + check approve $HELPER <<-\EOF + protocol=https + host=example.com + username=user-expiry + password=pass + password_expiry_utc=9999999999 + EOF + ' + + test_expect_success "helper ($HELPER) gets password_expiry_utc" ' + check fill $HELPER <<-\EOF + protocol=https + host=example.com + username=user-expiry + -- + protocol=https + host=example.com + username=user-expiry + password=pass + password_expiry_utc=9999999999 + -- + EOF + ' + + test_expect_success "helper ($HELPER) overwrites when password_expiry_utc changes" ' + check approve $HELPER <<-\EOF && + protocol=https + host=example.com + username=user-expiry-overwrite + password=pass1 + password_expiry_utc=9999999998 + EOF + check approve $HELPER <<-\EOF && + protocol=https + host=example.com + username=user-expiry-overwrite + password=pass2 + password_expiry_utc=9999999999 + EOF + check fill $HELPER <<-\EOF && + protocol=https + host=example.com + username=user-expiry-overwrite + -- + protocol=https + host=example.com + username=user-expiry-overwrite + password=pass2 + password_expiry_utc=9999999999 + EOF + check reject $HELPER <<-\EOF && + protocol=https + host=example.com + username=user-expiry-overwrite + password=pass2 + EOF + check fill $HELPER <<-\EOF + protocol=https + host=example.com + username=user-expiry-overwrite + -- + protocol=https + host=example.com + username=user-expiry-overwrite + password=askpass-password + -- + askpass: Password for '\''https://user-expiry-overwrite@example.com'\'': + EOF + ' +} + helper_test_oauth_refresh_token() { HELPER=$1 diff --git a/t/lib-gpg.sh b/t/lib-gpg.sh index 83b83c9abb..add11e88fc 100644 --- a/t/lib-gpg.sh +++ b/t/lib-gpg.sh @@ -13,7 +13,7 @@ test_lazy_prereq GPG ' gpg_version=$(gpg --version 2>&1) test $? != 127 || exit 1 - # As said here: http://www.gnupg.org/documentation/faqs.html#q6.19 + # As said here: https://web.archive.org/web/20130212022238/https://www.gnupg.org/faq/gnupg-faq.html#why-does-gnupg-1.0.6-bail-out-on-keyrings-used-with-1.0.7 # the gpg version 1.0.6 did not parse trust packets correctly, so for # that version, creation of signed tags using the generated key fails. case "$gpg_version" in diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh index 2fb1b2ae56..dbc9977593 100644 --- a/t/lib-httpd.sh +++ b/t/lib-httpd.sh @@ -67,7 +67,8 @@ for DEFAULT_HTTPD_MODULE_PATH in '/usr/libexec/apache2' \ '/usr/lib/apache2/modules' \ '/usr/lib64/httpd/modules' \ '/usr/lib/httpd/modules' \ - '/usr/libexec/httpd' + '/usr/libexec/httpd' \ + '/usr/lib/apache2' do if test -d "$DEFAULT_HTTPD_MODULE_PATH" then @@ -127,6 +128,20 @@ else "Could not identify web server at '$LIB_HTTPD_PATH'" fi +if test -n "$LIB_HTTPD_DAV" && test -f /etc/os-release +then + case "$(grep "^ID=" /etc/os-release | cut -d= -f2-)" in + alpine) + # The WebDAV module in Alpine Linux is broken at least up to + # Alpine v3.16 as the default DBM driver is missing. + # + # https://gitlab.alpinelinux.org/alpine/aports/-/issues/13112 + test_skip_or_die GIT_TEST_HTTPD \ + "Apache WebDAV module does not have default DBM backend driver" + ;; + esac +fi + install_script () { write_script "$HTTPD_ROOT_PATH/$1" <"$TEST_PATH/$1" } @@ -255,7 +270,7 @@ test_http_push_nonff () { ' test_expect_success 'non-fast-forward push shows help message' ' - test_i18ngrep "Updates were rejected because" output + test_grep "Updates were rejected because" output ' test_expect_${EXPECT_CAS_RESULT} 'force with lease aka cas' ' diff --git a/t/lib-rebase.sh b/t/lib-rebase.sh index 7ca5b918f0..11d2dc9fe3 100644 --- a/t/lib-rebase.sh +++ b/t/lib-rebase.sh @@ -8,18 +8,21 @@ # - check that non-commit messages have a certain line count with $EXPECT_COUNT # - check the commit count in the commit message header with $EXPECT_HEADER_COUNT # - rewrite a rebase -i script as directed by $FAKE_LINES. -# $FAKE_LINES consists of a sequence of words separated by spaces. -# The following word combinations are possible: +# $FAKE_LINES consists of a sequence of words separated by spaces; +# spaces inside the words are encoded as underscores. +# The following words are possible: # -# "<lineno>" -- add a "pick" line with the SHA1 taken from the -# specified line. +# "<cmd>" -- override the command for the next line specification. Can be +# "pick", "squash", "fixup[_-(c|C)]", "edit", "reword", "drop", +# "merge[_-(c|C)_<rev>]", or "bad" for an invalid command. # -# "<cmd> <lineno>" -- add a line with the specified command -# ("pick", "squash", "fixup"|"fixup_-C"|"fixup_-c", "edit", "reword" or "drop") -# and the SHA1 taken from the specified line. +# "<lineno>" -- add a command, using the specified line as a template. +# If the command has not been overridden, the line will be copied +# verbatim, usually resulting in a "pick" line. # -# "_" -- add a space, like "fixup_-C" implies "fixup -C" and -# "exec_cmd_with_args" add an "exec cmd with args" line. +# "fakesha" -- add a command ("pick" by default), using a fake SHA1. +# +# "exec_[command...]", "break" -- add the specified command. # # "#" -- Add a comment line. # @@ -49,7 +52,7 @@ set_fake_editor () { action=\& for line in $FAKE_LINES; do case $line in - pick|p|squash|s|fixup|f|edit|e|reword|r|drop|d|label|l|reset|r|merge|m) + pick|p|squash|s|fixup|f|edit|e|reword|r|drop|d|label|l|reset|t|merge|m) action="$line";; exec_*|x_*|break|b) echo "$line" | sed 's/_/ /g' >> "$1";; @@ -64,7 +67,7 @@ set_fake_editor () { fakesha) test \& != "$action" || action=pick echo "$action XXXXXXX False commit" >> "$1" - action=pick;; + action=\&;; *) sed -n "${line}s/^[a-z][a-z]*/$action/p" < "$1".tmp >> "$1" action=\&;; diff --git a/t/lib-submodule-update.sh b/t/lib-submodule-update.sh index 9acb0d5d19..36f767cb74 100644 --- a/t/lib-submodule-update.sh +++ b/t/lib-submodule-update.sh @@ -830,7 +830,7 @@ test_submodule_recursing_with_args_common () { cd submodule_update && git branch -t invalid_sub1 origin/invalid_sub1 && test_must_fail $command invalid_sub1 2>err && - test_i18ngrep sub1 err && + test_grep sub1 err && test_superproject_content origin/add_sub1 && test_submodule_content sub1 origin/add_sub1 ) diff --git a/t/perf/p2000-sparse-operations.sh b/t/perf/p2000-sparse-operations.sh index 96ed3e1d69..39e92b0841 100755 --- a/t/perf/p2000-sparse-operations.sh +++ b/t/perf/p2000-sparse-operations.sh @@ -134,5 +134,6 @@ test_perf_on_all git diff-files -- $SPARSE_CONE/a test_perf_on_all git diff-tree HEAD test_perf_on_all git diff-tree HEAD -- $SPARSE_CONE/a test_perf_on_all "git worktree add ../temp && git worktree remove ../temp" +test_perf_on_all git check-attr -a -- $SPARSE_CONE/a test_done diff --git a/t/perf/perf-lib.sh b/t/perf/perf-lib.sh index e7786775a9..def22e70ae 100644 --- a/t/perf/perf-lib.sh +++ b/t/perf/perf-lib.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see http://www.gnu.org/licenses/ . +# along with this program. If not, see https://www.gnu.org/licenses/ . # These variables must be set before the inclusion of test-lib.sh below, # because it will change our working directory. diff --git a/t/t0001-init.sh b/t/t0001-init.sh index 30a6edca1d..2b78e3be47 100755 --- a/t/t0001-init.sh +++ b/t/t0001-init.sh @@ -168,8 +168,8 @@ test_expect_success 'reinit' ' git -c init.defaultBranch=initial init >out1 2>err1 && git init >out2 2>err2 ) && - test_i18ngrep "Initialized empty" again/out1 && - test_i18ngrep "Reinitialized existing" again/out2 && + test_grep "Initialized empty" again/out1 && + test_grep "Reinitialized existing" again/out2 && test_must_be_empty again/err1 && test_must_be_empty again/err2 ' @@ -332,7 +332,7 @@ test_expect_success 'init with separate gitdir' ' test_expect_success 'explicit bare & --separate-git-dir incompatible' ' test_must_fail git init --bare --separate-git-dir goop.git bare.git 2>err && - test_i18ngrep "cannot be used together" err + test_grep "cannot be used together" err ' test_expect_success 'implicit bare & --separate-git-dir incompatible' ' @@ -340,7 +340,7 @@ test_expect_success 'implicit bare & --separate-git-dir incompatible' ' mkdir -p bare.git && test_must_fail env GIT_DIR=. \ git -C bare.git init --separate-git-dir goop.git 2>err && - test_i18ngrep "incompatible" err + test_grep "incompatible" err ' test_expect_success 'bare & --separate-git-dir incompatible within worktree' ' @@ -349,7 +349,7 @@ test_expect_success 'bare & --separate-git-dir incompatible within worktree' ' git clone --bare . bare.git && git -C bare.git worktree add --detach ../linkwt && test_must_fail git -C linkwt init --separate-git-dir seprepo 2>err && - test_i18ngrep "incompatible" err + test_grep "incompatible" err ' test_lazy_prereq GETCWD_IGNORES_PERMS ' @@ -563,7 +563,7 @@ test_expect_success '--initial-branch' ' : re-initializing should not change the branch name && git init --initial-branch=ignore initial-branch-option 2>err && - test_i18ngrep "ignored --initial-branch" err && + test_grep "ignored --initial-branch" err && git -C initial-branch-option symbolic-ref HEAD >actual && grep hello actual ' @@ -579,7 +579,7 @@ test_expect_success 'advice on unconfigured init.defaultBranch' ' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= git -c color.advice=always \ init unconfigured-default-branch-name 2>err && test_decode_color <err >decoded && - test_i18ngrep "<YELLOW>hint: " decoded + test_grep "<YELLOW>hint: " decoded ' test_expect_success 'overridden default main branch name (env)' ' @@ -592,7 +592,7 @@ test_expect_success 'overridden default main branch name (env)' ' test_expect_success 'invalid default branch name' ' test_must_fail env GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME="with space" \ git init initial-branch-invalid 2>err && - test_i18ngrep "invalid branch name" err + test_grep "invalid branch name" err ' test_expect_success 'branch -m with the initial branch' ' diff --git a/t/t0002-gitfile.sh b/t/t0002-gitfile.sh index e013d38f48..736516cc6a 100755 --- a/t/t0002-gitfile.sh +++ b/t/t0002-gitfile.sh @@ -22,13 +22,13 @@ test_expect_success 'initial setup' ' test_expect_success 'bad setup: invalid .git file format' ' echo "gitdir $REAL" >.git && test_must_fail git rev-parse 2>.err && - test_i18ngrep "invalid gitfile format" .err + test_grep "invalid gitfile format" .err ' test_expect_success 'bad setup: invalid .git file path' ' echo "gitdir: $REAL.not" >.git && test_must_fail git rev-parse 2>.err && - test_i18ngrep "not a git repository" .err + test_grep "not a git repository" .err ' test_expect_success 'final setup + check rev-parse --git-dir' ' diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index 26e082f05b..aee2298f01 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -40,6 +40,10 @@ attr_check_source () { test_cmp expect actual && test_must_be_empty err + git $git_opts -c "attr.tree=$source" check-attr test -- "$path" >actual 2>err && + test_cmp expect actual && + test_must_be_empty err + GIT_ATTR_SOURCE="$source" git $git_opts check-attr test -- "$path" >actual 2>err && test_cmp expect actual && test_must_be_empty err @@ -259,7 +263,7 @@ test_expect_success 'root subdir attribute test' ' test_expect_success 'negative patterns' ' echo "!f test=bar" >.gitattributes && git check-attr test -- '"'"'!f'"'"' 2>errors && - test_i18ngrep "Negative patterns are ignored" errors + test_grep "Negative patterns are ignored" errors ' test_expect_success 'patterns starting with exclamation' ' @@ -342,6 +346,74 @@ test_expect_success 'bare repository: check that .gitattribute is ignored' ' ) ' +bad_attr_source_err="fatal: bad --attr-source or GIT_ATTR_SOURCE" + +test_expect_success '--attr-source is bad' ' + test_when_finished rm -rf empty && + git init empty && + ( + cd empty && + echo "$bad_attr_source_err" >expect_err && + test_must_fail git --attr-source=HEAD check-attr test -- f/path 2>err && + test_cmp expect_err err + ) +' + +test_expect_success 'attr.tree when HEAD is unborn' ' + test_when_finished rm -rf empty && + git init empty && + ( + cd empty && + echo "f/path: test: unspecified" >expect && + git -c attr.tree=HEAD check-attr test -- f/path >actual 2>err && + test_must_be_empty err && + test_cmp expect actual + ) +' + +test_expect_success 'bad attr source defaults to reading .gitattributes file' ' + test_when_finished rm -rf empty && + git init empty && + ( + cd empty && + echo "f/path test=val" >.gitattributes && + echo "f/path: test: val" >expect && + git -c attr.tree=HEAD check-attr test -- f/path >actual 2>err && + test_must_be_empty err && + test_cmp expect actual + ) +' + +test_expect_success 'bare repo defaults to reading .gitattributes from HEAD' ' + test_when_finished rm -rf test bare_with_gitattribute && + git init test && + test_commit -C test gitattributes .gitattributes "f/path test=val" && + git clone --bare test bare_with_gitattribute && + echo "f/path: test: val" >expect && + git -C bare_with_gitattribute check-attr test -- f/path >actual && + test_cmp expect actual +' + +test_expect_success 'precedence of --attr-source, GIT_ATTR_SOURCE, then attr.tree' ' + test_when_finished rm -rf empty && + git init empty && + ( + cd empty && + git checkout -b attr-source && + test_commit "val1" .gitattributes "f/path test=val1" && + git checkout -b attr-tree && + test_commit "val2" .gitattributes "f/path test=val2" && + git checkout attr-source && + echo "f/path: test: val1" >expect && + GIT_ATTR_SOURCE=attr-source git -c attr.tree=attr-tree --attr-source=attr-source \ + check-attr test -- f/path >actual && + test_cmp expect actual && + GIT_ATTR_SOURCE=attr-source git -c attr.tree=attr-tree \ + check-attr test -- f/path >actual && + test_cmp expect actual + ) +' + test_expect_success 'bare repository: with --source' ' ( cd bare.git && @@ -424,7 +496,7 @@ test_expect_success SYMLINKS 'symlinks not respected in-tree' ' mkdir subdir && ln -s ../attr subdir/.gitattributes && attr_check_basic subdir/file unspecified && - test_i18ngrep "unable to access.*gitattributes" err + test_grep "unable to access.*gitattributes" err ' test_expect_success 'large attributes line ignored in tree' ' diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh index c70d11bc91..361446b2f4 100755 --- a/t/t0008-ignores.sh +++ b/t/t0008-ignores.sh @@ -49,7 +49,7 @@ broken_c_unquote_verbose () { stderr_contains () { regexp="$1" - if test_i18ngrep "$regexp" "$HOME/stderr" + if test_grep "$regexp" "$HOME/stderr" then return 0 else @@ -942,7 +942,7 @@ test_expect_success SYMLINKS 'symlinks not respected in-tree' ' ln -s ignore subdir/.gitignore && test_must_fail git check-ignore subdir/file >actual 2>err && test_must_be_empty actual && - test_i18ngrep "unable to access.*gitignore" err + test_grep "unable to access.*gitignore" err ' test_done diff --git a/t/t0012-help.sh b/t/t0012-help.sh index dbfc5c8267..1d273d91c2 100755 --- a/t/t0012-help.sh +++ b/t/t0012-help.sh @@ -100,17 +100,17 @@ test_expect_success "--help does not work for guides" " test_expect_success 'git help' ' git help >help.output && - test_i18ngrep "^ clone " help.output && - test_i18ngrep "^ add " help.output && - test_i18ngrep "^ log " help.output && - test_i18ngrep "^ commit " help.output && - test_i18ngrep "^ fetch " help.output + test_grep "^ clone " help.output && + test_grep "^ add " help.output && + test_grep "^ log " help.output && + test_grep "^ commit " help.output && + test_grep "^ fetch " help.output ' test_expect_success 'git help -g' ' git help -g >help.output && - test_i18ngrep "^ everyday " help.output && - test_i18ngrep "^ tutorial " help.output + test_grep "^ everyday " help.output && + test_grep "^ tutorial " help.output ' test_expect_success 'git help fails for non-existing html pages' ' @@ -257,7 +257,7 @@ do export GIT_CEILING_DIRECTORIES && test_expect_code 129 git -C sub $builtin -h >output 2>&1 ) && - test_i18ngrep usage output + test_grep usage output ' done <builtins diff --git a/t/t0013-sha1dc.sh b/t/t0013-sha1dc.sh index 5324047689..08814173cb 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_i18ngrep collision err && + test_grep collision err && grep 38762cf7f55934b34d179ae6a4c80cadccbb7f0a err ' diff --git a/t/t0014-alias.sh b/t/t0014-alias.sh index 8d3d9144c0..95568342be 100755 --- a/t/t0014-alias.sh +++ b/t/t0014-alias.sh @@ -8,7 +8,7 @@ test_expect_success 'nested aliases - internal execution' ' git config alias.nested-internal-1 nested-internal-2 && git config alias.nested-internal-2 status && git nested-internal-1 >output && - test_i18ngrep "^On branch " output + test_grep "^On branch " output ' test_expect_success 'nested aliases - mixed execution' ' @@ -16,7 +16,7 @@ test_expect_success 'nested aliases - mixed execution' ' git config alias.nested-external-2 "!git nested-external-3" && git config alias.nested-external-3 status && git nested-external-1 >output && - test_i18ngrep "^On branch " output + test_grep "^On branch " output ' test_expect_success 'looping aliases - internal execution' ' @@ -24,7 +24,7 @@ test_expect_success 'looping aliases - internal execution' ' git config alias.loop-internal-2 loop-internal-3 && git config alias.loop-internal-3 loop-internal-2 && test_must_fail git loop-internal-1 2>output && - test_i18ngrep "^fatal: alias loop detected: expansion of" output + test_grep "^fatal: alias loop detected: expansion of" output ' # This test is disabled until external loops are fixed, because would block @@ -34,7 +34,7 @@ test_expect_success 'looping aliases - internal execution' ' # git config alias.loop-mixed-1 loop-mixed-2 && # git config alias.loop-mixed-2 "!git loop-mixed-1" && # test_must_fail git loop-mixed-1 2>output && -# test_i18ngrep "^fatal: alias loop detected: expansion of" output +# test_grep "^fatal: alias loop detected: expansion of" output #' test_expect_success 'run-command formats empty args properly' ' diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh index 46abbeed68..0b4997022b 100755 --- a/t/t0021-conversion.sh +++ b/t/t0021-conversion.sh @@ -263,7 +263,7 @@ test_expect_success 'required filter with absent clean field' ' echo test >test.ac && test_must_fail git add test.ac 2>stderr && - test_i18ngrep "fatal: test.ac: clean filter .absentclean. failed" stderr + test_grep "fatal: test.ac: clean filter .absentclean. failed" stderr ' test_expect_success 'required filter with absent smudge field' ' @@ -276,7 +276,7 @@ test_expect_success 'required filter with absent smudge field' ' git add test.as && rm -f test.as && test_must_fail git checkout -- test.as 2>stderr && - test_i18ngrep "fatal: test.as: smudge filter absentsmudge failed" stderr + test_grep "fatal: test.as: smudge filter absentsmudge failed" stderr ' test_expect_success 'filtering large input to small output should use little memory' ' @@ -733,7 +733,7 @@ test_expect_success 'process filter should restart after unexpected write failur git checkout --quiet --no-progress . 2>git-stderr.log && grep "smudge write error" git-stderr.log && - test_i18ngrep "error: external filter" git-stderr.log && + test_grep "error: external filter" git-stderr.log && cat >expected.log <<-EOF && START diff --git a/t/t0028-working-tree-encoding.sh b/t/t0028-working-tree-encoding.sh index c196fdb0ee..1b55f59c23 100755 --- a/t/t0028-working-tree-encoding.sh +++ b/t/t0028-working-tree-encoding.sh @@ -92,23 +92,23 @@ do # In these cases the BOM is prohibited. cp bebom.utf${i}be.raw bebom.utf${i}be && test_must_fail git add bebom.utf${i}be 2>err.out && - test_i18ngrep "fatal: BOM is prohibited .* utf-${i}be" err.out && - test_i18ngrep "use UTF-${i} as working-tree-encoding" err.out && + test_grep "fatal: BOM is prohibited .* utf-${i}be" err.out && + test_grep "use UTF-${i} as working-tree-encoding" err.out && cp lebom.utf${i}le.raw lebom.utf${i}be && test_must_fail git add lebom.utf${i}be 2>err.out && - test_i18ngrep "fatal: BOM is prohibited .* utf-${i}be" err.out && - test_i18ngrep "use UTF-${i} as working-tree-encoding" err.out && + test_grep "fatal: BOM is prohibited .* utf-${i}be" err.out && + test_grep "use UTF-${i} as working-tree-encoding" err.out && cp bebom.utf${i}be.raw bebom.utf${i}le && test_must_fail git add bebom.utf${i}le 2>err.out && - test_i18ngrep "fatal: BOM is prohibited .* utf-${i}LE" err.out && - test_i18ngrep "use UTF-${i} as working-tree-encoding" err.out && + test_grep "fatal: BOM is prohibited .* utf-${i}LE" err.out && + test_grep "use UTF-${i} as working-tree-encoding" err.out && cp lebom.utf${i}le.raw lebom.utf${i}le && test_must_fail git add lebom.utf${i}le 2>err.out && - test_i18ngrep "fatal: BOM is prohibited .* utf-${i}LE" err.out && - test_i18ngrep "use UTF-${i} as working-tree-encoding" err.out + test_grep "fatal: BOM is prohibited .* utf-${i}LE" err.out && + test_grep "use UTF-${i} as working-tree-encoding" err.out ' test_expect_success "check required UTF-${i} BOM" ' @@ -118,13 +118,13 @@ do cp nobom.utf${i}be.raw nobom.utf${i} && test_must_fail git add nobom.utf${i} 2>err.out && - test_i18ngrep "fatal: BOM is required .* utf-${i}" err.out && - test_i18ngrep "use UTF-${i}BE or UTF-${i}LE" err.out && + test_grep "fatal: BOM is required .* utf-${i}" err.out && + test_grep "use UTF-${i}BE or UTF-${i}LE" err.out && cp nobom.utf${i}le.raw nobom.utf${i} && test_must_fail git add nobom.utf${i} 2>err.out && - test_i18ngrep "fatal: BOM is required .* utf-${i}" err.out && - test_i18ngrep "use UTF-${i}BE or UTF-${i}LE" err.out + test_grep "fatal: BOM is required .* utf-${i}" err.out && + test_grep "use UTF-${i}BE or UTF-${i}LE" err.out ' test_expect_success "eol conversion for UTF-${i} encoded files on checkout" ' @@ -169,7 +169,7 @@ test_expect_success 'check unsupported encodings' ' echo "*.set text working-tree-encoding" >.gitattributes && printf "set" >t.set && test_must_fail git add t.set 2>err.out && - test_i18ngrep "true/false are no valid working-tree-encodings" err.out && + test_grep "true/false are no valid working-tree-encodings" err.out && echo "*.unset text -working-tree-encoding" >.gitattributes && printf "unset" >t.unset && @@ -182,7 +182,7 @@ test_expect_success 'check unsupported encodings' ' echo "*.garbage text working-tree-encoding=garbage" >.gitattributes && printf "garbage" >t.garbage && test_must_fail git add t.garbage 2>err.out && - test_i18ngrep "failed to encode" err.out + test_grep "failed to encode" err.out ' test_expect_success 'error if encoding round trip is not the same during refresh' ' @@ -201,7 +201,7 @@ test_expect_success 'error if encoding round trip is not the same during refresh git update-ref refs/heads/main $COMMIT && test_must_fail git checkout HEAD^ 2>err.out && - test_i18ngrep "error: .* overwritten by checkout:" err.out + test_grep "error: .* overwritten by checkout:" err.out ' test_expect_success 'error if encoding garbage is already in Git' ' @@ -217,7 +217,7 @@ test_expect_success 'error if encoding garbage is already in Git' ' git update-ref refs/heads/main $COMMIT && git diff 2>err.out && - test_i18ngrep "error: BOM is required" err.out + test_grep "error: BOM is required" err.out ' test_lazy_prereq ICONV_SHIFT_JIS ' diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh index e19a199636..ec974867e4 100755 --- a/t/t0040-parse-options.sh +++ b/t/t0040-parse-options.sh @@ -13,30 +13,36 @@ usage: test-tool parse-options <options> A helper function for the parse-options API. - --yes get a boolean + --[no-]yes get a boolean -D, --no-doubt begins with 'no-' + --doubt opposite of --no-doubt -B, --no-fear be brave - -b, --boolean increment by one - -4, --or4 bitwise-or boolean with ...0100 - --neg-or4 same as --no-or4 + -b, --[no-]boolean increment by one + -4, --[no-]or4 bitwise-or boolean with ...0100 + --[no-]neg-or4 same as --no-or4 - -i, --integer <n> get a integer + -i, --[no-]integer <n> + get a integer -j <n> get a integer, too -m, --magnitude <n> get a magnitude - --set23 set integer to 23 + --[no-]set23 set integer to 23 --mode1 set integer to 1 (cmdmode option) --mode2 set integer to 2 (cmdmode option) - -L, --length <str> get length of <str> - -F, --file <file> set file to <file> + --[no-]mode34 (3|4) set integer to 3 or 4 (cmdmode option) + -L, --[no-]length <str> + get length of <str> + -F, --[no-]file <file> + set file to <file> String options - -s, --string <string> get a string - --string2 <str> get another string - --st <st> get another string (pervert ordering) + -s, --[no-]string <string> + get a string + --[no-]string2 <str> get another string + --[no-]st <st> get another string (pervert ordering) -o <str> get another string --longhelp help text of this entry spans multiple lines - --list <str> add str to list + --[no-]list <str> add str to list Magic arguments -NUM set integer to NUM @@ -45,16 +51,17 @@ Magic arguments --no-ambiguous negative ambiguity Standard options - --abbrev[=<n>] use <n> digits to display object names - -v, --verbose be verbose - -n, --dry-run dry run - -q, --quiet be quiet - --expect <string> expected output in the variable dump + --[no-]abbrev[=<n>] use <n> digits to display object names + -v, --[no-]verbose be verbose + -n, --[no-]dry-run dry run + -q, --[no-]quiet be quiet + --[no-]expect <string> + expected output in the variable dump Alias - -A, --alias-source <string> + -A, --[no-]alias-source <string> get a string - -Z, --alias-target <string> + -Z, --[no-]alias-target <string> alias of --alias-source EOF @@ -360,19 +367,41 @@ test_expect_success 'OPT_NEGBIT() works' ' ' test_expect_success 'OPT_CMDMODE() works' ' - test-tool parse-options --expect="integer: 1" --mode1 + test-tool parse-options --expect="integer: 1" --mode1 && + test-tool parse-options --expect="integer: 3" --mode34=3 ' -test_expect_success 'OPT_CMDMODE() detects incompatibility' ' +test_expect_success 'OPT_CMDMODE() detects incompatibility (1)' ' test_must_fail test-tool parse-options --mode1 --mode2 >output 2>output.err && test_must_be_empty output && - test_i18ngrep "incompatible with --mode" output.err + test_grep "mode1" output.err && + test_grep "mode2" output.err && + test_grep "cannot be used together" output.err ' -test_expect_success 'OPT_CMDMODE() detects incompatibility with something else' ' +test_expect_success 'OPT_CMDMODE() detects incompatibility (2)' ' test_must_fail test-tool parse-options --set23 --mode2 >output 2>output.err && test_must_be_empty output && - test_i18ngrep "incompatible with something else" output.err + test_grep "mode2" output.err && + test_grep "set23" output.err && + test_grep "cannot be used together" output.err +' + +test_expect_success 'OPT_CMDMODE() detects incompatibility (3)' ' + test_must_fail test-tool parse-options --mode2 --set23 >output 2>output.err && + test_must_be_empty output && + test_grep "mode2" output.err && + test_grep "set23" output.err && + test_grep "cannot be used together" output.err +' + +test_expect_success 'OPT_CMDMODE() detects incompatibility (4)' ' + test_must_fail test-tool parse-options --mode2 --mode34=3 \ + >output 2>output.err && + test_must_be_empty output && + test_grep "mode2" output.err && + test_grep "mode34.3" output.err && + test_grep "cannot be used together" output.err ' test_expect_success 'OPT_COUNTUP() with PARSE_OPT_NODASH works' ' diff --git a/t/t0041-usage.sh b/t/t0041-usage.sh index 9ea974b0c6..1464294bd1 100755 --- a/t/t0041-usage.sh +++ b/t/t0041-usage.sh @@ -21,8 +21,8 @@ test_expect_success 'tag --contains <existent_tag>' ' test_expect_success 'tag --contains <inexistent_tag>' ' test_must_fail git tag --contains "notag" >actual 2>actual.err && test_line_count = 0 actual && - test_i18ngrep "error" actual.err && - test_i18ngrep ! "usage" actual.err + test_grep "error" actual.err && + test_grep ! "usage" actual.err ' test_expect_success 'tag --no-contains <existent_tag>' ' @@ -34,27 +34,27 @@ test_expect_success 'tag --no-contains <existent_tag>' ' test_expect_success 'tag --no-contains <inexistent_tag>' ' test_must_fail git tag --no-contains "notag" >actual 2>actual.err && test_line_count = 0 actual && - test_i18ngrep "error" actual.err && - test_i18ngrep ! "usage" actual.err + test_grep "error" actual.err && + test_grep ! "usage" actual.err ' test_expect_success 'tag usage error' ' test_must_fail git tag --noopt >actual 2>actual.err && test_line_count = 0 actual && - test_i18ngrep "usage" actual.err + test_grep "usage" actual.err ' test_expect_success 'branch --contains <existent_commit>' ' git branch --contains "main" >actual 2>actual.err && - test_i18ngrep "main" actual && + test_grep "main" actual && test_line_count = 0 actual.err ' test_expect_success 'branch --contains <inexistent_commit>' ' test_must_fail git branch --no-contains "nocommit" >actual 2>actual.err && test_line_count = 0 actual && - test_i18ngrep "error" actual.err && - test_i18ngrep ! "usage" actual.err + test_grep "error" actual.err && + test_grep ! "usage" actual.err ' test_expect_success 'branch --no-contains <existent_commit>' ' @@ -66,14 +66,14 @@ test_expect_success 'branch --no-contains <existent_commit>' ' test_expect_success 'branch --no-contains <inexistent_commit>' ' test_must_fail git branch --no-contains "nocommit" >actual 2>actual.err && test_line_count = 0 actual && - test_i18ngrep "error" actual.err && - test_i18ngrep ! "usage" actual.err + test_grep "error" actual.err && + test_grep ! "usage" actual.err ' test_expect_success 'branch usage error' ' test_must_fail git branch --noopt >actual 2>actual.err && test_line_count = 0 actual && - test_i18ngrep "usage" actual.err + test_grep "usage" actual.err ' test_expect_success 'for-each-ref --contains <existent_object>' ' @@ -85,8 +85,8 @@ test_expect_success 'for-each-ref --contains <existent_object>' ' test_expect_success 'for-each-ref --contains <inexistent_object>' ' test_must_fail git for-each-ref --no-contains "noobject" >actual 2>actual.err && test_line_count = 0 actual && - test_i18ngrep "error" actual.err && - test_i18ngrep ! "usage" actual.err + test_grep "error" actual.err && + test_grep ! "usage" actual.err ' test_expect_success 'for-each-ref --no-contains <existent_object>' ' @@ -98,14 +98,14 @@ test_expect_success 'for-each-ref --no-contains <existent_object>' ' test_expect_success 'for-each-ref --no-contains <inexistent_object>' ' test_must_fail git for-each-ref --no-contains "noobject" >actual 2>actual.err && test_line_count = 0 actual && - test_i18ngrep "error" actual.err && - test_i18ngrep ! "usage" actual.err + test_grep "error" actual.err && + test_grep ! "usage" actual.err ' test_expect_success 'for-each-ref usage error' ' test_must_fail git for-each-ref --noopt >actual 2>actual.err && test_line_count = 0 actual && - test_i18ngrep "usage" actual.err + test_grep "usage" actual.err ' test_done diff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh index e2411f6a9b..20986b693c 100755 --- a/t/t0061-run-command.sh +++ b/t/t0061-run-command.sh @@ -19,12 +19,12 @@ test_expect_success MINGW 'subprocess inherits only std handles' ' test_expect_success 'start_command reports ENOENT (slash)' ' test-tool run-command start-command-ENOENT ./does-not-exist 2>err && - test_i18ngrep "\./does-not-exist" err + test_grep "\./does-not-exist" err ' test_expect_success 'start_command reports ENOENT (no slash)' ' test-tool run-command start-command-ENOENT does-not-exist 2>err && - test_i18ngrep "does-not-exist" err + test_grep "does-not-exist" err ' test_expect_success 'run_command can run a command' ' @@ -49,7 +49,7 @@ test_expect_success !RUNS_COMMANDS_FROM_PWD 'run_command is restricted to PATH' echo yikes EOF test_must_fail test-tool run-command run-command should-not-run 2>err && - test_i18ngrep "should-not-run" err + test_grep "should-not-run" err ' test_expect_success !MINGW 'run_command can run a script without a #! line' ' diff --git a/t/t0070-fundamental.sh b/t/t0070-fundamental.sh index 574de34198..f18f9284a5 100755 --- a/t/t0070-fundamental.sh +++ b/t/t0070-fundamental.sh @@ -44,13 +44,71 @@ test_expect_success 'incomplete sideband messages are reassembled' ' test_expect_success 'eof on sideband message is reported' ' printf 1234 >input && test-tool pkt-line receive-sideband <input 2>err && - test_i18ngrep "unexpected disconnect" err + test_grep "unexpected disconnect" err ' test_expect_success 'missing sideband designator is reported' ' printf 0004 >input && test-tool pkt-line receive-sideband <input 2>err && - test_i18ngrep "missing sideband" err + test_grep "missing sideband" err +' + +test_expect_success 'unpack-sideband: --no-chomp-newline' ' + test_when_finished "rm -f expect-out expect-err" && + test-tool pkt-line send-split-sideband >split-sideband && + test-tool pkt-line unpack-sideband \ + --no-chomp-newline <split-sideband >out 2>err && + cat >expect-out <<-EOF && + primary: regular output + EOF + cat >expect-err <<-EOF && + Foo. + Bar. + Hello, world! + EOF + test_cmp expect-out out && + test_cmp expect-err err +' + +test_expect_success 'unpack-sideband: --chomp-newline (default)' ' + test_when_finished "rm -f expect-out expect-err" && + test-tool pkt-line send-split-sideband >split-sideband && + test-tool pkt-line unpack-sideband \ + --chomp-newline <split-sideband >out 2>err && + printf "primary: regular output" >expect-out && + printf "Foo.Bar.Hello, world!" >expect-err && + test_cmp expect-out out && + test_cmp expect-err err +' + +test_expect_success 'unpack-sideband: packet_reader_read() consumes sideband, no chomp payload' ' + test_when_finished "rm -f expect-out expect-err" && + test-tool pkt-line send-split-sideband >split-sideband && + test-tool pkt-line unpack-sideband \ + --reader-use-sideband \ + --no-chomp-newline <split-sideband >out 2>err && + cat >expect-out <<-EOF && + primary: regular output + EOF + printf "remote: Foo. \n" >expect-err && + printf "remote: Bar. \n" >>expect-err && + printf "remote: Hello, world! \n" >>expect-err && + test_cmp expect-out out && + test_cmp expect-err err +' + +test_expect_success 'unpack-sideband: packet_reader_read() consumes sideband, chomp payload' ' + test_when_finished "rm -f expect-out expect-err" && + test-tool pkt-line send-split-sideband >split-sideband && + test-tool pkt-line unpack-sideband \ + --reader-use-sideband \ + --chomp-newline <split-sideband >out 2>err && + printf "primary: regular output" >expect-out && + printf "remote: Foo. \n" >expect-err && + printf "remote: Bar. \n" >>expect-err && + printf "remote: Hello, world! \n" >>expect-err && + test_cmp expect-out out && + test_cmp expect-err err ' test_done diff --git a/t/t0081-find-pack.sh b/t/t0081-find-pack.sh new file mode 100755 index 0000000000..67b11216a3 --- /dev/null +++ b/t/t0081-find-pack.sh @@ -0,0 +1,82 @@ +#!/bin/sh + +test_description='test `test-tool find-pack`' + +TEST_PASSES_SANITIZE_LEAK=true +. ./test-lib.sh + +test_expect_success 'setup' ' + test_commit one && + test_commit two && + test_commit three && + test_commit four && + test_commit five +' + +test_expect_success 'repack everything into a single packfile' ' + git repack -a -d --no-write-bitmap-index && + + head_commit_pack=$(test-tool find-pack HEAD) && + head_tree_pack=$(test-tool find-pack HEAD^{tree}) && + one_pack=$(test-tool find-pack HEAD:one.t) && + three_pack=$(test-tool find-pack HEAD:three.t) && + old_commit_pack=$(test-tool find-pack HEAD~4) && + + test-tool find-pack --check-count 1 HEAD && + test-tool find-pack --check-count=1 HEAD^{tree} && + ! test-tool find-pack --check-count=0 HEAD:one.t && + ! test-tool find-pack -c 2 HEAD:one.t && + test-tool find-pack -c 1 HEAD:three.t && + + # Packfile exists at the right path + case "$head_commit_pack" in + ".git/objects/pack/pack-"*".pack") true ;; + *) false ;; + esac && + test -f "$head_commit_pack" && + + # Everything is in the same pack + test "$head_commit_pack" = "$head_tree_pack" && + test "$head_commit_pack" = "$one_pack" && + test "$head_commit_pack" = "$three_pack" && + test "$head_commit_pack" = "$old_commit_pack" +' + +test_expect_success 'add more packfiles' ' + git rev-parse HEAD^{tree} HEAD:two.t HEAD:four.t >objects && + git pack-objects .git/objects/pack/mypackname1 >packhash1 <objects && + + git rev-parse HEAD~ HEAD~^{tree} HEAD:five.t >objects && + git pack-objects .git/objects/pack/mypackname2 >packhash2 <objects && + + head_commit_pack=$(test-tool find-pack HEAD) && + + # 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-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-tool find-pack -c 2 HEAD:five.t && + ! test-tool find-pack --check-count=0 HEAD:five.t +' + +test_expect_success 'add more commits (as loose objects)' ' + test_commit six && + test_commit seven && + + test -z "$(test-tool find-pack HEAD)" && + test -z "$(test-tool find-pack HEAD:six.t)" && + test-tool find-pack --check-count 0 HEAD && + test-tool find-pack -c 0 HEAD:six.t && + ! test-tool find-pack -c 1 HEAD:seven.t +' + +test_done diff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh index f6998269be..8798feefe3 100755 --- a/t/t0091-bugreport.sh +++ b/t/t0091-bugreport.sh @@ -65,7 +65,14 @@ test_expect_success '--output-directory puts the report in the provided dir' ' test_expect_success 'incorrect arguments abort with usage' ' test_must_fail git bugreport --false 2>output && - test_i18ngrep usage output && + test_grep usage output && + test_path_is_missing git-bugreport-* +' + +test_expect_success 'incorrect positional arguments abort with usage and hint' ' + test_must_fail git bugreport false 2>output && + test_grep usage output && + test_grep false output && test_path_is_missing git-bugreport-* ' diff --git a/t/t0202/test.pl b/t/t0202/test.pl index 2cbf7b9590..47d96a2a13 100755 --- a/t/t0202/test.pl +++ b/t/t0202/test.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -use 5.008; +use 5.008001; use lib (split(/:/, $ENV{GITPERLLIB})); use strict; use warnings; diff --git a/t/t0210-trace2-normal.sh b/t/t0210-trace2-normal.sh index 80e76a4695..c312657a12 100755 --- a/t/t0210-trace2-normal.sh +++ b/t/t0210-trace2-normal.sh @@ -2,7 +2,7 @@ test_description='test trace2 facility (normal target)' -TEST_PASSES_SANITIZE_LEAK=true +TEST_PASSES_SANITIZE_LEAK=false . ./test-lib.sh # Turn off any inherited trace2 settings for this test. @@ -283,4 +283,22 @@ test_expect_success 'using global config with include' ' test_cmp expect actual ' +test_expect_success 'unsafe URLs are redacted by default' ' + test_when_finished \ + "rm -r trace.normal unredacted.normal clone clone2" && + + test_config_global \ + "url.$(pwd).insteadOf" https://user:pwd@example.com/ && + test_config_global trace2.configParams "core.*,remote.*.url" && + + GIT_TRACE2="$(pwd)/trace.normal" \ + git clone https://user:pwd@example.com/ clone && + ! 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_done diff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh index cfba686132..290b6eaaab 100755 --- a/t/t0211-trace2-perf.sh +++ b/t/t0211-trace2-perf.sh @@ -2,7 +2,7 @@ test_description='test trace2 facility (perf target)' -TEST_PASSES_SANITIZE_LEAK=true +TEST_PASSES_SANITIZE_LEAK=false . ./test-lib.sh # Turn off any inherited trace2 settings for this test. @@ -268,4 +268,23 @@ test_expect_success PTHREADS 'global counter test/test2' ' have_counter_event "main" "counter" "test" "test2" 60 actual ' +test_expect_success 'unsafe URLs are redacted by default' ' + test_when_finished \ + "rm -r actual trace.perf unredacted.perf clone clone2" && + + test_config_global \ + "url.$(pwd).insteadOf" https://user:pwd@example.com/ && + test_config_global trace2.configParams "core.*,remote.*.url" && + + GIT_TRACE2_PERF="$(pwd)/trace.perf" \ + git clone https://user:pwd@example.com/ clone && + ! 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_done diff --git a/t/t0212-trace2-event.sh b/t/t0212-trace2-event.sh index 6d3374ff77..147643d582 100755 --- a/t/t0212-trace2-event.sh +++ b/t/t0212-trace2-event.sh @@ -323,4 +323,44 @@ test_expect_success 'discard traces when there are too many files' ' head -n2 trace_target_dir/git-trace2-discard | tail -n1 | grep \"event\":\"too_many_files\" ' +# In the following "...redact..." tests, skip testing the GIT_TRACE2_REDACT=0 +# case because we would need to exactly model the full JSON event stream like +# we did in the basic tests above and I do not think it is worth it. + +test_expect_success 'unsafe URLs are redacted by default in cmd_start events' ' + test_when_finished \ + "rm -r trace.event" && + + 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_expect_success 'unsafe URLs are redacted by default in child_start events' ' + test_when_finished \ + "rm -r trace.event" && + + 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_expect_success 'unsafe URLs are redacted by default in exec events' ' + test_when_finished \ + "rm -r trace.event" && + + 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_expect_success 'unsafe URLs are redacted by default in def_param events' ' + test_when_finished \ + "rm -r trace.event" && + + GIT_TRACE2_EVENT="$(pwd)/trace.event" \ + test-tool trace2 303redact_def_param url https://user:pwd@example.com/ && + ! grep user:pwd trace.event +' + test_done diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh index be29e1e111..a59de17039 100755 --- a/t/t0300-credentials.sh +++ b/t/t0300-credentials.sh @@ -860,7 +860,7 @@ test_expect_success 'credential config with partial URLs' ' git -c credential.$partial.helper=yep \ -c credential.with%0anewline.username=uh-oh \ credential fill <stdin 2>stderr && - test_i18ngrep "skipping credential lookup for key" stderr + test_grep "skipping credential lookup for key" stderr ' BEL="$(printf '\007')" diff --git a/t/t0301-credential-cache.sh b/t/t0301-credential-cache.sh index c02a3b5969..8300faadea 100755 --- a/t/t0301-credential-cache.sh +++ b/t/t0301-credential-cache.sh @@ -29,6 +29,7 @@ test_atexit 'git credential-cache exit' # test that the daemon works with no special setup helper_test cache +helper_test_password_expiry_utc cache helper_test_oauth_refresh_token cache test_expect_success 'socket defaults to ~/.cache/git/credential/socket' ' diff --git a/t/t0303-credential-external.sh b/t/t0303-credential-external.sh index f028fd1418..095574bfc6 100755 --- a/t/t0303-credential-external.sh +++ b/t/t0303-credential-external.sh @@ -45,6 +45,8 @@ test -z "$GIT_TEST_CREDENTIAL_HELPER_SETUP" || helper_test_clean "$GIT_TEST_CREDENTIAL_HELPER" helper_test "$GIT_TEST_CREDENTIAL_HELPER" +helper_test_password_expiry_utc "$GIT_TEST_CREDENTIAL_HELPER" +helper_test_oauth_refresh_token "$GIT_TEST_CREDENTIAL_HELPER" if test -z "$GIT_TEST_CREDENTIAL_HELPER_TIMEOUT"; then say "# skipping timeout tests (GIT_TEST_CREDENTIAL_HELPER_TIMEOUT not set)" diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh index 5b7bee888d..6b6424b3df 100755 --- a/t/t0410-partial-clone.sh +++ b/t/t0410-partial-clone.sh @@ -49,7 +49,7 @@ test_expect_success 'convert shallow clone to partial clone' ' test_cmp_config -C client 1 core.repositoryformatversion ' -test_expect_success SHA1 'convert to partial clone with noop extension' ' +test_expect_success SHA1,REFFILES 'convert to partial clone with noop extension' ' rm -fr server client && test_create_repo server && test_commit -C server my_commit 1 && @@ -60,7 +60,7 @@ test_expect_success SHA1 'convert to partial clone with noop extension' ' git -C client fetch --unshallow --filter="blob:none" ' -test_expect_success SHA1 'converting to partial clone fails with unrecognized extension' ' +test_expect_success SHA1,REFFILES 'converting to partial clone fails with unrecognized extension' ' rm -fr server client && test_create_repo server && test_commit -C server my_commit 1 && diff --git a/t/t0411-clone-from-partial.sh b/t/t0411-clone-from-partial.sh index b3d6ddc4bc..c98d501869 100755 --- a/t/t0411-clone-from-partial.sh +++ b/t/t0411-clone-from-partial.sh @@ -28,8 +28,8 @@ test_expect_success 'local clone must not fetch from promisor remote and execute test_must_fail git clone \ --upload-pack="GIT_TEST_ASSUME_DIFFERENT_OWNER=true git-upload-pack" \ evil clone1 2>err && - grep "detected dubious ownership" err && - ! grep "fake-upload-pack running" err && + test_grep "detected dubious ownership" err && + test_grep ! "fake-upload-pack running" err && test_path_is_missing script-executed ' @@ -38,8 +38,8 @@ test_expect_success 'clone from file://... must not fetch from promisor remote a test_must_fail git clone \ --upload-pack="GIT_TEST_ASSUME_DIFFERENT_OWNER=true git-upload-pack" \ "file://$(pwd)/evil" clone2 2>err && - grep "detected dubious ownership" err && - ! grep "fake-upload-pack running" err && + test_grep "detected dubious ownership" err && + test_grep ! "fake-upload-pack running" err && test_path_is_missing script-executed ' @@ -48,22 +48,22 @@ test_expect_success 'fetch from file://... must not fetch from promisor remote a test_must_fail git fetch \ --upload-pack="GIT_TEST_ASSUME_DIFFERENT_OWNER=true git-upload-pack" \ "file://$(pwd)/evil" 2>err && - grep "detected dubious ownership" err && - ! grep "fake-upload-pack running" err && + test_grep "detected dubious ownership" err && + test_grep ! "fake-upload-pack running" err && test_path_is_missing script-executed ' test_expect_success 'pack-objects should fetch from promisor remote and execute script' ' rm -f script-executed && echo "HEAD" | test_must_fail git -C evil pack-objects --revs --stdout >/dev/null 2>err && - grep "fake-upload-pack running" err && + test_grep "fake-upload-pack running" err && test_path_is_file script-executed ' test_expect_success 'clone from promisor remote does not lazy-fetch by default' ' rm -f script-executed && test_must_fail git clone evil no-lazy 2>err && - grep "lazy fetching disabled" err && + test_grep "lazy fetching disabled" err && test_path_is_missing script-executed ' @@ -71,7 +71,7 @@ test_expect_success 'promisor lazy-fetching can be re-enabled' ' rm -f script-executed && test_must_fail env GIT_NO_LAZY_FETCH=0 \ git clone evil lazy-ok 2>err && - grep "fake-upload-pack running" err && + test_grep "fake-upload-pack running" err && test_path_is_file script-executed ' diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh index d73a0be1b9..e0c6482797 100755 --- a/t/t1006-cat-file.sh +++ b/t/t1006-cat-file.sh @@ -6,7 +6,7 @@ test_description='git cat-file' test_cmdmode_usage () { test_expect_code 129 "$@" 2>err && - grep "^error:.*is incompatible with" err + grep "^error: .* cannot be used together" err } for switches in \ @@ -1100,6 +1100,42 @@ test_expect_success 'cat-file --batch="batman" with --batch-all-objects will wor cmp expect actual ' +test_expect_success 'cat-file %(objectsize:disk) with --batch-all-objects' ' + # our state has both loose and packed objects, + # so find both for our expected output + { + find .git/objects/?? -type f | + awk -F/ "{ print \$0, \$3\$4 }" | + while read path oid + do + size=$(test_file_size "$path") && + echo "$oid $size" || + return 1 + done && + rawsz=$(test_oid rawsz) && + find .git/objects/pack -name "*.idx" | + while read idx + do + git show-index <"$idx" >idx.raw && + sort -nr <idx.raw >idx.sorted && + packsz=$(test_file_size "${idx%.idx}.pack") && + end=$((packsz - rawsz)) && + while read start oid rest + do + size=$((end - start)) && + end=$start && + echo "$oid $size" || + return 1 + done <idx.sorted || + return 1 + done + } >expect.raw && + sort <expect.raw >expect && + git cat-file --batch-all-objects \ + --batch-check="%(objectname) %(objectsize:disk)" >actual && + test_cmp expect actual +' + test_expect_success 'set up replacement object' ' orig=$(git rev-parse HEAD) && git cat-file commit $orig >orig && diff --git a/t/t1060-object-corruption.sh b/t/t1060-object-corruption.sh index 35261afc9d..5e0f0a334f 100755 --- a/t/t1060-object-corruption.sh +++ b/t/t1060-object-corruption.sh @@ -125,7 +125,7 @@ test_expect_success 'fetch into corrupted repo with index-pack' ' cd bit-error-cp && test_must_fail git -c transfer.unpackLimit=1 \ fetch ../no-bit-error 2>stderr && - test_i18ngrep ! -i collision stderr + test_grep ! -i collision stderr ) ' diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh index 9ceb17f911..f67611da28 100755 --- a/t/t1091-sparse-checkout-builtin.sh +++ b/t/t1091-sparse-checkout-builtin.sh @@ -47,7 +47,7 @@ test_expect_success 'setup' ' test_expect_success 'git sparse-checkout list (not sparse)' ' test_must_fail git -C repo sparse-checkout list >list 2>err && test_must_be_empty list && - test_i18ngrep "this worktree is not sparse" err + test_grep "this worktree is not sparse" err ' test_expect_success 'git sparse-checkout list (not sparse)' ' @@ -55,7 +55,7 @@ test_expect_success 'git sparse-checkout list (not sparse)' ' rm repo/.git/info/sparse-checkout && git -C repo sparse-checkout list >list 2>err && test_must_be_empty list && - test_i18ngrep "this worktree is not sparse (sparse-checkout file may not exist)" err + test_grep "this worktree is not sparse (sparse-checkout file may not exist)" err ' test_expect_success 'git sparse-checkout list (populated)' ' @@ -230,7 +230,7 @@ test_expect_success 'cone mode: match patterns' ' git -C repo config --worktree core.sparseCheckoutCone true && rm -rf repo/a repo/folder1 repo/folder2 && git -C repo read-tree -mu HEAD 2>err && - test_i18ngrep ! "disabling cone patterns" err && + test_grep ! "disabling cone patterns" err && git -C repo reset --hard && check_files repo a folder1 folder2 ' @@ -240,7 +240,7 @@ test_expect_success 'cone mode: warn on bad pattern' ' cp repo/.git/info/sparse-checkout . && echo "!/deep/deeper/*/" >>repo/.git/info/sparse-checkout && git -C repo read-tree -mu HEAD 2>err && - test_i18ngrep "unrecognized negative pattern" err + test_grep "unrecognized negative pattern" err ' test_expect_success 'sparse-checkout disable' ' @@ -283,7 +283,7 @@ test_expect_success 'sparse-index enabled and disabled' ' test_expect_success 'cone mode: init and set' ' git -C repo sparse-checkout init --cone && git -C repo config --list >config && - test_i18ngrep "core.sparsecheckoutcone=true" config && + test_grep "core.sparsecheckoutcone=true" config && list_files repo >dir && echo a >expect && test_cmp expect dir && @@ -386,7 +386,7 @@ test_expect_success 'not-up-to-date does not block rest of sparsification' ' git -C repo sparse-checkout set deep/deeper1 2>err && - test_i18ngrep "The following paths are not up to date" err && + test_grep "The following paths are not up to date" err && test_cmp expect repo/.git/info/sparse-checkout && check_files repo/deep a deeper1 deeper2 && check_files repo/deep/deeper1 a deepest && @@ -401,8 +401,8 @@ test_expect_success 'revert to old sparse-checkout on empty update' ' git add file && git commit -m "test" && git sparse-checkout set nothing 2>err && - test_i18ngrep ! "Sparse checkout leaves no entry on working directory" err && - test_i18ngrep ! ".git/index.lock" err && + test_grep ! "Sparse checkout leaves no entry on working directory" err && + test_grep ! ".git/index.lock" err && git sparse-checkout set --no-cone file ) ' @@ -411,14 +411,14 @@ test_expect_success 'fail when lock is taken' ' test_when_finished rm -rf repo/.git/info/sparse-checkout.lock && touch repo/.git/info/sparse-checkout.lock && test_must_fail git -C repo sparse-checkout set deep 2>err && - test_i18ngrep "Unable to create .*\.lock" err + test_grep "Unable to create .*\.lock" err ' test_expect_success '.gitignore should not warn about cone mode' ' git -C repo config --worktree core.sparseCheckoutCone true && echo "**/bin/*" >repo/.gitignore && git -C repo reset --hard 2>err && - test_i18ngrep ! "disabling cone patterns" err + test_grep ! "disabling cone patterns" err ' test_expect_success 'sparse-checkout (init|set|disable) warns with dirty status' ' @@ -426,10 +426,10 @@ test_expect_success 'sparse-checkout (init|set|disable) warns with dirty status' echo dirty >dirty/folder1/a && git -C dirty sparse-checkout init --no-cone 2>err && - test_i18ngrep "warning.*The following paths are not up to date" err && + test_grep "warning.*The following paths are not up to date" err && git -C dirty sparse-checkout set /folder2/* /deep/deeper1/* 2>err && - test_i18ngrep "warning.*The following paths are not up to date" err && + test_grep "warning.*The following paths are not up to date" err && test_path_is_file dirty/folder1/a && git -C dirty sparse-checkout disable 2>err && @@ -453,14 +453,14 @@ test_expect_success 'sparse-checkout (init|set|disable) warns with unmerged stat git -C unmerged update-index --index-info <input && git -C unmerged sparse-checkout init --no-cone 2>err && - test_i18ngrep "warning.*The following paths are unmerged" err && + test_grep "warning.*The following paths are unmerged" err && git -C unmerged sparse-checkout set /folder2/* /deep/deeper1/* 2>err && - test_i18ngrep "warning.*The following paths are unmerged" err && + test_grep "warning.*The following paths are unmerged" err && test_path_is_file dirty/folder1/a && git -C unmerged sparse-checkout disable 2>err && - test_i18ngrep "warning.*The following paths are unmerged" err && + test_grep "warning.*The following paths are unmerged" err && git -C unmerged reset --hard && git -C unmerged sparse-checkout init --no-cone && @@ -480,24 +480,24 @@ test_expect_failure 'sparse-checkout reapply' ' git -C tweak update-index --index-info <input && git -C tweak sparse-checkout init --cone 2>err && - test_i18ngrep "warning.*The following paths are not up to date" err && - test_i18ngrep "warning.*The following paths are unmerged" err && + test_grep "warning.*The following paths are not up to date" err && + test_grep "warning.*The following paths are unmerged" err && git -C tweak sparse-checkout set folder2 deep/deeper1 2>err && - test_i18ngrep "warning.*The following paths are not up to date" err && - test_i18ngrep "warning.*The following paths are unmerged" err && + test_grep "warning.*The following paths are not up to date" err && + test_grep "warning.*The following paths are unmerged" err && git -C tweak sparse-checkout reapply 2>err && - test_i18ngrep "warning.*The following paths are not up to date" err && + test_grep "warning.*The following paths are not up to date" err && test_path_is_file tweak/deep/deeper2/a && - test_i18ngrep "warning.*The following paths are unmerged" err && + test_grep "warning.*The following paths are unmerged" err && test_path_is_file tweak/folder1/a && git -C tweak checkout HEAD deep/deeper2/a && git -C tweak sparse-checkout reapply 2>err && - test_i18ngrep ! "warning.*The following paths are not up to date" err && + test_grep ! "warning.*The following paths are not up to date" err && test_path_is_missing tweak/deep/deeper2/a && - test_i18ngrep "warning.*The following paths are unmerged" err && + test_grep "warning.*The following paths are unmerged" err && test_path_is_file tweak/folder1/a && # NEEDSWORK: We are asking to update a file outside of the @@ -578,8 +578,8 @@ test_expect_success 'check-rules interaction with submodules' ' git -C super ls-tree --name-only -r HEAD >all-files && git -C super sparse-checkout check-rules >check-rules-matches <all-files && - test_i18ngrep ! "modules/" check-rules-matches && - test_i18ngrep "folder1/" check-rules-matches + test_grep ! "modules/" check-rules-matches && + test_grep "folder1/" check-rules-matches ' test_expect_success 'different sparse-checkouts with worktrees' ' @@ -616,7 +616,7 @@ check_read_tree_errors () { then test_must_be_empty err else - test_i18ngrep "$ERRORS" err + test_grep "$ERRORS" err fi && check_files $REPO $FILES } @@ -898,32 +898,32 @@ test_expect_success 'setup bare repo' ' ' test_expect_success 'list fails outside work tree' ' test_must_fail git -C bare sparse-checkout list 2>err && - test_i18ngrep "this operation must be run in a work tree" err + test_grep "this operation must be run in a work tree" err ' test_expect_success 'add fails outside work tree' ' test_must_fail git -C bare sparse-checkout add deeper 2>err && - test_i18ngrep "this operation must be run in a work tree" err + test_grep "this operation must be run in a work tree" err ' test_expect_success 'set fails outside work tree' ' test_must_fail git -C bare sparse-checkout set deeper 2>err && - test_i18ngrep "this operation must be run in a work tree" err + test_grep "this operation must be run in a work tree" err ' test_expect_success 'init fails outside work tree' ' test_must_fail git -C bare sparse-checkout init 2>err && - test_i18ngrep "this operation must be run in a work tree" err + test_grep "this operation must be run in a work tree" err ' test_expect_success 'reapply fails outside work tree' ' test_must_fail git -C bare sparse-checkout reapply 2>err && - test_i18ngrep "this operation must be run in a work tree" err + test_grep "this operation must be run in a work tree" err ' test_expect_success 'disable fails outside work tree' ' test_must_fail git -C bare sparse-checkout disable 2>err && - test_i18ngrep "this operation must be run in a work tree" err + test_grep "this operation must be run in a work tree" err ' test_expect_success 'setup clean' ' @@ -946,8 +946,8 @@ test_expect_success 'check-rules cone mode' ' git -C repo sparse-checkout check-rules >check-rules-default <all-files && - test_i18ngrep "deep/deeper1/deepest/a" check-rules-file && - test_i18ngrep ! "deep/deeper2" check-rules-file && + test_grep "deep/deeper1/deepest/a" check-rules-file && + test_grep ! "deep/deeper2" check-rules-file && test_cmp check-rules-file ls-files && test_cmp check-rules-file check-rules-default diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh index 8a95adf4b5..2f1ae5fd3b 100755 --- a/t/t1092-sparse-checkout-compatibility.sh +++ b/t/t1092-sparse-checkout-compatibility.sh @@ -337,8 +337,8 @@ test_expect_success 'status reports sparse-checkout' ' init_repos && git -C sparse-checkout status >full && git -C sparse-index status >sparse && - test_i18ngrep "You are in a sparse checkout with " full && - test_i18ngrep "You are in a sparse checkout." sparse + test_grep "You are in a sparse checkout with " full && + test_grep "You are in a sparse checkout." sparse ' test_expect_success 'add, commit, checkout' ' @@ -1182,7 +1182,7 @@ test_expect_success 'checkout-index outside sparse definition' ' # Without --ignore-skip-worktree-bits, outside-of-cone files will trigger # an error test_sparse_match test_must_fail git checkout-index -- folder1/a && - test_i18ngrep "folder1/a has skip-worktree enabled" sparse-checkout-err && + test_grep "folder1/a has skip-worktree enabled" sparse-checkout-err && test_path_is_missing folder1/a && # With --ignore-skip-worktree-bits, outside-of-cone files are checked out @@ -2259,4 +2259,76 @@ test_expect_success 'worktree is not expanded' ' ensure_not_expanded worktree remove .worktrees/hotfix ' +test_expect_success 'check-attr with pathspec inside sparse definition' ' + init_repos && + + echo "a -crlf myAttr" >>.gitattributes && + run_on_all cp ../.gitattributes ./deep && + + test_all_match git check-attr -a -- deep/a && + + test_all_match git add deep/.gitattributes && + test_all_match git check-attr -a --cached -- deep/a +' + +test_expect_success 'check-attr with pathspec outside sparse definition' ' + init_repos && + + echo "a -crlf myAttr" >>.gitattributes && + run_on_sparse mkdir folder1 && + run_on_all cp ../.gitattributes ./folder1 && + run_on_all cp a folder1/a && + + test_all_match git check-attr -a -- folder1/a && + + git -C full-checkout add folder1/.gitattributes && + test_sparse_match git add --sparse folder1/.gitattributes && + test_all_match git commit -m "add .gitattributes" && + test_sparse_match git sparse-checkout reapply && + test_all_match git check-attr -a --cached -- folder1/a +' + +# NEEDSWORK: The 'diff --check' test is left as 'test_expect_failure' due +# to an underlying issue in oneway_diff() within diff-lib.c. +# 'do_oneway_diff()' is not called as expected for paths that could match +# inside of a sparse directory. Specifically, the 'ce_path_match()' function +# fails to recognize files inside a sparse directory (e.g., when 'folder1/' +# is a sparse directory, 'folder1/a' cannot be recognized). The goal is to +# proceed with 'do_oneway_diff()' if the pathspec could match inside of a +# sparse directory. +test_expect_failure 'diff --check with pathspec outside sparse definition' ' + init_repos && + + write_script edit-contents <<-\EOF && + echo "a " >"$1" + EOF + + test_all_match git config core.whitespace -trailing-space,-space-before-tab && + + echo "a whitespace=trailing-space,space-before-tab" >>.gitattributes && + run_on_all mkdir -p folder1 && + run_on_all cp ../.gitattributes ./folder1 && + test_all_match git add --sparse folder1/.gitattributes && + run_on_all ../edit-contents folder1/a && + test_all_match git add --sparse folder1/a && + + test_sparse_match git sparse-checkout reapply && + test_all_match test_must_fail git diff --check --cached -- folder1/a +' + +test_expect_success 'sparse-index is not expanded: check-attr' ' + init_repos && + + echo "a -crlf myAttr" >>.gitattributes && + mkdir ./sparse-index/folder1 && + cp ./sparse-index/a ./sparse-index/folder1/a && + cp .gitattributes ./sparse-index/deep && + cp .gitattributes ./sparse-index/folder1 && + + git -C sparse-index add deep/.gitattributes && + git -C sparse-index add --sparse folder1/.gitattributes && + ensure_not_expanded check-attr -a --cached -- deep/a && + ensure_not_expanded check-attr -a --cached -- folder1/a +' + test_done diff --git a/t/t1300-config.sh b/t/t1300-config.sh index 387d336c91..f4e2752134 100755 --- a/t/t1300-config.sh +++ b/t/t1300-config.sh @@ -453,7 +453,7 @@ test_expect_success 'get bool variable with empty value' ' test_expect_success 'no arguments, but no crash' ' test_must_fail git config >output 2>&1 && - test_i18ngrep usage output + test_grep usage output ' cat > .git/config << EOF @@ -720,25 +720,25 @@ test_expect_success 'invalid unit' ' git config aninvalid.unit "1auto" && test_cmp_config 1auto aninvalid.unit && test_must_fail git config --int --get aninvalid.unit 2>actual && - test_i18ngrep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual + test_grep "bad numeric config value .1auto. for .aninvalid.unit. in file .git/config: invalid unit" actual ' test_expect_success 'invalid unit boolean' ' git config commit.gpgsign "1true" && test_cmp_config 1true commit.gpgsign && test_must_fail git config --bool --get commit.gpgsign 2>actual && - test_i18ngrep "bad boolean config value .1true. for .commit.gpgsign." actual + test_grep "bad boolean config value .1true. for .commit.gpgsign." actual ' test_expect_success 'line number is reported correctly' ' printf "[bool]\n\tvar\n" >invalid && test_must_fail git config -f invalid --path bool.var 2>actual && - test_i18ngrep "line 2" actual + test_grep "line 2" actual ' test_expect_success 'invalid stdin config' ' echo "[broken" | test_must_fail git config --list --file - >output 2>&1 && - test_i18ngrep "bad config line 1 in standard input" output + test_grep "bad config line 1 in standard input" output ' cat > expect << EOF @@ -919,7 +919,7 @@ test_expect_success !MINGW 'get --path copes with unset $HOME' ' git config --get --path path.normal >>result && git config --get --path path.trailingtilde >>result ) && - test_i18ngrep "[Ff]ailed to expand.*~/" msg && + test_grep "[Ff]ailed to expand.*~/" msg && test_cmp expect result ' @@ -986,7 +986,7 @@ test_expect_success 'get --type=color barfs on non-color' ' test_expect_success 'set --type=color barfs on non-color' ' test_must_fail git config --type=color foo.color "not-a-color" 2>error && - test_i18ngrep "cannot parse color" error + test_grep "cannot parse color" error ' cat > expect << EOF @@ -1447,12 +1447,12 @@ test_expect_success 'git --config-env with missing value' ' test_expect_success 'git --config-env fails with invalid parameters' ' test_must_fail git --config-env=foo.flag config --bool foo.flag 2>error && - test_i18ngrep "invalid config format: foo.flag" error && + test_grep "invalid config format: foo.flag" error && test_must_fail git --config-env=foo.flag= config --bool foo.flag 2>error && - test_i18ngrep "missing environment variable name for configuration ${SQ}foo.flag${SQ}" error && + test_grep "missing environment variable name for configuration ${SQ}foo.flag${SQ}" error && sane_unset NONEXISTENT && test_must_fail git --config-env=foo.flag=NONEXISTENT config --bool foo.flag 2>error && - test_i18ngrep "missing environment variable ${SQ}NONEXISTENT${SQ} for configuration ${SQ}foo.flag${SQ}" error + test_grep "missing environment variable ${SQ}NONEXISTENT${SQ} for configuration ${SQ}foo.flag${SQ}" error ' test_expect_success 'git -c and --config-env work together' ' @@ -1533,21 +1533,21 @@ test_expect_success 'git config ignores pairs with empty count' ' test_expect_success 'git config fails with invalid count' ' test_must_fail env GIT_CONFIG_COUNT=10a git config --list 2>error && - test_i18ngrep "bogus count" error && + test_grep "bogus count" error && test_must_fail env GIT_CONFIG_COUNT=9999999999999999 git config --list 2>error && - test_i18ngrep "too many entries" error + test_grep "too many entries" error ' test_expect_success 'git config fails with missing config key' ' test_must_fail env GIT_CONFIG_COUNT=1 GIT_CONFIG_VALUE_0="value" \ git config --list 2>error && - test_i18ngrep "missing config key" error + test_grep "missing config key" error ' test_expect_success 'git config fails with missing config value' ' test_must_fail env GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0="pair.one" \ git config --list 2>error && - test_i18ngrep "missing config value" error + test_grep "missing config value" error ' test_expect_success 'git config fails with invalid config pair key' ' @@ -1617,7 +1617,7 @@ test_expect_success 'barf on syntax error' ' key garbage EOF test_must_fail git config --get section.key 2>error && - test_i18ngrep " line 3 " error + test_grep " line 3 " error ' test_expect_success 'barf on incomplete section header' ' @@ -1627,7 +1627,7 @@ test_expect_success 'barf on incomplete section header' ' key = value EOF test_must_fail git config --get section.key 2>error && - test_i18ngrep " line 2 " error + test_grep " line 2 " error ' test_expect_success 'barf on incomplete string' ' @@ -1637,7 +1637,7 @@ test_expect_success 'barf on incomplete string' ' key = "value string EOF test_must_fail git config --get section.key 2>error && - test_i18ngrep " line 3 " error + test_grep " line 3 " error ' test_expect_success 'urlmatch' ' @@ -2266,17 +2266,17 @@ test_expect_success 'identical mixed --type specifiers are allowed' ' test_expect_success 'non-identical modern --type specifiers are not allowed' ' test_must_fail git config --type=int --type=bool section.big 2>error && - test_i18ngrep "only one type at a time" error + test_grep "only one type at a time" error ' test_expect_success 'non-identical legacy --type specifiers are not allowed' ' test_must_fail git config --int --bool section.big 2>error && - test_i18ngrep "only one type at a time" error + test_grep "only one type at a time" error ' test_expect_success 'non-identical mixed --type specifiers are not allowed' ' test_must_fail git config --type=int --bool section.big 2>error && - test_i18ngrep "only one type at a time" error + test_grep "only one type at a time" error ' test_expect_success '--type allows valid type specifiers' ' @@ -2293,7 +2293,7 @@ test_expect_success 'unset type specifiers may be reset to conflicting ones' ' test_expect_success '--type rejects unknown specifiers' ' test_must_fail git config --type=nonsense section.foo 2>error && - test_i18ngrep "unrecognized --type argument" error + test_grep "unrecognized --type argument" error ' test_expect_success '--type=int requires at least one digit' ' @@ -2339,7 +2339,7 @@ test_expect_success 'set all config with value-pattern' ' # multiple matches => failure test_must_fail git config --file=config abc.key three o+ 2>err && - test_i18ngrep "has multiple values" err && + test_grep "has multiple values" err && # multiple values, no match => add git config --file=config abc.key three a+ && diff --git a/t/t1307-config-blob.sh b/t/t1307-config-blob.sh index 0a7099d6f5..b9852fe40e 100755 --- a/t/t1307-config-blob.sh +++ b/t/t1307-config-blob.sh @@ -63,7 +63,7 @@ test_expect_success 'parse errors in blobs are properly attributed' ' git commit -m broken && test_must_fail git config --blob=HEAD:config some.value 2>err && - test_i18ngrep "HEAD:config" err + test_grep "HEAD:config" err ' test_expect_success 'can parse blob ending with CR' ' diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh index 777648722c..3bfec07f1a 100755 --- a/t/t1308-config-set.sh +++ b/t/t1308-config-set.sh @@ -172,7 +172,7 @@ test_expect_success 'find string value for a key' ' test_expect_success 'check line error when NULL string is queried' ' test_expect_code 128 test-tool config get_string case.foo 2>result && - test_i18ngrep "fatal: .*case\.foo.*\.git/config.*line 7" result + test_grep "fatal: .*case\.foo.*\.git/config.*line 7" result ' test_expect_success 'find integer if value is non parse-able' ' @@ -342,14 +342,14 @@ test_expect_success 'check line errors for malformed values' ' br EOF test_expect_code 128 git br 2>result && - test_i18ngrep "missing value for .alias\.br" result && - test_i18ngrep "fatal: .*\.git/config" result && - test_i18ngrep "fatal: .*line 2" result + test_grep "missing value for .alias\.br" result && + test_grep "fatal: .*\.git/config" result && + test_grep "fatal: .*line 2" result ' test_expect_success 'error on modifying repo config without repo' ' nongit test_must_fail git config a.b c 2>err && - test_i18ngrep "not in a git directory" err + test_grep "not in a git directory" err ' cmdline_config="'foo.bar=from-cmdline'" diff --git a/t/t1309-early-config.sh b/t/t1309-early-config.sh index 537435b90a..523aa99a1e 100755 --- a/t/t1309-early-config.sh +++ b/t/t1309-early-config.sh @@ -78,7 +78,7 @@ test_with_config () { test_expect_success 'ignore .git/ with incompatible repository version' ' test_with_config "[core]repositoryformatversion = 999999" 2>err && - test_i18ngrep "warning:.* Expected git repo version <= [1-9]" err + test_grep "warning:.* Expected git repo version <= [1-9]" err ' test_expect_failure 'ignore .git/ with invalid repository version' ' diff --git a/t/t1310-config-default.sh b/t/t1310-config-default.sh index 09b10c144b..1a90d31201 100755 --- a/t/t1310-config-default.sh +++ b/t/t1310-config-default.sh @@ -26,12 +26,12 @@ test_expect_success 'canonicalizes --default with appropriate type' ' test_expect_success 'dies when --default cannot be parsed' ' test_must_fail git config -f config --type=expiry-date --default=x --get \ not.a.section 2>error && - test_i18ngrep "failed to format default config value" error + test_grep "failed to format default config value" error ' test_expect_success 'does not allow --default without --get' ' test_must_fail git config --default=quux --unset a.section >output 2>&1 && - test_i18ngrep "\-\-default is only applicable to" output + test_grep "\-\-default is only applicable to" output ' test_done diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index 4d66cd7f4a..c41cd9b6bf 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -354,14 +354,28 @@ test_expect_success "verifying $m's log (logged by config)" ' ' test_expect_success 'set up for querying the reflog' ' + git update-ref -d $m && + test-tool ref-store main delete-reflog $m && + + GIT_COMMITTER_DATE="1117150320 -0500" git update-ref $m $C && + GIT_COMMITTER_DATE="1117150350 -0500" git update-ref $m $A && + GIT_COMMITTER_DATE="1117150380 -0500" git update-ref $m $B && + GIT_COMMITTER_DATE="1117150680 -0500" git update-ref $m $F && + GIT_COMMITTER_DATE="1117150980 -0500" git update-ref $m $E && git update-ref $m $D && - cat >.git/logs/$m <<-EOF + # Delete the last reflog entry so that the tip of m and the reflog for + # it disagree. + git reflog delete $m@{0} && + + cat >expect <<-EOF && $Z $C $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150320 -0500 $C $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150350 -0500 $A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150380 -0500 - $F $Z $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150680 -0500 - $Z $E $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150980 -0500 + $B $F $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150680 -0500 + $F $E $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150980 -0500 EOF + test-tool ref-store main for-each-reflog-ent $m >actual && + test_cmp expect actual ' ed="Thu, 26 May 2005 18:32:00 -0500" @@ -409,13 +423,12 @@ test_expect_success 'Query "main@{2005-05-26 23:33:01}" (middle of history with test_when_finished "rm -f o e" && git rev-parse --verify "main@{2005-05-26 23:33:01}" >o 2>e && echo "$B" >expect && - test_cmp expect o && - test_i18ngrep -F "warning: log for ref $m has gap after $gd" e + test_cmp expect o ' test_expect_success 'Query "main@{2005-05-26 23:38:00}" (middle of history)' ' test_when_finished "rm -f o e" && git rev-parse --verify "main@{2005-05-26 23:38:00}" >o 2>e && - echo "$Z" >expect && + echo "$F" >expect && test_cmp expect o && test_must_be_empty e ' @@ -431,11 +444,27 @@ test_expect_success 'Query "main@{2005-05-28}" (past end of history)' ' git rev-parse --verify "main@{2005-05-28}" >o 2>e && echo "$D" >expect && test_cmp expect o && - test_i18ngrep -F "warning: log for ref $m unexpectedly ended on $ld" e + test_grep -F "warning: log for ref $m unexpectedly ended on $ld" e ' rm -f .git/$m .git/logs/$m expect +test_expect_success REFFILES 'query reflog with gap' ' + test_when_finished "git update-ref -d $m" && + + git update-ref $m $F && + cat >.git/logs/$m <<-EOF && + $Z $A $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150320 -0500 + $A $B $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150380 -0500 + $D $F $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150680 -0500 + EOF + + git rev-parse --verify "main@{2005-05-26 23:33:01}" >actual 2>stderr && + echo "$B" >expect && + test_cmp expect actual && + test_grep -F "warning: log for ref $m has gap after $gd" stderr +' + test_expect_success 'creating initial files' ' test_when_finished rm -f M && echo TEST >F && @@ -486,7 +515,7 @@ test_expect_success 'git cat-file blob main@{2005-05-26 23:42}:F (expect OTHER)' test_expect_success 'given old value for missing pseudoref, do not create' ' test_must_fail git update-ref PSEUDOREF $A $B 2>err && test_must_fail git rev-parse PSEUDOREF && - test_i18ngrep "unable to resolve reference" err + test_grep "unable to resolve reference" err ' test_expect_success 'create pseudoref' ' @@ -507,7 +536,7 @@ test_expect_success 'overwrite pseudoref with correct old value' ' test_expect_success 'do not overwrite pseudoref with wrong old value' ' test_must_fail git update-ref PSEUDOREF $D $E 2>err && test $C = $(git rev-parse PSEUDOREF) && - test_i18ngrep "cannot lock ref.*expected" err + test_grep "cannot lock ref.*expected" err ' test_expect_success 'delete pseudoref' ' @@ -519,7 +548,7 @@ test_expect_success 'do not delete pseudoref with wrong old value' ' git update-ref PSEUDOREF $A && test_must_fail git update-ref -d PSEUDOREF $B 2>err && test $A = $(git rev-parse PSEUDOREF) && - test_i18ngrep "cannot lock ref.*expected" err + test_grep "cannot lock ref.*expected" err ' test_expect_success 'delete pseudoref with correct old value' ' @@ -536,7 +565,7 @@ test_expect_success 'do not overwrite pseudoref with old OID zero' ' test_when_finished git update-ref -d PSEUDOREF && test_must_fail git update-ref PSEUDOREF $B $Z 2>err && test $A = $(git rev-parse PSEUDOREF) && - test_i18ngrep "already exists" err + test_grep "already exists" err ' # Test --stdin @@ -556,7 +585,7 @@ test_expect_success 'stdin test setup' ' test_expect_success '-z fails without --stdin' ' test_must_fail git update-ref -z $m $m $m 2>err && - test_i18ngrep "usage: git update-ref" err + test_grep "usage: git update-ref" err ' test_expect_success 'stdin works with no input' ' @@ -674,7 +703,7 @@ test_expect_success 'stdin fails with duplicate refs' ' create $a $m EOF test_must_fail git update-ref --stdin <stdin 2>err && - test_i18ngrep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed" err + test_grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed" err ' test_expect_success 'stdin create ref works' ' @@ -1107,7 +1136,7 @@ test_expect_success 'stdin -z fails option with unknown name' ' test_expect_success 'stdin -z fails with duplicate refs' ' printf $F "create $a" "$m" "create $b" "$m" "create $a" "$m" >stdin && test_must_fail git update-ref -z --stdin <stdin 2>err && - test_i18ngrep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed" err + test_grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed" err ' test_expect_success 'stdin -z create ref works' ' @@ -1338,7 +1367,7 @@ test_expect_success 'fails with duplicate HEAD update' ' update HEAD $B EOF test_must_fail git update-ref --stdin <stdin 2>err && - test_i18ngrep "fatal: multiple updates for '\''HEAD'\'' (including one via its referent .refs/heads/target1.) are not allowed" err && + test_grep "fatal: multiple updates for '\''HEAD'\'' (including one via its referent .refs/heads/target1.) are not allowed" err && echo "refs/heads/target1" >expect && git symbolic-ref HEAD >actual && test_cmp expect actual && @@ -1355,7 +1384,7 @@ test_expect_success 'fails with duplicate ref update via symref' ' update refs/heads/symref2 $B EOF test_must_fail git update-ref --stdin <stdin 2>err && - test_i18ngrep "fatal: multiple updates for '\''refs/heads/target2'\'' (including one via symref .refs/heads/symref2.) are not allowed" err && + test_grep "fatal: multiple updates for '\''refs/heads/target2'\'' (including one via symref .refs/heads/symref2.) are not allowed" err && echo "refs/heads/target2" >expect && git symbolic-ref refs/heads/symref2 >actual && test_cmp expect actual && diff --git a/t/t1401-symbolic-ref.sh b/t/t1401-symbolic-ref.sh index c7745e1bf6..3241d35917 100755 --- a/t/t1401-symbolic-ref.sh +++ b/t/t1401-symbolic-ref.sh @@ -171,8 +171,8 @@ test_expect_success 'symbolic-ref refuses invalid target for non-HEAD' ' ' test_expect_success 'symbolic-ref allows top-level target for non-HEAD' ' - git symbolic-ref refs/heads/top-level FETCH_HEAD && - git update-ref FETCH_HEAD HEAD && + git symbolic-ref refs/heads/top-level ORIG_HEAD && + git update-ref ORIG_HEAD HEAD && test_cmp_rev top-level HEAD ' diff --git a/t/t1403-show-ref.sh b/t/t1403-show-ref.sh index 9252a581ab..872ba8f110 100755 --- a/t/t1403-show-ref.sh +++ b/t/t1403-show-ref.sh @@ -196,4 +196,76 @@ 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_must_fail git show-ref --verify --exists 2>err && + grep "verify" err && + grep "exists" err && + 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_expect_success '--exists with existing reference' ' + git show-ref --exists refs/heads/$GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +' + +test_expect_success '--exists with missing reference' ' + test_expect_code 2 git show-ref --exists refs/heads/does-not-exist +' + +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_expect_success '--exists with HEAD' ' + git show-ref --exists HEAD +' + +test_expect_success '--exists with bad reference name' ' + test_when_finished "git update-ref -d refs/heads/bad...name" && + new_oid=$(git rev-parse HEAD) && + test-tool ref-store main update-ref msg refs/heads/bad...name $new_oid $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && + git show-ref --exists refs/heads/bad...name +' + +test_expect_success '--exists with arbitrary symref' ' + test_when_finished "git symbolic-ref -d refs/symref" && + git symbolic-ref refs/symref refs/heads/$GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME && + git show-ref --exists refs/symref +' + +test_expect_success '--exists with dangling symref' ' + test_when_finished "git symbolic-ref -d refs/heads/dangling" && + git symbolic-ref refs/heads/dangling refs/heads/does-not-exist && + git show-ref --exists refs/heads/dangling +' + +test_expect_success '--exists with nonexistent object ID' ' + test-tool ref-store main update-ref msg refs/heads/missing-oid $(test_oid 001) $ZERO_OID REF_SKIP_OID_VERIFICATION && + git show-ref --exists refs/heads/missing-oid +' + +test_expect_success '--exists with non-commit object' ' + tree_oid=$(git rev-parse HEAD^{tree}) && + test-tool ref-store main update-ref msg refs/heads/tree ${tree_oid} $ZERO_OID REF_SKIP_OID_VERIFICATION && + git show-ref --exists refs/heads/tree +' + +test_expect_success '--exists with directory fails with generic error' ' + cat >expect <<-EOF && + error: reference does not exist + EOF + test_expect_code 2 git show-ref --exists refs/heads 2>err && + test_cmp expect err +' + test_done diff --git a/t/t1404-update-ref-errors.sh b/t/t1404-update-ref-errors.sh index 937ae0d733..0369beea33 100755 --- a/t/t1404-update-ref-errors.sh +++ b/t/t1404-update-ref-errors.sh @@ -29,7 +29,7 @@ test_update_rejected () { fi && printf "create $prefix/%s $C\n" $create >input && test_must_fail git update-ref --stdin <input 2>output.err && - test_i18ngrep -F "$error" output.err && + test_grep -F "$error" output.err && git for-each-ref $prefix >actual && test_cmp unchanged actual } @@ -613,7 +613,7 @@ test_expect_success REFFILES 'delete fails cleanly if packed-refs file is locked test_when_finished "rm -f .git/packed-refs.lock" && test_must_fail git update-ref -d $prefix/foo >out 2>err && git for-each-ref $prefix >actual && - test_i18ngrep "Unable to create $SQ.*packed-refs.lock$SQ: " err && + test_grep "Unable to create $SQ.*packed-refs.lock$SQ: " err && test_cmp unchanged actual ' diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh index 6c45965b1e..a0ff8d51f0 100755 --- a/t/t1410-reflog.sh +++ b/t/t1410-reflog.sh @@ -29,7 +29,7 @@ check_fsck () { '') test_must_be_empty fsck.output ;; *) - test_i18ngrep "$1" fsck.output ;; + test_grep "$1" fsck.output ;; esac } @@ -308,9 +308,9 @@ test_expect_success 'git reflog expire unknown reference' ' test_config gc.reflogexpireunreachable never && test_must_fail git reflog expire main@{123} 2>stderr && - test_i18ngrep "points nowhere" stderr && + test_grep "points nowhere" stderr && test_must_fail git reflog expire does-not-exist 2>stderr && - test_i18ngrep "points nowhere" stderr + test_grep "points nowhere" stderr ' test_expect_success 'checkout should not delete log for packed ref' ' @@ -446,11 +446,34 @@ test_expect_success 'expire with multiple worktrees' ' ) ' -test_expect_success REFFILES 'empty reflog' ' +test_expect_success 'expire one of multiple worktrees' ' + git init main-wt2 && + ( + cd main-wt2 && + test_tick && + test_commit foo && + git worktree add link-wt && + test_tick && + test_commit -C link-wt foobar && + test_tick && + test-tool ref-store worktree:link-wt for-each-reflog-ent HEAD \ + >expect-link-wt && + git reflog expire --verbose --all --expire=$test_tick \ + --single-worktree && + test-tool ref-store worktree:main for-each-reflog-ent HEAD \ + >actual-main && + test-tool ref-store worktree:link-wt for-each-reflog-ent HEAD \ + >actual-link-wt && + test_must_be_empty actual-main && + test_cmp expect-link-wt actual-link-wt + ) +' + +test_expect_success 'empty reflog' ' test_when_finished "rm -rf empty" && git init empty && test_commit -C empty A && - >empty/.git/logs/refs/heads/foo && + test-tool ref-store main create-reflog refs/heads/foo && git -C empty reflog expire --all 2>err && test_must_be_empty err ' diff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh index b32ca798f9..2092488090 100755 --- a/t/t1416-ref-transaction-hooks.sh +++ b/t/t1416-ref-transaction-hooks.sh @@ -37,7 +37,7 @@ test_expect_success 'hook aborts updating ref in prepared state' ' fi EOF test_must_fail git update-ref HEAD POST 2>err && - test_i18ngrep "ref updates aborted by hook" err + test_grep "ref updates aborted by hook" err ' test_expect_success 'hook gets all queued updates in prepared state' ' diff --git a/t/t1417-reflog-updateref.sh b/t/t1417-reflog-updateref.sh index 14f13b57c6..0eb5e674bc 100755 --- a/t/t1417-reflog-updateref.sh +++ b/t/t1417-reflog-updateref.sh @@ -14,9 +14,13 @@ test_expect_success 'setup' ' test_commit B && test_commit C && - cp .git/logs/HEAD HEAD.old && + git reflog HEAD >expect && git reset --hard HEAD~ && - cp HEAD.old .git/logs/HEAD + # Make sure that the reflog does not point to the same commit + # as HEAD. + git reflog delete HEAD@{0} && + git reflog HEAD >actual && + test_cmp expect actual ) ' @@ -25,7 +29,7 @@ test_reflog_updateref () { shift args="$@" - test_expect_success REFFILES "get '$exp' with '$args'" ' + test_expect_success "get '$exp' with '$args'" ' test_when_finished "rm -rf copy" && cp -R repo copy && diff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh index ff1c967d55..68cc9e73d0 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-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && git branch >output 2>error && - test_i18ngrep -e "ignoring ref with broken name refs/heads/broken\.\.\.ref" error && + test_grep -e "ignoring ref with broken name refs/heads/broken\.\.\.ref" error && ! grep -e "broken\.\.\.ref" output ' @@ -158,7 +158,7 @@ test_expect_success 'rev-parse skips symref pointing to broken name' ' git rev-parse --verify one >expect && git rev-parse --verify shadow >actual 2>err && test_cmp expect actual && - test_i18ngrep "ignoring dangling symref refs/tags/shadow" err + test_grep "ignoring dangling symref refs/tags/shadow" err ' test_expect_success 'for-each-ref emits warnings for broken names' ' @@ -172,9 +172,9 @@ test_expect_success 'for-each-ref emits warnings for broken names' ' ! grep -e "broken\.\.\.ref" output && ! grep -e "badname" output && ! grep -e "broken\.\.\.symref" output && - test_i18ngrep "ignoring ref with broken name refs/heads/broken\.\.\.ref" error && - test_i18ngrep ! "ignoring broken ref refs/heads/badname" error && - test_i18ngrep "ignoring ref with broken name refs/heads/broken\.\.\.symref" error + 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 ' test_expect_success 'update-ref -d can delete broken name' ' @@ -192,7 +192,7 @@ test_expect_success 'branch -d can delete broken name' ' test-tool ref-store main update-ref msg "refs/heads/broken...ref" $main_sha1 $ZERO_OID REF_SKIP_REFNAME_VERIFICATION && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && git branch -d broken...ref >output 2>error && - test_i18ngrep "Deleted branch broken...ref (was broken)" output && + test_grep "Deleted branch broken...ref (was broken)" output && test_must_be_empty error && git branch >output 2>error && ! grep -e "broken\.\.\.ref" error && @@ -205,8 +205,9 @@ test_expect_success 'update-ref --no-deref -d can delete symref to broken name' test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && + test_ref_exists refs/heads/badname && git update-ref --no-deref -d refs/heads/badname >output 2>error && - test_path_is_missing .git/refs/heads/badname && + test_ref_missing refs/heads/badname && test_must_be_empty output && test_must_be_empty error ' @@ -216,17 +217,19 @@ test_expect_success 'branch -d can delete symref to broken name' ' test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && + test_ref_exists refs/heads/badname && git branch -d badname >output 2>error && - test_path_is_missing .git/refs/heads/badname && - test_i18ngrep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output && + test_ref_missing refs/heads/badname && + test_grep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output && test_must_be_empty error ' test_expect_success 'update-ref --no-deref -d can delete dangling symref to broken name' ' test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && + test_ref_exists refs/heads/badname && git update-ref --no-deref -d refs/heads/badname >output 2>error && - test_path_is_missing .git/refs/heads/badname && + test_ref_missing refs/heads/badname && test_must_be_empty output && test_must_be_empty error ' @@ -234,9 +237,10 @@ test_expect_success 'update-ref --no-deref -d can delete dangling symref to brok test_expect_success 'branch -d can delete dangling symref to broken name' ' test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && + test_ref_exists refs/heads/badname && git branch -d badname >output 2>error && - test_path_is_missing .git/refs/heads/badname && - test_i18ngrep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output && + test_ref_missing refs/heads/badname && + test_grep "Deleted branch badname (was refs/heads/broken\.\.\.ref)" output && test_must_be_empty error ' @@ -245,8 +249,9 @@ test_expect_success 'update-ref -d can delete broken name through symref' ' test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...ref" && test-tool ref-store main create-symref refs/heads/badname refs/heads/broken...ref msg && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/badname" && + test_ref_exists refs/heads/broken...ref && git update-ref -d refs/heads/badname >output 2>error && - test_path_is_missing .git/refs/heads/broken...ref && + test_ref_missing refs/heads/broken...ref && test_must_be_empty output && test_must_be_empty error ' @@ -254,8 +259,9 @@ test_expect_success 'update-ref -d can delete broken name through symref' ' test_expect_success 'update-ref --no-deref -d can delete symref with broken name' ' printf "ref: refs/heads/main\n" >.git/refs/heads/broken...symref && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && + test_ref_exists refs/heads/broken...symref && git update-ref --no-deref -d refs/heads/broken...symref >output 2>error && - test_path_is_missing .git/refs/heads/broken...symref && + test_ref_missing refs/heads/broken...symref && test_must_be_empty output && test_must_be_empty error ' @@ -263,17 +269,19 @@ test_expect_success 'update-ref --no-deref -d can delete symref with broken name test_expect_success 'branch -d can delete symref with broken name' ' printf "ref: refs/heads/main\n" >.git/refs/heads/broken...symref && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && + test_ref_exists refs/heads/broken...symref && git branch -d broken...symref >output 2>error && - test_path_is_missing .git/refs/heads/broken...symref && - test_i18ngrep "Deleted branch broken...symref (was refs/heads/main)" output && + test_ref_missing refs/heads/broken...symref && + test_grep "Deleted branch broken...symref (was refs/heads/main)" output && test_must_be_empty error ' test_expect_success 'update-ref --no-deref -d can delete dangling symref with broken name' ' printf "ref: refs/heads/idonotexist\n" >.git/refs/heads/broken...symref && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && + test_ref_exists refs/heads/broken...symref && git update-ref --no-deref -d refs/heads/broken...symref >output 2>error && - test_path_is_missing .git/refs/heads/broken...symref && + test_ref_missing refs/heads/broken...symref && test_must_be_empty output && test_must_be_empty error ' @@ -281,9 +289,10 @@ test_expect_success 'update-ref --no-deref -d can delete dangling symref with br test_expect_success 'branch -d can delete dangling symref with broken name' ' printf "ref: refs/heads/idonotexist\n" >.git/refs/heads/broken...symref && test_when_finished "test-tool ref-store main delete-refs REF_NO_DEREF msg refs/heads/broken...symref" && + test_ref_exists refs/heads/broken...symref && git branch -d broken...symref >output 2>error && - test_path_is_missing .git/refs/heads/broken...symref && - test_i18ngrep "Deleted branch broken...symref (was refs/heads/idonotexist)" output && + test_ref_missing refs/heads/broken...symref && + test_grep "Deleted branch broken...symref (was refs/heads/idonotexist)" output && test_must_be_empty error ' @@ -292,7 +301,7 @@ test_expect_success 'update-ref -d cannot delete non-ref in .git dir' ' echo precious >expect && test_must_fail git update-ref -d my-private-file >output 2>error && test_must_be_empty output && - test_i18ngrep -e "refusing to update ref with bad name" error && + test_grep -e "refusing to update ref with bad name" error && test_cmp expect .git/my-private-file ' diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index 5805d47eb9..0e3e87d37a 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -118,7 +118,7 @@ test_expect_success 'branch pointing to non-commit' ' git rev-parse HEAD^{tree} >.git/refs/heads/invalid && test_when_finished "git update-ref -d refs/heads/invalid" && test_must_fail git fsck 2>out && - test_i18ngrep "not a commit" out + test_grep "not a commit" out ' test_expect_success 'HEAD link pointing at a funny object' ' @@ -127,7 +127,7 @@ test_expect_success 'HEAD link pointing at a funny object' ' echo $ZERO_OID >.git/HEAD && # avoid corrupt/broken HEAD from interfering with repo discovery test_must_fail env GIT_DIR=.git git fsck 2>out && - test_i18ngrep "detached HEAD points" out + test_grep "detached HEAD points" out ' test_expect_success 'HEAD link pointing at a funny place' ' @@ -136,7 +136,7 @@ test_expect_success 'HEAD link pointing at a funny place' ' echo "ref: refs/funny/place" >.git/HEAD && # avoid corrupt/broken HEAD from interfering with repo discovery test_must_fail env GIT_DIR=.git git fsck 2>out && - test_i18ngrep "HEAD points to something strange" out + test_grep "HEAD points to something strange" out ' test_expect_success 'HEAD link pointing at a funny object (from different wt)' ' @@ -147,7 +147,7 @@ test_expect_success 'HEAD link pointing at a funny object (from different wt)' ' echo $ZERO_OID >.git/HEAD && # avoid corrupt/broken HEAD from interfering with repo discovery test_must_fail git -C wt fsck 2>out && - test_i18ngrep "main-worktree/HEAD: detached HEAD points" out + test_grep "main-worktree/HEAD: detached HEAD points" out ' test_expect_success 'other worktree HEAD link pointing at a funny object' ' @@ -155,7 +155,7 @@ test_expect_success 'other worktree HEAD link pointing at a funny object' ' git worktree add other && echo $ZERO_OID >.git/worktrees/other/HEAD && test_must_fail git fsck 2>out && - test_i18ngrep "worktrees/other/HEAD: detached HEAD points" out + test_grep "worktrees/other/HEAD: detached HEAD points" out ' test_expect_success 'other worktree HEAD link pointing at missing object' ' @@ -163,7 +163,7 @@ test_expect_success 'other worktree HEAD link pointing at missing object' ' git worktree add other && echo "Contents missing from repo" | git hash-object --stdin >.git/worktrees/other/HEAD && test_must_fail git fsck 2>out && - test_i18ngrep "worktrees/other/HEAD: invalid sha1 pointer" out + test_grep "worktrees/other/HEAD: invalid sha1 pointer" out ' test_expect_success 'other worktree HEAD link pointing at a funny place' ' @@ -171,7 +171,7 @@ test_expect_success 'other worktree HEAD link pointing at a funny place' ' git worktree add other && echo "ref: refs/funny/place" >.git/worktrees/other/HEAD && test_must_fail git fsck 2>out && - test_i18ngrep "worktrees/other/HEAD points to something strange" out + test_grep "worktrees/other/HEAD points to something strange" out ' test_expect_success 'commit with multiple signatures is okay' ' @@ -217,7 +217,7 @@ test_expect_success 'email with embedded > is not okay' ' git update-ref refs/heads/bogus "$new" && test_when_finished "git update-ref -d refs/heads/bogus" && test_must_fail git fsck 2>out && - test_i18ngrep "error in commit $new" out + test_grep "error in commit $new" out ' test_expect_success 'missing < email delimiter is reported nicely' ' @@ -228,7 +228,7 @@ test_expect_success 'missing < email delimiter is reported nicely' ' git update-ref refs/heads/bogus "$new" && test_when_finished "git update-ref -d refs/heads/bogus" && test_must_fail git fsck 2>out && - test_i18ngrep "error in commit $new.* - bad name" out + test_grep "error in commit $new.* - bad name" out ' test_expect_success 'missing email is reported nicely' ' @@ -239,7 +239,7 @@ test_expect_success 'missing email is reported nicely' ' git update-ref refs/heads/bogus "$new" && test_when_finished "git update-ref -d refs/heads/bogus" && test_must_fail git fsck 2>out && - test_i18ngrep "error in commit $new.* - missing email" out + test_grep "error in commit $new.* - missing email" out ' test_expect_success '> in name is reported' ' @@ -250,7 +250,7 @@ test_expect_success '> in name is reported' ' git update-ref refs/heads/bogus "$new" && test_when_finished "git update-ref -d refs/heads/bogus" && test_must_fail git fsck 2>out && - test_i18ngrep "error in commit $new" out + test_grep "error in commit $new" out ' # date is 2^64 + 1 @@ -263,7 +263,7 @@ test_expect_success 'integer overflow in timestamps is reported' ' git update-ref refs/heads/bogus "$new" && test_when_finished "git update-ref -d refs/heads/bogus" && test_must_fail git fsck 2>out && - test_i18ngrep "error in commit $new.*integer overflow" out + test_grep "error in commit $new.*integer overflow" out ' test_expect_success 'commit with NUL in header' ' @@ -274,7 +274,7 @@ test_expect_success 'commit with NUL in header' ' git update-ref refs/heads/bogus "$new" && test_when_finished "git update-ref -d refs/heads/bogus" && test_must_fail git fsck 2>out && - test_i18ngrep "error in commit $new.*unterminated header: NUL at offset" out + test_grep "error in commit $new.*unterminated header: NUL at offset" out ' test_expect_success 'tree object with duplicate entries' ' @@ -295,7 +295,7 @@ test_expect_success 'tree object with duplicate entries' ' git hash-object --literally -w -t tree --stdin ) && test_must_fail git fsck 2>out && - test_i18ngrep "error in tree .*contains duplicate file entries" out + test_grep "error in tree .*contains duplicate file entries" out ' check_duplicate_names () { @@ -318,8 +318,8 @@ check_duplicate_names () { done >badtree && badtree=$(git mktree <badtree) && test_must_fail git fsck 2>out && - test_i18ngrep "$badtree" out && - test_i18ngrep "error in tree .*contains duplicate file entries" out + test_grep "$badtree" out && + test_grep "error in tree .*contains duplicate file entries" out ' } @@ -341,9 +341,9 @@ test_expect_success 'unparseable tree object' ' commit_sha1=$(git commit-tree $tree_sha1) && git update-ref refs/heads/wrong $commit_sha1 && test_must_fail git fsck 2>out && - test_i18ngrep "error: empty filename in tree entry" out && - test_i18ngrep "$tree_sha1" out && - test_i18ngrep ! "fatal: empty filename in tree entry" out + test_grep "error: empty filename in tree entry" out && + test_grep "$tree_sha1" out && + test_grep ! "fatal: empty filename in tree entry" out ' test_expect_success 'tree entry with type mismatch' ' @@ -360,8 +360,8 @@ test_expect_success 'tree entry with type mismatch' ' commit=$(git commit-tree $tree) && git update-ref refs/heads/type_mismatch $commit && test_must_fail git fsck >out 2>&1 && - test_i18ngrep "is a blob, not a tree" out && - test_i18ngrep ! "dangling blob" out + test_grep "is a blob, not a tree" out && + test_grep ! "dangling blob" out ' test_expect_success 'tree entry with bogus mode' ' @@ -394,7 +394,7 @@ test_expect_success 'tag pointing to nonexistent' ' echo $tag >.git/refs/tags/invalid && test_when_finished "git update-ref -d refs/tags/invalid" && test_must_fail git fsck --tags >out && - test_i18ngrep "broken link" out + test_grep "broken link" out ' test_expect_success 'tag pointing to something else than its type' ' @@ -455,7 +455,7 @@ test_expect_success 'tag with bad tagger' ' echo $tag >.git/refs/tags/wrong && test_when_finished "git update-ref -d refs/tags/wrong" && test_must_fail git fsck --tags 2>out && - test_i18ngrep "error in tag .*: invalid author/committer" out + test_grep "error in tag .*: invalid author/committer" out ' test_expect_success 'tag with NUL in header' ' @@ -474,7 +474,7 @@ test_expect_success 'tag with NUL in header' ' echo $tag >.git/refs/tags/wrong && test_when_finished "git update-ref -d refs/tags/wrong" && test_must_fail git fsck --tags 2>out && - test_i18ngrep "error in tag $tag.*unterminated header: NUL at offset" out + test_grep "error in tag $tag.*unterminated header: NUL at offset" out ' test_expect_success 'cleaned up' ' @@ -504,7 +504,7 @@ test_expect_success 'rev-list --verify-objects with bad sha1' ' test_when_finished "git update-ref -d refs/heads/bogus" && test_might_fail git rev-list --verify-objects refs/heads/bogus >/dev/null 2>out && - test_i18ngrep -q "error: hash mismatch $(dirname $new)$(test_oid ff_2)" out + test_grep -q "error: hash mismatch $(dirname $new)$(test_oid ff_2)" out ' # An actual bit corruption is more likely than swapped commits, but @@ -575,7 +575,7 @@ test_expect_success 'fsck notices blob entry pointing to null sha1' ' sha=$(printf "100644 file$_bz$_bzoid" | git hash-object --literally -w --stdin -t tree) && git fsck 2>out && - test_i18ngrep "warning.*null sha1" out + test_grep "warning.*null sha1" out ) ' @@ -585,7 +585,17 @@ test_expect_success 'fsck notices submodule entry pointing to null sha1' ' sha=$(printf "160000 submodule$_bz$_bzoid" | git hash-object --literally -w --stdin -t tree) && git fsck 2>out && - test_i18ngrep "warning.*null sha1" out + test_grep "warning.*null sha1" out + ) +' + +test_expect_success 'fsck notices excessively large tree entry name' ' + git init large-name && + ( + cd large-name && + test_commit a-long-name && + git -c fsck.largePathname=warn:10 fsck 2>out && + grep "warning.*large pathname" out ) ' @@ -606,7 +616,7 @@ while read name path pretty; do printf "$mode $type %s\t%s" "$value" "$path" >bad && bad_tree=$(git mktree <bad) && git fsck 2>out && - test_i18ngrep "warning.*tree $bad_tree" out + test_grep "warning.*tree $bad_tree" out )' done <<-\EOF 100644 blob @@ -652,9 +662,9 @@ test_expect_success 'NUL in commit' ' git branch bad $(cat name) && test_must_fail git -c fsck.nulInCommit=error fsck 2>warn.1 && - test_i18ngrep nulInCommit warn.1 && + test_grep nulInCommit warn.1 && git fsck 2>warn.2 && - test_i18ngrep nulInCommit warn.2 + test_grep nulInCommit warn.2 ) ' @@ -774,7 +784,7 @@ test_expect_success 'fsck --name-objects' ' tree=$(git rev-parse --verify julius:) && git tag -d julius && test_must_fail git fsck --name-objects >out && - test_i18ngrep "$tree (refs/tags/augustus44\\^:" out + test_grep "$tree (refs/tags/augustus44\\^:" out ) ' @@ -787,7 +797,7 @@ test_expect_success 'alternate objects are correctly blamed' ' mkdir alt.git/objects/$(dirname $path) && >alt.git/objects/$(dirname $path)/$(basename $path) && test_must_fail git fsck >out 2>&1 && - test_i18ngrep alt.git out + test_grep alt.git out ' test_expect_success 'fsck errors in packed objects' ' @@ -806,8 +816,8 @@ test_expect_success 'fsck errors in packed objects' ' remove_object $one && remove_object $two && test_must_fail git fsck 2>out && - test_i18ngrep "error in commit $one.* - bad name" out && - test_i18ngrep "error in commit $two.* - bad name" out && + test_grep "error in commit $one.* - bad name" out && + test_grep "error in commit $two.* - bad name" out && ! grep corrupt out ' @@ -824,7 +834,7 @@ test_expect_success 'fsck fails on corrupt packfile' ' test_when_finished "rm -f .git/objects/pack/pack-$pack.*" && remove_object $hsh && test_must_fail git fsck 2>out && - test_i18ngrep "checksum mismatch" out + test_grep "checksum mismatch" out ' test_expect_success 'fsck finds problems in duplicate loose objects' ' @@ -861,7 +871,7 @@ test_expect_success 'fsck detects trailing loose garbage (commit)' ' chmod +w "$file" && echo garbage >>"$file" && test_must_fail git fsck 2>out && - test_i18ngrep "garbage.*$commit" out + test_grep "garbage.*$commit" out ' test_expect_success 'fsck detects trailing loose garbage (large blob)' ' @@ -871,7 +881,7 @@ test_expect_success 'fsck detects trailing loose garbage (large blob)' ' chmod +w "$file" && echo garbage >>"$file" && test_must_fail git -c core.bigfilethreshold=5 fsck 2>out && - test_i18ngrep "garbage.*$blob" out + test_grep "garbage.*$blob" out ' test_expect_success 'fsck detects truncated loose object' ' @@ -887,10 +897,10 @@ test_expect_success 'fsck detects truncated loose object' ' # check both regular and streaming code paths test_must_fail git fsck 2>out && - test_i18ngrep corrupt.*$blob out && + test_grep corrupt.*$blob out && test_must_fail git -c core.bigfilethreshold=128 fsck 2>out && - test_i18ngrep corrupt.*$blob out + test_grep corrupt.*$blob out ' # for each of type, we have one version which is referenced by another object @@ -979,7 +989,7 @@ test_expect_success 'detect corrupt index file in fsck' ' test_when_finished "mv .git/index.backup .git/index" && corrupt_index_checksum && test_must_fail git fsck --cache 2>errors && - test_i18ngrep "bad index file" errors + test_grep "bad index file" errors ' test_expect_success 'fsck error and recovery on invalid object type' ' diff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh index 37ee5091b5..3f9e7f62e4 100755 --- a/t/t1500-rev-parse.sh +++ b/t/t1500-rev-parse.sh @@ -264,4 +264,27 @@ test_expect_success 'rev-parse --since= unsqueezed ordering' ' test_cmp expect actual ' +test_expect_success 'rev-parse --bisect includes bad, excludes good' ' + test_commit_bulk 6 && + + git update-ref refs/bisect/bad-1 HEAD~1 && + git update-ref refs/bisect/b HEAD~2 && + git update-ref refs/bisect/bad-3 HEAD~3 && + git update-ref refs/bisect/good-3 HEAD~3 && + git update-ref refs/bisect/bad-4 HEAD~4 && + git update-ref refs/bisect/go HEAD~4 && + + # Note: refs/bisect/b and refs/bisect/go should be ignored because they + # do not match the refs/bisect/bad or refs/bisect/good prefixes. + cat >expect <<-EOF && + refs/bisect/bad-1 + refs/bisect/bad-3 + refs/bisect/bad-4 + ^refs/bisect/good-3 + EOF + + git rev-parse --symbolic-full-name --bisect >actual && + test_cmp expect actual +' + test_done diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh index dd811b7fb4..f0737593c3 100755 --- a/t/t1502-rev-parse-parseopt.sh +++ b/t/t1502-rev-parse-parseopt.sh @@ -3,13 +3,29 @@ test_description='test git rev-parse --parseopt' . ./test-lib.sh +check_invalid_long_option () { + spec="$1" + opt="$2" + test_expect_success "test --parseopt invalid switch $opt help output for $spec" ' + { + cat <<-\EOF && + error: unknown option `'${opt#--}\'' + EOF + sed -e 1d -e \$d <"$TEST_DIRECTORY/t1502/$spec.help" + } >expect && + test_expect_code 129 git rev-parse --parseopt -- $opt \ + 2>output <"$TEST_DIRECTORY/t1502/$spec" && + test_cmp expect output + ' +} + test_expect_success 'setup optionspec' ' sed -e "s/^|//" >optionspec <<\EOF |some-command [options] <args>... | |some-command does foo and bar! |-- -|h,help show the help +|h,help! show the help | |foo some nifty option --foo |bar= some cool option --bar with an argument @@ -58,44 +74,8 @@ EOF ' test_expect_success 'test --parseopt help output' ' - sed -e "s/^|//" >expect <<\END_EXPECT && -|cat <<\EOF -|usage: some-command [options] <args>... -| -| some-command does foo and bar! -| -| -h, --help show the help -| --foo some nifty option --foo -| --bar ... some cool option --bar with an argument -| -b, --baz a short and long option -| -|An option group Header -| -C[...] option C with an optional argument -| -d, --data[=...] short and long option with an optional argument -| -|Argument hints -| -B <arg> short option required argument -| --bar2 <arg> long option required argument -| -e, --fuz <with-space> -| short and long option required argument -| -s[<some>] short option optional argument -| --long[=<data>] long option optional argument -| -g, --fluf[=<path>] short and long option optional argument -| --longest <very-long-argument-hint> -| a very long argument hint -| --pair <key=value> with an equals sign in the hint -| --aswitch help te=t contains? fl*g characters!` -| --bswitch <hint> hint has trailing tab character -| --cswitch switch has trailing tab character -| --short-hint <a> with a one symbol hint -| -|Extras -| --extra1 line above used to cause a segfault but no longer does -| -|EOF -END_EXPECT test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec && - test_cmp expect output + test_cmp "$TEST_DIRECTORY/t1502/optionspec.help" output ' test_expect_success 'test --parseopt help output no switches' ' @@ -131,7 +111,7 @@ test_expect_success 'test --parseopt help-all output hidden switches' ' | | some-command does foo and bar! | -| --hidden1 A hidden switch +| --[no-]hidden1 A hidden switch | |EOF END_EXPECT @@ -140,41 +120,12 @@ END_EXPECT ' test_expect_success 'test --parseopt invalid switch help output' ' - sed -e "s/^|//" >expect <<\END_EXPECT && -|error: unknown option `does-not-exist'\'' -|usage: some-command [options] <args>... -| -| some-command does foo and bar! -| -| -h, --help show the help -| --foo some nifty option --foo -| --bar ... some cool option --bar with an argument -| -b, --baz a short and long option -| -|An option group Header -| -C[...] option C with an optional argument -| -d, --data[=...] short and long option with an optional argument -| -|Argument hints -| -B <arg> short option required argument -| --bar2 <arg> long option required argument -| -e, --fuz <with-space> -| short and long option required argument -| -s[<some>] short option optional argument -| --long[=<data>] long option optional argument -| -g, --fluf[=<path>] short and long option optional argument -| --longest <very-long-argument-hint> -| a very long argument hint -| --pair <key=value> with an equals sign in the hint -| --aswitch help te=t contains? fl*g characters!` -| --bswitch <hint> hint has trailing tab character -| --cswitch switch has trailing tab character -| --short-hint <a> with a one symbol hint -| -|Extras -| --extra1 line above used to cause a segfault but no longer does -| -END_EXPECT + { + cat <<-\EOF && + error: unknown option `does-not-exist'\'' + EOF + sed -e 1d -e \$d <"$TEST_DIRECTORY/t1502/optionspec.help" + } >expect && test_expect_code 129 git rev-parse --parseopt -- --does-not-exist 1>/dev/null 2>output < optionspec && test_cmp expect output ' @@ -288,7 +239,7 @@ test_expect_success 'test --parseopt help output: "wrapped" options normal "or:" | [--another-option] |cmd [--yet-another-option] |-- - |h,help show the help + |h,help! show the help EOF sed -e "s/^|//" >expect <<-\END_EXPECT && @@ -322,7 +273,7 @@ test_expect_success 'test --parseopt help output: multi-line blurb after empty l |line |blurb |-- - |h,help show the help + |h,help! show the help EOF sed -e "s/^|//" >expect <<-\END_EXPECT && @@ -343,4 +294,32 @@ test_expect_success 'test --parseopt help output: multi-line blurb after empty l test_cmp expect actual ' +test_expect_success 'test --parseopt help output for optionspec-neg' ' + test_expect_code 129 git rev-parse --parseopt -- \ + -h >output <"$TEST_DIRECTORY/t1502/optionspec-neg" && + test_cmp "$TEST_DIRECTORY/t1502/optionspec-neg.help" output +' + +test_expect_success 'test --parseopt valid options for optionspec-neg' ' + cat >expect <<-\EOF && + set -- --foo --no-foo --no-bar --positive-only --no-negative -- + EOF + git rev-parse --parseopt -- <"$TEST_DIRECTORY/t1502/optionspec-neg" >output \ + --foo --no-foo --no-bar --positive-only --no-negative && + test_cmp expect output +' + +test_expect_success 'test --parseopt positivated option for optionspec-neg' ' + cat >expect <<-\EOF && + set -- --no-no-bar --no-no-bar -- + EOF + git rev-parse --parseopt -- <"$TEST_DIRECTORY/t1502/optionspec-neg" >output \ + --no-no-bar --bar && + test_cmp expect output +' + +check_invalid_long_option optionspec-neg --no-positive-only +check_invalid_long_option optionspec-neg --negative +check_invalid_long_option optionspec-neg --no-no-negative + test_done diff --git a/t/t1502/.gitattributes b/t/t1502/.gitattributes new file mode 100644 index 0000000000..562b12e16e --- /dev/null +++ b/t/t1502/.gitattributes @@ -0,0 +1 @@ +* -whitespace diff --git a/t/t1502/optionspec-neg b/t/t1502/optionspec-neg new file mode 100644 index 0000000000..392f43eb0b --- /dev/null +++ b/t/t1502/optionspec-neg @@ -0,0 +1,8 @@ +some-command [options] <args>... + +some-command does foo and bar! +-- +foo can be negated +no-bar can be positivated +positive-only! cannot be negated +no-negative! cannot be positivated diff --git a/t/t1502/optionspec-neg.help b/t/t1502/optionspec-neg.help new file mode 100644 index 0000000000..7a29f8cb03 --- /dev/null +++ b/t/t1502/optionspec-neg.help @@ -0,0 +1,12 @@ +cat <<\EOF +usage: some-command [options] <args>... + + some-command does foo and bar! + + --[no-]foo can be negated + --no-bar can be positivated + --bar opposite of --no-bar + --positive-only cannot be negated + --no-negative cannot be positivated + +EOF diff --git a/t/t1502/optionspec.help b/t/t1502/optionspec.help new file mode 100755 index 0000000000..cbdd54d41b --- /dev/null +++ b/t/t1502/optionspec.help @@ -0,0 +1,36 @@ +cat <<\EOF +usage: some-command [options] <args>... + + some-command does foo and bar! + + -h, --help show the help + --[no-]foo some nifty option --foo + --[no-]bar ... some cool option --bar with an argument + -b, --[no-]baz a short and long option + +An option group Header + -C[...] option C with an optional argument + -d, --[no-]data[=...] short and long option with an optional argument + +Argument hints + -B <arg> short option required argument + --[no-]bar2 <arg> long option required argument + -e, --[no-]fuz <with-space> + short and long option required argument + -s[<some>] short option optional argument + --[no-]long[=<data>] long option optional argument + -g, --[no-]fluf[=<path>] + short and long option optional argument + --[no-]longest <very-long-argument-hint> + a very long argument hint + --[no-]pair <key=value> + with an equals sign in the hint + --[no-]aswitch help te=t contains? fl*g characters!` + --[no-]bswitch <hint> hint has trailing tab character + --[no-]cswitch switch has trailing tab character + --[no-]short-hint <a> with a one symbol hint + +Extras + --[no-]extra1 line above used to cause a segfault but no longer does + +EOF diff --git a/t/t1506-rev-parse-diagnosis.sh b/t/t1506-rev-parse-diagnosis.sh index 18688cae17..ef40511d89 100755 --- a/t/t1506-rev-parse-diagnosis.sh +++ b/t/t1506-rev-parse-diagnosis.sh @@ -107,16 +107,16 @@ test_expect_success 'correct relative file objects (6)' ' test_expect_success 'incorrect revision id' ' test_must_fail git rev-parse foobar:file.txt 2>error && - test_i18ngrep "invalid object name .foobar." error && + test_grep "invalid object name .foobar." error && test_must_fail git rev-parse foobar 2>error && - test_i18ngrep "unknown revision or path not in the working tree." error + test_grep "unknown revision or path not in the working tree." error ' test_expect_success 'incorrect file in sha1:path' ' test_must_fail git rev-parse HEAD:nothing.txt 2>error && - test_i18ngrep "path .nothing.txt. does not exist in .HEAD." error && + test_grep "path .nothing.txt. does not exist in .HEAD." error && test_must_fail git rev-parse HEAD:index-only.txt 2>error && - test_i18ngrep "path .index-only.txt. exists on disk, but not in .HEAD." error && + test_grep "path .index-only.txt. exists on disk, but not in .HEAD." error && (cd subdir && test_must_fail git rev-parse HEAD:file2.txt 2>error && test_did_you_mean HEAD subdir/ file2.txt exists ) @@ -124,9 +124,9 @@ test_expect_success 'incorrect file in sha1:path' ' test_expect_success 'incorrect file in :path and :N:path' ' test_must_fail git rev-parse :nothing.txt 2>error && - test_i18ngrep "path .nothing.txt. does not exist (neither on disk nor in the index)" error && + test_grep "path .nothing.txt. does not exist (neither on disk nor in the index)" error && test_must_fail git rev-parse :1:nothing.txt 2>error && - test_i18ngrep "path .nothing.txt. does not exist (neither on disk nor in the index)" error && + test_grep "path .nothing.txt. does not exist (neither on disk nor in the index)" error && test_must_fail git rev-parse :1:file.txt 2>error && test_did_you_mean ":0" "" file.txt "is in the index" "at stage 1" && (cd subdir && @@ -137,42 +137,42 @@ test_expect_success 'incorrect file in :path and :N:path' ' test_must_fail git rev-parse :2:file2.txt 2>error && test_did_you_mean :0 subdir/ file2.txt "is in the index") && test_must_fail git rev-parse :disk-only.txt 2>error && - test_i18ngrep "path .disk-only.txt. exists on disk, but not in the index" error + test_grep "path .disk-only.txt. exists on disk, but not in the index" error ' test_expect_success 'invalid @{n} reference' ' test_must_fail git rev-parse main@{99999} >output 2>error && test_must_be_empty output && - test_i18ngrep "log for [^ ]* only has [0-9][0-9]* entries" error && + test_grep "log for [^ ]* only has [0-9][0-9]* entries" error && test_must_fail git rev-parse --verify main@{99999} >output 2>error && test_must_be_empty output && - test_i18ngrep "log for [^ ]* only has [0-9][0-9]* entries" error + test_grep "log for [^ ]* only has [0-9][0-9]* entries" error ' test_expect_success 'relative path not found' ' ( cd subdir && test_must_fail git rev-parse HEAD:./nonexistent.txt 2>error && - test_i18ngrep subdir/nonexistent.txt error + test_grep subdir/nonexistent.txt error ) ' test_expect_success 'relative path outside worktree' ' test_must_fail git rev-parse HEAD:../file.txt >output 2>error && test_must_be_empty output && - test_i18ngrep "outside repository" error + test_grep "outside repository" error ' test_expect_success 'relative path when cwd is outside worktree' ' test_must_fail git --git-dir=.git --work-tree=subdir rev-parse HEAD:./file.txt >output 2>error && test_must_be_empty output && - test_i18ngrep "relative path syntax can.t be used outside working tree" error + test_grep "relative path syntax can.t be used outside working tree" error ' test_expect_success '<commit>:file correctly diagnosed after a pathname' ' test_must_fail git rev-parse file.txt HEAD:file.txt 1>actual 2>error && - test_i18ngrep ! "exists on disk" error && - test_i18ngrep "no such path in the working tree" error && + test_grep ! "exists on disk" error && + test_grep "no such path in the working tree" error && cat >expect <<-\EOF && file.txt HEAD:file.txt @@ -214,13 +214,13 @@ test_expect_success 'dotdot does not peel endpoints' ' test_expect_success 'arg before dashdash must be a revision (missing)' ' test_must_fail git rev-parse foobar -- 2>stderr && - test_i18ngrep "bad revision" stderr + test_grep "bad revision" stderr ' test_expect_success 'arg before dashdash must be a revision (file)' ' >foobar && test_must_fail git rev-parse foobar -- 2>stderr && - test_i18ngrep "bad revision" stderr + test_grep "bad revision" stderr ' test_expect_success 'arg before dashdash must be a revision (ambiguous)' ' @@ -269,7 +269,7 @@ test_expect_success 'arg after dashdash not interpreted as option' ' test_expect_success 'arg after end-of-options not interpreted as option' ' test_must_fail git rev-parse --end-of-options --not-real -- 2>err && - test_i18ngrep bad.revision.*--not-real err + test_grep bad.revision.*--not-real err ' test_expect_success 'end-of-options still allows --' ' diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh index 98cefe3b70..70f1e0a998 100755 --- a/t/t1512-rev-parse-disambiguation.sh +++ b/t/t1512-rev-parse-disambiguation.sh @@ -129,7 +129,7 @@ test_expect_success 'blob and tree' ' test_expect_success 'warn ambiguity when no candidate matches type hint' ' test_must_fail git rev-parse --verify 000000000^{commit} 2>actual && - test_i18ngrep "short object ID 000000000 is ambiguous" actual + test_grep "short object ID 000000000 is ambiguous" actual ' test_expect_success 'disambiguate tree-ish' ' @@ -470,10 +470,10 @@ test_expect_success 'cat-file --batch and --batch-check show ambiguous' ' echo "0000 ambiguous" >expect && echo 0000 | git cat-file --batch-check >actual 2>err && test_cmp expect actual && - test_i18ngrep hint: err && + test_grep hint: err && echo 0000 | git cat-file --batch >actual 2>err && test_cmp expect actual && - test_i18ngrep hint: err + test_grep hint: err ' test_done diff --git a/t/t1600-index.sh b/t/t1600-index.sh index 9368d82f7d..62e7fd1596 100755 --- a/t/t1600-index.sh +++ b/t/t1600-index.sh @@ -118,7 +118,7 @@ test_index_version () { fi && git add a && echo $EXPECTED_OUTPUT_VERSION >expect && - test-tool index-version <.git/index >actual && + git update-index --show-index-version >actual && test_cmp expect actual ) } diff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh index b4ab166369..a7b7263b35 100755 --- a/t/t1700-split-index.sh +++ b/t/t1700-split-index.sh @@ -43,7 +43,7 @@ test_expect_success 'enable split index' ' git config splitIndex.maxPercentChange 100 && git update-index --split-index && test-tool dump-split-index .git/index >actual && - indexversion=$(test-tool index-version <.git/index) && + indexversion=$(git update-index --show-index-version) && # NEEDSWORK: Stop hard-coding checksums. if test "$indexversion" = "4" diff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh index b16d69ca4a..98e818f09f 100755 --- a/t/t2004-checkout-cache-temp.sh +++ b/t/t2004-checkout-cache-temp.sh @@ -93,7 +93,7 @@ test_expect_success 'checkout all stages of unknown path' ' rm -f path* .merge_* actual && test_must_fail git checkout-index --stage=all --temp \ -- does-not-exist 2>stderr && - test_i18ngrep not.in.the.cache stderr + test_grep not.in.the.cache stderr ' test_expect_success 'checkout all stages/one file to nothing' ' @@ -117,6 +117,26 @@ test_expect_success 'checkout all stages/one file to temporary files' ' test $(cat $s3) = tree3path1) ' +test_expect_success '--stage=all implies --temp' ' + rm -f path* .merge_* actual && + git checkout-index --stage=all -- path1 && + test_path_is_missing path1 +' + +test_expect_success 'overriding --stage=all resets implied --temp' ' + rm -f path* .merge_* actual && + git checkout-index --stage=all --stage=2 -- path1 && + echo tree2path1 >expect && + test_cmp expect path1 +' + +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_expect_success 'checkout some stages/one file to temporary files' ' rm -f path* .merge_* actual && git checkout-index --stage=all --temp -- path2 >actual && diff --git a/t/t2006-checkout-index-basic.sh b/t/t2006-checkout-index-basic.sh index 5d119871d4..570ba38580 100755 --- a/t/t2006-checkout-index-basic.sh +++ b/t/t2006-checkout-index-basic.sh @@ -8,7 +8,7 @@ TEST_PASSES_SANITIZE_LEAK=true test_expect_success 'checkout-index --gobbledegook' ' test_expect_code 129 git checkout-index --gobbledegook 2>err && - test_i18ngrep "[Uu]sage" err + test_grep "[Uu]sage" err ' test_expect_success 'checkout-index -h in broken repository' ' @@ -19,18 +19,18 @@ test_expect_success 'checkout-index -h in broken repository' ' >.git/index && test_expect_code 129 git checkout-index -h >usage 2>&1 ) && - test_i18ngrep "[Uu]sage" broken/usage + test_grep "[Uu]sage" broken/usage ' test_expect_success 'checkout-index reports errors (cmdline)' ' test_must_fail git checkout-index -- does-not-exist 2>stderr && - test_i18ngrep not.in.the.cache stderr + test_grep not.in.the.cache stderr ' test_expect_success 'checkout-index reports errors (stdin)' ' echo does-not-exist | test_must_fail git checkout-index --stdin 2>stderr && - test_i18ngrep not.in.the.cache stderr + test_grep not.in.the.cache stderr ' for mode in 'case' 'utf-8' do @@ -88,8 +88,8 @@ test_expect_success 'checkout-index --temp correctly reports error on missing bl git update-index --index-info <objs && test_must_fail git checkout-index --temp symlink file 2>stderr && - test_i18ngrep "unable to read sha1 file of file ($missing_blob)" stderr && - test_i18ngrep "unable to read sha1 file of symlink ($missing_blob)" stderr + test_grep "unable to read sha1 file of file ($missing_blob)" stderr && + test_grep "unable to read sha1 file of symlink ($missing_blob)" stderr ' test_expect_success 'checkout-index --temp correctly reports error for submodules' ' @@ -98,7 +98,7 @@ test_expect_success 'checkout-index --temp correctly reports error for submodule git submodule add ./sub && git commit -m sub && test_must_fail git checkout-index --temp sub 2>stderr && - test_i18ngrep "cannot create temporary submodule sub" stderr + test_grep "cannot create temporary submodule sub" stderr ' test_done diff --git a/t/t2010-checkout-ambiguous.sh b/t/t2010-checkout-ambiguous.sh index 9d4b37526a..82c3bfeac1 100755 --- a/t/t2010-checkout-ambiguous.sh +++ b/t/t2010-checkout-ambiguous.sh @@ -62,8 +62,8 @@ test_expect_success 'disambiguate checking out from a tree-ish' ' test_expect_success 'accurate error message with more than one ref' ' test_must_fail git checkout HEAD main -- 2>actual && - test_i18ngrep 2 actual && - test_i18ngrep "one reference expected, 2 given" actual + test_grep 2 actual && + test_grep "one reference expected, 2 given" actual ' test_done diff --git a/t/t2018-checkout-branch.sh b/t/t2018-checkout-branch.sh index 8581ad3437..43551cc148 100755 --- a/t/t2018-checkout-branch.sh +++ b/t/t2018-checkout-branch.sh @@ -278,12 +278,12 @@ test_expect_success 'checkout -b to a new branch preserves mergeable changes des test_expect_success 'checkout -b rejects an invalid start point' ' test_must_fail git checkout -b branch4 file1 2>err && - test_i18ngrep "is not a commit" err + test_grep "is not a commit" err ' test_expect_success 'checkout -b rejects an extra path argument' ' test_must_fail git checkout -b branch5 branch1 file1 2>err && - test_i18ngrep "Cannot update paths and switch to branch" err + test_grep "Cannot update paths and switch to branch" err ' test_done diff --git a/t/t2019-checkout-ambiguous-ref.sh b/t/t2019-checkout-ambiguous-ref.sh index 9540588664..c67261e2b6 100755 --- a/t/t2019-checkout-ambiguous-ref.sh +++ b/t/t2019-checkout-ambiguous-ref.sh @@ -32,8 +32,8 @@ test_expect_success 'checkout chooses branch over tag' ' ' test_expect_success 'checkout reports switch to branch' ' - test_i18ngrep "Switched to branch" stderr && - test_i18ngrep ! "^HEAD is now at" stderr + test_grep "Switched to branch" stderr && + test_grep ! "^HEAD is now at" stderr ' test_expect_success 'checkout vague ref succeeds' ' @@ -54,8 +54,8 @@ test_expect_success VAGUENESS_SUCCESS 'checkout chooses branch over tag' ' ' test_expect_success VAGUENESS_SUCCESS 'checkout reports switch to branch' ' - test_i18ngrep "Switched to branch" stderr && - test_i18ngrep ! "^HEAD is now at" stderr + test_grep "Switched to branch" stderr && + test_grep ! "^HEAD is now at" stderr ' test_done diff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh index 2eab6474f8..8202ef8c74 100755 --- a/t/t2020-checkout-detach.sh +++ b/t/t2020-checkout-detach.sh @@ -17,12 +17,12 @@ check_not_detached () { PREV_HEAD_DESC='Previous HEAD position was' check_orphan_warning() { - test_i18ngrep "you are leaving $2 behind" "$1" && - test_i18ngrep ! "$PREV_HEAD_DESC" "$1" + test_grep "you are leaving $2 behind" "$1" && + test_grep ! "$PREV_HEAD_DESC" "$1" } check_no_orphan_warning() { - test_i18ngrep ! "you are leaving .* commit.*behind" "$1" && - test_i18ngrep "$PREV_HEAD_DESC" "$1" + test_grep ! "you are leaving .* commit.*behind" "$1" && + test_grep "$PREV_HEAD_DESC" "$1" } reset () { diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh index 74049a9812..a97416ce65 100755 --- a/t/t2024-checkout-dwim.sh +++ b/t/t2024-checkout-dwim.sh @@ -93,7 +93,7 @@ test_expect_success 'when arg matches multiple remotes, do not fallback to inter test_must_fail git checkout ambiguous_branch_and_file 2>err && - test_i18ngrep "matched multiple (2) remote tracking branches" err && + test_grep "matched multiple (2) remote tracking branches" err && # file must not be altered test_cmp expect ambiguous_branch_and_file @@ -105,12 +105,12 @@ test_expect_success 'checkout of branch from multiple remotes fails with advice' test_must_fail git checkout foo 2>stderr && test_branch main && status_uno_is_clean && - test_i18ngrep "^hint: " stderr && + test_grep "^hint: " stderr && test_must_fail git -c advice.checkoutAmbiguousRemoteBranchName=false \ checkout foo 2>stderr && test_branch main && status_uno_is_clean && - test_i18ngrep ! "^hint: " stderr + test_grep ! "^hint: " stderr ' test_expect_success PERL 'checkout -p with multiple remotes does not print advice' ' @@ -118,7 +118,7 @@ test_expect_success PERL 'checkout -p with multiple remotes does not print advic test_might_fail git branch -D foo && git checkout -p foo 2>stderr && - test_i18ngrep ! "^hint: " stderr && + test_grep ! "^hint: " stderr && status_uno_is_clean ' diff --git a/t/t2025-checkout-no-overlay.sh b/t/t2025-checkout-no-overlay.sh index 3832c3de81..246609d54d 100755 --- a/t/t2025-checkout-no-overlay.sh +++ b/t/t2025-checkout-no-overlay.sh @@ -26,7 +26,7 @@ test_expect_success 'checkout --no-overlay removing last file from directory' ' test_expect_success 'checkout -p --overlay is disallowed' ' test_must_fail git checkout -p --overlay HEAD 2>actual && - test_i18ngrep "fatal: options .-p. and .--overlay. cannot be used together" actual + test_grep "fatal: options .-p. and .--overlay. cannot be used together" actual ' test_expect_success '--no-overlay --theirs with D/F conflict deletes file' ' diff --git a/t/t2026-checkout-pathspec-file.sh b/t/t2026-checkout-pathspec-file.sh index 9c651aefbc..acd55217a6 100755 --- a/t/t2026-checkout-pathspec-file.sh +++ b/t/t2026-checkout-pathspec-file.sh @@ -149,16 +149,16 @@ test_expect_success 'error conditions' ' echo fileA.t >list && test_must_fail git checkout --pathspec-from-file=list --detach 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--detach. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--detach. cannot be used together" err && test_must_fail git checkout --pathspec-from-file=list --patch 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err && test_must_fail git checkout --pathspec-from-file=list -- fileA.t 2>err && - test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && + test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && test_must_fail git checkout --pathspec-file-nul 2>err && - test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err + test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err ' test_done diff --git a/t/t2027-checkout-track.sh b/t/t2027-checkout-track.sh index a8bbc60954..98f16c7239 100755 --- a/t/t2027-checkout-track.sh +++ b/t/t2027-checkout-track.sh @@ -22,7 +22,7 @@ test_expect_success 'checkout --track -b creates a new tracking branch' ' test_expect_success 'checkout --track -b rejects an extra path argument' ' test_must_fail git checkout --track -b branch2 main one.t 2>err && - test_i18ngrep "cannot be used with updating paths" err + test_grep "cannot be used with updating paths" err ' test_expect_success 'checkout --track -b overrides autoSetupMerge=inherit' ' diff --git a/t/t2030-unresolve-info.sh b/t/t2030-unresolve-info.sh index 2d8c70b03a..be3fcdde07 100755 --- a/t/t2030-unresolve-info.sh +++ b/t/t2030-unresolve-info.sh @@ -37,11 +37,17 @@ prime_resolve_undo () { git checkout second^0 && test_tick && test_must_fail git merge third^0 && - echo merge does not leave anything && check_resolve_undo empty && - echo different >fi/le && - git add fi/le && - echo resolving records && + + # how should the conflict be resolved? + case "$1" in + remove) + rm -f file/le && git rm fi/le + ;; + *) # modify + echo different >fi/le && git add fi/le + ;; + esac check_resolve_undo recorded fi/le initial:fi/le second:fi/le third:fi/le } @@ -122,6 +128,37 @@ test_expect_success 'add records checkout -m undoes' ' test_expect_success 'unmerge with plumbing' ' prime_resolve_undo && git update-index --unresolve fi/le && + git ls-files --resolve-undo fi/le >actual && + test_must_be_empty actual && + git ls-files -u >actual && + test_line_count = 3 actual +' + +test_expect_success 'unmerge can be done even after committing' ' + prime_resolve_undo && + git commit -m "record to nuke MERGE_HEAD" && + git update-index --unresolve fi/le && + git ls-files --resolve-undo fi/le >actual && + test_must_be_empty actual && + git ls-files -u >actual && + test_line_count = 3 actual +' + +test_expect_success 'unmerge removal' ' + prime_resolve_undo remove && + git update-index --unresolve fi/le && + git ls-files --resolve-undo fi/le >actual && + test_must_be_empty actual && + git ls-files -u >actual && + test_line_count = 3 actual +' + +test_expect_success 'unmerge removal after committing' ' + prime_resolve_undo remove && + git commit -m "record to nuke MERGE_HEAD" && + git update-index --unresolve fi/le && + git ls-files --resolve-undo fi/le >actual && + test_must_be_empty actual && git ls-files -u >actual && test_line_count = 3 actual ' @@ -191,7 +228,7 @@ test_expect_success 'rerere forget (add-add conflict)' ' git commit -m "add differently" && test_must_fail git merge fifth && git rerere forget add-differently 2>actual && - test_i18ngrep "no remembered" actual + test_grep "no remembered" actual ' test_expect_success 'resolve-undo keeps blobs from gc' ' diff --git a/t/t2070-restore.sh b/t/t2070-restore.sh index c5d19dd973..16d6348b69 100755 --- a/t/t2070-restore.sh +++ b/t/t2070-restore.sh @@ -137,11 +137,78 @@ test_expect_success 'restore --staged invalidates cache tree for deletions' ' test_must_fail git rev-parse HEAD:new1 ' -test_expect_success 'restore with merge options rejects --staged' ' +test_expect_success 'restore --merge to unresolve' ' + O=$(echo original | git hash-object -w --stdin) && + A=$(echo ourside | git hash-object -w --stdin) && + B=$(echo theirside | git hash-object -w --stdin) && + { + echo "100644 $O 1 file" && + echo "100644 $A 2 file" && + echo "100644 $B 3 file" + } | git update-index --index-info && + echo nothing >file && + git restore --worktree --merge file && + cat >expect <<-\EOF && + <<<<<<< ours + ourside + ======= + theirside + >>>>>>> theirs + EOF + test_cmp expect file +' + +test_expect_success 'restore --merge to unresolve after (mistaken) resolution' ' + O=$(echo original | git hash-object -w --stdin) && + A=$(echo ourside | git hash-object -w --stdin) && + B=$(echo theirside | git hash-object -w --stdin) && + { + echo "100644 $O 1 file" && + echo "100644 $A 2 file" && + echo "100644 $B 3 file" + } | git update-index --index-info && + echo nothing >file && + git add file && + git restore --worktree --merge file && + cat >expect <<-\EOF && + <<<<<<< ours + ourside + ======= + theirside + >>>>>>> theirs + EOF + test_cmp expect file +' + +test_expect_success 'restore --merge to unresolve after (mistaken) resolution' ' + O=$(echo original | git hash-object -w --stdin) && + A=$(echo ourside | git hash-object -w --stdin) && + B=$(echo theirside | git hash-object -w --stdin) && + { + echo "100644 $O 1 file" && + echo "100644 $A 2 file" && + echo "100644 $B 3 file" + } | git update-index --index-info && + git rm -f file && + git restore --worktree --merge file && + cat >expect <<-\EOF && + <<<<<<< ours + ourside + ======= + theirside + >>>>>>> theirs + EOF + test_cmp expect file +' + +test_expect_success 'restore with merge options are incompatible with certain options' ' for opts in \ "--staged --ours" \ "--staged --theirs" \ "--staged --merge" \ + "--source=HEAD --ours" \ + "--source=HEAD --theirs" \ + "--source=HEAD --merge" \ "--staged --conflict=diff3" \ "--staged --worktree --ours" \ "--staged --worktree --theirs" \ @@ -149,7 +216,7 @@ test_expect_success 'restore with merge options rejects --staged' ' "--staged --worktree --conflict=zdiff3" do test_must_fail git restore $opts . 2>err && - grep "cannot be used with --staged" err || return + grep "cannot be used" err || return done ' diff --git a/t/t2072-restore-pathspec-file.sh b/t/t2072-restore-pathspec-file.sh index c22669b39f..8198a1e578 100755 --- a/t/t2072-restore-pathspec-file.sh +++ b/t/t2072-restore-pathspec-file.sh @@ -152,16 +152,16 @@ test_expect_success 'error conditions' ' >empty_list && test_must_fail git restore --pathspec-from-file=list --patch --source=HEAD^1 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err && test_must_fail git restore --pathspec-from-file=list --source=HEAD^1 -- fileA.t 2>err && - test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && + test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && test_must_fail git restore --pathspec-file-nul --source=HEAD^1 2>err && - test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && + test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && test_must_fail git restore --pathspec-from-file=empty_list --source=HEAD^1 2>err && - test_i18ngrep -e "you must specify path(s) to restore" err + test_grep -e "you must specify path(s) to restore" err ' test_expect_success 'wildcard pathspec matches file in subdirectory' ' diff --git a/t/t2104-update-index-skip-worktree.sh b/t/t2104-update-index-skip-worktree.sh index b8686aabd3..0bab134d71 100755 --- a/t/t2104-update-index-skip-worktree.sh +++ b/t/t2104-update-index-skip-worktree.sh @@ -39,7 +39,7 @@ test_expect_success 'setup' ' ' test_expect_success 'index is at version 2' ' - test "$(test-tool index-version < .git/index)" = 2 + test "$(git update-index --show-index-version)" = 2 ' test_expect_success 'update-index --skip-worktree' ' @@ -48,7 +48,7 @@ test_expect_success 'update-index --skip-worktree' ' ' test_expect_success 'index is at version 3 after having some skip-worktree entries' ' - test "$(test-tool index-version < .git/index)" = 3 + test "$(git update-index --show-index-version)" = 3 ' test_expect_success 'ls-files -t' ' @@ -61,7 +61,7 @@ test_expect_success 'update-index --no-skip-worktree' ' ' test_expect_success 'index version is back to 2 when there is no skip-worktree entry' ' - test "$(test-tool index-version < .git/index)" = 2 + test "$(git update-index --show-index-version)" = 2 ' test_done diff --git a/t/t2106-update-index-assume-unchanged.sh b/t/t2106-update-index-assume-unchanged.sh index d943ddf47e..95c004dc5c 100755 --- a/t/t2106-update-index-assume-unchanged.sh +++ b/t/t2106-update-index-assume-unchanged.sh @@ -22,7 +22,7 @@ test_expect_success 'do not switch branches with dirty file' ' echo dirt >file && git update-index --assume-unchanged file && test_must_fail git checkout - 2>err && - test_i18ngrep overwritten err + test_grep overwritten err ' test_done diff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh index 89b285fa3a..cc72ead79f 100755 --- a/t/t2107-update-index-basic.sh +++ b/t/t2107-update-index-basic.sh @@ -14,7 +14,7 @@ test_expect_success 'update-index --nonsense fails' ' test_expect_success 'update-index --nonsense dumps usage' ' test_expect_code 129 git update-index --nonsense 2>err && - test_i18ngrep "[Uu]sage: git update-index" err + test_grep "[Uu]sage: git update-index" err ' test_expect_success 'update-index -h with corrupt index' ' @@ -25,7 +25,7 @@ test_expect_success 'update-index -h with corrupt index' ' >.git/index && test_expect_code 129 git update-index -h >usage 2>&1 ) && - test_i18ngrep "[Uu]sage: git update-index" broken/usage + test_grep "[Uu]sage: git update-index" broken/usage ' test_expect_success '--cacheinfo complains of missing arguments' ' @@ -111,4 +111,35 @@ test_expect_success '--chmod=+x and chmod=-x in the same argument list' ' test_cmp expect actual ' +test_expect_success '--index-version' ' + git commit --allow-empty -m snap && + git reset --hard && + git rm -f -r --cached . && + + # The default index version is 2 --- update this test + # when you change it in the code + git update-index --show-index-version >actual && + echo 2 >expect && + test_cmp expect actual && + + # The next test wants us to be using version 2 + git update-index --index-version 2 && + + git update-index --index-version 4 --verbose >actual && + echo "index-version: was 2, set to 4" >expect && + test_cmp expect actual && + + git update-index --index-version 4 --verbose >actual && + echo "index-version: was 4, set to 4" >expect && + test_cmp expect actual && + + git update-index --index-version 2 --verbose >actual && + echo "index-version: was 4, set to 2" >expect && + test_cmp expect actual && + + # non-verbose should be silent + git update-index --index-version 4 >actual && + test_must_be_empty actual +' + test_done diff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh index ebf58db2d1..8fa44a92a2 100755 --- a/t/t2203-add-intent.sh +++ b/t/t2203-add-intent.sh @@ -173,7 +173,7 @@ test_expect_success 'rename detection finds the right names' ' git add -N third && git status | grep -v "^?" >actual.1 && - test_i18ngrep "renamed: *first -> third" actual.1 && + test_grep "renamed: *first -> third" actual.1 && git status --porcelain | grep -v "^?" >actual.2 && cat >expected.2 <<-\EOF && @@ -213,8 +213,8 @@ test_expect_success 'double rename detection in status' ' git add -N third && git status | grep -v "^?" >actual.1 && - test_i18ngrep "renamed: *first -> second" actual.1 && - test_i18ngrep "renamed: *second -> third" actual.1 && + test_grep "renamed: *first -> second" actual.1 && + test_grep "renamed: *second -> third" actual.1 && git status --porcelain | grep -v "^?" >actual.2 && cat >expected.2 <<-\EOF && diff --git a/t/t2204-add-ignored.sh b/t/t2204-add-ignored.sh index 89424abccd..b7cf1e492c 100755 --- a/t/t2204-add-ignored.sh +++ b/t/t2204-add-ignored.sh @@ -36,7 +36,7 @@ do ' test_expect_success "complaints for ignored $i output" ' - test_i18ngrep -e "Use -f if" err + test_grep -e "Use -f if" err ' test_expect_success "complaints for ignored $i with unignored file" ' @@ -46,7 +46,7 @@ do test_must_be_empty out ' test_expect_success "complaints for ignored $i with unignored file output" ' - test_i18ngrep -e "Use -f if" err + test_grep -e "Use -f if" err ' done @@ -65,7 +65,7 @@ do test_expect_success "complaints for ignored $i in dir output" ' ( cd dir && - test_i18ngrep -e "Use -f if" err + test_grep -e "Use -f if" err ) ' done @@ -85,7 +85,7 @@ do test_expect_success "complaints for ignored $i in sub output" ' ( cd sub && - test_i18ngrep -e "Use -f if" err + test_grep -e "Use -f if" err ) ' done diff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh index 051363acbb..4b7627e852 100755 --- a/t/t2400-worktree-add.sh +++ b/t/t2400-worktree-add.sh @@ -121,7 +121,8 @@ test_expect_success '"add" worktree creating new branch' ' test_expect_success 'die the same branch is already checked out' ' ( cd here && - test_must_fail git checkout newmain + test_must_fail git checkout newmain 2>actual && + grep "already used by worktree at" actual ) ' @@ -414,7 +415,7 @@ test_wt_add_orphan_hint () { 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 orphan branch" actual && + 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 @@ -435,7 +436,7 @@ test_expect_success "'worktree add' doesn't show orphan hint in bad/orphan HEAD (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 orphan branch" actual + ! grep "hint: If you meant to create a worktree containing a new unborn branch" actual ' test_expect_success 'local clone from linked checkout' ' @@ -708,9 +709,9 @@ test_expect_success 'git worktree --no-guess-remote option overrides config' ' test_dwim_orphan () { local info_text="No possible source branch, inferring '--orphan'" && local fetch_error_text="fatal: No local or remote refs exist despite at least one remote" && - local orphan_hint="hint: If you meant to create a worktree containing a new orphan branch" && + local orphan_hint="hint: If you meant to create a worktree containing a new unborn branch" && local invalid_ref_regex="^fatal: invalid reference: " && - local bad_combo_regex="^fatal: '[-a-z]*' and '[-a-z]*' cannot be used together" && + local bad_combo_regex="^fatal: options '[-a-z]*' and '[-a-z]*' cannot be used together" && local git_ns="repo" && local dashc_args="-C $git_ns" && diff --git a/t/t2401-worktree-prune.sh b/t/t2401-worktree-prune.sh index 568a47ec42..71aa9bcd62 100755 --- a/t/t2401-worktree-prune.sh +++ b/t/t2401-worktree-prune.sh @@ -47,7 +47,7 @@ test_expect_success SANITY 'prune directories with unreadable gitdir' ' : >.git/worktrees/def/gitdir && chmod u-r .git/worktrees/def/gitdir && git worktree prune --verbose 2>actual && - test_i18ngrep "Removing worktrees/def: unable to read gitdir file" actual && + test_grep "Removing worktrees/def: unable to read gitdir file" actual && ! test -d .git/worktrees/def && ! test -d .git/worktrees ' @@ -57,7 +57,7 @@ test_expect_success 'prune directories with invalid gitdir' ' : >.git/worktrees/def/def && : >.git/worktrees/def/gitdir && git worktree prune --verbose 2>actual && - test_i18ngrep "Removing worktrees/def: invalid gitdir file" actual && + test_grep "Removing worktrees/def: invalid gitdir file" actual && ! test -d .git/worktrees/def && ! test -d .git/worktrees ' @@ -67,7 +67,7 @@ test_expect_success 'prune directories with gitdir pointing to nowhere' ' : >.git/worktrees/def/def && echo "$(pwd)"/nowhere >.git/worktrees/def/gitdir && git worktree prune --verbose 2>actual && - test_i18ngrep "Removing worktrees/def: gitdir file points to non-existent location" actual && + test_grep "Removing worktrees/def: gitdir file points to non-existent location" actual && ! test -d .git/worktrees/def && ! test -d .git/worktrees ' @@ -103,7 +103,7 @@ test_expect_success 'prune duplicate (linked/linked)' ' sed "s/w2/w1/" .git/worktrees/w2/gitdir >.git/worktrees/w2/gitdir.new && mv .git/worktrees/w2/gitdir.new .git/worktrees/w2/gitdir && git worktree prune --verbose 2>actual && - test_i18ngrep "duplicate entry" actual && + test_grep "duplicate entry" actual && test -d .git/worktrees/w1 && ! test -d .git/worktrees/w2 ' @@ -116,7 +116,7 @@ test_expect_success 'prune duplicate (main/linked)' ' rm -fr wt && mv repo wt && git -C wt worktree prune --verbose 2>actual && - test_i18ngrep "duplicate entry" actual && + test_grep "duplicate entry" actual && ! test -d .git/worktrees/wt ' diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh index 9ad9be0c20..33ea9cb21b 100755 --- a/t/t2402-worktree-list.sh +++ b/t/t2402-worktree-list.sh @@ -143,7 +143,7 @@ test_expect_success '"list" all worktrees --porcelain with prunable' ' rm -rf prunable && git worktree list --porcelain >out && sed -n "/^worktree .*\/prunable$/,/^$/p" <out >only_prunable && - test_i18ngrep "^prunable gitdir file points to non-existent location$" only_prunable + test_grep "^prunable gitdir file points to non-existent location$" only_prunable ' test_expect_success '"list" all worktrees with prunable consistent with "prune"' ' @@ -155,8 +155,8 @@ test_expect_success '"list" all worktrees with prunable consistent with "prune"' grep "/prunable *[0-9a-f].* prunable$" out && ! grep "/unprunable *[0-9a-f].* unprunable$" out && git worktree prune --verbose 2>out && - test_i18ngrep "^Removing worktrees/prunable" out && - test_i18ngrep ! "^Removing worktrees/unprunable" out + test_grep "^Removing worktrees/prunable" out && + test_grep ! "^Removing worktrees/unprunable" out ' test_expect_success '"list" --verbose and --porcelain mutually exclusive' ' diff --git a/t/t2403-worktree-move.sh b/t/t2403-worktree-move.sh index 230a55e99a..901342ea09 100755 --- a/t/t2403-worktree-move.sh +++ b/t/t2403-worktree-move.sh @@ -202,7 +202,7 @@ test_expect_success 'proper error when worktree not found' ' for i in noodle noodle/bork do test_must_fail git worktree lock $i 2>err && - test_i18ngrep "not a working tree" err || return 1 + test_grep "not a working tree" err || return 1 done ' diff --git a/t/t2406-worktree-repair.sh b/t/t2406-worktree-repair.sh index 8970780efc..edbf502ec5 100755 --- a/t/t2406-worktree-repair.sh +++ b/t/t2406-worktree-repair.sh @@ -25,7 +25,7 @@ test_expect_success 'worktree path not directory' ' >notdir && test_must_fail git worktree repair >out 2>err && test_must_be_empty out && - test_i18ngrep "not a directory" err + test_grep "not a directory" err ' test_expect_success "don't clobber .git repo" ' @@ -35,7 +35,7 @@ test_expect_success "don't clobber .git repo" ' test_create_repo repo && test_must_fail git worktree repair >out 2>err && test_must_be_empty out && - test_i18ngrep ".git is not a file" err + test_grep ".git is not a file" err ' test_corrupt_gitfile () { @@ -47,7 +47,7 @@ test_corrupt_gitfile () { git -C corrupt rev-parse --absolute-git-dir >expect && eval "$butcher" && git -C "$repairdir" worktree repair 2>err && - test_i18ngrep "$problem" err && + test_grep "$problem" err && git -C corrupt rev-parse --absolute-git-dir >actual && test_cmp expect actual } @@ -93,7 +93,7 @@ test_expect_success 'repair .git file from bare.git' ' test_expect_success 'invalid worktree path' ' test_must_fail git worktree repair /notvalid >out 2>err && test_must_be_empty out && - test_i18ngrep "not a valid path" err + test_grep "not a valid path" err ' test_expect_success 'repo not found; .git not file' ' @@ -101,7 +101,7 @@ test_expect_success 'repo not found; .git not file' ' test_create_repo not-a-worktree && test_must_fail git worktree repair not-a-worktree >out 2>err && test_must_be_empty out && - test_i18ngrep ".git is not a file" err + test_grep ".git is not a file" err ' test_expect_success 'repo not found; .git not referencing repo' ' @@ -111,7 +111,7 @@ test_expect_success 'repo not found; .git not referencing repo' ' mv side/.newgit side/.git && mkdir not-a-repo && test_must_fail git worktree repair side 2>err && - test_i18ngrep ".git file does not reference a repository" err + test_grep ".git file does not reference a repository" err ' test_expect_success 'repo not found; .git file broken' ' @@ -121,7 +121,7 @@ test_expect_success 'repo not found; .git file broken' ' mv orig moved && test_must_fail git worktree repair moved >out 2>err && test_must_be_empty out && - test_i18ngrep ".git file broken" err + test_grep ".git file broken" err ' test_expect_success 'repair broken gitdir' ' @@ -132,7 +132,7 @@ test_expect_success 'repair broken gitdir' ' mv orig moved && git worktree repair moved 2>err && test_cmp expect .git/worktrees/orig/gitdir && - test_i18ngrep "gitdir unreadable" err + test_grep "gitdir unreadable" err ' test_expect_success 'repair incorrect gitdir' ' @@ -142,7 +142,7 @@ test_expect_success 'repair incorrect gitdir' ' mv orig moved && git worktree repair moved 2>err && test_cmp expect .git/worktrees/orig/gitdir && - test_i18ngrep "gitdir incorrect" err + test_grep "gitdir incorrect" err ' test_expect_success 'repair gitdir (implicit) from linked worktree' ' @@ -152,7 +152,7 @@ test_expect_success 'repair gitdir (implicit) from linked worktree' ' mv orig moved && git -C moved worktree repair 2>err && test_cmp expect .git/worktrees/orig/gitdir && - test_i18ngrep "gitdir incorrect" err + test_grep "gitdir incorrect" err ' test_expect_success 'unable to repair gitdir (implicit) from main worktree' ' @@ -177,8 +177,8 @@ test_expect_success 'repair multiple gitdir files' ' git worktree repair moved1 moved2 2>err && test_cmp expect1 .git/worktrees/orig1/gitdir && test_cmp expect2 .git/worktrees/orig2/gitdir && - test_i18ngrep "gitdir incorrect:.*orig1/gitdir$" err && - test_i18ngrep "gitdir incorrect:.*orig2/gitdir$" err + test_grep "gitdir incorrect:.*orig1/gitdir$" err && + test_grep "gitdir incorrect:.*orig2/gitdir$" err ' test_expect_success 'repair moved main and linked worktrees' ' diff --git a/t/t2407-worktree-heads.sh b/t/t2407-worktree-heads.sh index 469443d8ae..f6835c91dc 100755 --- a/t/t2407-worktree-heads.sh +++ b/t/t2407-worktree-heads.sh @@ -45,7 +45,7 @@ test_expect_success 'refuse to overwrite: checked out in worktree' ' grep "cannot force update the branch" err && test_must_fail git branch -D wt-$i 2>err && - grep "Cannot delete branch" err || return 1 + grep "cannot delete branch" err || return 1 done ' diff --git a/t/t3004-ls-files-basic.sh b/t/t3004-ls-files-basic.sh index a16e25c79b..12e41a7b40 100755 --- a/t/t3004-ls-files-basic.sh +++ b/t/t3004-ls-files-basic.sh @@ -21,7 +21,7 @@ test_expect_success 'ls-files with nonexistent path' ' test_expect_success 'ls-files with nonsense option' ' test_expect_code 129 git ls-files --nonsense 2>actual && - test_i18ngrep "[Uu]sage: git ls-files" actual + test_grep "[Uu]sage: git ls-files" actual ' test_expect_success 'ls-files -h in corrupt repository' ' @@ -32,7 +32,7 @@ test_expect_success 'ls-files -h in corrupt repository' ' >.git/index && test_expect_code 129 git ls-files -h >usage 2>&1 ) && - test_i18ngrep "[Uu]sage: git ls-files " broken/usage + test_grep "[Uu]sage: git ls-files " broken/usage ' test_expect_success SYMLINKS 'ls-files with absolute paths to symlinks' ' diff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh index 7308a3d4e2..61771eec83 100755 --- a/t/t3007-ls-files-recurse-submodules.sh +++ b/t/t3007-ls-files-recurse-submodules.sh @@ -296,7 +296,7 @@ test_expect_success '--recurse-submodules and relative paths' ' test_expect_success '--recurse-submodules does not support --error-unmatch' ' test_must_fail git ls-files --recurse-submodules --error-unmatch 2>actual && - test_i18ngrep "does not support --error-unmatch" actual + test_grep "does not support --error-unmatch" actual ' test_expect_success '--recurse-submodules parses submodule repo config' ' @@ -335,7 +335,7 @@ test_expect_success '--recurse-submodules submodules ignore super project worktr test_incompatible_with_recurse_submodules () { test_expect_success "--recurse-submodules and $1 are incompatible" " test_must_fail git ls-files --recurse-submodules $1 2>actual && - test_i18ngrep 'unsupported mode' actual + test_grep 'unsupported mode' actual " } diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index daf1666df7..c54fd9ea06 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -25,7 +25,7 @@ test_expect_success 'prepare a trivial repository' ' test_expect_success 'git branch --help should not have created a bogus branch' ' test_might_fail git branch --man --help </dev/null >/dev/null 2>&1 && - test_path_is_missing .git/refs/heads/--help + test_ref_missing refs/heads/--help ' test_expect_success 'branch -h in broken repository' ' @@ -36,11 +36,12 @@ test_expect_success 'branch -h in broken repository' ' >.git/refs/heads/main && test_expect_code 129 git branch -h >usage 2>&1 ) && - test_i18ngrep "[Uu]sage" broken/usage + test_grep "[Uu]sage" broken/usage ' test_expect_success 'git branch abc should create a branch' ' - git branch abc && test_path_is_file .git/refs/heads/abc + git branch abc && + test_ref_exists refs/heads/abc ' test_expect_success 'git branch abc should fail when abc exists' ' @@ -61,11 +62,13 @@ test_expect_success 'git branch --force abc should succeed when abc exists' ' ' test_expect_success 'git branch a/b/c should create a branch' ' - git branch a/b/c && test_path_is_file .git/refs/heads/a/b/c + git branch a/b/c && + test_ref_exists refs/heads/a/b/c ' test_expect_success 'git branch mb main... should create a branch' ' - git branch mb main... && test_path_is_file .git/refs/heads/mb + git branch mb main... && + test_ref_exists refs/heads/mb ' test_expect_success 'git branch HEAD should fail' ' @@ -78,14 +81,14 @@ EOF test_expect_success 'git branch --create-reflog d/e/f should create a branch and a log' ' GIT_COMMITTER_DATE="2005-05-26 23:30" \ git -c core.logallrefupdates=false branch --create-reflog d/e/f && - test_path_is_file .git/refs/heads/d/e/f && + test_ref_exists refs/heads/d/e/f && test_path_is_file .git/logs/refs/heads/d/e/f && test_cmp expect .git/logs/refs/heads/d/e/f ' test_expect_success 'git branch -d d/e/f should delete a branch and a log' ' git branch -d d/e/f && - test_path_is_missing .git/refs/heads/d/e/f && + test_ref_missing refs/heads/d/e/f && test_must_fail git reflog exists refs/heads/d/e/f ' @@ -103,7 +106,7 @@ test_expect_success 'git branch l should work after branch l/m has been deleted' test_expect_success 'git branch -m dumps usage' ' test_expect_code 128 git branch -m 2>err && - test_i18ngrep "branch name required" err + test_grep "branch name required" err ' test_expect_success 'git branch -m m broken_symref should work' ' @@ -213,7 +216,7 @@ test_expect_success 'git branch -M should leave orphaned HEAD alone' ' test_commit initial && git checkout --orphan lonely && grep lonely .git/HEAD && - test_path_is_missing .git/refs/head/lonely && + test_ref_missing refs/head/lonely && git branch -M main mistress && grep lonely .git/HEAD ) @@ -291,10 +294,10 @@ test_expect_success 'git branch -M topic topic should work when main is checked test_expect_success 'git branch -M and -C fail on detached HEAD' ' git checkout HEAD^{} && test_when_finished git checkout - && - echo "fatal: cannot rename the current branch while not on any." >expect && + echo "fatal: cannot rename the current branch while not on any" >expect && test_must_fail git branch -M must-fail 2>err && test_cmp expect err && - echo "fatal: cannot copy the current branch while not on any." >expect && + echo "fatal: cannot copy the current branch while not on any" >expect && test_must_fail git branch -C must-fail 2>err && test_cmp expect err ' @@ -581,12 +584,12 @@ EOF test_expect_success 'git branch -c dumps usage' ' test_expect_code 128 git branch -c 2>err && - test_i18ngrep "branch name required" err + test_grep "branch name required" err ' test_expect_success 'git branch --copy dumps usage' ' test_expect_code 128 git branch --copy 2>err && - test_i18ngrep "branch name required" err + test_grep "branch name required" err ' test_expect_success 'git branch -c d e should work' ' @@ -799,8 +802,8 @@ test_expect_success 'deleting a symref' ' git symbolic-ref refs/heads/symref refs/heads/target && echo "Deleted branch symref (was refs/heads/target)." >expect && git branch -d symref >actual && - test_path_is_file .git/refs/heads/target && - test_path_is_missing .git/refs/heads/symref && + test_ref_exists refs/heads/target && + test_ref_missing refs/heads/symref && test_cmp expect actual ' @@ -809,16 +812,16 @@ test_expect_success 'deleting a dangling symref' ' test_path_is_file .git/refs/heads/dangling-symref && echo "Deleted branch dangling-symref (was nowhere)." >expect && git branch -d dangling-symref >actual && - test_path_is_missing .git/refs/heads/dangling-symref && + test_ref_missing refs/heads/dangling-symref && test_cmp expect actual ' test_expect_success 'deleting a self-referential symref' ' git symbolic-ref refs/heads/self-reference refs/heads/self-reference && - test_path_is_file .git/refs/heads/self-reference && + test_ref_exists refs/heads/self-reference && echo "Deleted branch self-reference (was refs/heads/self-reference)." >expect && git branch -d self-reference >actual && - test_path_is_missing .git/refs/heads/self-reference && + test_ref_missing refs/heads/self-reference && test_cmp expect actual ' @@ -826,8 +829,8 @@ test_expect_success 'renaming a symref is not allowed' ' git symbolic-ref refs/heads/topic refs/heads/main && test_must_fail git branch -m topic new-topic && git symbolic-ref refs/heads/topic && - test_path_is_file .git/refs/heads/main && - test_path_is_missing .git/refs/heads/new-topic + test_ref_exists refs/heads/main && + test_ref_missing refs/heads/new-topic ' test_expect_success SYMLINKS 'git branch -m u v should fail when the reflog for u is a symlink' ' @@ -942,7 +945,19 @@ test_expect_success 'test deleting branch without config' ' test_expect_success 'deleting currently checked out branch fails' ' git worktree add -b my7 my7 && test_must_fail git -C my7 branch -d my7 && - test_must_fail git branch -d my7 && + test_must_fail git branch -d my7 2>actual && + grep "^error: cannot delete branch .my7. used by worktree at " actual && + rm -r my7 && + git worktree prune +' + +test_expect_success 'deleting in-use branch fails' ' + git worktree add my7 && + test_commit -C my7 bt7 && + git -C my7 bisect start HEAD HEAD~2 && + test_must_fail git -C my7 branch -d my7 && + test_must_fail git branch -d my7 2>actual && + grep "^error: cannot delete branch .my7. used by worktree at " actual && rm -r my7 && git worktree prune ' @@ -1012,7 +1027,7 @@ test_expect_success '--set-upstream-to fails on multiple branches' ' test_expect_success '--set-upstream-to fails on detached HEAD' ' git checkout HEAD^{} && test_when_finished git checkout - && - echo "fatal: could not set upstream of HEAD to main when it does not point to any branch." >expect && + echo "fatal: could not set upstream of HEAD to main when it does not point to any branch" >expect && test_must_fail git branch --set-upstream-to main 2>err && test_cmp expect err ' @@ -1025,7 +1040,7 @@ test_expect_success '--set-upstream-to fails on a missing dst branch' ' test_expect_success '--set-upstream-to fails on a missing src branch' ' test_must_fail git branch --set-upstream-to does-not-exist main 2>err && - test_i18ngrep "the requested upstream branch '"'"'does-not-exist'"'"' does not exist" err + test_grep "the requested upstream branch '"'"'does-not-exist'"'"' does not exist" err ' test_expect_success '--set-upstream-to fails on a non-ref' ' @@ -1039,7 +1054,7 @@ test_expect_success '--set-upstream-to fails on locked config' ' >.git/config.lock && git branch locked && test_must_fail git branch --set-upstream-to locked 2>err && - test_i18ngrep "could not lock config file .git/config" err + test_grep "could not lock config file .git/config" err ' test_expect_success 'use --set-upstream-to modify HEAD' ' @@ -1060,7 +1075,7 @@ test_expect_success 'use --set-upstream-to modify a particular branch' ' ' test_expect_success '--unset-upstream should fail if given a non-existent branch' ' - echo "fatal: Branch '"'"'i-dont-exist'"'"' has no upstream information" >expect && + echo "fatal: branch '"'"'i-dont-exist'"'"' has no upstream information" >expect && test_must_fail git branch --unset-upstream i-dont-exist 2>err && test_cmp expect err ' @@ -1070,7 +1085,7 @@ test_expect_success '--unset-upstream should fail if config is locked' ' git branch --set-upstream-to locked && >.git/config.lock && test_must_fail git branch --unset-upstream 2>err && - test_i18ngrep "could not lock config file .git/config" err + test_grep "could not lock config file .git/config" err ' test_expect_success 'test --unset-upstream on HEAD' ' @@ -1082,7 +1097,7 @@ test_expect_success 'test --unset-upstream on HEAD' ' test_must_fail git config branch.main.remote && test_must_fail git config branch.main.merge && # fail for a branch without upstream set - echo "fatal: Branch '"'"'main'"'"' has no upstream information" >expect && + echo "fatal: branch '"'"'main'"'"' has no upstream information" >expect && test_must_fail git branch --unset-upstream 2>err && test_cmp expect err ' @@ -1096,7 +1111,7 @@ test_expect_success '--unset-upstream should fail on multiple branches' ' test_expect_success '--unset-upstream should fail on detached HEAD' ' git checkout HEAD^{} && test_when_finished git checkout - && - echo "fatal: could not unset upstream of HEAD when it does not point to any branch." >expect && + echo "fatal: could not unset upstream of HEAD when it does not point to any branch" >expect && test_must_fail git branch --unset-upstream 2>err && test_cmp expect err ' @@ -1130,7 +1145,7 @@ EOF test_expect_success 'git checkout -b g/h/i -l should create a branch and a log' ' GIT_COMMITTER_DATE="2005-05-26 23:30" \ git checkout -b g/h/i -l main && - test_path_is_file .git/refs/heads/g/h/i && + test_ref_exists refs/heads/g/h/i && test_path_is_file .git/logs/refs/heads/g/h/i && test_cmp expect .git/logs/refs/heads/g/h/i ' @@ -1506,7 +1521,7 @@ test_expect_success '--list during rebase' ' set_fake_editor && git rebase -i HEAD~2 && git branch --list >actual && - test_i18ngrep "rebasing main" actual + test_grep "rebasing main" actual ' test_expect_success '--list during rebase from detached HEAD' ' @@ -1518,7 +1533,7 @@ test_expect_success '--list during rebase from detached HEAD' ' set_fake_editor && git rebase -i HEAD~2 && git branch --list >actual && - test_i18ngrep "rebasing detached HEAD $oid" actual + test_grep "rebasing detached HEAD $oid" actual ' test_expect_success 'tracking with unexpected .fetch refspec' ' diff --git a/t/t3202-show-branch.sh b/t/t3202-show-branch.sh index b17f388f56..6a98b2df76 100755 --- a/t/t3202-show-branch.sh +++ b/t/t3202-show-branch.sh @@ -10,7 +10,7 @@ GIT_TEST_DATE_NOW=1251660000; export GIT_TEST_DATE_NOW test_expect_success 'error descriptions on empty repository' ' current=$(git branch --show-current) && cat >expect <<-EOF && - error: No commit on branch '\''$current'\'' yet. + error: no commit on branch '\''$current'\'' yet EOF test_must_fail git branch --edit-description 2>actual && test_cmp expect actual && @@ -21,7 +21,7 @@ test_expect_success 'error descriptions on empty repository' ' test_expect_success 'fatal descriptions on empty repository' ' current=$(git branch --show-current) && cat >expect <<-EOF && - fatal: No commit on branch '\''$current'\'' yet. + fatal: no commit on branch '\''$current'\'' yet EOF test_must_fail git branch --set-upstream-to=non-existent 2>actual && test_cmp expect actual && @@ -224,7 +224,7 @@ done test_expect_success 'error descriptions on non-existent branch' ' cat >expect <<-EOF && - error: No branch named '\''non-existent'\'.' + error: no branch named '\''non-existent'\'' EOF test_must_fail git branch --edit-description non-existent 2>actual && test_cmp expect actual @@ -238,7 +238,7 @@ test_expect_success 'fatal descriptions on non-existent branch' ' test_cmp expect actual && cat >expect <<-EOF && - fatal: No branch named '\''non-existent'\''. + fatal: no branch named '\''non-existent'\'' EOF test_must_fail git branch -c non-existent new-branch 2>actual && test_cmp expect actual && @@ -253,7 +253,7 @@ test_expect_success 'error descriptions on orphan branch' ' test_branch_op_in_wt() { test_orphan_error() { test_must_fail git $* 2>actual && - test_i18ngrep "No commit on branch .orphan-branch. yet.$" actual + test_grep "no commit on branch .orphan-branch. yet$" actual } && test_orphan_error -C wt branch $1 $2 && # implicit branch test_orphan_error -C wt branch $1 orphan-branch $2 && # explicit branch diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh index b5f4d6a653..7b05bf3961 100755 --- a/t/t3206-range-diff.sh +++ b/t/t3206-range-diff.sh @@ -195,7 +195,7 @@ test_expect_success 'A^! and A^-<n> (unmodified)' ' test_expect_success 'A^{/..} is not mistaken for a range' ' test_must_fail git range-diff topic^.. topic^{/..} -- 2>error && - test_i18ngrep "not a commit range" error + test_grep "not a commit range" error ' test_expect_success 'trivial reordering' ' @@ -537,7 +537,7 @@ do main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && - test_i18ngrep "^Range-diff:$" 0000-* && + test_grep "^Range-diff:$" 0000-* && grep "= 1: .* s/5/A" 0000-* && grep "= 2: .* s/4/A" 0000-* && grep "= 3: .* s/11/B" 0000-* && @@ -549,7 +549,7 @@ test_expect_success 'format-patch --range-diff as commentary' ' git format-patch --range-diff=HEAD~1 HEAD~1 >actual && test_when_finished "rm 0001-*" && test_line_count = 1 actual && - test_i18ngrep "^Range-diff:$" 0001-* && + test_grep "^Range-diff:$" 0001-* && grep "> 1: .* new message" 0001-* ' @@ -557,7 +557,7 @@ test_expect_success 'format-patch --range-diff reroll-count with a non-integer' git format-patch --range-diff=HEAD~1 -v2.9 HEAD~1 >actual && test_when_finished "rm v2.9-0001-*" && test_line_count = 1 actual && - test_i18ngrep "^Range-diff:$" v2.9-0001-* && + test_grep "^Range-diff:$" v2.9-0001-* && grep "> 1: .* new message" v2.9-0001-* ' @@ -565,7 +565,7 @@ test_expect_success 'format-patch --range-diff reroll-count with a integer' ' git format-patch --range-diff=HEAD~1 -v2 HEAD~1 >actual && test_when_finished "rm v2-0001-*" && test_line_count = 1 actual && - test_i18ngrep "^Range-diff ..* v1:$" v2-0001-* && + test_grep "^Range-diff ..* v1:$" v2-0001-* && grep "> 1: .* new message" v2-0001-* ' @@ -573,7 +573,7 @@ test_expect_success 'format-patch --range-diff with v0' ' git format-patch --range-diff=HEAD~1 -v0 HEAD~1 >actual && test_when_finished "rm v0-0001-*" && test_line_count = 1 actual && - test_i18ngrep "^Range-diff:$" v0-0001-* && + test_grep "^Range-diff:$" v0-0001-* && grep "> 1: .* new message" v0-0001-* ' @@ -662,6 +662,20 @@ test_expect_success 'range-diff with multiple --notes' ' test_cmp expect actual ' +# `range-diff` should act like `log` with regards to notes +test_expect_success 'range-diff with --notes=custom does not show default notes' ' + git notes add -m "topic note" topic && + git notes add -m "unmodified note" unmodified && + git notes --ref=custom add -m "topic note" topic && + git notes --ref=custom add -m "unmodified note" unmodified && + test_when_finished git notes remove topic unmodified && + test_when_finished git notes --ref=custom remove topic unmodified && + git range-diff --notes=custom main..topic main..unmodified \ + >actual && + ! grep "## Notes ##" actual && + grep "## Notes (custom) ##" actual +' + test_expect_success 'format-patch --range-diff does not compare notes by default' ' git notes add -m "topic note" topic && git notes add -m "unmodified note" unmodified && @@ -670,7 +684,7 @@ test_expect_success 'format-patch --range-diff does not compare notes by default main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && - test_i18ngrep "^Range-diff:$" 0000-* && + test_grep "^Range-diff:$" 0000-* && grep "= 1: .* s/5/A" 0000-* && grep "= 2: .* s/4/A" 0000-* && grep "= 3: .* s/11/B" 0000-* && @@ -679,6 +693,20 @@ test_expect_success 'format-patch --range-diff does not compare notes by default ! grep "note" 0000-* ' +test_expect_success 'format-patch --notes=custom --range-diff only compares custom notes' ' + git notes add -m "topic note" topic && + git notes --ref=custom add -m "topic note (custom)" topic && + git notes add -m "unmodified note" unmodified && + git notes --ref=custom add -m "unmodified note (custom)" unmodified && + test_when_finished git notes remove topic unmodified && + test_when_finished git notes --ref=custom remove topic unmodified && + git format-patch --notes=custom --cover-letter --range-diff=$prev \ + main..unmodified >actual && + test_when_finished "rm 000?-*" && + grep "## Notes (custom) ##" 0000-* && + ! grep "## Notes ##" 0000-* +' + test_expect_success 'format-patch --range-diff with --no-notes' ' git notes add -m "topic note" topic && git notes add -m "unmodified note" unmodified && @@ -687,7 +715,7 @@ test_expect_success 'format-patch --range-diff with --no-notes' ' main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && - test_i18ngrep "^Range-diff:$" 0000-* && + test_grep "^Range-diff:$" 0000-* && grep "= 1: .* s/5/A" 0000-* && grep "= 2: .* s/4/A" 0000-* && grep "= 3: .* s/11/B" 0000-* && @@ -704,7 +732,7 @@ test_expect_success 'format-patch --range-diff with --notes' ' main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && - test_i18ngrep "^Range-diff:$" 0000-* && + test_grep "^Range-diff:$" 0000-* && grep "= 1: .* s/5/A" 0000-* && grep "= 2: .* s/4/A" 0000-* && grep "= 3: .* s/11/B" 0000-* && @@ -733,7 +761,7 @@ test_expect_success 'format-patch --range-diff with format.notes config' ' main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && - test_i18ngrep "^Range-diff:$" 0000-* && + test_grep "^Range-diff:$" 0000-* && grep "= 1: .* s/5/A" 0000-* && grep "= 2: .* s/4/A" 0000-* && grep "= 3: .* s/11/B" 0000-* && @@ -764,7 +792,7 @@ test_expect_success 'format-patch --range-diff with multiple notes' ' main..unmodified >actual && test_when_finished "rm 000?-*" && test_line_count = 5 actual && - test_i18ngrep "^Range-diff:$" 0000-* && + test_grep "^Range-diff:$" 0000-* && grep "= 1: .* s/5/A" 0000-* && grep "= 2: .* s/4/A" 0000-* && grep "= 3: .* s/11/B" 0000-* && diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh index 7326adb70f..7f4e98db7d 100755 --- a/t/t3210-pack-refs.sh +++ b/t/t3210-pack-refs.sh @@ -227,7 +227,7 @@ test_expect_success 'notice d/f conflict with existing directory' ' test_expect_success 'existing directory reports concrete ref' ' test_must_fail git branch foo 2>stderr && - test_i18ngrep refs/heads/foo/bar/baz stderr + test_grep refs/heads/foo/bar/baz stderr ' test_expect_success 'notice d/f conflict with existing ref' ' diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh index d734000d2f..cf23c06c09 100755 --- a/t/t3301-notes.sh +++ b/t/t3301-notes.sh @@ -1469,9 +1469,9 @@ test_expect_success 'GIT_NOTES_REWRITE_REF overrides config' ' test_expect_success 'git notes copy diagnoses too many or too few arguments' ' test_must_fail git notes copy 2>error && - test_i18ngrep "too few arguments" error && + test_grep "too few arguments" error && test_must_fail git notes copy one two three 2>error && - test_i18ngrep "too many arguments" error + test_grep "too many arguments" error ' test_expect_success 'git notes get-ref expands refs/heads/main to refs/notes/refs/heads/main' ' diff --git a/t/t3310-notes-merge-manual-resolve.sh b/t/t3310-notes-merge-manual-resolve.sh index d3d72e25fe..597df5ebc0 100755 --- a/t/t3310-notes-merge-manual-resolve.sh +++ b/t/t3310-notes-merge-manual-resolve.sh @@ -216,7 +216,7 @@ test_expect_success 'merge z into m (== y) with default ("manual") resolver => C git config core.notesRef refs/notes/m && test_must_fail git notes merge z >output 2>&1 && # Output should point to where to resolve conflicts - test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output && + test_grep "\\.git/NOTES_MERGE_WORKTREE" output && # Inspect merge conflicts ls .git/NOTES_MERGE_WORKTREE >output_conflicts && test_cmp expect_conflicts output_conflicts && @@ -263,7 +263,7 @@ test_expect_success 'cannot do merge w/conflicts when previous merge is unfinish test -d .git/NOTES_MERGE_WORKTREE && test_must_fail git notes merge z >output 2>&1 && # Output should indicate what is wrong - test_i18ngrep -q "\\.git/NOTES_MERGE_\\* exists" output + test_grep -q "\\.git/NOTES_MERGE_\\* exists" output ' # Setup non-conflicting merge between x and new notes ref w @@ -417,7 +417,7 @@ test_expect_success 'redo merge of z into m (== y) with default ("manual") resol git config core.notesRef refs/notes/m && test_must_fail git notes merge z >output 2>&1 && # Output should point to where to resolve conflicts - test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output && + test_grep "\\.git/NOTES_MERGE_WORKTREE" output && # Inspect merge conflicts ls .git/NOTES_MERGE_WORKTREE >output_conflicts && test_cmp expect_conflicts output_conflicts && @@ -449,7 +449,7 @@ git rev-parse refs/notes/z > pre_merge_z test_expect_success 'redo merge of z into m (== y) with default ("manual") resolver => Conflicting 3-way merge' ' test_must_fail git notes merge z >output 2>&1 && # Output should point to where to resolve conflicts - test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output && + test_grep "\\.git/NOTES_MERGE_WORKTREE" output && # Inspect merge conflicts ls .git/NOTES_MERGE_WORKTREE >output_conflicts && test_cmp expect_conflicts output_conflicts && @@ -528,7 +528,7 @@ test_expect_success 'redo merge of z into m (== y) with default ("manual") resol git update-ref refs/notes/m refs/notes/y && test_must_fail git notes merge z >output 2>&1 && # Output should point to where to resolve conflicts - test_i18ngrep "\\.git/NOTES_MERGE_WORKTREE" output && + test_grep "\\.git/NOTES_MERGE_WORKTREE" output && # Inspect merge conflicts ls .git/NOTES_MERGE_WORKTREE >output_conflicts && test_cmp expect_conflicts output_conflicts && @@ -561,9 +561,9 @@ y and z notes on 4th commit EOF # Fail to finalize merge test_must_fail git notes merge --commit >output 2>&1 && - # .git/NOTES_MERGE_* must remain - test -f .git/NOTES_MERGE_PARTIAL && - test -f .git/NOTES_MERGE_REF && + # NOTES_MERGE_* refs and .git/NOTES_MERGE_* state files must remain + git rev-parse --verify NOTES_MERGE_PARTIAL && + git rev-parse --verify NOTES_MERGE_REF && test -f .git/NOTES_MERGE_WORKTREE/$commit_sha1 && test -f .git/NOTES_MERGE_WORKTREE/$commit_sha2 && test -f .git/NOTES_MERGE_WORKTREE/$commit_sha3 && @@ -573,9 +573,9 @@ EOF test "$(git rev-parse refs/notes/y)" = "$(git rev-parse NOTES_MERGE_PARTIAL^1)" && test "$(git rev-parse refs/notes/m)" != "$(git rev-parse NOTES_MERGE_PARTIAL^1)" && # Mention refs/notes/m, and its current and expected value in output - test_i18ngrep -q "refs/notes/m" output && - test_i18ngrep -q "$(git rev-parse refs/notes/m)" output && - test_i18ngrep -q "$(git rev-parse NOTES_MERGE_PARTIAL^1)" output && + test_grep -q "refs/notes/m" output && + test_grep -q "$(git rev-parse refs/notes/m)" output && + test_grep -q "$(git rev-parse NOTES_MERGE_PARTIAL^1)" output && # Verify that other notes refs has not changed (w, x, y and z) verify_notes w && verify_notes x && diff --git a/t/t3320-notes-merge-worktrees.sh b/t/t3320-notes-merge-worktrees.sh index bff0aea550..0fd33280cf 100755 --- a/t/t3320-notes-merge-worktrees.sh +++ b/t/t3320-notes-merge-worktrees.sh @@ -57,7 +57,7 @@ test_expect_success 'merge z into y while mid-merge in another workdir fails' ' cd worktree && git config core.notesRef refs/notes/y && test_must_fail git notes merge z 2>err && - test_i18ngrep "a notes merge into refs/notes/y is already in-progress at" err + test_grep "a notes merge into refs/notes/y is already in-progress at" err ) && test_must_fail git -C worktree symbolic-ref NOTES_MERGE_REF ' @@ -67,7 +67,7 @@ test_expect_success 'merge z into x while mid-merge on y succeeds' ' cd worktree2 && git config core.notesRef refs/notes/x && test_must_fail git notes merge z >out 2>&1 && - test_i18ngrep "Automatic notes merge failed" out && + test_grep "Automatic notes merge failed" out && grep -v "A notes merge into refs/notes/x is already in-progress in" out ) && echo "refs/notes/x" >expect && diff --git a/t/t3321-notes-stripspace.sh b/t/t3321-notes-stripspace.sh index 36abdca5ee..088a852dd4 100755 --- a/t/t3321-notes-stripspace.sh +++ b/t/t3321-notes-stripspace.sh @@ -429,7 +429,7 @@ test_expect_success 'add notes with empty messages' ' git notes add -m "${LF}" \ -m "${MULTI_LF}" \ -m "${LF}" >actual 2>&1 && - test_i18ngrep "Removing note for object" actual + test_grep "Removing note for object" actual ' test_expect_success 'add note by specifying "-C", "--no-stripspace" is the default behavior' ' diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh index 3ce918fdb8..24a539c662 100755 --- a/t/t3400-rebase.sh +++ b/t/t3400-rebase.sh @@ -143,8 +143,8 @@ test_expect_success 'Show verbose error when HEAD could not be detached' ' >B && test_when_finished "rm -f B" && test_must_fail git rebase topic 2>output.err >output.out && - test_i18ngrep "The following untracked working tree files would be overwritten by checkout:" output.err && - test_i18ngrep B output.err + test_grep "The following untracked working tree files would be overwritten by checkout:" output.err && + test_grep B output.err ' test_expect_success 'fail when upstream arg is missing and not on branch' ' @@ -421,7 +421,7 @@ test_expect_success 'refuse to switch to branch checked out elsewhere' ' git checkout main && git worktree add wt && test_must_fail git -C wt rebase main main 2>err && - test_i18ngrep "already checked out" err + test_grep "already used by worktree at" err ' test_expect_success MINGW,SYMLINKS_WINDOWS 'rebase when .git/logs is a symlink' ' diff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh index e9e03ca4b5..5c67d07ba3 100755 --- a/t/t3402-rebase-merge.sh +++ b/t/t3402-rebase-merge.sh @@ -171,7 +171,7 @@ test_expect_success '--reapply-cherry-picks' ' # Regular rebase fails, because the 1-11 commit is deduplicated test_must_fail git -C repo rebase --merge main 2> err && - test_i18ngrep "error: could not apply.*add 12 in another branch" err && + test_grep "error: could not apply.*add 12 in another branch" err && git -C repo rebase --abort && # With --reapply-cherry-picks, it works diff --git a/t/t3403-rebase-skip.sh b/t/t3403-rebase-skip.sh index f6e4864497..a1911c4a9d 100755 --- a/t/t3403-rebase-skip.sh +++ b/t/t3403-rebase-skip.sh @@ -108,10 +108,10 @@ test_expect_success 'correct advice upon picking empty commit' ' test_when_finished "git rebase --abort" && test_must_fail git rebase -i --onto goodbye \ amended-goodbye^ amended-goodbye 2>err && - test_i18ngrep "previous cherry-pick is now empty" err && - test_i18ngrep "git rebase --skip" err && + test_grep "previous cherry-pick is now empty" err && + test_grep "git rebase --skip" err && test_must_fail git commit && - test_i18ngrep "git rebase --skip" err + test_grep "git rebase --skip" err ' test_expect_success 'correct authorship when committing empty pick' ' @@ -131,10 +131,10 @@ test_expect_success 'correct advice upon rewording empty commit' ' test_must_fail env FAKE_LINES="reword 1" git rebase -i \ --onto goodbye amended-goodbye^ amended-goodbye 2>err ) && - test_i18ngrep "previous cherry-pick is now empty" err && - test_i18ngrep "git rebase --skip" err && + test_grep "previous cherry-pick is now empty" err && + test_grep "git rebase --skip" err && test_must_fail git commit && - test_i18ngrep "git rebase --skip" err + test_grep "git rebase --skip" err ' test_expect_success 'correct advice upon editing empty commit' ' @@ -144,10 +144,10 @@ test_expect_success 'correct advice upon editing empty commit' ' test_must_fail env FAKE_LINES="edit 1" git rebase -i \ --onto goodbye amended-goodbye^ amended-goodbye 2>err ) && - test_i18ngrep "previous cherry-pick is now empty" err && - test_i18ngrep "git rebase --skip" err && + test_grep "previous cherry-pick is now empty" err && + test_grep "git rebase --skip" err && test_must_fail git commit && - test_i18ngrep "git rebase --skip" err + test_grep "git rebase --skip" err ' test_expect_success 'correct advice upon cherry-picking an empty commit during a rebase' ' @@ -157,10 +157,10 @@ test_expect_success 'correct advice upon cherry-picking an empty commit during a test_must_fail env FAKE_LINES="1 exec_git_cherry-pick_amended-goodbye" \ git rebase -i goodbye^ goodbye 2>err ) && - test_i18ngrep "previous cherry-pick is now empty" err && - test_i18ngrep "git cherry-pick --skip" err && + test_grep "previous cherry-pick is now empty" err && + test_grep "git cherry-pick --skip" err && test_must_fail git commit 2>err && - test_i18ngrep "git cherry-pick --skip" err + test_grep "git cherry-pick --skip" err ' test_expect_success 'correct advice upon multi cherry-pick picking an empty commit during a rebase' ' @@ -170,10 +170,10 @@ test_expect_success 'correct advice upon multi cherry-pick picking an empty comm test_must_fail env FAKE_LINES="1 exec_git_cherry-pick_goodbye_amended-goodbye" \ git rebase -i goodbye^^ goodbye 2>err ) && - test_i18ngrep "previous cherry-pick is now empty" err && - test_i18ngrep "git cherry-pick --skip" err && + test_grep "previous cherry-pick is now empty" err && + test_grep "git cherry-pick --skip" err && test_must_fail git commit 2>err && - test_i18ngrep "git cherry-pick --skip" err + test_grep "git cherry-pick --skip" err ' test_expect_success 'fixup that empties commit fails' ' diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 8ea2bf1302..c5f30554c6 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -291,9 +291,9 @@ test_expect_success 'abort with error when new base cannot be checked out' ' git rm --cached file1 && git commit -m "remove file in base" && test_must_fail git rebase -i primary > output 2>&1 && - test_i18ngrep "The following untracked working tree files would be overwritten by checkout:" \ + test_grep "The following untracked working tree files would be overwritten by checkout:" \ output && - test_i18ngrep "file1" output && + test_grep "file1" output && test_path_is_missing .git/rebase-merge && rm file1 && git reset --hard HEAD^ @@ -604,8 +604,8 @@ test_expect_success 'clean error after failed "exec"' ' echo "edited again" > file7 && git add file7 && test_must_fail git rebase --continue 2>error && - test_i18ngrep "you have staged changes in your working tree" error && - test_i18ngrep ! "could not open.*for reading" error + test_grep "you have staged changes in your working tree" error && + test_grep ! "could not open.*for reading" error ' test_expect_success 'rebase a detached HEAD' ' @@ -956,7 +956,7 @@ test_expect_success 'rebase --exec works without -i ' ' git reset --hard execute && rm -rf exec_output && EDITOR="echo >invoked_editor" git rebase --exec "echo a line >>exec_output" HEAD~2 2>actual && - test_i18ngrep "Successfully rebased and updated" actual && + test_grep "Successfully rebased and updated" actual && test_line_count = 2 exec_output && test_path_is_missing invoked_editor ' @@ -964,7 +964,7 @@ test_expect_success 'rebase --exec works without -i ' ' test_expect_success 'rebase -i --exec without <CMD>' ' git reset --hard execute && test_must_fail git rebase -i --exec 2>actual && - test_i18ngrep "requires a value" actual && + test_grep "requires a value" actual && git checkout primary ' @@ -1273,7 +1273,7 @@ test_expect_success 'todo count' ' test_set_editor "$(pwd)/dump-raw.sh" && git rebase -i HEAD~4 >actual ) && - test_i18ngrep "^# Rebase ..* onto ..* ([0-9]" actual + test_grep "^# Rebase ..* onto ..* ([0-9]" actual ' test_expect_success 'rebase -i commits that overwrite untracked files (pick)' ' @@ -1408,7 +1408,7 @@ test_expect_success 'rebase -i respects rebase.missingCommitsCheck = ignore' ' FAKE_LINES="1 2 3 4" git rebase -i --root 2>actual ) && test D = $(git cat-file commit HEAD | sed -ne \$p) && - test_i18ngrep \ + test_grep \ "Successfully rebased and updated refs/heads/missing-commit" \ actual ' @@ -1471,7 +1471,7 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = ig git rebase --continue 2>actual ) && test D = $(git cat-file commit HEAD | sed -ne \$p) && - test_i18ngrep \ + test_grep \ "Successfully rebased and updated refs/heads/missing-commit" \ actual ' @@ -1506,7 +1506,7 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = wa git rebase --continue 2>actual ) && test D = $(git cat-file commit HEAD | sed -ne \$p) && - test_i18ngrep \ + test_grep \ "Successfully rebased and updated refs/heads/missing-commit" \ actual ' @@ -1554,7 +1554,7 @@ test_expect_success 'rebase --edit-todo respects rebase.missingCommitsCheck = er git rebase --continue 2>actual ) && test D = $(git cat-file commit HEAD | sed -ne \$p) && - test_i18ngrep \ + test_grep \ "Successfully rebased and updated refs/heads/missing-commit" \ actual ' @@ -1614,9 +1614,9 @@ test_expect_success 'static check of bad command' ' set_fake_editor && test_must_fail env FAKE_LINES="1 2 3 bad 4 5" \ git rebase -i --root 2>actual && - test_i18ngrep "pickled $(git rev-list --oneline -1 primary~1)" \ + test_grep "pickled $(git rev-list --oneline -1 primary~1)" \ actual && - test_i18ngrep "You can fix this with .git rebase --edit-todo.." \ + test_grep "You can fix this with .git rebase --edit-todo.." \ actual && FAKE_LINES="1 2 3 drop 4 5" git rebase --edit-todo ) && @@ -1674,8 +1674,8 @@ test_expect_success 'static check of bad SHA-1' ' set_fake_editor && test_must_fail env FAKE_LINES="1 2 edit fakesha 3 4 5 #" \ git rebase -i --root 2>actual && - test_i18ngrep "edit XXXXXXX False commit" actual && - test_i18ngrep "You can fix this with .git rebase --edit-todo.." \ + test_grep "edit XXXXXXX False commit" actual && + test_grep "You can fix this with .git rebase --edit-todo.." \ actual && FAKE_LINES="1 2 4 5 6" git rebase --edit-todo ) && @@ -1702,7 +1702,7 @@ test_expect_success 'rebase -i --gpg-sign=<key-id>' ' FAKE_LINES="edit 1" git rebase -i --gpg-sign="\"S I Gner\"" \ HEAD^ >out 2>err ) && - test_i18ngrep "$SQ-S\"S I Gner\"$SQ" err + test_grep "$SQ-S\"S I Gner\"$SQ" err ' test_expect_success 'rebase -i --gpg-sign=<key-id> overrides commit.gpgSign' ' @@ -1713,7 +1713,7 @@ test_expect_success 'rebase -i --gpg-sign=<key-id> overrides commit.gpgSign' ' FAKE_LINES="edit 1" git rebase -i --gpg-sign="\"S I Gner\"" \ HEAD^ >out 2>err ) && - test_i18ngrep "$SQ-S\"S I Gner\"$SQ" err + test_grep "$SQ-S\"S I Gner\"$SQ" err ' test_expect_success 'valid author header after --root swap' ' @@ -1767,7 +1767,7 @@ test_expect_success 'correct error message for partial commit after empty pick' ) && echo x >file1 && test_must_fail git commit file1 2>err && - test_i18ngrep "cannot do a partial commit during a rebase." err + test_grep "cannot do a partial commit during a rebase." err ' test_expect_success 'correct error message for commit --amend after empty pick' ' @@ -1780,13 +1780,13 @@ test_expect_success 'correct error message for commit --amend after empty pick' ) && echo x>file1 && test_must_fail git commit -a --amend 2>err && - test_i18ngrep "middle of a rebase -- cannot amend." err + test_grep "middle of a rebase -- cannot amend." err ' test_expect_success 'todo has correct onto hash' ' GIT_SEQUENCE_EDITOR=cat git rebase -i no-conflict-branch~4 no-conflict-branch >actual && onto=$(git rev-parse --short HEAD~4) && - test_i18ngrep "^# Rebase ..* onto $onto" actual + test_grep "^# Rebase ..* onto $onto" actual ' test_expect_success 'ORIG_HEAD is updated correctly' ' diff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh index ceca160005..a1d7fa7f7c 100755 --- a/t/t3406-rebase-message.sh +++ b/t/t3406-rebase-message.sh @@ -33,24 +33,24 @@ test_expect_success 'rebase -m' ' test_expect_success 'rebase against main twice' ' git rebase --apply main >out && - test_i18ngrep "Current branch topic is up to date" out + test_grep "Current branch topic is up to date" out ' test_expect_success 'rebase against main twice with --force' ' git rebase --force-rebase --apply main >out && - test_i18ngrep "Current branch topic is up to date, rebase forced" out + test_grep "Current branch topic is up to date, rebase forced" out ' test_expect_success 'rebase against main twice from another branch' ' git checkout topic^ && git rebase --apply main topic >out && - test_i18ngrep "Current branch topic is up to date" out + test_grep "Current branch topic is up to date" out ' test_expect_success 'rebase fast-forward to main' ' git checkout topic^ && git rebase --apply topic >out && - test_i18ngrep "Fast-forwarded HEAD to topic" out + test_grep "Fast-forwarded HEAD to topic" out ' test_expect_success 'rebase --stat' ' @@ -75,14 +75,14 @@ test_expect_success 'rebase -n overrides config rebase.stat config' ' test_expect_success 'rebase --onto outputs the invalid ref' ' test_must_fail git rebase --onto invalid-ref HEAD HEAD 2>err && - test_i18ngrep "invalid-ref" err + test_grep "invalid-ref" err ' test_expect_success 'error out early upon -C<n> or --whitespace=<bad>' ' test_must_fail git rebase -Cnot-a-number HEAD 2>err && - test_i18ngrep "numerical value" err && + test_grep "numerical value" err && test_must_fail git rebase --whitespace=bad HEAD 2>err && - test_i18ngrep "Invalid whitespace option" err + test_grep "Invalid whitespace option" err ' write_reflog_expect () { @@ -251,8 +251,8 @@ test_expect_success 'rebase -i onto unrelated history' ' git -C unrelated remote add -f origin "$PWD" && git -C unrelated branch --set-upstream-to=origin/main && git -C unrelated -c core.editor=true rebase -i -v --stat >actual && - test_i18ngrep "Changes to " actual && - test_i18ngrep "5 files changed" actual + test_grep "Changes to " actual && + test_grep "5 files changed" actual ' test_done diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh index c4e2fcac67..127216f722 100755 --- a/t/t3418-rebase-continue.sh +++ b/t/t3418-rebase-continue.sh @@ -182,8 +182,8 @@ test_expect_success '--skip after failed fixup cleans commit message' ' : Final squash failed, but there was still a squash && head -n1 .git/copy.txt >first-line && - test_i18ngrep "# This is a combination of 3 commits" first-line && - test_i18ngrep "# This is the commit message #3:" .git/copy.txt + test_grep "# This is a combination of 3 commits" first-line && + test_grep "# This is the commit message #3:" .git/copy.txt ' test_expect_success 'setup rerere database' ' @@ -294,7 +294,7 @@ test_expect_success '--reschedule-failed-exec' ' test_must_fail git -c rebase.rescheduleFailedExec=true \ rebase -x false HEAD^ 2>err && grep "^exec false" .git/rebase-merge/git-rebase-todo && - test_i18ngrep "has been rescheduled" err + test_grep "has been rescheduled" err ' test_expect_success 'rebase.rescheduleFailedExec only affects `rebase -i`' ' diff --git a/t/t3431-rebase-fork-point.sh b/t/t3431-rebase-fork-point.sh index 4bfc779bb8..0bb284d61d 100755 --- a/t/t3431-rebase-fork-point.sh +++ b/t/t3431-rebase-fork-point.sh @@ -84,7 +84,7 @@ test_expect_success 'git rebase --fork-point with ambigous refname' ' test_expect_success '--fork-point and --root both given' ' test_must_fail git rebase --fork-point --root 2>err && - test_i18ngrep "cannot be used together" err + test_grep "cannot be used together" err ' test_expect_success 'rebase.forkPoint set to false' ' diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh index e2ef619323..aeab689a98 100755 --- a/t/t3501-revert-cherry-pick.sh +++ b/t/t3501-revert-cherry-pick.sh @@ -43,7 +43,7 @@ test_expect_success 'cherry-pick --nonsense' ' git diff --exit-code HEAD && test_must_fail git cherry-pick --nonsense 2>msg && git diff --exit-code HEAD "$pos" && - test_i18ngrep "[Uu]sage:" msg + test_grep "[Uu]sage:" msg ' test_expect_success 'revert --nonsense' ' @@ -52,7 +52,7 @@ test_expect_success 'revert --nonsense' ' git diff --exit-code HEAD && test_must_fail git revert --nonsense 2>msg && git diff --exit-code HEAD "$pos" && - test_i18ngrep "[Uu]sage:" msg + test_grep "[Uu]sage:" msg ' # the following two test cherry-pick and revert with renames @@ -99,7 +99,7 @@ test_expect_success 'revert forbidden on dirty working tree' ' echo content >extra_file && git add extra_file && test_must_fail git revert HEAD 2>errors && - test_i18ngrep "your local changes would be overwritten by " errors + test_grep "your local changes would be overwritten by " errors ' @@ -176,6 +176,29 @@ test_expect_success 'advice from failed revert' ' test_cmp expected actual ' +test_expect_subject () { + echo "$1" >expect && + git log -1 --pretty=%s >actual && + test_cmp expect actual +} + +test_expect_success 'titles of fresh reverts' ' + test_commit --no-tag A file1 && + test_commit --no-tag B file1 && + git revert --no-edit HEAD && + test_expect_subject "Revert \"B\"" && + git revert --no-edit HEAD && + test_expect_subject "Reapply \"B\"" && + git revert --no-edit HEAD && + test_expect_subject "Revert \"Reapply \"B\"\"" +' + +test_expect_success 'title of legacy double revert' ' + test_commit --no-tag "Revert \"Revert \"B\"\"" file1 && + git revert --no-edit HEAD && + test_expect_subject "Revert \"Revert \"Revert \"B\"\"\"" +' + test_expect_success 'identification of reverted commit (default)' ' test_commit to-ident && test_when_finished "git reset --hard to-ident" && diff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh index f32799e046..c88d597b12 100755 --- a/t/t3507-cherry-pick-conflict.sh +++ b/t/t3507-cherry-pick-conflict.sh @@ -177,7 +177,7 @@ test_expect_success 'partial commit of cherry-pick fails' ' git add foo && test_must_fail git commit foo 2>err && - test_i18ngrep "cannot do a partial commit during a cherry-pick." err + test_grep "cannot do a partial commit during a cherry-pick." err ' test_expect_success 'commit --amend of cherry-pick fails' ' @@ -188,7 +188,7 @@ test_expect_success 'commit --amend of cherry-pick fails' ' git add foo && test_must_fail git commit --amend 2>err && - test_i18ngrep "in the middle of a cherry-pick -- cannot amend." err + test_grep "in the middle of a cherry-pick -- cannot amend." err ' test_expect_success 'successful final commit clears cherry-pick state' ' @@ -498,7 +498,7 @@ test_expect_success \ test_expect_success 'failed cherry-pick does not forget -s' ' pristine_detach initial && test_must_fail git cherry-pick -s picked && - test_i18ngrep -e "Signed-off-by" .git/MERGE_MSG + test_grep -e "Signed-off-by" .git/MERGE_MSG ' test_expect_success 'commit after failed cherry-pick does not add duplicated -s' ' @@ -563,7 +563,7 @@ test_expect_success 'cherry-pick preserves sparse-checkout' ' echo /unrelated >.git/info/sparse-checkout && git read-tree --reset -u HEAD && test_must_fail git cherry-pick -Xours picked>actual && - test_i18ngrep ! "Changes not staged for commit:" actual + test_grep ! "Changes not staged for commit:" actual ' test_expect_success 'cherry-pick --continue remembers --keep-redundant-commits' ' diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh index 3b0fa66c33..72020a51c4 100755 --- a/t/t3510-cherry-pick-sequence.sh +++ b/t/t3510-cherry-pick-sequence.sh @@ -154,7 +154,7 @@ test_expect_success 'skip "empty" commit' ' pristine_detach picked && test_commit dummy foo d && test_must_fail git cherry-pick anotherpick 2>err && - test_i18ngrep "git cherry-pick --skip" err && + test_grep "git cherry-pick --skip" err && git cherry-pick --skip && test_cmp_rev dummy HEAD ' @@ -314,7 +314,7 @@ test_expect_success '--abort does not unsafely change HEAD' ' git reset --hard base && test_must_fail git cherry-pick picked anotherpick && git cherry-pick --abort 2>actual && - test_i18ngrep "You seem to have moved HEAD" actual && + test_grep "You seem to have moved HEAD" actual && test_cmp_rev base HEAD ' @@ -520,7 +520,7 @@ test_expect_success '--continue asks for help after resolving patch to nil' ' test_cmp_rev unrelatedpick CHERRY_PICK_HEAD && git checkout HEAD -- unrelated && test_must_fail git cherry-pick --continue 2>msg && - test_i18ngrep "The previous cherry-pick is now empty" msg + test_grep "The previous cherry-pick is now empty" msg ' test_expect_success 'follow advice and skip nil patch' ' diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index 0e8afe49ed..98259e2ada 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -276,7 +276,7 @@ test_expect_success 'Resolving by removal is not a warning-worthy event' ' blob=$(echo blob | git hash-object -w --stdin) && printf "100644 $blob %d\tblob\n" 1 2 3 | git update-index --index-info && git rm blob >msg 2>&1 && - test_i18ngrep ! "needs merge" msg && + test_grep ! "needs merge" msg && test_must_fail git ls-files -s --error-unmatch blob ' @@ -631,7 +631,7 @@ test_expect_success 'rm of a populated submodule with a .git directory migrates test_path_is_missing submod/.git && git status -s -uno --ignore-submodules=none >actual && test_file_not_empty actual && - test_i18ngrep Migrating output.err + test_grep Migrating output.err ' cat >expect.deepmodified <<EOF @@ -722,7 +722,7 @@ test_expect_success "rm absorbs submodule's nested .git directory" ' test_path_is_missing submod/subsubmod/.git && git status -s -uno --ignore-submodules=none >actual && test_file_not_empty actual && - test_i18ngrep Migrating output.err + test_grep Migrating output.err ' test_expect_success 'checking out a commit after submodule removal needs manual updates' ' @@ -731,7 +731,7 @@ test_expect_success 'checking out a commit after submodule removal needs manual git submodule update && git checkout -q HEAD^ && git checkout -q main 2>actual && - test_i18ngrep "^warning: unable to rmdir '\''submod'\'':" actual && + test_grep "^warning: unable to rmdir '\''submod'\'':" actual && git status -s submod >actual && echo "?? submod/" >expected && test_cmp expected actual && diff --git a/t/t3601-rm-pathspec-file.sh b/t/t3601-rm-pathspec-file.sh index a2a0c820fe..7cef12981c 100755 --- a/t/t3601-rm-pathspec-file.sh +++ b/t/t3601-rm-pathspec-file.sh @@ -67,14 +67,14 @@ test_expect_success 'error conditions' ' echo fileA.t >list && test_must_fail git rm --pathspec-from-file=list -- fileA.t 2>err && - test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && + test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && test_must_fail git rm --pathspec-file-nul 2>err && - test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && + test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && >empty_list && test_must_fail git rm --pathspec-from-file=empty_list 2>err && - test_i18ngrep -e "No pathspec was given. Which files should I remove?" err + test_grep -e "No pathspec was given. Which files should I remove?" err ' test_done diff --git a/t/t3700-add.sh b/t/t3700-add.sh index 7623689da2..f23d39f0d5 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -438,7 +438,7 @@ test_expect_success 'git add --chmod fails with non regular files (but updates t test_ln_s_add foo foo3 && touch foo4 && test_must_fail git add --chmod=+x foo3 foo4 2>stderr && - test_i18ngrep "cannot chmod +x .foo3." stderr && + test_grep "cannot chmod +x .foo3." stderr && test_mode_in_index 120000 foo3 && test_mode_in_index 100755 foo4 ' @@ -455,12 +455,12 @@ test_expect_success 'git add --chmod --dry-run reports error for non regular fil git reset --hard && test_ln_s_add foo foo4 && test_must_fail git add --chmod=+x --dry-run foo4 2>stderr && - test_i18ngrep "cannot chmod +x .foo4." stderr + test_grep "cannot chmod +x .foo4." stderr ' test_expect_success 'git add --chmod --dry-run reports error for unmatched pathspec' ' test_must_fail git add --chmod=+x --dry-run nonexistent 2>stderr && - test_i18ngrep "pathspec .nonexistent. did not match any files" stderr + test_grep "pathspec .nonexistent. did not match any files" stderr ' test_expect_success 'no file status change if no pathspec is given' ' diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh index 34aabb7f5f..0b5339ac6c 100755 --- a/t/t3701-add-interactive.sh +++ b/t/t3701-add-interactive.sh @@ -335,12 +335,12 @@ test_expect_success 'different prompts for mode change/deleted' ' test_expect_success 'correct message when there is nothing to do' ' git reset --hard && git add -p 2>err && - test_i18ngrep "No changes" err && + test_grep "No changes" err && printf "\\0123" >binary && git add binary && printf "\\0abc" >binary && git add -p 2>err && - test_i18ngrep "Only binary files changed" err + test_grep "Only binary files changed" err ' test_expect_success 'setup again' ' @@ -497,7 +497,7 @@ test_expect_success 'adding an empty file' ' echo y | git checkout -p added-file -- >actual && test_path_is_file empty && - test_i18ngrep "Apply addition to index and worktree" actual + test_grep "Apply addition to index and worktree" actual ) ' @@ -838,7 +838,7 @@ test_expect_success 'diff.algorithm is passed to `git diff-files`' ' git add file && echo changed >file && test_must_fail git -c diff.algorithm=bogus add -p 2>err && - test_i18ngrep "error: option diff-algorithm accepts " err + test_grep "error: option diff-algorithm accepts " err ' test_expect_success 'patch-mode via -i prompts for files' ' diff --git a/t/t3704-add-pathspec-file.sh b/t/t3704-add-pathspec-file.sh index 4e6b5177c9..3aa59f6f63 100755 --- a/t/t3704-add-pathspec-file.sh +++ b/t/t3704-add-pathspec-file.sh @@ -138,23 +138,23 @@ test_expect_success 'error conditions' ' >empty_list && test_must_fail git add --pathspec-from-file=list --interactive 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err && test_must_fail git add --pathspec-from-file=list --patch 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err && test_must_fail git add --pathspec-from-file=list --edit 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--edit. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--edit. cannot be used together" err && test_must_fail git add --pathspec-from-file=list -- fileA.t 2>err && - test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && + test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && test_must_fail git add --pathspec-file-nul 2>err && - test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && + test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && # This case succeeds, but still prints to stderr git add --pathspec-from-file=empty_list 2>err && - test_i18ngrep -e "Nothing specified, nothing added." err + test_grep -e "Nothing specified, nothing added." err ' test_done diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh index bfab245eb3..f27d09cfd9 100755 --- a/t/t3900-i18n-commit.sh +++ b/t/t3900-i18n-commit.sh @@ -45,7 +45,7 @@ test_expect_success 'UTF-8 invalid characters refused' ' printf "Commit message\n\nInvalid surrogate:\355\240\200\n" \ >"$HOME/invalid" && git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr && - test_i18ngrep "did not conform" "$HOME"/stderr + test_grep "did not conform" "$HOME"/stderr ' test_expect_success 'UTF-8 overlong sequences rejected' ' @@ -55,7 +55,7 @@ test_expect_success 'UTF-8 overlong sequences rejected' ' printf "\340\202\251ommit message\n\nThis is not a space:\300\240\n" \ >"$HOME/invalid" && git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr && - test_i18ngrep "did not conform" "$HOME"/stderr + test_grep "did not conform" "$HOME"/stderr ' test_expect_success 'UTF-8 non-characters refused' ' @@ -64,7 +64,7 @@ test_expect_success 'UTF-8 non-characters refused' ' printf "Commit message\n\nNon-character:\364\217\277\276\n" \ >"$HOME/invalid" && git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr && - test_i18ngrep "did not conform" "$HOME"/stderr + test_grep "did not conform" "$HOME"/stderr ' test_expect_success 'UTF-8 non-characters refused' ' @@ -73,7 +73,7 @@ test_expect_success 'UTF-8 non-characters refused' ' printf "Commit message\n\nNon-character:\357\267\220\n" \ >"$HOME/invalid" && git commit -a -F "$HOME/invalid" 2>"$HOME"/stderr && - test_i18ngrep "did not conform" "$HOME"/stderr + test_grep "did not conform" "$HOME"/stderr ' for H in ISO8859-1 eucJP ISO-2022-JP diff --git a/t/t3901-i18n-patch.sh b/t/t3901-i18n-patch.sh index 4f16a735d9..4b37f78829 100755 --- a/t/t3901-i18n-patch.sh +++ b/t/t3901-i18n-patch.sh @@ -298,7 +298,7 @@ test_expect_success 'am --no-utf8 (U/L)' ' # commit-tree will warn that the commit message does not contain valid UTF-8 # as mailinfo did not convert it - test_i18ngrep "did not conform" err && + test_grep "did not conform" err && check_encoding 2 ' diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index 0b3dfeaea2..3caf490e39 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -395,7 +395,7 @@ test_expect_success 'stash --staged' ' test_expect_success 'dont assume push with non-option args' ' test_must_fail git stash -q drop 2>err && - test_i18ngrep -e "subcommand wasn'\''t specified; '\''push'\'' can'\''t be assumed due to unexpected token '\''drop'\''" err + test_grep -e "subcommand wasn'\''t specified; '\''push'\'' can'\''t be assumed due to unexpected token '\''drop'\''" err ' test_expect_success 'stash --invalid-option' ' @@ -596,7 +596,7 @@ test_expect_success 'giving too many ref arguments does not modify files' ' for type in apply pop "branch stash-branch" do test_must_fail git stash $type stash@{0} stash@{1} 2>err && - test_i18ngrep "Too many revisions" err && + test_grep "Too many revisions" err && test 123456789 = $(test-tool chmtime -g file2) || return 1 done ' @@ -604,14 +604,14 @@ test_expect_success 'giving too many ref arguments does not modify files' ' test_expect_success 'drop: too many arguments errors out (does nothing)' ' git stash list >expect && test_must_fail git stash drop stash@{0} stash@{1} 2>err && - test_i18ngrep "Too many revisions" err && + test_grep "Too many revisions" err && git stash list >actual && test_cmp expect actual ' test_expect_success 'show: too many arguments errors out (does nothing)' ' test_must_fail git stash show stash@{0} stash@{1} 2>err 1>out && - test_i18ngrep "Too many revisions" err && + test_grep "Too many revisions" err && test_must_be_empty out ' @@ -654,7 +654,7 @@ test_expect_success 'stash branch - stashes on stack, stash-like argument' ' test_expect_success 'stash branch complains with no arguments' ' test_must_fail git stash branch 2>err && - test_i18ngrep "No branch name specified" err + test_grep "No branch name specified" err ' test_expect_success 'stash show format defaults to --stat' ' @@ -931,6 +931,10 @@ test_expect_success 'store called with invalid commit' ' test_must_fail git stash store foo ' +test_expect_success 'store called with non-stash commit' ' + test_must_fail git stash store HEAD +' + test_expect_success 'store updates stash ref and reflog' ' git stash clear && git reset --hard && @@ -1512,4 +1516,56 @@ test_expect_success 'restore untracked files even when we hit conflicts' ' ) ' +test_expect_success 'stash create reports a locked index' ' + test_when_finished "rm -rf repo" && + git init repo && + ( + cd repo && + test_commit A A.file && + echo change >A.file && + touch .git/index.lock && + + cat >expect <<-EOF && + error: could not write index + EOF + test_must_fail git stash create 2>err && + test_cmp expect err + ) +' + +test_expect_success 'stash push reports a locked index' ' + test_when_finished "rm -rf repo" && + git init repo && + ( + cd repo && + test_commit A A.file && + echo change >A.file && + touch .git/index.lock && + + cat >expect <<-EOF && + error: could not write index + EOF + test_must_fail git stash push 2>err && + test_cmp expect err + ) +' + +test_expect_success 'stash apply reports a locked index' ' + test_when_finished "rm -rf repo" && + git init repo && + ( + cd repo && + test_commit A A.file && + echo change >A.file && + git stash push && + touch .git/index.lock && + + cat >expect <<-EOF && + error: could not write index + EOF + test_must_fail git stash apply 2>err && + test_cmp expect err + ) +' + test_done diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh index 5390eec4e3..1289ae3e07 100755 --- a/t/t3905-stash-include-untracked.sh +++ b/t/t3905-stash-include-untracked.sh @@ -404,7 +404,7 @@ test_expect_success 'stash show --include-untracked errors on duplicate files' ' ) && w_commit=$(git commit-tree -p HEAD -p "$i_commit" -p "$u_commit" -m "WIP on any-branch" "$tree") && test_must_fail git stash show --include-untracked "$w_commit" 2>err && - test_i18ngrep "worktree and untracked commit have duplicate entries: tracked" err + test_grep "worktree and untracked commit have duplicate entries: tracked" err ' test_expect_success 'stash show --{include,only}-untracked on stashes without untracked entries' ' diff --git a/t/t3909-stash-pathspec-file.sh b/t/t3909-stash-pathspec-file.sh index dead9f18d9..73f2dbdeb0 100755 --- a/t/t3909-stash-pathspec-file.sh +++ b/t/t3909-stash-pathspec-file.sh @@ -88,13 +88,13 @@ test_expect_success 'error conditions' ' echo fileA.t >list && test_must_fail git stash push --pathspec-from-file=list --patch 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err && test_must_fail git stash push --pathspec-from-file=list -- fileA.t 2>err && - test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && + test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && test_must_fail git stash push --pathspec-file-nul 2>err && - test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err + test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err ' test_done diff --git a/t/t4001-diff-rename.sh b/t/t4001-diff-rename.sh index 3dc9047044..49c042a38a 100755 --- a/t/t4001-diff-rename.sh +++ b/t/t4001-diff-rename.sh @@ -135,25 +135,25 @@ test_expect_success 'favour same basenames over different ones' ' mkdir subdir && git mv another-path subdir/path1 && git status >out && - test_i18ngrep "renamed: .*path1 -> subdir/path1" out + test_grep "renamed: .*path1 -> subdir/path1" out ' test_expect_success 'test diff.renames=true for git status' ' git -c diff.renames=true status >out && - test_i18ngrep "renamed: .*path1 -> subdir/path1" out + test_grep "renamed: .*path1 -> subdir/path1" out ' test_expect_success 'test diff.renames=false for git status' ' git -c diff.renames=false status >out && - test_i18ngrep ! "renamed: .*path1 -> subdir/path1" out && - test_i18ngrep "new file: .*subdir/path1" out && - test_i18ngrep "deleted: .*[^/]path1" out + test_grep ! "renamed: .*path1 -> subdir/path1" out && + test_grep "new file: .*subdir/path1" out && + test_grep "deleted: .*[^/]path1" out ' test_expect_success 'favour same basenames even with minor differences' ' git show HEAD:path1 | sed "s/15/16/" > subdir/path1 && git status >out && - test_i18ngrep "renamed: .*path1 -> subdir/path1" out + test_grep "renamed: .*path1 -> subdir/path1" out ' test_expect_success 'two files with same basename and same content' ' @@ -165,7 +165,7 @@ test_expect_success 'two files with same basename and same content' ' git commit -m 2 && git mv dir other-dir && git status >out && - test_i18ngrep "renamed: .*dir/A/file -> other-dir/A/file" out + test_grep "renamed: .*dir/A/file -> other-dir/A/file" out ' test_expect_success 'setup for many rename source candidates' ' @@ -202,9 +202,9 @@ test_expect_success 'rename pretty print with nothing in common' ' git mv a/b/c c/b/a && git commit -m "a/b/c -> c/b/a" && git diff -M --summary HEAD^ HEAD >output && - test_i18ngrep " a/b/c => c/b/a " output && + test_grep " a/b/c => c/b/a " output && git diff -M --stat HEAD^ HEAD >output && - test_i18ngrep " a/b/c => c/b/a " output + test_grep " a/b/c => c/b/a " output ' test_expect_success 'rename pretty print with common prefix' ' @@ -212,9 +212,9 @@ test_expect_success 'rename pretty print with common prefix' ' git mv c/b/a c/d/e && git commit -m "c/b/a -> c/d/e" && git diff -M --summary HEAD^ HEAD >output && - test_i18ngrep " c/{b/a => d/e} " output && + test_grep " c/{b/a => d/e} " output && git diff -M --stat HEAD^ HEAD >output && - test_i18ngrep " c/{b/a => d/e} " output + test_grep " c/{b/a => d/e} " output ' test_expect_success 'rename pretty print with common suffix' ' @@ -222,9 +222,9 @@ test_expect_success 'rename pretty print with common suffix' ' git mv c/d/e d/e && git commit -m "c/d/e -> d/e" && git diff -M --summary HEAD^ HEAD >output && - test_i18ngrep " {c/d => d}/e " output && + test_grep " {c/d => d}/e " output && git diff -M --stat HEAD^ HEAD >output && - test_i18ngrep " {c/d => d}/e " output + test_grep " {c/d => d}/e " output ' test_expect_success 'rename pretty print with common prefix and suffix' ' @@ -232,9 +232,9 @@ test_expect_success 'rename pretty print with common prefix and suffix' ' git mv d/e d/f/e && git commit -m "d/e -> d/f/e" && git diff -M --summary HEAD^ HEAD >output && - test_i18ngrep " d/{ => f}/e " output && + test_grep " d/{ => f}/e " output && git diff -M --stat HEAD^ HEAD >output && - test_i18ngrep " d/{ => f}/e " output + test_grep " d/{ => f}/e " output ' test_expect_success 'rename pretty print common prefix and suffix overlap' ' @@ -242,9 +242,9 @@ test_expect_success 'rename pretty print common prefix and suffix overlap' ' git mv d/f/e d/f/f/e && git commit -m "d/f/e d/f/f/e" && git diff -M --summary HEAD^ HEAD >output && - test_i18ngrep " d/f/{ => f}/e " output && + test_grep " d/f/{ => f}/e " output && git diff -M --stat HEAD^ HEAD >output && - test_i18ngrep " d/f/{ => f}/e " output + test_grep " d/f/{ => f}/e " output ' test_expect_success 'diff-tree -l0 defaults to a big rename limit, not zero' ' @@ -286,4 +286,28 @@ test_expect_success 'basename similarity vs best similarity' ' test_cmp expected actual ' +test_expect_success 'last line matters too' ' + { + test_write_lines a 0 1 2 3 4 5 6 7 8 9 && + printf "git ignores final up to 63 characters if not newline terminated" + } >no-final-lf && + git add no-final-lf && + git commit -m "original version of file with no final newline" && + + # Change ONLY the first character of the whole file + { + test_write_lines b 0 1 2 3 4 5 6 7 8 9 && + printf "git ignores final up to 63 characters if not newline terminated" + } >no-final-lf && + git add no-final-lf && + git mv no-final-lf still-absent-final-lf && + git commit -a -m "rename no-final-lf -> still-absent-final-lf" && + git diff-tree -r -M --name-status HEAD^ HEAD >actual && + sed -e "s/^R[0-9]* /R /" actual >actual.munged && + cat >expected <<-\EOF && + R no-final-lf still-absent-final-lf + EOF + test_cmp expected actual.munged +' + test_done diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh index 5de1d19075..1a7e2b0bcb 100755 --- a/t/t4013-diff-various.sh +++ b/t/t4013-diff-various.sh @@ -178,32 +178,29 @@ process_diffs () { V=$(git version | sed -e 's/^git version //' -e 's/\./\\./g') while read magic cmd do - status=success case "$magic" in '' | '#'*) continue ;; - :*) - magic=${magic#:} + :noellipses) + magic=noellipses label="$magic-$cmd" - case "$magic" in - noellipses) ;; - failure) - status=failure - magic= - label="$cmd" ;; - *) - BUG "unknown magic $magic" ;; - esac ;; + ;; + :*) + BUG "unknown magic $magic" + ;; *) - cmd="$magic $cmd" magic= - label="$cmd" ;; + cmd="$magic $cmd" + magic= + label="$cmd" + ;; esac + test=$(echo "$label" | sed -e 's|[/ ][/ ]*|_|g') pfx=$(printf "%04d" $test_count) expect="$TEST_DIRECTORY/t4013/diff.$test" actual="$pfx-diff.$test" - test_expect_$status "git $cmd # magic is ${magic:-(not used)}" ' + test_expect_success "git $cmd # magic is ${magic:-(not used)}" ' { echo "$ git $cmd" case "$magic" in @@ -473,6 +470,14 @@ test_expect_success 'log --diff-merges=on matches --diff-merges=separate' ' test_cmp expected actual ' +test_expect_success 'log --dd matches --diff-merges=1 -p' ' + git log --diff-merges=1 -p master >result && + process_diffs result >expected && + git log --dd master >result && + process_diffs result >actual && + test_cmp expected actual +' + test_expect_success 'deny wrong log.diffMerges config' ' test_config log.diffMerges wrong-value && test_expect_code 128 git log @@ -613,7 +618,7 @@ test_expect_success 'diff -I<regex> --stat' ' test_expect_success 'diff -I<regex>: detect malformed regex' ' test_expect_code 129 git diff --ignore-matching-lines="^[124-9" 2>error && - test_i18ngrep "invalid regex given to -I: " error + test_grep "invalid regex given to -I: " error ' # check_prefix <patch> <src> <dst> @@ -658,4 +663,10 @@ test_expect_success 'diff --default-prefix overrides diff.mnemonicprefix' ' check_prefix actual a/file0 b/file0 ' +test_expect_success 'diff --no-renames cannot be abbreviated' ' + test_expect_code 129 git diff --no-rename >actual 2>error && + test_must_be_empty actual && + grep "invalid option: --no-rename" error +' + test_done diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 3cf2b7a7fb..5ced27ed45 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -1373,7 +1373,27 @@ test_expect_success '--rfc' ' Subject: [RFC PATCH 1/1] header with . in it EOF git format-patch -n -1 --stdout --rfc >patch && - grep ^Subject: patch >actual && + grep "^Subject:" patch >actual && + test_cmp expect actual +' + +test_expect_success '--rfc does not overwrite prefix' ' + cat >expect <<-\EOF && + Subject: [RFC PATCH foobar 1/1] header with . in it + EOF + git -c format.subjectPrefix="PATCH foobar" \ + format-patch -n -1 --stdout --rfc >patch && + grep "^Subject:" patch >actual && + test_cmp expect actual +' + +test_expect_success '--rfc is argument order independent' ' + cat >expect <<-\EOF && + Subject: [RFC PATCH foobar 1/1] header with . in it + EOF + git format-patch -n -1 --stdout --rfc \ + --subject-prefix="PATCH foobar" >patch && + grep "^Subject:" patch >actual && test_cmp expect actual ' @@ -1991,6 +2011,20 @@ test_expect_success 'cover letter using branch description (6)' ' grep hello actual ' +test_expect_success 'cover letter with --description-file' ' + test_when_finished "rm -f description.txt" && + cat >description.txt <<-\EOF && + subject from file + + body from file + EOF + git checkout rebuild-1 && + git format-patch --stdout --cover-letter --cover-from-description auto \ + --description-file description.txt main >actual && + grep "^Subject: \[PATCH 0/2\] subject from file$" actual && + grep "^body from file$" actual +' + test_expect_success 'cover letter with nothing' ' git format-patch --stdout --cover-letter >actual && test_line_count = 0 actual @@ -2369,25 +2403,25 @@ test_expect_success 'interdiff: cover-letter' ' --q EOF git format-patch --cover-letter --interdiff=boop~2 -1 boop && - test_i18ngrep "^Interdiff:$" 0000-cover-letter.patch && - test_i18ngrep ! "^Interdiff:$" 0001-fleep.patch && + test_grep "^Interdiff:$" 0000-cover-letter.patch && + test_grep ! "^Interdiff:$" 0001-fleep.patch && sed "1,/^@@ /d; /^-- $/q" 0000-cover-letter.patch >actual && test_cmp expect actual ' test_expect_success 'interdiff: reroll-count' ' git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop && - test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch + test_grep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch ' test_expect_success 'interdiff: reroll-count with a non-integer' ' git format-patch --cover-letter --interdiff=boop~2 -v2.2 -1 boop && - test_i18ngrep "^Interdiff:$" v2.2-0000-cover-letter.patch + test_grep "^Interdiff:$" v2.2-0000-cover-letter.patch ' test_expect_success 'interdiff: reroll-count with a integer' ' git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop && - test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch + test_grep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch ' test_expect_success 'interdiff: solo-patch' ' @@ -2396,7 +2430,7 @@ test_expect_success 'interdiff: solo-patch' ' EOF git format-patch --interdiff=boop~2 -1 boop && - test_i18ngrep "^Interdiff:$" 0001-fleep.patch && + test_grep "^Interdiff:$" 0001-fleep.patch && sed "1,/^ @@ /d; /^$/q" 0001-fleep.patch >actual && test_cmp expect actual ' diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh index fcd2473e52..b443626afd 100755 --- a/t/t4015-diff-whitespace.sh +++ b/t/t4015-diff-whitespace.sh @@ -946,7 +946,7 @@ test_expect_success 'combined diff with autocrlf conversion' ' git commit -m "the other side" x && git config core.autocrlf true && test_must_fail git merge one-side >actual && - test_i18ngrep "Automatic merge failed" actual && + test_grep "Automatic merge failed" actual && git diff >actual.raw && sed -e "1,/^@@@/d" actual.raw >actual && @@ -2224,27 +2224,27 @@ test_expect_success 'compare whitespace delta across moved blocks' ' test_expect_success 'bogus settings in move detection erroring out' ' test_must_fail git diff --color-moved=bogus 2>err && - test_i18ngrep "must be one of" err && - test_i18ngrep bogus err && + test_grep "must be one of" err && + test_grep bogus err && test_must_fail git -c diff.colormoved=bogus diff 2>err && - test_i18ngrep "must be one of" err && - test_i18ngrep "from command-line config" err && + test_grep "must be one of" err && + test_grep "from command-line config" err && test_must_fail git diff --color-moved-ws=bogus 2>err && - test_i18ngrep "possible values" err && - test_i18ngrep bogus err && + test_grep "possible values" err && + test_grep bogus err && test_must_fail git -c diff.colormovedws=bogus diff 2>err && - test_i18ngrep "possible values" err && - test_i18ngrep "from command-line config" err + test_grep "possible values" err && + test_grep "from command-line config" err ' test_expect_success 'compare whitespace delta incompatible with other space options' ' test_must_fail git diff \ --color-moved-ws=allow-indentation-change,ignore-all-space \ 2>err && - test_i18ngrep allow-indentation-change err + test_grep allow-indentation-change err ' EMPTY='' diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh index c8d555771d..e026fac1f4 100755 --- a/t/t4018-diff-funcname.sh +++ b/t/t4018-diff-funcname.sh @@ -53,15 +53,15 @@ do echo "*.java diff=$p" >.gitattributes && test_expect_code 1 git diff --no-index \ A.java B.java 2>msg && - test_i18ngrep ! fatal msg && - test_i18ngrep ! error msg + test_grep ! fatal msg && + test_grep ! error msg ' test_expect_success "builtin $p wordRegex pattern compiles" ' echo "*.java diff=$p" >.gitattributes && test_expect_code 1 git diff --no-index --word-diff \ A.java B.java 2>msg && - test_i18ngrep ! fatal msg && - test_i18ngrep ! error msg + test_grep ! fatal msg && + test_grep ! error msg ' test_expect_success "builtin $p pattern compiles on bare repo with --attr-source" ' @@ -79,8 +79,8 @@ do git -C bare.git symbolic-ref HEAD refs/heads/master && test_expect_code 1 git -C bare.git --attr-source=branchA \ diff --exit-code HEAD:A.java HEAD:B.java 2>msg && - test_i18ngrep ! fatal msg && - test_i18ngrep ! error msg + test_grep ! fatal msg && + test_grep ! error msg ' done @@ -88,7 +88,7 @@ test_expect_success 'last regexp must not be negated' ' echo "*.java diff=java" >.gitattributes && test_config diff.java.funcname "!static" && test_expect_code 128 git diff --no-index A.java B.java 2>msg && - test_i18ngrep ": Last expression must not be negated:" msg + test_grep ": Last expression must not be negated:" msg ' test_expect_success 'setup hunk header tests' ' diff --git a/t/t4031-diff-rewrite-binary.sh b/t/t4031-diff-rewrite-binary.sh index eacc6694f7..c4394a27b5 100755 --- a/t/t4031-diff-rewrite-binary.sh +++ b/t/t4031-diff-rewrite-binary.sh @@ -53,7 +53,7 @@ test_expect_success 'rewrite diff --numstat shows binary changes' ' test_expect_success 'diff --stat counts binary rewrite as 0 lines' ' git diff -B --stat --summary >diff && grep "Bin" diff && - test_i18ngrep "0 insertions.*0 deletions" diff && + test_grep "0 insertions.*0 deletions" diff && grep " rewrite file" diff ' diff --git a/t/t4047-diff-dirstat.sh b/t/t4047-diff-dirstat.sh index 70224c3da1..7b73462d53 100755 --- a/t/t4047-diff-dirstat.sh +++ b/t/t4047-diff-dirstat.sh @@ -943,37 +943,37 @@ test_expect_success '--dirstat=future_param,lines,0 should fail loudly' ' test_must_fail git diff --dirstat=future_param,lines,0 HEAD^..HEAD >actual_diff_dirstat 2>actual_error && test_debug "cat actual_error" && test_must_be_empty actual_diff_dirstat && - test_i18ngrep -q "future_param" actual_error && - test_i18ngrep -q "\--dirstat" actual_error + test_grep -q "future_param" actual_error && + test_grep -q "\--dirstat" actual_error ' test_expect_success '--dirstat=dummy1,cumulative,2dummy should report both unrecognized parameters' ' test_must_fail git diff --dirstat=dummy1,cumulative,2dummy HEAD^..HEAD >actual_diff_dirstat 2>actual_error && test_debug "cat actual_error" && test_must_be_empty actual_diff_dirstat && - test_i18ngrep -q "dummy1" actual_error && - test_i18ngrep -q "2dummy" actual_error && - test_i18ngrep -q "\--dirstat" actual_error + test_grep -q "dummy1" actual_error && + test_grep -q "2dummy" actual_error && + test_grep -q "\--dirstat" actual_error ' test_expect_success 'diff.dirstat=future_param,0,lines should warn, but still work' ' git -c diff.dirstat=future_param,0,lines diff --dirstat HEAD^..HEAD >actual_diff_dirstat 2>actual_error && test_debug "cat actual_error" && test_cmp expect_diff_dirstat actual_diff_dirstat && - test_i18ngrep -q "future_param" actual_error && - test_i18ngrep -q "diff\\.dirstat" actual_error && + test_grep -q "future_param" actual_error && + test_grep -q "diff\\.dirstat" actual_error && git -c diff.dirstat=future_param,0,lines diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M 2>actual_error && test_debug "cat actual_error" && test_cmp expect_diff_dirstat_M actual_diff_dirstat_M && - test_i18ngrep -q "future_param" actual_error && - test_i18ngrep -q "diff\\.dirstat" actual_error && + test_grep -q "future_param" actual_error && + test_grep -q "diff\\.dirstat" actual_error && git -c diff.dirstat=future_param,0,lines diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC 2>actual_error && test_debug "cat actual_error" && test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC && - test_i18ngrep -q "future_param" actual_error && - test_i18ngrep -q "diff\\.dirstat" actual_error + test_grep -q "future_param" actual_error && + test_grep -q "diff\\.dirstat" actual_error ' test_expect_success '--shortstat --dirstat should output only one dirstat' ' diff --git a/t/t4052-stat-output.sh b/t/t4052-stat-output.sh index 3ee27e277d..7badd72488 100755 --- a/t/t4052-stat-output.sh +++ b/t/t4052-stat-output.sh @@ -12,7 +12,7 @@ TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh . "$TEST_DIRECTORY"/lib-terminal.sh -# 120 character name +# 120-character name name=aaaaaaaaaa name=$name$name$name$name$name$name$name$name$name$name$name$name test_expect_success 'preparation' ' @@ -49,12 +49,41 @@ log -1 --stat EOF cat >expect.60 <<-'EOF' - ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + + ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + EOF cat >expect.6030 <<-'EOF' ...aaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + EOF -cat >expect2.60 <<-'EOF' +while read verb expect cmd args +do + # No width limit applied when statNameWidth is ignored + case "$expect" in expect72|expect.6030) + test_expect_success "$cmd $verb diff.statNameWidth with long name" ' + git -c diff.statNameWidth=30 $cmd $args >output && + grep " | " output >actual && + test_cmp $expect actual + ';; + esac + # Maximum width limit still applied when statNameWidth is ignored + case "$expect" in expect.60|expect.6030) + test_expect_success "$cmd --stat=width $verb diff.statNameWidth with long name" ' + git -c diff.statNameWidth=30 $cmd $args --stat=60 >output && + grep " | " output >actual && + test_cmp $expect actual + ';; + esac +done <<\EOF +ignores expect72 format-patch -1 --stdout +ignores expect.60 format-patch -1 --stdout +respects expect.6030 diff HEAD^ HEAD --stat +respects expect.6030 show --stat +respects expect.6030 log -1 --stat +EOF + +cat >expect.40 <<-'EOF' + ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + +EOF +cat >expect2.40 <<-'EOF' ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + EOF @@ -67,22 +96,22 @@ do test_expect_success "$cmd --stat=width: a long name is given more room when the bar is short" ' git $cmd $args --stat=40 >output && grep " | " output >actual && - test_cmp $expect.60 actual + test_cmp $expect.40 actual ' test_expect_success "$cmd --stat-width=width with long name" ' git $cmd $args --stat-width=40 >output && grep " | " output >actual && - test_cmp $expect.60 actual + test_cmp $expect.40 actual ' - test_expect_success "$cmd --stat=...,name-width with long name" ' + test_expect_success "$cmd --stat=width,name-width with long name" ' git $cmd $args --stat=60,30 >output && grep " | " output >actual && test_cmp $expect.6030 actual ' - test_expect_success "$cmd --stat-name-width with long name" ' + test_expect_success "$cmd --stat-name-width=width with long name" ' git $cmd $args --stat-name-width=30 >output && grep " | " output >actual && test_cmp $expect.6030 actual @@ -94,8 +123,7 @@ expect show --stat expect log -1 --stat EOF - -test_expect_success 'preparation for big change tests' ' +test_expect_success 'preparation for big-change tests' ' >abcd && git add abcd && git commit -m message && @@ -111,7 +139,7 @@ cat >expect72 <<'EOF' abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EOF -test_expect_success "format-patch --cover-letter ignores COLUMNS (big change)" ' +test_expect_success "format-patch --cover-letter ignores COLUMNS with big change" ' COLUMNS=200 git format-patch -1 --stdout --cover-letter >output && grep " | " output >actual && test_cmp expect72 actual @@ -131,7 +159,7 @@ cat >expect200-graph <<'EOF' EOF while read verb expect cmd args do - test_expect_success "$cmd $verb COLUMNS (big change)" ' + test_expect_success "$cmd $verb COLUMNS with big change" ' COLUMNS=200 git $cmd $args >output && grep " | " output >actual && test_cmp "$expect" actual @@ -139,7 +167,7 @@ do case "$cmd" in diff|show) continue;; esac - test_expect_success "$cmd --graph $verb COLUMNS (big change)" ' + test_expect_success "$cmd --graph $verb COLUMNS with big change" ' COLUMNS=200 git $cmd $args --graph >output && grep " | " output >actual && test_cmp "$expect-graph" actual @@ -159,7 +187,7 @@ cat >expect40-graph <<'EOF' EOF while read verb expect cmd args do - test_expect_success "$cmd $verb not enough COLUMNS (big change)" ' + test_expect_success "$cmd $verb not enough COLUMNS with big change" ' COLUMNS=40 git $cmd $args >output && grep " | " output >actual && test_cmp "$expect" actual @@ -167,7 +195,7 @@ do case "$cmd" in diff|show) continue;; esac - test_expect_success "$cmd --graph $verb not enough COLUMNS (big change)" ' + test_expect_success "$cmd --graph $verb not enough COLUMNS with big change" ' COLUMNS=40 git $cmd $args --graph >output && grep " | " output >actual && test_cmp "$expect-graph" actual @@ -187,7 +215,7 @@ cat >expect40-graph <<'EOF' EOF while read verb expect cmd args do - test_expect_success "$cmd $verb statGraphWidth config" ' + test_expect_success "$cmd $verb diff.statGraphWidth" ' git -c diff.statGraphWidth=26 $cmd $args >output && grep " | " output >actual && test_cmp "$expect" actual @@ -195,7 +223,7 @@ do case "$cmd" in diff|show) continue;; esac - test_expect_success "$cmd --graph $verb statGraphWidth config" ' + test_expect_success "$cmd --graph $verb diff.statGraphWidth" ' git -c diff.statGraphWidth=26 $cmd $args --graph >output && grep " | " output >actual && test_cmp "$expect-graph" actual @@ -207,7 +235,6 @@ respects expect40 show --stat respects expect40 log -1 --stat EOF - cat >expect <<'EOF' abcd | 1000 ++++++++++++++++++++++++++ EOF @@ -228,7 +255,7 @@ do test_cmp expect actual ' - test_expect_success "$cmd --stat-graph-width with big change" ' + test_expect_success "$cmd --stat-graph-width=width with big change" ' git $cmd $args --stat-graph-width=26 >output && grep " | " output >actual && test_cmp expect actual @@ -242,7 +269,7 @@ do test_cmp expect-graph actual ' - test_expect_success "$cmd --stat-graph-width --graph with big change" ' + test_expect_success "$cmd --stat-graph-width=width --graph with big change" ' git $cmd $args --stat-graph-width=26 --graph >output && grep " | " output >actual && test_cmp expect-graph actual @@ -254,7 +281,7 @@ show --stat log -1 --stat EOF -test_expect_success 'preparation for long filename tests' ' +test_expect_success 'preparation for long-name tests' ' cp abcd aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa && git add aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa && git commit -m message @@ -302,7 +329,7 @@ cat >expect200-graph <<'EOF' EOF while read verb expect cmd args do - test_expect_success "$cmd $verb COLUMNS (long filename)" ' + test_expect_success "$cmd $verb COLUMNS with long name" ' COLUMNS=200 git $cmd $args >output && grep " | " output >actual && test_cmp "$expect" actual @@ -310,7 +337,7 @@ do case "$cmd" in diff|show) continue;; esac - test_expect_success "$cmd --graph $verb COLUMNS (long filename)" ' + test_expect_success "$cmd --graph $verb COLUMNS with long name" ' COLUMNS=200 git $cmd $args --graph >output && grep " | " output >actual && test_cmp "$expect-graph" actual @@ -331,7 +358,7 @@ EOF while read verb expect cmd args do test_expect_success COLUMNS_CAN_BE_1 \ - "$cmd $verb prefix greater than COLUMNS (big change)" ' + "$cmd $verb prefix greater than COLUMNS with big change" ' COLUMNS=1 git $cmd $args >output && grep " | " output >actual && test_cmp "$expect" actual @@ -340,7 +367,7 @@ do case "$cmd" in diff|show) continue;; esac test_expect_success COLUMNS_CAN_BE_1 \ - "$cmd --graph $verb prefix greater than COLUMNS (big change)" ' + "$cmd --graph $verb prefix greater than COLUMNS with big change" ' COLUMNS=1 git $cmd $args --graph >output && grep " | " output >actual && test_cmp "$expect-graph" actual @@ -355,8 +382,14 @@ EOF cat >expect <<'EOF' abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EOF -test_expect_success 'merge --stat respects COLUMNS (big change)' ' - git checkout -b branch HEAD^^ && +test_expect_success 'merge --stat respects diff.statGraphWidth with big change' ' + git checkout -b branch1 HEAD^^ && + git -c diff.statGraphWidth=26 merge --stat --no-ff main^ >output && + grep " | " output >actual && + test_cmp expect40 actual +' +test_expect_success 'merge --stat respects COLUMNS with big change' ' + git checkout -b branch2 HEAD^^ && COLUMNS=100 git merge --stat --no-ff main^ >output && grep " | " output >actual && test_cmp expect actual @@ -365,7 +398,17 @@ test_expect_success 'merge --stat respects COLUMNS (big change)' ' cat >expect <<'EOF' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 +++++++++++++++++++++++++++++++++++++++ EOF -test_expect_success 'merge --stat respects COLUMNS (long filename)' ' +cat >expect.30 <<'EOF' + ...aaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++++++++++++++++++++++++++++++ +EOF +test_expect_success 'merge --stat respects diff.statNameWidth with long name' ' + git switch branch1 && + git -c diff.statNameWidth=30 merge --stat --no-ff main >output && + grep " | " output >actual && + test_cmp expect.30 actual +' +test_expect_success 'merge --stat respects COLUMNS with long name' ' + git switch branch2 && COLUMNS=100 git merge --stat --no-ff main >output && grep " | " output >actual && test_cmp expect actual diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh index 5f059f65fc..651ec77660 100755 --- a/t/t4053-diff-no-index.sh +++ b/t/t4053-diff-no-index.sh @@ -56,7 +56,7 @@ test_expect_success 'git diff --no-index executed outside repo gives correct err export GIT_CEILING_DIRECTORIES && cd non/git && test_must_fail git diff --no-index a 2>actual.err && - test_i18ngrep "usage: git diff --no-index" actual.err + test_grep "usage: git diff --no-index" actual.err ) ' @@ -205,6 +205,18 @@ test_expect_success POSIXPERM,SYMLINKS 'diff --no-index normalizes: mode not lik test_cmp expected actual ' +test_expect_success POSIXPERM 'external diff with mode-only change' ' + echo content >not-executable && + echo content >executable && + chmod +x executable && + echo executable executable $(test_oid zero) 100755 \ + not-executable $(test_oid zero) 100644 not-executable \ + >expect && + test_expect_code 1 git -c diff.external=echo diff \ + --no-index executable not-executable >actual && + test_cmp expect actual +' + test_expect_success "diff --no-index treats '-' as stdin" ' cat >expect <<-EOF && diff --git a/- b/a/1 diff --git a/t/t4055-diff-context.sh b/t/t4055-diff-context.sh index 73048d0a52..3ea9ae99e0 100755 --- a/t/t4055-diff-context.sh +++ b/t/t4055-diff-context.sh @@ -74,13 +74,13 @@ test_expect_success 'plumbing not affected' ' test_expect_success 'non-integer config parsing' ' git config diff.context no && test_must_fail git diff 2>output && - test_i18ngrep "bad numeric config value" output + test_grep "bad numeric config value" output ' test_expect_success 'negative integer config parsing' ' git config diff.context -1 && test_must_fail git diff 2>output && - test_i18ngrep "bad config variable" output + test_grep "bad config variable" output ' test_expect_success '-U0 is valid, so is diff.context=0' ' diff --git a/t/t4068-diff-symmetric-merge-base.sh b/t/t4068-diff-symmetric-merge-base.sh index 2d650d8f10..eff63c16b0 100755 --- a/t/t4068-diff-symmetric-merge-base.sh +++ b/t/t4068-diff-symmetric-merge-base.sh @@ -34,7 +34,7 @@ test_expect_success setup ' echo c >c && git add c && git commit -m C && - git tag commit-C && + git tag -m commit-C commit-C && git merge -m D main && git tag commit-D && git checkout main && @@ -68,27 +68,27 @@ test_expect_success 'diff with two merge bases' ' test_expect_success 'diff with no merge bases' ' test_must_fail git diff br2...br3 2>err && - test_i18ngrep "fatal: br2...br3: no merge base" err + test_grep "fatal: br2...br3: no merge base" err ' test_expect_success 'diff with too many symmetric differences' ' test_must_fail git diff br1...main br2...br3 2>err && - test_i18ngrep "usage" err + test_grep "usage" err ' test_expect_success 'diff with symmetric difference and extraneous arg' ' test_must_fail git diff main br1...main 2>err && - test_i18ngrep "usage" err + test_grep "usage" err ' test_expect_success 'diff with two ranges' ' test_must_fail git diff main br1..main br2..br3 2>err && - test_i18ngrep "usage" err + test_grep "usage" err ' test_expect_success 'diff with ranges and extra arg' ' test_must_fail git diff main br1..main commit-D 2>err && - test_i18ngrep "usage" err + test_grep "usage" err ' test_expect_success 'diff --merge-base with no commits' ' @@ -97,7 +97,7 @@ test_expect_success 'diff --merge-base with no commits' ' test_expect_success 'diff --merge-base with three commits' ' test_must_fail git diff --merge-base br1 br2 main 2>err && - test_i18ngrep "usage" err + test_grep "usage" err ' for cmd in diff-index diff @@ -109,6 +109,13 @@ do test_cmp expect actual ' + test_expect_success "$cmd --merge-base with annotated tag" ' + git checkout main && + git $cmd commit-C >expect && + git $cmd --merge-base commit-C >actual && + test_cmp expect actual + ' + test_expect_success "$cmd --merge-base with one commit and unstaged changes" ' git checkout main && test_when_finished git reset --hard && @@ -143,19 +150,19 @@ do test_expect_success "$cmd --merge-base with non-commit" ' git checkout main && test_must_fail git $cmd --merge-base main^{tree} 2>err && - test_i18ngrep "fatal: --merge-base only works with commits" err + test_grep "is a tree, not a commit" err ' test_expect_success "$cmd --merge-base with no merge bases and one commit" ' git checkout main && test_must_fail git $cmd --merge-base br3 2>err && - test_i18ngrep "fatal: no merge base found" err + test_grep "fatal: no merge base found" err ' test_expect_success "$cmd --merge-base with multiple merge bases and one commit" ' git checkout main && test_must_fail git $cmd --merge-base br1 2>err && - test_i18ngrep "fatal: multiple merge bases found" err + test_grep "fatal: multiple merge bases found" err ' done @@ -169,28 +176,28 @@ do test_expect_success "$cmd --merge-base commit and non-commit" ' test_must_fail git $cmd --merge-base br2 main^{tree} 2>err && - test_i18ngrep "fatal: --merge-base only works with commits" err + test_grep "is a tree, not a commit" err ' test_expect_success "$cmd --merge-base with no merge bases and two commits" ' test_must_fail git $cmd --merge-base br2 br3 2>err && - test_i18ngrep "fatal: no merge base found" err + test_grep "fatal: no merge base found" err ' test_expect_success "$cmd --merge-base with multiple merge bases and two commits" ' test_must_fail git $cmd --merge-base main br1 2>err && - test_i18ngrep "fatal: multiple merge bases found" err + test_grep "fatal: multiple merge bases found" err ' done test_expect_success 'diff-tree --merge-base with one commit' ' test_must_fail git diff-tree --merge-base main 2>err && - test_i18ngrep "fatal: --merge-base only works with two commits" err + test_grep "fatal: --merge-base only works with two commits" err ' test_expect_success 'diff --merge-base with range' ' test_must_fail git diff --merge-base br2..br3 2>err && - test_i18ngrep "fatal: --merge-base does not work with ranges" err + test_grep "fatal: --merge-base does not work with ranges" err ' test_done diff --git a/t/t4115-apply-symlink.sh b/t/t4115-apply-symlink.sh index a22a90d552..cbef0a593f 100755 --- a/t/t4115-apply-symlink.sh +++ b/t/t4115-apply-symlink.sh @@ -136,7 +136,7 @@ test_expect_success SYMLINKS '--reject removes .rej symlink if it exists' ' ln -s foo file.t.rej && test_must_fail git apply patch --reject 2>err && - test_i18ngrep "Rejected hunk" err && + test_grep "Rejected hunk" err && test_path_is_missing foo && test_path_is_file file.t.rej ' diff --git a/t/t4120-apply-popt.sh b/t/t4120-apply-popt.sh index 497b62868d..697e86c0ff 100755 --- a/t/t4120-apply-popt.sh +++ b/t/t4120-apply-popt.sh @@ -31,7 +31,7 @@ test_expect_success 'apply git diff with -p2' ' test_expect_success 'apply with too large -p' ' cp file1.saved file1 && test_must_fail git apply --stat -p3 patch.file 2>err && - test_i18ngrep "removing 3 leading" err + test_grep "removing 3 leading" err ' test_expect_success 'apply (-p2) traditional diff with funny filenames' ' @@ -53,7 +53,7 @@ test_expect_success 'apply (-p2) traditional diff with funny filenames' ' test_expect_success 'apply with too large -p and fancy filename' ' cp file1.saved file1 && test_must_fail git apply --stat -p3 patch.escaped 2>err && - test_i18ngrep "removing 3 leading" err + test_grep "removing 3 leading" err ' test_expect_success 'apply (-p2) diff, mode change only' ' diff --git a/t/t4122-apply-symlink-inside.sh b/t/t4122-apply-symlink-inside.sh index 9696537303..2089d84f64 100755 --- a/t/t4122-apply-symlink-inside.sh +++ b/t/t4122-apply-symlink-inside.sh @@ -95,19 +95,19 @@ test_expect_success SYMLINKS 'do not follow symbolic link (same input)' ' # same input creates a confusing symbolic link test_must_fail git apply patch 2>error-wt && - test_i18ngrep "beyond a symbolic link" error-wt && + test_grep "beyond a symbolic link" error-wt && test_path_is_missing arch/x86_64/dir && test_path_is_missing arch/i386/dir/file && test_must_fail git apply --index patch 2>error-ix && - test_i18ngrep "beyond a symbolic link" error-ix && + test_grep "beyond a symbolic link" error-ix && test_path_is_missing arch/x86_64/dir && test_path_is_missing arch/i386/dir/file && test_must_fail git ls-files --error-unmatch arch/x86_64/dir && test_must_fail git ls-files --error-unmatch arch/i386/dir && test_must_fail git apply --cached patch 2>error-ct && - test_i18ngrep "beyond a symbolic link" error-ct && + test_grep "beyond a symbolic link" error-ct && test_must_fail git ls-files --error-unmatch arch/x86_64/dir && test_must_fail git ls-files --error-unmatch arch/i386/dir && @@ -135,23 +135,23 @@ test_expect_success SYMLINKS 'do not follow symbolic link (existing)' ' git add arch/x86_64/dir && test_must_fail git apply add_file.patch 2>error-wt-add && - test_i18ngrep "beyond a symbolic link" error-wt-add && + test_grep "beyond a symbolic link" error-wt-add && test_path_is_missing arch/i386/dir/file && mkdir arch/i386/dir && >arch/i386/dir/file && test_must_fail git apply del_file.patch 2>error-wt-del && - test_i18ngrep "beyond a symbolic link" error-wt-del && + test_grep "beyond a symbolic link" error-wt-del && test_path_is_file arch/i386/dir/file && rm arch/i386/dir/file && test_must_fail git apply --index add_file.patch 2>error-ix-add && - test_i18ngrep "beyond a symbolic link" error-ix-add && + test_grep "beyond a symbolic link" error-ix-add && test_path_is_missing arch/i386/dir/file && test_must_fail git ls-files --error-unmatch arch/i386/dir && test_must_fail git apply --cached add_file.patch 2>error-ct-file && - test_i18ngrep "beyond a symbolic link" error-ct-file && + test_grep "beyond a symbolic link" error-ct-file && test_must_fail git ls-files --error-unmatch arch/i386/dir ' diff --git a/t/t4129-apply-samemode.sh b/t/t4129-apply-samemode.sh index a1c7686519..e7a7295f1b 100755 --- a/t/t4129-apply-samemode.sh +++ b/t/t4129-apply-samemode.sh @@ -66,13 +66,13 @@ test_expect_success FILEMODE 'mode update (index only)' ' test_expect_success FILEMODE 'empty mode is rejected' ' git reset --hard && test_must_fail git apply patch-empty-mode.txt 2>err && - test_i18ngrep "invalid mode" err + test_grep "invalid mode" err ' test_expect_success FILEMODE 'bogus mode is rejected' ' git reset --hard && test_must_fail git apply patch-bogus-mode.txt 2>err && - test_i18ngrep "invalid mode" err + test_grep "invalid mode" err ' test_expect_success POSIXPERM 'do not use core.sharedRepository for working tree files' ' diff --git a/t/t4133-apply-filenames.sh b/t/t4133-apply-filenames.sh index 35f1060bc8..c21ddb2946 100755 --- a/t/t4133-apply-filenames.sh +++ b/t/t4133-apply-filenames.sh @@ -32,9 +32,9 @@ EOF test_expect_success 'apply diff with inconsistent filenames in headers' ' test_must_fail git apply bad1.patch 2>err && - test_i18ngrep "inconsistent new filename" err && + test_grep "inconsistent new filename" err && test_must_fail git apply bad2.patch 2>err && - test_i18ngrep "inconsistent old filename" err + test_grep "inconsistent old filename" err ' test_expect_success 'apply diff with new filename missing from headers' ' @@ -46,7 +46,7 @@ test_expect_success 'apply diff with new filename missing from headers' ' +1 EOF test_must_fail git apply missing_new_filename.diff 2>err && - test_i18ngrep "lacks filename information" err + test_grep "lacks filename information" err ' test_expect_success 'apply diff with old filename missing from headers' ' @@ -58,7 +58,7 @@ test_expect_success 'apply diff with old filename missing from headers' ' -1 EOF test_must_fail git apply missing_old_filename.diff 2>err && - test_i18ngrep "lacks filename information" err + test_grep "lacks filename information" err ' test_done diff --git a/t/t4150-am.sh b/t/t4150-am.sh index 2935fe1b2d..3b12576269 100755 --- a/t/t4150-am.sh +++ b/t/t4150-am.sh @@ -779,7 +779,7 @@ test_expect_success 'am --resolved fails if index has unmerged entries' ' test_must_fail git am --resolved >err && test_path_is_dir .git/rebase-apply && test_cmp_rev second HEAD && - test_i18ngrep "still have unmerged paths" err + test_grep "still have unmerged paths" err ' test_expect_success 'am takes patches from a Pine mailbox' ' @@ -913,7 +913,7 @@ test_expect_success 'am newline in subject' ' test_tick && sed -e "s/second/second \\\n foo/" patch1 >patchnl && git am <patchnl >output.out 2>&1 && - test_i18ngrep "^Applying: second \\\n foo$" output.out + test_grep "^Applying: second \\\n foo$" output.out ' test_expect_success 'am -q is quiet' ' diff --git a/t/t4151-am-abort.sh b/t/t4151-am-abort.sh index 5ed7e22827..edb38da701 100755 --- a/t/t4151-am-abort.sh +++ b/t/t4151-am-abort.sh @@ -46,7 +46,7 @@ do test_expect_success "am$with3 --skip continue after failed am$with3" ' test_must_fail git am$with3 --skip >output && - test_i18ngrep "^Applying: 6$" output && + test_grep "^Applying: 6$" output && test_cmp file-2-expect file-2 && test ! -f .git/MERGE_RR ' diff --git a/t/t4153-am-resume-override-opts.sh b/t/t4153-am-resume-override-opts.sh index b7c3861407..4add7c7757 100755 --- a/t/t4153-am-resume-override-opts.sh +++ b/t/t4153-am-resume-override-opts.sh @@ -53,7 +53,7 @@ test_expect_success '--no-quiet overrides --quiet' ' # Applying side1 will be quiet. test_must_fail git am --quiet side[123].eml >out && test_path_is_dir .git/rebase-apply && - test_i18ngrep ! "^Applying: " out && + test_grep ! "^Applying: " out && echo side1 >file && git add file && diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh index 7025cfdae5..fb53dddf79 100755 --- a/t/t4200-rerere.sh +++ b/t/t4200-rerere.sh @@ -433,13 +433,13 @@ test_expect_success 'rerere --no-no-rerere-autoupdate' ' git update-index --index-info <failedmerge && cp file3.conflict file3 && test_must_fail git rerere --no-no-rerere-autoupdate 2>err && - test_i18ngrep [Uu]sage err && + test_grep [Uu]sage err && test_must_fail git update-index --refresh ' test_expect_success 'rerere -h' ' test_must_fail git rerere -h >help && - test_i18ngrep [Uu]sage help + test_grep [Uu]sage help ' concat_insert () { diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh index 8e4effebdb..d7382709fc 100755 --- a/t/t4201-shortlog.sh +++ b/t/t4201-shortlog.sh @@ -139,7 +139,7 @@ test_expect_success !MINGW 'shortlog can read --format=raw output' ' test_expect_success 'shortlog from non-git directory refuses extra arguments' ' test_must_fail env GIT_DIR=non-existing git shortlog foo 2>out && - test_i18ngrep "too many arguments" out + test_grep "too many arguments" out ' test_expect_success 'shortlog should add newline when input line matches wraplen' ' diff --git a/t/t4202-log.sh b/t/t4202-log.sh index af4a123cd2..708636671a 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -1884,7 +1884,7 @@ test_expect_success '--no-graph does not unset --parents' ' test_expect_success '--reverse and --graph conflict' ' test_must_fail git log --reverse --graph 2>stderr && - test_i18ngrep "cannot be used together" stderr + test_grep "cannot be used together" stderr ' test_expect_success '--reverse --graph --no-graph works' ' @@ -1895,7 +1895,7 @@ test_expect_success '--reverse --graph --no-graph works' ' test_expect_success '--show-linear-break and --graph conflict' ' test_must_fail git log --show-linear-break --graph 2>stderr && - test_i18ngrep "cannot be used together" stderr + test_grep "cannot be used together" stderr ' test_expect_success '--show-linear-break --graph --no-graph works' ' @@ -1906,7 +1906,7 @@ test_expect_success '--show-linear-break --graph --no-graph works' ' test_expect_success '--no-walk and --graph conflict' ' test_must_fail git log --no-walk --graph 2>stderr && - test_i18ngrep "cannot be used together" stderr + test_grep "cannot be used together" stderr ' test_expect_success '--no-walk --graph --no-graph works' ' @@ -1917,8 +1917,8 @@ test_expect_success '--no-walk --graph --no-graph works' ' test_expect_success '--walk-reflogs and --graph conflict' ' test_must_fail git log --walk-reflogs --graph 2>stderr && - (test_i18ngrep "cannot combine" stderr || - test_i18ngrep "cannot be used together" stderr) + (test_grep "cannot combine" stderr || + test_grep "cannot be used together" stderr) ' test_expect_success '--walk-reflogs --graph --no-graph works' ' @@ -2252,7 +2252,7 @@ test_expect_success 'log on empty repo fails' ' git init empty && test_when_finished "rm -rf empty" && test_must_fail git -C empty log 2>stderr && - test_i18ngrep does.not.have.any.commits stderr + test_grep does.not.have.any.commits stderr ' test_expect_success REFFILES 'log diagnoses bogus HEAD hash' ' @@ -2260,16 +2260,16 @@ test_expect_success REFFILES 'log diagnoses bogus HEAD hash' ' test_when_finished "rm -rf empty" && echo 1234abcd >empty/.git/refs/heads/main && test_must_fail git -C empty log 2>stderr && - test_i18ngrep broken stderr + test_grep broken stderr ' test_expect_success REFFILES 'log diagnoses bogus HEAD symref' ' git init empty && echo "ref: refs/heads/invalid.lock" > empty/.git/HEAD && test_must_fail git -C empty log 2>stderr && - test_i18ngrep broken stderr && + test_grep broken stderr && test_must_fail git -C empty log --default totally-bogus 2>stderr && - test_i18ngrep broken stderr + test_grep broken stderr ' test_expect_success 'log does not default to HEAD when rev input is given' ' diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh index 2016132f51..8a88dd7900 100755 --- a/t/t4203-mailmap.sh +++ b/t/t4203-mailmap.sh @@ -360,7 +360,7 @@ test_expect_success 'mailmap.blob might be the wrong type' ' cp default.map .mailmap && git -c mailmap.blob=HEAD: shortlog HEAD >actual 2>err && - test_i18ngrep "mailmap is not a blob" err && + test_grep "mailmap is not a blob" err && test_cmp expect actual ' diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index dd9035aa38..e3d655e6b8 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -576,6 +576,38 @@ test_expect_success 'clean log decoration' ' test_cmp expected actual1 ' +test_expect_success 'pretty format %decorate' ' + git checkout -b foo && + git commit --allow-empty -m "new commit" && + git tag bar && + git branch qux && + + echo " (HEAD -> foo, tag: bar, qux)" >expect1 && + git log --format="%(decorate)" -1 >actual1 && + test_cmp expect1 actual1 && + + echo "HEAD -> foo, tag: bar, qux" >expect2 && + git log --format="%(decorate:prefix=,suffix=)" -1 >actual2 && + test_cmp expect2 actual2 && + + echo "[ bar; qux; foo ]" >expect3 && + git log --format="%(decorate:prefix=[ ,suffix= ],separator=%x3B ,tag=)" \ + --decorate-refs=refs/ -1 >actual3 && + test_cmp expect3 actual3 && + + # Try with a typo (in "separator"), in which case the placeholder should + # not be replaced. + echo "%(decorate:prefix=[ ,suffix= ],separater=; )" >expect4 && + git log --format="%(decorate:prefix=[ ,suffix= ],separater=%x3B )" \ + -1 >actual4 && + test_cmp expect4 actual4 && + + echo "HEAD->foo bar qux" >expect5 && + git log --format="%(decorate:prefix=,suffix=,separator= ,tag=,pointer=->)" \ + -1 >actual5 && + test_cmp expect5 actual5 +' + cat >trailers <<EOF Signed-off-by: A U Thor <author@example.com> Acked-by: A U Thor <author@example.com> @@ -924,6 +956,36 @@ test_expect_success '%S in git log --format works with other placeholders (part test_cmp expect actual ' +test_expect_success 'setup more commits for %S with --bisect' ' + test_commit four && + test_commit five && + + head1=$(git rev-parse --verify HEAD~0) && + head2=$(git rev-parse --verify HEAD~1) && + head3=$(git rev-parse --verify HEAD~2) && + head4=$(git rev-parse --verify HEAD~3) +' + +test_expect_success '%S with --bisect labels commits with refs/bisect/bad ref' ' + git update-ref refs/bisect/bad-$head1 $head1 && + git update-ref refs/bisect/go $head1 && + git update-ref refs/bisect/bad-$head2 $head2 && + git update-ref refs/bisect/b $head3 && + git update-ref refs/bisect/bad-$head4 $head4 && + git update-ref refs/bisect/good-$head4 $head4 && + + # We expect to see the range of commits betwee refs/bisect/good-$head4 + # and refs/bisect/bad-$head1. The "source" ref is the nearest bisect ref + # from which the commit is reachable. + cat >expect <<-EOF && + $head1 refs/bisect/bad-$head1 + $head2 refs/bisect/bad-$head2 + $head3 refs/bisect/bad-$head2 + EOF + git log --bisect --format="%H %S" >actual && + test_cmp expect actual +' + test_expect_success 'log --pretty=reference' ' git log --pretty="tformat:%h (%s, %as)" >expect && git log --pretty=reference >actual && diff --git a/t/t4207-log-decoration-colors.sh b/t/t4207-log-decoration-colors.sh index ded33a82e2..21986a866d 100755 --- a/t/t4207-log-decoration-colors.sh +++ b/t/t4207-log-decoration-colors.sh @@ -53,15 +53,17 @@ cmp_filtered_decorations () { # to this test since it does not contain any decoration, hence --first-parent test_expect_success 'commit decorations colored correctly' ' cat >expect <<-EOF && - ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD -> \ -${c_reset}${c_branch}main${c_reset}${c_commit}, \ -${c_reset}${c_tag}tag: v1.0${c_reset}${c_commit}, \ -${c_reset}${c_tag}tag: B${c_reset}${c_commit})${c_reset} B -${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A1${c_reset}${c_commit}, \ + ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD${c_reset}\ +${c_commit} -> ${c_reset}${c_branch}main${c_reset}${c_commit}, \ +${c_reset}${c_tag}tag: ${c_reset}${c_tag}v1.0${c_reset}${c_commit}, \ +${c_reset}${c_tag}tag: ${c_reset}${c_tag}B${c_reset}${c_commit})${c_reset} B +${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\ +${c_tag}tag: ${c_reset}${c_tag}A1${c_reset}${c_commit}, \ ${c_reset}${c_remoteBranch}other/main${c_reset}${c_commit})${c_reset} A1 - ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_stash}refs/stash${c_reset}${c_commit})${c_reset} \ -On main: Changes to A.t - ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A${c_reset}${c_commit})${c_reset} A + ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\ +${c_stash}refs/stash${c_reset}${c_commit})${c_reset} On main: Changes to A.t + ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\ +${c_tag}tag: ${c_reset}${c_tag}A${c_reset}${c_commit})${c_reset} A EOF git log --first-parent --no-abbrev --decorate --oneline --color=always --all >actual && @@ -76,12 +78,14 @@ test_expect_success 'test coloring with replace-objects' ' git replace HEAD~1 HEAD~2 && cat >expect <<-EOF && - ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD -> \ -${c_reset}${c_branch}main${c_reset}${c_commit}, \ -${c_reset}${c_tag}tag: D${c_reset}${c_commit})${c_reset} D - ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: C${c_reset}${c_commit}, \ + ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD${c_reset}\ +${c_commit} -> ${c_reset}${c_branch}main${c_reset}${c_commit}, \ +${c_reset}${c_tag}tag: ${c_reset}${c_tag}D${c_reset}${c_commit})${c_reset} D + ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\ +${c_tag}tag: ${c_reset}${c_tag}C${c_reset}${c_commit}, \ ${c_reset}${c_grafted}replaced${c_reset}${c_commit})${c_reset} B - ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A${c_reset}${c_commit})${c_reset} A + ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\ +${c_tag}tag: ${c_reset}${c_tag}A${c_reset}${c_commit})${c_reset} A EOF git log --first-parent --no-abbrev --decorate --oneline --color=always HEAD >actual && @@ -100,13 +104,15 @@ test_expect_success 'test coloring with grafted commit' ' git replace --graft HEAD HEAD~2 && cat >expect <<-EOF && - ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD -> \ -${c_reset}${c_branch}main${c_reset}${c_commit}, \ -${c_reset}${c_tag}tag: D${c_reset}${c_commit}, \ + ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD${c_reset}\ +${c_commit} -> ${c_reset}${c_branch}main${c_reset}${c_commit}, \ +${c_reset}${c_tag}tag: ${c_reset}${c_tag}D${c_reset}${c_commit}, \ ${c_reset}${c_grafted}replaced${c_reset}${c_commit})${c_reset} D - ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: v1.0${c_reset}${c_commit}, \ -${c_reset}${c_tag}tag: B${c_reset}${c_commit})${c_reset} B - ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A${c_reset}${c_commit})${c_reset} A + ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\ +${c_tag}tag: ${c_reset}${c_tag}v1.0${c_reset}${c_commit}, \ +${c_reset}${c_tag}tag: ${c_reset}${c_tag}B${c_reset}${c_commit})${c_reset} B + ${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}\ +${c_tag}tag: ${c_reset}${c_tag}A${c_reset}${c_commit})${c_reset} A EOF git log --first-parent --no-abbrev --decorate --oneline --color=always HEAD >actual && diff --git a/t/t4208-log-magic-pathspec.sh b/t/t4208-log-magic-pathspec.sh index 2e8f5ad7b8..806b2809d4 100755 --- a/t/t4208-log-magic-pathspec.sh +++ b/t/t4208-log-magic-pathspec.sh @@ -21,7 +21,7 @@ test_expect_success '"git log :/" should not be ambiguous' ' test_expect_success '"git log :/a" should be ambiguous (applied both rev and worktree)' ' : >a && test_must_fail git log :/a 2>error && - test_i18ngrep ambiguous error + test_grep ambiguous error ' test_expect_success '"git log :/a -- " should not be ambiguous' ' @@ -65,7 +65,7 @@ test_expect_success '"git log :/in" should not be ambiguous' ' test_expect_success '"git log :" should be ambiguous' ' test_must_fail git log : 2>error && - test_i18ngrep ambiguous error + test_grep ambiguous error ' test_expect_success 'git log -- :' ' @@ -104,7 +104,7 @@ test_expect_success '"git log :(exclude)sub --" must resolve as an object' ' test_expect_success '"git log :(unknown-magic) complains of bogus magic' ' test_must_fail git log ":(unknown-magic)" 2>error && - test_i18ngrep pathspec.magic error + test_grep pathspec.magic error ' test_expect_success 'command line pathspec parsing for "git log"' ' diff --git a/t/t4209-log-pickaxe.sh b/t/t4209-log-pickaxe.sh index 7f6bb27f14..64e1623733 100755 --- a/t/t4209-log-pickaxe.sh +++ b/t/t4209-log-pickaxe.sh @@ -57,10 +57,10 @@ test_expect_success setup ' test_expect_success 'usage' ' test_expect_code 129 git log -S 2>err && - test_i18ngrep "switch.*requires a value" err && + test_grep "switch.*requires a value" err && test_expect_code 129 git log -G 2>err && - test_i18ngrep "switch.*requires a value" err && + test_grep "switch.*requires a value" err && test_expect_code 128 git log -Gregex -Sstring 2>err && grep "cannot be used together" err && diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh index c6540e822f..02d76dca28 100755 --- a/t/t4211-line-log.sh +++ b/t/t4211-line-log.sh @@ -19,7 +19,7 @@ test_expect_success 'basic command line parsing' ' # -L requires there is no pathspec test_must_fail git log -L1,1:b.c -- b.c 2>error && - test_i18ngrep "cannot be used with pathspec" error && + test_grep "cannot be used with pathspec" error && # This would fail because --follow wants a single path, but # we may fail due to incompatibility between -L/--follow in @@ -50,7 +50,7 @@ canned_test_failure () { test_bad_opts () { test_expect_success "invalid args: $1" " test_must_fail git log $1 2>errors && - test_i18ngrep '$2' errors + test_grep '$2' errors " } diff --git a/t/t4212-log-corrupt.sh b/t/t4212-log-corrupt.sh index 85e90acb09..e6b59123a3 100755 --- a/t/t4212-log-corrupt.sh +++ b/t/t4212-log-corrupt.sh @@ -17,7 +17,7 @@ test_expect_success 'setup' ' test_expect_success 'fsck notices broken commit' ' test_must_fail git fsck 2>actual && - test_i18ngrep invalid.author actual + test_grep invalid.author actual ' test_expect_success 'git log with broken author email' ' diff --git a/t/t4214-log-graph-octopus.sh b/t/t4214-log-graph-octopus.sh index f70c46bbbf..7905597869 100755 --- a/t/t4214-log-graph-octopus.sh +++ b/t/t4214-log-graph-octopus.sh @@ -5,6 +5,7 @@ test_description='git log --graph of skewed left octopus merge.' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh . "$TEST_DIRECTORY"/lib-log-graph.sh diff --git a/t/t4215-log-skewed-merges.sh b/t/t4215-log-skewed-merges.sh index 28d0779a8c..b877ac7235 100755 --- a/t/t4215-log-skewed-merges.sh +++ b/t/t4215-log-skewed-merges.sh @@ -2,6 +2,7 @@ test_description='git log --graph of skewed merges' +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh . "$TEST_DIRECTORY"/lib-log-graph.sh diff --git a/t/t4216-log-bloom.sh b/t/t4216-log-bloom.sh index fa9d32facf..2ba0324a69 100755 --- a/t/t4216-log-bloom.sh +++ b/t/t4216-log-bloom.sh @@ -5,6 +5,7 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-chunk.sh GIT_TEST_COMMIT_GRAPH=0 GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=0 @@ -404,4 +405,53 @@ test_expect_success 'Bloom generation backfills empty commits' ' ) ' +corrupt_graph () { + graph=.git/objects/info/commit-graph && + test_when_finished "rm -rf $graph" && + git commit-graph write --reachable --changed-paths && + corrupt_chunk_file $graph "$@" +} + +check_corrupt_graph () { + corrupt_graph "$@" && + git -c core.commitGraph=false log -- A/B/file2 >expect.out && + git -c core.commitGraph=true log -- A/B/file2 >out 2>err && + test_cmp expect.out out +} + +test_expect_success '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' ' + 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' ' + # replace the index with a single entry, making most + # lookups out-of-bounds + check_corrupt_graph BIDX clear 00000000 && + echo "warning: commit-graph changed-path index chunk" \ + "is too small" >expect.err && + test_cmp expect.err err +' + +test_expect_success '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. + corrupt_graph BIDX 4 0000000c00000005 && + echo "warning: ignoring decreasing changed-path index offsets" \ + "(12 > 5) for positions 1 and 2 of .git/objects/info/commit-graph" >expect.err && + git -c core.commitGraph=false log -- A/B/file2 >expect.out && + git -c core.commitGraph=true log -- A/B/file2 >out 2>err && + test_cmp expect.out out && + test_cmp expect.err err +' + test_done diff --git a/t/t4256-am-format-flowed.sh b/t/t4256-am-format-flowed.sh index 1015273bc8..92d8c8b651 100755 --- a/t/t4256-am-format-flowed.sh +++ b/t/t4256-am-format-flowed.sh @@ -13,7 +13,7 @@ test_expect_success 'setup' ' test_expect_success 'am with format=flowed' ' git am <"$TEST_DIRECTORY/t4256/1/patch" 2>stderr && - test_i18ngrep "warning: Patch sent with format=flowed" stderr && + test_grep "warning: Patch sent with format=flowed" stderr && test_cmp "$TEST_DIRECTORY/t4256/1/mailinfo.c" mailinfo.c ' diff --git a/t/t4300-merge-tree.sh b/t/t4300-merge-tree.sh index 57c4f26e46..9c197260d5 100755 --- a/t/t4300-merge-tree.sh +++ b/t/t4300-merge-tree.sh @@ -86,6 +86,33 @@ EXPECTED test_cmp expected actual ' +test_expect_success '3-way merge with --attr-source' ' + test_when_finished rm -rf 3-way && + git init 3-way && + ( + cd 3-way && + test_commit initial file1 foo && + base=$(git rev-parse HEAD) && + git checkout -b brancha && + echo bar >>file1 && + git commit -am "adding bar" && + source=$(git rev-parse HEAD) && + git checkout @{-1} && + git checkout -b branchb && + echo baz >>file1 && + git commit -am "adding baz" && + merge=$(git rev-parse HEAD) && + git checkout -b gitattributes && + test_commit "gitattributes" .gitattributes "file1 merge=union" && + git checkout @{-1} && + tree=$(git --attr-source=gitattributes merge-tree --write-tree \ + --merge-base "$base" --end-of-options "$source" "$merge") && + test_write_lines foo bar baz >expect && + git cat-file -p "$tree:file1" >actual && + test_cmp expect actual + ) +' + test_expect_success 'file change A, B (same)' ' git reset --hard initial && test_commit "change-a-b-same-A" "initial-file" "AAA" && diff --git a/t/t4301-merge-tree-write-tree.sh b/t/t4301-merge-tree-write-tree.sh index 250f721795..12ac436873 100755 --- a/t/t4301-merge-tree-write-tree.sh +++ b/t/t4301-merge-tree-write-tree.sh @@ -22,6 +22,7 @@ test_expect_success setup ' git branch side1 && git branch side2 && git branch side3 && + git branch side4 && git checkout side1 && test_write_lines 1 2 3 4 5 6 >numbers && @@ -46,6 +47,13 @@ test_expect_success setup ' test_tick && git commit -m rename-numbers && + git checkout side4 && + test_write_lines 0 1 2 3 4 5 >numbers && + echo yo >greeting && + git add numbers greeting && + test_tick && + git commit -m other-content-modifications && + git switch --orphan unrelated && >something-else && git add something-else && @@ -97,6 +105,21 @@ test_expect_success 'Content merge and a few conflicts' ' test_cmp expect actual ' +test_expect_success 'Auto resolve conflicts by "ours" strategy option' ' + git checkout side1^0 && + + # make sure merge conflict exists + test_must_fail git merge side4 && + git merge --abort && + + git merge -X ours side4 && + git rev-parse HEAD^{tree} >expected && + + git merge-tree -X ours side1 side4 >actual && + + test_cmp expected actual +' + test_expect_success 'Barf on misspelled option, with exit code other than 0 or 1' ' # Mis-spell with single "s" instead of double "s" test_expect_code 129 git merge-tree --write-tree --mesages FOOBAR side1 side2 2>expect && @@ -864,7 +887,7 @@ test_expect_success '--stdin with both a successful and a conflicted merge' ' test_expect_success '--merge-base is incompatible with --stdin' ' test_must_fail git merge-tree --merge-base=side1 --stdin 2>expect && - grep "^fatal: --merge-base is incompatible with --stdin" expect + grep "^fatal: .*merge-base.*stdin.* cannot be used together" expect ' # specify merge-base as parent of branch2 diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh index 4b4c3315d8..72b8d0ff02 100755 --- a/t/t5000-tar-tree.sh +++ b/t/t5000-tar-tree.sh @@ -124,6 +124,16 @@ test_expect_success 'setup' ' EOF ' +test_expect_success '--list notices extra parameters' ' + test_must_fail git archive --list blah && + test_must_fail git archive --remote=. --list blah +' + +test_expect_success 'end-of-options is correctly eaten' ' + git archive --list --end-of-options && + git archive --remote=. --list --end-of-options +' + test_expect_success 'populate workdir' ' mkdir a && echo simple textfile >a/a && diff --git a/t/t5001-archive-attr.sh b/t/t5001-archive-attr.sh index 0ff47a239d..eaf959d8f6 100755 --- a/t/t5001-archive-attr.sh +++ b/t/t5001-archive-attr.sh @@ -138,7 +138,7 @@ test_expect_success 'git archive with worktree attributes, bare' ' ' test_expect_missing bare-worktree/ignored -test_expect_exists bare-worktree/ignored-by-tree +test_expect_missing bare-worktree/ignored-by-tree test_expect_exists bare-worktree/ignored-by-worktree test_expect_success 'export-subst' ' diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh index db11cababd..654d8cf3ee 100755 --- a/t/t5100-mailinfo.sh +++ b/t/t5100-mailinfo.sh @@ -268,4 +268,26 @@ test_expect_success 'mailinfo warn CR in base64 encoded email' ' test_must_be_empty quoted-cr/0002.err ' +test_expect_success 'from line with unterminated quoted string' ' + echo "From: bob \"unterminated string smith <bob@example.com>" >in && + git mailinfo /dev/null /dev/null <in >actual && + cat >expect <<-\EOF && + Author: bob unterminated string smith + Email: bob@example.com + + EOF + test_cmp expect actual +' + +test_expect_success 'from line with unterminated comment' ' + echo "From: bob (unterminated comment smith <bob@example.com>" >in && + git mailinfo /dev/null /dev/null <in >actual && + cat >expect <<-\EOF && + Author: bob (unterminated comment smith + Email: bob@example.com + + EOF + test_cmp expect actual +' + test_done diff --git a/t/t5100/comment.expect b/t/t5100/comment.expect index 7228177984..bd71956a47 100644 --- a/t/t5100/comment.expect +++ b/t/t5100/comment.expect @@ -1,4 +1,4 @@ -Author: A U Thor (this is (really) a comment (honestly)) +Author: (this is (really) a "comment" (honestly)) A U Thor Email: somebody@example.com Subject: testing comments Date: Sun, 25 May 2008 00:38:18 -0700 diff --git a/t/t5100/comment.in b/t/t5100/comment.in index c53a192dfe..0b7e903b06 100644 --- a/t/t5100/comment.in +++ b/t/t5100/comment.in @@ -1,5 +1,5 @@ From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001 -From: "A U Thor" <somebody@example.com> (this is \(really\) a comment (honestly)) +From: (this is \(really\) a "comment" (honestly)) "A U Thor" <somebody@example.com> Date: Sun, 25 May 2008 00:38:18 -0700 Subject: [PATCH] testing comments diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index 745089479c..d402ec18b7 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -541,7 +541,7 @@ test_expect_success 'make sure index-pack detects the SHA1 collision' ' ( cd corrupt && test_must_fail git index-pack -o ../bad.idx ../test-3.pack 2>msg && - test_i18ngrep "SHA1 COLLISION FOUND" msg + test_grep "SHA1 COLLISION FOUND" msg ) ' @@ -549,7 +549,7 @@ test_expect_success 'make sure index-pack detects the SHA1 collision (large blob ( cd corrupt && test_must_fail git -c core.bigfilethreshold=1 index-pack -o ../bad.idx ../test-3.pack 2>msg && - test_i18ngrep "SHA1 COLLISION FOUND" msg + test_grep "SHA1 COLLISION FOUND" msg ) ' diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh index f89809be53..d88e6f1691 100755 --- a/t/t5302-pack-index.sh +++ b/t/t5302-pack-index.sh @@ -282,8 +282,8 @@ test_expect_success 'index-pack --fsck-objects also warns upon missing tagger in test_expect_success 'index-pack -v --stdin produces progress for both phases' ' pack=$(git pack-objects --all pack </dev/null) && GIT_PROGRESS_DELAY=0 git index-pack -v --stdin <pack-$pack.pack 2>err && - test_i18ngrep "Receiving objects" err && - test_i18ngrep "Resolving deltas" err + test_grep "Receiving objects" err && + test_grep "Resolving deltas" err ' test_expect_success 'too-large packs report the breach' ' diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh index b4df545e5a..1f1f664871 100755 --- a/t/t5304-prune.sh +++ b/t/t5304-prune.sh @@ -318,10 +318,10 @@ test_expect_success 'prune: handle HEAD reflog in multiple worktrees' ' test_expect_success 'prune: handle expire option correctly' ' test_must_fail git prune --expire 2>error && - test_i18ngrep "requires a value" error && + test_grep "requires a value" error && test_must_fail git prune --expire=nyah 2>error && - test_i18ngrep "malformed expiration" error && + test_grep "malformed expiration" error && git prune --no-expire ' diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh index 78c1c6c923..d7fd71360e 100755 --- a/t/t5310-pack-bitmaps.sh +++ b/t/t5310-pack-bitmaps.sh @@ -271,7 +271,7 @@ test_bitmap_cases () { mv -f $bitmap.tmp $bitmap && git rev-list --use-bitmap-index --count --all >actual 2>stderr && test_cmp expect actual && - test_i18ngrep corrupt.ewah.bitmap stderr + test_grep corrupt.ewah.bitmap stderr ' test_expect_success 'truncated bitmap fails gracefully (cache)' ' @@ -284,7 +284,7 @@ test_bitmap_cases () { mv -f $bitmap.tmp $bitmap && git rev-list --use-bitmap-index --count --all >actual 2>stderr && test_cmp expect actual && - test_i18ngrep corrupted.bitmap.index stderr + test_grep corrupted.bitmap.index stderr ' # Create a state of history with these properties: @@ -471,7 +471,7 @@ sane_unset GIT_TEST_PACK_USE_BITMAP_BOUNDARY_TRAVERSAL test_expect_success 'incremental repack fails when bitmaps are requested' ' test_commit more-1 && test_must_fail git repack -d 2>err && - test_i18ngrep "Incremental repacks are incompatible with bitmap" err + test_grep "Incremental repacks are incompatible with bitmap" err ' test_expect_success 'incremental repack can disable bitmaps' ' @@ -524,7 +524,7 @@ test_expect_success 'truncated bitmap fails gracefully (lookup table)' ' mv -f $bitmap.tmp $bitmap && git rev-list --use-bitmap-index --count --all >actual 2>stderr && test_cmp expect actual && - test_i18ngrep corrupted.bitmap.index stderr + test_grep corrupted.bitmap.index stderr ' test_done diff --git a/t/t5311-pack-bitmaps-shallow.sh b/t/t5311-pack-bitmaps-shallow.sh index 9dae60f73e..4fe71fe8cd 100755 --- a/t/t5311-pack-bitmaps-shallow.sh +++ b/t/t5311-pack-bitmaps-shallow.sh @@ -1,6 +1,8 @@ #!/bin/sh test_description='check bitmap operation with shallow repositories' + +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh # We want to create a situation where the shallow, grafted diff --git a/t/t5317-pack-objects-filter-objects.sh b/t/t5317-pack-objects-filter-objects.sh index b26d476c64..2ff3eef9a3 100755 --- a/t/t5317-pack-objects-filter-objects.sh +++ b/t/t5317-pack-objects-filter-objects.sh @@ -53,6 +53,14 @@ test_expect_success 'verify blob:none packfile has no blobs' ' ! grep blob verify_result ' +test_expect_success 'verify blob:none packfile without --stdout' ' + git -C r1 pack-objects --revs --filter=blob:none mypackname >packhash <<-EOF && + HEAD + EOF + git -C r1 verify-pack -v "mypackname-$(cat packhash).pack" >verify_result && + ! grep blob verify_result +' + test_expect_success 'verify normal and blob:none packfiles have same commits/trees' ' git -C r1 verify-pack -v ../all.pack >verify_result && grep -E "commit|tree" verify_result | diff --git a/t/t5318-commit-graph.sh b/t/t5318-commit-graph.sh index ba65f17dd9..4c751a6871 100755 --- a/t/t5318-commit-graph.sh +++ b/t/t5318-commit-graph.sh @@ -2,6 +2,7 @@ test_description='commit graph' . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-chunk.sh GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=0 @@ -47,7 +48,7 @@ test_expect_success 'exit with correct error on bad input to --stdin-packs' ' echo doesnotexist >in && test_expect_code 1 git -C full commit-graph write --stdin-packs \ <in 2>stderr && - test_i18ngrep "error adding pack" stderr + test_grep "error adding pack" stderr ' test_expect_success 'create commits and repack' ' @@ -67,11 +68,11 @@ test_expect_success 'exit with correct error on bad input to --stdin-commits' ' # invalid, non-hex OID echo HEAD | test_expect_code 1 git -C full commit-graph write \ --stdin-commits 2>stderr && - test_i18ngrep "unexpected non-hex object ID: HEAD" stderr && + test_grep "unexpected non-hex object ID: HEAD" stderr && # non-existent OID echo $ZERO_OID | test_expect_code 1 git -C full commit-graph write \ --stdin-commits 2>stderr && - test_i18ngrep "invalid object" stderr && + test_grep "invalid object" stderr && # valid commit and tree OID git -C full rev-parse HEAD HEAD^{tree} >in && git -C full commit-graph write --stdin-commits <in && @@ -143,7 +144,7 @@ test_expect_success 'commit-graph write --stdin-commits force progress on for st git -C full rev-parse commits/5 >in && GIT_PROGRESS_DELAY=0 git -C full commit-graph write --stdin-commits \ --progress <in 2>err && - test_i18ngrep "Collecting commits from input" err + test_grep "Collecting commits from input" err ' test_expect_success 'commit-graph write --stdin-commits with the --no-progress option' ' @@ -383,13 +384,13 @@ test_expect_success 'warn on improper hash version' ' cd sha1 && mv ../cg-sha256 .git/objects/info/commit-graph && git log -1 2>err && - test_i18ngrep "commit-graph hash version 2 does not match version 1" err + test_grep "commit-graph hash version 2 does not match version 1" err ) && ( cd sha256 && mv ../cg-sha1 .git/objects/info/commit-graph && git log -1 2>err && - test_i18ngrep "commit-graph hash version 1 does not match version 2" err + test_grep "commit-graph hash version 1 does not match version 2" err ) ' @@ -474,7 +475,7 @@ corrupt_graph_verify() { grepstr=$1 test_must_fail git -C full commit-graph verify 2>test_err && grep -v "^+" test_err >err && - test_i18ngrep "$grepstr" err && + test_grep "$grepstr" err && if test "$2" != "no-copy" then cp full/$objdir/info/commit-graph commit-graph-pre-write-test @@ -559,7 +560,7 @@ test_expect_success 'detect incorrect fanout' ' test_expect_success 'detect incorrect fanout final value' ' corrupt_graph_and_verify $GRAPH_BYTE_FANOUT2 "\01" \ - "fanout value" + "oid table and fanout disagree on size" ' test_expect_success 'detect incorrect OID order' ' @@ -720,7 +721,7 @@ test_expect_success 'corrupt commit-graph write (broken parent)' ' git commit-tree -p "$broken" -m "good commit" "$empty" >good && test_must_fail git commit-graph write --stdin-commits \ <good 2>test_err && - test_i18ngrep "unable to parse commit" test_err + test_grep "unable to parse commit" test_err ) ' @@ -741,7 +742,7 @@ test_expect_success 'corrupt commit-graph write (missing tree)' ' git commit-tree -p "$broken" -m "good" "$tree" >good && test_must_fail git commit-graph write --stdin-commits \ <good 2>test_err && - test_i18ngrep "unable to parse commit" test_err + test_grep "unable to parse commit" test_err ) ' @@ -821,4 +822,125 @@ test_expect_success 'overflow during generation version upgrade' ' ) ' +corrupt_chunk () { + graph=full/.git/objects/info/commit-graph && + test_when_finished "rm -rf $graph" && + git -C full commit-graph write --reachable && + corrupt_chunk_file $graph "$@" +} + +check_corrupt_chunk () { + corrupt_chunk "$@" && + git -C full -c core.commitGraph=false log >expect.out && + git -C full -c core.commitGraph=true log >out 2>err && + test_cmp expect.out out +} + +test_expect_success '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)) && + cat >expect.err <<-\EOF && + error: commit-graph oid fanout chunk is wrong size + error: commit-graph is missing the OID Fanout chunk + EOF + test_cmp expect.err err +' + +test_expect_success 'reader notices fanout/lookup table mismatch' ' + check_corrupt_chunk OIDF 1020 "FFFFFFFF" && + cat >expect.err <<-\EOF && + error: commit-graph oid table and fanout disagree on size + EOF + test_cmp expect.err err +' + +test_expect_success '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 + # they are identical, that indicates that the search should abort + # immediately). Instead, we will give them high values that differ by + # 2^24, ensuring that any that are used would cause an out-of-bounds + # read. + check_corrupt_chunk OIDF 0 $(printf "%02x000000" $(test_seq 0 254)) && + cat >expect.err <<-\EOF && + error: commit-graph fanout values out of order + EOF + test_cmp expect.err err +' + +test_expect_success '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 + error: commit-graph is missing the Commit Data chunk + EOF + test_cmp expect.err err +' + +test_expect_success '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 + EOF + test_cmp expect.err err +' + +test_expect_success 'reader notices too-small generations chunk' ' + check_corrupt_chunk GDA2 clear 00000000 && + cat >expect.err <<-\EOF && + error: commit-graph generations chunk is wrong size + EOF + test_cmp expect.err err +' + +test_expect_success 'stale commit cannot be parsed when given directly' ' + test_when_finished "rm -rf repo" && + git init repo && + ( + cd repo && + test_commit A && + test_commit B && + git commit-graph write --reachable && + + oid=$(git rev-parse B) && + rm .git/objects/"$(test_oid_to_path "$oid")" && + + # Verify that it is possible to read the commit from the + # commit graph when not being paranoid, ... + git rev-list B && + # ... but parsing the commit when double checking that + # it actually exists in the object database should fail. + test_must_fail env GIT_COMMIT_GRAPH_PARANOIA=true git rev-list -1 B + ) +' + +test_expect_success 'stale commit cannot be parsed when traversing graph' ' + test_when_finished "rm -rf repo" && + git init repo && + ( + cd repo && + + test_commit A && + test_commit B && + test_commit C && + git commit-graph write --reachable && + + # Corrupt the repository by deleting the intermediate commit + # object. Commands should notice that this object is absent and + # thus that the repository is corrupt even if the commit graph + # exists. + oid=$(git rev-parse B) && + rm .git/objects/"$(test_oid_to_path "$oid")" && + + # Again, we should be able to parse the commit when not + # being paranoid about commit graph staleness... + git rev-parse HEAD~2 && + # ... but fail when we are paranoid. + test_must_fail env GIT_COMMIT_GRAPH_PARANOIA=true git rev-parse HEAD~2 2>error && + grep "error: commit $oid exists in commit-graph but not in the object database" error + ) +' + test_done diff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh index 1bcc02004d..c4c6060cee 100755 --- a/t/t5319-multi-pack-index.sh +++ b/t/t5319-multi-pack-index.sh @@ -2,6 +2,7 @@ test_description='multi-pack-indexes' . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-chunk.sh GIT_TEST_MULTI_PACK_INDEX=0 objdir=.git/objects @@ -279,13 +280,13 @@ test_expect_success 'warn on improper hash version' ' cd sha1 && mv ../mpi-sha256 .git/objects/pack/multi-pack-index && git log -1 2>err && - test_i18ngrep "multi-pack-index hash version 2 does not match version 1" err + test_grep "multi-pack-index hash version 2 does not match version 1" err ) && ( cd sha256 && mv ../mpi-sha1 .git/objects/pack/multi-pack-index && git log -1 2>err && - test_i18ngrep "multi-pack-index hash version 1 does not match version 2" err + test_grep "multi-pack-index hash version 1 does not match version 2" err ) ' @@ -386,7 +387,7 @@ corrupt_midx_and_verify() { printf "$DATA" | dd of="$FILE" bs=1 seek="$POS" conv=notrunc && test_must_fail $COMMAND 2>test_err && grep -v "^+" test_err >err && - test_i18ngrep "$GREPSTR" err + test_grep "$GREPSTR" err } test_expect_success 'verify bad signature' ' @@ -438,7 +439,7 @@ test_expect_success 'verify extended chunk count' ' test_expect_success 'verify missing required chunk' ' corrupt_midx_and_verify $MIDX_BYTE_CHUNK_ID "\01" $objdir \ - "missing required" + "required pack-name chunk missing" ' test_expect_success 'verify invalid chunk offset' ' @@ -501,7 +502,7 @@ test_expect_success 'corrupt MIDX is not reused' ' corrupt_midx_and_verify $MIDX_BYTE_OFFSET "\377" $objdir \ "incorrect object offset" && git multi-pack-index write 2>err && - test_i18ngrep checksum.mismatch err && + test_grep checksum.mismatch err && git multi-pack-index verify ' @@ -1031,7 +1032,7 @@ test_expect_success 'load reverse index when missing .idx, .pack' ' test_expect_success 'usage shown without sub-command' ' test_expect_code 129 git multi-pack-index 2>err && - ! test_i18ngrep "unrecognized subcommand" err + ! test_grep "unrecognized subcommand" err ' test_expect_success 'complains when run outside of a repository' ' @@ -1055,4 +1056,105 @@ test_expect_success 'repack with delta islands' ' ) ' +corrupt_chunk () { + midx=.git/objects/pack/multi-pack-index && + test_when_finished "rm -rf $midx" && + git repack -ad --write-midx && + corrupt_chunk_file $midx "$@" +} + +test_expect_success 'reader notices too-small oid fanout chunk' ' + corrupt_chunk OIDF clear 00000000 && + test_must_fail git log 2>err && + cat >expect <<-\EOF && + error: multi-pack-index OID fanout is of the wrong size + fatal: multi-pack-index required OID fanout chunk missing or corrupted + EOF + test_cmp expect err +' + +test_expect_success 'reader notices too-small oid lookup chunk' ' + corrupt_chunk OIDL clear 00000000 && + test_must_fail git log 2>err && + cat >expect <<-\EOF && + error: multi-pack-index OID lookup chunk is the wrong size + fatal: multi-pack-index required OID lookup chunk missing or corrupted + EOF + test_cmp expect err +' + +test_expect_success '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 && + test_must_fail git log 2>err && + cat >expect <<-\EOF && + fatal: multi-pack-index pack-name chunk is too short + EOF + test_cmp expect err +' + +test_expect_success '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"). + corrupt_chunk PNAM clear 666f6f2e7061636b00 && + git -c core.multipackindex=false log >expect.out && + git -c core.multipackindex=true log >out 2>err && + test_cmp expect.out out && + cat >expect.err <<-\EOF && + error: chunk id 4f494446 not 4-byte aligned + EOF + test_cmp expect.err err +' + +test_expect_success 'reader notices too-small object offset chunk' ' + corrupt_chunk OOFF clear 00000000 && + test_must_fail git log 2>err && + cat >expect <<-\EOF && + error: multi-pack-index object offset chunk is the wrong size + fatal: multi-pack-index required object offsets chunk missing or corrupted + EOF + test_cmp expect err +' + +test_expect_success '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 && + test_when_finished "rm -rf repo" && + ( + cd repo && + (cd ../objects64 && pwd) >.git/objects/info/alternates && + git multi-pack-index --object-dir=../objects64 write && + midx=../objects64/pack/multi-pack-index && + corrupt_chunk_file $midx LOFF clear && + # using only %(objectsize) is important here; see the commit + # message for more details + test_must_fail git cat-file --batch-all-objects \ + --batch-check="%(objectsize)" 2>err && + cat >expect <<-\EOF && + fatal: multi-pack-index large offset out of bounds + EOF + test_cmp expect err + ) +' + +test_expect_success '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 && + corrupt_chunk RIDX clear 00000000 && + git -c core.multipackIndex=false rev-list \ + --all --use-bitmap-index >expect.out && + git -c core.multipackIndex=true rev-list \ + --all --use-bitmap-index >out 2>err && + test_cmp expect.out out && + cat >expect.err <<-\EOF && + error: multi-pack-index reverse-index chunk is the wrong size + warning: multi-pack bitmap is missing required reverse index + EOF + test_cmp expect.err err +' + test_done diff --git a/t/t5324-split-commit-graph.sh b/t/t5324-split-commit-graph.sh index 36c4141e67..281266f788 100755 --- a/t/t5324-split-commit-graph.sh +++ b/t/t5324-split-commit-graph.sh @@ -1,7 +1,10 @@ #!/bin/sh test_description='split commit graph' + +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-chunk.sh GIT_TEST_COMMIT_GRAPH=0 GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=0 @@ -281,7 +284,33 @@ test_expect_success 'verify hashes along chain, even in shallow' ' corrupt_file "$base_file" $(test_oid shallow) "\01" && test_must_fail git commit-graph verify --shallow 2>test_err && grep -v "^+" test_err >err && - test_i18ngrep "incorrect checksum" err + test_grep "incorrect checksum" err + ) +' + +test_expect_success 'verify notices chain slice which is bogus (base)' ' + git clone --no-hardlinks . verify-chain-bogus-base && + ( + cd verify-chain-bogus-base && + git commit-graph verify && + base_file=$graphdir/graph-$(sed -n 1p $graphdir/commit-graph-chain).graph && + echo "garbage" >$base_file && + test_must_fail git commit-graph verify 2>test_err && + grep -v "^+" test_err >err && + grep "commit-graph file is too small" err + ) +' + +test_expect_success 'verify notices chain slice which is bogus (tip)' ' + git clone --no-hardlinks . verify-chain-bogus-tip && + ( + cd verify-chain-bogus-tip && + git commit-graph verify && + tip_file=$graphdir/graph-$(sed -n 2p $graphdir/commit-graph-chain).graph && + echo "garbage" >$tip_file && + test_must_fail git commit-graph verify 2>test_err && + grep -v "^+" test_err >err && + grep "commit-graph file is too small" err ) ' @@ -291,11 +320,11 @@ test_expect_success 'verify --shallow does not check base contents' ' cd verify-shallow && git commit-graph verify && base_file=$graphdir/graph-$(head -n 1 $graphdir/commit-graph-chain).graph && - corrupt_file "$base_file" 1000 "\01" && + corrupt_file "$base_file" 1500 "\01" && git commit-graph verify --shallow && test_must_fail git commit-graph verify 2>test_err && grep -v "^+" test_err >err && - test_i18ngrep "incorrect checksum" err + test_grep "incorrect checksum" err ) ' @@ -306,24 +335,51 @@ test_expect_success 'warn on base graph chunk incorrect' ' git commit-graph verify && base_file=$graphdir/graph-$(tail -n 1 $graphdir/commit-graph-chain).graph && corrupt_file "$base_file" $(test_oid base) "\01" && - git commit-graph verify --shallow 2>test_err && + test_must_fail git commit-graph verify --shallow 2>test_err && + grep -v "^+" test_err >err && + test_grep "commit-graph chain does not match" err + ) +' + +test_expect_success 'verify after commit-graph-chain corruption (base)' ' + git clone --no-hardlinks . verify-chain-base && + ( + cd verify-chain-base && + corrupt_file "$graphdir/commit-graph-chain" 30 "G" && + test_must_fail git commit-graph verify 2>test_err && + grep -v "^+" test_err >err && + test_grep "invalid commit-graph chain" err && + corrupt_file "$graphdir/commit-graph-chain" 30 "A" && + test_must_fail git commit-graph verify 2>test_err && grep -v "^+" test_err >err && - test_i18ngrep "commit-graph chain does not match" err + test_grep "unable to find all commit-graph files" err ) ' -test_expect_success 'verify after commit-graph-chain corruption' ' - git clone --no-hardlinks . verify-chain && +test_expect_success 'verify after commit-graph-chain corruption (tip)' ' + git clone --no-hardlinks . verify-chain-tip && ( - cd verify-chain && - corrupt_file "$graphdir/commit-graph-chain" 60 "G" && - git commit-graph verify 2>test_err && + cd verify-chain-tip && + corrupt_file "$graphdir/commit-graph-chain" 70 "G" && + test_must_fail git commit-graph verify 2>test_err && grep -v "^+" test_err >err && - test_i18ngrep "invalid commit-graph chain" err && - corrupt_file "$graphdir/commit-graph-chain" 60 "A" && - git commit-graph verify 2>test_err && + test_grep "invalid commit-graph chain" err && + corrupt_file "$graphdir/commit-graph-chain" 70 "A" && + test_must_fail git commit-graph verify 2>test_err && grep -v "^+" test_err >err && - test_i18ngrep "unable to find all commit-graph files" err + test_grep "unable to find all commit-graph files" err + ) +' + +test_expect_success 'verify notices too-short chain file' ' + git clone --no-hardlinks . verify-chain-short && + ( + cd verify-chain-short && + git commit-graph verify && + echo "garbage" >$graphdir/commit-graph-chain && + test_must_fail git commit-graph verify 2>test_err && + grep -v "^+" test_err >err && + grep "commit-graph chain file too small" err ) ' @@ -338,10 +394,23 @@ test_expect_success 'verify across alternates' ' test_commit extra && git commit-graph write --reachable --split && tip_file=$graphdir/graph-$(tail -n 1 $graphdir/commit-graph-chain).graph && - corrupt_file "$tip_file" 100 "\01" && + corrupt_file "$tip_file" 1500 "\01" && test_must_fail git commit-graph verify --shallow 2>test_err && grep -v "^+" test_err >err && - test_i18ngrep "commit-graph has incorrect fanout value" err + test_grep "incorrect checksum" err + ) +' + +test_expect_success 'reader bounds-checks base-graph chunk' ' + git clone --no-hardlinks . corrupt-base-chunk && + ( + cd corrupt-base-chunk && + tip_file=$graphdir/graph-$(tail -n 1 $graphdir/commit-graph-chain).graph && + corrupt_chunk_file "$tip_file" BASE clear 01020304 && + git -c core.commitGraph=false log >expect.out && + git -c core.commitGraph=true log >out 2>err && + test_cmp expect.out out && + grep "commit-graph base graphs chunk is too small" err ) ' @@ -353,7 +422,7 @@ test_expect_success 'add octopus merge' ' git commit-graph verify --progress 2>err && test_line_count = 1 err && grep "Verifying commits in commit graph: 100% (18/18)" err && - test_i18ngrep ! warning err && + test_grep ! warning err && test_line_count = 3 $graphdir/commit-graph-chain ' @@ -455,7 +524,7 @@ test_expect_success 'prevent regression for duplicate commits across layers' ' git init dup && git -C dup commit --allow-empty -m one && git -C dup -c core.commitGraph=false commit-graph write --split=no-merge --reachable 2>err && - test_i18ngrep "attempting to write a commit-graph" err && + test_grep "attempting to write a commit-graph" err && git -C dup commit-graph write --split=no-merge --reachable && git -C dup commit --allow-empty -m two && git -C dup commit-graph write --split=no-merge --reachable && diff --git a/t/t5328-commit-graph-64bit-time.sh b/t/t5328-commit-graph-64bit-time.sh index e9c521c061..fc6a242b56 100755 --- a/t/t5328-commit-graph-64bit-time.sh +++ b/t/t5328-commit-graph-64bit-time.sh @@ -1,6 +1,8 @@ #!/bin/sh test_description='commit graph with 64-bit timestamps' + +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh if ! test_have_prereq TIME_IS_64BIT || ! test_have_prereq TIME_T_IS_64BIT @@ -10,6 +12,7 @@ then fi . "$TEST_DIRECTORY"/lib-commit-graph.sh +. "$TEST_DIRECTORY/lib-chunk.sh" UNIX_EPOCH_ZERO="@0 +0000" FUTURE_DATE="@4147483646 +0000" @@ -72,4 +75,13 @@ 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' ' + graph=.git/objects/info/commit-graph && + test_when_finished "rm -rf $graph" && + git commit-graph write --reachable && + corrupt_chunk_file $graph GDO2 clear && + test_must_fail git log 2>err && + grep "commit-graph overflow generation data is too small" err +' + test_done diff --git a/t/t5329-pack-objects-cruft.sh b/t/t5329-pack-objects-cruft.sh index 45667d4999..fc5fedbe9b 100755 --- a/t/t5329-pack-objects-cruft.sh +++ b/t/t5329-pack-objects-cruft.sh @@ -573,23 +573,54 @@ test_expect_success 'cruft repack with no reachable objects' ' ) ' -test_expect_success 'cruft repack ignores --max-pack-size' ' +write_blob () { + test-tool genrandom "$@" >in && + git hash-object -w -t blob in +} + +find_pack () { + for idx in $(ls $packdir/pack-*.idx) + do + git show-index <$idx >out && + if grep -q "$1" out + then + echo $idx + fi || return 1 + done +} + +test_expect_success 'cruft repack with --max-pack-size' ' git init max-pack-size && ( cd max-pack-size && test_commit base && + # two cruft objects which exceed the maximum pack size - test-tool genrandom foo 1048576 | git hash-object --stdin -w && - test-tool genrandom bar 1048576 | git hash-object --stdin -w && + foo=$(write_blob foo 1048576) && + bar=$(write_blob bar 1048576) && + test-tool chmtime --get -1000 \ + "$objdir/$(test_oid_to_path $foo)" >foo.mtime && + test-tool chmtime --get -2000 \ + "$objdir/$(test_oid_to_path $bar)" >bar.mtime && git repack --cruft --max-pack-size=1M && find $packdir -name "*.mtimes" >cruft && - test_line_count = 1 cruft && - test-tool pack-mtimes "$(basename "$(cat cruft)")" >objects && - test_line_count = 2 objects + test_line_count = 2 cruft && + + foo_mtimes="$(basename $(find_pack $foo) .idx).mtimes" && + bar_mtimes="$(basename $(find_pack $bar) .idx).mtimes" && + test-tool pack-mtimes $foo_mtimes >foo.actual && + test-tool pack-mtimes $bar_mtimes >bar.actual && + + echo "$foo $(cat foo.mtime)" >foo.expect && + echo "$bar $(cat bar.mtime)" >bar.expect && + + test_cmp foo.expect foo.actual && + test_cmp bar.expect bar.actual && + test "$foo_mtimes" != "$bar_mtimes" ) ' -test_expect_success 'cruft repack ignores pack.packSizeLimit' ' +test_expect_success 'cruft repack with pack.packSizeLimit' ' ( cd max-pack-size && # repack everything back together to remove the existing cruft @@ -599,9 +630,12 @@ test_expect_success 'cruft repack ignores pack.packSizeLimit' ' # ensure the same post condition is met when --max-pack-size # would otherwise be inferred from the configuration find $packdir -name "*.mtimes" >cruft && - test_line_count = 1 cruft && - test-tool pack-mtimes "$(basename "$(cat cruft)")" >objects && - test_line_count = 2 objects + test_line_count = 2 cruft && + for pack in $(cat cruft) + do + test-tool pack-mtimes "$(basename $pack)" >objects && + test_line_count = 1 objects || return 1 + done ) ' diff --git a/t/t5331-pack-objects-stdin.sh b/t/t5331-pack-objects-stdin.sh index acab31667a..2dcf1eecee 100755 --- a/t/t5331-pack-objects-stdin.sh +++ b/t/t5331-pack-objects-stdin.sh @@ -65,7 +65,7 @@ test_expect_success '--stdin-packs is incompatible with --filter' ' cd stdin-packs && test_must_fail git pack-objects --stdin-packs --stdout \ --filter=blob:none </dev/null 2>err && - test_i18ngrep "cannot use --filter with --stdin-packs" err + test_grep "cannot use --filter with --stdin-packs" err ) ' @@ -74,7 +74,7 @@ test_expect_success '--stdin-packs is incompatible with --revs' ' cd stdin-packs && test_must_fail git pack-objects --stdin-packs --revs out \ </dev/null 2>err && - test_i18ngrep "cannot use internal rev list with --stdin-packs" err + test_grep "cannot use internal rev list with --stdin-packs" err ) ' diff --git a/t/t5401-update-hooks.sh b/t/t5401-update-hooks.sh index 001b7a17ad..8b8bc47dc0 100755 --- a/t/t5401-update-hooks.sh +++ b/t/t5401-update-hooks.sh @@ -133,10 +133,8 @@ test_expect_success 'pre-receive hook that forgets to read its input' ' EOF rm -f victim.git/hooks/update victim.git/hooks/post-update && - for v in $(test_seq 100 999) - do - git branch branch_$v main || return - done && + printf "create refs/heads/branch_%d main\n" $(test_seq 100 999) >input && + git update-ref --stdin <input && git push ./victim.git "+refs/heads/*:refs/heads/*" ' diff --git a/t/t5411/test-0026-push-options.sh b/t/t5411/test-0026-push-options.sh index 6dfc7b1c0d..510fff38da 100644 --- a/t/t5411/test-0026-push-options.sh +++ b/t/t5411/test-0026-push-options.sh @@ -18,7 +18,7 @@ test_expect_success "proc-receive: not support push options ($PROTOCOL)" ' HEAD:refs/for/main/topic \ >out-$test_count 2>&1 && make_user_friendly_and_stable_output <out-$test_count >actual && - test_i18ngrep "fatal: the receiving end does not support push options" \ + test_grep "fatal: the receiving end does not support push options" \ actual && test_cmp_refs -C "$upstream" <<-EOF diff --git a/t/t5411/test-0027-push-options--porcelain.sh b/t/t5411/test-0027-push-options--porcelain.sh index 768880b40f..9435457de0 100644 --- a/t/t5411/test-0027-push-options--porcelain.sh +++ b/t/t5411/test-0027-push-options--porcelain.sh @@ -19,7 +19,7 @@ test_expect_success "proc-receive: not support push options ($PROTOCOL/porcelain HEAD:refs/for/main/topic \ >out-$test_count 2>&1 && make_user_friendly_and_stable_output <out-$test_count >actual && - test_i18ngrep "fatal: the receiving end does not support push options" \ + test_grep "fatal: the receiving end does not support push options" \ actual && test_cmp_refs -C "$upstream" <<-EOF diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh index d18f2823d8..1bc15a3f08 100755 --- a/t/t5500-fetch-pack.sh +++ b/t/t5500-fetch-pack.sh @@ -132,13 +132,18 @@ test_expect_success 'single branch object count' ' ' test_expect_success 'single given branch clone' ' - git clone --single-branch --branch A "file://$(pwd)/." branch-a && - test_must_fail git --git-dir=branch-a/.git rev-parse origin/B + GIT_TRACE2_EVENT="$(pwd)/branch-a/trace2_event" \ + git clone --single-branch --branch A "file://$(pwd)/." branch-a && + test_must_fail git --git-dir=branch-a/.git rev-parse origin/B && + grep \"fetch-info\".*\"haves\":0 branch-a/trace2_event && + grep \"fetch-info\".*\"wants\":1 branch-a/trace2_event ' test_expect_success 'clone shallow depth 1' ' - git clone --no-single-branch --depth 1 "file://$(pwd)/." shallow0 && - test "$(git --git-dir=shallow0/.git rev-list --count HEAD)" = 1 + GIT_TRACE2_EVENT="$(pwd)/shallow0/trace2_event" \ + git clone --no-single-branch --depth 1 "file://$(pwd)/." shallow0 && + test "$(git --git-dir=shallow0/.git rev-list --count HEAD)" = 1 && + grep \"fetch-info\".*\"depth\":1 shallow0/trace2_event ' test_expect_success 'clone shallow depth 1 with fsck' ' @@ -235,7 +240,10 @@ test_expect_success 'add two more (part 2)' ' test_expect_success 'deepening pull in shallow repo' ' ( cd shallow && - git pull --depth 4 .. B + GIT_TRACE2_EVENT="$(pwd)/trace2_event" \ + git pull --depth 4 .. B && + grep \"fetch-info\".*\"depth\":4 trace2_event && + grep \"fetch-info\".*\"shallows\":2 trace2_event ) ' @@ -306,9 +314,12 @@ test_expect_success 'fetch --depth --no-shallow' ' test_expect_success 'turn shallow to complete repository' ' ( cd shallow && - git fetch --unshallow && + GIT_TRACE2_EVENT="$(pwd)/trace2_event" \ + git fetch --unshallow && ! test -f .git/shallow && - git fsck --full + git fsck --full && + grep \"fetch-info\".*\"shallows\":2 trace2_event && + grep \"fetch-info\".*\"depth\":2147483647 trace2_event ) ' @@ -403,7 +414,7 @@ test_expect_success 'in_vain not triggered before first ACK' ' test_commit -C myserver bar && git -C myclient fetch --progress origin 2>log && - test_i18ngrep "remote: Total 3 " log + test_grep "remote: Total 3 " log ' test_expect_success 'in_vain resetted upon ACK' ' @@ -435,7 +446,7 @@ test_expect_success 'in_vain resetted upon ACK' ' # the client reports that first_anotherbranch_commit is common. GIT_TRACE2_EVENT="$(pwd)/trace2" git -C myclient fetch --progress origin main 2>log && grep \"key\":\"total_rounds\",\"value\":\"6\" trace2 && - test_i18ngrep "Total 3 " log + test_grep "Total 3 " log ' test_expect_success 'fetch in shallow repo unreachable shallow objects' ' @@ -459,7 +470,7 @@ test_expect_success 'fetch creating new shallow root' ' git fetch --depth=1 --progress 2>actual && # This should fetch only the empty commit, no tree or # blob objects - test_i18ngrep "remote: Total 1" actual + test_grep "remote: Total 1" actual ) ' @@ -694,7 +705,7 @@ test_expect_success 'fetch-pack cannot fetch a raw sha1 that is not advertised a # unadvertised objects, so restrict this test to v0. test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -C client fetch-pack ../server \ $(git -C server rev-parse refs/heads/main^) 2>err && - test_i18ngrep "Server does not allow request for unadvertised object" err + test_grep "Server does not allow request for unadvertised object" err ' check_prot_path () { @@ -826,13 +837,15 @@ test_expect_success 'clone shallow since ...' ' ' test_expect_success 'fetch shallow since ...' ' - git -C shallow11 fetch --shallow-since "200000000 +0700" origin && + GIT_TRACE2_EVENT=$(pwd)/shallow11/trace2_event \ + git -C shallow11 fetch --shallow-since "200000000 +0700" origin && git -C shallow11 log --pretty=tformat:%s origin/main >actual && cat >expected <<-\EOF && three two EOF - test_cmp expected actual + test_cmp expected actual && + grep \"fetch-info\".*\"deepen-since\":true shallow11/trace2_event ' test_expect_success 'clone shallow since selects no commits' ' @@ -987,13 +1000,16 @@ test_expect_success 'filtering by size' ' test_config -C server uploadpack.allowfilter 1 && test_create_repo client && - git -C client fetch-pack --filter=blob:limit=0 ../server HEAD && + GIT_TRACE2_EVENT=$(pwd)/client/trace2_event \ + git -C client fetch-pack --filter=blob:limit=0 ../server HEAD && # Ensure that object is not inadvertently fetched commit=$(git -C server rev-parse HEAD) && blob=$(git hash-object server/one.t) && git -C client rev-list --objects --missing=allow-any "$commit" >oids && - ! grep "$blob" oids + ! grep "$blob" oids && + + grep \"fetch-info\".*\"filter\":\"blob:limit\" client/trace2_event ' test_expect_success 'filtering by size has no effect if support for it is not advertised' ' @@ -1010,7 +1026,7 @@ test_expect_success 'filtering by size has no effect if support for it is not ad git -C client rev-list --objects --missing=allow-any "$commit" >oids && grep "$blob" oids && - test_i18ngrep "filtering not recognized by server" err + test_grep "filtering not recognized by server" err ' fetch_filter_blob_limit_zero () { diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh index 0b8ab4afdb..138e6778a4 100755 --- a/t/t5504-fetch-receive-strict.sh +++ b/t/t5504-fetch-receive-strict.sh @@ -144,7 +144,7 @@ test_expect_success 'setup bogus commit' ' test_expect_success 'fsck with no skipList input' ' test_must_fail git fsck 2>err && - test_i18ngrep "missingEmail" err + test_grep "missingEmail" err ' test_expect_success 'setup sorted and unsorted skipLists' ' @@ -169,9 +169,9 @@ test_expect_success 'fsck with unsorted skipList' ' test_expect_success 'fsck with invalid or bogus skipList input' ' git -c fsck.skipList=/dev/null -c fsck.missingEmail=ignore fsck && test_must_fail git -c fsck.skipList=does-not-exist -c fsck.missingEmail=ignore fsck 2>err && - test_i18ngrep "could not open.*: does-not-exist" err && + test_grep "could not open.*: does-not-exist" err && test_must_fail git -c fsck.skipList=.git/config -c fsck.missingEmail=ignore fsck 2>err && - test_i18ngrep "invalid object name: \[core\]" err + test_grep "invalid object name: \[core\]" err ' test_expect_success 'fsck with other accepted skipList input (comments & empty lines)' ' @@ -180,14 +180,14 @@ test_expect_success 'fsck with other accepted skipList input (comments & empty l $(test_oid 001) EOF test_must_fail git -c fsck.skipList=SKIP.with-comment fsck 2>err-with-comment && - test_i18ngrep "missingEmail" err-with-comment && + test_grep "missingEmail" err-with-comment && cat >SKIP.with-empty-line <<-EOF && $(test_oid 001) $(test_oid 002) EOF test_must_fail git -c fsck.skipList=SKIP.with-empty-line fsck 2>err-with-empty-line && - test_i18ngrep "missingEmail" err-with-empty-line + test_grep "missingEmail" err-with-empty-line ' test_expect_success 'fsck no garbage output from comments & empty lines errors' ' @@ -198,7 +198,7 @@ test_expect_success 'fsck no garbage output from comments & empty lines errors' test_expect_success 'fsck with invalid abbreviated skipList input' ' echo $commit | test_copy_bytes 20 >SKIP.abbreviated && test_must_fail git -c fsck.skipList=SKIP.abbreviated fsck 2>err-abbreviated && - test_i18ngrep "^fatal: invalid object name: " err-abbreviated + test_grep "^fatal: invalid object name: " err-abbreviated ' test_expect_success 'fsck with exhaustive accepted skipList input (various types of comments etc.)' ' @@ -231,10 +231,10 @@ test_expect_success 'push with receive.fsck.skipList' ' test_must_fail git push --porcelain dst bogus && git --git-dir=dst/.git config receive.fsck.skipList does-not-exist && test_must_fail git push --porcelain dst bogus 2>err && - test_i18ngrep "could not open.*: does-not-exist" err && + test_grep "could not open.*: does-not-exist" err && git --git-dir=dst/.git config receive.fsck.skipList config && test_must_fail git push --porcelain dst bogus 2>err && - test_i18ngrep "invalid object name: \[core\]" err && + test_grep "invalid object name: \[core\]" err && git --git-dir=dst/.git config receive.fsck.skipList SKIP && git push --porcelain dst bogus @@ -260,10 +260,10 @@ test_expect_success 'fetch with fetch.fsck.skipList' ' test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec && git --git-dir=dst/.git config fetch.fsck.skipList does-not-exist && test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec 2>err && - test_i18ngrep "could not open.*: does-not-exist" err && + test_grep "could not open.*: does-not-exist" err && git --git-dir=dst/.git config fetch.fsck.skipList dst/.git/config && test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec 2>err && - test_i18ngrep "invalid object name: \[core\]" err && + test_grep "invalid object name: \[core\]" err && git --git-dir=dst/.git config fetch.fsck.skipList dst/.git/SKIP && git --git-dir=dst/.git fetch "file://$(pwd)" $refspec @@ -271,7 +271,7 @@ test_expect_success 'fetch with fetch.fsck.skipList' ' test_expect_success 'fsck.<unknownmsg-id> dies' ' test_must_fail git -c fsck.whatEver=ignore fsck 2>err && - test_i18ngrep "Unhandled message id: whatever" err + test_grep "Unhandled message id: whatever" err ' test_expect_success 'push with receive.fsck.missingEmail=warn' ' @@ -293,7 +293,7 @@ test_expect_success 'push with receive.fsck.missingEmail=warn' ' receive.fsck.missingEmail warn && git push --porcelain dst bogus >act 2>&1 && grep "missingEmail" act && - test_i18ngrep "skipping unknown msg id.*whatever" act && + test_grep "skipping unknown msg id.*whatever" act && git --git-dir=dst/.git branch -D bogus && git --git-dir=dst/.git config --add \ receive.fsck.missingEmail ignore && @@ -321,7 +321,7 @@ test_expect_success 'fetch with fetch.fsck.missingEmail=warn' ' fetch.fsck.missingEmail warn && git --git-dir=dst/.git fetch "file://$(pwd)" $refspec >act 2>&1 && grep "missingEmail" act && - test_i18ngrep "Skipping unknown msg id.*whatever" act && + test_grep "Skipping unknown msg id.*whatever" act && rm -rf dst && git init dst && git --git-dir=dst/.git config fetch.fsckobjects true && diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index 43b7bcd715..7789ff12c4 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -1075,7 +1075,7 @@ test_expect_success 'remote prune to cause a dangling symref' ' cd eight && git remote prune origin ) >err 2>&1 && - test_i18ngrep "has become dangling" err && + test_grep "has become dangling" err && : And the dangling symref will not cause other annoying errors && ( @@ -1087,7 +1087,7 @@ test_expect_success 'remote prune to cause a dangling symref' ' cd eight && test_must_fail git branch nomore origin ) 2>err && - test_i18ngrep "dangling symref" err + test_grep "dangling symref" err ' test_expect_success 'show empty remote' ' @@ -1419,7 +1419,7 @@ test_expect_success 'extra args: setup' ' test_extra_arg () { test_expect_success "extra args: $*" " test_must_fail git remote $* bogus_extra_arg 2>actual && - test_i18ngrep '^usage:' actual + test_grep '^usage:' actual " } @@ -1453,12 +1453,12 @@ test_expect_success 'unqualified <dst> refspec DWIM and advice' ' oid=$(git rev-parse some-tag^{$type}) fi && test_must_fail git push origin $oid:dst 2>err && - test_i18ngrep "error: The destination you" err && - test_i18ngrep "hint: Did you mean" err && + test_grep "error: The destination you" err && + test_grep "hint: Did you mean" err && test_must_fail git -c advice.pushUnqualifiedRefName=false \ push origin $oid:dst 2>err && - test_i18ngrep "error: The destination you" err && - test_i18ngrep ! "hint: Did you mean" err || + test_grep "error: The destination you" err && + test_grep ! "hint: Did you mean" err || exit 1 done ) @@ -1479,16 +1479,16 @@ test_expect_success 'refs/remotes/* <src> refspec and unqualified <dst> DWIM and git fetch --no-tags two && test_must_fail git push origin refs/remotes/two/another:dst 2>err && - test_i18ngrep "error: The destination you" err && + test_grep "error: The destination you" err && test_must_fail git push origin refs/remotes/tags-from-two/my-tag:dst-tag 2>err && - test_i18ngrep "error: The destination you" err && + test_grep "error: The destination you" err && test_must_fail git push origin refs/remotes/trees-from-two/my-head-tree:dst-tree 2>err && - test_i18ngrep "error: The destination you" err && + test_grep "error: The destination you" err && test_must_fail git push origin refs/remotes/blobs-from-two/my-file-blob:dst-blob 2>err && - test_i18ngrep "error: The destination you" err + test_grep "error: The destination you" err ) ' diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 5399feda92..75ec252087 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -415,9 +415,9 @@ test_expect_success 'fetch uses remote ref names to describe new refs' ' ( cd descriptive && git fetch o 2>actual && - test_i18ngrep "new branch.* -> refs/crazyheads/descriptive-branch$" actual && - test_i18ngrep "new tag.* -> descriptive-tag$" actual && - test_i18ngrep "new ref.* -> crazy$" actual + test_grep "new branch.* -> refs/crazyheads/descriptive-branch$" actual && + test_grep "new tag.* -> descriptive-tag$" actual && + test_grep "new ref.* -> crazy$" actual ) && git checkout main ' @@ -802,7 +802,8 @@ test_expect_success 'fetch.writeCommitGraph with submodules' ' cd super-clone && rm -rf .git/objects/info && git -c fetch.writeCommitGraph=true fetch origin && - test_path_is_file .git/objects/info/commit-graphs/commit-graph-chain + test_path_is_file .git/objects/info/commit-graphs/commit-graph-chain && + git -c fetch.writeCommitGraph=true fetch --recurse-submodules origin ) ' @@ -1113,7 +1114,7 @@ test_expect_success 'fetching with auto-gc does not lock up' ' git config gc.autoPackLimit 1 && git config gc.autoDetach false && GIT_ASK_YESNO="$D/askyesno" git fetch --verbose >fetch.out 2>&1 && - test_i18ngrep "Auto packing the repository" fetch.out && + test_grep "Auto packing the repository" fetch.out && ! grep "Should I try again" fetch.out ) ' @@ -1270,7 +1271,7 @@ test_expect_success SYMLINKS 'clone does not get confused by a D/F conflict' ' git commit -m post-checkout ) && git clone df-conflict clone 2>err && - ! grep WHOOPS err && + test_grep ! WHOOPS err && test_path_is_missing whoops ' diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh index 151c76eb09..5dbe107ce8 100755 --- a/t/t5512-ls-remote.sh +++ b/t/t5512-ls-remote.sh @@ -320,7 +320,7 @@ test_expect_success 'ls-remote works outside repository' ' test_expect_success 'ls-remote --sort fails gracefully outside repository' ' # Use a sort key that requires access to the referenced objects. nongit test_must_fail git ls-remote --sort=authordate "$TRASH_DIRECTORY" 2>err && - test_i18ngrep "^fatal: not a git repository, but the field '\''authordate'\'' requires access to object data" err + test_grep "^fatal: not a git repository, but the field '\''authordate'\'' requires access to object data" err ' test_expect_success 'ls-remote patterns work with all protocol versions' ' diff --git a/t/t5514-fetch-multiple.sh b/t/t5514-fetch-multiple.sh index 98f034aa77..a95841dc36 100755 --- a/t/t5514-fetch-multiple.sh +++ b/t/t5514-fetch-multiple.sh @@ -200,8 +200,8 @@ test_expect_success 'parallel' ' test_must_fail env GIT_TRACE="$PWD/trace" \ git fetch --jobs=2 --multiple one two 2>err && grep "preparing to run up to 2 tasks" trace && - test_i18ngrep "could not fetch .one.*128" err && - test_i18ngrep "could not fetch .two.*128" err + test_grep "could not fetch .one.*128" err && + test_grep "could not fetch .two.*128" err ' test_expect_success 'git fetch --multiple --jobs=0 picks a default' ' diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 87163d7745..2e7c0e1648 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -227,7 +227,7 @@ test_expect_success 'push with negotiation proceeds anyway even if negotiation f GIT_TEST_PROTOCOL_VERSION=0 GIT_TRACE2_EVENT="$(pwd)/event" \ git -c push.negotiate=1 push testrepo refs/heads/main:refs/remotes/origin/main 2>err && grep_wrote 5 event && # 2 commits, 2 trees, 1 blob - test_i18ngrep "push negotiation failed" err + test_grep "push negotiation failed" err ' test_expect_success 'push with negotiation does not attempt to fetch submodules' ' @@ -1267,7 +1267,7 @@ test_expect_success 'fetch exact SHA1' ' # fetching the hidden object should fail by default test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 \ git fetch -v ../testrepo $the_commit:refs/heads/copy 2>err && - test_i18ngrep "Server does not allow request for unadvertised object" err && + test_grep "Server does not allow request for unadvertised object" err && test_must_fail git rev-parse --verify refs/heads/copy && # the server side can allow it to succeed @@ -1369,7 +1369,7 @@ do git fetch ../testrepo/.git $SHA1_3 2>err && # ideally we would insist this be on a "remote error:" # line, but it is racy; see the commit message - test_i18ngrep "not our ref.*$SHA1_3\$" err + test_grep "not our ref.*$SHA1_3\$" err ) ' done @@ -1407,7 +1407,7 @@ test_expect_success 'peeled advertisements are not considered ref tips' ' oid=$(git -C testrepo rev-parse mytag^{commit}) && test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 \ git fetch testrepo $oid 2>err && - test_i18ngrep "Server does not allow request for unadvertised object" err + test_grep "Server does not allow request for unadvertised object" err ' test_expect_success 'pushing a specific ref applies remote.$name.push as refmap' ' diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh index 0b72112fb1..47534f1062 100755 --- a/t/t5520-pull.sh +++ b/t/t5520-pull.sh @@ -31,7 +31,7 @@ test_pull_autostash_fail () { echo dirty >new_file && git add new_file && test_must_fail git pull "$@" . copy 2>err && - test_i18ngrep -E "uncommitted changes.|overwritten by merge:" err + test_grep -E "uncommitted changes.|overwritten by merge:" err } test_expect_success setup ' @@ -151,7 +151,7 @@ test_expect_success 'fail if wildcard spec does not match any refs' ' echo file >expect && test_cmp expect file && test_must_fail git pull . "refs/nonexisting1/*:refs/nonexisting2/*" 2>err && - test_i18ngrep "no candidates for merging" err && + test_grep "no candidates for merging" err && test_cmp expect file ' @@ -164,7 +164,7 @@ test_expect_success 'fail if no branches specified with non-default remote' ' test_cmp expect file && test_config branch.test.remote origin && test_must_fail git pull test_remote 2>err && - test_i18ngrep "specify a branch on the command line" err && + test_grep "specify a branch on the command line" err && test_cmp expect file ' @@ -176,7 +176,7 @@ test_expect_success 'fail if not on a branch' ' echo file >expect && test_cmp expect file && test_must_fail git pull 2>err && - test_i18ngrep "not currently on a branch" err && + test_grep "not currently on a branch" err && test_cmp expect file ' @@ -189,7 +189,7 @@ test_expect_success 'fail if no configuration for current branch' ' echo file >expect && test_cmp expect file && test_must_fail git pull 2>err && - test_i18ngrep "no tracking information" err && + test_grep "no tracking information" err && test_cmp expect file ' @@ -202,7 +202,7 @@ test_expect_success 'pull --all: fail if no configuration for current branch' ' echo file >expect && test_cmp expect file && test_must_fail git pull --all 2>err && - test_i18ngrep "There is no tracking information" err && + test_grep "There is no tracking information" err && test_cmp expect file ' @@ -214,7 +214,7 @@ test_expect_success 'fail if upstream branch does not exist' ' echo file >expect && test_cmp expect file && test_must_fail git pull 2>err && - test_i18ngrep "no such ref was fetched" err && + test_grep "no such ref was fetched" err && test_cmp expect file ' @@ -248,13 +248,13 @@ test_expect_success 'fail if the index has unresolved entries' ' test_file_not_empty unmerged && cp file expected && test_must_fail git pull . second 2>err && - test_i18ngrep "Pulling is not possible because you have unmerged files." err && + test_grep "Pulling is not possible because you have unmerged files." err && test_cmp expected file && git add file && git ls-files -u >unmerged && test_must_be_empty unmerged && test_must_fail git pull . second 2>err && - test_i18ngrep "You have not concluded your merge" err && + test_grep "You have not concluded your merge" err && test_cmp expected file ' @@ -264,7 +264,7 @@ test_expect_success 'fast-forwards working tree if branch head is updated' ' echo file >expect && test_cmp expect file && git pull . second:third 2>err && - test_i18ngrep "fetch updated the current branch head" err && + test_grep "fetch updated the current branch head" err && echo modified >expect && test_cmp expect file && test_cmp_rev third second @@ -277,7 +277,7 @@ test_expect_success 'fast-forward fails with conflicting work tree' ' test_cmp expect file && echo conflict >file && test_must_fail git pull . second:third 2>err && - test_i18ngrep "Cannot fast-forward your working tree" err && + test_grep "Cannot fast-forward your working tree" err && echo conflict >expect && test_cmp expect file && test_cmp_rev third second @@ -375,7 +375,7 @@ test_expect_success '--rebase with conflicts shows advice' ' test_tick && git commit -m "Create conflict" seq.txt && test_must_fail git pull --rebase . seq 2>err >out && - test_i18ngrep "Resolve all conflicts manually" err + test_grep "Resolve all conflicts manually" err ' test_expect_success 'failed --rebase shows advice' ' @@ -389,14 +389,14 @@ test_expect_success 'failed --rebase shows advice' ' git checkout -f -b fails-to-rebase HEAD^ && test_commit v2-without-cr file "2" file2-lf && test_must_fail git pull --rebase . diverging 2>err >out && - test_i18ngrep "Resolve all conflicts manually" err + test_grep "Resolve all conflicts manually" err ' test_expect_success '--rebase fails with multiple branches' ' git reset --hard before-rebase && test_must_fail git pull --rebase . copy main 2>err && test_cmp_rev HEAD before-rebase && - test_i18ngrep "Cannot rebase onto multiple branches" err && + test_grep "Cannot rebase onto multiple branches" err && echo modified >expect && git show HEAD:file >actual && test_cmp expect actual @@ -520,7 +520,7 @@ test_expect_success 'pull --rebase warns on --verify-signatures' ' echo new >expect && git show HEAD:file2 >actual && test_cmp expect actual && - test_i18ngrep "ignoring --verify-signatures for rebase" err + test_grep "ignoring --verify-signatures for rebase" err ' test_expect_success 'pull --rebase does not warn on --no-verify-signatures' ' @@ -530,7 +530,7 @@ test_expect_success 'pull --rebase does not warn on --no-verify-signatures' ' echo new >expect && git show HEAD:file2 >actual && test_cmp expect actual && - test_i18ngrep ! "verify-signatures" err + test_grep ! "verify-signatures" err ' # add a feature branch, keep-merge, that is merged into main, so the @@ -740,7 +740,7 @@ test_expect_success 'pull --rebase fails on unborn branch with staged changes' ' test_cmp expect actual && git show :staged-file >actual && test_cmp expect actual && - test_i18ngrep "unborn branch with changes added to the index" err + test_grep "unborn branch with changes added to the index" err ) ' diff --git a/t/t5521-pull-options.sh b/t/t5521-pull-options.sh index 264de29c35..db00c4336b 100755 --- a/t/t5521-pull-options.sh +++ b/t/t5521-pull-options.sh @@ -5,6 +5,7 @@ test_description='pull options' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'setup' ' @@ -93,7 +94,7 @@ test_expect_success 'git pull --no-write-fetch-head fails' ' (cd clonedwfh && git init && test_expect_code 129 git pull --no-write-fetch-head "../parent" >out 2>err && test_must_be_empty out && - test_i18ngrep "no-write-fetch-head" err) + test_grep "no-write-fetch-head" err) ' test_expect_success 'git pull --force' ' @@ -142,7 +143,7 @@ test_expect_success 'git pull --dry-run' ' cd clonedry && git pull --dry-run ../parent && test_path_is_missing .git/FETCH_HEAD && - test_path_is_missing .git/refs/heads/main && + test_ref_missing refs/heads/main && test_path_is_missing .git/index && test_path_is_missing file ) @@ -156,7 +157,7 @@ test_expect_success 'git pull --all --dry-run' ' git remote add origin ../parent && git pull --all --dry-run && test_path_is_missing .git/FETCH_HEAD && - test_path_is_missing .git/refs/remotes/origin/main && + test_ref_missing refs/remotes/origin/main && test_path_is_missing .git/index && test_path_is_missing file ) diff --git a/t/t5523-push-upstream.sh b/t/t5523-push-upstream.sh index 1b8d609879..1f859ade16 100755 --- a/t/t5523-push-upstream.sh +++ b/t/t5523-push-upstream.sh @@ -87,7 +87,7 @@ test_expect_success TTY 'progress messages go to tty' ' ensure_fresh_upstream && test_terminal git push -u upstream main >out 2>err && - test_i18ngrep "Writing objects" err + test_grep "Writing objects" err ' test_expect_success 'progress messages do not go to non-tty' ' @@ -95,7 +95,7 @@ test_expect_success 'progress messages do not go to non-tty' ' # skip progress messages, since stderr is non-tty git push -u upstream main >out 2>err && - test_i18ngrep ! "Writing objects" err + test_grep ! "Writing objects" err ' test_expect_success 'progress messages go to non-tty (forced)' ' @@ -103,22 +103,22 @@ test_expect_success 'progress messages go to non-tty (forced)' ' # force progress messages to stderr, even though it is non-tty git push -u --progress upstream main >out 2>err && - test_i18ngrep "Writing objects" err + test_grep "Writing objects" err ' test_expect_success TTY 'push -q suppresses progress' ' ensure_fresh_upstream && test_terminal git push -u -q upstream main >out 2>err && - test_i18ngrep ! "Writing objects" err + test_grep ! "Writing objects" err ' test_expect_success TTY 'push --no-progress suppresses progress' ' ensure_fresh_upstream && test_terminal git push -u --no-progress upstream main >out 2>err && - test_i18ngrep ! "Unpacking objects" err && - test_i18ngrep ! "Writing objects" err + test_grep ! "Unpacking objects" err && + test_grep ! "Writing objects" err ' test_expect_success TTY 'quiet push' ' diff --git a/t/t5528-push-default.sh b/t/t5528-push-default.sh index 284e20fefd..14f7eced9a 100755 --- a/t/t5528-push-default.sh +++ b/t/t5528-push-default.sh @@ -179,7 +179,7 @@ test_expect_success 'push from/to new branch succeeds with simple if push.autoSe test_expect_success '"matching" fails if none match' ' git init --bare empty && test_must_fail git push empty : 2>actual && - test_i18ngrep "Perhaps you should specify a branch" actual + test_grep "Perhaps you should specify a branch" actual ' test_expect_success 'push ambiguously named branch with upstream, matching and simple' ' diff --git a/t/t5530-upload-pack-error.sh b/t/t5530-upload-pack-error.sh index 7c1460eaa9..7172780d55 100755 --- a/t/t5530-upload-pack-error.sh +++ b/t/t5530-upload-pack-error.sh @@ -2,6 +2,7 @@ test_description='errors in upload-pack' +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh D=$(pwd) @@ -35,8 +36,8 @@ test_expect_success 'upload-pack fails due to error in pack-objects packing' ' printf "%04xwant %s\n00000009done\n0000" \ $(($hexsz + 10)) $head >input && test_must_fail git upload-pack . <input >/dev/null 2>output.err && - test_i18ngrep "unable to read" output.err && - test_i18ngrep "pack-objects died" output.err + test_grep "unable to read" output.err && + test_grep "pack-objects died" output.err ' test_expect_success 'corrupt repo differently' ' diff --git a/t/t5531-deep-submodule-push.sh b/t/t5531-deep-submodule-push.sh index 302e4cbdba..f3fff55744 100755 --- a/t/t5531-deep-submodule-push.sh +++ b/t/t5531-deep-submodule-push.sh @@ -311,7 +311,7 @@ test_expect_success 'submodule entry pointing at a tag is error' ' git -C work commit -m "bad commit" && test_when_finished "git -C work reset --hard HEAD^" && test_must_fail git -C work push --recurse-submodules=on-demand ../pub.git main 2>err && - test_i18ngrep "is a tag, not a commit" err + test_grep "is a tag, not a commit" err ' test_expect_success 'push fails if recurse submodules option passed as yes' ' diff --git a/t/t5534-push-signed.sh b/t/t5534-push-signed.sh index 7c0a148e73..b4bc24691c 100755 --- a/t/t5534-push-signed.sh +++ b/t/t5534-push-signed.sh @@ -68,13 +68,13 @@ test_expect_success 'talking with a receiver without push certificate support' ' test_expect_success 'push --signed fails with a receiver without push certificate support' ' prepare_dst && test_must_fail git push --signed dst noop ff +noff 2>err && - test_i18ngrep "the receiving end does not support" err + test_grep "the receiving end does not support" err ' test_expect_success 'push --signed=1 is accepted' ' prepare_dst && test_must_fail git push --signed=1 dst noop ff +noff 2>err && - test_i18ngrep "the receiving end does not support" err + test_grep "the receiving end does not support" err ' test_expect_success GPG 'no certificate for a signed push with no update' ' @@ -378,7 +378,7 @@ test_expect_success GPG 'failed atomic push does not execute GPG' ' --signed --atomic --porcelain \ dst noop ff noff >out 2>err && - test_i18ngrep ! "gpg failed to sign" err && + test_grep ! "gpg failed to sign" err && cat >expect <<-EOF && To dst = refs/heads/noop:refs/heads/noop [up to date] diff --git a/t/t5536-fetch-conflicts.sh b/t/t5536-fetch-conflicts.sh index 91f28c2f78..23bf696170 100755 --- a/t/t5536-fetch-conflicts.sh +++ b/t/t5536-fetch-conflicts.sh @@ -40,7 +40,7 @@ test_expect_success 'fetch conflict: config vs. config' ' "+refs/heads/branch2:refs/remotes/origin/branch1" && ( cd ccc && test_must_fail git fetch origin 2>error && - test_i18ngrep "fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1" error + test_grep "fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1" error ) ' @@ -67,7 +67,7 @@ test_expect_success 'fetch conflict: arg vs. arg' ' test_must_fail git fetch origin \ refs/heads/*:refs/remotes/origin/* \ refs/heads/branch2:refs/remotes/origin/branch1 2>error && - test_i18ngrep "fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1" error + test_grep "fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1" error ) ' @@ -78,8 +78,8 @@ test_expect_success 'fetch conflict: criss-cross args' ' git fetch origin \ refs/heads/branch1:refs/remotes/origin/branch2 \ refs/heads/branch2:refs/remotes/origin/branch1 2>error && - test_i18ngrep "warning: refs/remotes/origin/branch1 usually tracks refs/heads/branch1, not refs/heads/branch2" error && - test_i18ngrep "warning: refs/remotes/origin/branch2 usually tracks refs/heads/branch2, not refs/heads/branch1" error + test_grep "warning: refs/remotes/origin/branch1 usually tracks refs/heads/branch1, not refs/heads/branch2" error && + test_grep "warning: refs/remotes/origin/branch2 usually tracks refs/heads/branch2, not refs/heads/branch1" error ) ' diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh index 2cd2e1a059..849c92ed72 100755 --- a/t/t5541-http-push-smart.sh +++ b/t/t5541-http-push-smart.sh @@ -153,7 +153,7 @@ test_expect_success 'push fails for non-fast-forward refs unmatched by remote he ' test_expect_success 'push fails for non-fast-forward refs unmatched by remote helper: our output' ' - test_i18ngrep "Updates were rejected because" \ + test_grep "Updates were rejected because" \ output ' @@ -297,7 +297,7 @@ test_expect_success TTY 'push shows progress when stderr is a tty' ' cd "$ROOT_PATH"/test_repo_clone && test_commit noisy && test_terminal git push >output 2>&1 && - test_i18ngrep "^Writing objects" output + test_grep "^Writing objects" output ' test_expect_success TTY 'push --quiet silences status and progress' ' @@ -311,16 +311,16 @@ test_expect_success TTY 'push --no-progress silences progress but not status' ' cd "$ROOT_PATH"/test_repo_clone && test_commit no-progress && test_terminal git push --no-progress >output 2>&1 && - test_i18ngrep "^To http" output && - test_i18ngrep ! "^Writing objects" output + test_grep "^To http" output && + test_grep ! "^Writing objects" output ' test_expect_success 'push --progress shows progress to non-tty' ' cd "$ROOT_PATH"/test_repo_clone && test_commit progress && git push --progress >output 2>&1 && - test_i18ngrep "^To http" output && - test_i18ngrep "^Writing objects" output + test_grep "^To http" output && + test_grep "^Writing objects" output ' test_expect_success 'http push gives sane defaults to reflog' ' @@ -489,10 +489,10 @@ test_expect_success 'colorize errors/hints' ' -c color.push=always \ push origin origin/main^:main 2>act && test_decode_color <act >decoded && - test_i18ngrep "<RED>.*rejected.*<RESET>" decoded && - test_i18ngrep "<RED>error: failed to push some refs" decoded && - test_i18ngrep "<YELLOW>hint: " decoded && - test_i18ngrep ! "^hint: " decoded + test_grep "<RED>.*rejected.*<RESET>" decoded && + test_grep "<RED>error: failed to push some refs" decoded && + test_grep "<YELLOW>hint: " decoded && + test_grep ! "^hint: " decoded ' test_expect_success 'report error server does not provide ref status' ' diff --git a/t/t5545-push-options.sh b/t/t5545-push-options.sh index a158e7d2c0..fb13549da7 100755 --- a/t/t5545-push-options.sh +++ b/t/t5545-push-options.sh @@ -252,7 +252,7 @@ test_expect_success 'push option denied properly by http server' ' mk_http_pair false && test_commit -C test_http_clone one && test_must_fail git -C test_http_clone push --push-option=asdf origin main 2>actual && - test_i18ngrep "the receiving end does not support push options" actual && + test_grep "the receiving end does not support push options" actual && git -C test_http_clone push origin main ' diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh index 5d0e394609..c5fe7c37ab 100755 --- a/t/t5550-http-fetch-dumb.sh +++ b/t/t5550-http-fetch-dumb.sh @@ -376,7 +376,7 @@ test_expect_success 'git client send an empty Accept-Language' ' test_expect_success 'remote-http complains cleanly about malformed urls' ' test_must_fail git remote-http http::/example.com/repo.git 2>stderr && - test_i18ngrep "url has no scheme" stderr + test_grep "url has no scheme" stderr ' # NEEDSWORK: Writing commands to git-remote-curl can race against the latter @@ -385,7 +385,7 @@ test_expect_success 'remote-http complains cleanly about malformed urls' ' test_expect_success 'remote-http complains cleanly about empty scheme' ' test_must_fail ok=sigpipe git ls-remote \ http::${HTTPD_URL#http}/dumb/repo.git 2>stderr && - test_i18ngrep "url has no scheme" stderr + test_grep "url has no scheme" stderr ' test_expect_success 'redirects can be forbidden/allowed' ' @@ -397,7 +397,7 @@ test_expect_success 'redirects can be forbidden/allowed' ' test_expect_success 'redirects are reported to stderr' ' # just look for a snippet of the redirected-to URL - test_i18ngrep /dumb/ stderr + test_grep /dumb/ stderr ' test_expect_success 'non-initial redirects can be forbidden' ' @@ -466,7 +466,7 @@ test_expect_success 'can redirect through non-"info/refs?service=git-upload-pack test_expect_success 'print HTTP error when any intermediate redirect throws error' ' test_must_fail git clone "$HTTPD_URL/redir-to/502" 2> stderr && - test_i18ngrep "unable to access.*/redir-to/502" stderr + test_grep "unable to access.*/redir-to/502" stderr ' test_expect_success 'fetching via http alternates works' ' diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh index 18b78b2595..124dd437ac 100755 --- a/t/t5551-http-fetch-smart.sh +++ b/t/t5551-http-fetch-smart.sh @@ -275,7 +275,7 @@ test_expect_success 'GIT_SMART_HTTP can disable smart http' ' test_expect_success 'invalid Content-Type rejected' ' test_must_fail git clone $HTTPD_URL/broken_smart/repo.git 2>actual && - test_i18ngrep "not valid:" actual + test_grep "not valid:" actual ' test_expect_success 'create namespaced refs' ' @@ -359,7 +359,9 @@ create_tags () { # now assign tags to all the dangling commits we created above tag=$(perl -e "print \"bla\" x 30") && - sed -e "s|^:\([^ ]*\) \(.*\)$|\2 refs/tags/$tag-\1|" <marks >>packed-refs + sed -e "s|^:\([^ ]*\) \(.*\)$|create refs/tags/$tag-\1 \2|" <marks >input && + git update-ref --stdin <input && + rm input } test_expect_success 'create 2,000 tags in the repo' ' @@ -558,7 +560,7 @@ test_expect_success 'GIT_TRACE_CURL_NO_DATA prevents data from being traced' ' test_expect_success 'server-side error detected' ' test_must_fail git clone $HTTPD_URL/error_smart/repo.git 2>actual && - test_i18ngrep "server-side error" actual + test_grep "server-side error" actual ' test_expect_success 'http auth remembers successful credentials' ' diff --git a/t/t5562/invoke-with-content-length.pl b/t/t5562/invoke-with-content-length.pl index 718dd9b49d..9babb9a375 100644 --- a/t/t5562/invoke-with-content-length.pl +++ b/t/t5562/invoke-with-content-length.pl @@ -1,4 +1,4 @@ -use 5.008; +use 5.008001; use strict; use warnings; diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh index 1131503b76..f9a9bf9503 100755 --- a/t/t5570-git-daemon.sh +++ b/t/t5570-git-daemon.sh @@ -10,9 +10,9 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME start_git_daemon check_verbose_connect () { - test_i18ngrep -F "Looking up 127.0.0.1 ..." stderr && - test_i18ngrep -F "Connecting to 127.0.0.1 (port " stderr && - test_i18ngrep -F "done." stderr + test_grep -F "Looking up 127.0.0.1 ..." stderr && + test_grep -F "Connecting to 127.0.0.1 (port " stderr && + test_grep -F "done." stderr } test_expect_success 'setup repository' ' @@ -108,7 +108,7 @@ test_expect_success 'fetch notices corrupt idx' ' test_expect_success 'client refuses to ask for repo with newline' ' test_must_fail git clone "$GIT_DAEMON_URL/repo$LF.git" dst 2>stderr && - test_i18ngrep newline.is.forbidden stderr + test_grep newline.is.forbidden stderr ' test_remote_error() @@ -148,7 +148,7 @@ test_remote_error() fi test_must_fail git "$cmd" "$GIT_DAEMON_URL/$repo" "$@" 2>output && - test_i18ngrep "fatal: remote error: $msg: /$repo" output && + test_grep "fatal: remote error: $msg: /$repo" output && ret=$? chmod +x "$GIT_DAEMON_DOCUMENT_ROOT_PATH/repo.git" (exit $ret) diff --git a/t/t5572-pull-submodule.sh b/t/t5572-pull-submodule.sh index 4e917bf87d..51744521f7 100755 --- a/t/t5572-pull-submodule.sh +++ b/t/t5572-pull-submodule.sh @@ -177,7 +177,7 @@ test_expect_success 'pull --rebase --recurse-submodules fails if both sides reco # submodule itself, but the merge strategy in submodules # does not support rebase: test_must_fail git -C super pull --rebase --recurse-submodules 2>err && - test_i18ngrep "locally recorded submodule modifications" err + test_grep "locally recorded submodule modifications" err ' test_expect_success 'pull --rebase --recurse-submodules (no submodule changes, no fork-point)' ' diff --git a/t/t5573-pull-verify-signatures.sh b/t/t5573-pull-verify-signatures.sh index 1221ac0597..ab05f38a99 100755 --- a/t/t5573-pull-verify-signatures.sh +++ b/t/t5573-pull-verify-signatures.sh @@ -47,46 +47,46 @@ test_expect_success GPG 'create repositories with signed commits' ' test_expect_success GPG 'pull unsigned commit with --verify-signatures' ' test_when_finished "git reset --hard && git checkout initial" && test_must_fail git pull --ff-only --verify-signatures unsigned 2>pullerror && - test_i18ngrep "does not have a GPG signature" pullerror + test_grep "does not have a GPG signature" pullerror ' test_expect_success GPG 'pull commit with bad signature with --verify-signatures' ' test_when_finished "git reset --hard && git checkout initial" && test_must_fail git pull --ff-only --verify-signatures bad 2>pullerror && - test_i18ngrep "has a bad GPG signature" pullerror + test_grep "has a bad GPG signature" pullerror ' test_expect_success GPG 'pull commit with untrusted signature with --verify-signatures' ' test_when_finished "git reset --hard && git checkout initial" && test_must_fail git pull --ff-only --verify-signatures untrusted 2>pullerror && - test_i18ngrep "has an untrusted GPG signature" pullerror + test_grep "has an untrusted GPG signature" pullerror ' test_expect_success GPG 'pull commit with untrusted signature with --verify-signatures and minTrustLevel=ultimate' ' test_when_finished "git reset --hard && git checkout initial" && test_config gpg.minTrustLevel ultimate && test_must_fail git pull --ff-only --verify-signatures untrusted 2>pullerror && - test_i18ngrep "has an untrusted GPG signature" pullerror + test_grep "has an untrusted GPG signature" pullerror ' test_expect_success GPG 'pull commit with untrusted signature with --verify-signatures and minTrustLevel=marginal' ' test_when_finished "git reset --hard && git checkout initial" && test_config gpg.minTrustLevel marginal && test_must_fail git pull --ff-only --verify-signatures untrusted 2>pullerror && - test_i18ngrep "has an untrusted GPG signature" pullerror + test_grep "has an untrusted GPG signature" pullerror ' test_expect_success GPG 'pull commit with untrusted signature with --verify-signatures and minTrustLevel=undefined' ' test_when_finished "git reset --hard && git checkout initial" && test_config gpg.minTrustLevel undefined && git pull --ff-only --verify-signatures untrusted >pulloutput && - test_i18ngrep "has a good GPG signature" pulloutput + test_grep "has a good GPG signature" pulloutput ' test_expect_success GPG 'pull signed commit with --verify-signatures' ' test_when_finished "git reset --hard && git checkout initial" && git pull --verify-signatures signed >pulloutput && - test_i18ngrep "has a good GPG signature" pulloutput + test_grep "has a good GPG signature" pulloutput ' test_expect_success GPG 'pull commit with bad signature without verification' ' @@ -106,7 +106,7 @@ test_expect_success GPG 'pull unsigned commit into unborn branch' ' git init empty-repo && test_must_fail \ git -C empty-repo pull --verify-signatures .. 2>pullerror && - test_i18ngrep "does not have a GPG signature" pullerror + test_grep "does not have a GPG signature" pullerror ' test_expect_success GPG 'pull commit into unborn branch with bad signature and --verify-signatures' ' @@ -114,7 +114,7 @@ test_expect_success GPG 'pull commit into unborn branch with bad signature and - git init empty-repo && test_must_fail \ git -C empty-repo pull --ff-only --verify-signatures ../bad 2>pullerror && - test_i18ngrep "has a bad GPG signature" pullerror + test_grep "has a bad GPG signature" pullerror ' test_expect_success GPG 'pull commit into unborn branch with untrusted signature and --verify-signatures' ' @@ -122,7 +122,7 @@ test_expect_success GPG 'pull commit into unborn branch with untrusted signature git init empty-repo && test_must_fail \ git -C empty-repo pull --ff-only --verify-signatures ../untrusted 2>pullerror && - test_i18ngrep "has an untrusted GPG signature" pullerror + test_grep "has an untrusted GPG signature" pullerror ' test_expect_success GPG 'pull commit into unborn branch with untrusted signature and --verify-signatures and minTrustLevel=ultimate' ' @@ -131,7 +131,7 @@ test_expect_success GPG 'pull commit into unborn branch with untrusted signature test_config_global gpg.minTrustLevel ultimate && test_must_fail \ git -C empty-repo pull --ff-only --verify-signatures ../untrusted 2>pullerror && - test_i18ngrep "has an untrusted GPG signature" pullerror + test_grep "has an untrusted GPG signature" pullerror ' test_expect_success GPG 'pull commit into unborn branch with untrusted signature and --verify-signatures and minTrustLevel=marginal' ' @@ -140,7 +140,7 @@ test_expect_success GPG 'pull commit into unborn branch with untrusted signature test_config_global gpg.minTrustLevel marginal && test_must_fail \ git -C empty-repo pull --ff-only --verify-signatures ../untrusted 2>pullerror && - test_i18ngrep "has an untrusted GPG signature" pullerror + test_grep "has an untrusted GPG signature" pullerror ' test_expect_success GPG 'pull commit into unborn branch with untrusted signature and --verify-signatures and minTrustLevel=undefined' ' @@ -148,7 +148,7 @@ test_expect_success GPG 'pull commit into unborn branch with untrusted signature git init empty-repo && test_config_global gpg.minTrustLevel undefined && git -C empty-repo pull --ff-only --verify-signatures ../untrusted >pulloutput && - test_i18ngrep "has a good GPG signature" pulloutput + test_grep "has a good GPG signature" pulloutput ' test_done diff --git a/t/t5574-fetch-output.sh b/t/t5574-fetch-output.sh index 90e6dcb9a7..5883839a04 100755 --- a/t/t5574-fetch-output.sh +++ b/t/t5574-fetch-output.sh @@ -61,11 +61,10 @@ test_expect_success 'fetch compact output' ' test_cmp expect actual ' -test_expect_success 'fetch porcelain output' ' - test_when_finished "rm -rf porcelain" && - +test_expect_success 'setup for fetch porcelain output' ' # Set up a bunch of references that we can use to demonstrate different # kinds of flag symbols in the output format. + test_commit commit-for-porcelain-output && MAIN_OLD=$(git rev-parse HEAD) && git branch "fast-forward" && git branch "deleted-branch" && @@ -74,15 +73,10 @@ test_expect_success 'fetch porcelain output' ' FORCE_UPDATED_OLD=$(git rev-parse HEAD) && git checkout main && - # Clone and pre-seed the repositories. We fetch references into two - # namespaces so that we can test that rejected and force-updated - # references are reported properly. - refspecs="refs/heads/*:refs/unforced/* +refs/heads/*:refs/forced/*" && - git clone . porcelain && - git -C porcelain fetch origin $refspecs && + # Backup to preseed.git + git clone --mirror . preseed.git && - # Now that we have set up the client repositories we can change our - # local references. + # Continue changing our local references. git branch new-branch && git branch -d deleted-branch && git checkout fast-forward && @@ -91,36 +85,53 @@ test_expect_success 'fetch porcelain output' ' git checkout force-updated && git reset --hard HEAD~ && test_commit --no-tag force-update-new && - FORCE_UPDATED_NEW=$(git rev-parse HEAD) && - - cat >expect <<-EOF && - - $MAIN_OLD $ZERO_OID refs/forced/deleted-branch - - $MAIN_OLD $ZERO_OID refs/unforced/deleted-branch - $MAIN_OLD $FAST_FORWARD_NEW refs/unforced/fast-forward - ! $FORCE_UPDATED_OLD $FORCE_UPDATED_NEW refs/unforced/force-updated - * $ZERO_OID $MAIN_OLD refs/unforced/new-branch - $MAIN_OLD $FAST_FORWARD_NEW refs/forced/fast-forward - + $FORCE_UPDATED_OLD $FORCE_UPDATED_NEW refs/forced/force-updated - * $ZERO_OID $MAIN_OLD refs/forced/new-branch - $MAIN_OLD $FAST_FORWARD_NEW refs/remotes/origin/fast-forward - + $FORCE_UPDATED_OLD $FORCE_UPDATED_NEW refs/remotes/origin/force-updated - * $ZERO_OID $MAIN_OLD refs/remotes/origin/new-branch - EOF - - # Execute a dry-run fetch first. We do this to assert that the dry-run - # and non-dry-run fetches produces the same output. Execution of the - # fetch is expected to fail as we have a rejected reference update. - test_must_fail git -C porcelain fetch \ - --porcelain --dry-run --prune origin $refspecs >actual && - test_cmp expect actual && - - # And now we perform a non-dry-run fetch. - test_must_fail git -C porcelain fetch \ - --porcelain --prune origin $refspecs >actual 2>stderr && - test_cmp expect actual && - test_must_be_empty stderr + FORCE_UPDATED_NEW=$(git rev-parse HEAD) ' +for opt in "" "--atomic" +do + test_expect_success "fetch porcelain output ${opt:+(atomic)}" ' + test_when_finished "rm -rf porcelain" && + + # Clone and pre-seed the repositories. We fetch references into two + # namespaces so that we can test that rejected and force-updated + # references are reported properly. + refspecs="refs/heads/*:refs/unforced/* +refs/heads/*:refs/forced/*" && + git clone preseed.git porcelain && + git -C porcelain fetch origin $opt $refspecs && + + cat >expect <<-EOF && + - $MAIN_OLD $ZERO_OID refs/forced/deleted-branch + - $MAIN_OLD $ZERO_OID refs/unforced/deleted-branch + $MAIN_OLD $FAST_FORWARD_NEW refs/unforced/fast-forward + ! $FORCE_UPDATED_OLD $FORCE_UPDATED_NEW refs/unforced/force-updated + * $ZERO_OID $MAIN_OLD refs/unforced/new-branch + $MAIN_OLD $FAST_FORWARD_NEW refs/forced/fast-forward + + $FORCE_UPDATED_OLD $FORCE_UPDATED_NEW refs/forced/force-updated + * $ZERO_OID $MAIN_OLD refs/forced/new-branch + $MAIN_OLD $FAST_FORWARD_NEW refs/remotes/origin/fast-forward + + $FORCE_UPDATED_OLD $FORCE_UPDATED_NEW refs/remotes/origin/force-updated + * $ZERO_OID $MAIN_OLD refs/remotes/origin/new-branch + EOF + + # Change the URL of the repository to fetch different references. + git -C porcelain remote set-url origin .. && + + # Execute a dry-run fetch first. We do this to assert that the dry-run + # and non-dry-run fetches produces the same output. Execution of the + # fetch is expected to fail as we have a rejected reference update. + test_must_fail git -C porcelain fetch $opt \ + --porcelain --dry-run --prune origin $refspecs >actual && + test_cmp expect actual && + + # And now we perform a non-dry-run fetch. + test_must_fail git -C porcelain fetch $opt \ + --porcelain --prune origin $refspecs >actual 2>stderr && + test_cmp expect actual && + test_must_be_empty stderr + ' +done + test_expect_success 'fetch porcelain with multiple remotes' ' test_when_finished "rm -rf porcelain" && @@ -281,12 +292,12 @@ test_expect_success '--no-show-forced-updates' ' ( cd forced-update-clone && git fetch --show-forced-updates origin 2>output && - test_i18ngrep "(forced update)" output + test_grep "(forced update)" output ) && ( cd no-forced-update-clone && git fetch --no-show-forced-updates origin 2>output && - test_i18ngrep ! "(forced update)" output + test_grep ! "(forced update)" output ) ' diff --git a/t/t5580-unc-paths.sh b/t/t5580-unc-paths.sh index cd7604fff9..d7537a162b 100755 --- a/t/t5580-unc-paths.sh +++ b/t/t5580-unc-paths.sh @@ -75,7 +75,7 @@ test_expect_success push ' test_expect_success MINGW 'remote nick cannot contain backslashes' ' BACKSLASHED="$(winpwd | tr / \\\\)" && git ls-remote "$BACKSLASHED" 2>err && - test_i18ngrep ! "unable to access" err + test_grep ! "unable to access" err ' test_expect_success 'unc alternates' ' diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index 17c287d7b8..ddc833f27b 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -630,7 +630,7 @@ test_expect_success 'clone on case-insensitive fs' ' test_expect_success CASE_INSENSITIVE_FS 'colliding file detection' ' grep X icasefs/warning && grep x icasefs/warning && - test_i18ngrep "the following paths have collided" icasefs/warning + test_grep "the following paths have collided" icasefs/warning ' test_expect_success CASE_INSENSITIVE_FS,SYMLINKS \ @@ -711,7 +711,7 @@ test_expect_success 'partial clone: warn if server does not support object filte git clone --filter=blob:limit=0 "file://$(pwd)/server" client 2> err && - test_i18ngrep "filtering not recognized by server" err + test_grep "filtering not recognized by server" err ' test_expect_success 'batch missing blob request during checkout' ' @@ -782,7 +782,7 @@ test_expect_success 'reject cloning shallow repository using HTTP' ' test_when_finished "rm -rf repo" && git clone --bare --no-local --depth=1 src "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && test_must_fail git -c protocol.version=2 clone --reject-shallow $HTTPD_URL/smart/repo.git repo 2>err && - test_i18ngrep -e "source repository is shallow, reject to clone." err && + test_grep -e "source repository is shallow, reject to clone." err && git clone --no-reject-shallow $HTTPD_URL/smart/repo.git repo ' diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh index 9845fc04d5..9b32db8478 100755 --- a/t/t5604-clone-reference.sh +++ b/t/t5604-clone-reference.sh @@ -317,7 +317,7 @@ test_expect_success SYMLINKS 'clone repo with symlinked or unknown files at obje for option in --local --no-hardlinks --dissociate do test_must_fail git clone $option T T$option 2>err || return 1 && - test_i18ngrep "symlink.*exists" err || return 1 + test_grep "symlink.*exists" err || return 1 done && # But `--shared` clones should still work, even when specifying diff --git a/t/t5605-clone-local.sh b/t/t5605-clone-local.sh index 1d7b1abda1..946c575188 100755 --- a/t/t5605-clone-local.sh +++ b/t/t5605-clone-local.sh @@ -69,7 +69,7 @@ test_expect_success 'local clone of repo with nonexistent ref in HEAD' ' git clone a d && (cd d && git fetch && - test ! -e .git/refs/remotes/origin/HEAD) + test_ref_missing refs/remotes/origin/HEAD) ' test_expect_success 'bundle clone without .bundle suffix' ' diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh index 5890319b97..a400bcca62 100755 --- a/t/t5606-clone-options.sh +++ b/t/t5606-clone-options.sh @@ -39,7 +39,7 @@ test_expect_success 'clone -o' ' test_expect_success 'rejects invalid -o/--origin' ' test_must_fail git clone -o "bad...name" parent clone-bad-name 2>err && - test_i18ngrep "'\''bad...name'\'' is not a valid remote name" err + test_grep "'\''bad...name'\'' is not a valid remote name" err ' @@ -56,7 +56,7 @@ test_expect_success 'disallows --bare with --separate-git-dir' ' test_must_fail git clone --bare --separate-git-dir dot-git-destiation parent clone-bare-sgd 2>err && test_debug "cat err" && - test_i18ngrep -e "options .--bare. and .--separate-git-dir. cannot be used together" err + test_grep -e "options .--bare. and .--separate-git-dir. cannot be used together" err ' @@ -64,14 +64,14 @@ test_expect_success 'disallows --bundle-uri with shallow options' ' for option in --depth=1 --shallow-since=01-01-2000 --shallow-exclude=HEAD do test_must_fail git clone --bundle-uri=bundle $option from to 2>err && - grep "bundle-uri is incompatible" err || return 1 + grep "bundle-uri.* cannot be used together" err || return 1 done ' test_expect_success 'reject cloning shallow repository' ' test_when_finished "rm -rf repo" && test_must_fail git clone --reject-shallow shallow-repo out 2>err && - test_i18ngrep -e "source repository is shallow, reject to clone." err && + test_grep -e "source repository is shallow, reject to clone." err && git clone --no-reject-shallow shallow-repo repo ' @@ -79,7 +79,7 @@ test_expect_success 'reject cloning shallow repository' ' test_expect_success 'reject cloning non-local shallow repository' ' test_when_finished "rm -rf repo" && test_must_fail git clone --reject-shallow --no-local shallow-repo out 2>err && - test_i18ngrep -e "source repository is shallow, reject to clone." err && + test_grep -e "source repository is shallow, reject to clone." err && git clone --no-reject-shallow --no-local shallow-repo repo ' @@ -149,7 +149,7 @@ test_expect_success 'redirected clone does not show progress' ' git clone "file://$(pwd)/parent" clone-redirected >out 2>err && ! grep % err && - test_i18ngrep ! "Checking connectivity" err + test_grep ! "Checking connectivity" err ' diff --git a/t/t5607-clone-bundle.sh b/t/t5607-clone-bundle.sh index 51705aa86a..0d1e92d996 100755 --- a/t/t5607-clone-bundle.sh +++ b/t/t5607-clone-bundle.sh @@ -24,7 +24,7 @@ test_expect_success 'setup' ' test_expect_success '"verify" needs a worktree' ' git bundle create tip.bundle -1 main && nongit test_must_fail git bundle verify ../tip.bundle 2>err && - test_i18ngrep "need a repository" err + test_grep "need a repository" err ' test_expect_success 'annotated tags can be excluded by rev-list options' ' @@ -166,7 +166,7 @@ test_expect_success 'git bundle v3 rejects unknown capabilities' ' @unknown=silly EOF test_must_fail git bundle verify new 2>output && - test_i18ngrep "unknown capability .unknown=silly." output + test_grep "unknown capability .unknown=silly." output ' test_done diff --git a/t/t5611-clone-config.sh b/t/t5611-clone-config.sh index 727caff443..298d4befab 100755 --- a/t/t5611-clone-config.sh +++ b/t/t5611-clone-config.sh @@ -103,7 +103,7 @@ test_expect_success 'set up shallow repository' ' test_expect_success 'clone.rejectshallow=true should reject cloning shallow repo' ' test_when_finished "rm -rf out" && test_must_fail git -c clone.rejectshallow=true clone --no-local shallow-repo out 2>err && - test_i18ngrep -e "source repository is shallow, reject to clone." err && + test_grep -e "source repository is shallow, reject to clone." err && git -c clone.rejectshallow=false clone --no-local shallow-repo out ' @@ -111,7 +111,7 @@ test_expect_success 'clone.rejectshallow=true should reject cloning shallow repo test_expect_success 'option --[no-]reject-shallow override clone.rejectshallow config' ' test_when_finished "rm -rf out" && test_must_fail git -c clone.rejectshallow=false clone --reject-shallow --no-local shallow-repo out 2>err && - test_i18ngrep -e "source repository is shallow, reject to clone." err && + test_grep -e "source repository is shallow, reject to clone." err && git -c clone.rejectshallow=true clone --no-reject-shallow --no-local shallow-repo out ' diff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh index 8759fc2853..2da7291e37 100755 --- a/t/t5616-partial-clone.sh +++ b/t/t5616-partial-clone.sh @@ -353,14 +353,14 @@ test_expect_success 'upload-pack complains of bogus filter config' ' test_must_fail git \ -c uploadpackfilter.tree.maxdepth \ upload-pack . >/dev/null 2>err && - test_i18ngrep "unable to parse.*tree.maxdepth" err + test_grep "unable to parse.*tree.maxdepth" err ' test_expect_success 'upload-pack fails banned object filters' ' test_config -C srv.bare uploadpackfilter.blob:none.allow false && test_must_fail ok=sigpipe git clone --no-checkout --filter=blob:none \ "file://$(pwd)/srv.bare" pc3 2>err && - test_i18ngrep "filter '\''blob:none'\'' not supported" err + test_grep "filter '\''blob:none'\'' not supported" err ' test_expect_success 'upload-pack fails banned combine object filters' ' @@ -370,14 +370,14 @@ test_expect_success 'upload-pack fails banned combine object filters' ' test_config -C srv.bare uploadpackfilter.blob:none.allow false && test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:1 \ --filter=blob:none "file://$(pwd)/srv.bare" pc3 2>err && - test_i18ngrep "filter '\''blob:none'\'' not supported" err + test_grep "filter '\''blob:none'\'' not supported" err ' test_expect_success 'upload-pack fails banned object filters with fallback' ' test_config -C srv.bare uploadpackfilter.allow false && test_must_fail ok=sigpipe git clone --no-checkout --filter=blob:none \ "file://$(pwd)/srv.bare" pc3 2>err && - test_i18ngrep "filter '\''blob:none'\'' not supported" err + test_grep "filter '\''blob:none'\'' not supported" err ' test_expect_success 'upload-pack limits tree depth filters' ' @@ -386,7 +386,7 @@ test_expect_success 'upload-pack limits tree depth filters' ' test_config -C srv.bare uploadpackfilter.tree.maxDepth 0 && test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:1 \ "file://$(pwd)/srv.bare" pc3 2>err && - test_i18ngrep "tree filter allows max depth 0, but got 1" err && + test_grep "tree filter allows max depth 0, but got 1" err && git clone --no-checkout --filter=tree:0 "file://$(pwd)/srv.bare" pc4 && @@ -394,7 +394,7 @@ test_expect_success 'upload-pack limits tree depth filters' ' git clone --no-checkout --filter=tree:5 "file://$(pwd)/srv.bare" pc5 && test_must_fail ok=sigpipe git clone --no-checkout --filter=tree:6 \ "file://$(pwd)/srv.bare" pc6 2>err && - test_i18ngrep "tree filter allows max depth 5, but got 6" err + test_grep "tree filter allows max depth 5, but got 6" err ' test_expect_success 'partial clone fetches blobs pointed to by refs even if normally filtered out' ' @@ -459,11 +459,11 @@ test_expect_success 'partial clone with unresolvable sparse filter fails cleanly test_must_fail git clone --no-local --bare \ --filter=sparse:oid=main:no-such-name \ sparse-src dst.git 2>err && - test_i18ngrep "unable to access sparse blob in .main:no-such-name" err && + test_grep "unable to access sparse blob in .main:no-such-name" err && test_must_fail git clone --no-local --bare \ --filter=sparse:oid=main \ sparse-src dst.git 2>err && - test_i18ngrep "unable to parse sparse filter data in" err + test_grep "unable to parse sparse filter data in" err ' setup_triangle () { @@ -493,8 +493,8 @@ setup_triangle () { TREE_HASH=$(git -C server rev-parse HEAD~1^{tree}) && git -C promisor-remote fetch --keep "file://$(pwd)/server" "$TREE_HASH" && git -C promisor-remote count-objects -v >object-count && - test_i18ngrep "count: 0" object-count && - test_i18ngrep "in-pack: 2" object-count && + test_grep "count: 0" object-count && + test_grep "in-pack: 2" object-count && # Set it as the promisor remote of client. Thus, whenever # the client lazy fetches, the lazy fetch will succeed only if it is @@ -748,7 +748,7 @@ test_expect_success 'upon cloning, check that all refs point to objects' ' test_must_fail git -c protocol.version=2 clone \ --filter=blob:none $HTTPD_URL/one_time_perl/server repo 2>err && - test_i18ngrep "did not send all necessary objects" 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" diff --git a/t/t5701-git-serve.sh b/t/t5701-git-serve.sh index f21e5e9d33..3591bc2417 100755 --- a/t/t5701-git-serve.sh +++ b/t/t5701-git-serve.sh @@ -52,7 +52,7 @@ test_expect_success 'request invalid capability' ' 0000 EOF test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in && - test_i18ngrep "unknown capability" err + test_grep "unknown capability" err ' test_expect_success 'request with no command' ' @@ -62,7 +62,7 @@ test_expect_success 'request with no command' ' 0000 EOF test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in && - test_i18ngrep "no command requested" err + test_grep "no command requested" err ' test_expect_success 'request invalid command' ' @@ -73,7 +73,7 @@ test_expect_success 'request invalid command' ' 0000 EOF test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in && - test_i18ngrep "invalid command" err + test_grep "invalid command" err ' test_expect_success 'request capability as command' ' @@ -115,7 +115,7 @@ test_expect_success 'wrong object-format' ' 0000 EOF test_must_fail test-tool serve-v2 --stateless-rpc 2>err <in && - test_i18ngrep "mismatched object format" err + test_grep "mismatched object format" err ' # Test the basics of ls-refs diff --git a/t/t5702-protocol-v2.sh b/t/t5702-protocol-v2.sh index 6af5c2062f..3c0c6047d5 100755 --- a/t/t5702-protocol-v2.sh +++ b/t/t5702-protocol-v2.sh @@ -189,8 +189,8 @@ test_expect_success 'warn if using server-option with ls-remote with legacy prot test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -c protocol.version=0 \ ls-remote -o hello -o world "file://$(pwd)/file_parent" main 2>err && - test_i18ngrep "see protocol.version in" err && - test_i18ngrep "server options require protocol version 2 or later" err + test_grep "see protocol.version in" err && + test_grep "server options require protocol version 2 or later" err ' test_expect_success 'clone with file:// using protocol v2' ' @@ -377,8 +377,8 @@ test_expect_success 'warn if using server-option with fetch with legacy protocol test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -C temp_child -c protocol.version=0 \ fetch -o hello -o world "file://$(pwd)/file_parent" main 2>err && - test_i18ngrep "see protocol.version in" err && - test_i18ngrep "server options require protocol version 2 or later" err + test_grep "see protocol.version in" err && + test_grep "server options require protocol version 2 or later" err ' test_expect_success 'server-options are sent when cloning' ' @@ -399,8 +399,8 @@ test_expect_success 'warn if using server-option with clone with legacy protocol clone --server-option=hello --server-option=world \ "file://$(pwd)/file_parent" myclone 2>err && - test_i18ngrep "see protocol.version in" err && - test_i18ngrep "server options require protocol version 2 or later" err + test_grep "see protocol.version in" err && + test_grep "server options require protocol version 2 or later" err ' test_expect_success 'upload-pack respects config using protocol v2' ' @@ -495,7 +495,7 @@ test_expect_success 'partial clone warns if filter is not advertised' ' git -C server config uploadpack.allowfilter 0 && git -c protocol.version=2 \ clone --filter=blob:none "file://$(pwd)/server" client 2>err && - test_i18ngrep "filtering not recognized by server, ignoring" err + test_grep "filtering not recognized by server, ignoring" err ' test_expect_success 'even with handcrafted request, filter does not work if not advertised' ' @@ -736,7 +736,7 @@ test_expect_success 'file:// --negotiate-only with protocol v0' ' --negotiate-only \ --negotiation-tip=$(git -C client rev-parse HEAD) \ origin 2>err && - test_i18ngrep "negotiate-only requires protocol v2" err + test_grep "negotiate-only requires protocol v2" err ' test_expect_success 'push with custom path does not request v2' ' @@ -809,7 +809,7 @@ test_expect_success 'clone repository with http:// using protocol v2 with incomp # Server responded using protocol v2 grep "git< version 2" log && # Client reported appropriate failure - test_i18ngrep "bytes of length header were received" err + test_grep "bytes of length header were received" err ' test_expect_success 'clone repository with http:// using protocol v2 with incomplete pktline body' ' @@ -826,7 +826,7 @@ test_expect_success 'clone repository with http:// using protocol v2 with incomp # Server responded using protocol v2 grep "git< version 2" log && # Client reported appropriate failure - test_i18ngrep "bytes of body are still expected" err + test_grep "bytes of body are still expected" err ' test_expect_success 'clone with http:// using protocol v2 and invalid parameters' ' @@ -973,7 +973,7 @@ test_expect_success 'when server sends "ready", expect DELIM' ' test_must_fail git -C http_child -c protocol.version=2 \ fetch "$HTTPD_URL/one_time_perl/http_parent" 2> err && - test_i18ngrep "expected packfile to be sent after .ready." err + test_grep "expected packfile to be sent after .ready." err ' test_expect_success 'when server does not send "ready", expect FLUSH' ' @@ -1001,7 +1001,7 @@ test_expect_success 'when server does not send "ready", expect FLUSH' ' fetch "$HTTPD_URL/one_time_perl/http_parent" 2> err && grep "fetch< .*acknowledgments" log && ! grep "fetch< .*ready" log && - test_i18ngrep "expected no other sections to be sent after no .ready." err + test_grep "expected no other sections to be sent after no .ready." err ' configure_exclusion () { @@ -1111,7 +1111,7 @@ test_expect_success 'fetching with valid packfile URI but invalid hash fails' ' git -c protocol.version=2 \ -c fetch.uriprotocols=http,https \ clone "$HTTPD_URL/smart/http_parent" http_child 2>err && - test_i18ngrep "pack downloaded from.*does not match expected hash" err + test_grep "pack downloaded from.*does not match expected hash" err ' test_expect_success 'packfile-uri with transfer.fsckobjects' ' @@ -1165,7 +1165,7 @@ test_expect_success 'packfile-uri with transfer.fsckobjects fails on bad object' test_must_fail git -c protocol.version=2 -c transfer.fsckobjects=1 \ -c fetch.uriprotocols=http,https \ clone "$HTTPD_URL/smart/http_parent" http_child 2>error && - test_i18ngrep "invalid author/committer line - missing email" error + test_grep "invalid author/committer line - missing email" error ' test_expect_success 'packfile-uri with transfer.fsckobjects succeeds when .gitmodules is separate from tree' ' @@ -1213,7 +1213,7 @@ test_expect_success 'packfile-uri with transfer.fsckobjects fails when .gitmodul test_must_fail git -c protocol.version=2 -c transfer.fsckobjects=1 \ -c fetch.uriprotocols=http,https \ clone "$HTTPD_URL/smart/http_parent" http_child 2>err && - test_i18ngrep "disallowed submodule name" err + test_grep "disallowed submodule name" err ' test_expect_success 'packfile-uri path redacted in trace' ' @@ -1296,7 +1296,7 @@ test_expect_success 'http:// --negotiate-only without wait-for-done support' ' --negotiate-only \ --negotiation-tip=$(git -C client rev-parse HEAD) \ origin 2>err && - test_i18ngrep "server does not support wait-for-done" err + test_grep "server does not support wait-for-done" err ' test_expect_success 'http:// --negotiate-only with protocol v0' ' @@ -1310,7 +1310,7 @@ test_expect_success 'http:// --negotiate-only with protocol v0' ' --negotiate-only \ --negotiation-tip=$(git -C client rev-parse HEAD) \ origin 2>err && - test_i18ngrep "negotiate-only requires protocol v2" err + test_grep "negotiate-only requires protocol v2" err ' # DO NOT add non-httpd-specific tests here, because the last part of this diff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh index df74f80061..191097171b 100755 --- a/t/t5703-upload-pack-ref-in-want.sh +++ b/t/t5703-upload-pack-ref-in-want.sh @@ -484,7 +484,7 @@ test_expect_success 'server is initially ahead - no ref in want' ' cp -r "$LOCAL_PRISTINE" local && inconsistency main $(test_oid numeric) && test_must_fail git -C local fetch 2>err && - test_i18ngrep "fatal: remote error: upload-pack: not our ref" err + test_grep "fatal: remote error: upload-pack: not our ref" err ' test_expect_success 'server is initially ahead - ref in want' ' @@ -530,7 +530,7 @@ test_expect_success 'server loses a ref - ref in want' ' echo "s/main/rain/" >"$HTTPD_ROOT_PATH/one-time-perl" && test_must_fail git -C local fetch 2>err && - test_i18ngrep "fatal: remote error: unknown ref refs/heads/rain" err + test_grep "fatal: remote error: unknown ref refs/heads/rain" err ' # DO NOT add non-httpd-specific tests here, because the last part of this diff --git a/t/t5704-protocol-violations.sh b/t/t5704-protocol-violations.sh index ae1a00afb0..11be64fc03 100755 --- a/t/t5704-protocol-violations.sh +++ b/t/t5704-protocol-violations.sh @@ -18,7 +18,7 @@ test_expect_success 'extra delim packet in v2 ls-refs args' ' } >input && test_must_fail env GIT_PROTOCOL=version=2 \ git upload-pack . <input 2>err && - test_i18ngrep "expected flush after ls-refs arguments" err + test_grep "expected flush after ls-refs arguments" err ' test_expect_success 'extra delim packet in v2 fetch args' ' @@ -31,7 +31,7 @@ test_expect_success 'extra delim packet in v2 fetch args' ' } >input && test_must_fail env GIT_PROTOCOL=version=2 \ git upload-pack . <input 2>err && - test_i18ngrep "expected flush after fetch arguments" err + test_grep "expected flush after fetch arguments" err ' test_expect_success 'bogus symref in v0 capabilities' ' diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh index d386076dbd..4e0a77f985 100755 --- a/t/t5801-remote-helpers.sh +++ b/t/t5801-remote-helpers.sh @@ -137,7 +137,7 @@ test_expect_success 'forced push' ' test_expect_success 'cloning without refspec' ' GIT_REMOTE_TESTGIT_NOREFSPEC=1 \ git clone "testgit::${PWD}/server" local2 2>error && - test_i18ngrep "this remote helper should implement refspec capability" error && + test_grep "this remote helper should implement refspec capability" error && compare_refs local2 HEAD server HEAD ' @@ -145,7 +145,7 @@ test_expect_success 'pulling without refspecs' ' (cd local2 && git reset --hard && GIT_REMOTE_TESTGIT_NOREFSPEC=1 git pull 2>../error) && - test_i18ngrep "this remote helper should implement refspec capability" error && + test_grep "this remote helper should implement refspec capability" error && compare_refs local2 HEAD server HEAD ' @@ -157,7 +157,7 @@ test_expect_success 'pushing without refspecs' ' GIT_REMOTE_TESTGIT_NOREFSPEC=1 && export GIT_REMOTE_TESTGIT_NOREFSPEC && test_must_fail git push 2>../error) && - test_i18ngrep "remote-helper doesn.t support push; refspec needed" error + test_grep "remote-helper doesn.t support push; refspec needed" error ' test_expect_success 'pulling without marks' ' @@ -256,7 +256,7 @@ clean_mark () { test_expect_success 'proper failure checks for fetching' ' (cd local && test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error && - test_i18ngrep -q "error while running fast-import" error + test_grep -q "error while running fast-import" error ) ' diff --git a/t/t5812-proto-disable-http.sh b/t/t5812-proto-disable-http.sh index d8da5f58d1..769c717e88 100755 --- a/t/t5812-proto-disable-http.sh +++ b/t/t5812-proto-disable-http.sh @@ -20,7 +20,7 @@ test_expect_success 'http(s) transport respects GIT_ALLOW_PROTOCOL' ' test_must_fail env GIT_ALLOW_PROTOCOL=http:https \ GIT_SMART_HTTP=0 \ git clone "$HTTPD_URL/ftp-redir/repo.git" 2>stderr && - test_i18ngrep -E "(ftp.*disabled|your curl version is too old)" stderr + test_grep -E "(ftp.*disabled|your curl version is too old)" stderr ' test_expect_success 'curl limits redirects' ' diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh index 12def7bcbf..6289a2e8b0 100755 --- a/t/t6000-rev-list-misc.sh +++ b/t/t6000-rev-list-misc.sh @@ -169,4 +169,17 @@ test_expect_success 'rev-list --count --objects' ' test_line_count = $count actual ' +test_expect_success 'rev-list --unpacked' ' + git repack -ad && + test_commit unpacked && + + git rev-list --objects --no-object-names unpacked^.. >expect.raw && + sort expect.raw >expect && + + git rev-list --all --objects --unpacked --no-object-names >actual.raw && + sort actual.raw >actual && + + test_cmp expect actual +' + test_done diff --git a/t/t6001-rev-list-graft.sh b/t/t6001-rev-list-graft.sh index 16635ecc33..73a2465aa0 100755 --- a/t/t6001-rev-list-graft.sh +++ b/t/t6001-rev-list-graft.sh @@ -118,10 +118,10 @@ done test_expect_success 'show advice that grafts are deprecated' ' git show HEAD 2>err && - test_i18ngrep "git replace" err && + test_grep "git replace" err && test_config advice.graftFileDeprecated false && git show HEAD 2>err && - test_i18ngrep ! "git replace" err + test_grep ! "git replace" err ' test_done diff --git a/t/t6005-rev-list-count.sh b/t/t6005-rev-list-count.sh index 0729f800c3..ee0306aeec 100755 --- a/t/t6005-rev-list-count.sh +++ b/t/t6005-rev-list-count.sh @@ -18,20 +18,34 @@ test_expect_success 'no options' ' ' test_expect_success '--max-count' ' + test_must_fail git rev-list --max-count=1q HEAD 2>error && + grep "not an integer" error && + test_stdout_line_count = 0 git rev-list HEAD --max-count=0 && test_stdout_line_count = 3 git rev-list HEAD --max-count=3 && test_stdout_line_count = 5 git rev-list HEAD --max-count=5 && - test_stdout_line_count = 5 git rev-list HEAD --max-count=10 + test_stdout_line_count = 5 git rev-list HEAD --max-count=10 && + test_stdout_line_count = 5 git rev-list HEAD --max-count=-1 ' test_expect_success '--max-count all forms' ' + test_must_fail git rev-list -1q HEAD 2>error && + grep "not an integer" error && + test_must_fail git rev-list --1 HEAD && + test_must_fail git rev-list -n 1q HEAD 2>error && + grep "not an integer" error && + test_stdout_line_count = 1 git rev-list HEAD --max-count=1 && test_stdout_line_count = 1 git rev-list HEAD -1 && test_stdout_line_count = 1 git rev-list HEAD -n1 && - test_stdout_line_count = 1 git rev-list HEAD -n 1 + test_stdout_line_count = 1 git rev-list HEAD -n 1 && + test_stdout_line_count = 5 git rev-list HEAD -n -1 ' test_expect_success '--skip' ' + test_must_fail git rev-list --skip 1q HEAD 2>error && + grep "not an integer" error && + test_stdout_line_count = 5 git rev-list HEAD --skip=0 && test_stdout_line_count = 2 git rev-list HEAD --skip=3 && test_stdout_line_count = 0 git rev-list HEAD --skip=5 && diff --git a/t/t6009-rev-list-parent.sh b/t/t6009-rev-list-parent.sh index 5a67bbc760..91db8fafe8 100755 --- a/t/t6009-rev-list-parent.sh +++ b/t/t6009-rev-list-parent.sh @@ -5,6 +5,7 @@ test_description='ancestor culling and limiting by parent number' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh check_revlist () { @@ -62,6 +63,17 @@ test_expect_success 'setup roots, merges and octopuses' ' git checkout main ' +test_expect_success 'parse --max-parents & --min-parents' ' + test_must_fail git rev-list --max-parents=1q HEAD 2>error && + grep "not an integer" error && + + test_must_fail git rev-list --min-parents=1q HEAD 2>error && + grep "not an integer" error && + + git rev-list --max-parents=1 --min-parents=1 HEAD && + git rev-list --max-parents=-1 --min-parents=-1 HEAD +' + test_expect_success 'rev-list roots' ' check_revlist "--max-parents=0" one five diff --git a/t/t6017-rev-list-stdin.sh b/t/t6017-rev-list-stdin.sh index a57f1ae2ba..4821b90e74 100755 --- a/t/t6017-rev-list-stdin.sh +++ b/t/t6017-rev-list-stdin.sh @@ -68,6 +68,7 @@ check --glob=refs/heads check --glob=refs/heads -- check --glob=refs/heads -- file-1 check --end-of-options -dashed-branch +check --all --not refs/heads/main test_expect_success 'not only --stdin' ' cat >expect <<-EOF && @@ -127,4 +128,24 @@ test_expect_success 'unknown option without --end-of-options' ' test_cmp expect error ' +test_expect_success '--not on command line does not influence revisions read via --stdin' ' + cat >input <<-EOF && + refs/heads/main + EOF + git rev-list refs/heads/main >expect && + + git rev-list refs/heads/main --not --stdin <input >actual && + test_cmp expect actual +' + +test_expect_success '--not via stdin does not influence revisions from command line' ' + cat >input <<-EOF && + --not + EOF + git rev-list refs/heads/main >expect && + + git rev-list refs/heads/main --stdin refs/heads/main <input >actual && + test_cmp expect actual +' + test_done diff --git a/t/t6018-rev-list-glob.sh b/t/t6018-rev-list-glob.sh index 67d523d405..3b181f771c 100755 --- a/t/t6018-rev-list-glob.sh +++ b/t/t6018-rev-list-glob.sh @@ -214,15 +214,13 @@ do for pseudoopt in branches tags remotes do test_expect_success "rev-parse --exclude-hidden=$section fails with --$pseudoopt" ' - echo "error: --exclude-hidden cannot be used together with --$pseudoopt" >expected && test_must_fail git rev-parse --exclude-hidden=$section --$pseudoopt 2>err && - test_cmp expected err + test_grep "error: options .--exclude-hidden. and .--$pseudoopt. cannot be used together" err ' test_expect_success "rev-parse --exclude-hidden=$section fails with --$pseudoopt=pattern" ' - echo "error: --exclude-hidden cannot be used together with --$pseudoopt" >expected && test_must_fail git rev-parse --exclude-hidden=$section --$pseudoopt=pattern 2>err && - test_cmp expected err + test_grep "error: options .--exclude-hidden. and .--$pseudoopt. cannot be used together" err ' done done diff --git a/t/t6021-rev-list-exclude-hidden.sh b/t/t6021-rev-list-exclude-hidden.sh index 1a9d37e638..51df02105d 100755 --- a/t/t6021-rev-list-exclude-hidden.sh +++ b/t/t6021-rev-list-exclude-hidden.sh @@ -151,12 +151,12 @@ do do test_expect_success "$section: fails with --$pseudoopt" ' test_must_fail git rev-list --exclude-hidden=$section --$pseudoopt 2>err && - test_i18ngrep "error: --exclude-hidden cannot be used together with --$pseudoopt" err + test_grep "error: options .--exclude-hidden. and .--$pseudoopt. cannot be used together" err ' test_expect_success "$section: fails with --$pseudoopt=pattern" ' test_must_fail git rev-list --exclude-hidden=$section --$pseudoopt=pattern 2>err && - test_i18ngrep "error: --exclude-hidden cannot be used together with --$pseudoopt" err + test_grep "error: options .--exclude-hidden. and .--$pseudoopt. cannot be used together" err ' done done diff --git a/t/t6022-rev-list-missing.sh b/t/t6022-rev-list-missing.sh new file mode 100755 index 0000000000..211672759a --- /dev/null +++ b/t/t6022-rev-list-missing.sh @@ -0,0 +1,80 @@ +#!/bin/sh + +test_description='handling of missing objects in rev-list' + +TEST_PASSES_SANITIZE_LEAK=true +. ./test-lib.sh + +# We setup the repository with two commits, this way HEAD is always +# available and we can hide commit 1. +test_expect_success 'create repository and alternate directory' ' + test_commit 1 && + test_commit 2 && + test_commit 3 +' + +# We manually corrupt the repository, which means that the commit-graph may +# contain references to already-deleted objects. We thus need to enable +# commit-graph paranoia to not returned these deleted commits from the graph. +GIT_COMMIT_GRAPH_PARANOIA=true +export GIT_COMMIT_GRAPH_PARANOIA + +for obj in "HEAD~1" "HEAD~1^{tree}" "HEAD:1.t" +do + test_expect_success "rev-list --missing=error fails with missing object $obj" ' + oid="$(git rev-parse $obj)" && + path=".git/objects/$(test_oid_to_path $oid)" && + + mv "$path" "$path.hidden" && + test_when_finished "mv $path.hidden $path" && + + test_must_fail git rev-list --missing=error --objects \ + --no-object-names HEAD + ' +done + +for obj in "HEAD~1" "HEAD~1^{tree}" "HEAD:1.t" +do + for action in "allow-any" "print" + do + test_expect_success "rev-list --missing=$action with missing $obj" ' + oid="$(git rev-parse $obj)" && + path=".git/objects/$(test_oid_to_path $oid)" && + + # Before the object is made missing, we use rev-list to + # get the expected oids. + git rev-list --objects --no-object-names \ + HEAD ^$obj >expect.raw && + + # Blobs are shared by all commits, so evethough a commit/tree + # might be skipped, its blob must be accounted for. + if [ $obj != "HEAD:1.t" ]; then + echo $(git rev-parse HEAD:1.t) >>expect.raw && + echo $(git rev-parse HEAD:2.t) >>expect.raw + fi && + + mv "$path" "$path.hidden" && + test_when_finished "mv $path.hidden $path" && + + git rev-list --missing=$action --objects --no-object-names \ + HEAD >actual.raw && + + # When the action is to print, we should also add the missing + # oid to the expect list. + case $action in + allow-any) + ;; + print) + grep ?$oid actual.raw && + echo ?$oid >>expect.raw + ;; + esac && + + sort actual.raw >actual && + sort expect.raw >expect && + test_cmp expect actual + ' + done +done + +test_done diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh index fb01bd6abc..7b24d1684e 100755 --- a/t/t6030-bisect-porcelain.sh +++ b/t/t6030-bisect-porcelain.sh @@ -170,6 +170,12 @@ test_expect_success 'bisect reset when not bisecting' ' cmp branch.expect branch.output ' +test_expect_success 'bisect reset cleans up even when not bisecting' ' + echo garbage >.git/BISECT_LOG && + git bisect reset && + test_path_is_missing .git/BISECT_LOG +' + test_expect_success 'bisect reset removes packed refs' ' git bisect reset && git bisect start && @@ -220,7 +226,7 @@ test_expect_success 'bisect start: existing ".git/BISECT_START" not modified if cp .git/BISECT_START saved && test_must_fail git bisect start $HASH4 foo -- && git branch > branch.output && - test_i18ngrep "* (no branch, bisect started on other)" branch.output > /dev/null && + test_grep "* (no branch, bisect started on other)" branch.output > /dev/null && test_cmp saved .git/BISECT_START ' test_expect_success 'bisect start: no ".git/BISECT_START" if mistaken rev' ' @@ -588,7 +594,7 @@ test_expect_success 'bisect starting with a detached HEAD' ' test_expect_success 'bisect errors out if bad and good are mistaken' ' git bisect reset && test_must_fail git bisect start $HASH2 $HASH4 2> rev_list_error && - test_i18ngrep "mistook good and bad" rev_list_error && + test_grep "mistook good and bad" rev_list_error && git bisect reset ' @@ -630,7 +636,7 @@ test_expect_success 'side branch creation' ' test_expect_success 'good merge base when good and bad are siblings' ' git bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt && - test_i18ngrep "merge base must be tested" my_bisect_log.txt && + test_grep "merge base must be tested" my_bisect_log.txt && grep $HASH4 my_bisect_log.txt && git bisect good > my_bisect_log.txt && ! grep "merge base must be tested" my_bisect_log.txt && @@ -639,7 +645,7 @@ test_expect_success 'good merge base when good and bad are siblings' ' ' test_expect_success 'skipped merge base when good and bad are siblings' ' git bisect start "$SIDE_HASH7" "$HASH7" > my_bisect_log.txt && - test_i18ngrep "merge base must be tested" my_bisect_log.txt && + test_grep "merge base must be tested" my_bisect_log.txt && grep $HASH4 my_bisect_log.txt && git bisect skip > my_bisect_log.txt 2>&1 && grep "warning" my_bisect_log.txt && @@ -649,11 +655,11 @@ test_expect_success 'skipped merge base when good and bad are siblings' ' test_expect_success 'bad merge base when good and bad are siblings' ' git bisect start "$HASH7" HEAD > my_bisect_log.txt && - test_i18ngrep "merge base must be tested" my_bisect_log.txt && + test_grep "merge base must be tested" my_bisect_log.txt && grep $HASH4 my_bisect_log.txt && test_must_fail git bisect bad > my_bisect_log.txt 2>&1 && - test_i18ngrep "merge base $HASH4 is bad" my_bisect_log.txt && - test_i18ngrep "fixed between $HASH4 and \[$SIDE_HASH7\]" my_bisect_log.txt && + test_grep "merge base $HASH4 is bad" my_bisect_log.txt && + test_grep "fixed between $HASH4 and \[$SIDE_HASH7\]" my_bisect_log.txt && git bisect reset ' @@ -704,9 +710,9 @@ test_expect_success '"git bisect run --first-parent" simple case' ' test_expect_success 'good merge bases when good and bad are siblings' ' git bisect start "$B_HASH" "$A_HASH" > my_bisect_log.txt && - test_i18ngrep "merge base must be tested" my_bisect_log.txt && + test_grep "merge base must be tested" my_bisect_log.txt && git bisect good > my_bisect_log2.txt && - test_i18ngrep "merge base must be tested" my_bisect_log2.txt && + test_grep "merge base must be tested" my_bisect_log2.txt && { { grep "$SIDE_HASH5" my_bisect_log.txt && @@ -721,14 +727,14 @@ test_expect_success 'good merge bases when good and bad are siblings' ' test_expect_success 'optimized merge base checks' ' git bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt && - test_i18ngrep "merge base must be tested" my_bisect_log.txt && + test_grep "merge base must be tested" my_bisect_log.txt && grep "$HASH4" my_bisect_log.txt && git bisect good > my_bisect_log2.txt && test -f ".git/BISECT_ANCESTORS_OK" && test "$HASH6" = $(git rev-parse --verify HEAD) && git bisect bad && git bisect good "$A_HASH" > my_bisect_log4.txt && - test_i18ngrep "merge base must be tested" my_bisect_log4.txt && + test_grep "merge base must be tested" my_bisect_log4.txt && test_path_is_missing ".git/BISECT_ANCESTORS_OK" ' @@ -806,7 +812,7 @@ test_expect_success 'skipping away from skipped commit' ' test_expect_success 'erroring out when using bad path arguments' ' test_must_fail git bisect start $PARA_HASH7 $HASH1 -- foobar 2> error.txt && - test_i18ngrep "bad path arguments" error.txt + test_grep "bad path arguments" error.txt ' test_expect_success 'test bisection on bare repo - --no-checkout specified' ' diff --git a/t/t6040-tracking-info.sh b/t/t6040-tracking-info.sh index 7ddbd96e58..acc281c116 100755 --- a/t/t6040-tracking-info.sh +++ b/t/t6040-tracking-info.sh @@ -83,13 +83,13 @@ test_expect_success 'checkout (diverged from upstream)' ' ( cd test && git checkout b1 ) >actual && - test_i18ngrep "have 1 and 1 different" actual + test_grep "have 1 and 1 different" actual ' test_expect_success 'checkout with local tracked branch' ' git checkout main && git checkout follower >actual && - test_i18ngrep "is ahead of" actual + test_grep "is ahead of" actual ' test_expect_success 'checkout (upstream is gone)' ' @@ -97,14 +97,14 @@ test_expect_success 'checkout (upstream is gone)' ' cd test && git checkout b5 ) >actual && - test_i18ngrep "is based on .*, but the upstream is gone." actual + test_grep "is based on .*, but the upstream is gone." actual ' test_expect_success 'checkout (up-to-date with upstream)' ' ( cd test && git checkout b6 ) >actual && - test_i18ngrep "Your branch is up to date with .origin/main" actual + test_grep "Your branch is up to date with .origin/main" actual ' test_expect_success 'status (diverged from upstream)' ' @@ -114,7 +114,7 @@ test_expect_success 'status (diverged from upstream)' ' # reports nothing to commit test_must_fail git commit --dry-run ) >actual && - test_i18ngrep "have 1 and 1 different" actual + test_grep "have 1 and 1 different" actual ' test_expect_success 'status (upstream is gone)' ' @@ -124,7 +124,7 @@ test_expect_success 'status (upstream is gone)' ' # reports nothing to commit test_must_fail git commit --dry-run ) >actual && - test_i18ngrep "is based on .*, but the upstream is gone." actual + test_grep "is based on .*, but the upstream is gone." actual ' test_expect_success 'status (up-to-date with upstream)' ' @@ -134,7 +134,7 @@ test_expect_success 'status (up-to-date with upstream)' ' # reports nothing to commit test_must_fail git commit --dry-run ) >actual && - test_i18ngrep "Your branch is up to date with .origin/main" actual + test_grep "Your branch is up to date with .origin/main" actual ' cat >expect <<\EOF @@ -253,7 +253,7 @@ test_expect_success 'fail to track lightweight tags' ' git checkout main && git tag light && test_must_fail git branch --track lighttrack light >actual && - test_i18ngrep ! "set up to track" actual && + test_grep ! "set up to track" actual && test_must_fail git checkout lighttrack ' @@ -261,7 +261,7 @@ test_expect_success 'fail to track annotated tags' ' git checkout main && git tag -m heavy heavy && test_must_fail git branch --track heavytrack heavy >actual && - test_i18ngrep ! "set up to track" actual && + test_grep ! "set up to track" actual && test_must_fail git checkout heavytrack ' diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh index c9925edf20..c6e9b33e44 100755 --- a/t/t6050-replace.sh +++ b/t/t6050-replace.sh @@ -44,7 +44,7 @@ commit_peeling_shows_parents () _parent_number=$(( $_parent_number + 1 )) done && test_must_fail git rev-parse --verify $_commit^$_parent_number 2>err && - test_i18ngrep "Needed a single revision" err + test_grep "Needed a single revision" err } commit_has_parents () @@ -137,8 +137,8 @@ test_expect_success 'tag replaced commit' ' test_expect_success '"git fsck" works' ' git fsck main >fsck_main.out && - test_i18ngrep "dangling commit $R" fsck_main.out && - test_i18ngrep "dangling tag $(git show-ref -s refs/tags/mytag)" fsck_main.out && + test_grep "dangling commit $R" fsck_main.out && + test_grep "dangling tag $(git show-ref -s refs/tags/mytag)" fsck_main.out && test -z "$(git fsck)" ' @@ -490,9 +490,9 @@ test_expect_success '--convert-graft-file' ' $(git rev-parse HEAD^^ HEAD^ HEAD^^ HEAD^2) \ >.git/info/grafts && git status 2>stderr && - test_i18ngrep "hint:.*grafts is deprecated" stderr && + test_grep "hint:.*grafts is deprecated" stderr && git replace --convert-graft-file 2>stderr && - test_i18ngrep ! "hint:.*grafts is deprecated" stderr && + test_grep ! "hint:.*grafts is deprecated" stderr && test_path_is_missing .git/info/grafts && : verify that the history is now "grafted" && @@ -503,8 +503,8 @@ test_expect_success '--convert-graft-file' ' test_when_finished "rm -f .git/info/grafts" && echo $EMPTY_BLOB $EMPTY_TREE >.git/info/grafts && test_must_fail git replace --convert-graft-file 2>err && - test_i18ngrep "$EMPTY_BLOB $EMPTY_TREE" err && - test_i18ngrep "$EMPTY_BLOB $EMPTY_TREE" .git/info/grafts + test_grep "$EMPTY_BLOB $EMPTY_TREE" err && + test_grep "$EMPTY_BLOB $EMPTY_TREE" .git/info/grafts ' test_done diff --git a/t/t6102-rev-list-unexpected-objects.sh b/t/t6102-rev-list-unexpected-objects.sh index 9350b5fd2c..5d28507efc 100755 --- a/t/t6102-rev-list-unexpected-objects.sh +++ b/t/t6102-rev-list-unexpected-objects.sh @@ -28,7 +28,7 @@ test_expect_success 'TODO (should fail!): traverse unexpected non-blob entry (lo test_expect_success 'traverse unexpected non-blob entry (seen)' ' test_must_fail git rev-list --objects $tree $broken_tree >output 2>&1 && - test_i18ngrep "is not a blob" output + test_grep "is not a blob" output ' test_expect_success 'setup unexpected non-tree entry' ' @@ -42,7 +42,7 @@ test_expect_success 'traverse unexpected non-tree entry (lone)' ' test_expect_success 'traverse unexpected non-tree entry (seen)' ' test_must_fail git rev-list --objects $blob $broken_tree >output 2>&1 && - test_i18ngrep "is not a tree" output + test_grep "is not a tree" output ' test_expect_success 'setup unexpected non-commit parent' ' @@ -54,13 +54,13 @@ test_expect_success 'setup unexpected non-commit parent' ' test_expect_success 'traverse unexpected non-commit parent (lone)' ' test_must_fail git rev-list --objects $broken_commit >output 2>&1 && - test_i18ngrep "not a commit" output + test_grep "not a commit" output ' test_expect_success 'traverse unexpected non-commit parent (seen)' ' test_must_fail git rev-list --objects $blob $broken_commit \ >output 2>&1 && - test_i18ngrep "not a commit" output + test_grep "not a commit" output ' test_expect_success 'setup unexpected non-tree root' ' @@ -76,7 +76,7 @@ test_expect_success 'traverse unexpected non-tree root (lone)' ' test_expect_success 'traverse unexpected non-tree root (seen)' ' test_must_fail git rev-list --objects $blob $broken_commit \ >output 2>&1 && - test_i18ngrep "not a tree" output + test_grep "not a tree" output ' test_expect_success 'setup unexpected non-commit tag' ' @@ -93,7 +93,7 @@ test_expect_success 'traverse unexpected non-commit tag (lone)' ' test_expect_success 'traverse unexpected non-commit tag (seen)' ' test_must_fail git rev-list --objects $blob $tag >output 2>&1 && - test_i18ngrep "not a commit" output + test_grep "not a commit" output ' test_expect_success 'setup unexpected non-tree tag' ' @@ -110,7 +110,7 @@ test_expect_success 'traverse unexpected non-tree tag (lone)' ' test_expect_success 'traverse unexpected non-tree tag (seen)' ' test_must_fail git rev-list --objects $blob $tag >output 2>&1 && - test_i18ngrep "not a tree" output + test_grep "not a tree" output ' test_expect_success 'setup unexpected non-blob tag' ' @@ -127,7 +127,7 @@ test_expect_success 'traverse unexpected non-blob tag (lone)' ' test_expect_success 'traverse unexpected non-blob tag (seen)' ' test_must_fail git rev-list --objects $commit $tag >output 2>&1 && - test_i18ngrep "not a blob" output + test_grep "not a blob" output ' test_done diff --git a/t/t6112-rev-list-filters-objects.sh b/t/t6112-rev-list-filters-objects.sh index 8d9d6604f0..52822b9461 100755 --- a/t/t6112-rev-list-filters-objects.sh +++ b/t/t6112-rev-list-filters-objects.sh @@ -457,7 +457,7 @@ expect_invalid_filter_spec () { test_must_fail git -C r3 rev-list --objects --filter="$spec" HEAD \ >actual 2>actual_stderr && test_must_be_empty actual && - test_i18ngrep "$err" actual_stderr + test_grep "$err" actual_stderr } test_expect_success 'combine:... while URL-encoding things that should not be' ' diff --git a/t/t6113-rev-list-bitmap-filters.sh b/t/t6113-rev-list-bitmap-filters.sh index 4d8e09167e..86c70521f1 100755 --- a/t/t6113-rev-list-bitmap-filters.sh +++ b/t/t6113-rev-list-bitmap-filters.sh @@ -141,4 +141,17 @@ test_expect_success 'combine filter with --filter-provided-objects' ' done <objects ' +test_expect_success 'bitmap traversal with --unpacked' ' + git repack -adb && + test_commit unpacked && + + git rev-list --objects --no-object-names unpacked^.. >expect.raw && + sort expect.raw >expect && + + git rev-list --use-bitmap-index --objects --all --unpacked >actual.raw && + sort actual.raw >actual && + + test_cmp expect actual +' + test_done diff --git a/t/t6115-rev-list-du.sh b/t/t6115-rev-list-du.sh index d59111dede..c0cfda62fa 100755 --- a/t/t6115-rev-list-du.sh +++ b/t/t6115-rev-list-du.sh @@ -48,6 +48,13 @@ check_du HEAD check_du --objects HEAD check_du --objects HEAD^..HEAD +test_expect_success 'setup for --unpacked tests' ' + git repack -adb && + test_commit unpacked +' + +check_du --all --objects --unpacked + # As mentioned above, don't use hardcode sizes as actual size, but use the # output from git cat-file. test_expect_success 'rev-list --disk-usage=human' ' diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh index 0a5c487540..e78315d23d 100755 --- a/t/t6120-describe.sh +++ b/t/t6120-describe.sh @@ -392,7 +392,7 @@ test_expect_success 'describe directly tagged blob' ' test_expect_success 'describe tag object' ' git tag test-blob-1 -a -m msg unique-file:file && test_must_fail git describe test-blob-1 2>actual && - test_i18ngrep "fatal: test-blob-1 is neither a commit nor blob" actual + test_grep "fatal: test-blob-1 is neither a commit nor blob" actual ' test_expect_success ULIMIT_STACK_SIZE 'name-rev works in a deep repo' ' diff --git a/t/t6134-pathspec-in-submodule.sh b/t/t6134-pathspec-in-submodule.sh index 3214d9db97..16ce4cfcc6 100755 --- a/t/t6134-pathspec-in-submodule.sh +++ b/t/t6134-pathspec-in-submodule.sh @@ -27,7 +27,7 @@ test_expect_success 'error message for path inside submodule' ' test_expect_success 'error message for path inside submodule from within submodule' ' test_must_fail git -C sub add . 2>actual && - test_i18ngrep "in unpopulated submodule" actual + test_grep "in unpopulated submodule" actual ' test_done diff --git a/t/t6135-pathspec-with-attrs.sh b/t/t6135-pathspec-with-attrs.sh index f70c395e75..a9c1e4e0ec 100755 --- a/t/t6135-pathspec-with-attrs.sh +++ b/t/t6135-pathspec-with-attrs.sh @@ -236,7 +236,7 @@ test_expect_success 'check label excluding other labels' ' test_expect_success 'fail on multiple attr specifiers in one pathspec item' ' test_must_fail git ls-files . ":(attr:labelB,attr:labelC)" 2>actual && - test_i18ngrep "Only one" actual + test_grep "Only one" actual ' test_expect_success 'fail if attr magic is used places not implemented' ' @@ -246,7 +246,7 @@ test_expect_success 'fail if attr magic is used places not implemented' ' # though, but git-add is convenient as it has its own internal pathspec # parsing. test_must_fail git add ":(attr:labelB)" 2>actual && - test_i18ngrep "magic not supported" actual + test_grep "magic not supported" actual ' test_expect_success 'abort on giving invalid label on the command line' ' @@ -269,12 +269,12 @@ test_expect_success 'check attribute list' ' test_expect_success 'backslash cannot be the last character' ' test_must_fail git ls-files ":(attr:label=foo\\ labelA=bar)" 2>actual && - test_i18ngrep "not allowed as last character in attr value" actual + test_grep "not allowed as last character in attr value" actual ' test_expect_success 'backslash cannot be used as a value' ' test_must_fail git ls-files ":(attr:label=f\\\oo)" 2>actual && - test_i18ngrep "for value matching" actual + test_grep "for value matching" actual ' test_expect_success 'reading from .gitattributes in a subdirectory (1)' ' diff --git a/t/t6136-pathspec-in-bare.sh b/t/t6136-pathspec-in-bare.sh index ae8b5379e2..2db37a6596 100755 --- a/t/t6136-pathspec-in-bare.sh +++ b/t/t6136-pathspec-in-bare.sh @@ -15,11 +15,11 @@ test_expect_success 'log and ls-files in a bare repository' ' cd bare && test_must_fail git log -- .. >out 2>err && test_must_be_empty out && - test_i18ngrep "outside repository" err && + test_grep "outside repository" err && test_must_fail git ls-files -- .. >out 2>err && test_must_be_empty out && - test_i18ngrep "outside repository" err + test_grep "outside repository" err ) ' @@ -28,11 +28,11 @@ test_expect_success 'log and ls-files in .git directory' ' cd .git && test_must_fail git log -- .. >out 2>err && test_must_be_empty out && - test_i18ngrep "outside repository" err && + test_grep "outside repository" err && test_must_fail git ls-files -- .. >out 2>err && test_must_be_empty out && - test_i18ngrep "outside repository" err + test_grep "outside repository" err ) ' diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index 7b943fd34c..c65c795fce 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -20,11 +20,19 @@ setdate_and_increment () { export GIT_COMMITTER_DATE GIT_AUTHOR_DATE } +test_object_file_size () { + oid=$(git rev-parse "$1") + path=".git/objects/$(test_oid_to_path $oid)" + test_file_size "$path" +} + test_expect_success setup ' - test_oid_cache <<-EOF && - disklen sha1:138 - disklen sha256:154 + # setup .mailmap + cat >.mailmap <<-EOF && + A Thor <athor@example.com> A U Thor <author@example.com> + C Mitter <cmitter@example.com> C O Mitter <committer@example.com> EOF + setdate_and_increment && echo "Using $datestamp" > one && git add one && @@ -41,25 +49,29 @@ test_expect_success setup ' git config push.default current ' -test_atom() { +test_atom () { case "$1" in head) ref=refs/heads/main ;; tag) ref=refs/tags/testtag ;; sym) ref=refs/heads/sym ;; *) ref=$1 ;; esac + format=$2 + test_do=test_expect_${4:-success} + printf '%s\n' "$3" >expected - test_expect_${4:-success} $PREREQ "basic atom: $1 $2" " - git for-each-ref --format='%($2)' $ref >actual && + $test_do $PREREQ "basic atom: $ref $format" ' + git for-each-ref --format="%($format)" "$ref" >actual && sanitize_pgp <actual >actual.clean && test_cmp expected actual.clean - " + ' + # Automatically test "contents:size" atom after testing "contents" - if test "$2" = "contents" + if test "$format" = "contents" then # for commit leg, $3 is changed there expect=$(printf '%s' "$3" | wc -c) - test_expect_${4:-success} $PREREQ "basic atom: $1 contents:size" ' + $test_do $PREREQ "basic atom: $ref contents:size" ' type=$(git cat-file -t "$ref") && case $type in tag) @@ -83,7 +95,6 @@ test_atom() { } hexlen=$(test_oid hexsz) -disklen=$(test_oid disklen) test_atom head refname refs/heads/main test_atom head refname: refs/heads/main @@ -118,7 +129,7 @@ test_atom head push:strip=1 remotes/myfork/main test_atom head push:strip=-1 main test_atom head objecttype commit test_atom head objectsize $((131 + hexlen)) -test_atom head objectsize:disk $disklen +test_atom head objectsize:disk $(test_object_file_size refs/heads/main) test_atom head deltabase $ZERO_OID test_atom head objectname $(git rev-parse refs/heads/main) test_atom head objectname:short $(git rev-parse --short refs/heads/main) @@ -141,15 +152,31 @@ test_atom head '*objectname' '' test_atom head '*objecttype' '' test_atom head author 'A U Thor <author@example.com> 1151968724 +0200' test_atom head authorname 'A U Thor' +test_atom head authorname:mailmap 'A Thor' test_atom head authoremail '<author@example.com>' test_atom head authoremail:trim 'author@example.com' test_atom head authoremail:localpart 'author' +test_atom head authoremail:trim,localpart 'author' +test_atom head authoremail:mailmap '<athor@example.com>' +test_atom head authoremail:mailmap,trim 'athor@example.com' +test_atom head authoremail:trim,mailmap 'athor@example.com' +test_atom head authoremail:mailmap,localpart 'athor' +test_atom head authoremail:localpart,mailmap 'athor' +test_atom head authoremail:mailmap,trim,localpart,mailmap,trim 'athor' test_atom head authordate 'Tue Jul 4 01:18:44 2006 +0200' test_atom head committer 'C O Mitter <committer@example.com> 1151968723 +0200' test_atom head committername 'C O Mitter' +test_atom head committername:mailmap 'C Mitter' test_atom head committeremail '<committer@example.com>' test_atom head committeremail:trim 'committer@example.com' test_atom head committeremail:localpart 'committer' +test_atom head committeremail:localpart,trim 'committer' +test_atom head committeremail:mailmap '<cmitter@example.com>' +test_atom head committeremail:mailmap,trim 'cmitter@example.com' +test_atom head committeremail:trim,mailmap 'cmitter@example.com' +test_atom head committeremail:mailmap,localpart 'cmitter' +test_atom head committeremail:localpart,mailmap 'cmitter' +test_atom head committeremail:trim,mailmap,trim,trim,localpart 'cmitter' test_atom head committerdate 'Tue Jul 4 01:18:43 2006 +0200' test_atom head tag '' test_atom head tagger '' @@ -176,8 +203,8 @@ test_atom tag upstream '' test_atom tag push '' test_atom tag objecttype tag test_atom tag objectsize $((114 + hexlen)) -test_atom tag objectsize:disk $disklen -test_atom tag '*objectsize:disk' $disklen +test_atom tag objectsize:disk $(test_object_file_size refs/tags/testtag) +test_atom tag '*objectsize:disk' $(test_object_file_size refs/heads/main) test_atom tag deltabase $ZERO_OID test_atom tag '*deltabase' $ZERO_OID test_atom tag objectname $(git rev-parse refs/tags/testtag) @@ -199,22 +226,46 @@ test_atom tag '*objectname' $(git rev-parse refs/tags/testtag^{}) test_atom tag '*objecttype' 'commit' test_atom tag author '' test_atom tag authorname '' +test_atom tag authorname:mailmap '' test_atom tag authoremail '' test_atom tag authoremail:trim '' test_atom tag authoremail:localpart '' +test_atom tag authoremail:trim,localpart '' +test_atom tag authoremail:mailmap '' +test_atom tag authoremail:mailmap,trim '' +test_atom tag authoremail:trim,mailmap '' +test_atom tag authoremail:mailmap,localpart '' +test_atom tag authoremail:localpart,mailmap '' +test_atom tag authoremail:mailmap,trim,localpart,mailmap,trim '' test_atom tag authordate '' test_atom tag committer '' test_atom tag committername '' +test_atom tag committername:mailmap '' test_atom tag committeremail '' test_atom tag committeremail:trim '' test_atom tag committeremail:localpart '' +test_atom tag committeremail:localpart,trim '' +test_atom tag committeremail:mailmap '' +test_atom tag committeremail:mailmap,trim '' +test_atom tag committeremail:trim,mailmap '' +test_atom tag committeremail:mailmap,localpart '' +test_atom tag committeremail:localpart,mailmap '' +test_atom tag committeremail:trim,mailmap,trim,trim,localpart '' test_atom tag committerdate '' test_atom tag tag 'testtag' test_atom tag tagger 'C O Mitter <committer@example.com> 1151968725 +0200' test_atom tag taggername 'C O Mitter' +test_atom tag taggername:mailmap 'C Mitter' test_atom tag taggeremail '<committer@example.com>' test_atom tag taggeremail:trim 'committer@example.com' test_atom tag taggeremail:localpart 'committer' +test_atom tag taggeremail:trim,localpart 'committer' +test_atom tag taggeremail:mailmap '<cmitter@example.com>' +test_atom tag taggeremail:mailmap,trim 'cmitter@example.com' +test_atom tag taggeremail:trim,mailmap 'cmitter@example.com' +test_atom tag taggeremail:mailmap,localpart 'cmitter' +test_atom tag taggeremail:localpart,mailmap 'cmitter' +test_atom tag taggeremail:trim,mailmap,trim,localpart,localpart 'cmitter' test_atom tag taggerdate 'Tue Jul 4 01:18:45 2006 +0200' test_atom tag creator 'C O Mitter <committer@example.com> 1151968725 +0200' test_atom tag creatordate 'Tue Jul 4 01:18:45 2006 +0200' @@ -267,6 +318,66 @@ test_expect_success 'arguments to %(objectname:short=) must be positive integers test_must_fail git for-each-ref --format="%(objectname:short=foo)" ' +test_bad_atom () { + case "$1" in + head) ref=refs/heads/main ;; + tag) ref=refs/tags/testtag ;; + sym) ref=refs/heads/sym ;; + *) ref=$1 ;; + esac + format=$2 + test_do=test_expect_${4:-success} + + printf '%s\n' "$3" >expect + $test_do $PREREQ "err basic atom: $ref $format" ' + test_must_fail git for-each-ref \ + --format="%($format)" "$ref" 2>error && + test_cmp expect error + ' +} + +test_bad_atom head 'authoremail:foo' \ + 'fatal: unrecognized %(authoremail) argument: foo' + +test_bad_atom head 'authoremail:mailmap,trim,bar' \ + 'fatal: unrecognized %(authoremail) argument: bar' + +test_bad_atom head 'authoremail:trim,' \ + 'fatal: unrecognized %(authoremail) argument: ' + +test_bad_atom head 'authoremail:mailmaptrim' \ + 'fatal: unrecognized %(authoremail) argument: trim' + +test_bad_atom head 'committeremail: ' \ + 'fatal: unrecognized %(committeremail) argument: ' + +test_bad_atom head 'committeremail: trim,foo' \ + 'fatal: unrecognized %(committeremail) argument: trim,foo' + +test_bad_atom head 'committeremail:mailmap,localpart ' \ + 'fatal: unrecognized %(committeremail) argument: ' + +test_bad_atom head 'committeremail:trim_localpart' \ + 'fatal: unrecognized %(committeremail) argument: _localpart' + +test_bad_atom head 'committeremail:localpart,,,trim' \ + 'fatal: unrecognized %(committeremail) argument: ,,trim' + +test_bad_atom tag 'taggeremail:mailmap,trim, foo ' \ + 'fatal: unrecognized %(taggeremail) argument: foo ' + +test_bad_atom tag 'taggeremail:trim,localpart,' \ + 'fatal: unrecognized %(taggeremail) argument: ' + +test_bad_atom tag 'taggeremail:mailmap;localpart trim' \ + 'fatal: unrecognized %(taggeremail) argument: ;localpart trim' + +test_bad_atom tag 'taggeremail:localpart trim' \ + 'fatal: unrecognized %(taggeremail) argument: trim' + +test_bad_atom tag 'taggeremail:mailmap,mailmap,trim,qux,localpart,trim' \ + 'fatal: unrecognized %(taggeremail) argument: qux,localpart,trim' + test_date () { f=$1 && committer_date=$2 && diff --git a/t/t6301-for-each-ref-errors.sh b/t/t6301-for-each-ref-errors.sh index 2667dd13fe..83b8a19d94 100755 --- a/t/t6301-for-each-ref-errors.sh +++ b/t/t6301-for-each-ref-errors.sh @@ -15,7 +15,7 @@ test_expect_success setup ' git for-each-ref --format="%(objectname) %(refname)" >brief-list ' -test_expect_success 'Broken refs are reported correctly' ' +test_expect_success REFFILES 'Broken refs are reported correctly' ' r=refs/heads/bogus && : >.git/$r && test_when_finished "rm -f .git/$r" && @@ -25,7 +25,7 @@ test_expect_success 'Broken refs are reported correctly' ' test_cmp broken-err err ' -test_expect_success 'NULL_SHA1 refs are reported correctly' ' +test_expect_success REFFILES 'NULL_SHA1 refs are reported correctly' ' r=refs/heads/zeros && echo $ZEROS >.git/$r && test_when_finished "rm -f .git/$r" && @@ -39,15 +39,14 @@ test_expect_success 'NULL_SHA1 refs are reported correctly' ' ' test_expect_success 'Missing objects are reported correctly' ' - r=refs/heads/missing && - echo $MISSING >.git/$r && - test_when_finished "rm -f .git/$r" && - echo "fatal: missing object $MISSING for $r" >missing-err && + test_when_finished "git update-ref -d refs/heads/missing" && + test-tool ref-store main update-ref msg refs/heads/missing "$MISSING" "$ZERO_OID" REF_SKIP_OID_VERIFICATION && + echo "fatal: missing object $MISSING for refs/heads/missing" >missing-err && test_must_fail git for-each-ref 2>err && test_cmp missing-err err && ( cat brief-list && - echo "$MISSING $r" + echo "$MISSING refs/heads/missing" ) | sort -k 2 >missing-brief-expected && git for-each-ref --format="%(objectname) %(refname)" >brief-out 2>brief-err && test_cmp missing-brief-expected brief-out && diff --git a/t/t6402-merge-rename.sh b/t/t6402-merge-rename.sh index 772238e582..2738b50c2a 100755 --- a/t/t6402-merge-rename.sh +++ b/t/t6402-merge-rename.sh @@ -311,13 +311,13 @@ test_expect_success 'Rename+D/F conflict; renamed file merges but dir in way' ' git checkout -q renamed-file-has-no-conflicts^0 && test_must_fail git merge --strategy=recursive dir-in-way >output && - test_i18ngrep "CONFLICT (modify/delete): dir/file-in-the-way" output && - test_i18ngrep "Auto-merging dir" output && + test_grep "CONFLICT (modify/delete): dir/file-in-the-way" output && + test_grep "Auto-merging dir" output && if test "$GIT_TEST_MERGE_ALGORITHM" = ort then - test_i18ngrep "moving it to dir~HEAD instead" output + test_grep "moving it to dir~HEAD instead" output else - test_i18ngrep "Adding as dir~HEAD instead" output + test_grep "Adding as dir~HEAD instead" output fi && test_stdout_line_count = 3 git ls-files -u && @@ -338,13 +338,13 @@ test_expect_success 'Same as previous, but merged other way' ' test_must_fail git merge --strategy=recursive renamed-file-has-no-conflicts >output 2>errors && ! grep "error: refusing to lose untracked file at" errors && - test_i18ngrep "CONFLICT (modify/delete): dir/file-in-the-way" output && - test_i18ngrep "Auto-merging dir" output && + test_grep "CONFLICT (modify/delete): dir/file-in-the-way" output && + test_grep "Auto-merging dir" output && if test "$GIT_TEST_MERGE_ALGORITHM" = ort then - test_i18ngrep "moving it to dir~renamed-file-has-no-conflicts instead" output + test_grep "moving it to dir~renamed-file-has-no-conflicts instead" output else - test_i18ngrep "Adding as dir~renamed-file-has-no-conflicts instead" output + test_grep "Adding as dir~renamed-file-has-no-conflicts instead" output fi && test_stdout_line_count = 3 git ls-files -u && diff --git a/t/t6403-merge-file.sh b/t/t6403-merge-file.sh index 1a7082323d..2c92209eca 100755 --- a/t/t6403-merge-file.sh +++ b/t/t6403-merge-file.sh @@ -65,11 +65,30 @@ test_expect_success 'merge with no changes' ' test_cmp test.txt orig.txt ' +test_expect_success 'merge with no changes with --object-id' ' + git add orig.txt && + git merge-file -p --object-id :orig.txt :orig.txt :orig.txt >actual && + test_cmp actual orig.txt +' + test_expect_success "merge without conflict" ' cp new1.txt test.txt && git merge-file test.txt orig.txt new2.txt ' +test_expect_success 'merge without conflict with --object-id' ' + git add orig.txt new2.txt && + git merge-file --object-id :orig.txt :orig.txt :new2.txt >actual && + git rev-parse :new2.txt >expected && + test_cmp actual expected +' + +test_expect_success 'can accept object ID with --object-id' ' + git merge-file --object-id $(test_oid empty_blob) $(test_oid empty_blob) :new2.txt >actual && + git rev-parse :new2.txt >expected && + test_cmp actual expected +' + test_expect_success 'works in subdirectory' ' mkdir dir && cp new1.txt dir/a.txt && @@ -138,6 +157,31 @@ test_expect_success "expected conflict markers" ' test_cmp expect.txt test.txt ' +test_expect_success "merge with conflicts with --object-id" ' + git add backup.txt orig.txt new3.txt && + test_must_fail git merge-file -p --object-id :backup.txt :orig.txt :new3.txt >actual && + sed -e "s/<< test.txt/<< :backup.txt/" \ + -e "s/>> new3.txt/>> :new3.txt/" \ + expect.txt >expect && + test_cmp expect actual && + test_must_fail git merge-file --object-id :backup.txt :orig.txt :new3.txt >oid && + git cat-file blob "$(cat oid)" >actual && + test_cmp expect actual +' + +test_expect_success "merge with conflicts with --object-id with labels" ' + git add backup.txt orig.txt new3.txt && + test_must_fail git merge-file -p --object-id \ + -L test.txt -L orig.txt -L new3.txt \ + :backup.txt :orig.txt :new3.txt >actual && + test_cmp expect.txt actual && + test_must_fail git merge-file --object-id \ + -L test.txt -L orig.txt -L new3.txt \ + :backup.txt :orig.txt :new3.txt >oid && + git cat-file blob "$(cat oid)" >actual && + test_cmp expect.txt actual +' + test_expect_success "merge conflicting with --ours" ' cp backup.txt test.txt && @@ -256,6 +300,14 @@ test_expect_success 'binary files cannot be merged' ' grep "Cannot merge binary files" merge.err ' +test_expect_success 'binary files cannot be merged with --object-id' ' + cp "$TEST_DIRECTORY"/test-binary-1.png . && + git add orig.txt new1.txt test-binary-1.png && + test_must_fail git merge-file --object-id \ + :orig.txt :test-binary-1.png :new1.txt 2> merge.err && + grep "Cannot merge binary files" merge.err +' + test_expect_success 'MERGE_ZEALOUS simplifies non-conflicts' ' sed -e "s/deerit.\$/deerit;/" -e "s/me;\$/me./" <new5.txt >new6.txt && sed -e "s/deerit.\$/deerit,/" -e "s/me;\$/me,/" <new5.txt >new7.txt && @@ -389,4 +441,10 @@ test_expect_success 'conflict sections match existing line endings' ' test $(tr "\015" Q <nolf.txt | grep "^[<=>].*Q$" | wc -l) = 0 ' +test_expect_success '--object-id fails without repository' ' + empty="$(test_oid empty_blob)" && + nongit test_must_fail git merge-file --object-id $empty $empty $empty 2>err && + grep "not a git repository" err +' + test_done diff --git a/t/t6406-merge-attr.sh b/t/t6406-merge-attr.sh index 9677180a5b..72f8c1722f 100755 --- a/t/t6406-merge-attr.sh +++ b/t/t6406-merge-attr.sh @@ -179,7 +179,8 @@ test_expect_success !WINDOWS 'custom merge driver that is killed with a signal' >./please-abort && echo "* merge=custom" >.gitattributes && - test_must_fail git merge main && + test_must_fail git merge main 2>err && + grep "^error: failed to execute internal merge" err && git ls-files -u >output && git diff --name-only HEAD >>output && test_must_be_empty output diff --git a/t/t6416-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh index 17b54d625d..5f414abc89 100755 --- a/t/t6416-recursive-corner-cases.sh +++ b/t/t6416-recursive-corner-cases.sh @@ -5,6 +5,7 @@ test_description='recursive merge corner cases involving criss-cross merges' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh . "$TEST_DIRECTORY"/lib-merge.sh diff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh index 076b6a74d5..80d7b5eaba 100755 --- a/t/t6422-merge-rename-corner-cases.sh +++ b/t/t6422-merge-rename-corner-cases.sh @@ -476,7 +476,7 @@ test_expect_success 'handle rename-with-content-merge vs. add' ' git checkout A^0 && test_must_fail git merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (.*/add)" out && + test_grep "CONFLICT (.*/add)" out && git ls-files -s >out && test_line_count = 2 out && @@ -522,7 +522,7 @@ test_expect_success 'handle rename-with-content-merge vs. add, merge other way' git checkout B^0 && test_must_fail git merge -s recursive A^0 >out && - test_i18ngrep "CONFLICT (.*/add)" out && + test_grep "CONFLICT (.*/add)" out && git ls-files -s >out && test_line_count = 2 out && @@ -602,7 +602,7 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' ' git checkout B^0 && test_must_fail git merge -s recursive C^0 >out && - test_i18ngrep "CONFLICT (\(.*\)/\1)" out && + test_grep "CONFLICT (\(.*\)/\1)" out && git ls-files -s >out && test_line_count = 2 out && @@ -914,8 +914,8 @@ test_expect_merge_algorithm failure success 'rad-check: rename/add/delete confli # be flexible in the type of console output message(s) reported # for this particular case; we will be more stringent about the # contents of the index and working directory. - test_i18ngrep "CONFLICT (.*/add)" out && - test_i18ngrep "CONFLICT (rename.*/delete)" out && + test_grep "CONFLICT (.*/add)" out && + test_grep "CONFLICT (rename.*/delete)" out && test_must_be_empty err && git ls-files -s >file_count && @@ -988,8 +988,8 @@ test_expect_merge_algorithm failure success 'rrdd-check: rename/rename(2to1)/del # be flexible in the type of console output message(s) reported # for this particular case; we will be more stringent about the # contents of the index and working directory. - test_i18ngrep "CONFLICT (\(.*\)/\1)" out && - test_i18ngrep "CONFLICT (rename.*delete)" out && + test_grep "CONFLICT (\(.*\)/\1)" out && + test_grep "CONFLICT (rename.*delete)" out && test_must_be_empty err && git ls-files -s >file_count && @@ -1068,7 +1068,7 @@ test_expect_merge_algorithm failure success 'mod6-check: chains of rename/rename test_must_fail git merge -s recursive B^0 >out 2>err && - test_i18ngrep "CONFLICT (rename/rename)" out && + test_grep "CONFLICT (rename/rename)" out && test_must_be_empty err && git ls-files -s >file_count && diff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh index 944de75b80..88d1cf2cde 100755 --- a/t/t6423-merge-rename-directories.sh +++ b/t/t6423-merge-rename-directories.sh @@ -276,7 +276,7 @@ test_expect_success '1d: Directory renames cause a rename/rename(2to1) conflict' git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (\(.*\)/\1)" out && + test_grep "CONFLICT (\(.*\)/\1)" out && git ls-files -s >out && test_line_count = 8 out && @@ -515,7 +515,7 @@ test_expect_success '2a: Directory split into two on one side, with equal number git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT.*directory rename split" out && + test_grep "CONFLICT.*directory rename split" out && git ls-files -s >out && test_line_count = 3 out && @@ -591,7 +591,7 @@ test_expect_success '2b: Directory split into two on one side, with equal number git rev-parse >expect \ O:z/b O:z/c B:x/d && test_cmp expect actual && - test_i18ngrep ! "CONFLICT.*directory rename split" out + test_grep ! "CONFLICT.*directory rename split" out ) ' @@ -726,8 +726,8 @@ test_expect_success '3b: Avoid implicit rename if involved as source on current git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep CONFLICT.*rename/rename.*z/d.*x/d.*w/d out && - test_i18ngrep ! CONFLICT.*rename/rename.*y/d out && + test_grep CONFLICT.*rename/rename.*z/d.*x/d.*w/d out && + test_grep ! CONFLICT.*rename/rename.*y/d out && git ls-files -s >out && test_line_count = 5 out && @@ -938,7 +938,7 @@ test_expect_success '5a: Merge directories, other side adds files to original an git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT.*implicit dir rename" out && + test_grep "CONFLICT.*implicit dir rename" out && git ls-files -s >out && test_line_count = 6 out && @@ -1013,7 +1013,7 @@ test_expect_success '5b: Rename/delete in order to get add/add/add conflict' ' git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (add/add).* y/d" out && + test_grep "CONFLICT (add/add).* y/d" out && git ls-files -s >out && test_line_count = 5 out && @@ -1094,8 +1094,8 @@ test_expect_success '5c: Transitive rename would cause rename/rename/rename/add/ git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (rename/rename).*x/d.*w/d.*z/d" out && - test_i18ngrep "CONFLICT (add/add).* y/d" out && + test_grep "CONFLICT (rename/rename).*x/d.*w/d.*z/d" out && + test_grep "CONFLICT (add/add).* y/d" out && git ls-files -s >out && test_line_count = 9 out && @@ -1179,7 +1179,7 @@ test_expect_success '5d: Directory/file/file conflict due to directory rename' ' git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (file/directory).*y/d" out && + test_grep "CONFLICT (file/directory).*y/d" out && git ls-files -s >out && test_line_count = 6 out && @@ -1278,7 +1278,7 @@ test_expect_success '6a: Tricky rename/delete' ' git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (rename/delete).*z/c.*y/c" out && + test_grep "CONFLICT (rename/delete).*z/c.*y/c" out && if test "$GIT_TEST_MERGE_ALGORITHM" = ort then @@ -1740,8 +1740,8 @@ test_expect_success '7a: rename-dir vs. rename-dir (NOT split evenly) PLUS add-o git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (rename/rename).*z/b.*y/b.*w/b" out && - test_i18ngrep "CONFLICT (rename/rename).*z/c.*y/c.*x/c" out && + test_grep "CONFLICT (rename/rename).*z/b.*y/b.*w/b" out && + test_grep "CONFLICT (rename/rename).*z/c.*y/c.*x/c" out && git ls-files -s >out && test_line_count = 7 out && @@ -1813,7 +1813,7 @@ test_expect_success '7b: rename/rename(2to1), but only due to transitive rename' git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (\(.*\)/\1)" out && + test_grep "CONFLICT (\(.*\)/\1)" out && git ls-files -s >out && test_line_count = 4 out && @@ -1900,7 +1900,7 @@ test_expect_success '7c: rename/rename(1to...2or3); transitive rename may add co git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (rename/rename).*x/d.*w/d.*y/d" out && + test_grep "CONFLICT (rename/rename).*x/d.*w/d.*y/d" out && git ls-files -s >out && test_line_count = 5 out && @@ -1965,7 +1965,7 @@ test_expect_success '7d: transitive rename involved in rename/delete; how is it git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (rename/delete).*x/d.*y/d" out && + test_grep "CONFLICT (rename/delete).*x/d.*y/d" out && if test "$GIT_TEST_MERGE_ALGORITHM" = ort then @@ -2071,7 +2071,7 @@ test_expect_success '7e: transitive rename in rename/delete AND dirs in the way' git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (rename/delete).*x/d.*y/d" out && + test_grep "CONFLICT (rename/delete).*x/d.*y/d" out && if test "$GIT_TEST_MERGE_ALGORITHM" = ort then @@ -2330,7 +2330,7 @@ test_expect_success '8c: modify/delete or rename+modify/delete' ' git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "CONFLICT (modify/delete).* z/d" out && + test_grep "CONFLICT (modify/delete).* z/d" out && git ls-files -s >out && test_line_count = 5 out && @@ -2491,8 +2491,8 @@ test_expect_success '8e: Both sides rename, one side adds to original directory' git checkout A^0 && test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep CONFLICT.*rename/rename.*z/c.*y/c.*w/c out && - test_i18ngrep CONFLICT.*rename/rename.*z/b.*y/b.*w/b out && + test_grep CONFLICT.*rename/rename.*z/c.*y/c.*w/c out && + test_grep CONFLICT.*rename/rename.*z/b.*y/b.*w/b out && git ls-files -s >out && test_line_count = 7 out && @@ -2741,7 +2741,7 @@ test_expect_success '9c: Doubly transitive rename?' ' git checkout A^0 && git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "WARNING: Avoiding applying x -> z rename to x/f" out && + test_grep "WARNING: Avoiding applying x -> z rename to x/f" out && git ls-files -s >out && test_line_count = 6 out && @@ -2830,10 +2830,10 @@ test_expect_success '9d: N-way transitive rename?' ' git checkout A^0 && git -c merge.directoryRenames=true merge -s recursive B^0 >out && - test_i18ngrep "WARNING: Avoiding applying z -> y rename to z/t" out && - test_i18ngrep "WARNING: Avoiding applying y -> x rename to y/a" out && - test_i18ngrep "WARNING: Avoiding applying x -> w rename to x/b" out && - test_i18ngrep "WARNING: Avoiding applying w -> v rename to w/c" out && + test_grep "WARNING: Avoiding applying z -> y rename to z/t" out && + test_grep "WARNING: Avoiding applying y -> x rename to y/a" out && + test_grep "WARNING: Avoiding applying x -> w rename to x/b" out && + test_grep "WARNING: Avoiding applying w -> v rename to w/c" out && git ls-files -s >out && test_line_count = 7 out && @@ -3215,7 +3215,7 @@ test_expect_success '10a: Overwrite untracked with normal rename/delete' ' test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "The following untracked working tree files would be overwritten by merge" err && + test_grep "The following untracked working tree files would be overwritten by merge" err && git ls-files -s >out && test_line_count = 1 out && @@ -3287,7 +3287,7 @@ test_expect_success '10b: Overwrite untracked with dir rename + delete' ' if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err && + test_grep "error: The following untracked working tree files would be overwritten by merge" err && git ls-files -s >out && test_line_count = 1 out && @@ -3296,8 +3296,8 @@ test_expect_success '10b: Overwrite untracked with dir rename + delete' ' git ls-files -o >out && test_line_count = 5 out else - test_i18ngrep "CONFLICT (rename/delete).*Version B\^0 of y/d left in tree at y/d~B\^0" out && - test_i18ngrep "Error: Refusing to lose untracked file at y/e; writing to y/e~B\^0 instead" out && + test_grep "CONFLICT (rename/delete).*Version B\^0 of y/d left in tree at y/d~B\^0" out && + test_grep "Error: Refusing to lose untracked file at y/e; writing to y/e~B\^0 instead" out && git ls-files -s >out && test_line_count = 3 out && @@ -3377,7 +3377,7 @@ test_expect_success '10c1: Overwrite untracked with dir rename/rename(1to2)' ' if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err && + test_grep "error: The following untracked working tree files would be overwritten by merge" err && git ls-files -s >out && test_line_count = 4 out && @@ -3386,8 +3386,8 @@ test_expect_success '10c1: Overwrite untracked with dir rename/rename(1to2)' ' git ls-files -o >out && test_line_count = 3 out else - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose untracked file at y/c; adding as y/c~B\^0 instead" out && + test_grep "CONFLICT (rename/rename)" out && + test_grep "Refusing to lose untracked file at y/c; adding as y/c~B\^0 instead" out && git ls-files -s >out && test_line_count = 6 out && @@ -3428,7 +3428,7 @@ test_expect_success '10c2: Overwrite untracked with dir rename/rename(1to2), oth if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err && + test_grep "error: The following untracked working tree files would be overwritten by merge" err && git ls-files -s >out && test_line_count = 4 out && @@ -3437,8 +3437,8 @@ test_expect_success '10c2: Overwrite untracked with dir rename/rename(1to2), oth git ls-files -o >out && test_line_count = 3 out else - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose untracked file at y/c; adding as y/c~HEAD instead" out && + test_grep "CONFLICT (rename/rename)" out && + test_grep "Refusing to lose untracked file at y/c; adding as y/c~HEAD instead" out && git ls-files -s >out && test_line_count = 6 out && @@ -3517,7 +3517,7 @@ test_expect_success '10d: Delete untracked with dir rename/rename(2to1)' ' if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: The following untracked working tree files would be overwritten by merge" err && + test_grep "error: The following untracked working tree files would be overwritten by merge" err && git ls-files -s >out && test_line_count = 6 out && @@ -3526,8 +3526,8 @@ test_expect_success '10d: Delete untracked with dir rename/rename(2to1)' ' git ls-files -o >out && test_line_count = 3 out else - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose untracked file at y/wham" out && + test_grep "CONFLICT (rename/rename)" out && + test_grep "Refusing to lose untracked file at y/wham" out && git ls-files -s >out && test_line_count = 6 out && @@ -3606,7 +3606,7 @@ test_expect_merge_algorithm failure success '10e: Does git complain about untrac echo random >z/c && git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep ! "following untracked working tree files would be overwritten by merge" err && + test_grep ! "following untracked working tree files would be overwritten by merge" err && git ls-files -s >out && test_line_count = 3 out && @@ -3690,9 +3690,9 @@ test_expect_success '11a: Avoid losing dirty contents with simple rename' ' if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + test_grep "error: Your local changes to the following files would be overwritten by merge" err else - test_i18ngrep "Refusing to lose dirty file at z/c" out && + test_grep "Refusing to lose dirty file at z/c" out && git ls-files -s >out && test_line_count = 2 out && @@ -3770,10 +3770,10 @@ test_expect_success '11b: Avoid losing dirty file involved in directory rename' then test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + test_grep "error: Your local changes to the following files would be overwritten by merge" err else git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep "Refusing to lose dirty file at z/c" out && + test_grep "Refusing to lose dirty file at z/c" out && git ls-files -s >out && test_line_count = 3 out && @@ -3853,9 +3853,9 @@ test_expect_success '11c: Avoid losing not-uptodate with rename + D/F conflict' if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + test_grep "error: Your local changes to the following files would be overwritten by merge" err else - test_i18ngrep "following files would be overwritten by merge" err + test_grep "following files would be overwritten by merge" err fi && grep -q stuff y/c && @@ -3927,9 +3927,9 @@ test_expect_success '11d: Avoid losing not-uptodate with rename + D/F conflict' if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + test_grep "error: Your local changes to the following files would be overwritten by merge" err else - test_i18ngrep "Refusing to lose dirty file at z/c" out && + test_grep "Refusing to lose dirty file at z/c" out && git ls-files -s >out && test_line_count = 4 out && @@ -4013,10 +4013,10 @@ test_expect_success '11e: Avoid deleting not-uptodate with dir rename/rename(1to if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + test_grep "error: Your local changes to the following files would be overwritten by merge" err else - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose dirty file at y/c" out && + test_grep "CONFLICT (rename/rename)" out && + test_grep "Refusing to lose dirty file at y/c" out && git ls-files -s >out && test_line_count = 7 out && @@ -4102,10 +4102,10 @@ test_expect_success '11f: Avoid deleting not-uptodate with dir rename/rename(2to if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_path_is_missing .git/MERGE_HEAD && - test_i18ngrep "error: Your local changes to the following files would be overwritten by merge" err + test_grep "error: Your local changes to the following files would be overwritten by merge" err else - test_i18ngrep "CONFLICT (rename/rename)" out && - test_i18ngrep "Refusing to lose dirty file at y/wham" out && + test_grep "CONFLICT (rename/rename)" out && + test_grep "Refusing to lose dirty file at y/wham" out && git ls-files -s >out && test_line_count = 4 out && @@ -5417,8 +5417,8 @@ test_expect_success '13a(conflict): messages for newly added files' ' test_must_fail git merge -s recursive B^0 >out 2>err && - test_i18ngrep CONFLICT..file.location.*z/e/f.added.in.B^0.*y/e/f out && - test_i18ngrep CONFLICT..file.location.*z/d.added.in.B^0.*y/d out && + test_grep CONFLICT..file.location.*z/e/f.added.in.B^0.*y/e/f out && + test_grep CONFLICT..file.location.*z/d.added.in.B^0.*y/d out && git ls-files >paths && ! grep z/ paths && @@ -5441,8 +5441,8 @@ test_expect_success '13a(info): messages for newly added files' ' git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep Path.updated:.*z/e/f.added.in.B^0.*y/e/f out && - test_i18ngrep Path.updated:.*z/d.added.in.B^0.*y/d out && + test_grep Path.updated:.*z/e/f.added.in.B^0.*y/e/f out && + test_grep Path.updated:.*z/d.added.in.B^0.*y/d out && git ls-files >paths && ! grep z/ paths && @@ -5507,8 +5507,8 @@ test_expect_success '13b(conflict): messages for transitive rename with conflict test_must_fail git merge -s recursive B^0 >out 2>err && - test_i18ngrep CONFLICT.*content.*Merge.conflict.in.y/d out && - test_i18ngrep CONFLICT..file.location.*x/d.renamed.to.z/d.*moved.to.y/d out && + test_grep CONFLICT.*content.*Merge.conflict.in.y/d out && + test_grep CONFLICT..file.location.*x/d.renamed.to.z/d.*moved.to.y/d out && git ls-files >paths && ! grep z/ paths && @@ -5529,8 +5529,8 @@ test_expect_success '13b(info): messages for transitive rename with conflicted c test_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep CONFLICT.*content.*Merge.conflict.in.y/d out && - test_i18ngrep Path.updated:.*x/d.renamed.to.z/d.in.B^0.*moving.it.to.y/d out && + test_grep CONFLICT.*content.*Merge.conflict.in.y/d out && + test_grep Path.updated:.*x/d.renamed.to.z/d.in.B^0.*moving.it.to.y/d out && git ls-files >paths && ! grep z/ paths && @@ -5593,7 +5593,7 @@ test_expect_success '13c(conflict): messages for rename/rename(1to1) via transit test_must_fail git merge -s recursive B^0 >out 2>err && - test_i18ngrep CONFLICT..file.location.*x/d.renamed.to.z/d.*moved.to.y/d out && + test_grep CONFLICT..file.location.*x/d.renamed.to.z/d.*moved.to.y/d out && git ls-files >paths && ! grep z/ paths && @@ -5614,7 +5614,7 @@ test_expect_success '13c(info): messages for rename/rename(1to1) via transitive git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep Path.updated:.*x/d.renamed.to.z/d.in.B^0.*moving.it.to.y/d out && + test_grep Path.updated:.*x/d.renamed.to.z/d.in.B^0.*moving.it.to.y/d out && git ls-files >paths && ! grep z/ paths && @@ -5682,8 +5682,8 @@ test_expect_success '13d(conflict): messages for rename/rename(1to1) via dual tr test_must_fail git merge -s recursive B^0 >out 2>err && - test_i18ngrep CONFLICT..file.location.*a/y.renamed.to.b/y.*moved.to.d/y out && - test_i18ngrep CONFLICT..file.location.*a/y.renamed.to.c/y.*moved.to.d/y out && + test_grep CONFLICT..file.location.*a/y.renamed.to.b/y.*moved.to.d/y out && + test_grep CONFLICT..file.location.*a/y.renamed.to.c/y.*moved.to.d/y out && git ls-files >paths && ! grep b/ paths && @@ -5706,8 +5706,8 @@ test_expect_success '13d(info): messages for rename/rename(1to1) via dual transi git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && - test_i18ngrep Path.updated.*a/y.renamed.to.b/y.*moving.it.to.d/y out && - test_i18ngrep Path.updated.*a/y.renamed.to.c/y.*moving.it.to.d/y out && + test_grep Path.updated.*a/y.renamed.to.b/y.*moving.it.to.d/y out && + test_grep Path.updated.*a/y.renamed.to.c/y.*moving.it.to.d/y out && git ls-files >paths && ! grep b/ paths && @@ -5821,9 +5821,9 @@ test_expect_success '13e: directory rename detection in recursive case' ' git -c merge.directoryRenames=conflict merge -s recursive C^0 >out 2>err && - test_i18ngrep ! CONFLICT out && - test_i18ngrep ! BUG: err && - test_i18ngrep ! core.dumped err && + test_grep ! CONFLICT out && + test_grep ! BUG: err && + test_grep ! core.dumped err && test_must_be_empty err && git ls-files >paths && diff --git a/t/t6424-merge-unrelated-index-changes.sh b/t/t6424-merge-unrelated-index-changes.sh index a61f20c22f..7677c5f08d 100755 --- a/t/t6424-merge-unrelated-index-changes.sh +++ b/t/t6424-merge-unrelated-index-changes.sh @@ -178,7 +178,7 @@ test_expect_success 'merge-recursive, when index==head but head!=HEAD' ' test_when_finished "git clean -fd" && # Do not leave untracked around # Merge B & F, with B as "head" git merge-recursive A -- B F > out && - test_i18ngrep "Already up to date" out + test_grep "Already up to date" out ' test_expect_success 'recursive, when file has staged changes not matching HEAD nor what a merge would give' ' @@ -194,7 +194,7 @@ test_expect_success 'recursive, when file has staged changes not matching HEAD n test_must_fail git merge -s recursive E^0 2>err && git rev-parse --verify :subdir/a >actual && test_cmp expect actual && - test_i18ngrep "changes to the following files would be overwritten" err + test_grep "changes to the following files would be overwritten" err ' test_expect_success 'recursive, when file has staged changes matching what a merge would give' ' @@ -210,7 +210,7 @@ test_expect_success 'recursive, when file has staged changes matching what a mer test_must_fail git merge -s recursive E^0 2>err && git rev-parse --verify :subdir/a >actual && test_cmp expect actual && - test_i18ngrep "changes to the following files would be overwritten" err + test_grep "changes to the following files would be overwritten" err ' test_expect_success 'octopus, unrelated file touched' ' diff --git a/t/t6425-merge-rename-delete.sh b/t/t6425-merge-rename-delete.sh index 93cd2869b1..b95b064311 100755 --- a/t/t6425-merge-rename-delete.sh +++ b/t/t6425-merge-rename-delete.sh @@ -21,8 +21,8 @@ test_expect_success 'rename/delete' ' git commit -m "delete" && test_must_fail git merge --strategy=recursive rename >output && - test_i18ngrep "CONFLICT (rename/delete): A.* renamed .*to B.* in rename" output && - test_i18ngrep "CONFLICT (rename/delete): A.*deleted in HEAD." output + test_grep "CONFLICT (rename/delete): A.* renamed .*to B.* in rename" output && + test_grep "CONFLICT (rename/delete): A.*deleted in HEAD." output ' test_done diff --git a/t/t6426-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh index fd21c1a486..b059475ed0 100755 --- a/t/t6426-merge-skip-unneeded-updates.sh +++ b/t/t6426-merge-skip-unneeded-updates.sh @@ -375,7 +375,7 @@ test_expect_success '2c: Modify b & add c VS rename b->c' ' export GIT_MERGE_VERBOSITY && test_must_fail git merge -s recursive B^0 >out 2>err && - test_i18ngrep "CONFLICT (.*/add):" out && + test_grep "CONFLICT (.*/add):" out && test_must_be_empty err && git ls-files -s >index_files && diff --git a/t/t6430-merge-recursive.sh b/t/t6430-merge-recursive.sh index 07067bb347..ca15e6dd6d 100755 --- a/t/t6430-merge-recursive.sh +++ b/t/t6430-merge-recursive.sh @@ -308,13 +308,13 @@ test_expect_success 'fail if the index has unresolved entries' ' test_must_fail git merge "$c5" && test_must_fail git merge "$c5" 2> out && - test_i18ngrep "not possible because you have unmerged files" out && + test_grep "not possible because you have unmerged files" out && git add -u && test_must_fail git merge "$c5" 2> out && - test_i18ngrep "You have not concluded your merge" out && + test_grep "You have not concluded your merge" out && rm -f .git/MERGE_HEAD && test_must_fail git merge "$c5" 2> out && - test_i18ngrep "Your local changes to the following files would be overwritten by merge:" out + test_grep "Your local changes to the following files would be overwritten by merge:" out ' test_expect_success 'merge-recursive remove conflict' ' @@ -713,7 +713,7 @@ test_expect_success 'merge-recursive remembers the names of all base trees' ' test_must_fail git -c merge.verbosity=5 merge-recursive $(cat trees) -- $c1 $c3 >out && # ...but make sure it fails in the expected way - test_i18ngrep CONFLICT.*rename/rename out && + test_grep CONFLICT.*rename/rename out && # merge-recursive prints in reverse order, but we do not care sort <trees >expect && diff --git a/t/t6433-merge-toplevel.sh b/t/t6433-merge-toplevel.sh index b16031465f..ed7866d3e9 100755 --- a/t/t6433-merge-toplevel.sh +++ b/t/t6433-merge-toplevel.sh @@ -5,6 +5,7 @@ test_description='"git merge" top-level frontend' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh t3033_reset () { @@ -151,7 +152,7 @@ test_expect_success 'refuse two-project merge by default, quit before --autostas echo change >>one.t && git diff >expect && test_must_fail git merge --autostash five 2>err && - test_i18ngrep ! "stash" err && + test_grep ! "stash" err && git diff >actual && test_cmp expect actual ' @@ -169,7 +170,7 @@ test_expect_success 'two-project merge with --allow-unrelated-histories with --a echo change >>one.t && git diff one.t >expect && git merge --allow-unrelated-histories --autostash five 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && git diff one.t >actual && test_cmp expect actual ' diff --git a/t/t6436-merge-overwrite.sh b/t/t6436-merge-overwrite.sh index c0b7bd7c3f..4f4376421e 100755 --- a/t/t6436-merge-overwrite.sh +++ b/t/t6436-merge-overwrite.sh @@ -104,12 +104,12 @@ test_expect_success 'will not overwrite unstaged changes in renamed file' ' if test "$GIT_TEST_MERGE_ALGORITHM" = ort then test_must_fail git merge c1a >out 2>err && - test_i18ngrep "would be overwritten by merge" err && + test_grep "would be overwritten by merge" err && test_cmp important other.c && test_path_is_missing .git/MERGE_HEAD else test_must_fail git merge c1a >out && - test_i18ngrep "Refusing to lose dirty file at other.c" out && + test_grep "Refusing to lose dirty file at other.c" out && test_path_is_file other.c~HEAD && test $(git hash-object other.c~HEAD) = $(git rev-parse c1a:c1.c) && test_cmp important other.c diff --git a/t/t6437-submodule-merge.sh b/t/t6437-submodule-merge.sh index c9a86f2e94..70650521b0 100755 --- a/t/t6437-submodule-merge.sh +++ b/t/t6437-submodule-merge.sh @@ -8,6 +8,7 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB=1 export GIT_TEST_FATAL_REGISTER_SUBMODULE_ODB +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh . "$TEST_DIRECTORY"/lib-merge.sh @@ -479,7 +480,7 @@ test_expect_merge_algorithm failure success !FAIL_PREREQS 'directory/submodule c # We do not want files within the submodule to prevent the # merge from starting; we should not be writing to such paths # anyway. - test_i18ngrep ! "refusing to lose untracked file at" err + test_grep ! "refusing to lose untracked file at" err ) ' diff --git a/t/t6500-gc.sh b/t/t6500-gc.sh index 69509d0c11..18fe1c25e6 100755 --- a/t/t6500-gc.sh +++ b/t/t6500-gc.sh @@ -41,7 +41,7 @@ test_expect_success 'gc does not leave behind pid file' ' test_expect_success 'gc --gobbledegook' ' test_expect_code 129 git gc --nonsense 2>err && - test_i18ngrep "[Uu]sage: git gc" err + test_grep "[Uu]sage: git gc" err ' test_expect_success 'gc -h with invalid configuration' ' @@ -52,7 +52,7 @@ test_expect_success 'gc -h with invalid configuration' ' echo "[gc] pruneexpire = CORRUPT" >>.git/config && test_expect_code 129 git gc -h >usage 2>&1 ) && - test_i18ngrep "[Uu]sage" broken/usage + test_grep "[Uu]sage" broken/usage ' test_expect_success 'gc is not aborted due to a stale symref' ' @@ -155,7 +155,7 @@ test_expect_success 'auto gc with too many loose objects does not attempt to cre test_commit "$(test_oid obj4)" && git gc --auto 2>err && - test_i18ngrep ! "^warning:" err && + test_grep ! "^warning:" err && ls .git/objects/pack/pack-*.pack | sort >post_packs && comm -1 -3 existing_packs post_packs >new && comm -2 -3 existing_packs post_packs >del && @@ -166,15 +166,15 @@ test_expect_success 'auto gc with too many loose objects does not attempt to cre test_expect_success 'gc --no-quiet' ' GIT_PROGRESS_DELAY=0 git -c gc.writeCommitGraph=true gc --no-quiet >stdout 2>stderr && test_must_be_empty stdout && - test_i18ngrep "Computing commit graph generation numbers" stderr + test_grep "Computing commit graph generation numbers" stderr ' test_expect_success TTY 'with TTY: gc --no-quiet' ' test_terminal env GIT_PROGRESS_DELAY=0 \ git -c gc.writeCommitGraph=true gc --no-quiet >stdout 2>stderr && test_must_be_empty stdout && - test_i18ngrep "Enumerating objects" stderr && - test_i18ngrep "Computing commit graph generation numbers" stderr + test_grep "Enumerating objects" stderr && + test_grep "Computing commit graph generation numbers" stderr ' test_expect_success 'gc --quiet' ' @@ -202,6 +202,30 @@ test_expect_success 'one of gc.reflogExpire{Unreachable,}=never does not skip "e grep -E "^trace: (built-in|exec|run_command): git reflog expire --" trace.out ' +test_expect_success 'gc.repackFilter launches repack with a filter' ' + git clone --no-local --bare . bare.git && + + git -C bare.git -c gc.cruftPacks=false gc && + test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack && + + GIT_TRACE=$(pwd)/trace.out git -C bare.git -c gc.repackFilter=blob:none \ + -c repack.writeBitmaps=false -c gc.cruftPacks=false gc && + test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack && + grep -E "^trace: (built-in|exec|run_command): git repack .* --filter=blob:none ?.*" trace.out +' + +test_expect_success 'gc.repackFilterTo store filtered out objects' ' + test_when_finished "rm -rf bare.git filtered.git" && + + git init --bare filtered.git && + git -C bare.git -c gc.repackFilter=blob:none \ + -c gc.repackFilterTo=../filtered.git/objects/pack/pack \ + -c repack.writeBitmaps=false -c gc.cruftPacks=false gc && + + test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack && + test_stdout_line_count = 1 ls filtered.git/objects/pack/*.pack +' + prepare_cruft_history () { test_commit base && @@ -303,6 +327,33 @@ test_expect_success 'gc.bigPackThreshold ignores cruft packs' ' ) ' +cruft_max_size_opts="git repack -d -l --cruft --cruft-expiration=2.weeks.ago" + +test_expect_success 'setup for --max-cruft-size tests' ' + git init cruft--max-size && + ( + cd cruft--max-size && + prepare_cruft_history + ) +' + +test_expect_success '--max-cruft-size sets appropriate repack options' ' + GIT_TRACE2_EVENT=$(pwd)/trace2.txt git -C cruft--max-size \ + gc --cruft --max-cruft-size=1M && + test_subcommand $cruft_max_size_opts --max-cruft-size=1048576 <trace2.txt +' + +test_expect_success 'gc.maxCruftSize sets appropriate repack options' ' + GIT_TRACE2_EVENT=$(pwd)/trace2.txt \ + git -C cruft--max-size -c gc.maxCruftSize=2M gc --cruft && + test_subcommand $cruft_max_size_opts --max-cruft-size=2097152 <trace2.txt && + + GIT_TRACE2_EVENT=$(pwd)/trace2.txt \ + git -C cruft--max-size -c gc.maxCruftSize=2M gc --cruft \ + --max-cruft-size=3M && + test_subcommand $cruft_max_size_opts --max-cruft-size=3145728 <trace2.txt +' + run_and_wait_for_auto_gc () { # We read stdout from gc for the side effect of waiting until the # background gc process exits, closing its fd 9. Furthermore, the @@ -321,7 +372,7 @@ test_expect_success 'background auto gc does not run if gc.log is present and re test_config gc.autodetach true && echo fleem >.git/gc.log && git gc --auto 2>err && - test_i18ngrep "^warning:" err && + test_grep "^warning:" err && test_config gc.logexpiry 5.days && test-tool chmtime =-345600 .git/gc.log && git gc --auto && diff --git a/t/t6700-tree-depth.sh b/t/t6700-tree-depth.sh new file mode 100755 index 0000000000..9e70a7c763 --- /dev/null +++ b/t/t6700-tree-depth.sh @@ -0,0 +1,95 @@ +#!/bin/sh + +test_description='handling of deep trees in various commands' + +TEST_PASSES_SANITIZE_LEAK=true +. ./test-lib.sh + +# We'll test against two depths here: a small one that will let us check the +# behavior of the config setting easily, and a large one that should be +# forbidden by default. Testing the default depth will let us know whether our +# default is enough to prevent segfaults on systems that run the tests. +small_depth=50 +big_depth=4100 + +small_ok="-c core.maxtreedepth=$small_depth" +small_no="-c core.maxtreedepth=$((small_depth-1))" + +# usage: mkdeep <name> <depth> +# Create a tag <name> containing a file whose path has depth <depth>. +# +# We'll use fast-import here for two reasons: +# +# 1. It's faster than creating $big_depth tree objects. +# +# 2. As we tighten tree limits, it's more likely to allow large sizes +# than trying to stuff a deep path into the index. +mkdeep () { + { + echo "commit refs/tags/$1" && + echo "committer foo <foo@example.com> 1234 -0000" && + echo "data <<EOF" && + echo "the commit message" && + echo "EOF" && + + printf 'M 100644 inline ' && + i=0 && + while test $i -lt $2 + do + printf 'a/' + i=$((i+1)) + done && + echo "file" && + + echo "data <<EOF" && + echo "the file contents" && + echo "EOF" && + echo + } | git fast-import +} + +test_expect_success 'create small tree' ' + mkdeep small $small_depth +' + +test_expect_success 'create big tree' ' + mkdeep big $big_depth +' + +test_expect_success 'limit recursion of git-archive' ' + git $small_ok archive small >/dev/null && + test_must_fail git $small_no archive small >/dev/null +' + +test_expect_success 'default limit for git-archive fails gracefully' ' + test_must_fail git archive big >/dev/null +' + +test_expect_success 'limit recursion of ls-tree -r' ' + git $small_ok ls-tree -r small && + test_must_fail git $small_no ls-tree -r small +' + +test_expect_success 'default limit for ls-tree fails gracefully' ' + test_must_fail git ls-tree -r big >/dev/null +' + +test_expect_success 'limit recursion of rev-list --objects' ' + git $small_ok rev-list --objects small >/dev/null && + test_must_fail git $small_no rev-list --objects small >/dev/null +' + +test_expect_success 'default limit for rev-list fails gracefully' ' + test_must_fail git rev-list --objects big >/dev/null +' + +test_expect_success 'limit recursion of diff-tree -r' ' + git $small_ok diff-tree -r $EMPTY_TREE small && + test_must_fail git $small_no diff-tree -r $EMPTY_TREE small +' + +test_expect_success 'default limit for diff-tree fails gracefully' ' + test_must_fail git diff-tree -r $EMPTY_TREE big +' + +test_done diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh index f136ea76f7..879a6dce60 100755 --- a/t/t7001-mv.sh +++ b/t/t7001-mv.sh @@ -296,7 +296,7 @@ test_expect_success 'git mv error on conflicted file' ' EOF test_must_fail git mv conflict newname 2>actual && - test_i18ngrep "conflicted" actual + test_grep "conflicted" actual ' test_expect_success 'git mv should overwrite symlink to a file' ' @@ -482,7 +482,7 @@ test_expect_success 'checking out a commit before submodule moved needs manual u git mv sub sub2 && git commit -m "moved sub to sub2" && git checkout -q HEAD^ 2>actual && - test_i18ngrep "^warning: unable to rmdir '\''sub2'\'':" actual && + test_grep "^warning: unable to rmdir '\''sub2'\'':" actual && git status -s sub2 >actual && echo "?? sub2/" >expected && test_cmp expected actual && diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh index 4287863ae6..62d9f846ce 100755 --- a/t/t7102-reset.sh +++ b/t/t7102-reset.sh @@ -616,4 +616,12 @@ test_expect_success 'reset --mixed sets up work tree' ' test_must_be_empty actual ' +test_expect_success 'reset handles --end-of-options' ' + git update-ref refs/heads/--foo HEAD^ && + git log -1 --format=%s refs/heads/--foo >expect && + git reset --hard --end-of-options --foo && + git log -1 --format=%s HEAD >actual && + test_cmp expect actual +' + test_done diff --git a/t/t7105-reset-patch.sh b/t/t7105-reset-patch.sh index 9b46da7aaa..05079c7246 100755 --- a/t/t7105-reset-patch.sh +++ b/t/t7105-reset-patch.sh @@ -30,21 +30,21 @@ test_expect_success PERL 'git reset -p' ' test_write_lines n y | git reset -p >output && verify_state dir/foo work head && verify_saved_state bar && - test_i18ngrep "Unstage" output + test_grep "Unstage" output ' test_expect_success PERL 'git reset -p HEAD^' ' test_write_lines n y | git reset -p HEAD^ >output && verify_state dir/foo work parent && verify_saved_state bar && - test_i18ngrep "Apply" output + test_grep "Apply" output ' test_expect_success PERL 'git reset -p HEAD^^{tree}' ' test_write_lines n y | git reset -p HEAD^^{tree} >output && verify_state dir/foo work parent && verify_saved_state bar && - test_i18ngrep "Apply" output + test_grep "Apply" output ' test_expect_success PERL 'git reset -p HEAD^:dir/foo (blob fails)' ' diff --git a/t/t7106-reset-unborn-branch.sh b/t/t7106-reset-unborn-branch.sh index a0b67a0b84..d20e5709f9 100755 --- a/t/t7106-reset-unborn-branch.sh +++ b/t/t7106-reset-unborn-branch.sh @@ -42,7 +42,7 @@ test_expect_success PERL 'reset -p' ' git ls-files >actual && test_must_be_empty actual && - test_i18ngrep "Unstage" output + test_grep "Unstage" output ' test_expect_success 'reset --soft is a no-op' ' diff --git a/t/t7107-reset-pathspec-file.sh b/t/t7107-reset-pathspec-file.sh index af5ea406db..020db201d5 100755 --- a/t/t7107-reset-pathspec-file.sh +++ b/t/t7107-reset-pathspec-file.sh @@ -161,19 +161,19 @@ test_expect_success 'error conditions' ' git rm fileA.t && test_must_fail git reset --pathspec-from-file=list --patch 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--patch. cannot be used together" err && test_must_fail git reset --pathspec-from-file=list -- fileA.t 2>err && - test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && + test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && test_must_fail git reset --pathspec-file-nul 2>err && - test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && + test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && test_must_fail git reset --soft --pathspec-from-file=list 2>err && - test_i18ngrep -e "fatal: Cannot do soft reset with paths" err && + test_grep -e "fatal: Cannot do soft reset with paths" err && test_must_fail git reset --hard --pathspec-from-file=list 2>err && - test_i18ngrep -e "fatal: Cannot do hard reset with paths" err + test_grep -e "fatal: Cannot do hard reset with paths" err ' test_done diff --git a/t/t7110-reset-merge.sh b/t/t7110-reset-merge.sh index 772480a345..7ee180f81d 100755 --- a/t/t7110-reset-merge.sh +++ b/t/t7110-reset-merge.sh @@ -238,7 +238,7 @@ test_expect_success '"reset --keep HEAD^" fails with pending merge' ' git reset --hard third && test_must_fail git merge branch1 && test_must_fail git reset --keep HEAD^ 2>err.log && - test_i18ngrep "middle of a merge" err.log + test_grep "middle of a merge" err.log ' # The next test will test the following: @@ -264,7 +264,7 @@ test_expect_success '"reset --keep HEAD" fails with pending merge' ' git reset --hard third && test_must_fail git merge branch1 && test_must_fail git reset --keep HEAD 2>err.log && - test_i18ngrep "middle of a merge" err.log + test_grep "middle of a merge" err.log ' test_expect_success '--merge is ok with added/deleted merge' ' @@ -290,7 +290,7 @@ test_expect_success '--keep fails with added/deleted merge' ' git diff --exit-code file3 && git diff --exit-code branch3 file3 && test_must_fail git reset --keep HEAD 2>err.log && - test_i18ngrep "middle of a merge" err.log + test_grep "middle of a merge" err.log ' test_done diff --git a/t/t7201-co.sh b/t/t7201-co.sh index 35b9e6ed6b..10cc6c4605 100755 --- a/t/t7201-co.sh +++ b/t/t7201-co.sh @@ -217,7 +217,7 @@ test_expect_success 'switch to another branch while carrying a deletion' ' git rm two && test_must_fail git checkout simple 2>errs && - test_i18ngrep overwritten errs && + test_grep overwritten errs && test_must_fail git read-tree --quiet -m -u HEAD simple 2>errs && test_must_be_empty errs @@ -229,7 +229,7 @@ test_expect_success 'checkout to detach HEAD (with advice declined)' ' git checkout -f renamer && git clean -f && git checkout renamer^ 2>messages && - test_i18ngrep "HEAD is now at $rev" messages && + test_grep "HEAD is now at $rev" messages && test_line_count = 1 messages && H=$(git rev-parse --verify HEAD) && M=$(git show-ref -s --verify refs/heads/main) && @@ -497,6 +497,11 @@ test_expect_success 'checkout unmerged stage' ' test ztheirside = "z$(cat file)" ' +test_expect_success 'checkout path with --merge from tree-ish is a no-no' ' + setup_conflicting_index && + test_must_fail git checkout -m HEAD -- file +' + test_expect_success 'checkout with --merge' ' setup_conflicting_index && echo "none of the above" >sample && @@ -517,6 +522,48 @@ test_expect_success 'checkout with --merge' ' test_cmp merged file ' +test_expect_success 'checkout -m works after (mistaken) resolution' ' + setup_conflicting_index && + echo "none of the above" >sample && + cat sample >fild && + cat sample >file && + cat sample >filf && + # resolve to something + git add file && + git checkout --merge -- fild file filf && + { + echo "<<<<<<< ours" && + echo ourside && + echo "=======" && + echo theirside && + echo ">>>>>>> theirs" + } >merged && + test_cmp expect fild && + test_cmp expect filf && + test_cmp merged file +' + +test_expect_success 'checkout -m works after (mistaken) resolution to remove' ' + setup_conflicting_index && + echo "none of the above" >sample && + cat sample >fild && + cat sample >file && + cat sample >filf && + # resolve to remove + git rm file && + git checkout --merge -- fild file filf && + { + echo "<<<<<<< ours" && + echo ourside && + echo "=======" && + echo theirside && + echo ">>>>>>> theirs" + } >merged && + test_cmp expect fild && + test_cmp expect filf && + test_cmp merged file +' + test_expect_success 'checkout with --merge, in diff3 -m style' ' git config merge.conflictstyle diff3 && setup_conflicting_index && diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh index 50de052b82..e610610414 100755 --- a/t/t7300-clean.sh +++ b/t/t7300-clean.sh @@ -735,7 +735,7 @@ test_expect_success MINGW 'handle clean & core.longpaths = false nicely' ' test_must_fail git clean -xdf 2>.git/err && # grepping for a strerror string is unportable but it is OK here with # MINGW prereq - test_i18ngrep -e "too long" -e "No such file or directory" .git/err + test_grep -e "too long" -e "No such file or directory" .git/err ' test_expect_success 'clean untracked paths by pathspec' ' diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index 9918584464..7223c8f74f 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -60,7 +60,7 @@ test_expect_success 'submodule init aborts on missing .gitmodules file' ' git update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub && # missing the .gitmodules file here test_must_fail git submodule init 2>actual && - test_i18ngrep "No url found for submodule path" actual + test_grep "No url found for submodule path" actual ' test_expect_success 'submodule update aborts on missing .gitmodules file' ' @@ -68,7 +68,7 @@ test_expect_success 'submodule update aborts on missing .gitmodules file' ' git update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub && # missing the .gitmodules file here git submodule update sub 2>actual && - test_i18ngrep "Submodule path .sub. not initialized" actual + test_grep "Submodule path .sub. not initialized" actual ' test_expect_success 'submodule update aborts on missing gitmodules url' ' @@ -100,7 +100,7 @@ test_expect_success 'status should ignore inner git repo when not added' ' ) && test_must_fail git submodule status inner 2>output.err && rm -fr inner && - test_i18ngrep "^error: .*did not match any file(s) known to git" output.err + test_grep "^error: .*did not match any file(s) known to git" output.err ' test_expect_success 'setup - repository in init subdirectory' ' @@ -196,7 +196,7 @@ test_expect_success 'redirected submodule add does not show progress' ' git -C addtest submodule add "file://$submodurl/parent" submod-redirected \ 2>err && ! grep % err && - test_i18ngrep ! "Checking connectivity" err + test_grep ! "Checking connectivity" err ' test_expect_success 'redirected submodule add --progress does show progress' ' @@ -263,7 +263,7 @@ test_expect_success 'submodule add relays add --dry-run stderr' ' cd addtest && : >.git/index.lock && ! git submodule add "$submodurl" sub-while-locked 2>output.err && - test_i18ngrep "^fatal: .*index\.lock" output.err && + test_grep "^fatal: .*index\.lock" output.err && test_path_is_missing sub-while-locked ) ' @@ -405,7 +405,7 @@ test_expect_success 'submodule add in subdirectory with relative path should fai cd addtest/sub && test_must_fail git submodule add ../../ submod3 2>../../output.err ) && - test_i18ngrep toplevel output.err + test_grep toplevel output.err ' test_expect_success 'setup - add an example entry to .gitmodules' ' @@ -486,7 +486,7 @@ test_expect_success 'status should still be "missing" after initializing' ' test_failure_with_unknown_submodule () { test_must_fail git submodule $1 no-such-submodule 2>output.err && - test_i18ngrep "^error: .*no-such-submodule" output.err + test_grep "^error: .*no-such-submodule" output.err } test_expect_success 'init should fail with unknown submodule' ' @@ -644,7 +644,7 @@ test_expect_success 'update --init' ' test_must_fail git config submodule.example.url && git submodule update init 2> update.out && - test_i18ngrep "not initialized" update.out && + test_grep "not initialized" update.out && test_must_fail git rev-parse --resolve-git-dir init/.git && git submodule update --init init && @@ -661,7 +661,7 @@ test_expect_success 'update --init from subdirectory' ' ( cd sub && git submodule update ../init 2>update.out && - test_i18ngrep "not initialized" update.out && + test_grep "not initialized" update.out && test_must_fail git rev-parse --resolve-git-dir ../init/.git && git submodule update --init ../init @@ -1121,7 +1121,7 @@ test_expect_success 'submodule deinit from subdirectory' ' cd sub && git submodule deinit ../init >../output ) && - test_i18ngrep "\\.\\./init" output && + test_grep "\\.\\./init" output && test -z "$(git config --get-regexp "submodule\.example\.")" && test -n "$(git config --get-regexp "submodule\.example2\.")" && test -f example2/.git && @@ -1136,8 +1136,8 @@ test_expect_success 'submodule deinit . deinits all initialized submodules' ' git submodule deinit . >actual && test -z "$(git config --get-regexp "submodule\.example\.")" && test -z "$(git config --get-regexp "submodule\.example2\.")" && - test_i18ngrep "Cleared directory .init" actual && - test_i18ngrep "Cleared directory .example2" actual && + test_grep "Cleared directory .init" actual && + test_grep "Cleared directory .example2" actual && rmdir init example2 ' @@ -1149,8 +1149,8 @@ test_expect_success 'submodule deinit --all deinits all initialized submodules' git submodule deinit --all >actual && test -z "$(git config --get-regexp "submodule\.example\.")" && test -z "$(git config --get-regexp "submodule\.example2\.")" && - test_i18ngrep "Cleared directory .init" actual && - test_i18ngrep "Cleared directory .example2" actual && + test_grep "Cleared directory .init" actual && + test_grep "Cleared directory .example2" actual && rmdir init example2 ' @@ -1160,8 +1160,8 @@ test_expect_success 'submodule deinit deinits a submodule when its work tree is git submodule deinit init example2 >actual && test -z "$(git config --get-regexp "submodule\.example\.")" && test -z "$(git config --get-regexp "submodule\.example2\.")" && - test_i18ngrep ! "Cleared directory .init" actual && - test_i18ngrep "Cleared directory .example2" actual && + test_grep ! "Cleared directory .init" actual && + test_grep "Cleared directory .example2" actual && rmdir init ' @@ -1173,7 +1173,7 @@ test_expect_success 'submodule deinit fails when the submodule contains modifica test -f example2/.git && git submodule deinit -f init >actual && test -z "$(git config --get-regexp "submodule\.example\.")" && - test_i18ngrep "Cleared directory .init" actual && + test_grep "Cleared directory .init" actual && rmdir init ' @@ -1185,7 +1185,7 @@ test_expect_success 'submodule deinit fails when the submodule contains untracke test -f example2/.git && git submodule deinit -f init >actual && test -z "$(git config --get-regexp "submodule\.example\.")" && - test_i18ngrep "Cleared directory .init" actual && + test_grep "Cleared directory .init" actual && rmdir init ' @@ -1200,30 +1200,30 @@ test_expect_success 'submodule deinit fails when the submodule HEAD does not mat test -f example2/.git && git submodule deinit -f init >actual && test -z "$(git config --get-regexp "submodule\.example\.")" && - test_i18ngrep "Cleared directory .init" actual && + test_grep "Cleared directory .init" actual && rmdir init ' test_expect_success 'submodule deinit is silent when used on an uninitialized submodule' ' git submodule update --init && git submodule deinit init >actual && - test_i18ngrep "Submodule .example. (.*) unregistered for path .init" actual && - test_i18ngrep "Cleared directory .init" actual && + test_grep "Submodule .example. (.*) unregistered for path .init" actual && + test_grep "Cleared directory .init" actual && git submodule deinit init >actual && - test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual && - test_i18ngrep "Cleared directory .init" actual && + test_grep ! "Submodule .example. (.*) unregistered for path .init" actual && + test_grep "Cleared directory .init" actual && git submodule deinit . >actual && - test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual && - test_i18ngrep "Submodule .example2. (.*) unregistered for path .example2" actual && - test_i18ngrep "Cleared directory .init" actual && + test_grep ! "Submodule .example. (.*) unregistered for path .init" actual && + test_grep "Submodule .example2. (.*) unregistered for path .example2" actual && + test_grep "Cleared directory .init" actual && git submodule deinit . >actual && - test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual && - test_i18ngrep ! "Submodule .example2. (.*) unregistered for path .example2" actual && - test_i18ngrep "Cleared directory .init" actual && + test_grep ! "Submodule .example. (.*) unregistered for path .init" actual && + test_grep ! "Submodule .example2. (.*) unregistered for path .example2" actual && + test_grep "Cleared directory .init" actual && git submodule deinit --all >actual && - test_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual && - test_i18ngrep ! "Submodule .example2. (.*) unregistered for path .example2" actual && - test_i18ngrep "Cleared directory .init" actual && + test_grep ! "Submodule .example. (.*) unregistered for path .init" actual && + test_grep ! "Submodule .example2. (.*) unregistered for path .example2" actual && + test_grep "Cleared directory .init" actual && rmdir init example2 ' @@ -1472,13 +1472,13 @@ test_expect_success '`submodule init` and `init.templateDir`' ' test_must_fail git submodule \ add "$submodurl" sub-global 2>err && git config --global --unset init.templateDir && - grep HOOK-RUN err && + test_grep HOOK-RUN err && test_path_is_file sub-global/hook.run && git config init.templateDir "$(pwd)/tmpl" && git submodule add "$submodurl" sub-local 2>err && git config --unset init.templateDir && - ! grep HOOK-RUN err && + test_grep ! HOOK-RUN err && test_path_is_missing sub-local/hook.run ) ' diff --git a/t/t7403-submodule-sync.sh b/t/t7403-submodule-sync.sh index ff09443a0a..19b6135d11 100755 --- a/t/t7403-submodule-sync.sh +++ b/t/t7403-submodule-sync.sh @@ -163,7 +163,7 @@ test_expect_success '"git submodule sync" should update submodule URLs - subdire cd sub && git submodule sync >../../output ) && - test_i18ngrep "\\.\\./submodule" output && + test_grep "\\.\\./submodule" output && test -d "$( cd super-clone/submodule && git config remote.origin.url @@ -194,7 +194,7 @@ test_expect_success '"git submodule sync --recursive" should update all submodul cd sub && git submodule sync --recursive >../../output ) && - test_i18ngrep "\\.\\./submodule/sub-submodule" output && + test_grep "\\.\\./submodule/sub-submodule" output && test -d "$( cd super-clone/submodule && git config remote.origin.url diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index fb82f760c3..297c6c3b5c 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -945,7 +945,7 @@ test_expect_success 'submodule update places git-dir in superprojects git-dir re git clone super_update_r super_update_r2 && (cd super_update_r2 && git submodule update --init --recursive >actual && - test_i18ngrep "Submodule path .submodule/subsubmodule.: checked out" actual && + test_grep "Submodule path .submodule/subsubmodule.: checked out" actual && (cd submodule/subsubmodule && git log > ../../expected ) && @@ -1025,7 +1025,7 @@ test_expect_success 'submodule update clone shallow submodule outside of depth' # unadvertised objects, so restrict this test to v0. test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 \ git submodule update --init --depth=1 2>actual && - test_i18ngrep "Direct fetching of that commit failed." actual && + test_grep "Direct fetching of that commit failed." actual && git -C ../submodule config uploadpack.allowReachableSHA1InWant true && git submodule update --init --depth=1 >actual && git -C submodule log --oneline >out && @@ -1039,7 +1039,7 @@ test_expect_success 'submodule update --recursive drops module name before recur git checkout HEAD^ ) && git submodule update --recursive deeper/submodule >actual && - test_i18ngrep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual + test_grep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual ) ' @@ -1246,7 +1246,7 @@ test_expect_success CASE_INSENSITIVE_FS,SYMLINKS \ test_path_is_missing "$tell_tale_path" && git clone --recursive captain hooked 2>err && - ! grep HOOK-RUN err && + test_grep ! HOOK-RUN err && test_path_is_missing "$tell_tale_path" ' diff --git a/t/t7411-submodule-config.sh b/t/t7411-submodule-config.sh index c0167944ab..31271f8e0a 100755 --- a/t/t7411-submodule-config.sh +++ b/t/t7411-submodule-config.sh @@ -45,7 +45,7 @@ test_expect_success 'configuration parsing with error' ' ( cd repo && test_must_fail test-tool submodule-config "" s 2>actual && - test_i18ngrep "bad config" actual + test_grep "bad config" actual ) ' @@ -101,7 +101,7 @@ test_expect_success 'error in history of one submodule config lets continue, std >actual \ 2>actual_stderr && test_cmp expect_error actual && - test_i18ngrep "submodule-blob $sha1:.gitmodules" actual_stderr >/dev/null + test_grep "submodule-blob $sha1:.gitmodules" actual_stderr >/dev/null ) ' diff --git a/t/t7414-submodule-mistakes.sh b/t/t7414-submodule-mistakes.sh index 101afff30f..24f30e3bf9 100755 --- a/t/t7414-submodule-mistakes.sh +++ b/t/t7414-submodule-mistakes.sh @@ -13,13 +13,13 @@ test_expect_success 'create embedded repository' ' test_expect_success 'git-add on embedded repository warns' ' test_when_finished "git rm --cached -f embed" && git add embed 2>stderr && - test_i18ngrep warning stderr + test_grep warning stderr ' test_expect_success '--no-warn-embedded-repo suppresses warning' ' test_when_finished "git rm --cached -f embed" && git add --no-warn-embedded-repo embed 2>stderr && - test_i18ngrep ! warning stderr + test_grep ! warning stderr ' test_expect_success 'no warning when updating entry' ' @@ -27,14 +27,14 @@ test_expect_success 'no warning when updating entry' ' git add embed && git -C embed commit --allow-empty -m two && git add embed 2>stderr && - test_i18ngrep ! warning stderr + test_grep ! warning stderr ' test_expect_success 'submodule add does not warn' ' test_when_finished "git rm -rf submodule .gitmodules" && git -c protocol.file.allow=always \ submodule add ./embed submodule 2>stderr && - test_i18ngrep ! warning stderr + test_grep ! warning stderr ' test_done diff --git a/t/t7416-submodule-dash-url.sh b/t/t7416-submodule-dash-url.sh index 7cf72b9a07..2ab566e717 100755 --- a/t/t7416-submodule-dash-url.sh +++ b/t/t7416-submodule-dash-url.sh @@ -41,7 +41,7 @@ test_expect_success 'remove ./ protection from .gitmodules url' ' test_expect_success 'clone rejects unprotected dash' ' test_when_finished "rm -rf dst" && test_must_fail git clone --recurse-submodules . dst 2>err && - test_i18ngrep ignoring err + test_grep ignoring err ' test_expect_success 'fsck rejects unprotected dash' ' @@ -63,7 +63,7 @@ test_expect_success 'trailing backslash is handled correctly' ' mv .new .gitmodules && git commit -am "Add testmodule" && test_must_fail git clone --verbose --recurse-submodules . dolly 2>err && - test_i18ngrep ! "unknown option" err + test_grep ! "unknown option" err ' test_expect_success 'fsck rejects missing URL scheme' ' diff --git a/t/t7417-submodule-path-url.sh b/t/t7417-submodule-path-url.sh index 2f4b25dfd7..5e3051da8b 100755 --- a/t/t7417-submodule-path-url.sh +++ b/t/t7417-submodule-path-url.sh @@ -21,7 +21,7 @@ test_expect_success 'create submodule with dash in path' ' test_expect_success 'clone rejects unprotected dash' ' test_when_finished "rm -rf dst" && git clone --recurse-submodules . dst 2>err && - test_i18ngrep ignoring err + test_grep ignoring err ' test_expect_success 'fsck rejects unprotected dash' ' @@ -46,7 +46,7 @@ test_expect_success MINGW 'submodule paths disallows trailing spaces' ' git -C super update-ref refs/heads/main $commit && test_must_fail git clone --recurse-submodules super dst 2>err && - test_i18ngrep "sub " err + test_grep "sub " err ' test_done diff --git a/t/t7419-submodule-set-branch.sh b/t/t7419-submodule-set-branch.sh index 232065504c..a5d1bc5c54 100755 --- a/t/t7419-submodule-set-branch.sh +++ b/t/t7419-submodule-set-branch.sh @@ -11,6 +11,10 @@ as expected. TEST_PASSES_SANITIZE_LEAK=true TEST_NO_CREATE_REPO=1 + +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + . ./test-lib.sh test_expect_success 'setup' ' @@ -27,26 +31,28 @@ test_expect_success 'submodule config cache setup' ' git checkout -b topic && echo b >a && git add . && - git commit -mb + git commit -mb && + git checkout main ) && mkdir super && (cd super && git init && git submodule add ../submodule && - git commit -m "add submodule" + git submodule add --name thename ../submodule thepath && + git commit -m "add submodules" ) ' test_expect_success 'ensure submodule branch is unset' ' (cd super && - ! grep branch .gitmodules + test_cmp_config "" -f .gitmodules --default "" submodule.submodule.branch ) ' test_expect_success 'test submodule set-branch --branch' ' (cd super && git submodule set-branch --branch topic submodule && - grep "branch = topic" .gitmodules && + test_cmp_config topic -f .gitmodules submodule.submodule.branch && git submodule update --remote && cat <<-\EOF >expect && b @@ -57,13 +63,12 @@ test_expect_success 'test submodule set-branch --branch' ' ' test_expect_success 'test submodule set-branch --default' ' - test_commit -C submodule c && (cd super && git submodule set-branch --default submodule && - ! grep branch .gitmodules && + test_cmp_config "" -f .gitmodules --default "" submodule.submodule.branch && git submodule update --remote && cat <<-\EOF >expect && - c + a EOF git -C submodule show -s --pretty=%s >actual && test_cmp expect actual @@ -71,10 +76,9 @@ test_expect_success 'test submodule set-branch --default' ' ' test_expect_success 'test submodule set-branch -b' ' - test_commit -C submodule b && (cd super && git submodule set-branch -b topic submodule && - grep "branch = topic" .gitmodules && + test_cmp_config topic -f .gitmodules submodule.submodule.branch && git submodule update --remote && cat <<-\EOF >expect && b @@ -85,17 +89,43 @@ test_expect_success 'test submodule set-branch -b' ' ' test_expect_success 'test submodule set-branch -d' ' - test_commit -C submodule d && (cd super && git submodule set-branch -d submodule && - ! grep branch .gitmodules && + test_cmp_config "" -f .gitmodules --default "" submodule.submodule.branch && git submodule update --remote && cat <<-\EOF >expect && - d + a EOF git -C submodule show -s --pretty=%s >actual && test_cmp expect actual ) ' +test_expect_success 'test submodule set-branch --branch with named submodule' ' + (cd super && + git submodule set-branch --branch topic thepath && + test_cmp_config topic -f .gitmodules submodule.thename.branch && + test_cmp_config "" -f .gitmodules --default "" submodule.thepath.branch && + git submodule update --remote && + cat <<-\EOF >expect && + b + EOF + git -C thepath show -s --pretty=%s >actual && + test_cmp expect actual + ) +' + +test_expect_success 'test submodule set-branch --default with named submodule' ' + (cd super && + git submodule set-branch --default thepath && + test_cmp_config "" -f .gitmodules --default "" submodule.thename.branch && + git submodule update --remote && + cat <<-\EOF >expect && + a + EOF + git -C thepath show -s --pretty=%s >actual && + test_cmp expect actual + ) +' + test_done diff --git a/t/t7420-submodule-set-url.sh b/t/t7420-submodule-set-url.sh index d6bf62b3ac..bf7f15ee79 100755 --- a/t/t7420-submodule-set-url.sh +++ b/t/t7420-submodule-set-url.sh @@ -25,17 +25,26 @@ test_expect_success 'submodule config cache setup' ' git add file && git commit -ma ) && + mkdir namedsubmodule && + ( + cd namedsubmodule && + git init && + echo 1 >file && + git add file && + git commit -m1 + ) && mkdir super && ( cd super && git init && git submodule add ../submodule && - git commit -m "add submodule" + git submodule add --name thename ../namedsubmodule thepath && + git commit -m "add submodules" ) ' test_expect_success 'test submodule set-url' ' - # add a commit and move the submodule (change the url) + # add commits and move the submodules (change the urls) ( cd submodule && echo b >>file && @@ -44,15 +53,28 @@ test_expect_success 'test submodule set-url' ' ) && mv submodule newsubmodule && + ( + cd namedsubmodule && + echo 2 >>file && + git add file && + git commit -m2 + ) && + mv namedsubmodule newnamedsubmodule && + git -C newsubmodule show >expect && + git -C newnamedsubmodule show >>expect && ( cd super && test_must_fail git submodule update --remote && git submodule set-url submodule ../newsubmodule && - grep -F "url = ../newsubmodule" .gitmodules && + test_cmp_config ../newsubmodule -f .gitmodules submodule.submodule.url && + git submodule set-url thepath ../newnamedsubmodule && + test_cmp_config ../newnamedsubmodule -f .gitmodules submodule.thename.url && + test_cmp_config "" -f .gitmodules --default "" submodule.thepath.url && git submodule update --remote ) && git -C super/submodule show >actual && + git -C super/thepath show >>actual && test_cmp expect actual ' diff --git a/t/t7450-bad-git-dotfiles.sh b/t/t7450-bad-git-dotfiles.sh index 60d627583d..5b845e899b 100755 --- a/t/t7450-bad-git-dotfiles.sh +++ b/t/t7450-bad-git-dotfiles.sh @@ -238,7 +238,7 @@ test_expect_success 'fsck detects non-blob .gitmodules' ' git ls-tree HEAD | sed s/subdir/.gitmodules/ | git mktree && test_must_fail git fsck 2>output && - test_i18ngrep gitmodulesBlob output + test_grep gitmodulesBlob output ) ' @@ -252,8 +252,8 @@ test_expect_success 'fsck detects corrupt .gitmodules' ' git commit -m "broken gitmodules" && git fsck 2>output && - test_i18ngrep gitmodulesParse output && - test_i18ngrep ! "bad config" output + test_grep gitmodulesParse output && + test_grep ! "bad config" output ) ' @@ -275,7 +275,7 @@ test_expect_success WINDOWS 'prevent git~1 squatting on Windows' ' hash="$(echo x | git hash-object -w --stdin)" && test_must_fail git update-index --add \ --cacheinfo 160000,$rev,d\\a 2>err && - test_i18ngrep "Invalid path" err && + test_grep "Invalid path" err && git -c core.protectNTFS=false update-index --add \ --cacheinfo 100644,$modules,.gitmodules \ --cacheinfo 160000,$rev,c \ @@ -289,7 +289,7 @@ test_expect_success WINDOWS 'prevent git~1 squatting on Windows' ' then test_must_fail git -c core.protectNTFS=false \ clone --recurse-submodules squatting squatting-clone 2>err && - test_i18ngrep -e "directory not empty" -e "not an empty directory" err && + test_grep -e "directory not empty" -e "not an empty directory" err && ! grep gitdir squatting-clone/d/a/git~2 fi ' @@ -317,7 +317,7 @@ test_expect_success 'setup submodules with nested git dirs' ' test_expect_success 'git dirs of sibling submodules must not be nested' ' test_must_fail git clone --recurse-submodules nested clone 2>err && - test_i18ngrep "is inside git dir" err + test_grep "is inside git dir" err ' test_expect_success 'submodule git dir nesting detection must work with parallel cloning' ' diff --git a/t/t7500-commit-template-squash-signoff.sh b/t/t7500-commit-template-squash-signoff.sh index 5fcaa0b4f2..4dca8d97a7 100755 --- a/t/t7500-commit-template-squash-signoff.sh +++ b/t/t7500-commit-template-squash-signoff.sh @@ -555,7 +555,7 @@ test_expect_success 'commit without staging files fails and displays hints' ' git commit -m initial && echo "changes" >>file && test_must_fail git commit -m update >actual && - test_i18ngrep "no changes added to commit (use \"git add\" and/or \"git commit -a\")" actual + test_grep "no changes added to commit (use \"git add\" and/or \"git commit -a\")" actual ' test_done diff --git a/t/t7501-commit-basic-functionality.sh b/t/t7501-commit-basic-functionality.sh index fb5417d5e7..3d8500a52e 100755 --- a/t/t7501-commit-basic-functionality.sh +++ b/t/t7501-commit-basic-functionality.sh @@ -21,7 +21,7 @@ test_expect_success 'initial status' ' echo bongo bongo >file && git add file && git status >actual && - test_i18ngrep "No commits yet" actual + test_grep "No commits yet" actual ' test_expect_success 'fail initial amend' ' @@ -141,7 +141,7 @@ test_expect_success 'template "emptyness" check does not kick in with -F' ' test_expect_success 'template "emptyness" check' ' git checkout HEAD file && echo >>file && git add file && test_must_fail git commit -t file 2>err && - test_i18ngrep "did not edit" err + test_grep "did not edit" err ' test_expect_success 'setup: commit message from file' ' @@ -671,7 +671,7 @@ test_expect_success 'commit a file whose name is a dash' ' git add ./- && test_tick && git commit -m "add dash" >output </dev/null && - test_i18ngrep " changed, 5 insertions" output + test_grep " changed, 5 insertions" output ' test_expect_success '--only works on to-be-born branch' ' diff --git a/t/t7502-commit-porcelain.sh b/t/t7502-commit-porcelain.sh index b5bf7de7cd..a87c211d0b 100755 --- a/t/t7502-commit-porcelain.sh +++ b/t/t7502-commit-porcelain.sh @@ -485,6 +485,24 @@ test_expect_success 'commit --trailer not confused by --- separator' ' test_cmp expected actual ' +test_expect_success 'commit --trailer with --verbose' ' + cat >msg <<-\EOF && + subject + + body + EOF + GIT_EDITOR=: git commit --edit -F msg --allow-empty \ + --trailer="my-trailer: value" --verbose && + { + cat msg && + echo && + echo "my-trailer: value" + } >expected && + git cat-file commit HEAD >commit.msg && + sed -e "1,/^\$/d" commit.msg >actual && + test_cmp expected actual +' + test_expect_success 'multiple -m' ' >negative && @@ -706,14 +724,14 @@ test_expect_success 'cleanup commit message (whitespace config, -m)' ' test_expect_success 'message shows author when it is not equal to committer' ' echo >>negative && git commit -e -m "sample" -a && - test_i18ngrep \ + test_grep \ "^# Author: *A U Thor <author@example.com>\$" \ .git/COMMIT_EDITMSG ' test_expect_success 'message shows date when it is explicitly set' ' git commit --allow-empty -e -m foo --date="2010-01-02T03:04:05" && - test_i18ngrep \ + test_grep \ "^# Date: *Sat Jan 2 03:04:05 2010 +0000" \ .git/COMMIT_EDITMSG ' @@ -728,7 +746,7 @@ test_expect_success AUTOIDENT 'message shows committer when it is automatic' ' ) && # the ident is calculated from the system, so we cannot # check the actual value, only that it is there - test_i18ngrep "^# Committer: " .git/COMMIT_EDITMSG + test_grep "^# Committer: " .git/COMMIT_EDITMSG ' write_script .git/FAKE_EDITOR <<EOF @@ -860,9 +878,9 @@ try_commit () { GIT_EDITOR=.git/FAKE_EDITOR git commit -a $* $use_template && case "$use_template" in '') - test_i18ngrep ! "^## Custom template" .git/COMMIT_EDITMSG ;; + test_grep ! "^## Custom template" .git/COMMIT_EDITMSG ;; *) - test_i18ngrep "^## Custom template" .git/COMMIT_EDITMSG ;; + test_grep "^## Custom template" .git/COMMIT_EDITMSG ;; esac } @@ -870,53 +888,53 @@ try_commit_status_combo () { test_expect_success 'commit' ' try_commit "" && - test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG + test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'commit --status' ' try_commit --status && - test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG + test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'commit --no-status' ' try_commit --no-status && - test_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG + test_grep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'commit with commit.status = yes' ' test_config commit.status yes && try_commit "" && - test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG + test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'commit with commit.status = no' ' test_config commit.status no && try_commit "" && - test_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG + test_grep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'commit --status with commit.status = yes' ' test_config commit.status yes && try_commit --status && - test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG + test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'commit --no-status with commit.status = yes' ' test_config commit.status yes && try_commit --no-status && - test_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG + test_grep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'commit --status with commit.status = no' ' test_config commit.status no && try_commit --status && - test_i18ngrep "^# Changes to be committed:" .git/COMMIT_EDITMSG + test_grep "^# Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'commit --no-status with commit.status = no' ' test_config commit.status no && try_commit --no-status && - test_i18ngrep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG + test_grep ! "^# Changes to be committed:" .git/COMMIT_EDITMSG ' } @@ -930,13 +948,13 @@ try_commit_status_combo test_expect_success 'commit --status with custom comment character' ' test_config core.commentchar ";" && try_commit --status && - test_i18ngrep "^; Changes to be committed:" .git/COMMIT_EDITMSG + test_grep "^; Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'switch core.commentchar' ' test_commit "#foo" foo && GIT_EDITOR=.git/FAKE_EDITOR git -c core.commentChar=auto commit --amend && - test_i18ngrep "^; Changes to be committed:" .git/COMMIT_EDITMSG + test_grep "^; Changes to be committed:" .git/COMMIT_EDITMSG ' test_expect_success 'switch core.commentchar but out of options' ' diff --git a/t/t7506-status-submodule.sh b/t/t7506-status-submodule.sh index d050091345..46566d529e 100755 --- a/t/t7506-status-submodule.sh +++ b/t/t7506-status-submodule.sh @@ -37,19 +37,19 @@ test_expect_success 'setup' ' test_expect_success 'status clean' ' git status >output && - test_i18ngrep "nothing to commit" output + test_grep "nothing to commit" output ' test_expect_success 'commit --dry-run -a clean' ' test_must_fail git commit --dry-run -a >output && - test_i18ngrep "nothing to commit" output + test_grep "nothing to commit" output ' test_expect_success 'status with modified file in submodule' ' (cd sub && git reset --hard) && echo "changed" >sub/foo && git status >output && - test_i18ngrep "modified: sub (modified content)" output + test_grep "modified: sub (modified content)" output ' test_expect_success 'status with modified file in submodule (porcelain)' ' @@ -73,7 +73,7 @@ test_expect_success 'status with modified file in submodule (short)' ' test_expect_success 'status with added file in submodule' ' (cd sub && git reset --hard && echo >foo && git add foo) && git status >output && - test_i18ngrep "modified: sub (modified content)" output + test_grep "modified: sub (modified content)" output ' test_expect_success 'status with added file in submodule (porcelain)' ' @@ -96,12 +96,12 @@ test_expect_success 'status with untracked file in submodule' ' (cd sub && git reset --hard) && echo "content" >sub/new-file && git status >output && - test_i18ngrep "modified: sub (untracked content)" output + test_grep "modified: sub (untracked content)" output ' test_expect_success 'status -uno with untracked file in submodule' ' git status -uno >output && - test_i18ngrep "^nothing to commit" output + test_grep "^nothing to commit" output ' test_expect_success 'status with untracked file in submodule (porcelain)' ' @@ -122,7 +122,7 @@ test_expect_success 'status with added and untracked file in submodule' ' (cd sub && git reset --hard && echo >foo && git add foo) && echo "content" >sub/new-file && git status >output && - test_i18ngrep "modified: sub (modified content, untracked content)" output + test_grep "modified: sub (modified content, untracked content)" output ' test_expect_success 'status with added and untracked file in submodule (porcelain)' ' @@ -140,7 +140,7 @@ test_expect_success 'status with modified file in modified submodule' ' (cd sub && echo "next change" >foo && git commit -m "next change" foo) && echo "changed" >sub/foo && git status >output && - test_i18ngrep "modified: sub (new commits, modified content)" output + test_grep "modified: sub (new commits, modified content)" output ' test_expect_success 'status with modified file in modified submodule (porcelain)' ' @@ -155,7 +155,7 @@ test_expect_success 'status with modified file in modified submodule (porcelain) test_expect_success 'status with added file in modified submodule' ' (cd sub && git reset --hard && echo >foo && git add foo) && git status >output && - test_i18ngrep "modified: sub (new commits, modified content)" output + test_grep "modified: sub (new commits, modified content)" output ' test_expect_success 'status with added file in modified submodule (porcelain)' ' @@ -170,7 +170,7 @@ test_expect_success 'status with untracked file in modified submodule' ' (cd sub && git reset --hard) && echo "content" >sub/new-file && git status >output && - test_i18ngrep "modified: sub (new commits, untracked content)" output + test_grep "modified: sub (new commits, untracked content)" output ' test_expect_success 'status with untracked file in modified submodule (porcelain)' ' @@ -184,7 +184,7 @@ test_expect_success 'status with added and untracked file in modified submodule' (cd sub && git reset --hard && echo >foo && git add foo) && echo "content" >sub/new-file && git status >output && - test_i18ngrep "modified: sub (new commits, modified content, untracked content)" output + test_grep "modified: sub (new commits, modified content, untracked content)" output ' test_expect_success 'status with added and untracked file in modified submodule (porcelain)' ' @@ -209,7 +209,7 @@ test_expect_success 'setup .git file for sub' ' test_expect_success 'status with added file in modified submodule with .git file' ' (cd sub && git reset --hard && echo >foo && git add foo) && git status >output && - test_i18ngrep "modified: sub (new commits, modified content)" output + test_grep "modified: sub (new commits, modified content)" output ' test_expect_success 'status with a lot of untracked files in the submodule' ' @@ -234,12 +234,12 @@ test_expect_success 'rm submodule contents' ' test_expect_success 'status clean (empty submodule dir)' ' git status >output && - test_i18ngrep "nothing to commit" output + test_grep "nothing to commit" output ' test_expect_success 'status -a clean (empty submodule dir)' ' test_must_fail git commit --dry-run -a >output && - test_i18ngrep "nothing to commit" output + test_grep "nothing to commit" output ' cat >status_expect <<\EOF diff --git a/t/t7507-commit-verbose.sh b/t/t7507-commit-verbose.sh index 916470c48b..c3281b192e 100755 --- a/t/t7507-commit-verbose.sh +++ b/t/t7507-commit-verbose.sh @@ -89,7 +89,7 @@ test_expect_success 'submodule log is stripped out too with -v' ' export GIT_EDITOR && test_must_fail git commit -a -v 2>err ) && - test_i18ngrep "Aborting commit due to empty commit message." err + test_grep "Aborting commit due to empty commit message." err ' test_expect_success 'verbose diff is stripped out with set core.commentChar' ' @@ -98,7 +98,7 @@ test_expect_success 'verbose diff is stripped out with set core.commentChar' ' export GIT_EDITOR && test_must_fail git -c core.commentchar=";" commit -a -v 2>err ) && - test_i18ngrep "Aborting commit due to empty commit message." err + test_grep "Aborting commit due to empty commit message." err ' test_expect_success 'status does not verbose without --verbose' ' diff --git a/t/t7508-status.sh b/t/t7508-status.sh index 6928fd89f5..a3c18a4fc2 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -19,7 +19,7 @@ test_expect_success 'status -h in broken repository' ' echo "[status] showuntrackedfiles = CORRUPT" >>.git/config && test_expect_code 129 git status -h >usage 2>&1 ) && - test_i18ngrep "[Uu]sage" broken/usage + test_grep "[Uu]sage" broken/usage ' test_expect_success 'commit -h in broken repository' ' @@ -31,7 +31,7 @@ test_expect_success 'commit -h in broken repository' ' echo "[status] showuntrackedfiles = CORRUPT" >>.git/config && test_expect_code 129 git commit -h >usage 2>&1 ) && - test_i18ngrep "[Uu]sage" broken/usage + test_grep "[Uu]sage" broken/usage ' test_expect_success 'create upstream branch' ' @@ -72,7 +72,7 @@ test_expect_success 'setup' ' ' test_expect_success 'status (1)' ' - test_i18ngrep "use \"git rm --cached <file>\.\.\.\" to unstage" output + test_grep "use \"git rm --cached <file>\.\.\.\" to unstage" output ' strip_comments () { @@ -1542,12 +1542,12 @@ test_expect_success 'git commit will commit a staged but ignored submodule' ' git config --add -f .gitmodules submodule.subname.path sm && git config --add submodule.subname.ignore all && git status -s --ignore-submodules=dirty >output && - test_i18ngrep "^M. sm" output && + test_grep "^M. sm" output && GIT_EDITOR="echo hello >>\"\$1\"" && export GIT_EDITOR && git commit -uno && git status -s --ignore-submodules=dirty >output && - test_i18ngrep ! "^M. sm" output + test_grep ! "^M. sm" output ' test_expect_success 'git commit --dry-run will show a staged but ignored submodule' ' @@ -1572,13 +1572,13 @@ EOF git commit -uno --dry-run >output && test_cmp expect output && git status -s --ignore-submodules=dirty >output && - test_i18ngrep "^M. sm" output + test_grep "^M. sm" output ' test_expect_success 'git commit -m will commit a staged but ignored submodule' ' git commit -uno -m message && git status -s --ignore-submodules=dirty >output && - test_i18ngrep ! "^M. sm" output && + test_grep ! "^M. sm" output && git config --remove-section submodule.subname && git config -f .gitmodules --remove-section submodule.subname ' @@ -1591,7 +1591,7 @@ test_expect_success 'show stash info with "--show-stash"' ' git stash && git status >expected_default && git status --show-stash >expected_with_stash && - test_i18ngrep "^Your stash currently has 1 entry$" expected_with_stash + test_grep "^Your stash currently has 1 entry$" expected_with_stash ' test_expect_success 'no stash info with "--show-stash --no-show-stash"' ' @@ -1618,14 +1618,14 @@ test_expect_success 'no additional info if no stash entries' ' test_expect_success '"No commits yet" should be noted in status output' ' git checkout --orphan empty-branch-1 && git status >output && - test_i18ngrep "No commits yet" output + test_grep "No commits yet" output ' test_expect_success '"No commits yet" should not be noted in status output' ' git checkout --orphan empty-branch-2 && test_commit test-commit-1 && git status >output && - test_i18ngrep ! "No commits yet" output + test_grep ! "No commits yet" output ' test_expect_success '"Initial commit" should be noted in commit template' ' @@ -1633,7 +1633,7 @@ test_expect_success '"Initial commit" should be noted in commit template' ' touch to_be_committed_1 && git add to_be_committed_1 && git commit --dry-run >output && - test_i18ngrep "Initial commit" output + test_grep "Initial commit" output ' test_expect_success '"Initial commit" should not be noted in commit template' ' @@ -1642,7 +1642,7 @@ test_expect_success '"Initial commit" should not be noted in commit template' ' touch to_be_committed_2 && git add to_be_committed_2 && git commit --dry-run >output && - test_i18ngrep ! "Initial commit" output + test_grep ! "Initial commit" output ' test_expect_success '--no-optional-locks prevents index update' ' @@ -1745,4 +1745,20 @@ test_expect_success 'slow status advice when core.untrackedCache true, and fsmon ) ' +test_expect_success EXPENSIVE 'status does not re-read unchanged 4 or 8 GiB file' ' + ( + mkdir large-file && + cd large-file && + # Files are 2 GiB, 4 GiB, and 8 GiB sparse files. + test-tool truncate file-a 0x080000000 && + test-tool truncate file-b 0x100000000 && + test-tool truncate file-c 0x200000000 && + # This will be slow. + git add file-a file-b file-c && + git commit -m "add large files" && + git diff-index HEAD file-a file-b file-c >actual && + test_must_be_empty actual + ) +' + test_done diff --git a/t/t7509-commit-authorship.sh b/t/t7509-commit-authorship.sh index 5d890949f7..fd8c8f8f0b 100755 --- a/t/t7509-commit-authorship.sh +++ b/t/t7509-commit-authorship.sh @@ -99,7 +99,7 @@ test_expect_success '--amend option with empty author' ' echo "Empty author test" >>foo && test_tick && test_must_fail git commit -a -m "empty author" --amend 2>err && - test_i18ngrep "empty ident" err + test_grep "empty ident" err ' test_expect_success '--amend option with missing author' ' @@ -112,7 +112,7 @@ test_expect_success '--amend option with missing author' ' echo "Missing author test" >>foo && test_tick && test_must_fail git commit -a -m "malformed author" --amend 2>err && - test_i18ngrep "empty ident" err + test_grep "empty ident" err ' test_expect_success '--reset-author makes the commit ours even with --amend option' ' diff --git a/t/t7512-status-help.sh b/t/t7512-status-help.sh index c2ab8a444a..802f8f704c 100755 --- a/t/t7512-status-help.sh +++ b/t/t7512-status-help.sh @@ -692,6 +692,34 @@ EOF ' +test_expect_success 'status when bisecting while rebasing' ' + git reset --hard main && + test_when_finished "git rebase --abort" && + ONTO=$(git rev-parse --short HEAD^) && + FAKE_LINES="break" git rebase -i HEAD^ && + test_when_finished "git checkout -" && + git checkout -b bisect_while_rebasing && + test_when_finished "git bisect reset" && + git bisect start && + cat >expected <<EOF && +On branch bisect_while_rebasing +Last command done (1 command done): + break +No commands remaining. +You are currently editing a commit while rebasing branch '\''bisect'\'' on '\''$ONTO'\''. + (use "git commit --amend" to amend the current commit) + (use "git rebase --continue" once you are satisfied with your changes) + +You are currently bisecting, started from branch '\''bisect_while_rebasing'\''. + (use "git bisect reset" to get back to the original branch) + +nothing to commit (use -u to show untracked files) +EOF + git status --untracked-files=no >actual && + test_cmp expected actual +' + + test_expect_success 'status when rebase --apply conflicts with statushints disabled' ' git reset --hard main && git checkout -b statushints_disabled && diff --git a/t/t7513-interpret-trailers.sh b/t/t7513-interpret-trailers.sh index 97f10905d2..ec9c6de114 100755 --- a/t/t7513-interpret-trailers.sh +++ b/t/t7513-interpret-trailers.sh @@ -489,7 +489,7 @@ test_expect_success 'multiline field treated as atomic for neighbor check' ' ' test_expect_success 'with config setup' ' - git config trailer.ack.key "Acked-by: " && + test_config trailer.ack.key "Acked-by: " && cat >expected <<-\EOF && Acked-by: Peff @@ -503,8 +503,8 @@ test_expect_success 'with config setup' ' ' test_expect_success 'with config setup and ":=" as separators' ' - git config trailer.separators ":=" && - git config trailer.ack.key "Acked-by= " && + test_config trailer.separators ":=" && + test_config trailer.ack.key "Acked-by= " && cat >expected <<-\EOF && Acked-by= Peff @@ -518,7 +518,7 @@ test_expect_success 'with config setup and ":=" as separators' ' ' test_expect_success 'with config setup and "%" as separators' ' - git config trailer.separators "%" && + test_config trailer.separators "%" && cat >expected <<-\EOF && bug% 42 @@ -532,6 +532,7 @@ test_expect_success 'with config setup and "%" as separators' ' ' test_expect_success 'with "%" as separators and a message with trailers' ' + test_config trailer.separators "%" && cat >special_message <<-\EOF && Special Message @@ -553,8 +554,8 @@ test_expect_success 'with "%" as separators and a message with trailers' ' ' test_expect_success 'with config setup and ":=#" as separators' ' - git config trailer.separators ":=#" && - git config trailer.bug.key "Bug #" && + test_config trailer.separators ":=#" && + test_config trailer.bug.key "Bug #" && cat >expected <<-\EOF && Bug #42 @@ -581,6 +582,8 @@ test_expect_success 'with basic patch' ' ' test_expect_success 'with commit complex message as argument' ' + test_config trailer.separators ":=" && + test_config trailer.ack.key "Acked-by= " && cat complex_message_body complex_message_trailers >complex_message && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && @@ -594,6 +597,8 @@ test_expect_success 'with commit complex message as argument' ' ' test_expect_success 'with 2 files arguments' ' + test_config trailer.separators ":=" && + test_config trailer.ack.key "Acked-by= " && cat basic_message >>expected && echo >>expected && cat basic_patch >>expected && @@ -677,6 +682,9 @@ test_expect_success 'with message that has an old style conflict block' ' ' test_expect_success 'with commit complex message and trailer args' ' + test_config trailer.separators ":=#" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.bug.key "Bug #" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Fixes: Z @@ -692,6 +700,9 @@ test_expect_success 'with commit complex message and trailer args' ' ' test_expect_success 'with complex patch, args and --trim-empty' ' + test_config trailer.separators ":=#" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.bug.key "Bug #" && cat complex_message >complex_patch && cat basic_patch >>complex_patch && cat complex_message_body >expected && @@ -746,7 +757,10 @@ test_expect_success POSIXPERM,SANITY "in-place editing doesn't clobber original ' test_expect_success 'using "where = before"' ' - git config trailer.bug.where "before" && + test_config trailer.separators ":=#" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -762,7 +776,9 @@ test_expect_success 'using "where = before"' ' ' test_expect_success 'overriding configuration with "--where after"' ' - git config trailer.ack.where "before" && + test_config trailer.separators ":=" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "before" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Fixes: Z @@ -776,7 +792,12 @@ test_expect_success 'overriding configuration with "--where after"' ' test_cmp expected actual ' -test_expect_success 'using "where = before" with "--no-where"' ' +test_expect_success 'using "--where after" with "--no-where"' ' + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "before" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -791,8 +812,59 @@ test_expect_success 'using "where = before" with "--no-where"' ' test_cmp expected actual ' +# Check whether using "--no-where" clears out only the "--where after", such +# that we still use the configuration in trailer.where (which is different from +# the hardcoded default (in WHERE_END) assuming the absence of .gitconfig). +# Here, the "start" setting of trailer.where is respected, so the new "Acked-by" +# and "Bug" trailers are placed at the beginning, and not at the end which is +# the harcoded default. +test_expect_success 'using "--where after" with "--no-where" defaults to configuration' ' + test_config trailer.ack.key "Acked-by= " && + test_config trailer.bug.key "Bug #" && + test_config trailer.separators ":=#" && + test_config trailer.where "start" && + cat complex_message_body >expected && + sed -e "s/ Z\$/ /" >>expected <<-\EOF && + Bug #42 + Acked-by= Peff + Fixes: Z + Acked-by= Z + Reviewed-by: Z + Signed-off-by: Z + EOF + git interpret-trailers --where after --no-where --trailer "ack: Peff" \ + --trailer "bug: 42" complex_message >actual && + test_cmp expected actual +' + +# The "--where after" will only get respected for the trailer that came +# immediately after it. For the next trailer (Bug #42), we default to using the +# hardcoded WHERE_END because we don't have any "trailer.where" or +# "trailer.bug.where" configured. +test_expect_success 'using "--no-where" defaults to harcoded default if nothing configured' ' + test_config trailer.ack.key "Acked-by= " && + test_config trailer.bug.key "Bug #" && + test_config trailer.separators ":=#" && + cat complex_message_body >expected && + sed -e "s/ Z\$/ /" >>expected <<-\EOF && + Fixes: Z + Acked-by= Z + Acked-by= Peff + Reviewed-by: Z + Signed-off-by: Z + Bug #42 + EOF + git interpret-trailers --where after --trailer "ack: Peff" --no-where \ + --trailer "bug: 42" complex_message >actual && + test_cmp expected actual +' + test_expect_success 'using "where = after"' ' - git config trailer.ack.where "after" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -808,8 +880,11 @@ test_expect_success 'using "where = after"' ' ' test_expect_success 'using "where = end"' ' - git config trailer.review.key "Reviewed-by" && - git config trailer.review.where "end" && + test_config trailer.review.key "Reviewed-by" && + test_config trailer.review.where "end" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.separators ":=" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Fixes: Z @@ -827,8 +902,11 @@ test_expect_success 'using "where = end"' ' ' test_expect_success 'using "where = start"' ' - git config trailer.review.key "Reviewed-by" && - git config trailer.review.where "start" && + test_config trailer.review.key "Reviewed-by" && + test_config trailer.review.where "start" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.separators ":=" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Reviewed-by: Johannes @@ -846,8 +924,13 @@ test_expect_success 'using "where = start"' ' ' test_expect_success 'using "where = before" for a token in the middle of the message' ' - git config trailer.review.key "Reviewed-by:" && - git config trailer.review.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.review.where "before" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -864,6 +947,12 @@ test_expect_success 'using "where = before" for a token in the middle of the mes ' test_expect_success 'using "where = before" and --trim-empty' ' + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && cat >>expected <<-\EOF && Bug #46 @@ -878,6 +967,13 @@ test_expect_success 'using "where = before" and --trim-empty' ' ' test_expect_success 'the default is "ifExists = addIfDifferentNeighbor"' ' + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.review.where "before" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -896,7 +992,13 @@ test_expect_success 'the default is "ifExists = addIfDifferentNeighbor"' ' ' test_expect_success 'default "ifExists" is now "addIfDifferent"' ' - git config trailer.ifexists "addIfDifferent" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -914,8 +1016,14 @@ test_expect_success 'default "ifExists" is now "addIfDifferent"' ' ' test_expect_success 'using "ifExists = addIfDifferent" with "where = end"' ' - git config trailer.ack.ifExists "addIfDifferent" && - git config trailer.ack.where "end" && + test_config trailer.ack.ifExists "addIfDifferent" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "end" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -932,8 +1040,14 @@ test_expect_success 'using "ifExists = addIfDifferent" with "where = end"' ' ' test_expect_success 'using "ifExists = addIfDifferent" with "where = before"' ' - git config trailer.ack.ifExists "addIfDifferent" && - git config trailer.ack.where "before" && + test_config trailer.ack.ifExists "addIfDifferent" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "before" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -950,8 +1064,14 @@ test_expect_success 'using "ifExists = addIfDifferent" with "where = before"' ' ' test_expect_success 'using "ifExists = addIfDifferentNeighbor" with "where = end"' ' - git config trailer.ack.ifExists "addIfDifferentNeighbor" && - git config trailer.ack.where "end" && + test_config trailer.ack.ifExists "addIfDifferentNeighbor" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "end" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -973,8 +1093,14 @@ test_expect_success 'using "ifExists = addIfDifferentNeighbor" with "where = end ' test_expect_success 'using "ifExists = addIfDifferentNeighbor" with "where = after"' ' - git config trailer.ack.ifExists "addIfDifferentNeighbor" && - git config trailer.ack.where "after" && + test_config trailer.ack.ifExists "addIfDifferentNeighbor" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -995,7 +1121,11 @@ test_expect_success 'using "ifExists = addIfDifferentNeighbor" with "where = af ' test_expect_success 'using "ifExists = addIfDifferentNeighbor" and --trim-empty' ' - git config trailer.ack.ifExists "addIfDifferentNeighbor" && + test_config trailer.ack.ifExists "addIfDifferentNeighbor" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && cat >>expected <<-\EOF && Bug #42 @@ -1011,8 +1141,14 @@ test_expect_success 'using "ifExists = addIfDifferentNeighbor" and --trim-empty' ' test_expect_success 'using "ifExists = add" with "where = end"' ' - git config trailer.ack.ifExists "add" && - git config trailer.ack.where "end" && + test_config trailer.ack.ifExists "add" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "end" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1036,8 +1172,14 @@ test_expect_success 'using "ifExists = add" with "where = end"' ' ' test_expect_success 'using "ifExists = add" with "where = after"' ' - git config trailer.ack.ifExists "add" && - git config trailer.ack.where "after" && + test_config trailer.ack.ifExists "add" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1058,8 +1200,15 @@ test_expect_success 'using "ifExists = add" with "where = after"' ' ' test_expect_success 'overriding configuration with "--if-exists replace"' ' - git config trailer.fix.key "Fixes: " && - git config trailer.fix.ifExists "add" && + test_config trailer.fix.key "Fixes: " && + test_config trailer.fix.ifExists "add" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.review.where "before" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1074,9 +1223,66 @@ test_expect_success 'overriding configuration with "--if-exists replace"' ' test_cmp expected actual ' +# "trailer.ifexists" is set to "doNothing", so using "--no-if-exists" defaults +# to this "doNothing" behavior. So the "Fixes: 53" trailer does not get added. +test_expect_success 'using "--if-exists replace" with "--no-if-exists" defaults to configuration' ' + test_config trailer.ifexists "doNothing" && + cat complex_message_body >expected && + sed -e "s/ Z\$/ /" >>expected <<-\EOF && + Fixes: Z + Acked-by: Z + Reviewed-by: Z + Signed-off-by: Z + EOF + git interpret-trailers --if-exists replace --no-if-exists --trailer "Fixes: 53" \ + <complex_message >actual && + test_cmp expected actual +' + +# No "ifexists" configuration is set, so using "--no-if-exists" makes it default +# to addIfDifferentNeighbor. Because we do have a different neighbor "Fixes: 53" +# (because it got added by overriding with "--if-exists replace" earlier in the +# arguments list), we add "Signed-off-by: addme". +test_expect_success 'using "--no-if-exists" defaults to hardcoded default if nothing configured' ' + cat complex_message_body >expected && + sed -e "s/ Z\$/ /" >>expected <<-\EOF && + Acked-by: Z + Reviewed-by: Z + Signed-off-by: Z + Fixes: 53 + Signed-off-by: addme + EOF + git interpret-trailers --if-exists replace --trailer "Fixes: 53" --no-if-exists \ + --trailer "Signed-off-by: addme" <complex_message >actual && + test_cmp expected actual +' + +# The second "Fixes: 53" trailer is discarded, because the "--no-if-exists" here +# makes us default to addIfDifferentNeighbor, and we already added the "Fixes: +# 53" trailer earlier in the argument list. +test_expect_success 'using "--no-if-exists" defaults to hardcoded default if nothing configured (no addition)' ' + cat complex_message_body >expected && + sed -e "s/ Z\$/ /" >>expected <<-\EOF && + Acked-by: Z + Reviewed-by: Z + Signed-off-by: Z + Fixes: 53 + EOF + git interpret-trailers --if-exists replace --trailer "Fixes: 53" --no-if-exists \ + --trailer "Fixes: 53" <complex_message >actual && + test_cmp expected actual +' + test_expect_success 'using "ifExists = replace"' ' - git config trailer.fix.key "Fixes: " && - git config trailer.fix.ifExists "replace" && + test_config trailer.fix.key "Fixes: " && + test_config trailer.fix.ifExists "replace" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1095,7 +1301,16 @@ test_expect_success 'using "ifExists = replace"' ' ' test_expect_success 'using "ifExists = replace" with "where = after"' ' - git config trailer.fix.where "after" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.fix.key "Fixes: " && + test_config trailer.fix.ifExists "replace" && + test_config trailer.fix.where "after" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1114,7 +1329,15 @@ test_expect_success 'using "ifExists = replace" with "where = after"' ' ' test_expect_success 'using "ifExists = doNothing"' ' - git config trailer.fix.ifExists "doNothing" && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.fix.key "Fixes: " && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1133,8 +1356,17 @@ test_expect_success 'using "ifExists = doNothing"' ' ' test_expect_success 'the default is "ifMissing = add"' ' - git config trailer.cc.key "Cc: " && - git config trailer.cc.where "before" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.cc.key "Cc: " && + test_config trailer.cc.where "before" && + test_config trailer.fix.key "Fixes: " && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1154,7 +1386,14 @@ test_expect_success 'the default is "ifMissing = add"' ' ' test_expect_success 'overriding configuration with "--if-missing doNothing"' ' - git config trailer.ifmissing "add" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.fix.key "Fixes: " && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.ifmissing "add" && + test_config trailer.separators ":=" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Fixes: Z @@ -1173,7 +1412,13 @@ test_expect_success 'overriding configuration with "--if-missing doNothing"' ' ' test_expect_success 'when default "ifMissing" is "doNothing"' ' - git config trailer.ifmissing "doNothing" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.ifmissing "doNothing" && + test_config trailer.separators ":=" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Fixes: Z @@ -1187,14 +1432,21 @@ test_expect_success 'when default "ifMissing" is "doNothing"' ' --trailer "cc=Linus" --trailer "ack: Junio" \ --trailer "fix=22" --trailer "bug: 42" --trailer "ack: Peff" \ <complex_message >actual && - test_cmp expected actual && - git config trailer.ifmissing "add" + test_cmp expected actual ' test_expect_success 'using "ifMissing = add" with "where = end"' ' - git config trailer.cc.key "Cc: " && - git config trailer.cc.where "end" && - git config trailer.cc.ifMissing "add" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.cc.key "Cc: " && + test_config trailer.cc.ifMissing "add" && + test_config trailer.cc.where "end" && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1214,9 +1466,17 @@ test_expect_success 'using "ifMissing = add" with "where = end"' ' ' test_expect_success 'using "ifMissing = add" with "where = before"' ' - git config trailer.cc.key "Cc: " && - git config trailer.cc.where "before" && - git config trailer.cc.ifMissing "add" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.cc.key "Cc: " && + test_config trailer.cc.ifMissing "add" && + test_config trailer.cc.where "before" && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Cc: Linus @@ -1236,7 +1496,15 @@ test_expect_success 'using "ifMissing = add" with "where = before"' ' ' test_expect_success 'using "ifMissing = doNothing"' ' - git config trailer.cc.ifMissing "doNothing" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.cc.ifMissing "doNothing" && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1254,9 +1522,50 @@ test_expect_success 'using "ifMissing = doNothing"' ' test_cmp expected actual ' +# Ignore the "IgnoredTrailer" because of "--if-missing doNothing", but also +# ignore the "StillIgnoredTrailer" because we set "trailer.ifMissing" to +# "doNothing" in configuration. +test_expect_success 'using "--no-if-missing" defaults to configuration' ' + test_config trailer.ifMissing "doNothing" && + cat complex_message_body >expected && + sed -e "s/ Z\$/ /" >>expected <<-\EOF && + Fixes: Z + Acked-by: Z + Reviewed-by: Z + Signed-off-by: Z + EOF + git interpret-trailers --if-missing doNothing --trailer "IgnoredTrailer: ignoreme" --no-if-missing \ + --trailer "StillIgnoredTrailer: ignoreme" <complex_message >actual && + test_cmp expected actual +' + +# Add the "AddedTrailer" because the "--no-if-missing" clears the "--if-missing +# doNothing" from earlier in the argument list. +test_expect_success 'using "--no-if-missing" defaults to hardcoded default if nothing configured' ' + cat complex_message_body >expected && + sed -e "s/ Z\$/ /" >>expected <<-\EOF && + Fixes: Z + Acked-by: Z + Reviewed-by: Z + Signed-off-by: Z + AddedTrailer: addme + EOF + git interpret-trailers --if-missing doNothing --trailer "IgnoredTrailer: ignoreme" --no-if-missing \ + --trailer "AddedTrailer: addme" <complex_message >actual && + test_cmp expected actual +' + test_expect_success 'default "where" is now "after"' ' git config trailer.where "after" && - git config --unset trailer.ack.where && + test_config trailer.ack.ifExists "add" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.ack.where "after" && + test_config trailer.bug.key "Bug #" && + test_config trailer.bug.where "before" && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=#" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Bug #42 @@ -1280,10 +1589,15 @@ test_expect_success 'default "where" is now "after"' ' ' test_expect_success 'with simple command' ' - git config trailer.sign.key "Signed-off-by: " && - git config trailer.sign.where "after" && - git config trailer.sign.ifExists "addIfDifferentNeighbor" && - git config trailer.sign.command "echo \"A U Thor <author@example.com>\"" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.sign.command "echo \"A U Thor <author@example.com>\"" && + test_config trailer.sign.key "Signed-off-by: " && + test_config trailer.sign.ifExists "addIfDifferentNeighbor" && + test_config trailer.sign.where "after" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Fixes: Z @@ -1298,8 +1612,14 @@ test_expect_success 'with simple command' ' ' test_expect_success 'with command using committer information' ' - git config trailer.sign.ifExists "addIfDifferent" && - git config trailer.sign.command "echo \"\$GIT_COMMITTER_NAME <\$GIT_COMMITTER_EMAIL>\"" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.sign.command "echo \"\$GIT_COMMITTER_NAME <\$GIT_COMMITTER_EMAIL>\"" && + test_config trailer.sign.key "Signed-off-by: " && + test_config trailer.sign.ifExists "addIfDifferent" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Fixes: Z @@ -1314,10 +1634,15 @@ test_expect_success 'with command using committer information' ' ' test_expect_success 'with command using author information' ' - git config trailer.sign.key "Signed-off-by: " && - git config trailer.sign.where "after" && - git config trailer.sign.ifExists "addIfDifferentNeighbor" && - git config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.fix.ifExists "doNothing" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" && + test_config trailer.sign.key "Signed-off-by: " && + test_config trailer.sign.ifExists "addIfDifferentNeighbor" && + test_config trailer.sign.where "after" && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-\EOF && Fixes: Z @@ -1338,12 +1663,19 @@ test_expect_success 'setup a commit' ' ' test_expect_success 'cmd takes precedence over command' ' - test_when_finished "git config --unset trailer.fix.cmd" && - git config trailer.fix.ifExists "replace" && - git config trailer.fix.cmd "test -n \"\$1\" && git log -1 --oneline --format=\"%h (%aN)\" \ - --abbrev-commit --abbrev=14 \"\$1\" || true" && - git config trailer.fix.command "git log -1 --oneline --format=\"%h (%s)\" \ + test_config trailer.ack.key "Acked-by= " && + test_config trailer.fix.command "git log -1 --oneline --format=\"%h (%s)\" \ --abbrev-commit --abbrev=14 \$ARG" && + test_config trailer.fix.cmd "test -n \"\$1\" && git log -1 --oneline --format=\"%h (%aN)\" \ + --abbrev-commit --abbrev=14 \"\$1\" || true" && + test_config trailer.fix.key "Fixes: " && + test_config trailer.fix.ifExists "replace" && + test_config trailer.fix.where "after" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" && + test_config trailer.sign.key "Signed-off-by: " && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=" && FIXED=$(git log -1 --oneline --format="%h (%aN)" --abbrev-commit --abbrev=14 HEAD) && cat complex_message_body >expected2 && sed -e "s/ Z\$/ /" >>expected2 <<-EOF && @@ -1359,8 +1691,16 @@ test_expect_success 'cmd takes precedence over command' ' ' test_expect_success 'with command using $ARG' ' - git config trailer.fix.ifExists "replace" && - git config trailer.fix.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.fix.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG" && + test_config trailer.fix.key "Fixes: " && + test_config trailer.fix.ifExists "replace" && + test_config trailer.fix.where "after" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" && + test_config trailer.sign.key "Signed-off-by: " && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=" && FIXED=$(git log -1 --oneline --format="%h (%s)" --abbrev-commit --abbrev=14 HEAD) && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-EOF && @@ -1376,8 +1716,16 @@ test_expect_success 'with command using $ARG' ' ' test_expect_success 'with failing command using $ARG' ' - git config trailer.fix.ifExists "replace" && - git config trailer.fix.command "false \$ARG" && + test_config trailer.ack.key "Acked-by= " && + test_config trailer.fix.command "false \$ARG" && + test_config trailer.fix.key "Fixes: " && + test_config trailer.fix.ifExists "replace" && + test_config trailer.fix.where "after" && + test_config trailer.review.key "Reviewed-by:" && + test_config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" && + test_config trailer.sign.key "Signed-off-by: " && + test_config trailer.ifexists "addIfDifferent" && + test_config trailer.separators ":=" && cat complex_message_body >expected && sed -e "s/ Z\$/ /" >>expected <<-EOF && Fixes: Z @@ -1392,7 +1740,9 @@ test_expect_success 'with failing command using $ARG' ' ' test_expect_success 'with empty tokens' ' - git config --unset trailer.fix.command && + test_config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" && + test_config trailer.sign.key "Signed-off-by: " && + test_config trailer.ifexists "addIfDifferent" && cat >expected <<-EOF && Signed-off-by: A U Thor <author@example.com> @@ -1403,7 +1753,8 @@ test_expect_success 'with empty tokens' ' ' test_expect_success 'with command but no key' ' - git config --unset trailer.sign.key && + test_config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" && + test_config trailer.ifexists "addIfDifferent" && cat >expected <<-EOF && sign: A U Thor <author@example.com> @@ -1414,7 +1765,9 @@ test_expect_success 'with command but no key' ' ' test_expect_success 'with no command and no key' ' - git config --unset trailer.review.key && + test_config trailer.review.where "before" && + test_config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" && + test_config trailer.ifexists "addIfDifferent" && cat >expected <<-EOF && review: Junio @@ -1426,6 +1779,8 @@ test_expect_success 'with no command and no key' ' ' test_expect_success 'with cut line' ' + test_config trailer.review.where "before" && + test_config trailer.sign.command "echo \"\$GIT_AUTHOR_NAME <\$GIT_AUTHOR_EMAIL>\"" && cat >expected <<-\EOF && my subject @@ -1443,7 +1798,8 @@ test_expect_success 'with cut line' ' ' test_expect_success 'only trailers' ' - git config trailer.sign.command "echo config-value" && + test_config trailer.sign.command "echo config-value" && + test_config trailer.ifexists "addIfDifferent" && cat >expected <<-\EOF && existing: existing-value sign: config-value @@ -1462,7 +1818,7 @@ test_expect_success 'only trailers' ' ' test_expect_success 'only-trailers omits non-trailer in middle of block' ' - git config trailer.sign.command "echo config-value" && + test_config trailer.sign.command "echo config-value" && cat >expected <<-\EOF && Signed-off-by: nobody <nobody@nowhere> Signed-off-by: somebody <somebody@somewhere> @@ -1482,7 +1838,7 @@ test_expect_success 'only-trailers omits non-trailer in middle of block' ' ' test_expect_success 'only input' ' - git config trailer.sign.command "echo config-value" && + test_config trailer.sign.command "echo config-value" && cat >expected <<-\EOF && existing: existing-value EOF @@ -1560,4 +1916,23 @@ test_expect_success 'suppress --- handling' ' test_cmp expected actual ' +test_expect_success 'suppressing --- does not disable cut-line handling' ' + echo "real-trailer: before the cut" >expected && + + git interpret-trailers --parse --no-divider >actual <<-\EOF && + subject + + This input has a cut-line in it; we should stop parsing when we see it + and consider only trailers before that line. + + real-trailer: before the cut + + # ------------------------ >8 ------------------------ + # Nothing below this line counts as part of the commit message. + not-a-trailer: too late + EOF + + test_cmp expected actual +' + test_done diff --git a/t/t7518-ident-corner-cases.sh b/t/t7518-ident-corner-cases.sh index 9ab2ae2f3b..b37de0af49 100755 --- a/t/t7518-ident-corner-cases.sh +++ b/t/t7518-ident-corner-cases.sh @@ -15,7 +15,7 @@ test_expect_success 'empty name and missing email' ' sane_unset GIT_AUTHOR_EMAIL && GIT_AUTHOR_NAME= && test_must_fail git commit --allow-empty -m foo 2>err && - test_i18ngrep ! "(null)" err + test_grep ! "(null)" err ) ' @@ -40,8 +40,8 @@ test_expect_success 'empty configured name does not auto-detect' ' sane_unset GIT_AUTHOR_NAME && test_must_fail \ git -c user.name= commit --allow-empty -m foo 2>err && - test_i18ngrep "empty ident name" err && - test_i18ngrep "Author identity unknown" err + test_grep "empty ident name" err && + test_grep "Author identity unknown" err ) ' @@ -50,8 +50,8 @@ test_expect_success 'empty configured name does not auto-detect for committer' ' sane_unset GIT_COMMITTER_NAME && test_must_fail \ git -c user.name= commit --allow-empty -m foo 2>err && - test_i18ngrep "empty ident name" err && - test_i18ngrep "Committer identity unknown" err + test_grep "empty ident name" err && + test_grep "Committer identity unknown" err ) ' diff --git a/t/t7519-status-fsmonitor.sh b/t/t7519-status-fsmonitor.sh index 8348e3ae7d..7ee69ecdd4 100755 --- a/t/t7519-status-fsmonitor.sh +++ b/t/t7519-status-fsmonitor.sh @@ -322,14 +322,14 @@ do rm -f marker && git status >actual && test_path_is_file marker && - test_i18ngrep ! "Changes not staged for commit:" actual && + test_grep ! "Changes not staged for commit:" actual && if test $uc_val = true then - test_i18ngrep ! "Untracked files:" actual + test_grep ! "Untracked files:" actual fi && if test $uc_val = false then - test_i18ngrep "Untracked files:" actual + test_grep "Untracked files:" actual fi && rm -f marker ' diff --git a/t/t7520-ignored-hook-warning.sh b/t/t7520-ignored-hook-warning.sh index 184b258989..3b63c34a30 100755 --- a/t/t7520-ignored-hook-warning.sh +++ b/t/t7520-ignored-hook-warning.sh @@ -13,27 +13,27 @@ test_expect_success setup ' test_expect_success 'no warning if hook is not ignored' ' git commit --allow-empty -m "more" 2>message && - test_i18ngrep ! -e "hook was ignored" message + test_grep ! -e "hook was ignored" message ' test_expect_success POSIXPERM 'warning if hook is ignored' ' test_hook --disable pre-commit && git commit --allow-empty -m "even more" 2>message && - test_i18ngrep -e "hook was ignored" message + test_grep -e "hook was ignored" message ' test_expect_success POSIXPERM 'no warning if advice.ignoredHook set to false' ' test_config advice.ignoredHook false && test_hook --disable pre-commit && git commit --allow-empty -m "even more" 2>message && - test_i18ngrep ! -e "hook was ignored" message + test_grep ! -e "hook was ignored" message ' test_expect_success 'no warning if unset advice.ignoredHook and hook removed' ' test_hook --remove pre-commit && test_unconfig advice.ignoredHook && git commit --allow-empty -m "even more" 2>message && - test_i18ngrep ! -e "hook was ignored" message + test_grep ! -e "hook was ignored" message ' test_done diff --git a/t/t7525-status-rename.sh b/t/t7525-status-rename.sh index 22bf5c7e5d..a9210d3a3a 100755 --- a/t/t7525-status-rename.sh +++ b/t/t7525-status-rename.sh @@ -21,81 +21,81 @@ test_expect_success 'setup' ' test_expect_success 'status no-options' ' git status >actual && - test_i18ngrep "renamed:" actual + test_grep "renamed:" actual ' test_expect_success 'status --no-renames' ' git status --no-renames >actual && - test_i18ngrep "deleted:" actual && - test_i18ngrep "new file:" actual + test_grep "deleted:" actual && + test_grep "new file:" actual ' test_expect_success 'status.renames inherits from diff.renames false' ' git -c diff.renames=false status >actual && - test_i18ngrep "deleted:" actual && - test_i18ngrep "new file:" actual + test_grep "deleted:" actual && + test_grep "new file:" actual ' test_expect_success 'status.renames inherits from diff.renames true' ' git -c diff.renames=true status >actual && - test_i18ngrep "renamed:" actual + test_grep "renamed:" actual ' test_expect_success 'status.renames overrides diff.renames false' ' git -c diff.renames=true -c status.renames=false status >actual && - test_i18ngrep "deleted:" actual && - test_i18ngrep "new file:" actual + test_grep "deleted:" actual && + test_grep "new file:" actual ' test_expect_success 'status.renames overrides from diff.renames true' ' git -c diff.renames=false -c status.renames=true status >actual && - test_i18ngrep "renamed:" actual + test_grep "renamed:" actual ' test_expect_success 'status status.renames=false' ' git -c status.renames=false status >actual && - test_i18ngrep "deleted:" actual && - test_i18ngrep "new file:" actual + test_grep "deleted:" actual && + test_grep "new file:" actual ' test_expect_success 'status status.renames=true' ' git -c status.renames=true status >actual && - test_i18ngrep "renamed:" actual + test_grep "renamed:" actual ' test_expect_success 'commit honors status.renames=false' ' git -c status.renames=false commit --dry-run >actual && - test_i18ngrep "deleted:" actual && - test_i18ngrep "new file:" actual + test_grep "deleted:" actual && + test_grep "new file:" actual ' test_expect_success 'commit honors status.renames=true' ' git -c status.renames=true commit --dry-run >actual && - test_i18ngrep "renamed:" actual + test_grep "renamed:" actual ' test_expect_success 'status config overridden' ' git -c status.renames=true status --no-renames >actual && - test_i18ngrep "deleted:" actual && - test_i18ngrep "new file:" actual + test_grep "deleted:" actual && + test_grep "new file:" actual ' test_expect_success 'status score=100%' ' git status -M=100% >actual && - test_i18ngrep "deleted:" actual && - test_i18ngrep "new file:" actual && + test_grep "deleted:" actual && + test_grep "new file:" actual && git status --find-renames=100% >actual && - test_i18ngrep "deleted:" actual && - test_i18ngrep "new file:" actual + test_grep "deleted:" actual && + test_grep "new file:" actual ' test_expect_success 'status score=01%' ' git status -M=01% >actual && - test_i18ngrep "renamed:" actual && + test_grep "renamed:" actual && git status --find-renames=01% >actual && - test_i18ngrep "renamed:" actual + test_grep "renamed:" actual ' test_expect_success 'copies not overridden by find-renames' ' @@ -103,12 +103,12 @@ test_expect_success 'copies not overridden by find-renames' ' git add copy && git -c status.renames=copies status -M=01% >actual && - test_i18ngrep "copied:" actual && - test_i18ngrep "renamed:" actual && + test_grep "copied:" actual && + test_grep "renamed:" actual && git -c status.renames=copies status --find-renames=01% >actual && - test_i18ngrep "copied:" actual && - test_i18ngrep "renamed:" actual + test_grep "copied:" actual && + test_grep "renamed:" actual ' test_done diff --git a/t/t7526-commit-pathspec-file.sh b/t/t7526-commit-pathspec-file.sh index ad011bb9f1..c97c550021 100755 --- a/t/t7526-commit-pathspec-file.sh +++ b/t/t7526-commit-pathspec-file.sh @@ -141,25 +141,25 @@ test_expect_success 'error conditions' ' >empty_list && test_must_fail git commit --pathspec-from-file=list --interactive -m "Commit" 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err && test_must_fail git commit --pathspec-from-file=list --patch -m "Commit" 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .--interactive/--patch. cannot be used together" err && test_must_fail git commit --pathspec-from-file=list --all -m "Commit" 2>err && - test_i18ngrep -e "options .--pathspec-from-file. and .-a. cannot be used together" err && + test_grep -e "options .--pathspec-from-file. and .-a. cannot be used together" err && test_must_fail git commit --pathspec-from-file=list -m "Commit" -- fileA.t 2>err && - test_i18ngrep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && + test_grep -e ".--pathspec-from-file. and pathspec arguments cannot be used together" err && test_must_fail git commit --pathspec-file-nul -m "Commit" 2>err && - test_i18ngrep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && + test_grep -e "the option .--pathspec-file-nul. requires .--pathspec-from-file." err && test_must_fail git commit --pathspec-from-file=empty_list --include -m "Commit" 2>err && - test_i18ngrep -e "No paths with --include/--only does not make sense." err && + test_grep -e "No paths with --include/--only does not make sense." err && test_must_fail git commit --pathspec-from-file=empty_list --only -m "Commit" 2>err && - test_i18ngrep -e "No paths with --include/--only does not make sense." err + test_grep -e "No paths with --include/--only does not make sense." err ' test_done diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh index fdc607277c..e5ff073099 100755 --- a/t/t7600-merge.sh +++ b/t/t7600-merge.sh @@ -175,7 +175,7 @@ test_expect_success 'merge -h with invalid index' ' >.git/index && test_expect_code 129 git merge -h 2>usage ) && - test_i18ngrep "[Uu]sage: git merge" broken/usage + test_grep "[Uu]sage: git merge" broken/usage ' test_expect_success 'reject non-strategy with a git-merge-foo name' ' @@ -681,7 +681,7 @@ test_debug 'git log --graph --decorate --oneline --all' test_expect_success 'in-index merge' ' git reset --hard c0 && git merge --no-ff -s resolve c1 >out && - test_i18ngrep "Wonderful." out && + test_grep "Wonderful." out && verify_parents $c0 $c1 ' @@ -697,7 +697,7 @@ test_expect_success 'merge with --autostash' ' git reset --hard c1 && git merge-file file file.orig file.9 && git merge --autostash c2 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && git show HEAD:file >merge-result && test_cmp result.1-5 merge-result && test_cmp result.1-5-9 file @@ -708,7 +708,7 @@ test_expect_success 'merge with merge.autoStash' ' git reset --hard c1 && git merge-file file file.orig file.9 && git merge c2 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && git show HEAD:file >merge-result && test_cmp result.1-5 merge-result && test_cmp result.1-5-9 file @@ -718,7 +718,7 @@ test_expect_success 'fast-forward merge with --autostash' ' git reset --hard c0 && git merge-file file file.orig file.5 && git merge --autostash c1 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && test_cmp result.1-5 file ' @@ -728,7 +728,7 @@ test_expect_success 'failed fast-forward merge with --autostash' ' cp file.5 other && test_when_finished "rm other" && test_must_fail git merge --autostash c1 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && test_cmp file.5 file ' @@ -736,7 +736,7 @@ test_expect_success 'octopus merge with --autostash' ' git reset --hard c1 && git merge-file file file.orig file.3 && git merge --autostash c2 c3 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && git show HEAD:file >merge-result && test_cmp result.1-5-9 merge-result && test_cmp result.1-3-5-9 file @@ -746,7 +746,7 @@ test_expect_success 'failed merge (exit 2) with --autostash' ' git reset --hard c1 && git merge-file file file.orig file.5 && test_must_fail git merge -s recursive --autostash c2 c3 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && test_cmp result.1-5 file ' @@ -755,7 +755,7 @@ test_expect_success 'conflicted merge with --autostash, --abort restores stash' cp file.1 file && test_must_fail git merge --autostash c7 && git merge --abort 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && test_cmp file.1 file ' @@ -767,7 +767,7 @@ test_expect_success 'completed merge (git commit) with --no-commit and --autosta git stash show -p MERGE_AUTOSTASH >actual && test_cmp expect actual && git commit 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && git show HEAD:file >merge-result && test_cmp result.1-5 merge-result && test_cmp result.1-5-9 file @@ -781,7 +781,7 @@ test_expect_success 'completed merge (git merge --continue) with --no-commit and git stash show -p MERGE_AUTOSTASH >actual && test_cmp expect actual && git merge --continue 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && git show HEAD:file >merge-result && test_cmp result.1-5 merge-result && test_cmp result.1-5-9 file @@ -795,7 +795,7 @@ test_expect_success 'aborted merge (merge --abort) with --no-commit and --autost git stash show -p MERGE_AUTOSTASH >actual && test_cmp expect actual && git merge --abort 2>err && - test_i18ngrep "Applied autostash." err && + test_grep "Applied autostash." err && git diff >actual && test_cmp expect actual ' @@ -808,7 +808,7 @@ test_expect_success 'aborted merge (reset --hard) with --no-commit and --autosta git stash show -p MERGE_AUTOSTASH >actual && test_cmp expect actual && git reset --hard 2>err && - test_i18ngrep "Autostash exists; creating a new stash entry." err && + test_grep "Autostash exists; creating a new stash entry." err && git diff --exit-code ' @@ -821,7 +821,7 @@ test_expect_success 'quit merge with --no-commit and --autostash' ' test_cmp expect actual && git diff HEAD >expect && git merge --quit 2>err && - test_i18ngrep "Autostash exists; creating a new stash entry." err && + test_grep "Autostash exists; creating a new stash entry." err && git diff HEAD >actual && test_cmp expect actual ' @@ -832,7 +832,7 @@ test_expect_success 'merge with conflicted --autostash changes' ' git diff >expect && test_when_finished "test_might_fail git stash drop" && git merge --autostash c3 2>err && - test_i18ngrep "Applying autostash resulted in conflicts." err && + test_grep "Applying autostash resulted in conflicts." err && git show HEAD:file >merge-result && test_cmp result.1-9 merge-result && git stash show -p >actual && diff --git a/t/t7601-merge-pull-config.sh b/t/t7601-merge-pull-config.sh index bd238d89b0..a94387a75f 100755 --- a/t/t7601-merge-pull-config.sh +++ b/t/t7601-merge-pull-config.sh @@ -30,117 +30,117 @@ test_expect_success 'setup' ' test_expect_success 'pull.rebase not set, ff possible' ' git reset --hard c0 && git pull . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and pull.ff=true' ' git reset --hard c0 && test_config pull.ff true && git pull . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and pull.ff=false' ' git reset --hard c0 && test_config pull.ff false && git pull . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and pull.ff=only' ' git reset --hard c0 && test_config pull.ff only && git pull . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --rebase given' ' git reset --hard c0 && git pull --rebase . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --no-rebase given' ' git reset --hard c0 && git pull --no-rebase . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --ff given' ' git reset --hard c0 && git pull --ff . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --no-ff given' ' git reset --hard c0 && git pull --no-ff . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --ff-only given' ' git reset --hard c0 && git pull --ff-only . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set (not-fast-forward)' ' git reset --hard c2 && test_must_fail git -c color.advice=always pull . c1 2>err && test_decode_color <err >decoded && - test_i18ngrep "<YELLOW>hint: " decoded && - test_i18ngrep "You have divergent branches" decoded + test_grep "<YELLOW>hint: " decoded && + test_grep "You have divergent branches" decoded ' test_expect_success 'pull.rebase not set and pull.ff=true (not-fast-forward)' ' git reset --hard c2 && test_config pull.ff true && git pull . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and pull.ff=false (not-fast-forward)' ' git reset --hard c2 && test_config pull.ff false && git pull . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and pull.ff=only (not-fast-forward)' ' git reset --hard c2 && test_config pull.ff only && test_must_fail git pull . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --rebase given (not-fast-forward)' ' git reset --hard c2 && git pull --rebase . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --no-rebase given (not-fast-forward)' ' git reset --hard c2 && git pull --no-rebase . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --ff given (not-fast-forward)' ' git reset --hard c2 && git pull --ff . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --no-ff given (not-fast-forward)' ' git reset --hard c2 && git pull --no-ff . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_expect_success 'pull.rebase not set and --ff-only given (not-fast-forward)' ' git reset --hard c2 && test_must_fail git pull --ff-only . c1 2>err && - test_i18ngrep ! "You have divergent branches" err + test_grep ! "You have divergent branches" err ' test_does_rebase () { @@ -202,7 +202,7 @@ test_falls_back_to_full_merge () { test_attempts_fast_forward () { git reset --hard c2 && test_must_fail git "$@" . c1 2>err && - test_i18ngrep "Not possible to fast-forward, aborting" err + test_grep "Not possible to fast-forward, aborting" err } # @@ -328,34 +328,34 @@ test_expect_success 'pull.rebase=false and --ff, ff not possible' ' test_expect_success 'Multiple heads warns about inability to fast forward' ' git reset --hard c1 && test_must_fail git pull . c2 c3 2>err && - test_i18ngrep "You have divergent branches" err + test_grep "You have divergent branches" err ' test_expect_success 'Multiple can never be fast forwarded' ' git reset --hard c0 && test_must_fail git -c pull.ff=only pull . c1 c2 c3 2>err && - test_i18ngrep ! "You have divergent branches" err && + test_grep ! "You have divergent branches" err && # In addition to calling out "cannot fast-forward", we very much # want the "multiple branches" piece to be called out to users. - test_i18ngrep "Cannot fast-forward to multiple branches" err + test_grep "Cannot fast-forward to multiple branches" err ' test_expect_success 'Cannot rebase with multiple heads' ' git reset --hard c0 && test_must_fail git -c pull.rebase=true pull . c1 c2 c3 2>err && - test_i18ngrep ! "You have divergent branches" err && - test_i18ngrep "Cannot rebase onto multiple branches." err + test_grep ! "You have divergent branches" err && + test_grep "Cannot rebase onto multiple branches." err ' test_expect_success 'merge c1 with c2' ' git reset --hard c1 && - test -f c0.c && - test -f c1.c && - test ! -f c2.c && - test ! -f c3.c && + test_path_is_file c0.c && + test_path_is_file c1.c && + test_path_is_missing c2.c && + test_path_is_missing c3.c && git merge c2 && - test -f c1.c && - test -f c2.c + test_path_is_file c1.c && + test_path_is_file c2.c ' test_expect_success 'fast-forward pull succeeds with "true" in pull.ff' ' @@ -411,8 +411,8 @@ test_expect_success 'merge c1 with c2 (ours in pull.twohead)' ' git reset --hard c1 && git config pull.twohead ours && git merge c2 && - test -f c1.c && - ! test -f c2.c + test_path_is_file c1.c && + test_path_is_missing c2.c ' test_expect_success 'merge c1 with c2 and c3 (recursive in pull.octopus)' ' @@ -431,10 +431,10 @@ test_expect_success 'merge c1 with c2 and c3 (recursive and octopus in pull.octo test "$(git rev-parse c2)" = "$(git rev-parse HEAD^2)" && test "$(git rev-parse c3)" = "$(git rev-parse HEAD^3)" && git diff --exit-code && - test -f c0.c && - test -f c1.c && - test -f c2.c && - test -f c3.c + test_path_is_file c0.c && + test_path_is_file c1.c && + test_path_is_file c2.c && + test_path_is_file c3.c ' conflict_count() diff --git a/t/t7602-merge-octopus-many.sh b/t/t7602-merge-octopus-many.sh index ff085b086c..3669d33bd5 100755 --- a/t/t7602-merge-octopus-many.sh +++ b/t/t7602-merge-octopus-many.sh @@ -4,6 +4,7 @@ test_description='git merge Testing octopus merge with more than 25 refs.' +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'setup' ' diff --git a/t/t7603-merge-reduce-heads.sh b/t/t7603-merge-reduce-heads.sh index 4887ca705b..0e85b21ec8 100755 --- a/t/t7603-merge-reduce-heads.sh +++ b/t/t7603-merge-reduce-heads.sh @@ -4,6 +4,7 @@ test_description='git merge Testing octopus merge when reducing parents to independent branches.' +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh # 0 - 1 diff --git a/t/t7607-merge-state.sh b/t/t7607-merge-state.sh index 89a62ac53b..9001674f2e 100755 --- a/t/t7607-merge-state.sh +++ b/t/t7607-merge-state.sh @@ -4,6 +4,7 @@ test_description="Test that merge state is as expected after failed merge" GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'Ensure we restore original state if no merge strategy handles it' ' diff --git a/t/t7608-merge-messages.sh b/t/t7608-merge-messages.sh index 0b908ab2e7..2179938c43 100755 --- a/t/t7608-merge-messages.sh +++ b/t/t7608-merge-messages.sh @@ -4,6 +4,7 @@ test_description='test auto-generated merge messages' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh check_oneline() { diff --git a/t/t7611-merge-abort.sh b/t/t7611-merge-abort.sh index c0e9425115..d6975ca48d 100755 --- a/t/t7611-merge-abort.sh +++ b/t/t7611-merge-abort.sh @@ -50,7 +50,7 @@ pre_merge_head="$(git rev-parse HEAD)" test_expect_success 'fails without MERGE_HEAD (unstarted merge)' ' test_must_fail git merge --abort 2>output && - test_i18ngrep MERGE_HEAD output + test_grep MERGE_HEAD output ' test_expect_success 'fails without MERGE_HEAD (unstarted merge): .git/MERGE_HEAD sanity' ' @@ -64,7 +64,7 @@ test_expect_success 'fails without MERGE_HEAD (completed merge)' ' # Merge successfully completed post_merge_head="$(git rev-parse HEAD)" && test_must_fail git merge --abort 2>output && - test_i18ngrep MERGE_HEAD output + test_grep MERGE_HEAD output ' test_expect_success 'fails without MERGE_HEAD (completed merge): .git/MERGE_HEAD sanity' ' diff --git a/t/t7612-merge-verify-signatures.sh b/t/t7612-merge-verify-signatures.sh index f5c90cc22a..84ddb56851 100755 --- a/t/t7612-merge-verify-signatures.sh +++ b/t/t7612-merge-verify-signatures.sh @@ -41,54 +41,54 @@ test_expect_success GPG 'create signed commits' ' test_expect_success GPG 'merge unsigned commit with verification' ' test_when_finished "git reset --hard && git checkout initial" && test_must_fail git merge --ff-only --verify-signatures side-unsigned 2>mergeerror && - test_i18ngrep "does not have a GPG signature" mergeerror + test_grep "does not have a GPG signature" mergeerror ' test_expect_success GPG 'merge unsigned commit with merge.verifySignatures=true' ' test_when_finished "git reset --hard && git checkout initial" && test_config merge.verifySignatures true && test_must_fail git merge --ff-only side-unsigned 2>mergeerror && - test_i18ngrep "does not have a GPG signature" mergeerror + test_grep "does not have a GPG signature" mergeerror ' test_expect_success GPG 'merge commit with bad signature with verification' ' test_when_finished "git reset --hard && git checkout initial" && test_must_fail git merge --ff-only --verify-signatures $(cat forged.commit) 2>mergeerror && - test_i18ngrep "has a bad GPG signature" mergeerror + test_grep "has a bad GPG signature" mergeerror ' test_expect_success GPG 'merge commit with bad signature with merge.verifySignatures=true' ' test_when_finished "git reset --hard && git checkout initial" && test_config merge.verifySignatures true && test_must_fail git merge --ff-only $(cat forged.commit) 2>mergeerror && - test_i18ngrep "has a bad GPG signature" mergeerror + test_grep "has a bad GPG signature" mergeerror ' test_expect_success GPG 'merge commit with untrusted signature with verification' ' test_when_finished "git reset --hard && git checkout initial" && test_must_fail git merge --ff-only --verify-signatures side-untrusted 2>mergeerror && - test_i18ngrep "has an untrusted GPG signature" mergeerror + test_grep "has an untrusted GPG signature" mergeerror ' test_expect_success GPG 'merge commit with untrusted signature with verification and high minTrustLevel' ' test_when_finished "git reset --hard && git checkout initial" && test_config gpg.minTrustLevel marginal && test_must_fail git merge --ff-only --verify-signatures side-untrusted 2>mergeerror && - test_i18ngrep "has an untrusted GPG signature" mergeerror + test_grep "has an untrusted GPG signature" mergeerror ' test_expect_success GPG 'merge commit with untrusted signature with verification and low minTrustLevel' ' test_when_finished "git reset --hard && git checkout initial" && test_config gpg.minTrustLevel undefined && git merge --ff-only --verify-signatures side-untrusted >mergeoutput && - test_i18ngrep "has a good GPG signature" mergeoutput + test_grep "has a good GPG signature" mergeoutput ' test_expect_success GPG 'merge commit with untrusted signature with merge.verifySignatures=true' ' test_when_finished "git reset --hard && git checkout initial" && test_config merge.verifySignatures true && test_must_fail git merge --ff-only side-untrusted 2>mergeerror && - test_i18ngrep "has an untrusted GPG signature" mergeerror + test_grep "has an untrusted GPG signature" mergeerror ' test_expect_success GPG 'merge commit with untrusted signature with merge.verifySignatures=true and minTrustLevel' ' @@ -96,20 +96,20 @@ test_expect_success GPG 'merge commit with untrusted signature with merge.verify test_config merge.verifySignatures true && test_config gpg.minTrustLevel marginal && test_must_fail git merge --ff-only side-untrusted 2>mergeerror && - test_i18ngrep "has an untrusted GPG signature" mergeerror + test_grep "has an untrusted GPG signature" mergeerror ' test_expect_success GPG 'merge signed commit with verification' ' test_when_finished "git reset --hard && git checkout initial" && git merge --verbose --ff-only --verify-signatures side-signed >mergeoutput && - test_i18ngrep "has a good GPG signature" mergeoutput + test_grep "has a good GPG signature" mergeoutput ' test_expect_success GPG 'merge signed commit with merge.verifySignatures=true' ' test_when_finished "git reset --hard && git checkout initial" && test_config merge.verifySignatures true && git merge --verbose --ff-only side-signed >mergeoutput && - test_i18ngrep "has a good GPG signature" mergeoutput + test_grep "has a good GPG signature" mergeoutput ' test_expect_success GPG 'merge commit with bad signature without verification' ' @@ -133,7 +133,7 @@ test_expect_success GPG 'merge unsigned commit into unborn branch' ' test_when_finished "git checkout initial" && git checkout --orphan unborn && test_must_fail git merge --verify-signatures side-unsigned 2>mergeerror && - test_i18ngrep "does not have a GPG signature" mergeerror + test_grep "does not have a GPG signature" mergeerror ' test_done diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh index 27b66807cd..94f9f4a1da 100755 --- a/t/t7700-repack.sh +++ b/t/t7700-repack.sh @@ -271,7 +271,7 @@ test_expect_success 'repacking fails when missing .pack actually means missing o ls .git/objects/pack/*.pack >before-pack-dir && test_must_fail git fsck && - test_must_fail git repack --cruft -d 2>err && + test_must_fail env GIT_COMMIT_GRAPH_PARANOIA=true git repack --cruft -d 2>err && grep "bad object" err && # Before failing, the repack did not modify the @@ -327,6 +327,203 @@ test_expect_success 'auto-bitmaps do not complain if unavailable' ' test_must_be_empty actual ' +test_expect_success 'repacking with a filter works' ' + git -C bare.git repack -a -d && + test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack && + git -C bare.git -c repack.writebitmaps=false repack -a -d --filter=blob:none && + test_stdout_line_count = 2 ls bare.git/objects/pack/*.pack && + commit_pack=$(test-tool -C bare.git find-pack -c 1 HEAD) && + blob_pack=$(test-tool -C bare.git find-pack -c 1 HEAD:file1) && + test "$commit_pack" != "$blob_pack" && + tree_pack=$(test-tool -C bare.git find-pack -c 1 HEAD^{tree}) && + test "$tree_pack" = "$commit_pack" && + blob_pack2=$(test-tool -C bare.git find-pack -c 1 HEAD:file2) && + test "$blob_pack2" = "$blob_pack" +' + +test_expect_success '--filter fails with --write-bitmap-index' ' + test_must_fail \ + env GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP=0 \ + git -C bare.git repack -a -d --write-bitmap-index --filter=blob:none +' + +test_expect_success 'repacking with two filters works' ' + git init two-filters && + ( + cd two-filters && + mkdir subdir && + test_commit foo && + test_commit subdir_bar subdir/bar && + test_commit subdir_baz subdir/baz + ) && + git clone --no-local --bare two-filters two-filters.git && + ( + cd two-filters.git && + test_stdout_line_count = 1 ls objects/pack/*.pack && + git -c repack.writebitmaps=false repack -a -d \ + --filter=blob:none --filter=tree:1 && + test_stdout_line_count = 2 ls objects/pack/*.pack && + commit_pack=$(test-tool find-pack -c 1 HEAD) && + blob_pack=$(test-tool find-pack -c 1 HEAD:foo.t) && + root_tree_pack=$(test-tool find-pack -c 1 HEAD^{tree}) && + subdir_tree_hash=$(git ls-tree --object-only HEAD -- subdir) && + subdir_tree_pack=$(test-tool find-pack -c 1 "$subdir_tree_hash") && + + # Root tree and subdir tree are not in the same packfiles + test "$commit_pack" != "$blob_pack" && + test "$commit_pack" = "$root_tree_pack" && + test "$blob_pack" = "$subdir_tree_pack" + ) +' + +prepare_for_keep_packs () { + git init keep-packs && + ( + cd keep-packs && + test_commit foo && + test_commit bar + ) && + git clone --no-local --bare keep-packs keep-packs.git && + ( + cd keep-packs.git && + + # Create two packs + # The first pack will contain all of the objects except one blob + git rev-list --objects --all >objs && + grep -v "bar.t" objs | git pack-objects pack && + # The second pack will contain the excluded object and be kept + packid=$(grep "bar.t" objs | git pack-objects pack) && + >pack-$packid.keep && + + # Replace the existing pack with the 2 new ones + rm -f objects/pack/pack* && + mv pack-* objects/pack/ + ) +} + +test_expect_success '--filter works with .keep packs' ' + prepare_for_keep_packs && + ( + cd keep-packs.git && + + foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) && + bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) && + head_pack=$(test-tool find-pack -c 1 HEAD) && + + test "$foo_pack" != "$bar_pack" && + test "$foo_pack" = "$head_pack" && + + git -c repack.writebitmaps=false repack -a -d --filter=blob:none && + + foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) && + bar_pack_1=$(test-tool find-pack -c 1 HEAD:bar.t) && + head_pack_1=$(test-tool find-pack -c 1 HEAD) && + + # Object bar is still only in the old .keep pack + test "$foo_pack_1" != "$foo_pack" && + test "$bar_pack_1" = "$bar_pack" && + test "$head_pack_1" != "$head_pack" && + + test "$foo_pack_1" != "$bar_pack_1" && + test "$foo_pack_1" != "$head_pack_1" && + test "$bar_pack_1" != "$head_pack_1" + ) +' + +test_expect_success '--filter works with --pack-kept-objects and .keep packs' ' + rm -rf keep-packs keep-packs.git && + prepare_for_keep_packs && + ( + cd keep-packs.git && + + foo_pack=$(test-tool find-pack -c 1 HEAD:foo.t) && + bar_pack=$(test-tool find-pack -c 1 HEAD:bar.t) && + head_pack=$(test-tool find-pack -c 1 HEAD) && + + test "$foo_pack" != "$bar_pack" && + test "$foo_pack" = "$head_pack" && + + git -c repack.writebitmaps=false repack -a -d --filter=blob:none \ + --pack-kept-objects && + + foo_pack_1=$(test-tool find-pack -c 1 HEAD:foo.t) && + test-tool find-pack -c 2 HEAD:bar.t >bar_pack_1 && + head_pack_1=$(test-tool find-pack -c 1 HEAD) && + + test "$foo_pack_1" != "$foo_pack" && + test "$foo_pack_1" != "$bar_pack" && + test "$head_pack_1" != "$head_pack" && + + # Object bar is in both the old .keep pack and the new + # pack that contained the filtered out objects + grep "$bar_pack" bar_pack_1 && + grep "$foo_pack_1" bar_pack_1 && + test "$foo_pack_1" != "$head_pack_1" + ) +' + +test_expect_success '--filter-to stores filtered out objects' ' + git -C bare.git repack -a -d && + test_stdout_line_count = 1 ls bare.git/objects/pack/*.pack && + + git init --bare filtered.git && + git -C bare.git -c repack.writebitmaps=false repack -a -d \ + --filter=blob:none \ + --filter-to=../filtered.git/objects/pack/pack && + test_stdout_line_count = 1 ls bare.git/objects/pack/pack-*.pack && + test_stdout_line_count = 1 ls filtered.git/objects/pack/pack-*.pack && + + commit_pack=$(test-tool -C bare.git find-pack -c 1 HEAD) && + blob_pack=$(test-tool -C bare.git find-pack -c 0 HEAD:file1) && + blob_hash=$(git -C bare.git rev-parse HEAD:file1) && + test -n "$blob_hash" && + blob_pack=$(test-tool -C filtered.git find-pack -c 1 $blob_hash) && + + echo $(pwd)/filtered.git/objects >bare.git/objects/info/alternates && + blob_pack=$(test-tool -C bare.git find-pack -c 1 HEAD:file1) && + blob_content=$(git -C bare.git show $blob_hash) && + test "$blob_content" = "content1" +' + +test_expect_success '--filter works with --max-pack-size' ' + rm -rf filtered.git && + git init --bare filtered.git && + git init max-pack-size && + ( + cd max-pack-size && + test_commit base && + # two blobs which exceed the maximum pack size + test-tool genrandom foo 1048576 >foo && + git hash-object -w foo && + test-tool genrandom bar 1048576 >bar && + git hash-object -w bar && + git add foo bar && + git commit -m "adding foo and bar" + ) && + git clone --no-local --bare max-pack-size max-pack-size.git && + ( + cd max-pack-size.git && + git -c repack.writebitmaps=false repack -a -d --filter=blob:none \ + --max-pack-size=1M \ + --filter-to=../filtered.git/objects/pack/pack && + echo $(cd .. && pwd)/filtered.git/objects >objects/info/alternates && + + # Check that the 3 blobs are in different packfiles in filtered.git + test_stdout_line_count = 3 ls ../filtered.git/objects/pack/pack-*.pack && + test_stdout_line_count = 1 ls objects/pack/pack-*.pack && + foo_pack=$(test-tool find-pack -c 1 HEAD:foo) && + bar_pack=$(test-tool find-pack -c 1 HEAD:bar) && + base_pack=$(test-tool find-pack -c 1 HEAD:base.t) && + test "$foo_pack" != "$bar_pack" && + test "$foo_pack" != "$base_pack" && + test "$bar_pack" != "$base_pack" && + for pack in "$foo_pack" "$bar_pack" "$base_pack" + do + case "$foo_pack" in */filtered.git/objects/pack/*) true ;; *) return 1 ;; esac + done + ) +' + objdir=.git/objects midx=$objdir/pack/multi-pack-index @@ -633,125 +830,4 @@ test_expect_success '-n overrides repack.updateServerInfo=true' ' test_server_info_missing ' -test_expect_success '--expire-to stores pruned objects (now)' ' - git init expire-to-now && - ( - cd expire-to-now && - - git branch -M main && - - test_commit base && - - git checkout -b cruft && - test_commit --no-tag cruft && - - git rev-list --objects --no-object-names main..cruft >moved.raw && - sort moved.raw >moved.want && - - git rev-list --all --objects --no-object-names >expect.raw && - sort expect.raw >expect && - - git checkout main && - git branch -D cruft && - git reflog expire --all --expire=all && - - git init --bare expired.git && - git repack -d \ - --cruft --cruft-expiration="now" \ - --expire-to="expired.git/objects/pack/pack" && - - expired="$(ls expired.git/objects/pack/pack-*.idx)" && - test_path_is_file "${expired%.idx}.mtimes" && - - # Since the `--cruft-expiration` is "now", the effective - # behavior is to move _all_ unreachable objects out to - # the location in `--expire-to`. - git show-index <$expired >expired.raw && - cut -d" " -f2 expired.raw | sort >expired.objects && - git rev-list --all --objects --no-object-names \ - >remaining.objects && - - # ...in other words, the combined contents of this - # repository and expired.git should be the same as the - # set of objects we started with. - cat expired.objects remaining.objects | sort >actual && - test_cmp expect actual && - - # The "moved" objects (i.e., those in expired.git) - # should be the same as the cruft objects which were - # expired in the previous step. - test_cmp moved.want expired.objects - ) -' - -test_expect_success '--expire-to stores pruned objects (5.minutes.ago)' ' - git init expire-to-5.minutes.ago && - ( - cd expire-to-5.minutes.ago && - - git branch -M main && - - test_commit base && - - # Create two classes of unreachable objects, one which - # is older than 5 minutes (stale), and another which is - # newer (recent). - for kind in stale recent - do - git checkout -b $kind main && - test_commit --no-tag $kind || return 1 - done && - - git rev-list --objects --no-object-names main..stale >in && - stale="$(git pack-objects $objdir/pack/pack <in)" && - mtime="$(test-tool chmtime --get =-600 $objdir/pack/pack-$stale.pack)" && - - # expect holds the set of objects we expect to find in - # this repository after repacking - git rev-list --objects --no-object-names recent >expect.raw && - sort expect.raw >expect && - - # moved.want holds the set of objects we expect to find - # in expired.git - git rev-list --objects --no-object-names main..stale >out && - sort out >moved.want && - - git checkout main && - git branch -D stale recent && - git reflog expire --all --expire=all && - git prune-packed && - - git init --bare expired.git && - git repack -d \ - --cruft --cruft-expiration=5.minutes.ago \ - --expire-to="expired.git/objects/pack/pack" && - - # Some of the remaining objects in this repository are - # unreachable, so use `cat-file --batch-all-objects` - # instead of `rev-list` to get their names - git cat-file --batch-all-objects --batch-check="%(objectname)" \ - >remaining.objects && - sort remaining.objects >actual && - test_cmp expect actual && - - ( - cd expired.git && - - expired="$(ls objects/pack/pack-*.mtimes)" && - test-tool pack-mtimes $(basename $expired) >out && - cut -d" " -f1 out | sort >../moved.got && - - # Ensure that there are as many objects with the - # expected mtime as were moved to expired.git. - # - # In other words, ensure that the recorded - # mtimes of any moved objects was written - # correctly. - grep " $mtime$" out >matching && - test_line_count = $(wc -l <../moved.want) matching - ) && - test_cmp moved.want moved.got - ) -' - test_done diff --git a/t/t7703-repack-geometric.sh b/t/t7703-repack-geometric.sh index 00f28fb558..9fc1626fbf 100755 --- a/t/t7703-repack-geometric.sh +++ b/t/t7703-repack-geometric.sh @@ -23,7 +23,7 @@ test_expect_success '--geometric with no packs' ' cd geometric && git repack --write-midx --geometric 2 >out && - test_i18ngrep "Nothing new to pack" out + test_grep "Nothing new to pack" out ) ' @@ -38,7 +38,7 @@ test_expect_success '--geometric with one pack' ' git repack --geometric 2 >out && - test_i18ngrep "Nothing new to pack" out + test_grep "Nothing new to pack" out ) ' diff --git a/t/t7704-repack-cruft.sh b/t/t7704-repack-cruft.sh new file mode 100755 index 0000000000..be3735dff0 --- /dev/null +++ b/t/t7704-repack-cruft.sh @@ -0,0 +1,414 @@ +#!/bin/sh + +test_description='git repack works correctly' + +. ./test-lib.sh + +objdir=.git/objects +packdir=$objdir/pack + +test_expect_success '--expire-to stores pruned objects (now)' ' + git init expire-to-now && + ( + cd expire-to-now && + + git branch -M main && + + test_commit base && + + git checkout -b cruft && + test_commit --no-tag cruft && + + git rev-list --objects --no-object-names main..cruft >moved.raw && + sort moved.raw >moved.want && + + git rev-list --all --objects --no-object-names >expect.raw && + sort expect.raw >expect && + + git checkout main && + git branch -D cruft && + git reflog expire --all --expire=all && + + git init --bare expired.git && + git repack -d \ + --cruft --cruft-expiration="now" \ + --expire-to="expired.git/objects/pack/pack" && + + expired="$(ls expired.git/objects/pack/pack-*.idx)" && + test_path_is_file "${expired%.idx}.mtimes" && + + # Since the `--cruft-expiration` is "now", the effective + # behavior is to move _all_ unreachable objects out to + # the location in `--expire-to`. + git show-index <$expired >expired.raw && + cut -d" " -f2 expired.raw | sort >expired.objects && + git rev-list --all --objects --no-object-names \ + >remaining.objects && + + # ...in other words, the combined contents of this + # repository and expired.git should be the same as the + # set of objects we started with. + cat expired.objects remaining.objects | sort >actual && + test_cmp expect actual && + + # The "moved" objects (i.e., those in expired.git) + # should be the same as the cruft objects which were + # expired in the previous step. + test_cmp moved.want expired.objects + ) +' + +test_expect_success '--expire-to stores pruned objects (5.minutes.ago)' ' + git init expire-to-5.minutes.ago && + ( + cd expire-to-5.minutes.ago && + + git branch -M main && + + test_commit base && + + # Create two classes of unreachable objects, one which + # is older than 5 minutes (stale), and another which is + # newer (recent). + for kind in stale recent + do + git checkout -b $kind main && + test_commit --no-tag $kind || return 1 + done && + + git rev-list --objects --no-object-names main..stale >in && + stale="$(git pack-objects $objdir/pack/pack <in)" && + mtime="$(test-tool chmtime --get =-600 $objdir/pack/pack-$stale.pack)" && + + # expect holds the set of objects we expect to find in + # this repository after repacking + git rev-list --objects --no-object-names recent >expect.raw && + sort expect.raw >expect && + + # moved.want holds the set of objects we expect to find + # in expired.git + git rev-list --objects --no-object-names main..stale >out && + sort out >moved.want && + + git checkout main && + git branch -D stale recent && + git reflog expire --all --expire=all && + git prune-packed && + + git init --bare expired.git && + git repack -d \ + --cruft --cruft-expiration=5.minutes.ago \ + --expire-to="expired.git/objects/pack/pack" && + + # Some of the remaining objects in this repository are + # unreachable, so use `cat-file --batch-all-objects` + # instead of `rev-list` to get their names + git cat-file --batch-all-objects --batch-check="%(objectname)" \ + >remaining.objects && + sort remaining.objects >actual && + test_cmp expect actual && + + ( + cd expired.git && + + expired="$(ls objects/pack/pack-*.mtimes)" && + test-tool pack-mtimes $(basename $expired) >out && + cut -d" " -f1 out | sort >../moved.got && + + # Ensure that there are as many objects with the + # expected mtime as were moved to expired.git. + # + # In other words, ensure that the recorded + # mtimes of any moved objects was written + # correctly. + grep " $mtime$" out >matching && + test_line_count = $(wc -l <../moved.want) matching + ) && + test_cmp moved.want moved.got + ) +' + +generate_random_blob() { + test-tool genrandom "$@" >blob && + git hash-object -w -t blob blob && + rm blob +} + +pack_random_blob () { + generate_random_blob "$@" && + git repack -d -q >/dev/null +} + +generate_cruft_pack () { + pack_random_blob "$@" >/dev/null && + + ls $packdir/pack-*.pack | xargs -n 1 basename >in && + pack="$(git pack-objects --cruft $packdir/pack <in)" && + git prune-packed && + + echo "$packdir/pack-$pack.mtimes" +} + +test_expect_success '--max-cruft-size creates new packs when above threshold' ' + git init max-cruft-size-large && + ( + cd max-cruft-size-large && + test_commit base && + + foo="$(pack_random_blob foo $((1*1024*1024)))" && + git repack --cruft -d && + cruft_foo="$(ls $packdir/pack-*.mtimes)" && + + bar="$(pack_random_blob bar $((1*1024*1024)))" && + git repack --cruft -d --max-cruft-size=1M && + cruft_bar="$(ls $packdir/pack-*.mtimes | grep -v $cruft_foo)" && + + test-tool pack-mtimes $(basename "$cruft_foo") >foo.objects && + test-tool pack-mtimes $(basename "$cruft_bar") >bar.objects && + + grep "^$foo" foo.objects && + test_line_count = 1 foo.objects && + grep "^$bar" bar.objects && + test_line_count = 1 bar.objects + ) +' + +test_expect_success '--max-cruft-size combines existing packs when below threshold' ' + git init max-cruft-size-small && + ( + cd max-cruft-size-small && + test_commit base && + + foo="$(pack_random_blob foo $((1*1024*1024)))" && + git repack --cruft -d && + + bar="$(pack_random_blob bar $((1*1024*1024)))" && + git repack --cruft -d --max-cruft-size=10M && + + cruft=$(ls $packdir/pack-*.mtimes) && + test-tool pack-mtimes $(basename "$cruft") >cruft.objects && + + grep "^$foo" cruft.objects && + grep "^$bar" cruft.objects && + test_line_count = 2 cruft.objects + ) +' + +test_expect_success '--max-cruft-size combines smaller packs first' ' + git init max-cruft-size-consume-small && + ( + cd max-cruft-size-consume-small && + + test_commit base && + git repack -ad && + + cruft_foo="$(generate_cruft_pack foo 524288)" && # 0.5 MiB + cruft_bar="$(generate_cruft_pack bar 524288)" && # 0.5 MiB + cruft_baz="$(generate_cruft_pack baz 1048576)" && # 1.0 MiB + cruft_quux="$(generate_cruft_pack quux 1572864)" && # 1.5 MiB + + test-tool pack-mtimes "$(basename $cruft_foo)" >expect.raw && + test-tool pack-mtimes "$(basename $cruft_bar)" >>expect.raw && + sort expect.raw >expect.objects && + + # repacking with `--max-cruft-size=2M` should combine + # both 0.5 MiB packs together, instead of, say, one of + # the 0.5 MiB packs with the 1.0 MiB pack + ls $packdir/pack-*.mtimes | sort >cruft.before && + git repack -d --cruft --max-cruft-size=2M && + ls $packdir/pack-*.mtimes | sort >cruft.after && + + comm -13 cruft.before cruft.after >cruft.new && + comm -23 cruft.before cruft.after >cruft.removed && + + test_line_count = 1 cruft.new && + test_line_count = 2 cruft.removed && + + # the two smaller packs should be rolled up first + printf "%s\n" $cruft_foo $cruft_bar | sort >expect.removed && + test_cmp expect.removed cruft.removed && + + # ...and contain the set of objects rolled up + test-tool pack-mtimes "$(basename $(cat cruft.new))" >actual.raw && + sort actual.raw >actual.objects && + + test_cmp expect.objects actual.objects + ) +' + +test_expect_success 'setup --max-cruft-size with freshened objects' ' + git init max-cruft-size-freshen && + ( + cd max-cruft-size-freshen && + + test_commit base && + git repack -ad && + + foo="$(generate_random_blob foo 64)" && + test-tool chmtime --get -10000 \ + "$objdir/$(test_oid_to_path "$foo")" >foo.mtime && + + git repack --cruft -d && + + cruft="$(ls $packdir/pack-*.mtimes)" && + test-tool pack-mtimes "$(basename $cruft)" >actual && + echo "$foo $(cat foo.mtime)" >expect && + test_cmp expect actual + ) +' + +test_expect_success '--max-cruft-size with freshened objects (loose)' ' + ( + cd max-cruft-size-freshen && + + # regenerate the object, setting its mtime to be more recent + foo="$(generate_random_blob foo 64)" && + test-tool chmtime --get -100 \ + "$objdir/$(test_oid_to_path "$foo")" >foo.mtime && + + git repack --cruft -d && + + cruft="$(ls $packdir/pack-*.mtimes)" && + test-tool pack-mtimes "$(basename $cruft)" >actual && + echo "$foo $(cat foo.mtime)" >expect && + test_cmp expect actual + ) +' + +test_expect_success '--max-cruft-size with freshened objects (packed)' ' + ( + cd max-cruft-size-freshen && + + # regenerate the object and store it in a packfile, + # setting its mtime to be more recent + # + # store it alongside another cruft object so that we + # do not create an identical copy of the existing + # cruft pack (which contains $foo). + foo="$(generate_random_blob foo 64)" && + bar="$(generate_random_blob bar 64)" && + foo_pack="$(printf "%s\n" $foo $bar | git pack-objects $packdir/pack)" && + git prune-packed && + + test-tool chmtime --get -10 \ + "$packdir/pack-$foo_pack.pack" >foo.mtime && + + git repack --cruft -d && + + cruft="$(ls $packdir/pack-*.mtimes)" && + test-tool pack-mtimes "$(basename $cruft)" >actual && + echo "$foo $(cat foo.mtime)" >expect.raw && + echo "$bar $(cat foo.mtime)" >>expect.raw && + sort expect.raw >expect && + test_cmp expect actual + ) +' + +test_expect_success '--max-cruft-size with pruning' ' + git init max-cruft-size-prune && + ( + cd max-cruft-size-prune && + + test_commit base && + foo="$(generate_random_blob foo $((1024*1024)))" && + bar="$(generate_random_blob bar $((1024*1024)))" && + baz="$(generate_random_blob baz $((1024*1024)))" && + + test-tool chmtime -10000 "$objdir/$(test_oid_to_path "$foo")" && + + git repack -d --cruft --max-cruft-size=1M && + + # backdate the mtimes of all cruft packs to validate + # that they were rewritten as a result of pruning + ls $packdir/pack-*.mtimes | sort >cruft.before && + for cruft in $(cat cruft.before) + do + mtime="$(test-tool chmtime --get -10000 "$cruft")" && + echo $cruft $mtime >>mtimes || return 1 + done && + + # repack (and prune) with a --max-cruft-size to ensure + # that we appropriately split the resulting set of packs + git repack -d --cruft --max-cruft-size=1M \ + --cruft-expiration=10.seconds.ago && + ls $packdir/pack-*.mtimes | sort >cruft.after && + + for cruft in $(cat cruft.after) + do + old_mtime="$(grep $cruft mtimes | cut -d" " -f2)" && + new_mtime="$(test-tool chmtime --get $cruft)" && + test $old_mtime -lt $new_mtime || return 1 + done && + + test_line_count = 3 cruft.before && + test_line_count = 2 cruft.after && + test_must_fail git cat-file -e $foo && + git cat-file -e $bar && + git cat-file -e $baz + ) +' + +test_expect_success '--max-cruft-size ignores non-local packs' ' + repo="max-cruft-size-non-local" && + git init $repo && + ( + cd $repo && + test_commit base && + generate_random_blob foo 64 && + git repack --cruft -d + ) && + + git clone --reference=$repo $repo $repo-alt && + ( + cd $repo-alt && + + test_commit other && + generate_random_blob bar 64 && + + # ensure that we do not attempt to pick up packs from + # the non-alternated repository, which would result in a + # crash + git repack --cruft --max-cruft-size=1M -d + ) +' + +test_expect_success 'reachable packs are preferred over cruft ones' ' + repo="cruft-preferred-packs" && + git init "$repo" && + ( + cd "$repo" && + + # This test needs to exercise careful control over when a MIDX + # is and is not written. Unset the corresponding TEST variable + # accordingly. + sane_unset GIT_TEST_MULTI_PACK_INDEX && + + test_commit base && + test_commit --no-tag cruft && + + non_cruft="$(echo base | git pack-objects --revs $packdir/pack)" && + # Write a cruft pack which both (a) sorts ahead of the non-cruft + # pack in lexical order, and (b) has an older mtime to appease + # the MIDX preferred pack selection routine. + cruft="$(echo pack-$non_cruft.pack | git pack-objects --cruft $packdir/pack-A)" && + test-tool chmtime -1000 $packdir/pack-A-$cruft.pack && + + test_commit other && + git repack -d && + + git repack --geometric 2 -d --write-midx --write-bitmap-index && + + # After repacking, there are two packs left: one reachable one + # (which is the result of combining both of the existing two + # non-cruft packs), and one cruft pack. + find .git/objects/pack -type f -name "*.pack" >packs && + test_line_count = 2 packs && + + # Make sure that the pack we just wrote is marked as preferred, + # not the cruft one. + pack="$(test-tool read-midx --preferred-pack $objdir)" && + test_path_is_missing "$packdir/$(basename "$pack" ".idx").mtimes" + ) +' + +test_done diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh index 59d3847bf8..6a36be1e63 100755 --- a/t/t7800-difftool.sh +++ b/t/t7800-difftool.sh @@ -28,14 +28,14 @@ prompt_given () test_expect_success 'basic usage requires no repo' ' test_expect_code 129 git difftool -h >output && - test_i18ngrep ^usage: output && + test_grep ^usage: output && # create a ceiling directory to prevent Git from finding a repo mkdir -p not/repo && test_when_finished rm -r not && test_expect_code 129 \ env GIT_CEILING_DIRECTORIES="$(pwd)/not" \ git -C not/repo difftool -h >output && - test_i18ngrep ^usage: output + test_grep ^usage: output ' # Create a file on main and change it on branch diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh index 39d6d713ec..875dcfd98f 100755 --- a/t/t7810-grep.sh +++ b/t/t7810-grep.sh @@ -808,6 +808,19 @@ test_expect_success 'grep -f, ignore empty lines, read patterns from stdin' ' test_cmp expected actual ' +test_expect_success 'grep -f, use cwd relative file' ' + test_when_finished "git rm -f sub/dir/file" && + mkdir -p sub/dir && + echo hit >sub/dir/file && + git add sub/dir/file && + echo hit >sub/dir/pattern && + echo miss >pattern && + ( + cd sub/dir && git grep -f pattern file + ) && + git -C sub/dir grep -f pattern file +' + cat >expected <<EOF y:y yy -- @@ -1234,6 +1247,33 @@ test_expect_success 'outside of git repository with fallbackToNoIndex' ' ) ' +test_expect_success 'no repository with path outside $cwd' ' + test_when_finished rm -fr non && + rm -fr non && + mkdir -p non/git/sub non/tig && + ( + GIT_CEILING_DIRECTORIES="$(pwd)/non" && + export GIT_CEILING_DIRECTORIES && + cd non/git && + test_expect_code 128 git grep --no-index search .. 2>error && + grep "is outside the directory tree" error + ) && + ( + GIT_CEILING_DIRECTORIES="$(pwd)/non" && + export GIT_CEILING_DIRECTORIES && + cd non/git && + test_expect_code 128 git grep --no-index search ../tig 2>error && + grep "is outside the directory tree" error + ) && + ( + GIT_CEILING_DIRECTORIES="$(pwd)/non" && + export GIT_CEILING_DIRECTORIES && + cd non/git && + test_expect_code 128 git grep --no-index search ../non 2>error && + grep "no such path in the working tree" error + ) +' + test_expect_success 'inside git repository but with --no-index' ' rm -fr is && mkdir -p is/git/sub && @@ -1386,7 +1426,7 @@ test_expect_success 'grep --no-index pattern -- path' ' test_expect_success 'grep --no-index complains of revs' ' test_must_fail git grep --no-index o main -- 2>err && - test_i18ngrep "cannot be used with revs" err + test_grep "cannot be used with revs" err ' test_expect_success 'grep --no-index prefers paths to revs' ' @@ -1399,7 +1439,7 @@ test_expect_success 'grep --no-index prefers paths to revs' ' test_expect_success 'grep --no-index does not "diagnose" revs' ' test_must_fail git grep --no-index o :1:hello.c 2>err && - test_i18ngrep ! -i "did you mean" err + test_grep ! -i "did you mean" err ' cat >expected <<EOF diff --git a/t/t7811-grep-open.sh b/t/t7811-grep-open.sh index 1dd07141a7..fe38d88a1a 100755 --- a/t/t7811-grep-open.sh +++ b/t/t7811-grep-open.sh @@ -63,7 +63,7 @@ test_expect_success SIMPLEPAGER 'git grep -O' ' test_expect_success 'git grep -O --cached' ' test_must_fail git grep --cached -O GREP_PATTERN >out 2>msg && - test_i18ngrep open-files-in-pager msg + test_grep open-files-in-pager msg ' test_expect_success 'git grep -O --no-index' ' diff --git a/t/t7814-grep-recurse-submodules.sh b/t/t7814-grep-recurse-submodules.sh index d37c83b464..167fe66150 100755 --- a/t/t7814-grep-recurse-submodules.sh +++ b/t/t7814-grep-recurse-submodules.sh @@ -348,7 +348,7 @@ test_incompatible_with_recurse_submodules () { test_expect_success "--recurse-submodules and $1 are incompatible" " test_must_fail git grep -e. --recurse-submodules $1 2>actual && - test_i18ngrep 'not supported with --recurse-submodules' actual + test_grep 'not supported with --recurse-submodules' actual " } diff --git a/t/t7816-grep-binary-pattern.sh b/t/t7816-grep-binary-pattern.sh index fdb2355649..4353be5adb 100755 --- a/t/t7816-grep-binary-pattern.sh +++ b/t/t7816-grep-binary-pattern.sh @@ -26,7 +26,7 @@ nul_match_internal () { >stderr && printf '$pattern' | q_to_nul >f && test_must_fail env LC_ALL=\"$lc_all\" git grep $extra_flags -f f $flags a 2>stderr && - test_i18ngrep ! 'This is only supported with -P under PCRE v2' stderr + test_grep ! 'This is only supported with -P under PCRE v2' stderr " elif test "$matches" = P then @@ -34,7 +34,7 @@ nul_match_internal () { >stderr && printf '$pattern' | q_to_nul >f && test_must_fail env LC_ALL=\"$lc_all\" git grep -f f $flags a 2>stderr && - test_i18ngrep 'This is only supported with -P under PCRE v2' stderr + test_grep 'This is only supported with -P under PCRE v2' stderr " else test_expect_success "PANIC: Test framework error. Unknown matches value $matches" 'false' diff --git a/t/t7900-maintenance.sh b/t/t7900-maintenance.sh index 487e326b3f..935df6a1db 100755 --- a/t/t7900-maintenance.sh +++ b/t/t7900-maintenance.sh @@ -33,13 +33,13 @@ test_systemd_analyze_verify () { test_expect_success 'help text' ' test_expect_code 129 git maintenance -h >actual && - test_i18ngrep "usage: git maintenance <subcommand>" actual && + test_grep "usage: git maintenance <subcommand>" actual && test_expect_code 129 git maintenance barf 2>err && - test_i18ngrep "unknown subcommand: \`barf'\''" err && - test_i18ngrep "usage: git maintenance" err && + test_grep "unknown subcommand: \`barf'\''" err && + test_grep "usage: git maintenance" err && test_expect_code 129 git maintenance 2>err && - test_i18ngrep "error: need a subcommand" err && - test_i18ngrep "usage: git maintenance" err + test_grep "error: need a subcommand" err && + test_grep "usage: git maintenance" err ' test_expect_success 'run [--auto|--quiet]' ' @@ -131,12 +131,12 @@ test_expect_success 'commit-graph auto condition' ' test_expect_success 'run --task=bogus' ' test_must_fail git maintenance run --task=bogus 2>err && - test_i18ngrep "is not a valid task" err + test_grep "is not a valid task" err ' test_expect_success 'run --task duplicate' ' test_must_fail git maintenance run --task=gc --task=gc 2>err && - test_i18ngrep "cannot be selected multiple times" err + test_grep "cannot be selected multiple times" err ' test_expect_success 'run --task=prefetch with no remotes' ' @@ -377,12 +377,12 @@ test_expect_success 'pack-refs task' ' test_expect_success '--auto and --schedule incompatible' ' test_must_fail git maintenance run --auto --schedule=daily 2>err && - test_i18ngrep "at most one" err + test_grep "at most one" err ' test_expect_success 'invalid --schedule value' ' test_must_fail git maintenance run --schedule=annually 2>err && - test_i18ngrep "unrecognized --schedule" err + test_grep "unrecognized --schedule" err ' test_expect_success '--schedule inheritance weekly -> daily -> hourly' ' @@ -576,15 +576,15 @@ test_expect_success !MINGW 'register and unregister with regex metacharacters' ' test_expect_success 'start --scheduler=<scheduler>' ' test_expect_code 129 git maintenance start --scheduler=foo 2>err && - test_i18ngrep "unrecognized --scheduler argument" err && + test_grep "unrecognized --scheduler argument" err && test_expect_code 129 git maintenance start --no-scheduler 2>err && - test_i18ngrep "unknown option" err && + test_grep "unknown option" err && test_expect_code 128 \ env GIT_TEST_MAINT_SCHEDULER="launchctl:true,schtasks:true" \ git maintenance start --scheduler=crontab 2>err && - test_i18ngrep "fatal: crontab scheduler is not available" err + test_grep "fatal: crontab scheduler is not available" err ' test_expect_success 'start from empty cron table' ' @@ -744,7 +744,15 @@ test_expect_success 'start and stop Linux/systemd maintenance' ' # start registers the repo git config --get --global --fixed-value maintenance.repo "$(pwd)" && - test_systemd_analyze_verify "systemd/user/git-maintenance@.service" && + for schedule in hourly daily weekly + do + test_path_is_file "systemd/user/git-maintenance@$schedule.timer" || return 1 + done && + test_path_is_file "systemd/user/git-maintenance@.service" && + + test_systemd_analyze_verify "systemd/user/git-maintenance@hourly.service" && + test_systemd_analyze_verify "systemd/user/git-maintenance@daily.service" && + test_systemd_analyze_verify "systemd/user/git-maintenance@weekly.service" && printf -- "--user enable --now git-maintenance@%s.timer\n" hourly daily weekly >expect && test_cmp expect args && @@ -755,7 +763,10 @@ test_expect_success 'start and stop Linux/systemd maintenance' ' # stop does not unregister the repo git config --get --global --fixed-value maintenance.repo "$(pwd)" && - test_path_is_missing "systemd/user/git-maintenance@.timer" && + for schedule in hourly daily weekly + do + test_path_is_missing "systemd/user/git-maintenance@$schedule.timer" || return 1 + done && test_path_is_missing "systemd/user/git-maintenance@.service" && printf -- "--user disable --now git-maintenance@%s.timer\n" hourly daily weekly >expect && @@ -838,4 +849,17 @@ test_expect_success 'register and unregister bare repo' ' ) ' +test_expect_success 'failed schedule prevents config change' ' + git init --bare failcase && + + for scheduler in crontab launchctl schtasks systemctl + do + GIT_TEST_MAINT_SCHEDULER="$scheduler:false" && + export GIT_TEST_MAINT_SCHEDULER && + test_must_fail \ + git -C failcase maintenance start && + test_must_fail git -C failcase config maintenance.auto || return 1 + done +' + test_done diff --git a/t/t8003-blame-corner-cases.sh b/t/t8003-blame-corner-cases.sh index 8bcd39e81b..731265541a 100755 --- a/t/t8003-blame-corner-cases.sh +++ b/t/t8003-blame-corner-cases.sh @@ -207,7 +207,7 @@ EOF test_expect_success 'blame -L with invalid start' ' test_must_fail git blame -L5 tres 2>errors && - test_i18ngrep "has only 2 lines" errors + test_grep "has only 2 lines" errors ' test_expect_success 'blame -L with invalid end' ' diff --git a/t/t8013-blame-ignore-revs.sh b/t/t8013-blame-ignore-revs.sh index b18633dee1..9a03b0f361 100755 --- a/t/t8013-blame-ignore-revs.sh +++ b/t/t8013-blame-ignore-revs.sh @@ -129,14 +129,14 @@ test_expect_success override_ignore_revs_file ' ' test_expect_success bad_files_and_revs ' test_must_fail git blame file --ignore-rev NOREV 2>err && - test_i18ngrep "cannot find revision NOREV to ignore" err && + test_grep "cannot find revision NOREV to ignore" err && test_must_fail git blame file --ignore-revs-file NOFILE 2>err && - test_i18ngrep "could not open.*: NOFILE" err && + test_grep "could not open.*: NOFILE" err && echo NOREV >ignore_norev && test_must_fail git blame file --ignore-revs-file ignore_norev 2>err && - test_i18ngrep "invalid object name: NOREV" err + test_grep "invalid object name: NOREV" err ' # For ignored revs that have added 'unblamable' lines, mark those lines with a diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 263db3ad17..5a771000c9 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -371,7 +371,7 @@ test_expect_success $PREREQ,!AUTOIDENT 'broken implicit ident aborts send-email' --smtp-server="$(pwd)/fake.sendmail" \ --to=to@example.com \ $patches </dev/null 2>errors && - test_i18ngrep "tell me who you are" errors + test_grep "tell me who you are" errors ) ' @@ -633,6 +633,25 @@ test_expect_success $PREREQ "--validate respects absolute core.hooksPath path" ' test_cmp expect actual ' +test_expect_success $PREREQ "--validate hook supports multiple addresses in arguments" ' + hooks_path="$(pwd)/my-hooks" && + test_config core.hooksPath "$hooks_path" && + test_when_finished "rm my-hooks.ran" && + test_must_fail git send-email \ + --from="Example <nobody@example.com>" \ + --to=nobody@example.com,abc@example.com \ + --smtp-server="$(pwd)/fake.sendmail" \ + --validate \ + longline.patch 2>actual && + test_path_is_file my-hooks.ran && + cat >expect <<-EOF && + fatal: longline.patch: rejected by sendemail-validate hook + fatal: command '"'"'git hook run --ignore-missing sendemail-validate -- <patch> <header>'"'"' died with exit code 1 + warning: no patches were sent + EOF + test_cmp expect actual +' + test_expect_success $PREREQ "--validate hook supports header argument" ' write_script my-hooks/sendemail-validate <<-\EOF && if test "$#" -ge 2 @@ -2062,7 +2081,7 @@ test_expect_success $PREREQ 'aliases and sendemail.identity' ' -c sendemail.aliasesfile=default-aliases \ -c sendemail.cloud.aliasesfile=cloud-aliases \ send-email -1 2>stderr && - test_i18ngrep "cloud-aliases" stderr + test_grep "cloud-aliases" stderr ' test_sendmail_aliases () { @@ -2427,7 +2446,7 @@ test_expect_success $PREREQ 'invoke hook' ' --to=nobody@example.com \ --smtp-server="$(pwd)/../fake.sendmail" \ ../another.patch 2>err && - test_i18ngrep "rejected by sendemail-validate hook" err + test_grep "rejected by sendemail-validate hook" err ) ' @@ -2483,7 +2502,7 @@ test_expect_success $PREREQ 'test that sendmail config is rejected' ' --to=nobody@example.com \ --smtp-server="$(pwd)/fake.sendmail" \ HEAD^ 2>err && - test_i18ngrep "found configuration options for '"'"sendmail"'"'" err + test_grep "found configuration options for '"'"sendmail"'"'" err ' test_expect_success $PREREQ 'test that sendmail config rejection is specific' ' @@ -2505,4 +2524,45 @@ test_expect_success $PREREQ 'test forbidSendmailVariables behavior override' ' HEAD^ ' +test_expect_success $PREREQ '--compose handles lowercase headers' ' + write_script fake-editor <<-\EOF && + sed "s/^From:.*/from: edited-from@example.com/i" "$1" >"$1.tmp" && + mv "$1.tmp" "$1" + EOF + clean_fake_sendmail && + git send-email \ + --compose \ + --from="Example <from@example.com>" \ + --to=nobody@example.com \ + --smtp-server="$(pwd)/fake.sendmail" \ + HEAD^ && + grep "From: edited-from@example.com" msgtxt1 +' + +test_expect_success $PREREQ '--compose handles to headers' ' + write_script fake-editor <<-\EOF && + sed "s/^To: .*/&, edited-to@example.com/" <"$1" >"$1.tmp" && + echo this is the body >>"$1.tmp" && + mv "$1.tmp" "$1" + EOF + clean_fake_sendmail && + GIT_SEND_EMAIL_NOTTY=1 \ + git send-email \ + --compose \ + --from="Example <from@example.com>" \ + --to=nobody@example.com \ + --smtp-server="$(pwd)/fake.sendmail" \ + HEAD^ && + # Check both that the cover letter used our modified "to" line, + # but also that it was picked up for the patch. + q_to_tab >expect <<-\EOF && + To: nobody@example.com, + Qedited-to@example.com + EOF + grep -A1 "^To:" msgtxt1 >msgtxt1.to && + test_cmp expect msgtxt1.to && + grep -A1 "^To:" msgtxt2 >msgtxt2.to && + test_cmp expect msgtxt2.to +' + test_done diff --git a/t/t9002-column.sh b/t/t9002-column.sh index 6d3dbde3fe..348cc40658 100755 --- a/t/t9002-column.sh +++ b/t/t9002-column.sh @@ -1,6 +1,7 @@ #!/bin/sh test_description='git column' +TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh test_expect_success 'setup' ' diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh index 32317d6bca..e06538b1c8 100755 --- a/t/t9114-git-svn-dcommit-merge.sh +++ b/t/t9114-git-svn-dcommit-merge.sh @@ -27,7 +27,7 @@ cat << EOF # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see <http://www.gnu.org/licenses/>. +# along with this program; if not, see <https://www.gnu.org/licenses/>. # EOF } diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index ac237a1f90..dbb5042b0b 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -2879,7 +2879,7 @@ test_expect_success 'S: filemodify with garbage after mark must fail' ' COMMIT M 100644 :403x hello.c EOF - test_i18ngrep "space after mark" err + test_grep "space after mark" err ' # inline is misspelled; fast-import thinks it is some unknown dataref @@ -2895,7 +2895,7 @@ test_expect_success 'S: filemodify with garbage after inline must fail' ' inline BLOB EOF - test_i18ngrep "nvalid dataref" err + test_grep "nvalid dataref" err ' test_expect_success 'S: filemodify with garbage after sha1 must fail' ' @@ -2908,7 +2908,7 @@ test_expect_success 'S: filemodify with garbage after sha1 must fail' ' COMMIT M 100644 ${sha1}x hello.c EOF - test_i18ngrep "space after SHA1" err + test_grep "space after SHA1" err ' # @@ -2923,7 +2923,7 @@ test_expect_success 'S: notemodify with garbage after mark dataref must fail' ' COMMIT N :202x :302 EOF - test_i18ngrep "space after mark" err + test_grep "space after mark" err ' test_expect_success 'S: notemodify with garbage after inline dataref must fail' ' @@ -2938,7 +2938,7 @@ test_expect_success 'S: notemodify with garbage after inline dataref must fail' note blob BLOB EOF - test_i18ngrep "nvalid dataref" err + test_grep "nvalid dataref" err ' test_expect_success 'S: notemodify with garbage after sha1 dataref must fail' ' @@ -2951,7 +2951,7 @@ test_expect_success 'S: notemodify with garbage after sha1 dataref must fail' ' COMMIT N ${sha1}x :302 EOF - test_i18ngrep "space after SHA1" err + test_grep "space after SHA1" err ' # @@ -2966,7 +2966,7 @@ test_expect_success 'S: notemodify with garbage after mark commit-ish must fail' COMMIT N :202 :302x EOF - test_i18ngrep "after mark" err + test_grep "after mark" err ' # @@ -2999,7 +2999,7 @@ test_expect_success 'S: from with garbage after mark must fail' ' EOF # now evaluate the error - test_i18ngrep "after mark" err + test_grep "after mark" err ' @@ -3018,7 +3018,7 @@ test_expect_success 'S: merge with garbage after mark must fail' ' merge :303x M 100644 :403 hello.c EOF - test_i18ngrep "after mark" err + test_grep "after mark" err ' # @@ -3033,7 +3033,7 @@ test_expect_success 'S: tag with garbage after mark must fail' ' tag S TAG EOF - test_i18ngrep "after mark" err + test_grep "after mark" err ' # @@ -3043,7 +3043,7 @@ test_expect_success 'S: cat-blob with garbage after mark must fail' ' test_must_fail git fast-import --import-marks=marks <<-EOF 2>err && cat-blob :403x EOF - test_i18ngrep "after mark" err + test_grep "after mark" err ' # @@ -3053,7 +3053,7 @@ test_expect_success 'S: ls with garbage after mark must fail' ' test_must_fail git fast-import --import-marks=marks <<-EOF 2>err && ls :302x hello.c EOF - test_i18ngrep "space after mark" err + test_grep "space after mark" err ' test_expect_success 'S: ls with garbage after sha1 must fail' ' @@ -3061,7 +3061,7 @@ test_expect_success 'S: ls with garbage after sha1 must fail' ' test_must_fail git fast-import --import-marks=marks <<-EOF 2>err && ls ${sha1}x hello.c EOF - test_i18ngrep "space after tree-ish" err + test_grep "space after tree-ish" err ' ### diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh index 26c25c0eb2..e9a12c18bb 100755 --- a/t/t9350-fast-export.sh +++ b/t/t9350-fast-export.sh @@ -791,4 +791,14 @@ test_expect_success 'fast-export --first-parent outputs all revisions output by ) ' +test_expect_success 'fast-export handles --end-of-options' ' + git update-ref refs/heads/nodash HEAD && + git update-ref refs/heads/--dashes HEAD && + git fast-export --end-of-options nodash >expect && + git fast-export --end-of-options --dashes >actual.raw && + # fix up lines which mention the ref for comparison + sed s/--dashes/nodash/ <actual.raw >actual && + test_cmp expect actual +' + test_done diff --git a/t/t9700/test.pl b/t/t9700/test.pl index 6d753708d2..d8e85482ab 100755 --- a/t/t9700/test.pl +++ b/t/t9700/test.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl use lib (split(/:/, $ENV{GITPERLLIB})); -use 5.008; +use 5.008001; use warnings; use strict; diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh index a4b3cb9492..53af8e34ac 100755 --- a/t/t9800-git-p4-basic.sh +++ b/t/t9800-git-p4-basic.sh @@ -54,7 +54,7 @@ test_expect_success 'git p4 sync uninitialized repo' ' ( cd "$git" && test_must_fail git p4 sync 2>errs && - test_i18ngrep "Perhaps you never did" errs + test_grep "Perhaps you never did" errs ) ' @@ -86,7 +86,7 @@ test_expect_success 'git p4 sync existing branch without changes' ' test_commit head && git p4 sync --branch=depot //depot@all && git p4 sync --branch=refs/remotes/p4/depot >out && - test_i18ngrep "No changes to import!" out + test_grep "No changes to import!" out ) ' @@ -101,7 +101,7 @@ test_expect_success 'git p4 sync existing branch with relative name' ' test_commit head && git p4 sync --branch=branch1 //depot@all && git p4 sync --branch=p4/branch1 >out && - test_i18ngrep "No changes to import!" out + test_grep "No changes to import!" out ) ' @@ -116,7 +116,7 @@ test_expect_success 'git p4 sync existing branch with nested path' ' test_commit head && git p4 sync --branch=p4/some/path //depot@all && git p4 sync --branch=some/path >out && - test_i18ngrep "No changes to import!" out + test_grep "No changes to import!" out ) ' @@ -131,7 +131,7 @@ test_expect_success 'git p4 sync branch explicit ref without p4 in path' ' test_commit head && git p4 sync --branch=refs/remotes/someremote/depot //depot@all && git p4 sync --branch=refs/remotes/someremote/depot >out && - test_i18ngrep "No changes to import!" out + test_grep "No changes to import!" out ) ' @@ -143,7 +143,7 @@ test_expect_success 'git p4 sync nonexistent ref' ' test_commit head && git p4 sync --branch=depot //depot@all && test_must_fail git p4 sync --branch=depot2 2>errs && - test_i18ngrep "Perhaps you never did" errs + test_grep "Perhaps you never did" errs ) ' @@ -155,7 +155,7 @@ test_expect_success 'git p4 sync existing non-p4-imported ref' ' test_commit head && git p4 sync --branch=depot //depot@all && test_must_fail git p4 sync --branch=refs/heads/master 2>errs && - test_i18ngrep "Perhaps you never did" errs + test_grep "Perhaps you never did" errs ) ' @@ -290,7 +290,7 @@ test_expect_success 'exit when p4 fails to produce marshaled output' ' export PATH && test_expect_code 1 git p4 clone --dest="$git" //depot >errs 2>&1 ) && - test_i18ngrep ! Traceback errs + test_grep ! Traceback errs ' # Hide a file from p4d, make sure we catch its complaint. This won't fail in @@ -301,7 +301,7 @@ test_expect_success 'exit gracefully for p4 server errors' ' mv "$db"/depot/file1,v "$db"/depot/file1,v,hidden && test_when_finished cleanup_git && test_expect_code 1 git p4 clone --dest="$git" //depot@1 >out 2>err && - test_i18ngrep "Error from p4 print" err + test_grep "Error from p4 print" err ' test_expect_success 'clone --bare should make a bare repository' ' diff --git a/t/t9801-git-p4-branch.sh b/t/t9801-git-p4-branch.sh index 759a14fa87..c598011635 100755 --- a/t/t9801-git-p4-branch.sh +++ b/t/t9801-git-p4-branch.sh @@ -135,7 +135,7 @@ test_expect_success 'sync specific detected branch' ' ( cd "$git" && git p4 sync --branch=depot/branch2 >out && - test_i18ngrep "No changes to import!" out + test_grep "No changes to import!" out ) ' @@ -466,7 +466,7 @@ test_expect_success 'git p4 clone complex branches with excluded files' ' ) ' -# From a report in http://stackoverflow.com/questions/11893688 +# From a report in https://stackoverflow.com/questions/11893688 # where --use-client-spec caused branch prefixes not to be removed; # every file in git appeared into a subdirectory of the branch name. test_expect_success 'use-client-spec detect-branches setup' ' diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh index 7d4109f29d..af4b286f9d 100755 --- a/t/t9807-git-p4-submit.sh +++ b/t/t9807-git-p4-submit.sh @@ -75,7 +75,7 @@ test_expect_success 'submit --dry-run' ' test_commit "dry-run1" && test_commit "dry-run2" && git p4 submit --dry-run >out && - test_i18ngrep "Would apply" out + test_grep "Would apply" out ) && ( cd "$cli" && @@ -99,7 +99,7 @@ test_expect_success 'submit --dry-run --export-labels' ' git commit -m "dry-run2" dry-run2 && git tag -m "dry-run-tag1" dry-run-tag1 HEAD^ && git p4 submit --dry-run --export-labels >out && - test_i18ngrep "Would create p4 label" out + test_grep "Would create p4 label" out ) && ( cd "$cli" && @@ -443,7 +443,7 @@ test_expect_success 'description with Jobs section and bogus following text' ' # build a job make_job $(cat jobname) && test_must_fail git p4 submit 2>err && - test_i18ngrep "Unknown field name" err + test_grep "Unknown field name" err ) && ( cd "$cli" && @@ -461,9 +461,9 @@ test_expect_success 'submit --prepare-p4-only' ' git add prep-only-add && git commit -m "prep only add" && git p4 submit --prepare-p4-only >out && - test_i18ngrep "prepared for submission" out && - test_i18ngrep "must be deleted" out && - test_i18ngrep ! "everything below this line is just the diff" out + test_grep "prepared for submission" out && + test_grep "must be deleted" out && + test_grep ! "everything below this line is just the diff" out ) && ( cd "$cli" && diff --git a/t/t9815-git-p4-submit-fail.sh b/t/t9815-git-p4-submit-fail.sh index 0ca9937de6..c766fd159f 100755 --- a/t/t9815-git-p4-submit-fail.sh +++ b/t/t9815-git-p4-submit-fail.sh @@ -35,7 +35,7 @@ test_expect_success 'conflict on one commit' ' git add file1 && git commit -m "line3 in file1 will conflict" && test_expect_code 1 git p4 submit >out && - test_i18ngrep "No commits applied" out + test_grep "No commits applied" out ) ' @@ -58,7 +58,7 @@ test_expect_success 'conflict on second of two commits' ' git add file1 && git commit -m "line4 in file1 will conflict" && test_expect_code 1 git p4 submit >out && - test_i18ngrep "Applied only the commits" out + test_grep "Applied only the commits" out ) ' @@ -81,7 +81,7 @@ test_expect_success 'conflict on first of two commits, skip' ' # but this commit is okay test_commit "okay_commit_after_skip" && echo s | test_expect_code 1 git p4 submit >out && - test_i18ngrep "Applied only the commits" out + test_grep "Applied only the commits" out ) ' @@ -104,7 +104,7 @@ test_expect_success 'conflict on first of two commits, quit' ' # but this commit is okay test_commit "okay_commit_after_quit" && echo q | test_expect_code 1 git p4 submit >out && - test_i18ngrep "No commits applied" out + test_grep "No commits applied" out ) ' @@ -144,7 +144,7 @@ test_expect_success 'conflict on first of two commits, --conflict=skip' ' # but this commit is okay test_commit "okay_commit_after_auto_skip" && test_expect_code 1 git p4 submit --conflict=skip >out && - test_i18ngrep "Applied only the commits" out + test_grep "Applied only the commits" out ) ' @@ -167,7 +167,7 @@ test_expect_success 'conflict on first of two commits, --conflict=quit' ' # but this commit is okay test_commit "okay_commit_after_auto_quit" && test_expect_code 1 git p4 submit --conflict=quit >out && - test_i18ngrep "No commits applied" out + test_grep "No commits applied" out ) ' diff --git a/t/t9816-git-p4-locked.sh b/t/t9816-git-p4-locked.sh index 932841003c..5e904ac80d 100755 --- a/t/t9816-git-p4-locked.sh +++ b/t/t9816-git-p4-locked.sh @@ -9,7 +9,7 @@ test_expect_success 'start p4d' ' ' # See -# http://www.perforce.com/perforce/doc.current/manuals/p4sag/03_superuser.html#1088563 +# https://web.archive.org/web/20150602090517/http://www.perforce.com/perforce/doc.current/manuals/p4sag/chapter.superuser.html#superuser.basic.typemap_locking # for suggestions on how to configure "sitewide pessimistic locking" # where only one person can have a file open for edit at a time. test_expect_success 'init depot' ' diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index 47e20fb8b1..a7c3b4eb63 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -2464,6 +2464,24 @@ test_expect_success 'completion used <cmd> completion for alias: !f() { : git <c EOF ' +test_expect_success 'completion used <cmd> completion for alias: !f() { : <cmd> ; ... }' ' + test_config alias.co "!f() { : checkout ; if ... } f" && + test_completion "git co m" <<-\EOF + main Z + mybranch Z + mytag Z + EOF +' + +test_expect_success 'completion used <cmd> completion for alias: !f() { : <cmd>; ... }' ' + test_config alias.co "!f() { : checkout; if ... } f" && + test_completion "git co m" <<-\EOF + main Z + mybranch Z + mytag Z + EOF +' + test_expect_success 'completion without explicit _git_xxx function' ' test_completion "git version --" <<-\EOF --build-options Z diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh index 2f8868caa1..5eb57914ab 100644 --- a/t/test-lib-functions.sh +++ b/t/test-lib-functions.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see http://www.gnu.org/licenses/ . +# along with this program. If not, see https://www.gnu.org/licenses/ . # The semantics of the editor variables are that of invoking # sh -c "$EDITOR \"$@\"" files ... @@ -251,6 +251,61 @@ debug () { done } +# Usage: test_ref_exists [options] <ref> +# +# -C <dir>: +# Run all git commands in directory <dir> +# +# This helper function checks whether a reference exists. Symrefs or object IDs +# will not be resolved. Can be used to check references with bad names. +test_ref_exists () { + local indir= + + while test $# != 0 + do + case "$1" in + -C) + indir="$2" + shift + ;; + *) + break + ;; + esac + shift + done && + + indir=${indir:+"$indir"/} && + + if test "$#" != 1 + then + BUG "expected exactly one reference" + fi && + + git ${indir:+ -C "$indir"} show-ref --exists "$1" +} + +# Behaves the same as test_ref_exists, except that it checks for the absence of +# a reference. This is preferable to `! test_ref_exists` as this function is +# able to distinguish actually-missing references from other, generic errors. +test_ref_missing () { + test_ref_exists "$@" + case "$?" in + 2) + # This is the good case. + return 0 + ;; + 0) + echo >&4 "test_ref_missing: reference exists" + return 1 + ;; + *) + echo >&4 "test_ref_missing: generic error" + return 1 + ;; + esac +} + # Usage: test_commit [options] <message> [<file> [<contents> [<tag>]]] # -C <dir>: # Run all git commands in directory <dir> @@ -1208,19 +1263,21 @@ test_cmp_bin () { cmp "$@" } -# Wrapper for grep which used to be used for -# GIT_TEST_GETTEXT_POISON=false. Only here as a shim for other -# in-flight changes. Should not be used and will be removed soon. +# Deprecated - do not use this in new code test_i18ngrep () { + test_grep "$@" +} + +test_grep () { eval "last_arg=\${$#}" test -f "$last_arg" || - BUG "test_i18ngrep requires a file to read as the last parameter" + BUG "test_grep requires a file to read as the last parameter" if test $# -lt 2 || { test "x!" = "x$1" && test $# -lt 3 ; } then - BUG "too few parameters to test_i18ngrep" + BUG "too few parameters to test_grep" fi if test "x!" = "x$1" diff --git a/t/test-lib-github-workflow-markup.sh b/t/test-lib-github-workflow-markup.sh index 9c5339c577..970c6538cb 100644 --- a/t/test-lib-github-workflow-markup.sh +++ b/t/test-lib-github-workflow-markup.sh @@ -14,7 +14,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see http://www.gnu.org/licenses/ . +# along with this program. If not, see https://www.gnu.org/licenses/ . # # The idea is for `test-lib.sh` to source this file when run in GitHub # workflows; these functions will then override (empty) functions diff --git a/t/test-lib-junit.sh b/t/test-lib-junit.sh index 79c31c788b..76cbbd3299 100644 --- a/t/test-lib-junit.sh +++ b/t/test-lib-junit.sh @@ -15,7 +15,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see http://www.gnu.org/licenses/ . +# along with this program. If not, see https://www.gnu.org/licenses/ . # # The idea is for `test-lib.sh` to source this file when the user asks # for JUnit XML; these functions will then override (empty) functions diff --git a/t/test-lib.sh b/t/test-lib.sh index 1656c9eed0..876b99562a 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -13,7 +13,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see http://www.gnu.org/licenses/ . +# along with this program. If not, see https://www.gnu.org/licenses/ . # Test the binaries we have just built. The tests are kept in # t/ subdirectory and are run in 'trash directory' subdirectory. diff --git a/t/test-terminal.perl b/t/test-terminal.perl index 1bcf01a9a4..3810e9bb43 100755 --- a/t/test-terminal.perl +++ b/t/test-terminal.perl @@ -1,5 +1,5 @@ #!/usr/bin/perl -use 5.008; +use 5.008001; use strict; use warnings; use IO::Pty; |