Skip to content
Snippets Groups Projects
foamCleanPath 4.35 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/bin/sh
    #------------------------------------------------------------------------------
    # =========                 |
    # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    #  \\    /   O peration     |
    
    #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
    
    #    \\/     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
    #     foamCleanPath
    #
    # Description
    
    mattijs's avatar
    mattijs committed
    #     Usage: foamCleanPath [-strip] path [wildcard] .. [wildcard]
    
    #
    #     Prints its argument (which should be a ':' separated path)
    
    #         - duplicate elements
    #         - elements whose start matches a wildcard
    
    #         - inaccessible directories (with the -strip option)
    
    # Note
    #     - this routine will fail when directories have embedded spaces
    #     - false matches possible if a wildcard contains '.' (sed regex)
    
    #     - the wildcards themselves can be written together and separated
    
    #       by colons or whitespace
    
    #------------------------------------------------------------------------------
    
    usage() {
        cat <<USAGE 1>&2
    
    Usage: ${0##*/} [OPTION] path [wildcard1] .. [wildcardN]
    options:
    
      -debug            print debug information to stderr
    
      -strip            remove inaccessible directories
      -help             print the usage
    
    Prints its argument (which should be a ':' separated list) cleansed from
      - duplicate elements
      - elements whose start matches one of the wildcard(s)
      - inaccessible directories (with the -strip option)
    
    Exit status
        0  on success
        1  for miscellaneous errors.
        2  initial value of 'path' is empty
    
    # Parse options
    unset optDebug optStrip
    
    while [ "$#" -gt 0 ]
    do
        case "$1" in
    
    [ "$#" -ge 1 ] || usage
    
    [ -n "$dirList" ] || exit 2     # Quick exit on empty 'dirList'
    
    #-------------------------------------------------------------------------------
    
    # Debugging (optional)
    if [ -n "$optDebug" ]
    then
        printDebug() { while [ "$#" -ge 1 ]; do echo "$1" 1>&2; shift; done; }
    else
        printDebug() { true; }      # No-op
    fi
    
    # Check directory existence (optional)
    if [ -n "$optStrip" ]
    then
        isDir() { test -d "$1"; }   # Check for directory
    else
        isDir() { true; }           # No check (always true)
    fi
    
    # The "wildcard1 ... wildcardN" may have been passed as a single parameter
    
    # or may contain ':' separators
    
    
    oldIFS="$IFS"   # Preserve initial IFS
    IFS=': '        # Split on colon, whitespace
    
    # Strip out wildcards via sed. Path and wildcard cannot contain '?'.
    
        if [ -n "$wildcard" ]
        then
    
            printDebug "remove>$wildcard<"
    
            dirList=$(echo "$dirList:" | sed -e "s?${wildcard}[^:]*:??g")
    
    printDebug "intermediate>$dirList<"
    
    IFS=': '        # Split on colon, whitespace (to avoid surprises)
    
    IFS="$oldIFS"   # Restore initial IFS
    
        printDebug "check>$dir< in $dirList"
        if isDir "$dir"
    
            # Detect duplicates (ie, dir already in the list)
            duplicate=$(echo ":$dirList:" | sed -ne '\?:'"$dir"':?p')
    
                printDebug "duplicate>$dir<"
            else
                dirList="${dirList}${dirList:+:}$dir"
    
    #------------------------------------------------------------------------------