#! /bin/sh

function mode_type {
  ruby -e "printf %Q(%o:%s\n), File.stat(%q($1)).mode, File.ftype(%q($1))"
}

rm -rf src dest

mkdir dest
cp -rp data src
cd src
ln -s foo foobar
cd ..

today=`date +%Y/%m/%d`
yesterday=`date --date '1 day ago' +%Y/%m/%d`

../pdumpfs src dest > tmp.log || exit 1
diff -r src dest/$today/src || exit 1
mv dest/$today dest/$yesterday

echo update > src/foo
mkdir src/newdir
echo newfile > src/newdir/newfile
echo newfile2 > src/newfile2
rm -f src/bar

# change a real file to a symlink
rm src/file
cd src
ln -s foo file
cd ..

../pdumpfs src dest > tmp.log || exit 1
diff -r src dest/$today/src || exit 1

grep '^unchanged' tmp.log  | perl -pe 's/^unchanged\s+//' | while read i; do
   i1=`ls -i dest/$yesterday/$i`
   i2=`ls -i  dest/$today/$i`
   test "$i1" = "$i2" || exit 1
done
rm -f tmp.log

find src |sort | while read srcfile; do
   destfile="dest/$today/$srcfile"
   if test "`mode_type $srcfile`" != "`mode_type $destfile`"; then
       echo "error: modes of $srcfile and $destfile differ"
       exit 1
   fi
done || exit 1

rm -rf dest2
mkdir dest2
# no files should be copied
../pdumpfs --exclude-by-size 0 src dest2 > tmp.log || exit 1
test `find dest2 -type f | wc -l` = 0 || exit 1

rm -rf dest3
mkdir dest3
../pdumpfs --exclude foo --exclude bar src dest3 > tmp.log || exit 1
test -z "`find dest3 -type f | egrep 'foo|bar'`" || exit 1

rm -rf dest4
mkdir dest4
../pdumpfs --exclude-by-glob 'new*' src dest4 > tmp.log || exit 1
test -z "`find dest4 -type f | egrep new`" || exit 1

rm -rf src dest dest?
echo ok.
exit 0
