#!/bin/bash # # Copyright © 2020,2022 Dr. Helge Kreutzmann # # This program 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. # # This program 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 this program. If not, see . # This script finds all FIXMEs in manpages and prepeares as much as possible an output suitable for bug reporting # An example of only upstream is man2/wait.2.po # An example of both upstream and ours is man4/vcs.4.po # CONFIG DCSBASE=/scr/build/src/DCS/manpages-l10n/ CONFIGBASE=$DCSBASE/upstreambug/CONFIG DIALOG=$(which dialog) sk_temp=$((tempfile) 2>/dev/null) SSF_MAILER=/usr/bin/mutt SSF_BROWSER=/usr/bin/firefox SSF_TMP=/tmp/ssf TEMPLATE_FILE=$DCSBASE/upstreambug/TEMPLATE SSF_LANGLIST="cs da de es fr it mk nl pl pt_BR ro" # Allow to customize these variables if necessary if [ -f $HOME/.config/reportupstreamrc ] ; then echo "Sourcing local config" . $HOME/.config/reportupstreamrc fi # Check if the files and directories exist if [ ! -d $DCSBASE ]; then echo "Could not find the git repository directory for manpages-l10n under $DCSBASE" exit fi if [ ! -x $DIALOG ]; then echo "Could not find the the dialog program (or not executable) $DIALOG" exit fi if [ ! -x $SSF_MAILER ]; then echo "Could not find the the mail program (or not executable) $SSF_MAILER" exit fi if [ ! -x $SSF_BROWSER ]; then echo "Could not find the the mail program (or not executable) $SSF_BROWSER" exit fi if [ ! -d $SSF_TMP ]; then mkdir -p $SSF_TMP retval=$? if [ $retval != 0 ]; then echo "Dirctory for tempory files $SSF_TMP does not exist and cannot be created" exit fi fi echo "Please wait while scanning for FIXMEs …" cd $DCSBASE/po # Find all PO files with FIXME in them for pofile in $(find . -name "*.po" -exec grep FIXME "{}" -ls ";" | cut -d/ -f4 | grep -v -E "min-0..-occurences.po" | LC_ALL=C sort -u); do # Now look at them for each language for lang in $SSF_LANGLIST; do for checkfile in $(find $lang -name $pofile); do # echo $checkfile $lang $pofile grep FIXME $checkfile > $SSF_TMP/ssF.FIX.$lang.$pofile md5sum $SSF_TMP/ssF.FIX.$lang.$pofile | cut -d " " -f1 > $SSF_TMP/ssF.md5.$lang.$pofile done done mdnumtotal=$(cat $SSF_TMP/ssF.md5.*.$pofile| wc -l) mdunique=$(cat $SSF_TMP/ssF.md5.*.$pofile| sort -u | wc -l) # echo "Md5total: $mdnumtotal Md5unique: $mdunique" # if [ $mdnumtotal -ge 2 ] ; then #if [ $mdunique -eq 1 ] ; then if [ $mdnumtotal -ge 2 -a $mdunique -eq 1 ] ; then # echo "Blacklist-Kandidat $pofile" echo $pofile >> $SSF_TMP/ssF.BLACKLIST else echo $pofile >> $SSF_TMP/ssF.WHITELIST let cfcounter=0 cfilename="" for cfile in $CONFIGBASE/CONFIG.*; do #echo "grep -x $pofile $cfile" if [ $(grep -x $pofile $cfile) ] ; then let cfcounter=$cfcounter+1 finalfilename=$(basename $cfile) fi done if [ $cfcounter -eq 0 ] ; then echo "ERROR: $pofile not in any CONFIG file, please add and rerun the script" | logger -t $0 fi if [ $cfcounter -gt 1 ] ; then echo "ERROR: $pofile is in several ($cfcounter) CONFIG files, please fix them and rerun the script" | logger -t $0 fi if [ $cfcounter -eq 1 ] ; then echo $pofile >> $SSF_TMP/ssF.REPORT.$finalfilename fi fi done # The following line does not work, the first (largest) item is ignored?? #ls -lhS $SSF_TMP/ssF.REPORT.*| awk '{print $9}'|awk 'FS="." {print $4}' # This is not very elegant, but works around the issue of skipping the first entry echo "Dummy" > $SSF_TMP/ssF.list.Dummy ls -lhS $SSF_TMP/ssF.REPORT.*| awk '{print $9}' >> $SSF_TMP/ssF.list.Dummy ssf_ANZAHL=$(ls -l $SSF_TMP/ssF.REPORT.* |wc -l) ssf_STOP=0 while [ $ssf_STOP -eq 0 ]; do echo -n "$DIALOG --clear --title \"Reporting upstream\" --menu \"Choose which package to report for\" 20 71 $ssf_ANZAHL " > $SSF_TMP/ssf.menu for i in $(cat $SSF_TMP/ssF.list.Dummy|awk 'FS="." {print $4}'|grep -v -E "^$"); do ssF_date="not reported yet" if [ -f $CONFIGBASE/LAST.$i ]; then ssF_date=$(tail -n1 $CONFIGBASE/LAST.$i) fi echo "Entry: $i (Last reported: $ssF_date)" echo -n "\"$i\" \"$i (Last reported: $ssF_date)\" " >> $SSF_TMP/ssf.menu done chmod +x $SSF_TMP/ssf.menu bash $SSF_TMP/ssf.menu 2> $sk_temp retval=$? if [ $retval == 0 ]; then ssf_SELCTION=$(cat $sk_temp) echo $ssf_SELCTION bugtype=$(grep Bugtype $CONFIGBASE/CONFIG.$ssf_SELCTION) bfound=$? if [ $bfound == 0 ]; then bugmethod=$(echo $bugtype|cut -d" " -f2) bugaddres=$(echo $bugtype|cut -d" " -f3) bnote=$(grep Note: $CONFIGBASE/CONFIG.$ssf_SELCTION|sed 's/Note: //') echo "Reporting bugs for $ssf_SELCTION as $bugtype" echo "" echo "Please consider the following when reporting:" echo "$bnote" echo "" echo "Now the template is prepared with all FIXMEs. Please turn the template into" echo "proper text suitable for reporting. Remove duplications and FIXMEs coming" echo "from upstream." echo "" echo "Press Enter to generate the template" read echo "Please wait …" rm -rf $SSF_TMP/ssF.BUGTEMPLATE # This command does not work, it also replace double letters by single ones #cat $TEMPLATE_FILE | tr -s PACKAGE $ssf_SELCTION >> $SSF_TMP/ssF.BUGTEMPLATE cat $TEMPLATE_FILE >> $SSF_TMP/ssF.BUGTEMPLATE for rf in $(cat $SSF_TMP/ssF.REPORT.CONFIG.$ssf_SELCTION|sort -u); do find $DCSBASE -name $rf -exec msggrep -C -e FIXME -E "{}" ";" > $SSF_TMP/ssF.BUGTEMPLATE.tmp if [ -s $SSF_TMP/ssF.BUGTEMPLATE.tmp ]; then echo $rf >> $SSF_TMP/ssF.BUGTEMPLATE #find $DCSBASE -name $rf -exec msggrep -C -e FIXME -E "{}" ";" >> $SSF_TMP/ssF.BUGTEMPLATE cat $SSF_TMP/ssF.BUGTEMPLATE.tmp >> $SSF_TMP/ssF.BUGTEMPLATE echo "============== End of file ================" >> $SSF_TMP/ssF.BUGTEMPLATE fi done if [ $bugmethod == "email" ]; then $SSF_MAILER -s "Issues in man pages of $ssf_SELCTION" -i $SSF_TMP/ssF.BUGTEMPLATE $bugaddres elif [ $bugmethod == "web" ]; then $SSF_BROWSER $bugaddres vim $SSF_TMP/ssF.BUGTEMPLATE elif [ $bugmethod == "reportbug" ]; then # Use --header= instead of --body-file? # FIXME: Not interactive, not asking for confirmation # reportbug --no-debconf --no-config-files --no-query-bts --no-check-installed --no-bug-script --body-file=$SSF_TMP/ssF.BUGTEMPLATE # Try this: # reportbug --no-debconf --no-config-files --no-query-bts --no-check-installed --no-bug-script --print --body-file=$SSF_TMP/ssF.BUGTEMPLATE # For now, simply create the template manually echo "Package: $ssf_SELCTION" > $SSF_TMP/ssF.BUGTEMPLATEr echo "Severity: minor" >> $SSF_TMP/ssF.BUGTEMPLATEr echo "Tags: patch l10n" >> $SSF_TMP/ssF.BUGTEMPLATEr echo "X-Debbugs-CC: mario.blaettermann@gmail.com" $SSF_TMP/ssF.BUGTEMPLATEr echo "" >> $SSF_TMP/ssF.BUGTEMPLATEr cat $SSF_TMP/ssF.BUGTEMPLATE >> $SSF_TMP/ssF.BUGTEMPLATEr $SSF_MAILER -s "$ssf_SELCTION: Issues in man pages" -i $SSF_TMP/ssF.BUGTEMPLATEr submit@bugs.debian.org fi echo "If you reported the bugs, please answer yes to the following question." echo "" echo "Should the bug reporting date be recorded?" read -p "(y/n)> " if [ $REPLY == "y" ]; then if [ $CONFIGBASE/LAST.$ssf_SELCT ]; then date --rfc-3339=date >> $CONFIGBASE/LAST.$ssf_SELCTION git add $CONFIGBASE/LAST.$ssf_SELCTION else date --rfc-3339=date >> $CONFIGBASE/LAST.$ssf_SELCTION fi git commit -m "reportupstream: Reported bugs for $ssf_SELCTION" $CONFIGBASE/LAST.$ssf_SELCTION # echo "Writing date into $CONFIGBASE/LAST.$ssf_SELCTION" # date --rfc-3339=date # else # echo "Not recording date." fi # read else echo "Reporting bugs unkown, check $CONFIGBASE/CONFIG.$ssf_SELCTION for the field \"bugtype\"" read fi else ssf_STOP=1 fi done echo "Should the temporary directory $SSF_TMP be removed?" read -p "(y/n)> " if [ $REPLY == "y" ]; then rm -r $SSF_TMP retval=$? if [ $retval != 0 ]; then echo "Dirctory for tempory files $SSF_TMP could not be removed." exit fi fi clear # A10 is not enough :-(( #for i in $(cat $SSF_TMP/ssF.REPORT.CONFIG.linuxmanpages); do find . -name $i -exec grep -A10 FIXME "{}" ";" -print ; done