From f90de0215908f0f798e962dc48ec180464cc3072 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Wed, 12 Feb 2020 17:09:43 +0100
Subject: [PATCH] ENH: openfoam shell session - improved and relocated

- '-c' option (as per shell), '-Dkey[=value]' option to provide
  preferences via the command-line. For example,

      etc/openfoam -DWM_COMPILER=Clang -int64  ./Allwmake -j -s -l

  These can also be combined with other options. Eg,

      etc/openfoam -DWM_COMPILER=Clang \
          -c 'wmake -show-path-cxx -show-cxxflags'

- relocated from bin/tools/ => etc/ for easier access

- bin/tools/openfoam.in : for autoconfig-style installation

- Auto-detect if the shell script was executed with openfoam and
  interpret accordingly.

  Simple example,

      --------------
      #!/usr/bin/openfoam
      cd "${0%/*}" || exit   # Run -*-sh-*- from this dir

      blockMesh
      simpleFoam
      --------------

   Note it is NOT currently possible to provide any other parameters
   this way. Eg,

      `#!/usr/bin/openfoam -sp` (NOT)

   This will either fail to run, or result in infinite recursion.
---
 bin/tools/openfoam      | 193 ----------------------------
 bin/tools/openfoam.in   |  26 ++++
 bin/tools/source-bashrc |  22 ++--
 doc/openfoam.1.in       |  70 +++++++++++
 etc/bashrc              |  14 ++-
 etc/config.sh/setup     |   4 +-
 etc/cshrc               |  14 ++-
 etc/openfoam            | 272 ++++++++++++++++++++++++++++++++++++++++
 8 files changed, 400 insertions(+), 215 deletions(-)
 delete mode 100755 bin/tools/openfoam
 create mode 100644 bin/tools/openfoam.in
 create mode 100644 doc/openfoam.1.in
 create mode 100755 etc/openfoam

