#!/usr/bin/env bash # This Bash4 script checks whether each key in "default" appears in # a .cc or .h file. Those that do not are printed to screen, and the # user is asked if they should be deleted from all language files. # # Keys in commented-out sections are not skipped, so they will remain # in the language files. # It does not handle dynamically built keys: # HISTORY_MSG_ # EXTPROGTARGET_ # FILEBROWSER_POPUPRANK # FILEBROWSER_POPUPCOLORLABEL # # Run the script from the project root: # ./tools/generateUnusedKeys # # Doublecheck the deletion before committing. # Run ./tools/generateTranslationDiffs after running this script. tmp=temp_file if [[ -w $tmp ]]; then rm -v "$tmp" fi abort () { printf "%s\n" "" "Aborted" "Removing leftover files:" [[ -e "$tmp" ]] && rm "$tmp" rm -v --interactive=once sed* exit 1 } trap 'abort' HUP INT QUIT ABRT TERM cd "rtdata/languages" || { printf "%s\n" "You must run this script from the root of the project."; exit 1; } # Build array of all interface translation files, or use user-specified ones only unset langFiles if [[ $# = 0 ]]; then while read -r; do langFiles+=("$REPLY") done < <(find . -not -iname "LICENSE" -not -iname "README" -not -iname "*.sh" -not -iname ".*" -not -iname "$tmp" | sort) else langFiles=("$@") for langFile in "${langFiles[@]}"; do if [[ ! -w $langFile ]]; then printf "%s\n" "File \"$langFile\" not found or not writable." "" exit 1 fi done fi dos2unix default 2>/dev/null t1="$(date +%s)" printf "%s\n" 'Matching keys in "default" against .cc and .h files' 'Unmatched keys follow:' unset delLines while read -r 'defLine'; do grep -Irl -m1 --include=\*.{cc,h} --exclude-dir="klt" "${defLine%%;*}" ../../* &>/dev/null if [[ $? = 1 ]]; then printf " %s\n" "${defLine%%;*}" delLines+=("${defLine%%;*}") fi done < <(grep -Ev "^(#|$)|HISTORY_MSG_" "default" | sed -e "s/EXTPROGTARGET_[0-9]*/EXTPROGTARGET_/" -e "s/FILEBROWSER_POPUPCOLORLABEL[0-9]*/FILEBROWSER_POPUPCOLORLABEL/" -e "s/FILEBROWSER_POPUPRANK[0-9]*/FILEBROWSER_POPUPRANK/" | sort -Vu) # The grep/sed line above lists keys to ignore. # Dynamically built keys like HISTORY_MSG_1 can't be grepped in the code, # so it renames KEY_1-KEY_9 to KEY_ so that they can be grepped and therefore ignored. t2="$(date +%s)" tt=$((t2-t1)) printf "%s\n" "" "Scan took $tt seconds" "" read -r -p 'Write results to "unmatched"? [y/n] ' if [[ $REPLY = y || $REPLY = Y ]]; then printf "%s\n" "${delLines[@]}" > unmatched printf "%s\n" "" fi read -r -p "Delete keys from all ${#langFiles[@]} interface language files? [y/n] " if [[ $REPLY = y || $REPLY = Y ]]; then printf "%s\n" "Removing keys from:" i=1 ttot1="$(date +%s)" for file in "${langFiles[@]}"; do printf "%02d - ${file#.*/}" "$i" t1="$(date +%s)" for key in "${delLines[@]}"; do sed -i "/.\?$key/d" "$file" done t2="$(date +%s)" tt=$((t2-t1)) printf "%s\n" " - took $tt seconds" ((i++)) done ttot2="$(date +%s)" ttot=$((ttot2-ttot1)) tsec=$((ttot%60)) tmin=$((ttot/60)) printf "%s\n" "Finished updating ${#langFiles[@]} files." "Total time: ${tmin}m ${tsec}s" fi