mirror of
https://github.com/git/git.git
synced 2026-03-14 18:59:04 +01:00
Merge branch 'master' of git://repo.or.cz/git into devel
This commit is contained in:
@@ -38,4 +38,7 @@ full-svn-test:
|
||||
$(MAKE) $(TSVN) GIT_SVN_NO_OPTIMIZE_COMMITS=1 LC_ALL=C
|
||||
$(MAKE) $(TSVN) GIT_SVN_NO_OPTIMIZE_COMMITS=0 LC_ALL=en_US.UTF-8
|
||||
|
||||
.PHONY: pre-clean $(T) aggregate-results clean
|
||||
valgrind:
|
||||
GIT_TEST_OPTS=--valgrind $(MAKE)
|
||||
|
||||
.PHONY: pre-clean $(T) aggregate-results clean valgrind
|
||||
|
||||
18
t/README
18
t/README
@@ -39,7 +39,8 @@ this:
|
||||
* passed all 3 test(s)
|
||||
|
||||
You can pass --verbose (or -v), --debug (or -d), and --immediate
|
||||
(or -i) command line argument to the test.
|
||||
(or -i) command line argument to the test, or by setting GIT_TEST_OPTS
|
||||
appropriately before running "make".
|
||||
|
||||
--verbose::
|
||||
This makes the test more verbose. Specifically, the
|
||||
@@ -58,6 +59,21 @@ You can pass --verbose (or -v), --debug (or -d), and --immediate
|
||||
This causes additional long-running tests to be run (where
|
||||
available), for more exhaustive testing.
|
||||
|
||||
--valgrind::
|
||||
Execute all Git binaries with valgrind and exit with status
|
||||
126 on errors (just like regular tests, this will only stop
|
||||
the test script when running under -i). Valgrind errors
|
||||
go to stderr, so you might want to pass the -v option, too.
|
||||
|
||||
Since it makes no sense to run the tests with --valgrind and
|
||||
not see any output, this option implies --verbose. For
|
||||
convenience, it also implies --tee.
|
||||
|
||||
--tee::
|
||||
In addition to printing the test output to the terminal,
|
||||
write it to files named 't/test-results/$TEST_NAME.out'.
|
||||
As the names depend on the tests' file names, it is safe to
|
||||
run the tests with this option in parallel.
|
||||
|
||||
Skipping Tests
|
||||
--------------
|
||||
|
||||
@@ -4,6 +4,9 @@ DocumentRoot www
|
||||
LogFormat "%h %l %u %t \"%r\" %>s %b" common
|
||||
CustomLog access.log common
|
||||
ErrorLog error.log
|
||||
<IfModule !mod_log_config.c>
|
||||
LoadModule log_config_module modules/mod_log_config.so
|
||||
</IfModule>
|
||||
|
||||
<IfDefine Darwin>
|
||||
LoadModule log_config_module modules/mod_log_config.so
|
||||
|
||||
@@ -336,10 +336,10 @@ test_expect_success 'get bool variable with empty value' \
|
||||
'git config --bool emptyvalue.variable > output &&
|
||||
cmp output expect'
|
||||
|
||||
git config > output 2>&1
|
||||
|
||||
test_expect_success 'no arguments, but no crash' \
|
||||
"test $? = 129 && grep usage output"
|
||||
test_expect_success 'no arguments, but no crash' '
|
||||
test_must_fail git config >output 2>&1 &&
|
||||
grep usage output
|
||||
'
|
||||
|
||||
cat > .git/config << EOF
|
||||
[a.b]
|
||||
@@ -373,7 +373,7 @@ EOF
|
||||
test_expect_success 'new variable inserts into proper section' 'cmp .git/config expect'
|
||||
|
||||
test_expect_success 'alternative GIT_CONFIG (non-existing file should fail)' \
|
||||
'git config --file non-existing-config -l; test $? != 0'
|
||||
'test_must_fail git config --file non-existing-config -l'
|
||||
|
||||
cat > other-config << EOF
|
||||
[ein]
|
||||
|
||||
@@ -28,4 +28,71 @@ test_expect_success 'loose objects borrowed from alternate are not missing' '
|
||||
)
|
||||
'
|
||||
|
||||
# Corruption tests follow. Make sure to remove all traces of the
|
||||
# specific corruption you test afterwards, lest a later test trip over
|
||||
# it.
|
||||
|
||||
test_expect_success 'object with bad sha1' '
|
||||
sha=$(echo blob | git hash-object -w --stdin) &&
|
||||
echo $sha &&
|
||||
old=$(echo $sha | sed "s+^..+&/+") &&
|
||||
new=$(dirname $old)/ffffffffffffffffffffffffffffffffffffff &&
|
||||
sha="$(dirname $new)$(basename $new)"
|
||||
mv .git/objects/$old .git/objects/$new &&
|
||||
git update-index --add --cacheinfo 100644 $sha foo &&
|
||||
tree=$(git write-tree) &&
|
||||
cmt=$(echo bogus | git commit-tree $tree) &&
|
||||
git update-ref refs/heads/bogus $cmt &&
|
||||
(git fsck 2>out; true) &&
|
||||
grep "$sha.*corrupt" out &&
|
||||
rm -f .git/objects/$new &&
|
||||
git update-ref -d refs/heads/bogus &&
|
||||
git read-tree -u --reset HEAD
|
||||
'
|
||||
|
||||
test_expect_success 'branch pointing to non-commit' '
|
||||
git rev-parse HEAD^{tree} > .git/refs/heads/invalid &&
|
||||
git fsck 2>out &&
|
||||
grep "not a commit" out &&
|
||||
git update-ref -d refs/heads/invalid
|
||||
'
|
||||
|
||||
cat > invalid-tag <<EOF
|
||||
object ffffffffffffffffffffffffffffffffffffffff
|
||||
type commit
|
||||
tag invalid
|
||||
tagger T A Gger <tagger@example.com> 1234567890 -0000
|
||||
|
||||
This is an invalid tag.
|
||||
EOF
|
||||
|
||||
test_expect_failure 'tag pointing to nonexistent' '
|
||||
tag=$(git hash-object -w --stdin < invalid-tag) &&
|
||||
echo $tag > .git/refs/tags/invalid &&
|
||||
git fsck --tags 2>out &&
|
||||
cat out &&
|
||||
grep "could not load tagged object" out &&
|
||||
rm .git/refs/tags/invalid
|
||||
'
|
||||
|
||||
cat > wrong-tag <<EOF
|
||||
object $(echo blob | git hash-object -w --stdin)
|
||||
type commit
|
||||
tag wrong
|
||||
tagger T A Gger <tagger@example.com> 1234567890 -0000
|
||||
|
||||
This is an invalid tag.
|
||||
EOF
|
||||
|
||||
test_expect_failure 'tag pointing to something else than its type' '
|
||||
tag=$(git hash-object -w --stdin < wrong-tag) &&
|
||||
echo $tag > .git/refs/tags/wrong &&
|
||||
git fsck --tags 2>out &&
|
||||
cat out &&
|
||||
grep "some sane error message" out &&
|
||||
rm .git/refs/tags/wrong
|
||||
'
|
||||
|
||||
|
||||
|
||||
test_done
|
||||
|
||||
@@ -19,6 +19,9 @@ do
|
||||
>$dir/a.$i
|
||||
done
|
||||
done
|
||||
>"#ignore1"
|
||||
>"#ignore2"
|
||||
>"#hidden"
|
||||
|
||||
cat >expect <<EOF
|
||||
a.2
|
||||
@@ -42,6 +45,9 @@ three/a.8
|
||||
EOF
|
||||
|
||||
echo '.gitignore
|
||||
\#ignore1
|
||||
\#ignore2*
|
||||
\#hid*n
|
||||
output
|
||||
expect
|
||||
.gitignore
|
||||
@@ -79,9 +85,10 @@ test_expect_success \
|
||||
>output &&
|
||||
test_cmp expect output'
|
||||
|
||||
cat > excludes-file << EOF
|
||||
cat > excludes-file <<\EOF
|
||||
*.[1-8]
|
||||
e*
|
||||
\#*
|
||||
EOF
|
||||
|
||||
git config core.excludesFile excludes-file
|
||||
|
||||
81
t/t3203-branch-output.sh
Executable file
81
t/t3203-branch-output.sh
Executable file
@@ -0,0 +1,81 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='git branch display tests'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'make commits' '
|
||||
echo content >file &&
|
||||
git add file &&
|
||||
git commit -m one &&
|
||||
echo content >>file &&
|
||||
git commit -a -m two
|
||||
'
|
||||
|
||||
test_expect_success 'make branches' '
|
||||
git branch branch-one
|
||||
git branch branch-two HEAD^
|
||||
'
|
||||
|
||||
test_expect_success 'make remote branches' '
|
||||
git update-ref refs/remotes/origin/branch-one branch-one
|
||||
git update-ref refs/remotes/origin/branch-two branch-two
|
||||
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/branch-one
|
||||
'
|
||||
|
||||
cat >expect <<'EOF'
|
||||
branch-one
|
||||
branch-two
|
||||
* master
|
||||
EOF
|
||||
test_expect_success 'git branch shows local branches' '
|
||||
git branch >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
cat >expect <<'EOF'
|
||||
origin/HEAD -> origin/branch-one
|
||||
origin/branch-one
|
||||
origin/branch-two
|
||||
EOF
|
||||
test_expect_success 'git branch -r shows remote branches' '
|
||||
git branch -r >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
cat >expect <<'EOF'
|
||||
branch-one
|
||||
branch-two
|
||||
* master
|
||||
remotes/origin/HEAD -> origin/branch-one
|
||||
remotes/origin/branch-one
|
||||
remotes/origin/branch-two
|
||||
EOF
|
||||
test_expect_success 'git branch -a shows local and remote branches' '
|
||||
git branch -a >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
cat >expect <<'EOF'
|
||||
two
|
||||
one
|
||||
two
|
||||
EOF
|
||||
test_expect_success 'git branch -v shows branch summaries' '
|
||||
git branch -v >tmp &&
|
||||
awk "{print \$NF}" <tmp >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
cat >expect <<'EOF'
|
||||
* (no branch)
|
||||
branch-one
|
||||
branch-two
|
||||
master
|
||||
EOF
|
||||
test_expect_success 'git branch shows detached HEAD properly' '
|
||||
git checkout HEAD^0 &&
|
||||
git branch >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_done
|
||||
@@ -22,7 +22,8 @@ test_expect_success setup '
|
||||
git checkout topic &&
|
||||
quick_one A &&
|
||||
quick_one B &&
|
||||
quick_one Z
|
||||
quick_one Z &&
|
||||
git tag start
|
||||
|
||||
'
|
||||
|
||||
@@ -41,4 +42,24 @@ test_expect_success 'rebase -m' '
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'rebase --stat' '
|
||||
git reset --hard start
|
||||
git rebase --stat master >diffstat.txt &&
|
||||
grep "^ fileX | *1 +$" diffstat.txt
|
||||
'
|
||||
|
||||
test_expect_success 'rebase w/config rebase.stat' '
|
||||
git reset --hard start
|
||||
git config rebase.stat true &&
|
||||
git rebase master >diffstat.txt &&
|
||||
grep "^ fileX | *1 +$" diffstat.txt
|
||||
'
|
||||
|
||||
test_expect_success 'rebase -n overrides config rebase.stat config' '
|
||||
git reset --hard start
|
||||
git config rebase.stat true &&
|
||||
git rebase -n master >diffstat.txt &&
|
||||
! grep "^ fileX | *1 +$" diffstat.txt
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
33
t/t3505-cherry-pick-empty.sh
Executable file
33
t/t3505-cherry-pick-empty.sh
Executable file
@@ -0,0 +1,33 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='test cherry-picking an empty commit'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success setup '
|
||||
|
||||
echo first > file1 &&
|
||||
git add file1 &&
|
||||
test_tick &&
|
||||
git commit -m "first" &&
|
||||
|
||||
git checkout -b empty-branch &&
|
||||
test_tick &&
|
||||
git commit --allow-empty -m "empty"
|
||||
|
||||
'
|
||||
|
||||
test_expect_code 1 'cherry-pick an empty commit' '
|
||||
|
||||
git checkout master &&
|
||||
git cherry-pick empty-branch
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'index lockfile was removed' '
|
||||
|
||||
test ! -f .git/index.lock
|
||||
|
||||
'
|
||||
|
||||
test_done
|
||||
@@ -258,4 +258,12 @@ test_expect_success \
|
||||
git diff-tree -r -R $tree_A $tree_B >.test-b &&
|
||||
cmp -s .test-a .test-b'
|
||||
|
||||
test_expect_success \
|
||||
'diff can read from stdin' \
|
||||
'test_must_fail git diff --no-index -- MN - < NN |
|
||||
grep -v "^index" | sed "s#/-#/NN#" >.test-a &&
|
||||
test_must_fail git diff --no-index -- MN NN |
|
||||
grep -v "^index" >.test-b &&
|
||||
test_cmp .test-a .test-b'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -207,6 +207,10 @@ log --root -c --patch-with-stat --summary master
|
||||
log --root --cc --patch-with-stat --summary master
|
||||
log -SF master
|
||||
log -SF -p master
|
||||
log --decorate --all
|
||||
|
||||
rev-list --parents HEAD
|
||||
rev-list --children HEAD
|
||||
|
||||
whatchanged master
|
||||
whatchanged -p master
|
||||
@@ -268,6 +272,7 @@ diff --no-index --name-status dir2 dir
|
||||
diff --no-index --name-status -- dir2 dir
|
||||
diff --no-index dir dir3
|
||||
diff master master^ side
|
||||
diff --dirstat master~1 master~2
|
||||
EOF
|
||||
|
||||
test_done
|
||||
|
||||
3
t/t4013/diff.diff_--dirstat_master~1_master~2
Normal file
3
t/t4013/diff.diff_--dirstat_master~1_master~2
Normal file
@@ -0,0 +1,3 @@
|
||||
$ git diff --dirstat master~1 master~2
|
||||
40.0% dir/
|
||||
$
|
||||
34
t/t4013/diff.log_--decorate_--all
Normal file
34
t/t4013/diff.log_--decorate_--all
Normal file
@@ -0,0 +1,34 @@
|
||||
$ git log --decorate --all
|
||||
commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (refs/heads/master)
|
||||
Merge: 9a6d494 c7a2ab9
|
||||
Author: A U Thor <author@example.com>
|
||||
Date: Mon Jun 26 00:04:00 2006 +0000
|
||||
|
||||
Merge branch 'side'
|
||||
|
||||
commit c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a (refs/heads/side)
|
||||
Author: A U Thor <author@example.com>
|
||||
Date: Mon Jun 26 00:03:00 2006 +0000
|
||||
|
||||
Side
|
||||
|
||||
commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0
|
||||
Author: A U Thor <author@example.com>
|
||||
Date: Mon Jun 26 00:02:00 2006 +0000
|
||||
|
||||
Third
|
||||
|
||||
commit 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44
|
||||
Author: A U Thor <author@example.com>
|
||||
Date: Mon Jun 26 00:01:00 2006 +0000
|
||||
|
||||
Second
|
||||
|
||||
This is the second commit.
|
||||
|
||||
commit 444ac553ac7612cc88969031b02b3767fb8a353a (refs/heads/initial)
|
||||
Author: A U Thor <author@example.com>
|
||||
Date: Mon Jun 26 00:00:00 2006 +0000
|
||||
|
||||
Initial
|
||||
$
|
||||
7
t/t4013/diff.rev-list_--children_HEAD
Normal file
7
t/t4013/diff.rev-list_--children_HEAD
Normal file
@@ -0,0 +1,7 @@
|
||||
$ git rev-list --children HEAD
|
||||
59d314ad6f356dd08601a4cd5e530381da3e3c64
|
||||
c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a 59d314ad6f356dd08601a4cd5e530381da3e3c64
|
||||
9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 59d314ad6f356dd08601a4cd5e530381da3e3c64
|
||||
1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0
|
||||
444ac553ac7612cc88969031b02b3767fb8a353a 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a
|
||||
$
|
||||
7
t/t4013/diff.rev-list_--parents_HEAD
Normal file
7
t/t4013/diff.rev-list_--parents_HEAD
Normal file
@@ -0,0 +1,7 @@
|
||||
$ git rev-list --parents HEAD
|
||||
59d314ad6f356dd08601a4cd5e530381da3e3c64 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a
|
||||
c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a 444ac553ac7612cc88969031b02b3767fb8a353a
|
||||
9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44
|
||||
1bde4ae5f36c8d9abe3a0fce0c6aab3c4a12fe44 444ac553ac7612cc88969031b02b3767fb8a353a
|
||||
444ac553ac7612cc88969031b02b3767fb8a353a
|
||||
$
|
||||
@@ -138,56 +138,243 @@ test_expect_success 'multiple files' '
|
||||
ls patches/0001-Side-changes-1.patch patches/0002-Side-changes-2.patch patches/0003-Side-changes-3-with-n-backslash-n-in-it.patch
|
||||
'
|
||||
|
||||
test_expect_success 'thread' '
|
||||
check_threading () {
|
||||
expect="$1" &&
|
||||
shift &&
|
||||
(git format-patch --stdout "$@"; echo $? > status.out) |
|
||||
# Prints everything between the Message-ID and In-Reply-To,
|
||||
# and replaces all Message-ID-lookalikes by a sequence number
|
||||
perl -ne '
|
||||
if (/^(message-id|references|in-reply-to)/i) {
|
||||
$printing = 1;
|
||||
} elsif (/^\S/) {
|
||||
$printing = 0;
|
||||
}
|
||||
if ($printing) {
|
||||
$h{$1}=$i++ if (/<([^>]+)>/ and !exists $h{$1});
|
||||
for $k (keys %h) {s/$k/$h{$k}/};
|
||||
print;
|
||||
}
|
||||
print "---\n" if /^From /i;
|
||||
' > actual &&
|
||||
test 0 = "$(cat status.out)" &&
|
||||
test_cmp "$expect" actual
|
||||
}
|
||||
|
||||
rm -rf patches/ &&
|
||||
cat >> expect.no-threading <<EOF
|
||||
---
|
||||
---
|
||||
---
|
||||
EOF
|
||||
|
||||
test_expect_success 'no threading' '
|
||||
git checkout side &&
|
||||
git format-patch --thread -o patches/ master &&
|
||||
FIRST_MID=$(grep "Message-Id:" patches/0001-* | sed "s/^[^<]*\(<[^>]*>\).*$/\1/") &&
|
||||
for i in patches/0002-* patches/0003-*
|
||||
do
|
||||
grep "References: $FIRST_MID" $i &&
|
||||
grep "In-Reply-To: $FIRST_MID" $i || break
|
||||
done
|
||||
check_threading expect.no-threading master
|
||||
'
|
||||
|
||||
cat > expect.thread <<EOF
|
||||
---
|
||||
Message-Id: <0>
|
||||
---
|
||||
Message-Id: <1>
|
||||
In-Reply-To: <0>
|
||||
References: <0>
|
||||
---
|
||||
Message-Id: <2>
|
||||
In-Reply-To: <0>
|
||||
References: <0>
|
||||
EOF
|
||||
|
||||
test_expect_success 'thread' '
|
||||
check_threading expect.thread --thread master
|
||||
'
|
||||
|
||||
cat > expect.in-reply-to <<EOF
|
||||
---
|
||||
Message-Id: <0>
|
||||
In-Reply-To: <1>
|
||||
References: <1>
|
||||
---
|
||||
Message-Id: <2>
|
||||
In-Reply-To: <1>
|
||||
References: <1>
|
||||
---
|
||||
Message-Id: <3>
|
||||
In-Reply-To: <1>
|
||||
References: <1>
|
||||
EOF
|
||||
|
||||
test_expect_success 'thread in-reply-to' '
|
||||
|
||||
rm -rf patches/ &&
|
||||
git checkout side &&
|
||||
git format-patch --in-reply-to="<test.message>" --thread -o patches/ master &&
|
||||
FIRST_MID="<test.message>" &&
|
||||
for i in patches/*
|
||||
do
|
||||
grep "References: $FIRST_MID" $i &&
|
||||
grep "In-Reply-To: $FIRST_MID" $i || break
|
||||
done
|
||||
check_threading expect.in-reply-to --in-reply-to="<test.message>" \
|
||||
--thread master
|
||||
'
|
||||
|
||||
cat > expect.cover-letter <<EOF
|
||||
---
|
||||
Message-Id: <0>
|
||||
---
|
||||
Message-Id: <1>
|
||||
In-Reply-To: <0>
|
||||
References: <0>
|
||||
---
|
||||
Message-Id: <2>
|
||||
In-Reply-To: <0>
|
||||
References: <0>
|
||||
---
|
||||
Message-Id: <3>
|
||||
In-Reply-To: <0>
|
||||
References: <0>
|
||||
EOF
|
||||
|
||||
test_expect_success 'thread cover-letter' '
|
||||
|
||||
rm -rf patches/ &&
|
||||
git checkout side &&
|
||||
git format-patch --cover-letter --thread -o patches/ master &&
|
||||
FIRST_MID=$(grep "Message-Id:" patches/0000-* | sed "s/^[^<]*\(<[^>]*>\).*$/\1/") &&
|
||||
for i in patches/0001-* patches/0002-* patches/0003-*
|
||||
do
|
||||
grep "References: $FIRST_MID" $i &&
|
||||
grep "In-Reply-To: $FIRST_MID" $i || break
|
||||
done
|
||||
check_threading expect.cover-letter --cover-letter --thread master
|
||||
'
|
||||
|
||||
test_expect_success 'thread cover-letter in-reply-to' '
|
||||
cat > expect.cl-irt <<EOF
|
||||
---
|
||||
Message-Id: <0>
|
||||
In-Reply-To: <1>
|
||||
References: <1>
|
||||
---
|
||||
Message-Id: <2>
|
||||
In-Reply-To: <0>
|
||||
References: <1>
|
||||
<0>
|
||||
---
|
||||
Message-Id: <3>
|
||||
In-Reply-To: <0>
|
||||
References: <1>
|
||||
<0>
|
||||
---
|
||||
Message-Id: <4>
|
||||
In-Reply-To: <0>
|
||||
References: <1>
|
||||
<0>
|
||||
EOF
|
||||
|
||||
rm -rf patches/ &&
|
||||
git checkout side &&
|
||||
git format-patch --cover-letter --in-reply-to="<test.message>" --thread -o patches/ master &&
|
||||
FIRST_MID="<test.message>" &&
|
||||
for i in patches/*
|
||||
do
|
||||
grep "References: $FIRST_MID" $i &&
|
||||
grep "In-Reply-To: $FIRST_MID" $i || break
|
||||
done
|
||||
test_expect_success 'thread cover-letter in-reply-to' '
|
||||
check_threading expect.cl-irt --cover-letter \
|
||||
--in-reply-to="<test.message>" --thread master
|
||||
'
|
||||
|
||||
test_expect_success 'thread explicit shallow' '
|
||||
check_threading expect.cl-irt --cover-letter \
|
||||
--in-reply-to="<test.message>" --thread=shallow master
|
||||
'
|
||||
|
||||
cat > expect.deep <<EOF
|
||||
---
|
||||
Message-Id: <0>
|
||||
---
|
||||
Message-Id: <1>
|
||||
In-Reply-To: <0>
|
||||
References: <0>
|
||||
---
|
||||
Message-Id: <2>
|
||||
In-Reply-To: <1>
|
||||
References: <0>
|
||||
<1>
|
||||
EOF
|
||||
|
||||
test_expect_success 'thread deep' '
|
||||
check_threading expect.deep --thread=deep master
|
||||
'
|
||||
|
||||
cat > expect.deep-irt <<EOF
|
||||
---
|
||||
Message-Id: <0>
|
||||
In-Reply-To: <1>
|
||||
References: <1>
|
||||
---
|
||||
Message-Id: <2>
|
||||
In-Reply-To: <0>
|
||||
References: <1>
|
||||
<0>
|
||||
---
|
||||
Message-Id: <3>
|
||||
In-Reply-To: <2>
|
||||
References: <1>
|
||||
<0>
|
||||
<2>
|
||||
EOF
|
||||
|
||||
test_expect_success 'thread deep in-reply-to' '
|
||||
check_threading expect.deep-irt --thread=deep \
|
||||
--in-reply-to="<test.message>" master
|
||||
'
|
||||
|
||||
cat > expect.deep-cl <<EOF
|
||||
---
|
||||
Message-Id: <0>
|
||||
---
|
||||
Message-Id: <1>
|
||||
In-Reply-To: <0>
|
||||
References: <0>
|
||||
---
|
||||
Message-Id: <2>
|
||||
In-Reply-To: <1>
|
||||
References: <0>
|
||||
<1>
|
||||
---
|
||||
Message-Id: <3>
|
||||
In-Reply-To: <2>
|
||||
References: <0>
|
||||
<1>
|
||||
<2>
|
||||
EOF
|
||||
|
||||
test_expect_success 'thread deep cover-letter' '
|
||||
check_threading expect.deep-cl --cover-letter --thread=deep master
|
||||
'
|
||||
|
||||
cat > expect.deep-cl-irt <<EOF
|
||||
---
|
||||
Message-Id: <0>
|
||||
In-Reply-To: <1>
|
||||
References: <1>
|
||||
---
|
||||
Message-Id: <2>
|
||||
In-Reply-To: <0>
|
||||
References: <1>
|
||||
<0>
|
||||
---
|
||||
Message-Id: <3>
|
||||
In-Reply-To: <2>
|
||||
References: <1>
|
||||
<0>
|
||||
<2>
|
||||
---
|
||||
Message-Id: <4>
|
||||
In-Reply-To: <3>
|
||||
References: <1>
|
||||
<0>
|
||||
<2>
|
||||
<3>
|
||||
EOF
|
||||
|
||||
test_expect_success 'thread deep cover-letter in-reply-to' '
|
||||
check_threading expect.deep-cl-irt --cover-letter \
|
||||
--in-reply-to="<test.message>" --thread=deep master
|
||||
'
|
||||
|
||||
test_expect_success 'thread via config' '
|
||||
git config format.thread true &&
|
||||
check_threading expect.thread master
|
||||
'
|
||||
|
||||
test_expect_success 'thread deep via config' '
|
||||
git config format.thread deep &&
|
||||
check_threading expect.deep master
|
||||
'
|
||||
|
||||
test_expect_success 'thread config + override' '
|
||||
git config format.thread deep &&
|
||||
check_threading expect.thread --thread master
|
||||
'
|
||||
|
||||
test_expect_success 'thread config + --no-thread' '
|
||||
git config format.thread deep &&
|
||||
check_threading expect.no-threading --no-thread master
|
||||
'
|
||||
|
||||
test_expect_success 'excessive subject' '
|
||||
|
||||
188
t/t4202-log.sh
188
t/t4202-log.sh
@@ -37,6 +37,46 @@ test_expect_success setup '
|
||||
|
||||
'
|
||||
|
||||
printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial" > expect
|
||||
test_expect_success 'pretty' '
|
||||
|
||||
git log --pretty="format:%s" > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial\n" > expect
|
||||
test_expect_success 'pretty (tformat)' '
|
||||
|
||||
git log --pretty="tformat:%s" > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'pretty (shortcut)' '
|
||||
|
||||
git log --pretty="%s" > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'format' '
|
||||
|
||||
git log --format="%s" > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
cat > expect << EOF
|
||||
804a787 sixth
|
||||
394ef78 fifth
|
||||
5d31159 fourth
|
||||
2fbe8c0 third
|
||||
f7dab8e second
|
||||
3a2fdcb initial
|
||||
EOF
|
||||
test_expect_success 'oneline' '
|
||||
|
||||
git log --oneline > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'diff-filter=A' '
|
||||
|
||||
actual=$(git log --pretty="format:%s" --diff-filter=A HEAD) &&
|
||||
@@ -134,5 +174,153 @@ test_expect_success 'log --grep -i' '
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
cat > expect <<EOF
|
||||
* Second
|
||||
* sixth
|
||||
* fifth
|
||||
* fourth
|
||||
* third
|
||||
* second
|
||||
* initial
|
||||
EOF
|
||||
|
||||
test_expect_success 'simple log --graph' '
|
||||
git log --graph --pretty=tformat:%s >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'set up merge history' '
|
||||
git checkout -b side HEAD~4 &&
|
||||
test_commit side-1 1 1 &&
|
||||
test_commit side-2 2 2 &&
|
||||
git checkout master &&
|
||||
git merge side
|
||||
'
|
||||
|
||||
cat > expect <<\EOF
|
||||
* Merge branch 'side'
|
||||
|\
|
||||
| * side-2
|
||||
| * side-1
|
||||
* | Second
|
||||
* | sixth
|
||||
* | fifth
|
||||
* | fourth
|
||||
|/
|
||||
* third
|
||||
* second
|
||||
* initial
|
||||
EOF
|
||||
|
||||
test_expect_success 'log --graph with merge' '
|
||||
git log --graph --date-order --pretty=tformat:%s |
|
||||
sed "s/ *$//" >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
cat > expect <<\EOF
|
||||
* commit master
|
||||
|\ Merge: A B
|
||||
| | Author: A U Thor <author@example.com>
|
||||
| |
|
||||
| | Merge branch 'side'
|
||||
| |
|
||||
| * commit side
|
||||
| | Author: A U Thor <author@example.com>
|
||||
| |
|
||||
| | side-2
|
||||
| |
|
||||
| * commit tags/side-1
|
||||
| | Author: A U Thor <author@example.com>
|
||||
| |
|
||||
| | side-1
|
||||
| |
|
||||
* | commit master~1
|
||||
| | Author: A U Thor <author@example.com>
|
||||
| |
|
||||
| | Second
|
||||
| |
|
||||
* | commit master~2
|
||||
| | Author: A U Thor <author@example.com>
|
||||
| |
|
||||
| | sixth
|
||||
| |
|
||||
* | commit master~3
|
||||
| | Author: A U Thor <author@example.com>
|
||||
| |
|
||||
| | fifth
|
||||
| |
|
||||
* | commit master~4
|
||||
|/ Author: A U Thor <author@example.com>
|
||||
|
|
||||
| fourth
|
||||
|
|
||||
* commit tags/side-1~1
|
||||
| Author: A U Thor <author@example.com>
|
||||
|
|
||||
| third
|
||||
|
|
||||
* commit tags/side-1~2
|
||||
| Author: A U Thor <author@example.com>
|
||||
|
|
||||
| second
|
||||
|
|
||||
* commit tags/side-1~3
|
||||
Author: A U Thor <author@example.com>
|
||||
|
||||
initial
|
||||
EOF
|
||||
|
||||
test_expect_success 'log --graph with full output' '
|
||||
git log --graph --date-order --pretty=short |
|
||||
git name-rev --name-only --stdin |
|
||||
sed "s/Merge:.*/Merge: A B/;s/ *$//" >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'set up more tangled history' '
|
||||
git checkout -b tangle HEAD~6 &&
|
||||
test_commit tangle-a tangle-a a &&
|
||||
git merge master~3 &&
|
||||
git merge side~1 &&
|
||||
git checkout master &&
|
||||
git merge tangle
|
||||
'
|
||||
|
||||
cat > expect <<\EOF
|
||||
* Merge branch 'tangle'
|
||||
|\
|
||||
| * Merge branch 'side' (early part) into tangle
|
||||
| |\
|
||||
| * \ Merge branch 'master' (early part) into tangle
|
||||
| |\ \
|
||||
| * | | tangle-a
|
||||
* | | | Merge branch 'side'
|
||||
|\ \ \ \
|
||||
| * | | | side-2
|
||||
| | | |/
|
||||
| | |/|
|
||||
| |/| |
|
||||
| * | | side-1
|
||||
* | | | Second
|
||||
* | | | sixth
|
||||
| | |/
|
||||
| |/|
|
||||
|/| |
|
||||
* | | fifth
|
||||
* | | fourth
|
||||
|/ /
|
||||
* | third
|
||||
|/
|
||||
* second
|
||||
* initial
|
||||
EOF
|
||||
|
||||
test_expect_success 'log --graph with merge' '
|
||||
git log --graph --date-order --pretty=tformat:%s |
|
||||
sed "s/ *$//" >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
|
||||
38
t/t4204-patch-id.sh
Executable file
38
t/t4204-patch-id.sh
Executable file
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='git patch-id'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
test_commit initial foo a &&
|
||||
test_commit first foo b &&
|
||||
git checkout -b same HEAD^ &&
|
||||
test_commit same-msg foo b &&
|
||||
git checkout -b notsame HEAD^ &&
|
||||
test_commit notsame-msg foo c
|
||||
'
|
||||
|
||||
test_expect_success 'patch-id output is well-formed' '
|
||||
git log -p -1 | git patch-id > output &&
|
||||
grep "^[a-f0-9]\{40\} $(git rev-parse HEAD)$" output
|
||||
'
|
||||
|
||||
get_patch_id () {
|
||||
git log -p -1 "$1" | git patch-id |
|
||||
sed "s# .*##" > patch-id_"$1"
|
||||
}
|
||||
|
||||
test_expect_success 'patch-id detects equality' '
|
||||
get_patch_id master &&
|
||||
get_patch_id same &&
|
||||
test_cmp patch-id_master patch-id_same
|
||||
'
|
||||
|
||||
test_expect_success 'patch-id detects inequality' '
|
||||
get_patch_id master &&
|
||||
get_patch_id notsame &&
|
||||
! test_cmp patch-id_master patch-id_notsame
|
||||
'
|
||||
|
||||
test_done
|
||||
@@ -93,6 +93,10 @@ test_expect_success \
|
||||
'git archive vs. the same in a bare repo' \
|
||||
'test_cmp b.tar b3.tar'
|
||||
|
||||
test_expect_success 'git archive with --output' \
|
||||
'git archive --output=b4.tar HEAD &&
|
||||
test_cmp b.tar b4.tar'
|
||||
|
||||
test_expect_success \
|
||||
'validate file modification time' \
|
||||
'mkdir extract &&
|
||||
@@ -179,6 +183,10 @@ test_expect_success \
|
||||
'git archive --format=zip vs. the same in a bare repo' \
|
||||
'test_cmp d.zip d1.zip'
|
||||
|
||||
test_expect_success 'git archive --format=zip with --output' \
|
||||
'git archive --format=zip --output=d2.zip HEAD &&
|
||||
test_cmp d.zip d2.zip'
|
||||
|
||||
$UNZIP -v >/dev/null 2>&1
|
||||
if [ $? -eq 127 ]; then
|
||||
echo "Skipping ZIP tests, because unzip was not found"
|
||||
|
||||
@@ -71,4 +71,16 @@ test_expect_success 'post-checkout receives the right args when not switching br
|
||||
test $old = $new -a $flag = 0
|
||||
'
|
||||
|
||||
mkdir -p templates/hooks
|
||||
cat >templates/hooks/post-checkout <<'EOF'
|
||||
#!/bin/sh
|
||||
echo $@ > $GIT_DIR/post-checkout.args
|
||||
EOF
|
||||
chmod +x templates/hooks/post-checkout
|
||||
|
||||
test_expect_success 'post-checkout hook is triggered by clone' '
|
||||
git clone --template=templates . clone3 &&
|
||||
test -f clone3/.git/post-checkout.args
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
@@ -47,6 +47,55 @@ test_expect_success 'Prepare submodule testing' '
|
||||
GIT_CONFIG=.gitmodules git config submodule.example.url git://example.com/init.git
|
||||
'
|
||||
|
||||
test_expect_success 'Prepare submodule add testing' '
|
||||
submodurl=$(pwd)
|
||||
(
|
||||
mkdir addtest &&
|
||||
cd addtest &&
|
||||
git init
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule add' '
|
||||
(
|
||||
cd addtest &&
|
||||
git submodule add "$submodurl" submod &&
|
||||
git submodule init
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule add with ./ in path' '
|
||||
(
|
||||
cd addtest &&
|
||||
git submodule add "$submodurl" ././dotsubmod/./frotz/./ &&
|
||||
git submodule init
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule add with // in path' '
|
||||
(
|
||||
cd addtest &&
|
||||
git submodule add "$submodurl" slashslashsubmod///frotz// &&
|
||||
git submodule init
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule add with /.. in path' '
|
||||
(
|
||||
cd addtest &&
|
||||
git submodule add "$submodurl" dotdotsubmod/../realsubmod/frotz/.. &&
|
||||
git submodule init
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'submodule add with ./, /.. and // in path' '
|
||||
(
|
||||
cd addtest &&
|
||||
git submodule add "$submodurl" dot/dotslashsubmod/./../..////realsubmod2/a/b/c/d/../../../../frotz//.. &&
|
||||
git submodule init
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'status should fail for unmapped paths' '
|
||||
if git submodule status
|
||||
then
|
||||
|
||||
@@ -36,16 +36,59 @@ clean_fake_sendmail() {
|
||||
}
|
||||
|
||||
test_expect_success 'Extract patches' '
|
||||
patches=`git format-patch -n HEAD^1`
|
||||
patches=`git format-patch -s --cc="One <one@example.com>" --cc=two@example.com -n HEAD^1`
|
||||
'
|
||||
|
||||
# Test no confirm early to ensure remaining tests will not hang
|
||||
test_no_confirm () {
|
||||
rm -f no_confirm_okay
|
||||
echo n | \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--from="Example <from@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$@ \
|
||||
$patches > stdout &&
|
||||
test_must_fail grep "Send this email" stdout &&
|
||||
> no_confirm_okay
|
||||
}
|
||||
|
||||
# Exit immediately to prevent hang if a no-confirm test fails
|
||||
check_no_confirm () {
|
||||
test -f no_confirm_okay || {
|
||||
say 'No confirm test failed; skipping remaining tests to prevent hanging'
|
||||
test_done
|
||||
}
|
||||
}
|
||||
|
||||
test_expect_success 'No confirm with --suppress-cc' '
|
||||
test_no_confirm --suppress-cc=sob
|
||||
'
|
||||
check_no_confirm
|
||||
|
||||
test_expect_success 'No confirm with --confirm=never' '
|
||||
test_no_confirm --confirm=never
|
||||
'
|
||||
check_no_confirm
|
||||
|
||||
# leave sendemail.confirm set to never after this so that none of the
|
||||
# remaining tests prompt unintentionally.
|
||||
test_expect_success 'No confirm with sendemail.confirm=never' '
|
||||
git config sendemail.confirm never &&
|
||||
test_no_confirm --compose --subject=foo
|
||||
'
|
||||
check_no_confirm
|
||||
|
||||
test_expect_success 'Send patches' '
|
||||
git send-email --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
|
||||
git send-email --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
|
||||
'
|
||||
|
||||
cat >expected <<\EOF
|
||||
!nobody@example.com!
|
||||
!author@example.com!
|
||||
!one@example.com!
|
||||
!two@example.com!
|
||||
EOF
|
||||
test_expect_success \
|
||||
'Verify commandline' \
|
||||
@@ -54,13 +97,15 @@ test_expect_success \
|
||||
cat >expected-show-all-headers <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>,<bcc@example.com>
|
||||
RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>,<one@example.com>,<two@example.com>,<bcc@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: cc@example.com, A <author@example.com>
|
||||
Cc: cc@example.com, A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
@@ -74,6 +119,7 @@ EOF
|
||||
test_expect_success 'Show all headers' '
|
||||
git send-email \
|
||||
--dry-run \
|
||||
--suppress-cc=sob \
|
||||
--from="Example <from@example.com>" \
|
||||
--to=to@example.com \
|
||||
--cc=cc@example.com \
|
||||
@@ -108,6 +154,28 @@ test_expect_success 'no patch was sent' '
|
||||
! test -e commandline1
|
||||
'
|
||||
|
||||
test_expect_success 'Author From: in message body' '
|
||||
clean_fake_sendmail &&
|
||||
git send-email \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$patches &&
|
||||
sed "1,/^$/d" < msgtxt1 > msgbody1
|
||||
grep "From: A <author@example.com>" msgbody1
|
||||
'
|
||||
|
||||
test_expect_success 'Author From: not in message body' '
|
||||
clean_fake_sendmail &&
|
||||
git send-email \
|
||||
--from="A <author@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$patches &&
|
||||
sed "1,/^$/d" < msgtxt1 > msgbody1
|
||||
! grep "From: A <author@example.com>" msgbody1
|
||||
'
|
||||
|
||||
test_expect_success 'allow long lines with --no-validate' '
|
||||
git send-email \
|
||||
--from="Example <nobody@example.com>" \
|
||||
@@ -152,15 +220,13 @@ test_set_editor "$(pwd)/fake-editor"
|
||||
|
||||
test_expect_success '--compose works' '
|
||||
clean_fake_sendmail &&
|
||||
echo y | \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--compose --subject foo \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$patches \
|
||||
2>errors
|
||||
git send-email \
|
||||
--compose --subject foo \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$patches \
|
||||
2>errors
|
||||
'
|
||||
|
||||
test_expect_success 'first message is compose text' '
|
||||
@@ -171,16 +237,18 @@ test_expect_success 'second message is patch' '
|
||||
grep "Subject:.*Second" msgtxt2
|
||||
'
|
||||
|
||||
cat >expected-show-all-headers <<\EOF
|
||||
cat >expected-suppress-sob <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>
|
||||
RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>,<one@example.com>,<two@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: cc@example.com, A <author@example.com>
|
||||
Cc: cc@example.com, A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
@@ -189,10 +257,10 @@ X-Mailer: X-MAILER-STRING
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success 'sendemail.cc set' '
|
||||
git config sendemail.cc cc@example.com &&
|
||||
test_suppression () {
|
||||
git send-email \
|
||||
--dry-run \
|
||||
--suppress-cc=$1 \
|
||||
--from="Example <from@example.com>" \
|
||||
--to=to@example.com \
|
||||
--smtp-server relay.example.com \
|
||||
@@ -200,20 +268,27 @@ test_expect_success 'sendemail.cc set' '
|
||||
sed -e "s/^\(Date:\).*/\1 DATE-STRING/" \
|
||||
-e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
|
||||
-e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
|
||||
>actual-show-all-headers &&
|
||||
test_cmp expected-show-all-headers actual-show-all-headers
|
||||
>actual-suppress-$1 &&
|
||||
test_cmp expected-suppress-$1 actual-suppress-$1
|
||||
}
|
||||
|
||||
test_expect_success 'sendemail.cc set' '
|
||||
git config sendemail.cc cc@example.com &&
|
||||
test_suppression sob
|
||||
'
|
||||
|
||||
cat >expected-show-all-headers <<\EOF
|
||||
cat >expected-suppress-sob <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<one@example.com>,<two@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>
|
||||
Cc: A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
@@ -224,17 +299,166 @@ EOF
|
||||
|
||||
test_expect_success 'sendemail.cc unset' '
|
||||
git config --unset sendemail.cc &&
|
||||
git send-email \
|
||||
--dry-run \
|
||||
--from="Example <from@example.com>" \
|
||||
--to=to@example.com \
|
||||
--smtp-server relay.example.com \
|
||||
$patches |
|
||||
sed -e "s/^\(Date:\).*/\1 DATE-STRING/" \
|
||||
-e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
|
||||
-e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
|
||||
>actual-show-all-headers &&
|
||||
test_cmp expected-show-all-headers actual-show-all-headers
|
||||
test_suppression sob
|
||||
'
|
||||
|
||||
cat >expected-suppress-all <<\EOF
|
||||
0001-Second.patch
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=all' '
|
||||
test_suppression all
|
||||
'
|
||||
|
||||
cat >expected-suppress-body <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<one@example.com>,<two@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=body' '
|
||||
test_suppression body
|
||||
'
|
||||
|
||||
cat >expected-suppress-sob <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<one@example.com>,<two@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=sob' '
|
||||
test_suppression sob
|
||||
'
|
||||
|
||||
cat >expected-suppress-bodycc <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<one@example.com>,<two@example.com>,<committer@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>, One <one@example.com>, two@example.com, C O Mitter <committer@example.com>
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=bodycc' '
|
||||
test_suppression bodycc
|
||||
'
|
||||
|
||||
cat >expected-suppress-cc <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<committer@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>, C O Mitter <committer@example.com>
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=cc' '
|
||||
test_suppression cc
|
||||
'
|
||||
|
||||
test_confirm () {
|
||||
echo y | \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$@ \
|
||||
$patches | grep "Send this email"
|
||||
}
|
||||
|
||||
test_expect_success '--confirm=always' '
|
||||
test_confirm --confirm=always --suppress-cc=all
|
||||
'
|
||||
|
||||
test_expect_success '--confirm=auto' '
|
||||
test_confirm --confirm=auto
|
||||
'
|
||||
|
||||
test_expect_success '--confirm=cc' '
|
||||
test_confirm --confirm=cc
|
||||
'
|
||||
|
||||
test_expect_success '--confirm=compose' '
|
||||
test_confirm --confirm=compose --compose
|
||||
'
|
||||
|
||||
test_expect_success 'confirm by default (due to cc)' '
|
||||
CONFIRM=$(git config --get sendemail.confirm) &&
|
||||
git config --unset sendemail.confirm &&
|
||||
test_confirm &&
|
||||
git config sendemail.confirm $CONFIRM
|
||||
'
|
||||
|
||||
test_expect_success 'confirm by default (due to --compose)' '
|
||||
CONFIRM=$(git config --get sendemail.confirm) &&
|
||||
git config --unset sendemail.confirm &&
|
||||
test_confirm --suppress-cc=all --compose
|
||||
ret="$?"
|
||||
git config sendemail.confirm ${CONFIRM:-never}
|
||||
test $ret = "0"
|
||||
'
|
||||
|
||||
test_expect_success '--compose adds MIME for utf8 body' '
|
||||
@@ -243,9 +467,7 @@ test_expect_success '--compose adds MIME for utf8 body' '
|
||||
echo "echo utf8 body: àéìöú >>\"\$1\""
|
||||
) >fake-editor-utf8 &&
|
||||
chmod +x fake-editor-utf8 &&
|
||||
echo y | \
|
||||
GIT_EDITOR="\"$(pwd)/fake-editor-utf8\"" \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--compose --subject foo \
|
||||
--from="Example <nobody@example.com>" \
|
||||
@@ -267,9 +489,7 @@ test_expect_success '--compose respects user mime type' '
|
||||
echo " echo utf8 body: àéìöú) >\"\$1\""
|
||||
) >fake-editor-utf8-mime &&
|
||||
chmod +x fake-editor-utf8-mime &&
|
||||
echo y | \
|
||||
GIT_EDITOR="\"$(pwd)/fake-editor-utf8-mime\"" \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--compose --subject foo \
|
||||
--from="Example <nobody@example.com>" \
|
||||
@@ -283,9 +503,7 @@ test_expect_success '--compose respects user mime type' '
|
||||
|
||||
test_expect_success '--compose adds MIME for utf8 subject' '
|
||||
clean_fake_sendmail &&
|
||||
echo y | \
|
||||
GIT_EDITOR="\"$(pwd)/fake-editor\"" \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--compose --subject utf8-sübjëct \
|
||||
--from="Example <nobody@example.com>" \
|
||||
@@ -307,7 +525,7 @@ test_expect_success 'detects ambiguous reference/file conflict' '
|
||||
test_expect_success 'feed two files' '
|
||||
rm -fr outdir &&
|
||||
git format-patch -2 -o outdir &&
|
||||
GIT_SEND_EMAIL_NOTTY=1 git send-email \
|
||||
git send-email \
|
||||
--dry-run \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
|
||||
@@ -3,6 +3,22 @@
|
||||
# Copyright (c) 2005 Junio C Hamano
|
||||
#
|
||||
|
||||
# if --tee was passed, write the output not only to the terminal, but
|
||||
# additionally to the file test-results/$BASENAME.out, too.
|
||||
case "$GIT_TEST_TEE_STARTED, $* " in
|
||||
done,*)
|
||||
# do not redirect again
|
||||
;;
|
||||
*' --tee '*|*' --va'*)
|
||||
mkdir -p test-results
|
||||
BASE=test-results/$(basename "$0" .sh)
|
||||
(GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
|
||||
echo $? > $BASE.exit) | tee $BASE.out
|
||||
test "$(cat $BASE.exit)" = 0
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
|
||||
# Keep the original TERM for say_color
|
||||
ORIGINAL_TERM=$TERM
|
||||
|
||||
@@ -94,6 +110,10 @@ do
|
||||
--no-python)
|
||||
# noop now...
|
||||
shift ;;
|
||||
--va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
|
||||
valgrind=t; verbose=t; shift ;;
|
||||
--tee)
|
||||
shift ;; # was handled already
|
||||
*)
|
||||
break ;;
|
||||
esac
|
||||
@@ -434,7 +454,7 @@ test_create_repo () {
|
||||
repo="$1"
|
||||
mkdir -p "$repo"
|
||||
cd "$repo" || error "Cannot setup test environment"
|
||||
"$GIT_EXEC_PATH/git" init "--template=$GIT_EXEC_PATH/templates/blt/" >&3 2>&4 ||
|
||||
"$GIT_EXEC_PATH/git" init "--template=$owd/../templates/blt/" >&3 2>&4 ||
|
||||
error "cannot run git init -- have you built things yet?"
|
||||
mv .git/hooks .git/hooks-disabled
|
||||
cd "$owd"
|
||||
@@ -444,7 +464,7 @@ test_done () {
|
||||
trap - EXIT
|
||||
test_results_dir="$TEST_DIRECTORY/test-results"
|
||||
mkdir -p "$test_results_dir"
|
||||
test_results_path="$test_results_dir/${0%-*}-$$"
|
||||
test_results_path="$test_results_dir/${0%.sh}-$$"
|
||||
|
||||
echo "total $test_count" >> $test_results_path
|
||||
echo "success $test_success" >> $test_results_path
|
||||
@@ -492,8 +512,73 @@ test_done () {
|
||||
# Test the binaries we have just built. The tests are kept in
|
||||
# t/ subdirectory and are run in 'trash directory' subdirectory.
|
||||
TEST_DIRECTORY=$(pwd)
|
||||
PATH=$TEST_DIRECTORY/..:$PATH
|
||||
GIT_EXEC_PATH=$(pwd)/..
|
||||
if test -z "$valgrind"
|
||||
then
|
||||
PATH=$TEST_DIRECTORY/..:$PATH
|
||||
GIT_EXEC_PATH=$TEST_DIRECTORY/..
|
||||
else
|
||||
make_symlink () {
|
||||
test -h "$2" &&
|
||||
test "$1" = "$(readlink "$2")" || {
|
||||
# be super paranoid
|
||||
if mkdir "$2".lock
|
||||
then
|
||||
rm -f "$2" &&
|
||||
ln -s "$1" "$2" &&
|
||||
rm -r "$2".lock
|
||||
else
|
||||
while test -d "$2".lock
|
||||
do
|
||||
say "Waiting for lock on $2."
|
||||
sleep 1
|
||||
done
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
make_valgrind_symlink () {
|
||||
# handle only executables
|
||||
test -x "$1" || return
|
||||
|
||||
base=$(basename "$1")
|
||||
symlink_target=$TEST_DIRECTORY/../$base
|
||||
# do not override scripts
|
||||
if test -x "$symlink_target" &&
|
||||
test ! -d "$symlink_target" &&
|
||||
test "#!" != "$(head -c 2 < "$symlink_target")"
|
||||
then
|
||||
symlink_target=../valgrind.sh
|
||||
fi
|
||||
case "$base" in
|
||||
*.sh|*.perl)
|
||||
symlink_target=../unprocessed-script
|
||||
esac
|
||||
# create the link, or replace it if it is out of date
|
||||
make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
|
||||
}
|
||||
|
||||
# override all git executables in TEST_DIRECTORY/..
|
||||
GIT_VALGRIND=$TEST_DIRECTORY/valgrind
|
||||
mkdir -p "$GIT_VALGRIND"/bin
|
||||
for file in $TEST_DIRECTORY/../git* $TEST_DIRECTORY/../test-*
|
||||
do
|
||||
make_valgrind_symlink $file
|
||||
done
|
||||
OLDIFS=$IFS
|
||||
IFS=:
|
||||
for path in $PATH
|
||||
do
|
||||
ls "$path"/git-* 2> /dev/null |
|
||||
while read file
|
||||
do
|
||||
make_valgrind_symlink "$file"
|
||||
done
|
||||
done
|
||||
IFS=$OLDIFS
|
||||
PATH=$GIT_VALGRIND/bin:$PATH
|
||||
GIT_EXEC_PATH=$GIT_VALGRIND/bin
|
||||
export GIT_VALGRIND
|
||||
fi
|
||||
GIT_TEMPLATE_DIR=$(pwd)/../templates/blt
|
||||
unset GIT_CONFIG
|
||||
GIT_CONFIG_NOSYSTEM=1
|
||||
|
||||
2
t/valgrind/.gitignore
vendored
Normal file
2
t/valgrind/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/bin/
|
||||
/templates
|
||||
123
t/valgrind/analyze.sh
Executable file
123
t/valgrind/analyze.sh
Executable file
@@ -0,0 +1,123 @@
|
||||
#!/bin/sh
|
||||
|
||||
out_prefix=$(dirname "$0")/../test-results/valgrind.out
|
||||
output=
|
||||
count=0
|
||||
total_count=0
|
||||
missing_message=
|
||||
new_line='
|
||||
'
|
||||
|
||||
# start outputting the current valgrind error in $out_prefix.++$count,
|
||||
# and the test case which failed in the corresponding .message file
|
||||
start_output () {
|
||||
test -z "$output" || return
|
||||
|
||||
# progress
|
||||
total_count=$(($total_count+1))
|
||||
test -t 2 && printf "\rFound %d errors" $total_count >&2
|
||||
|
||||
count=$(($count+1))
|
||||
output=$out_prefix.$count
|
||||
: > $output
|
||||
|
||||
echo "*** $1 ***" > $output.message
|
||||
}
|
||||
|
||||
finish_output () {
|
||||
test ! -z "$output" || return
|
||||
output=
|
||||
|
||||
# if a test case has more than one valgrind error, we need to
|
||||
# copy the last .message file to the previous errors
|
||||
test -z "$missing_message" || {
|
||||
while test $missing_message -lt $count
|
||||
do
|
||||
cp $out_prefix.$count.message \
|
||||
$out_prefix.$missing_message.message
|
||||
missing_message=$(($missing_message+1))
|
||||
done
|
||||
missing_message=
|
||||
}
|
||||
}
|
||||
|
||||
# group the valgrind errors by backtrace
|
||||
output_all () {
|
||||
last_line=
|
||||
j=0
|
||||
i=1
|
||||
while test $i -le $count
|
||||
do
|
||||
# output <number> <backtrace-in-one-line>
|
||||
echo "$i $(tr '\n' ' ' < $out_prefix.$i)"
|
||||
i=$(($i+1))
|
||||
done |
|
||||
sort -t ' ' -k 2 | # order by <backtrace-in-one-line>
|
||||
while read number line
|
||||
do
|
||||
# find duplicates, do not output backtrace twice
|
||||
if test "$line" != "$last_line"
|
||||
then
|
||||
last_line=$line
|
||||
j=$(($j+1))
|
||||
printf "\nValgrind error $j:\n\n"
|
||||
cat $out_prefix.$number
|
||||
printf "\nfound in:\n"
|
||||
fi
|
||||
# print the test case where this came from
|
||||
printf "\n"
|
||||
cat $out_prefix.$number.message
|
||||
done
|
||||
}
|
||||
|
||||
handle_one () {
|
||||
OLDIFS=$IFS
|
||||
IFS="$new_line"
|
||||
while read line
|
||||
do
|
||||
case "$line" in
|
||||
# backtrace, possibly a new one
|
||||
==[0-9]*)
|
||||
|
||||
# Does the current valgrind error have a message yet?
|
||||
case "$output" in
|
||||
*.message)
|
||||
test -z "$missing_message" &&
|
||||
missing_message=$count
|
||||
output=
|
||||
esac
|
||||
|
||||
start_output $(basename $1)
|
||||
echo "$line" |
|
||||
sed 's/==[0-9]*==/==valgrind==/' >> $output
|
||||
;;
|
||||
# end of backtrace
|
||||
'}')
|
||||
test -z "$output" || {
|
||||
echo "$line" >> $output
|
||||
test $output = ${output%.message} &&
|
||||
output=$output.message
|
||||
}
|
||||
;;
|
||||
# end of test case
|
||||
'')
|
||||
finish_output
|
||||
;;
|
||||
# normal line; if $output is set, print the line
|
||||
*)
|
||||
test -z "$output" || echo "$line" >> $output
|
||||
;;
|
||||
esac
|
||||
done < $1
|
||||
IFS=$OLDIFS
|
||||
|
||||
# just to be safe
|
||||
finish_output
|
||||
}
|
||||
|
||||
for test_script in "$(dirname "$0")"/../test-results/*.out
|
||||
do
|
||||
handle_one $test_script
|
||||
done
|
||||
|
||||
output_all
|
||||
45
t/valgrind/default.supp
Normal file
45
t/valgrind/default.supp
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
ignore-zlib-errors-cond
|
||||
Memcheck:Cond
|
||||
obj:*libz.so*
|
||||
}
|
||||
|
||||
{
|
||||
ignore-zlib-errors-value8
|
||||
Memcheck:Value8
|
||||
obj:*libz.so*
|
||||
}
|
||||
|
||||
{
|
||||
ignore-zlib-errors-value4
|
||||
Memcheck:Value4
|
||||
obj:*libz.so*
|
||||
}
|
||||
|
||||
{
|
||||
ignore-ldso-cond
|
||||
Memcheck:Cond
|
||||
obj:*ld-*.so
|
||||
}
|
||||
|
||||
{
|
||||
ignore-ldso-addr8
|
||||
Memcheck:Addr8
|
||||
obj:*ld-*.so
|
||||
}
|
||||
|
||||
{
|
||||
ignore-ldso-addr4
|
||||
Memcheck:Addr4
|
||||
obj:*ld-*.so
|
||||
}
|
||||
|
||||
{
|
||||
writing-data-from-zlib-triggers-even-more-errors
|
||||
Memcheck:Param
|
||||
write(buf)
|
||||
obj:/lib/ld-*.so
|
||||
fun:write_in_full
|
||||
fun:write_buffer
|
||||
fun:write_loose_object
|
||||
}
|
||||
22
t/valgrind/valgrind.sh
Executable file
22
t/valgrind/valgrind.sh
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
|
||||
base=$(basename "$0")
|
||||
|
||||
TRACK_ORIGINS=
|
||||
|
||||
VALGRIND_VERSION=$(valgrind --version)
|
||||
VALGRIND_MAJOR=$(expr "$VALGRIND_VERSION" : '[^0-9]*\([0-9]*\)')
|
||||
VALGRIND_MINOR=$(expr "$VALGRIND_VERSION" : '[^0-9]*[0-9]*\.\([0-9]*\)')
|
||||
test 3 -gt "$VALGRIND_MAJOR" ||
|
||||
test 3 -eq "$VALGRIND_MAJOR" -a 4 -gt "$VALGRIND_MINOR" ||
|
||||
TRACK_ORIGINS=--track-origins=yes
|
||||
|
||||
exec valgrind -q --error-exitcode=126 \
|
||||
--leak-check=no \
|
||||
--suppressions="$GIT_VALGRIND/default.supp" \
|
||||
--gen-suppressions=all \
|
||||
$TRACK_ORIGINS \
|
||||
--log-fd=4 \
|
||||
--input-fd=4 \
|
||||
$GIT_VALGRIND_OPTIONS \
|
||||
"$GIT_VALGRIND"/../../"$base" "$@"
|
||||
Reference in New Issue
Block a user