Skip to content
Snippets Groups Projects
foamEtcFile 10.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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
    
    #------------------------------------------------------------------------------