HaRe-0.6: tools/evman/servers/Isabelle/validate
#!/bin/bash
# Script to validate Isabelle certificates.
# This script should be invoked from cert.
# It expects "$PROGRAMATICA", "$certsDir" and "$SERVERDIR" to be set.
# It also expects the name of a certificate on the command line.
type=Isabelle
[ -n "$PROGRAMATICA" ] || { echo >&2 'Bug: $PROGRAMATICA is not set'; exit 1;}
. "$PROGRAMATICA/validation.sh" # defines $module, $conc, $attr, $certpath, etc
hyp=`getattr hyp "$attr"`
proof_dir=isabelle
### Auxiliary functions ########################################################
isabellecheck() {
isabelle -e "with_path \"$SERVERDIR/lib\" use_thy \"${proof_file%.thy}\";" -q HOLCF Output >"$output"
grep -q 'val it = () : unit' "$output"
}
validate() {
pfecmd=isabelle
echo "pfe $pfecmd $module"
echo "Translating $module..." >"$output"
if pfe $pfecmd $module >"$module.thy" 2>>"$output" ; then
if [ -r "$proof_file" ] ; then
echo "Proof missing" >"$output"
if isabellecheck; then
markvalid
else
#echo "Proof missing or incomplete."
tail -1 "$output" # Hmm. Error message can be longer than 1 line!!
#echo "Put your proof in $proof_file and call it $proof."
markinvalid
fi
else
abort "Put your proof in $proof_file, then validate again."
fi
else
cat "$output"
markinvalid
fi
}
validatenew() {
validate
}
auxfilechange() {
while read file ; do
if [ "$file" -nt "$certpath/valid" ] ; then
return 0
fi
done < <(certauxfiles "$certpath")
return 1
}
revalidate() {
tmpdiff="$certsDir/diff$$"
if [ "$attr" -nt "$certpath/valid" ] ; then
echo "Certificate attributes have changed."
validate
elif auxfilechange ; then
# This assumes that all relevant files are mentioned in $attrs!!!
echo "Some auxiliary certificate file has changed."
validate
elif ! pfe tadiff "$deps" "$assertion" >"$tmpdiff" || [ -s "$tmpdiff" ] ; then
#echo "The following changes might affect the validity of"
echo "There has been changes that might affect the validity of"
echo "the $type certificate $cert."
#echo ""
#cat "$tmpdiff"
echo ""
validate
else
echo "There has been no changes affecting the validity of"
echo "the $type certificate $cert. Marking it as still valid."
datestamp valid $certpath $module
fi
status=$?
rm -f "$tmpdiff"
return $status
}
### Here we go... ##############################################################
proof_file="`getattr file/proof "$attr"`"
proof="`getattr proof "$attr"`"
simple="`getattr SimplePatterns "$attr"`"
if [ -z "$proof_file" ] ; then
# Default file for proofs. The user can change this.
proof_file="${module}_Proofs.thy"
setattr file/proof "$proof_file" "$attr"
fi
if [ -z "$proof" ] ; then
proof="proof$conc"
setattr proof "$proof" "$attr"
fi
if [ -r "$certpath/valid" ] && [ -r "$deps" ] ; then
revalidate
else
validatenew
fi