From 7d2a9fad1ae1b2260092f8b3a033de9f2d3c36d6 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Thu, 17 Jun 2021 10:09:39 +0200
Subject: [PATCH] ENH: add auto-detect 0/ to foamCleanTutorials

- in the 'auto' mode (now the default), it will use cleanCase and also
  remove the 0/ directory if a 0.orig/ directory also exists.

  This corresponds to a frequent idiom and can be used quite safely
  for most cases.

ENH: add -serial / -parallel preference for foamRunTutorials
---
 bin/foamCleanTutorials | 109 +++++++++++++++++++++++++++--------------
 bin/foamRunTutorials   | 108 +++++++++++++++++++++++++++-------------
 bin/foamTestTutorial   |  13 +++--
 3 files changed, 152 insertions(+), 78 deletions(-)

diff --git a/bin/foamCleanTutorials b/bin/foamCleanTutorials
index 39eb05dc2d9..7f63ff43ee7 100755
--- a/bin/foamCleanTutorials
+++ b/bin/foamCleanTutorials
@@ -7,7 +7,7 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011 OpenFOAM Foundation
-#     Copyright (C) 2019-2020 OpenCFD Ltd.
+#     Copyright (C) 2019-2021 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
@@ -16,8 +16,8 @@
 #     foamCleanTutorials
 #
 # Description
-#     Run either Allwclean, Allclean or default cleanCase in current directory
-#     and all its subdirectories.
+#     Recursively clean an OpenFOAM case directory,
+#     using Allclean, Allwclean (when present) or regular cleanCase.
 #
 #------------------------------------------------------------------------------
 . ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions  # Tutorial clean functions
@@ -34,17 +34,24 @@ printHelp() {
 Usage: ${0##*/} [OPTION]
        ${0##*/} [OPTION] directory
 options:
-  -0                use cleanCase0 instead of cleanCase
-  -case <dir>       specify starting directory, default is cwd
-  -self             avoid Allclean script (prevent infinite recursion)
-  -help             print the usage
+  -0            Perform cleanCase, remove 0/ unconditionally
+  -auto         Perform cleanCase, remove 0/ if 0.orig/ exists [default]
+  -no-auto      Perform cleanCase only
+  -case=DIR     Specify starting directory, default is cwd
+  -self         Avoid Allclean script (prevent infinite recursion)
+  -help         Print the usage
 
-Recursively clean an OpenFOAM case directory.
-By default uses Allclean, Allwclean when present.
-The -skipFirst option is the same as -self.
+Recursively clean an OpenFOAM case directory, using Allclean or Allwclean
+when present.
+
+In the default 'auto' mode, it will use cleanCase and will automatically
+remove the 0/ directory if a corresponding 0.orig directory exists.
+
+Equivalent options:
+  | -case=DIR  | -case DIR |
 
 USAGE
-   exit 0  # clean exit
+   exit 0  # A clean exit
 }
 
 # Report error and exit
@@ -63,15 +70,43 @@ die()
 #------------------------------------------------------------------------------
 
 # Parse options
-unset skipSelf clean0
+unset skipSelf
+cleanType=auto
+
 if [ "$#" -gt 0 ]
 then
     case "$1" in
-    -h | -help*)
+    (- | --)
+        shift
+        break   # Stop option parsing
+        ;;
+    (-h | -help* | --help*)
         printHelp
         ;;
+    -auto)
+        cleanType="auto"
+        ;;
+    -no-auto)
+        cleanType="noauto"
+        ;;
     -0)
-        clean0=true
+        cleanType="0"
+        ;;
+
+    ## long-option (internal dispatch form)
+    --clean=0 | --clean=auto | --clean=noauto)
+        cleanType="${1#*=}"
+        ;;
+    --clean=*)
+        echo "$0: unknown setting: $1" 1>&2
+        ;;
+
+    -case=*)
+        caseName="${1#*=}"
+        cd "$caseName" 2>/dev/null || {
+            echo "${0##*}: No such directory $caseName" 1>&2
+            exit 2
+        }
         ;;
     -case)
         [ "$#" -ge 2 ] || die "'$1' option requires an argument"
