diff contrib/dg-cmp-results.sh @ 0:a06113de4d67

first commit
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2009 14:47:48 +0900
parents
children 04ced10e8804
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/dg-cmp-results.sh	Fri Jul 17 14:47:48 2009 +0900
@@ -0,0 +1,211 @@
+#!/bin/bash
+# Copyright (C) 2006, 2008 Free Software Foundation
+#
+# Analyze changes in GCC DejaGNU test logs for binutils, gcc, gdb, etc.
+# Original version written in 2005 by James Lemke <jwlemke@wasabisystems.com>.
+#
+# See usage() below.
+
+usage () {
+    cat <<EOF >&2
+Usage:
+    dg-cmp-results.sh [-v] [-v] [-v] <variant-name> <old-file> <new-file>
+    <variant-name> names the desired variant, "/" must be written as "\/".
+    Use the empty string ("") for the first variant in each file.
+    Output is to stdout.
+    Non-verbose output is degradation info like PASS->FAIL.
+    -v adds improvement info like FAIL->PASS.
+    -v -v adds info like tests that are no longer run.
+    -v -v -v adds info for tests that have not changed status.
+    -v -v -v -v is used for debugging.
+EOF
+}
+
+verbose=0
+while test "$1" = "-v"; do
+    verbose=`expr $verbose + 1`
+    shift
+done
+
+if test $# -ne 3 ; then
+    usage
+    exit 1
+fi
+
+if test ! -f "$2"; then
+    echo "unable to open $2" >&2
+    exit 1
+fi
+
+if test ! -f "$3"; then
+    echo "unable to open $3" >&2
+    exit 1
+fi
+
+# Command differences for various platforms.
+case `uname -s` in
+Darwin|NetBSD)
+    E=-E	# sed
+    ;;
+*)
+    E=-r	# sed
+    ;;
+esac
+
+# sections are identified by separator lines beginning with '\t\t==='.
+# section 0 identifies run date, target, and host.
+# section 1 and subsequent contain test data for a target variant.
+# -skip to /^Running target/ and use that line to identify the variant.
+# -subsequent lines contain the result data.  They begin with:
+# '(PASS|FAIL|XFAIL|XPASS|UNTESTED|UNSUPPORTED|UNRESOLVED):'
+VARIANT="$1"
+OFILE="$2"
+OBASE=`basename "$2"`
+NFILE="$3"
+NBASE=`basename "$3"`
+
+echo "dg-cmp-results.sh: Verbosity is ${verbose}, Variant is \"${VARIANT}\""
+echo
+
+header="^Running target $VARIANT"
+
+temp=`grep "$header" $OFILE`
+if test -z "$temp"; then
+    echo "Error: variant \"$VARIANT\" not found in $OFILE."
+    exit 1
+fi
+temp=`grep "$header" $NFILE`
+if test -z "$temp"; then
+    echo "Error: variant \"$VARIANT\" not found in $NFILE."
+    exit 1
+fi
+unset temp
+
+# Copy out the old file's section 0.
+echo "Older log file: $OFILE"
+sed $E -e '/^[[:space:]]+===/,$d' $OFILE
+
+# Copy out the new file's section 0.
+echo "Newer log file: $NFILE"
+sed $E -e '/^[[:space:]]+===/,$d' $NFILE
+
+# Create a temporary file from the old file's interesting section.
+sed $E -e "1,/$header/d" \
+  -e '/^[[:space:]]+===/,$d' \
+  -e '/^[A-Z]+:/!d' \
+  -e '/^(WARNING|ERROR):/d' \
+  -e 's/\r$//' \
+  -e 's/^/O:/' \
+  $OFILE |
+  sort -s -t : -k 3b - \
+  >/tmp/o$$-$OBASE
+
+# Create a temporary file from the new file's interesting section.
+sed $E -e "1,/$header/d" \
+  -e '/^[[:space:]]+===/,$d' \
+  -e '/^[A-Z]+:/!d' \
+  -e '/^(WARNING|ERROR):/d' \
+  -e 's/\r$//' \
+  -e 's/^/N:/' \
+  $NFILE |
+  sort -s -t : -k 3b - \
+  >/tmp/n$$-$NBASE
+
+# Merge the two files, then compare adjacent lines.
+# Comparison is complicated by tests that may be run multiple times.
+# If that case, we assume that the order is the same in both files.
+cat <<EOF >compare-$$.awk
+BEGIN {
+    FS = ":"
+    queue1 = 1; queueN = 0; status[queue1] = ""; name[queue1] = ""
+    verbose = verbose + 0	# Make sure it's defined.
+}
+
+# FIFO circular queue
+function push(st, nm) {
+    queueN += 1; status[queueN] = st; name[queueN] = nm
+}
+function peek() {
+    result = 0
+    if (queueN >= queue1) result = queue1
+    return result
+}
+function drop() {
+    queue1 += 1
+    if (queue1 > queueN) { queue1 = 1; queueN = 0; }
+}
+
+function compare(st, nm) {
+    old = peek()
+    if (old == 0) {
+        # This new test wasn't run last time.
+        if (verbose >= 2) printf("NA->%s:%s\n", st, nm)
+    }
+    else {
+	# Compare this new test to the first queued old one.
+	if (verbose >= 4) {
+	    printf("Comparing two lines:\n O:%s:%s\n N:%s:%s\n",
+	     status[old], name[old], st, nm)
+	}
+        if (name[old] != nm) {
+	    # The old test wasn't run this time and
+	    # the new test wasn't run last time.
+	    if (verbose >= 2) {
+		printf("%s->NA:%s\n", status[old], name[old])
+		if (nm != "") printf("NA->%s:%s\n", st, nm)
+	    }
+	    drop()
+        }
+	else {
+	    notable = 0
+	    if (status[old] == st) {
+	        # Status of this test has not changed.
+		if (verbose >= 3) printf("%s:%s\n", st, nm)
+	    }
+	    else if(status[old] == "PASS" && st == "XFAIL") {
+	        if (verbose >= 1) notable = 1
+	    }
+	    else if(status[old] == "PASS" || st == "FAIL") {
+	        # Test did pass but doesn't now
+		# or didn't fail but does now.
+		notable = 1
+	    }
+	    else if(st == "PASS") {
+	        # Test didn't pass but does now.
+		if (verbose >= 1) notable = 1
+	    }
+	    else if(verbose >= 2) {
+	        # Miscellaneous status change.
+		notable = 1
+	    }
+	    if (notable > 0) printf("%s->%s:%s\n", status[old], st, nm)
+	    drop()
+	}
+    }
+}
+
+/^O:/ {
+    while (old = peek()) {
+	if (name[old] == \$3) break;
+	# The queued test is no longer run.
+	compare("", "");
+    }
+    # Save this test for later comparison.
+    push(\$2, \$3)
+}
+
+/^N:/ {
+    compare(\$2, \$3)
+}
+
+END {
+    while (old = peek()) compare("", "")
+}
+EOF
+sort -m -s -t : -k 3b /tmp/o$$-$OBASE /tmp/n$$-$NBASE |
+ awk -v verbose=$verbose -f compare-$$.awk /dev/stdin
+
+# Delete the temporary files.
+rm -f compare-$$.awk /tmp/o$$-$OBASE /tmp/n$$-$NBASE
+
+exit 0