Newer
Older
#!/bin/sh
#------------------------------------------------------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration |
# \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
#-------------------------------------------------------------------------------
# License
# This file is part of OpenFOAM.
#
# OpenFOAM is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
#
# Script
# foamEtcFile
#
# Description
# Locate user/group/shipped file with semantics similar to the
# ~OpenFOAM/fileName expansion.
#
# The -mode option can be used to allow chaining from
# personal settings to site-wide settings.
#
# For example, within the user ~/.OpenFOAM/<VER>/prefs.sh:
# foamFile=$(foamEtcFile -mode go prefs.sh) && . $foamFile
# This script must exist in $FOAM_INST_DIR/OpenFOAM-<VERSION>/bin/
# or $FOAM_INST_DIR/openfoam<VERSION>/bin/ (for the debian version)
#-------------------------------------------------------------------------------
[ "${optQuiet:-$optSilent}" = true ] && exit 1
exec 1>&2
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
cat<<USAGE
Usage: foamEtcFile [OPTION] fileName
foamEtcFile [OPTION] -list
-a, -all return all files (otherwise stop after the first match)
-l, -list list the directories to be searched
-m, -mode MODE any combination of u(user), g(group), o(other)
-p, -prefix DIR specify an alternative installation prefix
-q, -quiet suppress all normal output
-s, -silent suppress stderr output, except for things that are emitted
by -csh-verbose, -sh-verbose.
-v, -version VER specify alternative OpenFOAM version (eg, 3.0, 1612, ...)
-csh | -sh produce output suitable for a csh or sh 'eval'
-csh-verbose,
-sh-verbose with additional verbosity
-help print the usage
Locate user/group/shipped file with semantics similar to the
~OpenFOAM/fileName expansion.
Many options can be specified as a single character, but must not be grouped.
Exit status
0 when the file is found. Print resolved path to stdout.
1 for miscellaneous errors.
2 when the file is not found.
#-------------------------------------------------------------------------------
# The prefix dir (same as $FOAM_INST_DIR):
prefixDir="${projectDir%/*}"
# The name used for the project directory
projectDirName="${projectDir##*/}"
# The versionNum is used for debian packaging
unset versionNum
# Handle standard and debian naming conventions.
# - projectDirBase: projectDirName without the version
# - version
# - versionNum (debian only)
#
case "$projectDirName" in
OpenFOAM-* | openfoam-*) # OpenFOAM-<VERSION> or openfoam-<VERSION>
projectDirBase="${projectDirName%%-*}-"
version="${projectDirName#*-}"
openfoam[0-9]*) # Debian: openfoam<VERSION>
projectDirBase="openfoam"
versionNum="${projectDirName#openfoam}"
case "${#versionNum}" in
(2|3|4) # Convert digits version number to decimal delineated
version=$(echo "$versionNum" | sed -e 's@\([0-9]\)@\1.@g')
version="${version%.}"
(*) # Fallback - use current environment setting
version="$WM_PROJECT_VERSION"
;;
esac
;;
echo "foamEtcFile error: unknown/unsupported naming convention" 1>&2
# Set version and update versionNum, projectDirName accordingly
setVersion()
{
version="$1"
# Convert x.y.z -> xyz version (if installation looked like debian)
[ -n "$versionNum" ] && versionNum=$(echo "$version" | sed -e 's@\.@@g')
projectDirName="$projectDirBase${versionNum:-${version}}"
}
unset optAll optList optShell
# parse options
while [ "$#" -gt 0 ]
do
case "$1" in
-h | -help)
usage
;;
-a | -all)
optAll=true
;;
optList=true
unset optShell
;;
-csh | -sh | -csh-verbose | -sh-verbose)
optShell="${1#-}"
unset optAll
mode="${1#*=}"
prefixDir="${1#*=}"
prefixDir="${prefixDir%/}"
;;
-version=*)
setVersion "${1#*=}"
-m | -mode)
mode="$2"
# Sanity check. Handles missing argument too.
case "$mode" in
-p | -prefix)
[ "$#" -ge 2 ] || usage "'$1' option requires an argument"
optQuiet=true
optSilent=true
-v | -version)
[ "$#" -ge 2 ] || usage "'$1' option requires an argument"
setVersion "$2"
shift
;;
--)
shift
break
projectDir="$prefixDir/$projectDirName"
# Debugging:
# echo "Installed locations:" 1>&2
# for i in projectDir prefixDir projectDirName version versionNum
# do
# eval echo "$i=\$$i" 1>&2
# Save the essential bits of information
# silently remove leading ~OpenFOAM/ (used in Foam::findEtcFile)
fileName="${1#~OpenFOAM/}"
# Define the various places to be searched:
unset dirList
case "$mode" in (*u*) # (U)ser
dir="$HOME/.${WM_PROJECT:-OpenFOAM}"
dirList="$dirList $dir/$version $dir"
case "$mode" in (*g*) # (G)roup == site
dir="${WM_PROJECT_SITE:-$prefixDir/site}"
dirList="$dirList $dir/$version $dir"
case "$mode" in (*o*) # (O)ther == shipped
set -- $dirList
exitCode=0
if [ "$optList" = true ]
# List directories, or potential file locations
# A silly combination, but -quiet does have precedence
[ -n "$optQuiet" ] && exit 0
for dir
do
if [ "$nArgs" -eq 1 ]
then
echo "$dir/$fileName"
else
echo "$dir"
fi
done
else
[ "$nArgs" -eq 1 ] || usage
exitCode=2 # Fallback to a general error, eg file not found
for dir
do
if [ -f "$dir/$fileName" ]
then
exitCode=0
[ -n "$optQuiet" ] && break
case "$optShell" in
(*verbose)
echo "Using: $dir/$fileName" 1>&2
;;
esac
case "$optShell" in
csh*)
echo "source $dir/$fileName"
break
;;
sh*)
echo ". $dir/$fileName"
break
;;
*)
echo "$dir/$fileName"
[ -n "$optAll" ] || break
;;
esac
exit $exitCode
#------------------------------------------------------------------------------