@@ -84,10 +119,6 @@ then
     -self* | -skipFirst)
         skipSelf=true
         ;;
-    --)
-        shift
-        break
-        ;;
     *)
         cd "$1" 2>/dev/null || {
             echo "${0##*}: No such directory $1" 1>&2
@@ -95,46 +126,48 @@ then
         }
         ;;
     esac
+    shift
 fi
 
 
-unset exitCode
+# Use specialized script(s), but not on self
 if [ -z "$skipSelf" ]
 then
-    # Use specialized script(s)
-    if [ -f Allwclean ]
+    if [ -f ./Allwclean ]
     then
         ./Allwclean
-        exitCode="$?"
-    elif [ -f Allclean ]
+        exit "$?"
+    elif [ -f ./Allclean ]
     then
         ./Allclean
-        exitCode="$?"
+        exit "$?"
     fi
 fi
 
-
-if [ -n "$exitCode" ]
-then
-    exit "$exitCode"
-elif [ -d system ]
+if [ -d system ]
 then
-    # Normal case
-    if [ "$clean0" = true ]
-    then
-        cleanCase0
-    else
-        cleanCase
-    fi
+    # Tutorial case
+    cleanCase
+    case "$cleanType" in
+    (auto)
+        [ -d 0.orig ] && rm -rf 0 ;;
+    (0)
+        rm -rf 0 ;;
+    esac
+
 elif [ -d Make ]
 then
-    # Normal application
+    # Application
     cleanApplication
+
 else
     # Recurse into subdirectories
     for caseName in *
     do
-        ( cd "$caseName" 2>/dev/null && "$thisScript" )
+    (
+        cd "$caseName" 2>/dev/null \
+     && "$thisScript" ${cleanType:+--clean=$cleanType}
+    )
     done
 fi
 
diff --git a/bin/foamRunTutorials b/bin/foamRunTutorials
index d64576ce8ab..aee01174a81 100755
--- a/bin/foamRunTutorials
+++ b/bin/foamRunTutorials
@@ -7,7 +7,7 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2018-2020 OpenCFD Ltd.
+#     Copyright (C) 2018-2021 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
@@ -16,7 +16,7 @@
 #     foamRunTutorials
 #
 # Description
-#     Recursively run Allrun/Alltest or blockMesh+application,
+#     Recursively run Allrun/Alltest or blockMesh and application,
 #     starting with the current directory or the specified -case directory.
 #
 #     For tutorials that are known to run poorly, an Allrun-optional
@@ -40,17 +40,22 @@ printHelp() {
 
 Usage: ${0##*/} [OPTION]
 options:
-  -case <dir>       specify starting directory, default is cwd
-  -self             avoid Allrun, Alltest script (prevent infinite recursion)
-  -test             prefer Alltest script, pass -test argument to scripts
-  -help             print the usage
+  -case=DIR     Specify starting directory, default is cwd
+  -serial       Prefer Allrun-serial if available
+  -parallel     Prefer Allrun-parallel if available
+  -test         Prefer Alltest script, pass -test argument to scripts
+  -self         Avoid initial Allrun, Alltest scripts
+                (prevent infinite recursion)
+  -help         Print the usage
 
-Recursively run Allrun/Alltest or blockMesh+application,
-starting with the current directory or the specified -case directory.
-The -skipFirst option is the same as -self.
+Recursively run Allrun/Alltest (or blockMesh + application)
+starting from the current directory or the specified -case directory.
+
+Equivalent options:
+  | -case=DIR  | -case DIR |
 
 USAGE
-   exit 0  # clean exit
+   exit 0  # A clean exit
 }
 
 # Report error and exit
@@ -69,14 +74,44 @@ die()
 #------------------------------------------------------------------------------
 
 # Parse options
-unset passArgs runTests skipSelf
+unset passArgs runTests runType skipSelf
 
 while [ "$#" -gt 0 ]
 do
     case "$1" in
-    -h | -help*)
+    (- | --)
+        shift
+        break   # Stop option parsing
+        ;;
+    (-h* | -help* | --help*)
         printHelp
         ;;
