#!/bin/bash #------------------------------------------------------------------------------ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | # \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. # \\/ M anipulation | #------------------------------------------------------------------------------ # 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 . # # Script # foamCreateCompletionCache # # Description # Create cache of bash completion values for OpenFOAM applications # The cached values are typically used by the tcsh completion wrapper. # #------------------------------------------------------------------------------ defaultOutputFile="$WM_PROJECT_DIR/etc/config.sh/completion_cache" usage() { exec 1>&2 while [ "$#" -ge 1 ]; do echo "$1"; shift; done cat<&2 echo echo "Error encountered:" while [ "$#" -ge 1 ]; do echo " $1"; shift; done echo echo "See '${0##*/} -help' for usage" echo exit 1 } #------------------------------------------------------------------------------- searchDirs="$FOAM_APPBIN" optHeader=true unset outputFile while [ "$#" -gt 0 ] do case "$1" in -h | -help*) usage ;; -d | -dir) [ "$#" -ge 2 ] || die "'$1' option requires an argument" searchDirs="$2" [ -d "$searchDirs" ] || die "directory not found '$searchDirs'" shift ;; -u | -user) searchDirs="$searchDirs $FOAM_USER_APPBIN" ;; -no-head*) optHeader=false ;; -o | -output) [ "$#" -ge 2 ] || die "'$1' option requires an argument" outputFile="$2" shift ;; -*) usage "unknown option: '$1'" ;; *) break ;; esac shift done : ${outputFile:=$defaultOutputFile} # Verify that output is writeable if [ -e "$outputFile" ] then [ -f "$outputFile" ] || \ die "Cannot overwrite $outputFile" "Not a file" [ -w "$outputFile" ] || \ die "Cannot overwrite $outputFile" "No permission?" else [ -w "$(dirname $outputFile)" ] || \ die "Cannot write $outputFile" "directory is not writeble" fi exec 1>| $outputFile || exit $? echo "Writing $outputFile" 1>&2 echo 1>&2 # Header not disabled [ "$optHeader" = true ] && cat << HEADER #----------------------------------*-sh-*-------------------------------------- # Cached options for bash completion of OpenFOAM applications. # These are the values expected by the '_of_complete_' function # # Recreate with "${0##*/}" # Global associative array (cached options for OpenFOAM applications) declare -gA _of_complete_cache_; # Clear existing cache. _of_complete_cache_=() #------------------------------------------------------------------------------ HEADER #------------------------------------------------------------------------------- # Scans the output of the application -help to detect options with/without # arguments. Dispatch via _of_complete_ # extractOptions() { local appName="$1" local helpText=$($appName -help 2>/dev/null | sed -ne '/^ *-/p') [ -n "$helpText" ] || { echo "Error calling $appName" 1>&2 return 1 } # Array of options with args local argOpts=($(awk '/^ {0,4}-[a-z]/ && /&2 echo "_of_complete_cache_[${appName}]=\"${argOpts[@]} | ${boolOpts[@]}\"" } #------------------------------------------------------------------------------ [ "$#" -gt 0 ] || set -- ${searchDirs} for item do if [ -d "$item" ] then # Process directory for applications - sort with ignore-case echo "[directory] $item" 1>&2 choices="$(find $item -maxdepth 1 -executable -type f | sort -f 2>/dev/null)" for appName in $choices do extractOptions $appName done elif command -v "$item" > /dev/null 2>&1 then extractOptions $item else echo "No such file or directory: $item" 1>&2 fi done # Generate footer [ "$optHeader" = true ] && cat << FOOTER #------------------------------------------------------------------------------ FOOTER #------------------------------------------------------------------------------