| 1 | #!/bin/sh
|
|---|
| 2 |
|
|---|
| 3 | # INSTRUCTIONS: This patch is intended to be used prior to compiling ecCodes. It
|
|---|
| 4 | # reduces the severity error/warning when ecCodes encodes a missing data value
|
|---|
| 5 | # to a BUFR file, otherwise an overwhelming number of warnings are output.
|
|---|
| 6 | # Within the ropp2bufr_eccodes and eum2bufr_eccodes tools,
|
|---|
| 7 | # ECCODES_BUFR_SET_TO_MISSING_IF_OUT_OF_RANGE is set to 1 to make sure
|
|---|
| 8 | # that a missing data value is set in out-of-range cases. If the ecCodes BUFR
|
|---|
| 9 | # library is to be used to write missing data to BUFR files by other means than
|
|---|
| 10 | # these tools, then this environment variable must be set to 1 manually.
|
|---|
| 11 | #
|
|---|
| 12 | # Users should provide the location of their unzipped ecCodes source,
|
|---|
| 13 | # 'eccodes_path', as a command line argument. If this is not set, the default
|
|---|
| 14 | # location in $ROPP_SRC will be used instead.
|
|---|
| 15 |
|
|---|
| 16 | # Location of un-tar'd eccodes source
|
|---|
| 17 | eccodes_path=${1:-$ROPP_SRC/eccodes-2.12.5-Source/}
|
|---|
| 18 | echo 'Using ecCodes path: '$eccodes_path
|
|---|
| 19 | # Quit if can't find eccodes_path
|
|---|
| 20 | if [[ ! -d "$eccodes_path" ]] ; then echo "ecCodes path '$eccodes_path' doesn't exist, please fix." ; exit ; fi
|
|---|
| 21 |
|
|---|
| 22 | # Check if version 2.16 or newer
|
|---|
| 23 | cd $eccodes_path
|
|---|
| 24 | package=eccodes-2
|
|---|
| 25 | for d in $(ls -d $eccodes_path/../$package*); do
|
|---|
| 26 | thisdir=${d%%/} # save this directory/name
|
|---|
| 27 | d=$(basename $d); d=${d#$1} # remove <path><pack> parts
|
|---|
| 28 | v=$(expr index $d - 2>/dev/null) # remove anything else before first '-'...
|
|---|
| 29 | if [[ v -le 0 ]]; then
|
|---|
| 30 | v=$(expr index $d _ 2>/dev/null) # ... or '_' if no '-'
|
|---|
| 31 | fi
|
|---|
| 32 | if [[ v -gt 0 ]]; then
|
|---|
| 33 | thisver=${d:$v} # what's left is <vers>
|
|---|
| 34 | else
|
|---|
| 35 | thisver="0" # assume files with no detectable version are 'v0'
|
|---|
| 36 | fi
|
|---|
| 37 | if [[ -z "$latestver" ]]; then # initialise with first file found
|
|---|
| 38 | latestdir=$thisdir
|
|---|
| 39 | latestver=$thisver
|
|---|
| 40 | fi
|
|---|
| 41 | if [[ $thisver > $latestver ]]; then # update if higher <vers>
|
|---|
| 42 | latestdir=$thisdir
|
|---|
| 43 | latestver=$thisver
|
|---|
| 44 | echo 'latestver: '$latestver
|
|---|
| 45 | fi
|
|---|
| 46 | done
|
|---|
| 47 |
|
|---|
| 48 | if [[ $latestver > 2.16 ]]
|
|---|
| 49 | then
|
|---|
| 50 | version_2_16_onwards=true
|
|---|
| 51 | else
|
|---|
| 52 | version_2_16_onwards=false
|
|---|
| 53 | fi
|
|---|
| 54 | echo '####### version_2_16_onwards: '$version_2_16_onwards
|
|---|
| 55 |
|
|---|
| 56 | # Check the file is there:
|
|---|
| 57 | if [ ! -f $eccodes_path/src/grib_accessor_class_bufr_data_array.c ]; then
|
|---|
| 58 | echo "File not found, exiting. Make sure eccodes_path is set to top-level of unpacked ecCodes."
|
|---|
| 59 | exit 1
|
|---|
| 60 | fi
|
|---|
| 61 |
|
|---|
| 62 | # If grep doesn't find 3 instances of the pattern, code may have changed. so don't proceed with the patch
|
|---|
| 63 | n_instances=$(grep -n "Setting it to missing value" $eccodes_path/src/grib_accessor_class_bufr_data_array.c | wc -l)
|
|---|
| 64 | if [ $n_instances != 3 ] ; then echo "Wrong number of instances found. Exiting" && exit 2 ; fi
|
|---|
| 65 |
|
|---|
| 66 | # Get line numbers where we need to edit
|
|---|
| 67 | first=$(grep -n "Setting it to missing value" $eccodes_path/src/grib_accessor_class_bufr_data_array.c | cut -f1 -d: | head -1 )
|
|---|
| 68 | second=$(grep -n "Setting it to missing value" $eccodes_path/src/grib_accessor_class_bufr_data_array.c | cut -f1 -d: | head -2 | tail -1)
|
|---|
| 69 | third=$(grep -n "Setting it to missing value" $eccodes_path/src/grib_accessor_class_bufr_data_array.c | cut -f1 -d: | tail -1 )
|
|---|
| 70 |
|
|---|
| 71 | first="$(($first-1))"
|
|---|
| 72 | second="$(($second-1))"
|
|---|
| 73 | third="$(($third-1))"
|
|---|
| 74 |
|
|---|
| 75 | # Make a backup of the file we're about to edit
|
|---|
| 76 | cp $eccodes_path/src/grib_accessor_class_bufr_data_array.c $eccodes_path/src/grib_accessor_class_bufr_data_array.c_backup
|
|---|
| 77 |
|
|---|
| 78 | # Check that backup is made
|
|---|
| 79 | if [[ ! -f $eccodes_path/src/grib_accessor_class_bufr_data_array.c_backup ]]; then
|
|---|
| 80 | echo "Back up was not created. Check permissions? Exiting."
|
|---|
| 81 | exit
|
|---|
| 82 | fi
|
|---|
| 83 |
|
|---|
| 84 | # Change the error type to GRIB_LOG_DEBUG
|
|---|
| 85 | if [ "$version_2_16_onwards" = false ]
|
|---|
| 86 | then
|
|---|
| 87 | sed -i "$first"','"$first"'s/GRIB_LOG_ERROR/GRIB_LOG_DEBUG/' $eccodes_path/src/grib_accessor_class_bufr_data_array.c
|
|---|
| 88 | sed -i "$second"','"$second"'s/GRIB_LOG_ERROR/GRIB_LOG_DEBUG/' $eccodes_path/src/grib_accessor_class_bufr_data_array.c
|
|---|
| 89 | sed -i "$third"','"$third"'s/GRIB_LOG_ERROR/GRIB_LOG_DEBUG/' $eccodes_path/src/grib_accessor_class_bufr_data_array.c
|
|---|
| 90 | fi
|
|---|
| 91 | if [ "$version_2_16_onwards" = true ]
|
|---|
| 92 | then
|
|---|
| 93 | sed -i "$first"','"$first"'s/ECCODES WARNING/GRIB_LOG_DEBUG/' $eccodes_path/src/grib_accessor_class_bufr_data_array.c
|
|---|
| 94 | sed1_exit_code=$?
|
|---|
| 95 | sed -i "$second"','"$second"'s/ECCODES WARNING/GRIB_LOG_DEBUG/' $eccodes_path/src/grib_accessor_class_bufr_data_array.c
|
|---|
| 96 | sed2_exit_code=$?
|
|---|
| 97 | sed -i "$third"','"$third"'s/ECCODES WARNING/GRIB_LOG_DEBUG/' $eccodes_path/src/grib_accessor_class_bufr_data_array.c
|
|---|
| 98 | sed3_exit_code=$?
|
|---|
| 99 | fi
|
|---|
| 100 |
|
|---|
| 101 | #grep for GRIB_LOG_DEBUG on the relevant lines to test success
|
|---|
| 102 | if sed "$first"'q;d' $eccodes_path/src/grib_accessor_class_bufr_data_array.c | grep -q GRIB_LOG_DEBUG $eccodes_path/src/grib_accessor_class_bufr_data_array.c
|
|---|
| 103 | then
|
|---|
| 104 |
|
|---|
| 105 | if sed "$second"'q;d' $eccodes_path/src/grib_accessor_class_bufr_data_array.c | grep -q GRIB_LOG_DEBUG $eccodes_path/src/grib_accessor_class_bufr_data_array.c
|
|---|
| 106 | then
|
|---|
| 107 |
|
|---|
| 108 | if sed "$third"'q;d' $eccodes_path/src/grib_accessor_class_bufr_data_array.c | grep -q GRIB_LOG_DEBUG $eccodes_path/src/grib_accessor_class_bufr_data_array.c
|
|---|
| 109 | then
|
|---|
| 110 |
|
|---|
| 111 | printf '\nSuccess. Look at the difference of grib_accessor_class_bufr_data_array.c
|
|---|
| 112 | and grib_accessor_class_bufr_data_array.c_backup to make sure
|
|---|
| 113 | the patch has been applied correctly. If it looks correct, delete
|
|---|
| 114 | grib_accessor_class_bufr_data_array.c_backup\n\n'
|
|---|
| 115 | fi
|
|---|
| 116 | fi
|
|---|
| 117 |
|
|---|
| 118 | else
|
|---|
| 119 |
|
|---|
| 120 | printf '\nThere was a problem applying the patch. Try double checking the eccodes exists
|
|---|
| 121 | and is unpacked at the path you supplied for eccodes_path in this script.\n\n'
|
|---|
| 122 |
|
|---|
| 123 | fi
|
|---|