diff --git a/bin/tools/openfoam b/bin/tools/openfoam
deleted file mode 100755
index bae80e12afc..00000000000
--- a/bin/tools/openfoam
+++ /dev/null
@@ -1,193 +0,0 @@
-#!/bin/bash
-#------------------------------------------------------------------------------
-# =========                 |
-# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-#  \\    /   O peration     |
-#   \\  /    A nd           | www.openfoam.com
-#    \\/     M anipulation  |
-#------------------------------------------------------------------------------
-#     Copyright (C) 2019 OpenCFD Ltd.
-#------------------------------------------------------------------------------
-# License
-#     This file is part of OpenFOAM, licensed under GNU General Public License
-#     <http://www.gnu.org/licenses/>.
-#
-# Script
-#     openfoam [args]
-#
-# Description
-#     Open an interactive bash session with an OpenFOAM environment,
-#     or run an OpenFOAM application (with arguments) after first sourcing
-#     the OpenFOAM etc/bashrc file from the project directory.
-#
-#     This script normally exists in $WM_PROJECT_DIR/bin/tools but can also
-#     be modified to use a hard-coded PROJECT_DIR entry and placed elsewhere
-#     in the filesystem (eg, /usr/bin).
-#
-#------------------------------------------------------------------------------
-# Hard-coded value (eg, with autoconfig)
-projectDir="@PROJECT_DIR@"
-
-if [ -z "$projectDir" ] || [ "${projectDir#@}" != "$projectDir" ]
-then
-    # Auto-detect from location
-    toolsDir="${0%/*}"                              # The bin/tools dir
-    projectDir="${toolsDir%/bin/tools}"             # Project dir
-
-    case "$projectDir" in
-        (/bin | /usr/bin | /usr/local/bin)
-        # This shouldn't happen.
-        # If copied to a system dir, should also be using hard-coded values!
-        echo "Warning: suspicious looking project dir: $projectDir" 1>&2
-        ;;
-
-        ("$toolsDir")
-        # Eg, called as ./openfoam etc - need to try harder
-        projectDir="$(\cd $(dirname $0)/../.. && \pwd -L)" || unset projectDir
-        ;;
-    esac
-fi
-
-#------------------------------------------------------------------------------
-usage() {
-    exec 1>&2
-    while [ "$#" -ge 1 ]; do echo "$1"; shift; done
-    cat<<USAGE
-
-Usage: ${0##*/} [OPTION] [application ...]
-
-options:
-  -prefix=DIR       Specify alternative OpenFOAM directory
-  -sp               Single precision
-  -dp               Double precision
-  -spdp             Mixed single/double precision
-  -int32 | -int64   The label-size
-  -help             Print the usage
-
-Open an interactive bash session with an OpenFOAM environment,
-or run an OpenFOAM application (with arguments) after first sourcing
-the OpenFOAM etc/bashrc file from the project directory:
-($projectDir)
-
-For more information: www.OpenFOAM.com
-
-USAGE
-    exit 1
-}
-
-
-#-------------------------------------------------------------------------------
-
-# Only preserve settings for non-interactive?
-
-if [ "$#" -eq 0 ]
-then
-    unset _foamSettings FOAM_SETTINGS
-else
-    _foamSettings="$FOAM_SETTINGS"
-fi
-
-
-# Parse options
-while [ "$#" -gt 0 ]
-do
-    case "$1" in
-    -h | -help*)
-        usage
-        ;;
-    -prefix=* | -foam=*)
-        projectDir="${1#*=}"
-        ;;
-
-    -sp | -SP)
-        # WM_PRECISION_OPTION=...
-        _foamSettings="$_foamSettings${_foamSettings:+ }WM_PRECISION_OPTION=SP"
-        ;;
-
-    -dp | -DP)
-        # WM_PRECISION_OPTION=...
-        _foamSettings="$_foamSettings${_foamSettings:+ }WM_PRECISION_OPTION=DP"
-        ;;
-
-    -spdp | -SPDP)
-        # WM_PRECISION_OPTION=...
-        _foamSettings="$_foamSettings${_foamSettings:+ }WM_PRECISION_OPTION=SPDP"
-        ;;
-
-    -int32 | -int64)
-        # WM_LABEL_SIZE=...
-        _foamSettings="$_foamSettings${_foamSettings:+ }WM_LABEL_SIZE=${1#-int}"
-        ;;
-
-    --)
-        shift
-        break
-        ;;
-    -*)
-        echo "Error: unknown option: '$1'" 1>&2
-        exit 1
-        ;;
-    *)
-        break
-        ;;
-    esac
-    shift
-done
-
-#-------------------------------------------------------------------------------
-
-# Remove current OpenFOAM environment
-if [ -d "$WM_PROJECT_DIR" ] && [ -f "$WM_PROJECT_DIR/etc/config.sh/unset" ]
-then
-    . "$WM_PROJECT_DIR/etc/config.sh/unset"
-fi
-
-[ -d "$projectDir" ] || {
-    echo "Error: no project dir: $projectDir" 1>&2
-    exit 2
-}
-
-_foamSourceBashEnv="$projectDir/etc/bashrc"
-
-if [ "$#" -eq 0 ]
-then
-    # Interactive shell
-    _foamSourceBashEnv="$projectDir/bin/tools/source-bashrc"
-fi
-
-[ -f "$_foamSourceBashEnv" ] || {
-    echo "Error: file not found: $_foamSourceBashEnv" 1>&2
-    exit 2
-}
-
-if [ "$#" -eq 0 ]
-then
-    # Source user ~/.bashrc and OpenFOAM etc/bashrc.
-    # 1) Can either use a tmp file, or 2) chain off to a dedicated file
-    # We use a dedicated file.
-
-    if [ -n "$_foamSettings" ]
-    then
-        export FOAM_SETTINGS="$_foamSettings"
-    fi
-
-    ## echo "Source with $_foamSourceBashEnv with '$FOAM_SETTINGS'" 1>&2
-
-    # Interactive shell (newer bash can use --init-file instead of --rcfile)
-    exec bash --rcfile "$_foamSourceBashEnv" -i
-
-else
-    # Non-interactive
-
-    # Source bashrc within a function to preserve command-line arguments
-    # - this will not have aliases, but working non-interactively anyhow
-    sourceBashrc()
-    {
-        . "$_foamSourceBashEnv" $_foamSettings
-    }
-
-    sourceBashrc
-    exec "$@"
-fi
-
-#------------------------------------------------------------------------------
diff --git a/bin/tools/openfoam.in b/bin/tools/openfoam.in
new file mode 100644
index 00000000000..39b1fe76fb8
--- /dev/null
+++ b/bin/tools/openfoam.in
@@ -0,0 +1,26 @@
+#!/bin/sh
+#------------------------------------------------------------------------------
+# =========                 |
+# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+#  \\    /   O peration     |
+#   \\  /    A nd           | www.openfoam.com
+#    \\/     M anipulation  |
+#------------------------------------------------------------------------------
+#     Copyright (C) 2020 OpenCFD Ltd.
+#------------------------------------------------------------------------------
+# License
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
+#
+# Script
+#     openfoam [options] [args]
+#
+# Description
+#     Forwarding to the OpenFOAM etc/openfoam bash session script.
+#
+#------------------------------------------------------------------------------
+# Hard-coded directory path (eg, autoconfig)
+projectDir="@PROJECT_DIR@"
+
+exec "$projectDir"/etc/openfoam "$@"
+
+#------------------------------------------------------------------------------
diff --git a/bin/tools/source-bashrc b/bin/tools/source-bashrc
index 13f494785a3..e4fec4062bc 100644
--- a/bin/tools/source-bashrc
+++ b/bin/tools/source-bashrc
@@ -5,34 +5,36 @@
 #   \\  /    A nd           | www.openfoam.com
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
-#     Copyright (C) 2019 OpenCFD Ltd.
+#     Copyright (C) 2019-2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
-#     This file is part of OpenFOAM, licensed under GNU General Public License
-#     <http://www.gnu.org/licenses/>.
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
 #
 # File
 #     bin/tools/source-bashrc
 #
 # Description
