View Issue Details

IDProjectCategoryView StatusLast Update
0002928OpenFOAMPatchpublic2018-05-15 11:55
Reporterwyldckat Assigned Tochris  
PrioritylowSeverityminorReproducibilityalways
Status resolvedResolutionfixed 
Summary0002928: 'foamSearch' will not work if executed from within a read-only directory
Description'foamSearch' is currently designed to rely on a temporary file for gathering the output from several searches made with 'foamDictionary'.

However, since the path to the file is not set to the system's default temporary path and is instead using the local directory from which the command was executed, this means that it will break when something like the following is done (using OpenFOAM 5 Deb packages):

  $ tut
  # goes to '/opt/openfoam5/tutorials', which is read-only

  $ foamSearch . fvSchemes ddtSchemes.default
  mktemp: failed to create file via template ‘tmp.XXXXXX’: Permission denied
  No keyword ddtSchemes.default found in fvSchemes files


One solution is to use "/tmp" as the default path for the temporary file; another solution is to simply drop the need for a temporary file and instead pipe the output from the 'for' loop to the existing sorting pipe.

Attached are the following files, which provides the latter solution:

  - 'foamSearch' - the file already with the patch applied, for replacing the file 'bin/foamSearch' on both OpenFOAM 5.x and dev.

  - 'foamSearch_piped.patch' - the proposed patch.


Changes made in the proposed patch:

  1. The last for 'loop' is piped directly to the 'sort' pipe line.

  2. Added a line break between the examples given by '-help', to that it's a bit easier to tell them apart.

  3. Updated the Copyright year.
Additional InformationHave a vague memory of having seen this issue in the past myself, but was reminded more recently by this bug report: https://develop.openfoam.com/Development/OpenFOAM-plus/issues/700
TagsNo tags attached.

Activities

wyldckat

2018-05-12 18:02

updater  

foamSearch (2,791 bytes)   
#!/bin/sh
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | Copyright (C) 2016-2018 OpenFOAM Foundation
#    \\/     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 <http://www.gnu.org/licenses/>.
#
# Script
#     foamSearch
#
# Description
#     Searches a directory for dictionary files of a particular name and
#     extracts entries of a particular keyword, sorting into a unique list.
#
#     Requires foamDictionary.
#
#------------------------------------------------------------------------------
Script=${0##*/}

usage() {
    cat<<USAGE

Usage: $Script [OPTIONS] <directory> <filename> <keyword>
options:
  -count | -c         prefix lines by the number of occurrences
  -help  | -h         print the usage

Searches the <directory> for files named <filename> and extracts entries with
<keyword>.  Sorts result into a list of unique entries (removing repeats).

Examples:
  * Default ddtSchemes entries in the fvSchemes files in all tutorials:
      foamSearch $FOAM_TUTORIALS fvSchemes  ddtSchemes.default

  * Relaxations factors for U in fvSolutions files in all tutorials:
      foamSearch -c $FOAM_TUTORIALS fvSolution  relaxationFactors.equations.U
USAGE
}

error() {
    while [ "$#" -ge 1 ]; do echo "$1"; shift; done
    usage
    exit 1
}

case "$1" in
(-c | -count)
    count="-c"
    shift
    ;;
(-h | -help)
    usage && exit 0
    ;;
-*)
    error "$1 is not a valid option/filename"
    ;;
esac

[ "$#" -eq 3 ] || error "Wrong number of arguments: expected 3, found $#"
[ -d "$1" ] || error "$1 is not a directory"

files=$(find "$1" -name "$2")
[ -n "$files" ] || error "No file $2 found in $1"

for f in $files
do
    foamDictionary -entry "$3" "$f" 2>/dev/null
done | \
    sort | uniq $count | sed '/^[\t 1-9]*$/d' || \
    echo "No keyword $3 found in $2 files"

#------------------------------------------------------------------------------
foamSearch (2,791 bytes)   

wyldckat

2018-05-12 18:02

updater  

foamSearch_piped.patch (1,628 bytes)   
diff --git a/bin/foamSearch b/bin/foamSearch
index 5ef36b7..3ff7d1e 100755
--- a/bin/foamSearch
+++ b/bin/foamSearch
@@ -3,7 +3,7 @@
 # =========                 |
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2016-2017 OpenFOAM Foundation
+#   \\  /    A nd           | Copyright (C) 2016-2018 OpenFOAM Foundation
 #    \\/     M anipulation  |
 #-------------------------------------------------------------------------------
 # License
@@ -48,6 +48,7 @@ Searches the <directory> for files named <filename> and extracts entries with
 Examples:
   * Default ddtSchemes entries in the fvSchemes files in all tutorials:
       foamSearch $FOAM_TUTORIALS fvSchemes  ddtSchemes.default
+
   * Relaxations factors for U in fvSolutions files in all tutorials:
       foamSearch -c $FOAM_TUTORIALS fvSolution  relaxationFactors.equations.U
 USAGE
@@ -75,19 +76,14 @@ esac
 [ "$#" -eq 3 ] || error "Wrong number of arguments: expected 3, found $#"
 [ -d "$1" ] || error "$1 is not a directory"
 
-tmp=$(mktemp tmp.XXXXXX)
 files=$(find "$1" -name "$2")
 [ -n "$files" ] || error "No file $2 found in $1"
 
 for f in $files
 do
-    foamDictionary -entry "$3" "$f" 2>/dev/null >> "$tmp"
-done
-
-[ -s "$tmp" ] && \
-    sort "$tmp" | uniq $count | sed '/^[\t 1-9]*$/d' || \
+    foamDictionary -entry "$3" "$f" 2>/dev/null
+done | \
+    sort | uniq $count | sed '/^[\t 1-9]*$/d' || \
     echo "No keyword $3 found in $2 files"
 
-rm "$tmp" 2>/dev/null
-
 #------------------------------------------------------------------------------
foamSearch_piped.patch (1,628 bytes)   

chris

2018-05-15 11:55

manager   ~0009577

Resolved in dev: https://github.com/OpenFOAM/OpenFOAM-dev/commit/163dc7
Resolved in 5.x: https://github.com/OpenFOAM/OpenFOAM-5.x/commit/8fb577

Issue History

Date Modified Username Field Change
2018-05-12 18:02 wyldckat New Issue
2018-05-12 18:02 wyldckat Status new => assigned
2018-05-12 18:02 wyldckat Assigned To => chris
2018-05-12 18:02 wyldckat File Added: foamSearch
2018-05-12 18:02 wyldckat File Added: foamSearch_piped.patch
2018-05-15 11:55 chris Note Added: 0009577
2018-05-15 11:55 chris Status assigned => resolved
2018-05-15 11:55 chris Resolution open => fixed