|
|
|
|
@ -92,36 +92,26 @@ banner () {
|
|
|
|
|
EOF
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
header_start () {
|
|
|
|
|
declareLocals () {
|
|
|
|
|
cat <<EOF
|
|
|
|
|
{
|
|
|
|
|
local cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
|
|
|
local prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
|
|
|
local line=\${COMP_LINE}
|
|
|
|
|
local used=\$(echo "\$line" | grep -oE "\-[a-zA-Z]+ ")
|
|
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
header_end () {
|
|
|
|
|
caseStart () {
|
|
|
|
|
cat <<EOF
|
|
|
|
|
|
|
|
|
|
[ "\$COMP_CWORD" = 1 ] || \\
|
|
|
|
|
case "\$prev" in
|
|
|
|
|
EOF
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
footer () {
|
|
|
|
|
caseEnd () {
|
|
|
|
|
cat <<EOF
|
|
|
|
|
esac
|
|
|
|
|
COMPREPLY=( \$(compgen -W "\${opts}" \$extra -- \${cur}) )
|
|
|
|
|
}
|
|
|
|
|
EOF
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
close () {
|
|
|
|
|
cat<<EOF
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
EOF
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -129,7 +119,8 @@ EOF
|
|
|
|
|
_foamGet () {
|
|
|
|
|
cat <<EOF
|
|
|
|
|
_foamGet_ ()
|
|
|
|
|
$(header_start)
|
|
|
|
|
{
|
|
|
|
|
$(declareLocals)
|
|
|
|
|
|
|
|
|
|
_searchDirs () {
|
|
|
|
|
_dirs="\\
|
|
|
|
|
@ -156,7 +147,8 @@ $(header_start)
|
|
|
|
|
for o in \$used ; do opts="\${opts/\$o/}" ; done
|
|
|
|
|
extra=""
|
|
|
|
|
opts="\${opts} \$(_searchDirs)"
|
|
|
|
|
$(header_end)
|
|
|
|
|
|
|
|
|
|
$(caseStart)
|
|
|
|
|
-case|-target)
|
|
|
|
|
opts="" ; extra="-d" ;;
|
|
|
|
|
-ext)
|
|
|
|
|
@ -168,7 +160,8 @@ $(header_end)
|
|
|
|
|
*) opts=""; extra="" ;;
|
|
|
|
|
esac
|
|
|
|
|
;;
|
|
|
|
|
$(footer)
|
|
|
|
|
$(caseEnd)
|
|
|
|
|
}
|
|
|
|
|
complete -o filenames -o nospace -F _foamGet_ foamGet
|
|
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
@ -178,13 +171,16 @@ EOF
|
|
|
|
|
_foamCloneCase () {
|
|
|
|
|
cat <<EOF
|
|
|
|
|
_foamCloneCase_ ()
|
|
|
|
|
$(header_start)
|
|
|
|
|
{
|
|
|
|
|
$(declareLocals)
|
|
|
|
|
|
|
|
|
|
opts="-add -help -latestTime -no-orig -no-scripts -processor -template"
|
|
|
|
|
for o in \$used ; do opts="\${opts/\$o/}" ; done
|
|
|
|
|
extra="-d"
|
|
|
|
|
$(header_end)
|
|
|
|
|
$(footer)
|
|
|
|
|
|
|
|
|
|
$(caseStart)
|
|
|
|
|
$(caseEnd)
|
|
|
|
|
}
|
|
|
|
|
complete -o filenames -o nospace -F _foamCloneCase_ foamCloneCase
|
|
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
@ -208,156 +204,176 @@ do
|
|
|
|
|
|
|
|
|
|
echo "Configuring $appName"
|
|
|
|
|
|
|
|
|
|
# Check for special configurations
|
|
|
|
|
echo "$specialApps" | grep -qsw "$appName" && "_$appName" >> "$file" && continue
|
|
|
|
|
# If a special configurations is defined for this app, use it and continue
|
|
|
|
|
echo "$specialApps" | \
|
|
|
|
|
grep -qsw "$appName" && "_$appName" >> "$file" && continue
|
|
|
|
|
|
|
|
|
|
# ARGUMENTS between <> and []
|
|
|
|
|
usage=$($app -help | grep ^Usage)
|
|
|
|
|
args=$(echo "$usage" | awk -F '[]<>[]' '{for(i=2;i<=NF;++i)print $i}' | sed '/^[\t ]*$/d')
|
|
|
|
|
# Get arguments. Anything on the usage line in <> or [] brackets.
|
|
|
|
|
argList=$($app -help | \
|
|
|
|
|
grep ^Usage | \
|
|
|
|
|
awk -F '[]>]' '{for(i=1;i<=NF;++i) print $i}' | \
|
|
|
|
|
awk -F ' [<[]' '{print $2}')
|
|
|
|
|
|
|
|
|
|
# Entries without "output", ending "file"
|
|
|
|
|
input_file_args=$(echo "$args" | while read -r line
|
|
|
|
|
do
|
|
|
|
|
echo "$line" | grep -v output | grep -E "file$"
|
|
|
|
|
done)
|
|
|
|
|
n_input_file_args=$(echo "$input_file_args" | sed '/^$/d' | wc -l)
|
|
|
|
|
# Categorise arguments ...
|
|
|
|
|
|
|
|
|
|
# Entries without "output", including "case" or "dir*"
|
|
|
|
|
input_dir_args=$(echo "$args" | while read -r line
|
|
|
|
|
do
|
|
|
|
|
echo "$line" | grep -v output | grep -Ei "(case|dir).*"
|
|
|
|
|
done)
|
|
|
|
|
n_input_dir_args=$(echo "$input_dir_args" | sed '/^$/d' | wc -l)
|
|
|
|
|
# File arguments. Entries without "output", ending in "file".
|
|
|
|
|
inputFileArgs=$(echo "$argList" | while read -r line
|
|
|
|
|
do
|
|
|
|
|
echo "$line" | grep -v output | grep -E "file$"
|
|
|
|
|
done)
|
|
|
|
|
nInputFileArgs=$(echo "$inputFileArgs" | sed '/^$/d' | wc -l)
|
|
|
|
|
|
|
|
|
|
# OPTIONS
|
|
|
|
|
opt_list=$($app -help | \
|
|
|
|
|
sed -n '/^options/,/^$/p' | \
|
|
|
|
|
grep -E "^[\t ]*-" | \
|
|
|
|
|
tr -s " ")
|
|
|
|
|
# Directory arguments. Entries without "output", including "case" or "dir*".
|
|
|
|
|
inputDirArgs=$(echo "$argList" | while read -r line
|
|
|
|
|
do
|
|
|
|
|
echo "$line" | grep -v output | grep -Ei "(case|dir).*"
|
|
|
|
|
done)
|
|
|
|
|
nInputDirArgs=$(echo "$inputDirArgs" | sed '/^$/d' | wc -l)
|
|
|
|
|
|
|
|
|
|
argless_opts="" # options without arguments
|
|
|
|
|
dir_opts="" # options with directory arguments
|
|
|
|
|
file_opts="" # options with file arguments
|
|
|
|
|
handler_opts="" # file handler options -fileHandler
|
|
|
|
|
ranges_opts="" # ranges options -time
|
|
|
|
|
arg_opts="" # options with unspecified arguments
|
|
|
|
|
# Options. Anything in the between "options" and the next empty line.
|
|
|
|
|
optList=$($app -help | \
|
|
|
|
|
sed -n '/^options/,/^$/p' | \
|
|
|
|
|
grep -E "^[\t ]*-" | \
|
|
|
|
|
tr -s " ")
|
|
|
|
|
|
|
|
|
|
# Categorise options ...
|
|
|
|
|
|
|
|
|
|
arglessOpts="" # options without arguments
|
|
|
|
|
dirOpts="" # options with directory arguments
|
|
|
|
|
fileOpts="" # options with file arguments
|
|
|
|
|
handlerOpts="" # file handler options -fileHandler
|
|
|
|
|
rangesOpts="" # ranges options -time
|
|
|
|
|
argOpts="" # options with unspecified arguments
|
|
|
|
|
|
|
|
|
|
while read -r line
|
|
|
|
|
do
|
|
|
|
|
# Get the option
|
|
|
|
|
opt=$(echo "$line" | cut -d " " -f1 | tr -d " ")
|
|
|
|
|
|
|
|
|
|
# Get the string in <>. Hack cuts beyond field 5 to avoid (fvPatchField<vector>)
|
|
|
|
|
# Get the adjacent string in <> brackets
|
|
|
|
|
next=$(echo "$line" | \
|
|
|
|
|
cut -d " " -f1-5 | \
|
|
|
|
|
awk -F '[<>]' '{print $2}' | \
|
|
|
|
|
tr -d \) | tr -d \()
|
|
|
|
|
sed 's/ \<.*\>.*//g' | \
|
|
|
|
|
awk -F '>' '{print $1}' | \
|
|
|
|
|
awk -F ' <' '{print $2}' |
|
|
|
|
|
tr -d \) | \
|
|
|
|
|
tr -d \()
|
|
|
|
|
|
|
|
|
|
# Check the last word in string
|
|
|
|
|
# Categorise by the the last word in the string
|
|
|
|
|
case "${next##* }" in
|
|
|
|
|
"") argless_opts="$argless_opts $opt" ;;
|
|
|
|
|
dir) dir_opts="$dir_opts $opt" ;;
|
|
|
|
|
file) file_opts="$file_opts $opt";;
|
|
|
|
|
handler) handler_opts="$handler_opts $opt";;
|
|
|
|
|
ranges) ranges_opts="$ranges_opts $opt";;
|
|
|
|
|
*) arg_opts="$arg_opts $opt";;
|
|
|
|
|
"") arglessOpts="$arglessOpts $opt" ;;
|
|
|
|
|
dir) dirOpts="$dirOpts $opt" ;;
|
|
|
|
|
file) fileOpts="$fileOpts $opt";;
|
|
|
|
|
handler) handlerOpts="$handlerOpts $opt";;
|
|
|
|
|
ranges) rangesOpts="$rangesOpts $opt";;
|
|
|
|
|
*) argOpts="$argOpts $opt";;
|
|
|
|
|
esac
|
|
|
|
|
done<<< "$opt_list"
|
|
|
|
|
done<<< "$optList"
|
|
|
|
|
|
|
|
|
|
# Combine options into a single list
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
all_opts=$(printf '%s\n' $argless_opts $dir_opts $file_opts $handler_opts $ranges_opts $arg_opts | sort)
|
|
|
|
|
allOpts=$(printf '%s\n' \
|
|
|
|
|
$arglessOpts $dirOpts $fileOpts $handlerOpts $rangesOpts $argOpts | \
|
|
|
|
|
sort)
|
|
|
|
|
|
|
|
|
|
# WRITE FUNCTION
|
|
|
|
|
# Write the completion function ...
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
|
{
|
|
|
|
|
echo "_${appName}_ ()"
|
|
|
|
|
echo "{"
|
|
|
|
|
declareLocals
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
echo "_${appName}_ ()"
|
|
|
|
|
header_start
|
|
|
|
|
# shellcheck disable=SC2027,SC2086
|
|
|
|
|
echo " opts=\""$allOpts"\""
|
|
|
|
|
echo " for o in \$used ; do opts=\"\${opts/\$o/}\" ; done"
|
|
|
|
|
|
|
|
|
|
# shellcheck disable=SC2027,SC2086
|
|
|
|
|
echo " opts=\""$all_opts"\""
|
|
|
|
|
echo " for o in \$used ; do opts=\"\${opts/\$o/}\" ; done"
|
|
|
|
|
if [ ! "$nInputFileArgs" = 0 ]
|
|
|
|
|
then
|
|
|
|
|
echo " extra=\"-d -f\""
|
|
|
|
|
elif [ ! "$nInputDirArgs" = 0 ]
|
|
|
|
|
then
|
|
|
|
|
echo " extra=\"-d\""
|
|
|
|
|
else
|
|
|
|
|
echo " extra=\"\""
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ ! "$n_input_file_args" = 0 ]
|
|
|
|
|
then
|
|
|
|
|
echo " extra=\"-d -f\""
|
|
|
|
|
elif [ ! "$n_input_dir_args" = 0 ]
|
|
|
|
|
then
|
|
|
|
|
echo " extra=\"-d\""
|
|
|
|
|
else
|
|
|
|
|
echo " extra=\"\""
|
|
|
|
|
fi
|
|
|
|
|
echo ""
|
|
|
|
|
caseStart
|
|
|
|
|
|
|
|
|
|
header_end
|
|
|
|
|
if [ -n "$dirOpts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $dirOpts | tr " " "|")"
|
|
|
|
|
echo " opts=\"\" ; extra=\"-d\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ -n "$dir_opts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $dir_opts | tr " " "|")"
|
|
|
|
|
echo " opts=\"\" ; extra=\"-d\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
if [ -n "$fileOpts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $fileOpts | tr " " "|")"
|
|
|
|
|
echo " opts=\"\" ; extra=\"-d -f\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ -n "$file_opts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $file_opts | tr " " "|")"
|
|
|
|
|
echo " opts=\"\" ; extra=\"-d -f\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
if [ -n "$handlerOpts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $handlerOpts | tr " " "|")"
|
|
|
|
|
echo " opts=\"uncollated collated masterUncollated\" ; extra=\"\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ -n "$handler_opts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $handler_opts | tr " " "|")"
|
|
|
|
|
echo " opts=\"uncollated collated masterUncollated\" ; extra=\"\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
if [ -n "$rangesOpts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $rangesOpts | tr " " "|")"
|
|
|
|
|
echo " opts=\"\$(foamListTimes -withZero 2> /dev/null)\" ; extra=\"\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ -n "$ranges_opts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $ranges_opts | tr " " "|")"
|
|
|
|
|
echo " opts=\"\$(foamListTimes -withZero 2> /dev/null)\" ; extra=\"\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
if [ -n "$argOpts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $argOpts | tr " " "|")"
|
|
|
|
|
echo " opts=\"\" ; extra=\"\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ -n "$arg_opts" ]
|
|
|
|
|
then
|
|
|
|
|
printf " %s)\n" "$(echo $arg_opts | tr " " "|")"
|
|
|
|
|
echo " opts=\"\" ; extra=\"\" ;;"
|
|
|
|
|
fi
|
|
|
|
|
# Set argOpts to all options with arguments
|
|
|
|
|
argOpts="$argOpts $dirOpts $fileOpts $handlerOpts $rangesOpts"
|
|
|
|
|
|
|
|
|
|
# Set arg_opts to all options with arguments
|
|
|
|
|
arg_opts="$arg_opts $dir_opts $file_opts $handler_opts $ranges_opts"
|
|
|
|
|
# Get the max of nInputFileArgs and nInputDirArgs
|
|
|
|
|
nMaxFileDirArgs=$nInputFileArgs
|
|
|
|
|
[ "$nInputDirArgs" -gt "$nMaxFileDirArgs" ] && \
|
|
|
|
|
nMaxFileDirArgs=$nInputDirArgs
|
|
|
|
|
|
|
|
|
|
# Get the max of n_input_file_args and n_input_dir_args
|
|
|
|
|
n_max_file_dir_args=$n_input_file_args
|
|
|
|
|
[ "$n_input_dir_args" -gt "$n_max_file_dir_args" ] && \
|
|
|
|
|
n_max_file_dir_args=$n_input_dir_args
|
|
|
|
|
# Stop optional arguments once mandatory arguments are entered
|
|
|
|
|
case "$nMaxFileDirArgs" in
|
|
|
|
|
0) echo " *) ;;" ;;
|
|
|
|
|
1)
|
|
|
|
|
echo " -*) ;;"
|
|
|
|
|
echo " *)"
|
|
|
|
|
if [ -z "${argOpts// }" ]
|
|
|
|
|
then
|
|
|
|
|
echo " opts=\"\"; extra=\"\""
|
|
|
|
|
else
|
|
|
|
|
echo " case \"\${COMP_WORDS[COMP_CWORD-2]}\" in"
|
|
|
|
|
printf " %s) ;;\n" \
|
|
|
|
|
"$(echo $argOpts | tr " " "|")"
|
|
|
|
|
echo " *) opts=\"\"; extra=\"\" ;;"
|
|
|
|
|
echo " esac"
|
|
|
|
|
fi
|
|
|
|
|
echo " ;;"
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
echo " -*) ;;"
|
|
|
|
|
echo " *) opts=\"\";;"
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
# Stop optional arguments once mandatory arguments are entered
|
|
|
|
|
case "$n_max_file_dir_args" in
|
|
|
|
|
0) echo " *) ;;" ;;
|
|
|
|
|
1)
|
|
|
|
|
echo " -*) ;;"
|
|
|
|
|
echo " *)"
|
|
|
|
|
if [ -z "${arg_opts// }" ]
|
|
|
|
|
then
|
|
|
|
|
echo " opts=\"\"; extra=\"\""
|
|
|
|
|
else
|
|
|
|
|
echo " case \"\${COMP_WORDS[COMP_CWORD-2]}\" in"
|
|
|
|
|
printf " %s) ;;\n" "$(echo $arg_opts | tr " " "|")"
|
|
|
|
|
echo " *) opts=\"\"; extra=\"\" ;;"
|
|
|
|
|
echo " esac"
|
|
|
|
|
fi
|
|
|
|
|
echo " ;;"
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
echo " -*) ;;"
|
|
|
|
|
echo " *) opts=\"\";;"
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
caseEnd
|
|
|
|
|
echo "}"
|
|
|
|
|
|
|
|
|
|
footer
|
|
|
|
|
|
|
|
|
|
echo "complete -o filenames -o nospace -F _${appName}_ ${appName}"
|
|
|
|
|
echo ""
|
|
|
|
|
echo "complete -o filenames -o nospace -F _${appName}_ ${appName}"
|
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
} >> "$file"
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
close >> "$file"
|
|
|
|
|
cat<<\EOF >> "$file"
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
|
|