tests: fix broken &&-chains in compound statements
The top-level &&-chain checker built into t/test-lib.sh causes tests to magically exit with code 117 if the &&-chain is broken. However, it has the shortcoming that the magic does not work within `{...}` groups, `(...)` subshells, `$(...)` substitutions, or within bodies of compound statements, such as `if`, `for`, `while`, `case`, etc. `chainlint.sed` partly fills in the gap by catching broken &&-chains in `(...)` subshells, but bugs can still lurk behind broken &&-chains in the other cases. Fix broken &&-chains in compound statements in order to reduce the number of possible lurking bugs. Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Reviewed-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
0849541268
commit
74d2f5695d
@ -24,17 +24,17 @@ test_perf_default_repo
|
||||
test_expect_success "setup repo" '
|
||||
if git rev-parse --verify refs/heads/p0006-ballast^{commit}
|
||||
then
|
||||
echo Assuming synthetic repo from many-files.sh
|
||||
git branch br_base master
|
||||
git branch br_ballast p0006-ballast
|
||||
git config --local core.sparsecheckout 1
|
||||
echo Assuming synthetic repo from many-files.sh &&
|
||||
git branch br_base master &&
|
||||
git branch br_ballast p0006-ballast &&
|
||||
git config --local core.sparsecheckout 1 &&
|
||||
cat >.git/info/sparse-checkout <<-EOF
|
||||
/*
|
||||
!ballast/*
|
||||
EOF
|
||||
else
|
||||
echo Assuming non-synthetic repo...
|
||||
git branch br_base $(git rev-list HEAD | tail -n 1)
|
||||
echo Assuming non-synthetic repo... &&
|
||||
git branch br_base $(git rev-list HEAD | tail -n 1) &&
|
||||
git branch br_ballast HEAD
|
||||
fi &&
|
||||
git checkout -q br_ballast &&
|
||||
|
@ -24,21 +24,21 @@ test_perf_default_repo
|
||||
test_expect_success "setup repo" '
|
||||
if git rev-parse --verify refs/heads/p0006-ballast^{commit}
|
||||
then
|
||||
echo Assuming synthetic repo from many-files.sh
|
||||
git branch br_base master
|
||||
git branch br_ballast p0006-ballast^
|
||||
git branch br_ballast_alias p0006-ballast^
|
||||
git branch br_ballast_plus_1 p0006-ballast
|
||||
git config --local core.sparsecheckout 1
|
||||
echo Assuming synthetic repo from many-files.sh &&
|
||||
git branch br_base master &&
|
||||
git branch br_ballast p0006-ballast^ &&
|
||||
git branch br_ballast_alias p0006-ballast^ &&
|
||||
git branch br_ballast_plus_1 p0006-ballast &&
|
||||
git config --local core.sparsecheckout 1 &&
|
||||
cat >.git/info/sparse-checkout <<-EOF
|
||||
/*
|
||||
!ballast/*
|
||||
EOF
|
||||
else
|
||||
echo Assuming non-synthetic repo...
|
||||
git branch br_base $(git rev-list HEAD | tail -n 1)
|
||||
git branch br_ballast HEAD^ || error "no ancestor commit from current head"
|
||||
git branch br_ballast_alias HEAD^
|
||||
echo Assuming non-synthetic repo... &&
|
||||
git branch br_base $(git rev-list HEAD | tail -n 1) &&
|
||||
git branch br_ballast HEAD^ || error "no ancestor commit from current head" &&
|
||||
git branch br_ballast_alias HEAD^ &&
|
||||
git branch br_ballast_plus_1 HEAD
|
||||
fi &&
|
||||
git checkout -q br_ballast &&
|
||||
|
@ -9,8 +9,8 @@ test_perf_default_repo
|
||||
test_expect_success "setup repo" '
|
||||
if git rev-parse --verify refs/heads/p0006-ballast^{commit}
|
||||
then
|
||||
echo Assuming synthetic repo from many-files.sh
|
||||
git config --local core.sparsecheckout 1
|
||||
echo Assuming synthetic repo from many-files.sh &&
|
||||
git config --local core.sparsecheckout 1 &&
|
||||
cat >.git/info/sparse-checkout <<-EOF
|
||||
/*
|
||||
!ballast/*
|
||||
|
@ -21,7 +21,7 @@ test_expect_success 'set up thread-counting tests' '
|
||||
threads= &&
|
||||
while test $t -gt 0
|
||||
do
|
||||
threads="$t $threads"
|
||||
threads="$t $threads" &&
|
||||
t=$((t / 2))
|
||||
done
|
||||
'
|
||||
|
@ -126,10 +126,10 @@ done
|
||||
# Measure pack loading with 10,000 packs.
|
||||
test_expect_success 'generate lots of packs' '
|
||||
for i in $(test_seq 10000); do
|
||||
echo "blob"
|
||||
echo "data <<EOF"
|
||||
echo "blob $i"
|
||||
echo "EOF"
|
||||
echo "blob" &&
|
||||
echo "data <<EOF" &&
|
||||
echo "blob $i" &&
|
||||
echo "EOF" &&
|
||||
echo "checkpoint"
|
||||
done |
|
||||
git -c fastimport.unpackLimit=0 fast-import
|
||||
|
@ -54,7 +54,7 @@ test_expect_success 'add a large file or two' '
|
||||
bad= count=0 idx= &&
|
||||
for p in .git/objects/pack/pack-*.pack
|
||||
do
|
||||
count=$(( $count + 1 ))
|
||||
count=$(( $count + 1 )) &&
|
||||
if test_path_is_file "$p" &&
|
||||
idx=${p%.pack}.idx && test_path_is_file "$idx"
|
||||
then
|
||||
@ -78,7 +78,7 @@ test_expect_success 'add a large file or two' '
|
||||
bad= count=0 &&
|
||||
for p in .git/objects/pack/pack-*.pack
|
||||
do
|
||||
count=$(( $count + 1 ))
|
||||
count=$(( $count + 1 )) &&
|
||||
if test_path_is_file "$p" &&
|
||||
idx=${p%.pack}.idx && test_path_is_file "$idx"
|
||||
then
|
||||
|
@ -717,7 +717,7 @@ test_expect_success bool '
|
||||
rm -f result &&
|
||||
for i in 1 2 3 4
|
||||
do
|
||||
git config --bool --get bool.true$i >>result
|
||||
git config --bool --get bool.true$i >>result &&
|
||||
git config --bool --get bool.false$i >>result
|
||||
done &&
|
||||
test_cmp expect result'
|
||||
|
@ -48,10 +48,10 @@ test_expect_success 'enable split index' '
|
||||
# NEEDSWORK: Stop hard-coding checksums.
|
||||
if test "$indexversion" = "4"
|
||||
then
|
||||
own=$(test_oid own_v4)
|
||||
own=$(test_oid own_v4) &&
|
||||
base=$(test_oid base_v4)
|
||||
else
|
||||
own=$(test_oid own_v3)
|
||||
own=$(test_oid own_v3) &&
|
||||
base=$(test_oid base_v3)
|
||||
fi &&
|
||||
|
||||
|
@ -150,8 +150,8 @@ test_expect_success 'add -u resolves unmerged paths' '
|
||||
{
|
||||
for path in path1 path2
|
||||
do
|
||||
echo "100644 $one 1 $path"
|
||||
echo "100644 $two 2 $path"
|
||||
echo "100644 $one 1 $path" &&
|
||||
echo "100644 $two 2 $path" &&
|
||||
echo "100644 $three 3 $path"
|
||||
done
|
||||
echo "100644 $one 1 path3"
|
||||
|
@ -193,7 +193,7 @@ match() {
|
||||
file=$(cat .git/expected_test_file) &&
|
||||
if should_create_test_file "$file"
|
||||
then
|
||||
dirs=${file%/*}
|
||||
dirs=${file%/*} &&
|
||||
if test "$file" != "$dirs"
|
||||
then
|
||||
mkdir -p -- "$dirs" &&
|
||||
|
@ -141,8 +141,8 @@ test_expect_success 'check correct prefix detection' '
|
||||
test_expect_success 'git add with filemode=0, symlinks=0, and unmerged entries' '
|
||||
for s in 1 2 3
|
||||
do
|
||||
echo $s > stage$s
|
||||
echo "100755 $(git hash-object -w stage$s) $s file"
|
||||
echo $s > stage$s &&
|
||||
echo "100755 $(git hash-object -w stage$s) $s file" &&
|
||||
echo "120000 $(printf $s | git hash-object -w -t blob --stdin) $s symlink"
|
||||
done | git update-index --index-info &&
|
||||
git config core.filemode 0 &&
|
||||
|
@ -18,7 +18,7 @@ test_expect_success setup '
|
||||
for t in o x
|
||||
do
|
||||
path="$b$o$t" &&
|
||||
case "$path" in ooo) continue ;; esac
|
||||
case "$path" in ooo) continue ;; esac &&
|
||||
paths="$paths$path " &&
|
||||
p=" $path" &&
|
||||
case "$b" in x) echo "$m1$p" ;; esac &&
|
||||
|
@ -45,8 +45,8 @@ test_expect_success 'apply should fail gracefully' '
|
||||
echo Oops, should not have succeeded
|
||||
false
|
||||
else
|
||||
status=$?
|
||||
echo "Status was $status"
|
||||
status=$? &&
|
||||
echo "Status was $status" &&
|
||||
if test -f .git/index.lock
|
||||
then
|
||||
echo Oops, should not have crashed
|
||||
|
@ -29,7 +29,7 @@ test_expect_success setup '
|
||||
x=1 &&
|
||||
while test $x -lt $n
|
||||
do
|
||||
printf "%63s%d\n" "" $x >>after
|
||||
printf "%63s%d\n" "" $x >>after &&
|
||||
x=$(( $x + 1 ))
|
||||
done &&
|
||||
printf "\t%s\n" d e f >>after &&
|
||||
@ -40,7 +40,7 @@ test_expect_success setup '
|
||||
x=1 &&
|
||||
while test $x -lt $n
|
||||
do
|
||||
printf "%63s%d\n" "" $x >>expect-2
|
||||
printf "%63s%d\n" "" $x >>expect-2 &&
|
||||
x=$(( $x + 1 ))
|
||||
done &&
|
||||
printf "%64s\n" d e f >>expect-2 &&
|
||||
@ -52,7 +52,7 @@ test_expect_success setup '
|
||||
x=0 &&
|
||||
while test $x -lt $n
|
||||
do
|
||||
printf "%63s%02d\n" "" $x >>after
|
||||
printf "%63s%02d\n" "" $x >>after &&
|
||||
x=$(( $x + 1 ))
|
||||
done &&
|
||||
printf "\t%s\n" d e f >>after &&
|
||||
@ -63,7 +63,7 @@ test_expect_success setup '
|
||||
x=0 &&
|
||||
while test $x -lt $n
|
||||
do
|
||||
printf "%63s%02d\n" "" $x >>expect-3
|
||||
printf "%63s%02d\n" "" $x >>expect-3 &&
|
||||
x=$(( $x + 1 ))
|
||||
done &&
|
||||
printf "%64s\n" d e f >>expect-3 &&
|
||||
@ -73,15 +73,15 @@ test_expect_success setup '
|
||||
x=0 &&
|
||||
while test $x -lt 50
|
||||
do
|
||||
printf "\t%02d\n" $x >>before
|
||||
printf "\t%02d\n" $x >>before &&
|
||||
x=$(( $x + 1 ))
|
||||
done &&
|
||||
cat before >after &&
|
||||
printf "%64s\n" a b c >>after &&
|
||||
while test $x -lt 100
|
||||
do
|
||||
printf "\t%02d\n" $x >>before
|
||||
printf "\t%02d\n" $x >>after
|
||||
printf "\t%02d\n" $x >>before &&
|
||||
printf "\t%02d\n" $x >>after &&
|
||||
x=$(( $x + 1 ))
|
||||
done &&
|
||||
test_expect_code 1 git diff --no-index before after >patch4.patch.raw &&
|
||||
@ -90,15 +90,15 @@ test_expect_success setup '
|
||||
x=0 &&
|
||||
while test $x -lt 50
|
||||
do
|
||||
printf "%63s%02d\n" "" $x >>test-4
|
||||
printf "%63s%02d\n" "" $x >>test-4 &&
|
||||
x=$(( $x + 1 ))
|
||||
done &&
|
||||
cat test-4 >expect-4 &&
|
||||
printf "%64s\n" a b c >>expect-4 &&
|
||||
while test $x -lt 100
|
||||
do
|
||||
printf "%63s%02d\n" "" $x >>test-4
|
||||
printf "%63s%02d\n" "" $x >>expect-4
|
||||
printf "%63s%02d\n" "" $x >>test-4 &&
|
||||
printf "%63s%02d\n" "" $x >>expect-4 &&
|
||||
x=$(( $x + 1 ))
|
||||
done &&
|
||||
|
||||
|
@ -14,7 +14,7 @@ test_expect_success 'setup' '
|
||||
i=1 &&
|
||||
while test $i -le 100
|
||||
do
|
||||
iii=$(printf "%03i" $i)
|
||||
iii=$(printf "%03i" $i) &&
|
||||
test-tool genrandom "bar" 200 > wide_delta_$iii &&
|
||||
test-tool genrandom "baz $iii" 50 >> wide_delta_$iii &&
|
||||
test-tool genrandom "foo"$i 100 > deep_delta_$iii &&
|
||||
|
@ -16,8 +16,8 @@ test_expect_success 'setup r1' '
|
||||
git init r1 &&
|
||||
for n in 1 2 3 4 5
|
||||
do
|
||||
echo "This is file: $n" > r1/file.$n
|
||||
git -C r1 add file.$n
|
||||
echo "This is file: $n" > r1/file.$n &&
|
||||
git -C r1 add file.$n &&
|
||||
git -C r1 commit -m "$n"
|
||||
done
|
||||
'
|
||||
@ -116,8 +116,8 @@ test_expect_success 'setup r2' '
|
||||
git init r2 &&
|
||||
for n in 1000 10000
|
||||
do
|
||||
printf "%"$n"s" X > r2/large.$n
|
||||
git -C r2 add large.$n
|
||||
printf "%"$n"s" X > r2/large.$n &&
|
||||
git -C r2 add large.$n &&
|
||||
git -C r2 commit -m "$n"
|
||||
done
|
||||
'
|
||||
@ -278,9 +278,9 @@ test_expect_success 'setup r3' '
|
||||
mkdir r3/dir1 &&
|
||||
for n in sparse1 sparse2
|
||||
do
|
||||
echo "This is file: $n" > r3/$n
|
||||
git -C r3 add $n
|
||||
echo "This is file: dir1/$n" > r3/dir1/$n
|
||||
echo "This is file: $n" > r3/$n &&
|
||||
git -C r3 add $n &&
|
||||
echo "This is file: dir1/$n" > r3/dir1/$n &&
|
||||
git -C r3 add dir1/$n
|
||||
done &&
|
||||
git -C r3 commit -m "sparse" &&
|
||||
@ -331,9 +331,9 @@ test_expect_success 'setup r4' '
|
||||
mkdir r4/dir1 &&
|
||||
for n in sparse1 sparse2
|
||||
do
|
||||
echo "This is file: $n" > r4/$n
|
||||
git -C r4 add $n
|
||||
echo "This is file: dir1/$n" > r4/dir1/$n
|
||||
echo "This is file: $n" > r4/$n &&
|
||||
git -C r4 add $n &&
|
||||
echo "This is file: dir1/$n" > r4/dir1/$n &&
|
||||
git -C r4 add dir1/$n
|
||||
done &&
|
||||
echo dir1/ >r4/pattern &&
|
||||
|
@ -117,7 +117,7 @@ test_expect_success 'set up many-ref tests' '
|
||||
nr=1000
|
||||
while test $nr -lt 2000
|
||||
do
|
||||
nr=$(( $nr + 1 ))
|
||||
nr=$(( $nr + 1 )) &&
|
||||
echo "create refs/heads/b/$nr $COMMIT3"
|
||||
done
|
||||
} | git update-ref --stdin
|
||||
|
@ -16,9 +16,9 @@ test_expect_success 'setup normal src repo' '
|
||||
git init src &&
|
||||
for n in 1 2 3 4
|
||||
do
|
||||
echo "This is file: $n" > src/file.$n.txt
|
||||
git -C src add file.$n.txt
|
||||
git -C src commit -m "file $n"
|
||||
echo "This is file: $n" > src/file.$n.txt &&
|
||||
git -C src add file.$n.txt &&
|
||||
git -C src commit -m "file $n" &&
|
||||
git -C src ls-files -s file.$n.txt >>temp
|
||||
done &&
|
||||
awk -f print_2.awk <temp | sort >expect_1.oids &&
|
||||
@ -72,8 +72,8 @@ test_expect_success 'push new commits to server' '
|
||||
git -C src remote add srv "file://$(pwd)/srv.bare" &&
|
||||
for x in a b c d e
|
||||
do
|
||||
echo "Mod file.1.txt $x" >>src/file.1.txt
|
||||
git -C src add file.1.txt
|
||||
echo "Mod file.1.txt $x" >>src/file.1.txt &&
|
||||
git -C src add file.1.txt &&
|
||||
git -C src commit -m "mod $x"
|
||||
done &&
|
||||
git -C src blame main -- file.1.txt >expect.blame &&
|
||||
@ -114,8 +114,8 @@ test_expect_success 'verify blame causes dynamic object fetch' '
|
||||
test_expect_success 'push new commits to server for file.2.txt' '
|
||||
for x in a b c d e f
|
||||
do
|
||||
echo "Mod file.2.txt $x" >>src/file.2.txt
|
||||
git -C src add file.2.txt
|
||||
echo "Mod file.2.txt $x" >>src/file.2.txt &&
|
||||
git -C src add file.2.txt &&
|
||||
git -C src commit -m "mod $x"
|
||||
done &&
|
||||
git -C src push -u srv main
|
||||
@ -135,8 +135,8 @@ test_expect_success 'override inherited filter-spec using --no-filter' '
|
||||
test_expect_success 'push new commits to server for file.3.txt' '
|
||||
for x in a b c d e f
|
||||
do
|
||||
echo "Mod file.3.txt $x" >>src/file.3.txt
|
||||
git -C src add file.3.txt
|
||||
echo "Mod file.3.txt $x" >>src/file.3.txt &&
|
||||
git -C src add file.3.txt &&
|
||||
git -C src commit -m "mod $x"
|
||||
done &&
|
||||
git -C src push -u srv main
|
||||
|
@ -5,10 +5,10 @@ test_description='git rev-list --max-count and --skip test'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
for n in 1 2 3 4 5 ; do \
|
||||
echo $n > a ; \
|
||||
git add a ; \
|
||||
git commit -m "$n" ; \
|
||||
for n in 1 2 3 4 5 ; do
|
||||
echo $n > a &&
|
||||
git add a &&
|
||||
git commit -m "$n"
|
||||
done
|
||||
'
|
||||
|
||||
|
@ -142,7 +142,7 @@ test_expect_success 'ancestors with the same commit time' '
|
||||
|
||||
test_tick_keep=$test_tick &&
|
||||
for i in 1 2 3 4 5 6 7 8; do
|
||||
test_tick=$test_tick_keep
|
||||
test_tick=$test_tick_keep &&
|
||||
test_commit t$i
|
||||
done &&
|
||||
git rev-list t1^! --not t$i >result &&
|
||||
|
@ -16,8 +16,8 @@ test_expect_success 'setup r1' '
|
||||
git init r1 &&
|
||||
for n in 1 2 3 4 5
|
||||
do
|
||||
echo "This is file: $n" > r1/file.$n
|
||||
git -C r1 add file.$n
|
||||
echo "This is file: $n" > r1/file.$n &&
|
||||
git -C r1 add file.$n &&
|
||||
git -C r1 commit -m "$n"
|
||||
done
|
||||
'
|
||||
@ -73,8 +73,8 @@ test_expect_success 'setup r2' '
|
||||
git init r2 &&
|
||||
for n in 1000 10000
|
||||
do
|
||||
printf "%"$n"s" X > r2/large.$n
|
||||
git -C r2 add large.$n
|
||||
printf "%"$n"s" X > r2/large.$n &&
|
||||
git -C r2 add large.$n &&
|
||||
git -C r2 commit -m "$n"
|
||||
done
|
||||
'
|
||||
@ -245,9 +245,9 @@ test_expect_success 'setup r3' '
|
||||
mkdir r3/dir1 &&
|
||||
for n in sparse1 sparse2
|
||||
do
|
||||
echo "This is file: $n" > r3/$n
|
||||
git -C r3 add $n
|
||||
echo "This is file: dir1/$n" > r3/dir1/$n
|
||||
echo "This is file: $n" > r3/$n &&
|
||||
git -C r3 add $n &&
|
||||
echo "This is file: dir1/$n" > r3/dir1/$n &&
|
||||
git -C r3 add dir1/$n
|
||||
done &&
|
||||
git -C r3 commit -m "sparse" &&
|
||||
|
@ -390,8 +390,11 @@ test_expect_success ULIMIT_STACK_SIZE 'name-rev works in a deep repo' '
|
||||
committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200
|
||||
data <<EOF
|
||||
commit #$i
|
||||
EOF"
|
||||
test $i = 1 && echo "from refs/heads/main^0"
|
||||
EOF" &&
|
||||
if test $i = 1
|
||||
then
|
||||
echo "from refs/heads/main^0"
|
||||
fi &&
|
||||
i=$(($i + 1))
|
||||
done | git fast-import &&
|
||||
git checkout main &&
|
||||
|
@ -47,7 +47,7 @@ test_expect_success resolve '
|
||||
echo Oops, should not have succeeded
|
||||
false
|
||||
else
|
||||
git ls-files -s >current
|
||||
git ls-files -s >current &&
|
||||
test_cmp expect current
|
||||
fi
|
||||
'
|
||||
@ -62,7 +62,7 @@ test_expect_success recursive '
|
||||
echo Oops, should not have succeeded
|
||||
false
|
||||
else
|
||||
git ls-files -s >current
|
||||
git ls-files -s >current &&
|
||||
test_cmp expect current
|
||||
fi
|
||||
'
|
||||
|
@ -47,7 +47,7 @@ test_rename() {
|
||||
git commit -a -m change=$n &&
|
||||
git checkout -b test$n HEAD^ &&
|
||||
for i in $(count $n); do
|
||||
git rm $i
|
||||
git rm $i &&
|
||||
make_text $i initial changed >$i.moved
|
||||
done &&
|
||||
git add . &&
|
||||
|
@ -1976,8 +1976,11 @@ test_expect_success ULIMIT_STACK_SIZE '--contains and --no-contains work in a de
|
||||
committer A U Thor <author@example.com> $((1000000000 + $i * 100)) +0200
|
||||
data <<EOF
|
||||
commit #$i
|
||||
EOF"
|
||||
test $i = 1 && echo "from refs/heads/main^0"
|
||||
EOF" &&
|
||||
if test $i = 1
|
||||
then
|
||||
echo "from refs/heads/main^0"
|
||||
fi &&
|
||||
i=$(($i + 1))
|
||||
done | git fast-import &&
|
||||
git checkout main &&
|
||||
|
@ -248,7 +248,7 @@ do
|
||||
git config core.preloadIndex $preload_val &&
|
||||
if test $preload_val = true
|
||||
then
|
||||
GIT_TEST_PRELOAD_INDEX=$preload_val; export GIT_TEST_PRELOAD_INDEX
|
||||
GIT_TEST_PRELOAD_INDEX=$preload_val && export GIT_TEST_PRELOAD_INDEX
|
||||
else
|
||||
sane_unset GIT_TEST_PRELOAD_INDEX
|
||||
fi
|
||||
|
@ -29,7 +29,7 @@ test_expect_success 'merge c1 with c2, c3, c4, ... c29' '
|
||||
refs="" &&
|
||||
while test $i -le 30
|
||||
do
|
||||
refs="$refs c$i"
|
||||
refs="$refs c$i" &&
|
||||
i=$(expr $i + 1)
|
||||
done &&
|
||||
git merge $refs &&
|
||||
|
@ -59,7 +59,7 @@ test_expect_success 'authors-file against globs' '
|
||||
git svn clone --authors-file=svn-authors -s "$svnrepo"/aa aa-work &&
|
||||
for i in bb ee cc
|
||||
do
|
||||
branch="aa/branches/$i"
|
||||
branch="aa/branches/$i" &&
|
||||
svn_cmd mkdir -m "$branch" --username $i "$svnrepo/$branch"
|
||||
done
|
||||
'
|
||||
|
Loading…
Reference in New Issue
Block a user