git-commit-vandalism/t/t5400-send-pack.sh
Junio C Hamano 3af828634f tests: do not use implicit "git diff --no-index"
As a general principle, we should not use "git diff" to validate the
results of what git command that is being tested has done.  We would not
know if we are testing the command in question, or locating a bug in the
cute hack of "git diff --no-index".

Rather use test_cmp for that purpose.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-05-24 00:01:56 -07:00

175 lines
4.1 KiB
Bash
Executable File

#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
#
test_description='See why rewinding head breaks send-pack
'
. ./test-lib.sh
cnt=64
test_expect_success setup '
test_tick &&
mkdir mozart mozart/is &&
echo "Commit #0" >mozart/is/pink &&
git update-index --add mozart/is/pink &&
tree=$(git write-tree) &&
commit=$(echo "Commit #0" | git commit-tree $tree) &&
zero=$commit &&
parent=$zero &&
i=0 &&
while test $i -le $cnt
do
i=$(($i+1)) &&
test_tick &&
echo "Commit #$i" >mozart/is/pink &&
git update-index --add mozart/is/pink &&
tree=$(git write-tree) &&
commit=$(echo "Commit #$i" | git commit-tree $tree -p $parent) &&
git update-ref refs/tags/commit$i $commit &&
parent=$commit || return 1
done &&
git update-ref HEAD "$commit" &&
git-clone ./. victim &&
cd victim &&
git log &&
cd .. &&
git update-ref HEAD "$zero" &&
parent=$zero &&
i=0 &&
while test $i -le $cnt
do
i=$(($i+1)) &&
test_tick &&
echo "Rebase #$i" >mozart/is/pink &&
git update-index --add mozart/is/pink &&
tree=$(git write-tree) &&
commit=$(echo "Rebase #$i" | git commit-tree $tree -p $parent) &&
git update-ref refs/tags/rebase$i $commit &&
parent=$commit || return 1
done &&
git update-ref HEAD "$commit" &&
echo Rebase &&
git log'
test_expect_success 'pack the source repository' '
git repack -a -d &&
git prune
'
test_expect_success 'pack the destination repository' '
cd victim &&
git repack -a -d &&
git prune &&
cd ..
'
test_expect_success \
'pushing rewound head should not barf but require --force' '
# should not fail but refuse to update.
if git-send-pack ./victim/.git/ master
then
# now it should fail with Pasky patch
echo >&2 Gaah, it should have failed.
false
else
echo >&2 Thanks, it correctly failed.
true
fi &&
if cmp victim/.git/refs/heads/master .git/refs/heads/master
then
# should have been left as it was!
false
else
true
fi &&
# this should update
git-send-pack --force ./victim/.git/ master &&
cmp victim/.git/refs/heads/master .git/refs/heads/master
'
test_expect_success \
'push can be used to delete a ref' '
cd victim &&
git branch extra master &&
cd .. &&
test -f victim/.git/refs/heads/extra &&
git-send-pack ./victim/.git/ :extra master &&
! test -f victim/.git/refs/heads/extra
'
unset GIT_CONFIG GIT_CONFIG_LOCAL
HOME=`pwd`/no-such-directory
export HOME ;# this way we force the victim/.git/config to be used.
test_expect_success \
'pushing with --force should be denied with denyNonFastforwards' '
cd victim &&
git config receive.denyNonFastforwards true &&
cd .. &&
git update-ref refs/heads/master master^ || return 1
git-send-pack --force ./victim/.git/ master && return 1
! test_cmp .git/refs/heads/master victim/.git/refs/heads/master
'
test_expect_success \
'pushing does not include non-head refs' '
mkdir parent && cd parent &&
git-init && touch file && git-add file && git-commit -m add &&
cd .. &&
git-clone parent child && cd child && git-push --all &&
cd ../parent &&
git-branch -a >branches && ! grep origin/master branches
'
rewound_push_setup() {
rm -rf parent child &&
mkdir parent && cd parent &&
git-init && echo one >file && git-add file && git-commit -m one &&
echo two >file && git-commit -a -m two &&
cd .. &&
git-clone parent child && cd child && git-reset --hard HEAD^
}
rewound_push_succeeded() {
cmp ../parent/.git/refs/heads/master .git/refs/heads/master
}
rewound_push_failed() {
if rewound_push_succeeded
then
false
else
true
fi
}
test_expect_success \
'pushing explicit refspecs respects forcing' '
rewound_push_setup &&
if git-send-pack ../parent/.git refs/heads/master:refs/heads/master
then
false
else
true
fi && rewound_push_failed &&
git-send-pack ../parent/.git +refs/heads/master:refs/heads/master &&
rewound_push_succeeded
'
test_expect_success \
'pushing wildcard refspecs respects forcing' '
rewound_push_setup &&
if git-send-pack ../parent/.git refs/heads/*:refs/heads/*
then
false
else
true
fi && rewound_push_failed &&
git-send-pack ../parent/.git +refs/heads/*:refs/heads/* &&
rewound_push_succeeded
'
test_done