Skip to content
Snippets Groups Projects
foamEtcFile 10.6 KiB
Newer Older
Mark Olesen's avatar
Mark Olesen committed
#!/bin/sh
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
Henry Weller's avatar
Henry Weller committed
#   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
#    \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
Mark Olesen's avatar
Mark Olesen committed
#-------------------------------------------------------------------------------
# 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.
Mark Olesen's avatar
Mark Olesen committed
#
#     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/>.
Mark Olesen's avatar
Mark Olesen committed
#
# Script
#     foamEtcFile
#
# Description
#     Locate user/group/other files 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:
#        eval $(foamEtcFile -sh -mode=go prefs.sh)
Mark Olesen's avatar
Mark Olesen committed
#
# Environment
#     - WM_PROJECT:         (unset defaults to OpenFOAM)
#     - WM_PROJECT_SITE:    (unset defaults to PREFIX/site)
#     - WM_PROJECT_VERSION: (unset defaults to detect from path)
#
#     This script must exist in one of these locations:
#     - $WM_PROJECT_INST_DIR/OpenFOAM-<VERSION>/bin
#     - $WM_PROJECT_INST_DIR/openfoam-<VERSION>/bin
#     - $WM_PROJECT_INST_DIR/openfoam<VERSION>/bin  (debian version)
Mark Olesen's avatar
Mark Olesen committed
#-------------------------------------------------------------------------------
unset optQuiet optSilent
Mark Olesen's avatar
Mark Olesen committed
usage() {
    [ "${optQuiet:-$optSilent}" = true ] && exit 1
Mark Olesen's avatar
Mark Olesen committed
    exec 1>&2
    while [ "$#" -ge 1 ]; do echo "$1"; shift; done
    cat<<USAGE

Usage: foamEtcFile [OPTION] fileName
       foamEtcFile [OPTION] [-list|-list-test] [fileName]

Mark Olesen's avatar
Mark Olesen committed
options:
  -a, -all          Return all files (otherwise stop after the first match)
  -l, -list         List directories or files to be checked
  -list-test        List (existing) directories or files to be checked
  -mode=MODE        Any combination of u(user), g(group), o(other)
  -prefix=DIR       Specify an alternative installation prefix
  -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
                    As per -csh | -sh, with additional verbosity
  -q, -quiet        Suppress all normal output
  -s, -silent       Suppress stderr, except -csh-verbose, -sh-verbose output
  -help             Print the usage

Locate user/group/other file with semantics similar to the
~OpenFOAM/fileName expansion.

Single character options must not be grouped. Equivalent options:
    -mode=MODE,   -mode MODE,   -m MODE
    -prefix=DIR,  -prefix DIR,  -p DIR
    -version=VER, -version VER, -v VER

Exit status
    0  when the file is found. Print resolved path to stdout.
    1  for miscellaneous errors.
    2  when the file is not found.
# Report error and exit
die()
{
    [ "${optQuiet:-$optSilent}" = true ] && exit 1
    exec 1>&2
    echo
    echo "Error encountered:"
    while [ "$#" -ge 1 ]; do echo "    $1"; shift; done
    echo
    echo "See 'foamEtcFile -help' for usage"
    echo
    exit 1
}

#-------------------------------------------------------------------------------
binDir="${0%/*}"                # The bin dir
projectDir="${binDir%/bin}"     # The project dir
prefixDir="${projectDir%/*}"    # The prefix dir (same as $WM_PROJECT_INST_DIR)
# Could not resolve projectDir, prefixDir? (eg, called as ./bin/foamEtcFile)
if [ "$prefixDir" = "$projectDir" ]
then
    binDir="$(cd $binDir && pwd -L)"
    projectDir="${binDir%/bin}"
    prefixDir="${projectDir%/*}"
fi
projectDirName="${projectDir##*/}"      # The project directory name
projectVersion="$WM_PROJECT_VERSION"    # Empty? - will be treated later
userDir="$HOME/.OpenFOAM"               # Hard-coded as per foamVersion.H
#-------------------------------------------------------------------------------
# Guess project version or simply get the stem part of the projectDirName.
# Handle standard and debian naming conventions.
# - projectVersion: update unless already set
#
# Helper variables:
# - dirBase (for reassembling name) == projectDirName without the version
# - versionNum (debian packaging)
unset dirBase versionNum
guessVersion()
{
    local version

    case "$projectDirName" in
    (OpenFOAM-* | openfoam-*)
        # Standard naming: OpenFOAM-<VERSION> or openfoam-<VERSION>
        dirBase="${projectDirName%%-*}-"
        version="${projectDirName#*-}"
        version="${version%%*-}" # Extra safety, eg openfoam-version-packager
        ;;

    (openfoam[0-9]*)
        # Debian naming: openfoam<VERSION>
        dirBase="openfoam"
        version="${projectDirName#openfoam}"
        versionNum="$version"

        # Convert digits version number to decimal delineated
        case "${#versionNum}" in (2|3|4)
            version=$(echo "$versionNum" | sed -e 's@\([0-9]\)@\1.@g')
            version="${version%.}"
            ;;
        esac
        # Ignore special treatment if no decimals were inserted.
        [ "${#version}" -gt "${#versionNum}" ] || unset versionNum
    (*)
        die "unknown/unsupported naming convention for '$projectDirName'"
    # Set projectVersion if required
    : ${projectVersion:=$version}
}
# Set projectVersion and update versionNum, projectDirName accordingly
    projectVersion="$1"
    # Need dirBase when reassembling projectDirName
    [ -n "$dirBase" ] || guessVersion
    # Debian: update x.y.z -> xyz version
    if [ -n "$versionNum" ]
    then
        versionNum=$(echo "$projectVersion" | sed -e 's@\.@@g')
    fi

    projectDirName="$dirBase${versionNum:-$projectVersion}"
optMode=ugo         # Default mode is always 'ugo'
unset optAll optList optShell optVersion
# Parse options
Mark Olesen's avatar
Mark Olesen committed
while [ "$#" -gt 0 ]
do
    case "$1" in
Mark Olesen's avatar
Mark Olesen committed
        usage
        ;;
Mark Olesen's avatar
Mark Olesen committed
    -l | -list)
    -list-test)
        optList='test'
        unset optShell
        ;;
    -csh | -sh | -csh-verbose | -sh-verbose)
        optShell="${1#-}"
        unset optAll
