#!/bin/bash

set -e 
$PREPARE_CLEAN > /dev/null
$INCLUDE_FUNCS
cd $WC

logfile=$LOGDIR/003.change_types

if [[ $UID -eq 0 ]]
then
	ONLY_ROOT=
else
	ONLY_ROOT=ignore_func
	function ignore_func()
	{
	  true
	}
fi

if test -d typechange
then
  rm -r typechange
fi

mkdir typechange
 pushd typechange > /dev/null

 for i in file device symlink dir missing fifo
 do
	 echo file $RANDOM > file-$i
	 $ONLY_ROOT cp -a /dev/zero device-$i
	 ln -s file-$i symlink-$i
	 mkdir dir-$i
	 echo sub $RANDOM > dir-$i/sub-entry
	 mkdir dir-$i/sub
	 echo $RANDOM > dir-$i/sub/sub-entry
	 mkfifo fifo-$i
 done
popd > /dev/null


$BINq ci -m "inserted types" -o delay=yes > $logfile
rev=`grep "revision	" $logfile | tail -1 | cut -f2 -d"	" | cut -f1 -d" "` 
$INFO "initial checkin is r$rev"

# now goto other wc and update
pushd $WC2 > /dev/null
$BINq up

$BINdflt st > $logfile

$COMPARE -x change/fifo- $WC/ $WC2/
popd > /dev/null

rm -r typechange/*
pushd typechange > /dev/null

 for i in file device symlink dir missing fifo
 do
	 echo file $RANDOM > $i-file
	 $ONLY_ROOT cp -a /dev/zero $i-device
	 ln -s $i-file $i-symlink
	 mkdir $i-dir
	 echo sub $RANDOM > $i-dir/sub-entry
	 mkdir $i-dir/sub
	 echo $RANDOM > $i-dir/sub/sub-entry
	 mkfifo $i-fifo
 done
popd > /dev/null

$BINq ci -m "changed types" -o delay=yes > $logfile
if [[ `$BINdflt st -C -C | wc -l` -ne 0 ]]
then
	$BINdflt st -C -C
	$ERROR "Entries left out of commit"
fi
$INFO "typechange done, running update"

$BINdflt up $WC2 > $logfile
$INFO "update done"

$COMPARE -x "change/.*-fifo" $WC/ $WC2/
$SUCCESS "all types changed to other types."

export FSVS_WARNING="mixed-rev-wc=ignore"

$BINdflt diff -v -v -r$rev -R > $logfile

# Now we change WC1 by using revert, and WC2 via update.
$INFO "Using r$rev as compare point"
$BINq up -r$rev $WC2 > $logfile
$BINq revert -r$rev -R -R . > $logfile
$SUCCESS "Revert works across type-changes too."

# WC1 still has FIFOs left
$COMPARE -x "change/.*-fifo" $WC/ $WC2/
$SUCCESS "Revert across type-changes ok"


for wc in "$WC1" "$WC1 -rHEAD" "$WC2 -rHEAD"
do
	$INFO "Diff on $wc"

	LANG=C $BINdflt -v -v diff -rHEAD -R > $logfile
	# The specific number depends on whether devices are done etc.
	# But at least we know that FSVS doesn't crash.
	if [[ `wc -l < $logfile` -lt 25 ]]
	then
		$ERROR "Diff over type-changes wrong?"
	fi

	# A single thing is checked, though.
	if perl -e 'undef $/; $srch=<STDIN>; $_=<>; exit !/$srch/;' $logfile <<'EOF'
--- typechange/symlink-symlink\s+Rev. \d+ .*
\+\+\+ typechange/symlink-symlink\s+Local version .*
@@ -1 \+1 @@
-link symlink-file(
. No newline at end of file)?
\+link file-symlink(
. No newline at end of file)?
EOF
	then
		$SUCCESS "Diff with type-changes ok"
	else
		cat $logfile
		$ERROR "Didn't find expected chunk in diff"
	fi
done


cd $WC2
$BINdflt diff -rHEAD > $logfile
$BINq up
$BINdflt diff -r$rev > $logfile

