diff --git a/scripts/checks.sh b/scripts/checks.sh index d120cf52..9f904c6e 100755 --- a/scripts/checks.sh +++ b/scripts/checks.sh @@ -41,6 +41,45 @@ fail="${neg}fail${res}" force_install=0 verbose=0 +# Helper functions +# Sort to_sort in natural order. +sort() { + local size=${#to_sort[@]} + local swapped=0; + + for (( i = 0; i < $size-1; i++ )) + do + swapped=0 + for ((j = 0; j < $size-1-$i; j++ )) + do + if [[ "${to_sort[$j]}" > "${to_sort[$j+1]}" ]] + then + temp="${to_sort[$j]}"; + to_sort[$j]="${to_sort[$j+1]}"; + to_sort[$j+1]="$temp"; + swapped=1; + fi + done + + if [[ $swapped -eq 0 ]]; then + break; + fi + done +} + +# Remove common entries in to_diff1 and to_diff2. +diff() { + for i in ${!to_diff1[@]}; do + for j in ${!to_diff2[@]}; do + if [[ "${to_diff1[$i]}" == "${to_diff2[$j]}" ]]; then + unset to_diff1[$i] + unset to_diff2[$j] + break + fi + done + done +} + # Check if rustup is available. # Argument: # '-i' to install if missing. @@ -231,6 +270,124 @@ run_typos() { fi } +# Check if files in POTFILES.in are correct. +# +# This checks, in that order: +# - All files exist +# - All files with translatable strings are present and only those +# - Files are sorted alphabetically +# +# This assumes the following: +# - POTFILES is located at 'po/POTFILES.in' +# - UI (Glade) files are located in 'data/resources/ui' and use 'translatable="yes"' +# - Rust files are located in 'src' and use '*gettext' methods or macros +check_potfiles() { + echo -e "$Checking po/POTFILES.in…" + + local ret=0 + + # Check that files in POTFILES exist. + while read -r line; do + if [[ -n $line && ${line::1} != '#' ]]; then + if [[ ! -f $line ]]; then + echo -e "$error File '$line' in POTFILES.in does not exist" + ret=1 + fi + if [[ ${line:(-3):3} == '.ui' ]]; then + ui_potfiles+=($line) + elif [[ ${line:(-3):3} == '.rs' ]]; then + rs_potfiles+=($line) + fi + fi + done < po/POTFILES.in + + if [[ ret -eq 1 ]]; then + echo -e " Checking po/POTFILES.in result: $fail" + echo "Please fix the above issues" + exit 1 + fi + + # Get UI files with 'translatable="yes"'. + ui_files=(`grep -lIr 'translatable="yes"' data/resources/ui/*`) + + # Get Rust files with regex 'gettext[!]?\('. + rs_files=(`grep -lIrE 'gettext[!]?\(' src/*`) + + # Remove common files + to_diff1=("${ui_potfiles[@]}") + to_diff2=("${ui_files[@]}") + diff + ui_potfiles=("${to_diff1[@]}") + ui_files=("${to_diff2[@]}") + + to_diff1=("${rs_potfiles[@]}") + to_diff2=("${rs_files[@]}") + diff + rs_potfiles=("${to_diff1[@]}") + rs_files=("${to_diff2[@]}") + + potfiles_count=$((${#ui_potfiles[@]} + ${#rs_potfiles[@]})) + if [[ $potfiles_count -eq 1 ]]; then + echo "" + echo -e "$error Found 1 file in POTFILES.in without translatable strings:" + ret=1 + elif [[ $potfiles_count -ne 0 ]]; then + echo "" + echo -e "$error Found $potfiles_count files in POTFILES.in without translatable strings:" + ret=1 + fi + for file in ${ui_potfiles[@]}; do + echo $file + done + for file in ${rs_potfiles[@]}; do + echo $file + done + + let files_count=$((${#ui_files[@]} + ${#rs_files[@]})) + if [[ $files_count -eq 1 ]]; then + echo "" + echo -e "$error Found 1 file with translatable strings not present in POTFILES.in:" + ret=1 + elif [[ $files_count -ne 0 ]]; then + echo "" + echo -e "$error Found $files_count with translatable strings not present in POTFILES.in:" + ret=1 + fi + for file in ${ui_files[@]}; do + echo $file + done + for file in ${rs_files[@]}; do + echo $file + done + + if [[ ret -eq 1 ]]; then + echo "" + echo -e " Checking po/POTFILES.in result: $fail" + echo "Please fix the above issues" + exit 1 + fi + + # Check sorted alphabetically + to_sort=("${potfiles[@]}") + sort + for i in ${!potfiles[@]}; do + if [[ "${potfiles[$i]}" != "${to_sort[$i]}" ]]; then + echo -e "$error Found file '${potfiles[$i]}' before '${to_sort[$i]}' in POTFILES.in" + ret=1 + break + fi + done + + if [[ ret -eq 1 ]]; then + echo "" + echo -e " Checking po/POTFILES.in result: $fail" + echo "Please fix the above issues" + exit 1 + else + echo -e " Checking po/POTFILES.in result: $ok" + fi +} + # Check arguments while [[ "$1" ]]; do case $1 in -f | --force-install ) @@ -254,3 +411,5 @@ echo "" run_rustfmt echo "" run_typos +echo "" +check_potfiles \ No newline at end of file