-#     Source user ~/.bashrc and OpenFOAM etc/bashrc
+#     Source user ~/.bashrc and OpenFOAM etc/bashrc.
+#     Not normally sourced manually, but from bash with the --rcfile option.
 #
-#     This file is normally not sourced manually,
-#     but from bash with the --rcfile option.
 #------------------------------------------------------------------------------
-# Hard-coded value (eg, with autoconfig)
+# Hard-coded directory path (eg, autoconfig)
 projectDir="@PROJECT_DIR@"
 
 if [ -z "$projectDir" ] || [ "${projectDir#@}" != "$projectDir" ]
 then
-    # Auto-detect (as per OpenFOAM etc/bashrc)
+    # Auto-detect location (as per OpenFOAM etc/bashrc)
     # --
     # Assuming this file is $WM_PROJECT_DIR/bin/tools/source-bashrc,
     # the next lines should work when sourced by BASH or ZSH shells.
     # --
 
     projectDir="${BASH_SOURCE:-${ZSH_NAME:+$0}}"
-    [ -n "$projectDir" ] && projectDir="$(\cd $(dirname $projectDir)/../.. && \pwd -L)" || unset projectDir
+    if [ -n "$projectDir" ]
+    then
+        projectDir="$(\cd "$(dirname "$projectDir")"/../.. && \pwd -L)" || \
+        unset projectDir
+    fi
 fi
 
 #------------------------------------------------------------------------------
@@ -66,7 +68,7 @@ then
     # Some feedback
     if [ -n "$PS1" ] && [ -d "$WM_PROJECT_DIR" ]
     then
-        info="$(foamEtcFile -show-patch 2>/dev/null)"
+        info="$("$WM_PROJECT_DIR"/bin/foamEtcFile -show-patch 2>/dev/null)"
 
         # echo "Using: OpenFOAM-$WM_PROJECT_VERSION ($FOAM_API${info:+ patch=$info}) - visit www.openfoam.com" 1>&2
         echo "Using: OpenFOAM-$WM_PROJECT_VERSION${info:+ (patch=$info)} - visit www.openfoam.com" 1>&2