+
+    ## Prefer serial or parallel
+    -serial | -parallel)
+        runType="${1#*-}"
+        ;;
+
+    -test)
+        passArgs="-test"
+        runTests=true
+        ;;
+
+    ## long-option (internal dispatch form)
+    --run=serial | --run=parallel)
+        runType="${1#*=}"
+        ;;
+    --run=*)
+        echo "$0: unknown setting: $1" 1>&2
+        ;;
+
+    -case=*)
+        caseName="${1#*=}"
+        cd "$caseName" 2>/dev/null || {
+            echo "${0##*}: No such directory $caseName" 1>&2
+            exit 2
+        }
+        ;;
     -case)
         [ "$#" -ge 2 ] || die "'$1' option requires an argument"
         shift
@@ -85,19 +120,11 @@ do
             exit 2
         }
         ;;
-    -test)
-        passArgs="-test"
-        runTests=true
-        ;;
 
     # Avoid infinite recursion when invoked from an Allrun/Alltest script
     -self* | -skipFirst)
         skipSelf=true
         ;;
-    --)
-        shift
-        break
-        ;;
     *)
         break
         ;;
@@ -106,34 +133,43 @@ do
 done
 
 
-unset exitCode
+# Use specialized script(s), but not on self
 if [ -z "$skipSelf" ]
 then
     # Use specialized script(s)
     if [ "$runTests" = true ] && [ -f Alltest ]
     then
         ./Alltest $passArgs $*
-        exitCode="$?"
-    elif [ -f Allrun ]
-    then
-        ./Allrun $passArgs $*
-        exitCode="$?"
+        exit "$?"
     elif [ -f Allrun-optional ]
     then
         echo "Skipped optional case $PWD"
-        exitCode=0
+        exit 0
+    fi
+
+    # Prefer -serial or -parallel when available?
+    if [ -n "$runType" ]
+    then
+        if [ -f ./"Allrun-${runType}" ]
+        then
+            ./"Allrun-${runType}" $passArgs $*
+            exit "$?"
+        fi
+    fi
+    if [ -f ./Allrun ]
+    then
+        ./Allrun $passArgs $*
+        exit "$?"
     fi
 fi
 
 
-if [ -n "$exitCode" ]
-then
-    exit "$exitCode"
-elif [ -d system ]
+if [ -d system ]
 then
     # Run normal case with blockMesh and the application
     runApplication blockMesh
     runApplication $(getApplication)
+
 else
     # Loop over sub-directories and compile any applications
     for caseName in *
@@ -143,12 +179,14 @@ else
             ( compileApplication "$caseName" )
         fi
     done
-    FOAM_TARGETS=$(for d in *; do [ -d "$d" ] && echo "$d"; done | xargs)
+
+    subdirs=$(for d in *; do [ -d "$d" ] && echo "$d"; done | xargs)
 
     # Run all cases which have not already been run
-    $make -k -f $WM_PROJECT_DIR/bin/tools/MakefileDirs \
-          FOAM_TARGETS="$FOAM_TARGETS" \
-          FOAM_APP="$thisScript" FOAM_ARGS="$passArgs $*"
+    "$make" -k -f "${WM_PROJECT_DIR:?}"/bin/tools/MakefileDirs \
+          FOAM_TARGETS="$subdirs" \
+          FOAM_APP="$thisScript" \
+          FOAM_ARGS="$passArgs ${runType:+--run=$runType} $*"
 fi
 
 #------------------------------------------------------------------------------
diff --git a/bin/foamTestTutorial b/bin/foamTestTutorial
index e47daecc120..a2e94a217a5 100755
--- a/bin/foamTestTutorial
+++ b/bin/foamTestTutorial
@@ -76,7 +76,14 @@ optRunLimit=1
 while [ "$#" -gt 0 ]
 do
     case "$1" in
-    -h* | -help*)   printHelp ;;
+    (- | --)
+        shift
+        break   # Stop option parsing
+        ;;
+
+    (-h* | -help* | --help*)
+        printHelp
+        ;;
 
     -force)
         optForce=true
@@ -102,10 +109,6 @@ do
         outputDir="${1#*=}"
         ;;
 
-    --)
-        break
-        ;;
-
     -*)
         die "unknown option $1"
         ;;
-- 
GitLab