Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 246 lines (229 sloc) 7.386 kb
#!/bin/bash -ue
shopt -s nullglob
ROOT=$(git rev-parse --show-toplevel)
OCP_INDENT="$ROOT"/ocp-indent
cd $ROOT/tests
UPDATE=
GIT=
SHOW=
SHOWCMD=
HTML=
usegit() {
printf "%-12s\t\e[34mgit %s\e[m\n" "" "$*";
git "$@";
}
is_file_on_git() {
[ $# -eq 1 ]; f=$1
git ls-files $f --error-unmatch >/dev/null 2>&1
}
while [ $# -gt 0 ]; do
case "$1" in
--update|-u)
UPDATE=1
;;
--git-update)
if ! git diff --exit-code -- . >/dev/null; then
echo -e "\e[1mWarning:\e[m unstaged changes in tests/"
echo "You may want to do 'git checkout -- tests/' or"\
"'git add -u -- tests/' first."
exit 1
fi
UPDATE=1
GIT="usegit "
HTML=1
;;
--ocp-indent)
if [ $# -le 1 ]; then echo "Error: $1 needs an argument"; exit 1; fi
shift;
OCP_INDENT=$1
;;
--show)
SHOW=1
;;
--meld)
SHOW=1
SHOWCMD="meld"
;;
--html)
HTML=1
;;
*)
cat <<EOF >/dev/stderr
Usage:
-u --update update the files according to the current results
--git-update update the files and state the changes in git
--ocp-indent <prg> use this ocp-indent exe
--show show a diff of changed results
--meld show progressions/regressions using meld
--html generate an html page showing the diff of failing tests
EOF
exit 1
esac
shift
done
TMP=$(mktemp -d /tmp/ocp-indent-test.XXXXX)
trap "rm -rf /tmp/ocp-indent-${TMP#/tmp/ocp-indent-}" EXIT
ocp-indent() {
[ $# -eq 1 ]
opts=$(cat $1.opts 2>/dev/null || true)
"$OCP_INDENT" $opts "$1" >$TMP/$(basename $1) 2>&1 || true
}
reffile() {
[ $# -eq 1 ]
if [ -e "$1.ref" ]
then echo "$1.ref"
else echo "$1"
fi
}
PASSING=("")
FAILING=("")
if [ -n "$GIT" ]; then
PASSING+=($(git ls-files 'passing/*.ml' 'passing/*.ml[iyl]'))
FAILING+=($(git ls-files 'failing/*.ml' 'failing/*.ml[iyl]'))
else
PASSING+=(passing/*.ml passing/*.ml[iyl])
FAILING+=(failing/*.ml failing/*.ml[iyl])
fi
CHANGES=()
for f in ${PASSING[@]}; do
base=$(basename $f)
name=${base%.*}
ocp-indent $f
if diff -q "$(reffile "$f")" $TMP/$base >/dev/null; then
printf "%-12s\t\e[32m[PASSED]\e[m\n" $name
else
printf "%-12s\t\e[31m[FAILED]\e[m \e[41m\e[30m[REGRESSION]\e[m\n" $name
if [ -n "$UPDATE" ]; then
mkdir -p failing
$GIT mv -f $f* failing/
f=failing/${f#passing/}
mkdir -p failing-output
cp $TMP/$base failing-output/
if [ -n "$GIT" ]; then $GIT add failing-output/$base; fi
fi
CHANGES+=($f)
fi
done
for f in ${FAILING[@]}; do
base=$(basename $f)
name=${base%.*}
ocp-indent $f
if diff -q $(reffile $f) $TMP/$base >/dev/null; then
printf "%-12s\t\e[32m[PASSED]\e[m \e[42m\e[30m[PROGRESSION]\e[m\n" $name
if [ -n "$UPDATE" ]; then
$GIT mv -f $f* passing/
$GIT rm -f failing-output/$base
fi
elif [ ! -e failing-output/$base ]; then
printf "%-12s\t\e[33m[FAILED]\e[m \e[43m\e[30m[NEW]\e[m\n" $name
cp $TMP/$base failing-output/
if [ -n "$GIT" ]; then $GIT add failing-output/$base; fi
elif diff -q $TMP/$base failing-output/$base >/dev/null; then
printf "%-12s\t\e[33m[FAILED]\e[m\n" $name
if [ -n "$GIT" ] && ! is_file_on_git failing-output/$base; then
$GIT add failing-output/$base; fi
else
refcount=$(diff -y --suppress-common-lines \
$(reffile $f) failing-output/$base \
|wc -l)
curcount=$(diff -y --suppress-common-lines \
$(reffile $f) $TMP/$base \
|wc -l)
progress=$((refcount - curcount))
printf "%-12s\t\e[33m[FAILED]\e[m \e[%dm\e[30m[CHANGE: %+d]\e[m\n" \
$name \
$(if [ $progress -gt 0 ]; then echo 42; \
elif [ $progress -eq 0 ]; then echo 43; \
else echo 41; fi) \
$progress
if [ -n "$UPDATE" ]; then
mkdir -p failing-output
cp $TMP/$base failing-output/
if [ -n "$GIT" ]; then $GIT add failing-output/$base; fi
fi
CHANGES+=($f)
fi
done
if [ -n "$SHOW" ] && [ ${#CHANGES[@]} -gt 0 ]; then
if [ -z "$SHOWCMD" ]; then
for f in ${CHANGES[@]}; do
echo
printf "\e[1m=== Showing differences in %s ===\e[m\n" $f
# Custom less buggy version of colordiff -y
diff -W 130 -ty $(reffile $f) $TMP/$(basename $f) \
| awk '/^.{64}[^ ].*/ { printf "%s\n",$0; next } 1' \
|| true
done
else
echo
echo "Meld view:"
echo "[reference] [new result] [registered]"
echo "You can update reference and registered status from meld"
cmd=(meld)
for f in ${CHANGES[@]}; do
cur=failing-output/$(basename $f)
if ! [ -e $cur ]; then cur=; fi
cmd+=(--diff $(reffile $f) $TMP/$(basename $f) $cur)
done
${cmd[*]}
fi
elif [ -n "$SHOW" ]; then
echo
echo "No changes to show. To check the current failures use for example:"
echo " meld tests/failing tests/failing-output"
fi
if [ -n "$HTML" ]; then
VERSION=$($OCP_INDENT --version | awk '{ print $NF; exit }')
COMMITS_SINCE=$(git log --oneline $VERSION.. 2>/dev/null || true)
if [ -n "$COMMITS_SINCE" ]; then
VERSION="$VERSION+$((1+$(wc -l <<<"$COMMITS_SINCE")))"
fi
VERSION_STRING="$VERSION ($(date +%F))"
echo
echo -n "Generating summary of failures tests/failing.html..."
cat <<EOF > failing.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>Failing tests, ocp-indent version $VERSION_STRING</title>
<style>
BODY { font-family: monospace; }
TABLE { border-collapse: collapse; border-spacing: 0px; margin: auto; }
TD { padding: 0; }
TD.linenum {
color: #909090;
text-align: right;
vertical-align: top;
font-weight: bold;
border-right: 1px solid black;
border-left: 1px solid black;
}
TD.added { background-color: #DDDDFF; }
TD.modified { background-color: #BBFFBB; }
TD.removed { background-color: #FFCCCC; }
TD.normal { background-color: #FFFFE1; }
</style>
</head>
<body>
<h1>Failing tests, ocp-indent version $VERSION_STRING</h1>
<p>Left is expected result, right shows actual indentation by ocp-indent</p>
EOF
complete_success="1"
for f in $(git ls-files 'failing/*.ml'); do
complete_success=
$ROOT/tools/diff2html --no-header "$(reffile $f)" "failing-output/${f#failing/}" \
>>failing.html 2>/dev/null || true
echo -n "."
done
if [ -n "$complete_success" ]; then
echo "<p>All tests pass: no currently known bugs.</p>" >>failing.html
fi
cat <<EOF >>failing.html
</body>
</html>
EOF
echo " done"
if [ -n "$GIT" ]; then $GIT add failing.html; fi
fi
exit ${#CHANGES[@]}
Jump to Line
Something went wrong with that request. Please try again.