diff --git a/doc/openfoam.1.in b/doc/openfoam.1.in
new file mode 100644
index 00000000000..2dbdac04bb6
--- /dev/null
+++ b/doc/openfoam.1.in
@@ -0,0 +1,70 @@
+.TH "OPENFOAM" 1 "OpenFOAM-version" "www.openfoam.com" "OpenFOAM Commands Manual"
+
+.SH NAME
+openfoam \- OpenFOAM bash(1) session
+
+.SH SYNOPSIS
+\fBopenfoam\fR [\fIOPTIONS\fR] [\fIapplication ...\fR]
+
+.SH DESCRIPTION
+Activate an \fBOpenFOAM\fR environment in an interactive or
+non-interactive bash(1) session.
+
+If no application is given, an interactive bash session will be used.
+If an application (optionally with arguments) is provided, the
+OpenFOAM \fIetc/bashrc\fR file will be sourced from the project directory
+prior to running the application.
+
+.SH OPTIONS
+.TP
+\fB\-c\fR \fIcommand\fR
+Execute shell commands with OpenFOAM environment
+.TP
+\fB\-D\fR\fIkey=[value]\fR
+Define key/value to pass as a preference
+.TP
+\fB\-sp\fR
+Use single precision for scalar-size
+.TP
+\fB\-dp\fR
+Use double precision for scalar-size
+.TP
+\fB\-spdp\fR
+Use single precision for scalar-size, double for solve-scalar size
+.TP
+\fB\-int32\fR
+Use 32-bit label-size
+.TP
+\fB\-int64\fR
+Use 64-bit label-size
+.TP
+\fB\-prefix=DIR\fR
+Specify alternative OpenFOAM project directory
+.TP
+\fB\-show-api\fR | \fB\-version\fR
+Print META-INFO api value and exit
+.TP
+\fB\-show-patch\fR
+Print META-INFO patch value and exit
+.TP
+\fB\-show-prefix\fR
+Print project directory and exit
+.TP
+\fB\-help\fR
+Print the usage
+
+.SH ARGUMENTS
+
+If arguments remain after option processing, the first argument is
+assumed to be an application with options and arguments.
+
+.SH FILES
+
+The \fIetc/bashrc\fR file from the OpenFOAM project directory supplies
+the environment settings.
+
+.SH "SEE ALSO"
+Online documentation https://www.openfoam.com/documentation/
+
+.SH COPYRIGHT
+Copyright \(co 2020 OpenCFD Ltd.
diff --git a/etc/bashrc b/etc/bashrc
index 1c63377b8e0..512f083be75 100644
--- a/etc/bashrc
+++ b/etc/bashrc
@@ -6,11 +6,10 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2016-2019 OpenCFD Ltd.
+#     Copyright (C) 2016-2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
-#     This file is part of OpenFOAM, licensed under GNU General Public License
-#     <http://www.gnu.org/licenses/>.
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
 #
 # File
 #     etc/bashrc
@@ -30,11 +29,16 @@
 #         -  $WM_PROJECT_SITE/$FOAM_API/etc/prefs.sh
 #         -  $WM_PROJECT_SITE/etc/prefs.sh
 #
+#     Some settings can also be overridden on the command-line when
+#     sourcing this file. For example,
+#
+#       . /path/etc/bashrc WM_COMPILER=Clang WM_LABEL_SIZE=64
+#
 # Environment
-#     FOAM_VERBOSE (set/unset)
-#         - add extra verbosity when sourcing files
 #     FOAM_CONFIG_NOUSER (set/unset)
 #         - suppress use of user/group configuration files
+#     FOAM_VERBOSE (set/unset)
+#         - add extra verbosity when sourcing files
 #     WM_PROJECT_SITE (optional directory)
 #         - local site-specific directory, uses WM_PROJECT_DIR/site if unset
 #
diff --git a/etc/config.sh/setup b/etc/config.sh/setup
index d502e835ccb..afead38f9ff 100644
--- a/etc/config.sh/setup
+++ b/etc/config.sh/setup
@@ -132,8 +132,8 @@ then
     _foamAddMan "$WM_PROJECT_DIR/doc"
 fi
 
-# Interactive shell
-if /usr/bin/tty -s 2>/dev/null
+# Interactive shell (use PS1, not tty)
+if [ -n "$PS1" ]
 then
     _foamEtc -config  aliases
     [ "${BASH_VERSINFO:-0}" -ge 4 ] && _foamEtc -config  bash_completion
diff --git a/etc/cshrc b/etc/cshrc
index 9d458a301d3..7e64e6b3bd9 100644
--- a/etc/cshrc
+++ b/etc/cshrc
@@ -6,11 +6,10 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2016-2019 OpenCFD Ltd.
+#     Copyright (C) 2016-2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
-#     This file is part of OpenFOAM, licensed under GNU General Public License
-#     <http://www.gnu.org/licenses/>.
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
 #
 # File
 #     etc/cshrc
@@ -30,11 +29,16 @@
 #         -  $WM_PROJECT_SITE/$FOAM_API/etc/prefs.csh
 #         -  $WM_PROJECT_SITE/prefs.csh
 #
+#     Some settings can also be overridden on the command-line when
+#     sourcing this file. For example,
+#
+#       source /path/etc/cshrc WM_COMPILER=Clang WM_LABEL_SIZE=64
+#
 # Environment
-#     FOAM_VERBOSE (set/unset)
-#         - add extra verbosity when sourcing files
 #     FOAM_CONFIG_NOUSER (set/unset)
 #         - suppress use of user/group configuration files
+#     FOAM_VERBOSE (set/unset)
+#         - add extra verbosity when sourcing files
 #     WM_PROJECT_SITE (optional directory)
 #         - local site-specific directory, uses WM_PROJECT_DIR/site if unset
 #
diff --git a/etc/openfoam b/etc/openfoam
new file mode 100755
index 00000000000..e6d67dcb575
--- /dev/null
+++ b/etc/openfoam
@@ -0,0 +1,272 @@
+#!/bin/bash
+#------------------------------------------------------------------------------
+# =========                 |
+# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+#  \\    /   O peration     |
+#   \\  /    A nd           | www.openfoam.com
+#    \\/     M anipulation  |
+#------------------------------------------------------------------------------
+#     Copyright (C) 2019-2020 OpenCFD Ltd.
+#------------------------------------------------------------------------------
+# License
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
+#
+# Script
+#     openfoam [options] [args]
+#
+# Description
+#     Open an interactive bash session with an OpenFOAM environment,
+#     or run an OpenFOAM application (with arguments) after first sourcing
+#     the OpenFOAM etc/bashrc file from the project directory.
+#
+# Note
+#     This script normally exists in the $WM_PROJECT_DIR/etc/ directory.
+#     Do not copy/move/link to other locations. Use instead an edited copy of
+#     `bin/tools/openfoam.in` with a hard-coded projectDir entry.
+#
+#     See OpenFOAM etc/bashrc for (command-line) preferences.
+#     Some equivalent settings:
+#       -sp     | -DWM_PRECISION_OPTION=SP
+#       -dp     | -DWM_PRECISION_OPTION=DP
+#       -int32  | -DWM_LABEL_SIZE=32
+#       -int64  | -DWM_LABEL_SIZE=64
+#
+#     However, the '-D' options grant more flexibility. For example,
+#         etc/openfoam -DWM_COMPILER=Clang
+#
+#------------------------------------------------------------------------------
+# Auto-detect from location
+projectDir="$(\cd "$(dirname "${0%/*}")" && \pwd -L)"
+
+#------------------------------------------------------------------------------
+printHelp() {
+    cat<<USAGE
+
+Usage: ${0##*/} [OPTION] [application ...]
+
+options:
+  -c command            Execute shell commands with OpenFOAM environment
+  -Dkey[=value]         Define key/value to pass as a preference
+  -sp                   Single precision
+  -dp                   Double precision
+  -spdp                 Mixed single/double precision
+  -int32 | -int64       The label-size
+  -prefix=DIR           Alternative OpenFOAM project directory
+  -show-api | -version  Print META-INFO api value and exit
+  -show-patch           Print META-INFO patch value and exit
+  -show-prefix          Print project directory and exit
+  -verbose              Set FOAM_VERBOSE=true (interactive only)
+  -help                 Print the usage
+
+Open an interactive bash session with an OpenFOAM environment,
+or run an OpenFOAM application (with arguments) after first sourcing
+the OpenFOAM etc/bashrc file from the project directory:
+($projectDir)
+
+For more information: www.openfoam.com
+
+USAGE
+    exit 0 # A clean exit
+}
+
+
+#-------------------------------------------------------------------------------
+
+# Get a value from META-INFO/api-info
+# $1 : keyword
+getApiInfo()
+{
+    value="$(sed -ne 's@^'"$1"' *= *\([0-9][0-9]*\).*@\1@p' "$projectDir"/META-INFO/api-info 2>/dev/null)"
+
+    if [ -n "$value" ]
+    then
+        echo "$value"
+    else
+        echo "Could not determine OPENFOAM '$1' value" 1>&2
+        return 1
+    fi
+}
+
+#-------------------------------------------------------------------------------
+
+# No inheritance of FOAM_SETTINGS
+unset FOAM_SETTINGS
+unset _foamSettings _foamScriptCommand
+
+# Parse options
+while [ "$#" -gt 0 ]
+do
+    case "$1" in
+    -h | -help* | --help*)
+        printHelp
+        ;;
+    -show-api | -version | --version)  # Show API and exit
+        getApiInfo api
+        exit $?
+        ;;
+    -show-patch)  # Show patch level and exit
+        getApiInfo patch
+        exit $?
+        ;;
+    -show-prefix)  # Show project directory and exit
+        echo "$projectDir"
+        exit $?
+        ;;
+
+    -c)  # Shell command
+        _foamScriptCommand="$2"
+        [ -n "$_foamScriptCommand" ] || {
+            echo "$0: missing or bad command argument: $2" 1>&2
+            exit 1
+        }
+        shift 2
+        break
+        ;;
+
+    -D*)  # Define key/value to pass as preference
+        setting="${1#-D}"
+        if [ -n "$setting" ]
+        then
+            _foamSettings="$_foamSettings${_foamSettings:+ }$setting"
+        fi
+        ;;
+
+    -sp | -dp | -spdp )
+        # WM_PRECISION_OPTION=(SP|DP|SPDP)
+        setting=$(echo "${1#-}" | sed -e 's/-//g;y/sdp/SDP/')
+        _foamSettings="$_foamSettings${_foamSettings:+ }WM_PRECISION_OPTION=$setting"
+        ;;
+
+    -int32 | -int64)
+        # WM_LABEL_SIZE=...
+        _foamSettings="$_foamSettings${_foamSettings:+ }WM_LABEL_SIZE=${1#-int}"
+        ;;
+
+    -prefix=*)
+        projectDir="${1#*=}"
+        ;;
+
+    -verbose)
+        export FOAM_VERBOSE=true
+        ;;
+
+    --)
+        shift
+        break
+        ;;
+    -*)
+        echo "$0: unknown option: '$1'" 1>&2
+        exit 1
+        ;;
+    *)
+        break
+        ;;
+    esac
+    shift
+done
+
+#-------------------------------------------------------------------------------
+
+# Sanity check (installed under /bin, /usr/bin, /usr/local/bin)
+# This should not happen.
+# If copied to a system dir, should also be using hard-coded values!
+
+if [ "${projectDir%/bin}" != "$projectDir" ]
+then
+    echo "Warning: suspicious project dir: $projectDir" 1>&2
+fi
+
+[ -d "$projectDir/META-INFO" ] || {
+    echo "Warning: missing META-INFO in OpenFOAM directory:" 1>&2
+    echo "    $projectDir" 1>&2
+}
+
+
+# Remove current OpenFOAM environment
+if [ -d "$WM_PROJECT_DIR" ] && [ -f "$WM_PROJECT_DIR/etc/config.sh/unset" ]
+then
+    . "$WM_PROJECT_DIR/etc/config.sh/unset" || true
+fi
+
+unset interactive
+
+if [ "$#" -eq 0 ] && [ -z "$_foamScriptCommand" ]
+then
+    # Interactive shell, chain off via a file
+    interactive=true
+    _foamSourceBashEnv="$projectDir/bin/tools/source-bashrc"
+else
+    # Non-interactive shell, use the OPENFOAM etc/bashrc
+    _foamSourceBashEnv="$projectDir/etc/bashrc"
+fi
+
+[ -f "$_foamSourceBashEnv" ] || {
+    echo "Error: file not found: $_foamSourceBashEnv" 1>&2
+    exit 2
+}
+
+if [ -n "$interactive" ]
+then
+    # Interactive shell
+    # -----------------
+
+    # Source ~/.bashrc and OpenFOAM etc/bashrc in one of two ways:
+    #   1) Generate and use a tmp file
+    #   2) Chain off to a dedicated file  [This is what we use]
+
+    if [ -n "$_foamSettings" ]
+    then
+        # Pass preferences via the FOAM_SETTINGS mechanism
+        export FOAM_SETTINGS="$_foamSettings"
+    fi
+
+    ## echo "Source with $_foamSourceBashEnv with '$FOAM_SETTINGS'" 1>&2
+
+    # Newer bash can use --init-file instead of --rcfile
+    exec bash --rcfile "$_foamSourceBashEnv" -i
+    exit $? # Safety
+fi
+
+
+# Non-interactive shell
+# ---------------------
+
+# Source bashrc within a function to preserve command-line arguments
+# Suppresses aliases as a side-effect, but non-interactive anyhow.
+sourceBashrc()
+{
+    . "$_foamSourceBashEnv" $_foamSettings
+}
+
+
+if [ -n "$_foamScriptCommand" ]
+then
+    # A shell command
+
+    sourceBashrc
+    exec bash -c "$_foamScriptCommand" "$@"
+    exit $? # Safety
+fi
+
+
+# An application or a shell script
+
+# It may actually be a script with a '#!/project-path/bin/openfoam',
+# so we need to catch this to avoid infinite recursion.
+if [ -f "$1" ] \
+&& [ -n "$(sed -ne '1{/^#!.*\/openfoam$/p; q}' "$1" 2>/dev/null)" ]
+then
+    # A shell script
+
+    sourceBashrc
+    exec bash "$@"
+
+else
+    # An application
+
+    sourceBashrc
+    exec "$@"
+
+fi
+
+#------------------------------------------------------------------------------
-- 
GitLab