Mark Olesen's avatar
Mark Olesen committed
        ;;
    -mode=[ugo]*)
        optMode="${1#*=}"
        ;;
    -prefix=/*)
        prefixDir="${prefixDir%/}"
        ;;
    -version=*)
        optVersion="${1#*=}"
        optMode="$2"
        shift
        # Sanity check. Handles missing argument too.
        case "$optMode" in
        ([ugo]*)
        (*)
            die "invalid mode '$optMode'"
        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
        prefixDir="${2%/}"
Mark Olesen's avatar
Mark Olesen committed
    -q | -quiet)
Mark Olesen's avatar
Mark Olesen committed
        ;;
        [ "$#" -ge 2 ] || die "'$1' option requires an argument"
        optVersion="$2"
Mark Olesen's avatar
Mark Olesen committed
    -*)
        die "unknown option: '$1'"
Mark Olesen's avatar
Mark Olesen committed
        ;;
    *)
        break
        ;;
    esac

#-------------------------------------------------------------------------------

if [ -n "$optVersion" ]
then
    setVersion $optVersion
elif [ -z "$projectVersion" ]
then
    guessVersion
fi

# Updates:
# - projectDir  for changes via -prefix or -version
# - groupDir    for changes via -prefix
projectDir="$prefixDir/$projectDirName"
groupDir="${WM_PROJECT_SITE:-$prefixDir/site}"
# Debugging:
# echo "Installed locations:" 1>&2
# for i in projectDir prefixDir projectDirName projectVersion
# Save the essential bits of information
# silently remove leading ~OpenFOAM/ (used in Foam::findEtcFile)
Mark Olesen's avatar
Mark Olesen committed
nArgs=$#
fileName="${1#~OpenFOAM/}"
# Define the various places to be searched:
case "$optMode" in (*u*) # (U)ser
    dirList="$dirList $userDir/$projectVersion $userDir"
case "$optMode" in (*g*) # (G)roup == site
    dirList="$dirList $groupDir/$projectVersion $groupDir"
case "$optMode" in (*o*) # (O)ther == shipped
    dirList="$dirList $projectDir/etc"
if [ -n "$optList" ]
    # List directories, or potential file locations
    [ "$nArgs" -le 1 ] || \
    die "-list expects 0 or 1 filename, but $nArgs provided"
    # A silly combination, but -quiet does have precedence
    [ -n "$optQuiet" ] && exit 0
    # Test for directory or file too?
    if [ "$optList" = "test" ]
    then
        exitCode=2  # Fallback to a general error (file not found)

Mark Olesen's avatar
Mark Olesen committed
        if [ "$nArgs" -eq 1 ]
        then
            for dir
            do
                resolved="$dir/$fileName"
                if [ -f "$resolved" ]
                then
                    echo "$resolved"
                    exitCode=0  # OK
                fi
            done
Mark Olesen's avatar
Mark Olesen committed
        else
            for dir
            do
                if [ -d "$dir" ]
                then
                    echo "$dir"
                    exitCode=0  # OK
                fi
            done
Mark Olesen's avatar
Mark Olesen committed
        fi
    else
        for dir
        do
            echo "$dir${fileName:+/}$fileName"
        done
    fi
    [ "$nArgs" -eq 1 ] || die "One filename expected - $nArgs provided"
    exitCode=2  # Fallback to a general error (file not found)
Mark Olesen's avatar
Mark Olesen committed
    for dir
    do
        if [ -f "$dir/$fileName" ]
        then
            [ -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
Mark Olesen's avatar
Mark Olesen committed

#------------------------------------------------------------------------------