From ff2a33531072860c19ce770f87f5951fad413ef4 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@Germany>
Date: Thu, 9 Feb 2017 13:07:48 +0100
Subject: [PATCH] ENH: add tutorials/Allrun -collect option

- collects the log information only, without running any cases.
  This can be useful if the user has terminated the test prematurely
  but nonetheless wishes to summarize the log output.
---
 tutorials/Allrun | 138 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 101 insertions(+), 37 deletions(-)

diff --git a/tutorials/Allrun b/tutorials/Allrun
index 1f8f12eec0e..8ecef750191 100755
--- a/tutorials/Allrun
+++ b/tutorials/Allrun
@@ -4,7 +4,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  |
+#    \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -26,71 +26,135 @@
 #     Allrun
 #
 # Description
+#     Runs tutorial cases and summarizes the outcome as 'testLoopReport'
 #
 #------------------------------------------------------------------------------
 cd ${0%/*} || exit 1    # Run from this directory
 
-# Source tutorial run functions
-. $WM_PROJECT_DIR/bin/tools/RunFunctions
+usage()
+{
+    exec 1>&2
+    while [ "$#" -ge 1 ]; do echo "$1"; shift; done
+    cat<<USAGE
+
+usage: ${0##*/} [OPTION]
+
+options:
+  -collect          Collect logs only. Can be useful for aborted runs.
+  -help             print the usage
+
+* Runs tutorial cases and summarizes the outcome as 'testLoopReport'
+
+USAGE
+    exit 1
+}
+
+#------------------------------------------------------------------------------
+
+unset optCollectOnly
+
+# parse options
+while [ "$#" -gt 0 ]
+do
+    case "$1" in
+    -h | -help)
+        usage
+        ;;
+    -collect)
+        optCollectOnly=true
+        ;;
+    -*)
+        usage "unknown option: $1"
+        ;;
+    *)
+        break
+        ;;
+    esac
+    shift
+done
+
+#------------------------------------------------------------------------------
 
 # logReport <logfile>
 # Extracts useful info from log file.
 logReport()
 {
-    caseName=`dirname $1 | sed s/"\(.*\)\.\/"/""/g`
-    app=`echo $1 | sed s/"\(.*\)log\."/""/g`
-    appAndCase="Application $app - case $caseName"
+    local logfile=$1
 
-    fatalError=`grep "FOAM FATAL" $1`
-    UxSS=`grep -E "Ux[:| ]*solution singularity" $1`
-    UySS=`grep -E "Uy[:| ]*solution singularity" $1`
-    UzSS=`grep -E "Uz[:| ]*solution singularity" $1`
-    completed=`grep -E "^[\t ]*[eE]nd" $1`
+    # logfile is path/to/case/log.application
+    caseName=$(dirname $logfile | sed -e 's/\(.*\)\.\///g')
+    app=$(echo $logfile | sed -e 's/\(.*\)log\.//g')
+    appAndCase="Application $app - case $caseName"
 
-    if [ "$fatalError" ]
+    if grep -q "FOAM FATAL" $logfile
     then
         echo "$appAndCase: ** FOAM FATAL ERROR **"
-    elif [ "$UxSS" -a "$UySS" -a "$UzSS" ]
-    then
-        echo "$appAndCase: ** Solution singularity **"
-    elif [ "$completed" ]
-    then
-        completionTime=`tail -10 $log | grep Execution | cut -d= -f2 | sed 's/^[ \t]*//'`
-        if [ "$completionTime" ]
+        return 1
+    fi
+
+    # Check for solution singularity on U equation
+    for eqn in Ux Uy Uz
+    do
+        if grep -q -E "${eqn}[:| ]*solution singularity" $logfile
         then
-            completionTime="in $completionTime"
+            if [ "$eqn" = Uz ]
+            then
+                # Can only get here if Ux,Uy,Uz all failed
+                echo "$appAndCase: ** Solution singularity **"
+                return 1
+            fi
+        else
+            break
         fi
-        echo "$appAndCase: completed $completionTime"
+    done
+
+    if grep -q -E "^[\t ]*[Ee]nd" $logfile
+    then
+        # Extract time from this type of content
+        ## ExecutionTime = 60.2 s  ClockTime = 63 s --> "60.2 s"
+        completionTime=$(tail -10 $logfile | \
+            sed -n -e '/Execution/{s/^[^=]*=[ \t]*//; s/\( s\) .*$/\1/; p}')
+
+        echo "$appAndCase: completed${completionTime:+ in }$completionTime"
     else
         echo "$appAndCase: unconfirmed completion"
     fi
 }
 
-
-# Recursively run all tutorials
-foamRunTutorials -test -skipFirst
+if [ -z "$optCollectOnly" ]
+then
+    # Recursively run all tutorials
+    foamRunTutorials -test -skipFirst
+fi
 
 
 # Analyse all log files
-rm testLoopReport > /dev/null 2>&1 &
-touch testLoopReport
+echo "Collecting log files..." 1>&2
+rm -f logs testLoopReport > /dev/null 2>&1
+touch logs testLoopReport
 
 for appDir in *
 do
-(
-    [ -d $appDir ] && cd $appDir || exit
+    [ -d $appDir ] || continue
+    echo -n "    $appDir..." 1>&2
 
-    logs=`find . -name "log.*"`
-    [ -n "$logs" ] || exit
+    logs=$(find -L $appDir -type f -name 'log.*')
+    if [ -n "$logs" ]
+    then
+        echo 1>&2
+    else
+        echo " (no logs)" 1>&2
+        continue
+    fi
 
-    for log in `echo $logs | xargs ls -rt`
+    # Sort logs by time-stamp
+    for log in $(echo $logs | xargs ls -rt)
     do
-        logReport $log >> ../testLoopReport
+        # Concatenate and summarize logs
+        cat "$log" >> logs 2>/dev/null
+        logReport $log
     done
-    echo "" >> ../testLoopReport
-)
-done
-
-find . -name "log.*" -exec cat {} \; >> logs
+    echo
+done > testLoopReport
 
 #------------------------------------------------------------------------------
-- 
GitLab