Blame bin/repo-font-audit

Packit 46375d
#!/bin/sh
Packit 46375d
# Quick and dirty script to audit font use in a yum package repository
Packit 46375d
#
Packit 46375d
# It is slow, it is ugly, and it requires a good network connection
Packit 46375d
Packit 46375d
# Function declarations
Packit 46375d
Packit 46375d
usage() {
Packit 46375d
cat >&2 << EOF_USAGE
Packit 46375d
Usage: $0 <id> <location>
Packit 46375d
<id>:       identifier of the package repository to check
Packit 46375d
<location>: location of the package repository to check
Packit 46375d
Packit 46375d
Examples:
Packit 46375d
$0 tmp /tmp/rpm
Packit 46375d
$0 tmp file://tmp/rpm
Packit 46375d
$0 rawhide http://example.com/mirrors/fedora.redhat.com/fedora/linux/development/x86_64/os/
Packit 46375d
Packit 46375d
EOF_USAGE
Packit 46375d
exit 1
Packit 46375d
}
Packit 46375d
Packit 46375d
DATADIR="$(dirname $0)/../private"
Packit 46375d
Packit 46375d
# Filenames with whitespace or & + makefile = !!!
Packit 46375d
bad_pattern="[[:space:]&\:]"
Packit 46375d
Packit 46375d
# Tools and humans make mistakes; try to fix some obvious ones
Packit 46375d
fix_url() {
Packit 46375d
sed 's=^file:\(\/*\)=/=' | sed 's=^\(ftp\|http\|https\):\(\/*\)=\1://='
Packit 46375d
}
Packit 46375d
Packit 46375d
pretty_indent() {
Packit 46375d
  fold -s -w $(($(tput cols) - 2)) \
Packit 46375d
  | while read line ; do echo "  $line" ; done
Packit 46375d
}
Packit 46375d
Packit 46375d
# $1 = CSV file to evaluate
Packit 46375d
tally() {
Packit 46375d
Packit 46375d
awk -F "|" '
Packit 46375d
  {
Packit 46375d
    filesize   += $17
Packit 46375d
    filenumber += 1
Packit 46375d
    rpmsz[$3 "-" $4 "." $5] = $6
Packit 46375d
    srpms[$2] = 1
Packit 46375d
  }
Packit 46375d
  END {
Packit 46375d
    for (rpm in rpmsz) {
Packit 46375d
      rpmsize   += rpmsz[rpm]
Packit 46375d
      rpmnumber +=1
Packit 46375d
    }
Packit 46375d
    for (srpm in srpms) {
Packit 46375d
      srpmnumber +=1
Packit 46375d
    }
Packit 46375d
    rpmsize  = rpmsize  / (1024*1024)
Packit 46375d
    filesize = filesize / (1024*1024)
Packit 46375d
    print filenumber "|" rpmnumber "|" srpmnumber "|" filesize "|" rpmsize
Packit 46375d
  }' "$1"
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
summary() {
Packit 46375d
if [ $(cat "$1" | wc -l) -gt 0 ] ; then
Packit 46375d
  tally "$1" | awk -F '|' '{ print "⇒ " $1 " file(s) (" $4 " MiB) in " $2 \
Packit 46375d
        " package(s) (" $5 " MiB) generated from " $3 " source package(s)." }'\
Packit 46375d
        | pretty_indent
Packit 46375d
else
Packit 46375d
  echo "⇒  None!" | pretty_indent
Packit 46375d
fi
Packit 46375d
echo ""
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
# $1 = summary file
Packit 46375d
# $2 = temporary data file
Packit 46375d
# $3 = test id
Packit 46375d
complete_csv_summary() {
Packit 46375d
  awk -F '|' -v t_datafile="$2" -v testlabel="$3" \
Packit 46375d
      'FILENAME==t_datafile { fail[$1"|"$2"|"$3"|"$4"|"$5"|"$10] = 1 }
Packit 46375d
       FILENAME!=t_datafile && FNR==1 {
Packit 46375d
        max = NF + 1
Packit 46375d
        header = $1
Packit 46375d
        for (i = 2 ; i <= max ; i++) {
Packit 46375d
           header = header "|" $i
Packit 46375d
         }
Packit 46375d
        print header testlabel
Packit 46375d
       }
Packit 46375d
       FILENAME!=t_datafile && FNR>1 {
Packit 46375d
         line = $1 "|" $2 "|" $3 "|" $4 "|" $5 "|" $6
Packit 46375d
         newline = $1
Packit 46375d
         for (i = 2 ; i <= max ; i++) {
Packit 46375d
           newline = newline "|" $i
Packit 46375d
         }
Packit 46375d
         print newline fail[line]
Packit 46375d
         processed[line] = 1
Packit 46375d
       }
Packit 46375d
       END {
Packit 46375d
         for ( line in fail ) {
Packit 46375d
           if ( ! processed[line] ) {
Packit 46375d
             newline = line
Packit 46375d
             for (i = 7 ; i <= max ; i++) {
Packit 46375d
               newline = newline "|"
Packit 46375d
             }
Packit 46375d
             print newline fail[line]
Packit 46375d
           }
Packit 46375d
         }
Packit 46375d
       }' "$2" "$1" > tmp/tmp.ccs.csv
Packit 46375d
  awk 'FNR==1' tmp/tmp.ccs.csv > "$1"
Packit 46375d
  awk 'FNR>1'  tmp/tmp.ccs.csv | sort -f -t '|' >> "$1"
Packit 46375d
  rm tmp/tmp.ccs.csv
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
substats() {
Packit 46375d
ss_datafile="$1"
Packit 46375d
Packit 46375d
awk -F '|' '{ print $NF }' "$ss_datafile" | sort | uniq \
Packit 46375d
  | while read key ; do
Packit 46375d
    echo -n "$key|"
Packit 46375d
    awk -F '|' -v key="$key" '$NF==key' "$ss_datafile" > tmp/tmp.ss.csv
Packit 46375d
    tally tmp/tmp.ss.csv
Packit 46375d
    rm tmp/tmp.ss.csv
Packit 46375d
  done
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
# $1 = CSV file to sum_up
Packit 46375d
stats() {
Packit 46375d
s_datafile="$1"
Packit 46375d
Packit 46375d
summary "$s_datafile"
Packit 46375d
Packit 46375d
if [ $(cat "$s_datafile" | wc -l) -gt 0 ] ; then
Packit 46375d
  (echo "Format|Files|rpm|srpm|Files (MiB)|rpm (MiB)"
Packit 46375d
  awk -F '|' '$13 != "" { print $0 "|" $15 }' "$s_datafile" > tmp/tmp.s.csv
Packit 46375d
  substats tmp/tmp.s.csv) | column -t -s '|' | pretty_indent
Packit 46375d
  echo ""
Packit 46375d
Packit 46375d
  (echo "Arch|Files|rpm|srpm|Files (MiB)|rpm (MiB)"
Packit 46375d
  awk -F '|' '{ print $0 "|" $5 }' "$s_datafile" > tmp/tmp.s.csv
Packit 46375d
  substats tmp/tmp.s.csv)| column -t -s '|' | pretty_indent
Packit 46375d
  echo ""
Packit 46375d
Packit 46375d
  rm tmp/tmp.s.csv
Packit 46375d
fi
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
# $1 = CSV file to sum_up
Packit 46375d
list_rpm() {
Packit 46375d
Packit 46375d
[ $(cat "$1" | wc -l) -gt 0 ] && \
Packit 46375d
awk -F '|' '
Packit 46375d
  {
Packit 46375d
    rpm = $3
Packit 46375d
    if ( $7 == "M" ) { rpm = "[" rpm "]" }
Packit 46375d
    total[rpm] += 1
Packit 46375d
  }
Packit 46375d
  END {
Packit 46375d
    n = asorti(total, sorted)
Packit 46375d
    for ( i = 1 ; i <= n ; i++ ) {
Packit 46375d
      line = line sorted[i] "(" total[sorted[i]] "), "
Packit 46375d
    }
Packit 46375d
    sub(", $","",line)
Packit 46375d
    print line
Packit 46375d
  }' "$1" | pretty_indent
Packit 46375d
Packit 46375d
}
Packit 46375d
Packit 46375d
# Pipe CSV file to sum_up
Packit 46375d
# It is assumed to be of the form
Packit 46375d
# rpm | pattern to match | pattern to display
Packit 46375d
# patterns may include # as separators
Packit 46375d
enum_rpm() {
Packit 46375d
awk -F '|' '
Packit 46375d
  BEGIN { print "" }
Packit 46375d
  {
Packit 46375d
    rpm = $1
Packit 46375d
    key = $2
Packit 46375d
    pat = $3
Packit 46375d
    files[key] = files[key] pat "#" rpm "|"
Packit 46375d
  }
Packit 46375d
  END {
Packit 46375d
    for (key in files) {
Packit 46375d
      sub("\\|$", "", files[key])
Packit 46375d
      total = split(files[key], lines,"|")
Packit 46375d
      pb[total] = pb[total] key "|"
Packit 46375d
    }
Packit 46375d
    n = asorti(pb, sorted)
Packit 46375d
    for (i = n; i >= 1; i--) {
Packit 46375d
      total = sorted[i]
Packit 46375d
      sub("\\|$", "", pb[total])
Packit 46375d
      split(pb[total], keys,"|")
Packit 46375d
      nk = asort(keys, sortedkeys)
Packit 46375d
      for ( k = 1 ; k <= nk ; k++ ) {
Packit 46375d
        key = sortedkeys[k]
Packit 46375d
        print gensub("#", ", ", "g", key)
Packit 46375d
        split(files[key], lines, "|")
Packit 46375d
        nl = asort(lines, sortedlines)
Packit 46375d
        for ( l = 1 ; l <= nl ; l++ ) {
Packit 46375d
          print "  " gensub("#", "\t", "G", lines[l])
Packit 46375d
        }
Packit 46375d
        print ""
Packit 46375d
      }
Packit 46375d
    }
Packit 46375d
  }' | pretty_indent
Packit 46375d
}
Packit 46375d
Packit 46375d
# $1 = this test id
Packit 46375d
# $2 = csv file with the results of this test
Packit 46375d
# $3 = csv file that consolidates the results of all tests
Packit 46375d
test_wrapup() {
Packit 46375d
Packit 46375d
complete_csv_summary "$3" "$2" "$1"
Packit 46375d
summary "$2"
Packit 46375d
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
# $1 = csv file with test results
Packit 46375d
test_score() {
Packit 46375d
if [ $(cat "$1" | wc -l) -gt 1 ] ; then
Packit 46375d
  awk -F '|' '
Packit 46375d
    BEGIN {
Packit 46375d
      lh=7
Packit 46375d
      headerline = "P#"
Packit 46375d
    }
Packit 46375d
    FNR==1 {
Packit 46375d
      max = NF
Packit 46375d
    }
Packit 46375d
    FNR>1 {
Packit 46375d
      id = ""
Packit 46375d
      for (i = 1 ; i < (lh-1) ; i++) {
Packit 46375d
        if ($i != "") id = id $i "|"
Packit 46375d
        else          id = id   " |"
Packit 46375d
      }
Packit 46375d
      sub("\\|$","",id)
Packit 46375d
      fail[id] = 1
Packit 46375d
      for (i = lh ; i <= max ; i++) {
Packit 46375d
        score[id"|"i] = score[id"|"i] + $i
Packit 46375d
        totalscore[i] = totalscore[i] + $i
Packit 46375d
      }
Packit 46375d
    }
Packit 46375d
    END {
Packit 46375d
      for (i = lh ; i <= max ; i++) {
Packit 46375d
          if ( totalscore[i] ) { headerline  = headerline "|" "t" i+1-lh }
Packit 46375d
        }
Packit 46375d
      print headerline
Packit 46375d
      n = asorti(fail)
Packit 46375d
      for (l = 1; l <= n; l++) {
Packit 46375d
        newline = l
Packit 46375d
        for (c = lh ; c <= max ; c++) {
Packit 46375d
          if ( totalscore[c] ) {
Packit 46375d
            if ( score[fail[l]"|"c] )
Packit 46375d
              { newline = newline "|" score[fail[l]"|"c] }
Packit 46375d
            else
Packit 46375d
              { newline = newline "|‧" }
Packit 46375d
          }
Packit 46375d
        }
Packit 46375d
        print newline
Packit 46375d
      }
Packit 46375d
      totalline = "Total"
Packit 46375d
      for (i = lh ; i <= max ; i++) {
Packit 46375d
        if ( totalscore[i] ) { totalline = totalline "|"  totalscore[i] }
Packit 46375d
      }
Packit 46375d
      print totalline
Packit 46375d
    }' "$1" | column -t -s '|'
Packit 46375d
Packit 46375d
  echo ""
Packit 46375d
Packit 46375d
  awk -F '|' '
Packit 46375d
    BEGIN { lh=7 }
Packit 46375d
    FNR>1 {
Packit 46375d
      id = ""
Packit 46375d
      for (i = 1 ; i < (lh-1) ; i++) {
Packit 46375d
        if ($i != "") id = id $i "|"
Packit 46375d
        else          id = id   " |"
Packit 46375d
      }
Packit 46375d
      sub("\\|$","",id)
Packit 46375d
      fail[id] = 1
Packit 46375d
    }
Packit 46375d
    END {
Packit 46375d
      print "P#|Maintainer|SRPM|RPM|EVR|Arch"
Packit 46375d
      n = asorti(fail)
Packit 46375d
      for (l = 1; l <= n; l++) {
Packit 46375d
      print l "|" fail[l]
Packit 46375d
      }
Packit 46375d
    }' "$1" | column -t -s '|'
Packit 46375d
Packit 46375d
  echo ""
Packit 46375d
  echo "Test explanation:"
Packit 46375d
  echo ""
Packit 46375d
Packit 46375d
  awk -F '|' '
Packit 46375d
    BEGIN { lh = 7 }
Packit 46375d
    FNR==1 {
Packit 46375d
      max = NF
Packit 46375d
      for (i = lh ; i <= max ; i++) {
Packit 46375d
        legend[i] = i+1-lh "|" $i }
Packit 46375d
      }
Packit 46375d
    FNR>1 {
Packit 46375d
      for (i = lh ; i <= max ; i++) {
Packit 46375d
        totalscore[i] = totalscore[i] + $i
Packit 46375d
      }
Packit 46375d
    }
Packit 46375d
    END {
Packit 46375d
      for (i = lh ; i <= max ; i++) {
Packit 46375d
        if ( totalscore[i] ) { print legend[i] }
Packit 46375d
      }
Packit 46375d
    }' "$1" | while read line ; do
Packit 46375d
      testnumber=$(echo $line | awk -F '|' '{ print "t"$1 }')
Packit 46375d
      testid=$(echo $line | awk -F '|' '{ print $2 }')
Packit 46375d
      echo -n "$testnumber. "
Packit 46375d
      "$DATADIR/test-info" $testid title
Packit 46375d
      echo ""
Packit 46375d
      ( "$DATADIR/test-info" $testid help ) | pretty_indent
Packit 46375d
    done
Packit 46375d
Packit 46375d
else
Packit 46375d
  echo "⇒  None!"
Packit 46375d
fi
Packit 46375d
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
collect() {
Packit 46375d
start_time=$(date "+%s")
Packit 46375d
Packit 46375d
# This is very ugly but the safest syntax to use with any repoquery version
Packit 46375d
FREPOURL=$(echo "$REPOURL" | sed 's=^/=file:///=')
Packit 46375d
Packit 46375d
echo "Looking for packages:"
Packit 46375d
echo "— with font metadata…"
Packit 46375d
repoquery --repofrompath=$REPOID,$FREPOURL --repoid=$REPOID \
Packit 46375d
          --qf "%{sourcerpm}|%{name}|%{epoch}:%{version}-%{release}|%{arch}|%{packagesize}|M" \
Packit 46375d
          --whatprovides "font(*)" --quiet \
Packit 46375d
          | sort | uniq \
Packit 46375d
          | sed 's=^\([^|]\+\?\)\-\([^-|]\+\?\)\-\([^-|]\+\?\)|=\1|=g' \
Packit 46375d
          > "$FPL"
Packit 46375d
Packit 46375d
echo "— that include files with common font extensions…"
Packit 46375d
repoquery --repofrompath=$REPOID,$FREPOURL --repoid=$REPOID \
Packit 46375d
          --qf "%{sourcerpm}|%{name}|%{epoch}:%{version}-%{release}|%{arch}|%{packagesize}|E" \
Packit 46375d
          -f '*.ttf' -f '*.otf' -f '*.ttc' \
Packit 46375d
          -f '*.pfb' -f '*.pfa' \
Packit 46375d
          -f '*.pcf.gz' -f '*.pcf' -f '*.bdf' --quiet \
Packit 46375d
          | sort | uniq \
Packit 46375d
          | sed 's=^\([^|]\+\?\)\-\([^-|]\+\?\)\-\([^-|]\+\?\)|=\1|=g' \
Packit 46375d
          > "$PWFL"
Packit 46375d
Packit 46375d
echo "— that use the core X11 protocol…"
Packit 46375d
repoquery --repofrompath=$REPOID,$FREPOURL --repoid=$REPOID \
Packit 46375d
          --qf "%{sourcerpm}|%{name}|%{epoch}:%{version}-%{release}|%{arch}|%{packagesize}|X" \
Packit 46375d
          --whatrequires 'libX11.so*' \
Packit 46375d
          | sort | uniq \
Packit 46375d
          | sed 's=^\([^|]\+\?\)\-\([^-|]\+\?\)\-\([^-|]\+\?\)|=\1|=g' \
Packit 46375d
          > "$XPL"
Packit 46375d
Packit 46375d
if [ $(cat "$FPL" "$PWFL" "$XPL" | wc -l) -eq 0 ] ; then
Packit 46375d
  echo "Nothing to do!"
Packit 46375d
  exit
Packit 46375d
fi
Packit 46375d
Packit 46375d
cat "$FPL" "$PWFL" "$XPL" \
Packit 46375d
  | awk -F '|' '
Packit 46375d
      { tag[$1 "|" $2 "|" $3 "|" $4 "|" $5] = tag[$1 "|" $2 "|" $3 "|" $4 "|" $5] $6 "," }
Packit 46375d
      END {
Packit 46375d
        n =  asorti(tag,rpm)
Packit 46375d
        for (l = 1; l <= n; l++) {
Packit 46375d
          sub(",$", "", tag[rpm[l]])
Packit 46375d
          print rpm[l] "|" tag[rpm[l]]
Packit 46375d
        }
Packit 46375d
      }' > "tmp/$FL.1"
Packit 46375d
Packit 46375d
echo ""
Packit 46375d
echo "Inspecting packages:"
Packit 46375d
cd "tmp"
Packit 46375d
rm -f "$FL.2"
Packit 46375d
Packit 46375d
cat "$FL.1" | while read line ; do
Packit 46375d
  rpm=$(echo "$line" | awk -F '|' '{ print $2 "-" $3 "." $4 }')
Packit 46375d
  rpmline=$(echo "$line" | awk -F '|' '{ print $1 "|" $2 "|" $3 "|" $4 "|" $5 }')
Packit 46375d
  rpmd=$(echo "$rpm" | sed "s+$bad_pattern+_+g")
Packit 46375d
  echo "$line" | cut -d "|" -f 6 | grep -q "M" && metadata="M" || metadata=""
Packit 46375d
  echo -n "– $rpm ◔"
Packit 46375d
  mkdir "$rpmd"
Packit 46375d
  cd "$rpmd"
Packit 46375d
  rpm_loc=$(repoquery --repofrompath=$REPOID,$REPOURL --repoid=$REPOID \
Packit 46375d
                      --location "$rpm" 2>/dev/null \
Packit 46375d
              | fix_url)
Packit 46375d
  if $(echo "$rpm_loc" | grep -q -e '^[\./~]') ; then
Packit 46375d
    ln -s "$rpm_loc" .
Packit 46375d
  else
Packit 46375d
    curl -O --silent --show-error --retry 3 --connect-timeout 10 --retry-delay 15 --url "$rpm_loc"
Packit 46375d
  fi
Packit 46375d
  echo -ne "\b◑"
Packit 46375d
  rpm2cpio *.rpm > "$rpm.cpio"
Packit 46375d
  echo -ne "\b◕"
Packit 46375d
  cat "$rpm.cpio" | cpio --quiet -it > "$rpm.lst"
Packit 46375d
  nofont_score=$(cat "$rpm.lst" | sed 's=^\./=/=g' \
Packit 46375d
    | grep -viE -e "^/usr/share/fonts" \
Packit 46375d
                -e "^/usr/share/fontconfig/conf.avail/" \
Packit 46375d
                -e "^/etc/fonts/conf.d/" \
Packit 46375d
                -e "^/usr/share/doc/" \
Packit 46375d
                -e "^/etc/X11/fontpath.d/" \
Packit 46375d
                -e '\.((ttf)|(ttc)|(otf)|(pfa)|(pfb)|(bdf)|(pcf)|(pcf\.gz))$' \
Packit 46375d
    | wc -l)
Packit 46375d
  echo "$rpmline|$metadata|$nofont_score" > rpm-info.txt
Packit 46375d
  if $(echo $line | cut -d "|" -f 6 | grep -q "E") ; then
Packit 46375d
    cat "$rpm.lst" \
Packit 46375d
      | grep -iE '\.((ttf)|(ttc)|(otf)|(pfa)|(pfb)|(bdf)|(pcf)|(pcf\.gz))$' \
Packit 46375d
      | sort > "$rpm.fonts.lst"
Packit 46375d
  fi
Packit 46375d
  if $(echo $line | cut -d "|" -f 6 | grep -q "X") ; then
Packit 46375d
    cat "$rpm.lst" \
Packit 46375d
      | grep -i  -e "^./sbin/" \
Packit 46375d
                 -e "^./usr/sbin/" \
Packit 46375d
                 -e "^./usr/kerberos/sbin" \
Packit 46375d
                 -e "^./bin/" \
Packit 46375d
                 -e "^./usr/bin/" \
Packit 46375d
                 -e "^./usr/kerberos/bin/" \
Packit 46375d
                 -e "^./lib.*/" \
Packit 46375d
                 -e "^./usr/lib.*/" \
Packit 46375d
                 -e "^./opt/" \
Packit 46375d
                 -e "^./usr/X11R6/" \
Packit 46375d
                 -e "^./usr/games/" \
Packit 46375d
                 -e "^./usr/local/" \
Packit 46375d
      | grep -vi -e "^./usr/bin/dmxwininfo" \
Packit 46375d
                 -e "^./usr/bin/Xdmx" \
Packit 46375d
                 -e "^./usr/bin/xfontsel" \
Packit 46375d
                 -e "^./usr/bin/xlsfonts" \
Packit 46375d
                 -e "^./usr/bin/Xnest" \
Packit 46375d
                 -e "^./usr/bin/xprop" \
Packit 46375d
                 -e "^./usr/bin/xsetroot" \
Packit 46375d
                 -e "^./usr/bin/xwininfo" \
Packit 46375d
                 -e "^./usr/bin/x11vnc" \
Packit 46375d
                 -e "^./usr/bin/x2vnc" \
Packit 46375d
                 -e "^./usr/lib.*/libXcursor.so" \
Packit 46375d
      | sort > "$rpm.bin.lst"
Packit 46375d
  fi
Packit 46375d
  touch "$rpm.fonts.lst" "$rpm.bin.lst"
Packit 46375d
  cat "$rpm.fonts.lst" "$rpm.bin.lst"  | sort | uniq > "$rpm.files.lst"
Packit 46375d
  mkdir src
Packit 46375d
  cd src
Packit 46375d
  cpio -idm --quiet -E "../$rpm.files.lst" < "../$rpm.cpio"
Packit 46375d
  cd ..
Packit 46375d
  rm "$rpm.cpio"
Packit 46375d
  echo -ne "\b● "
Packit 46375d
  sed 's=^\./==g' "$rpm.fonts.lst" \
Packit 46375d
    | while read file; do
Packit 46375d
    unset target
Packit 46375d
    type=$(file -bzh "src/$file")
Packit 46375d
    case $(echo "$type" | sed 's+ (\(.*\)++g' \
Packit 46375d
                             | sed 's+ `\(.*\)++g' \
Packit 46375d
                             | sed 's+,\(.*\)++g' \
Packit 46375d
                             | sed 's+\( \)*$++g' ) in
Packit 46375d
      "TrueType font data")
Packit 46375d
        echo -n "t"
Packit 46375d
        ;;
Packit 46375d
      "TrueType font collection data")
Packit 46375d
        echo -n "T"
Packit 46375d
        ;;
Packit 46375d
      "OpenType font data")
Packit 46375d
        echo -n "o"
Packit 46375d
        ;;
Packit 46375d
      "X11 Portable Compiled Font data")
Packit 46375d
        echo -n "b"
Packit 46375d
        ;;
Packit 46375d
      "X11 BDF font text")
Packit 46375d
        echo -n "B"
Packit 46375d
        ;;
Packit 46375d
      # PostScript files are a mess
Packit 46375d
      "PostScript Type 1 font text")
Packit 46375d
        echo -n "P"
Packit 46375d
        ;;
Packit 46375d
      "PostScript Type 1 font program data")
Packit 46375d
        echo -n "p"
Packit 46375d
        ;;
Packit 46375d
      "PostScript document text conforming DSC level 3.0")
Packit 46375d
        type="ignored"
Packit 46375d
        echo -n "-"
Packit 46375d
        ;;
Packit 46375d
      "PostScript document text"|"8086 relocatable")
Packit 46375d
        echo -n "!" >&2
Packit 46375d
        ;;
Packit 46375d
      "symbolic link to"|"broken symbolic link to")
Packit 46375d
        target=$(readlink -m "src/$file" | sed "s+^$PWD/src++g")
Packit 46375d
        if $(echo "$target" | grep -q "^/usr/share/fonts") ; then
Packit 46375d
          type="Link"
Packit 46375d
          echo -n "l"
Packit 46375d
        else
Packit 46375d
          type="ignored"
Packit 46375d
          echo -n "-"
Packit 46375d
        fi
Packit 46375d
        ;;
Packit 46375d
      *)
Packit 46375d
        echo -n "?"
Packit 46375d
        ;;
Packit 46375d
    esac
Packit 46375d
    if [ "$type" != "ignored" -a ! -h "src/$file" ] ; then
Packit 46375d
       mkdir -p $(dirname "tmp/$file")
Packit 46375d
       echo "/$file|$type" > "tmp/$file.rfo.fonts.info"
Packit 46375d
       if [ "$type" != "TrueType font data" -a \
Packit 46375d
            "$type" != "OpenType font data" ] ; then
Packit 46375d
         touch "tmp/$file.rfo.unicover"
Packit 46375d
       fi
Packit 46375d
    fi
Packit 46375d
    if [ "$type" = "Link" ] ; then
Packit 46375d
      echo "/$file|$target" >> font-links.txt
Packit 46375d
    fi
Packit 46375d
  done
Packit 46375d
Packit 46375d
  sed 's=^\./==g' "$rpm.bin.lst" \
Packit 46375d
    | while read file ; do
Packit 46375d
    type=$(file -bzh "src/$file")
Packit 46375d
    if $(echo "$type" | grep -q -e '^ELF ' -e ' ELF ') ; then
Packit 46375d
      echo -n "‧"
Packit 46375d
      mkdir -p $(dirname "tmp/$file")
Packit 46375d
      echo "/$file|$type" > "tmp/$file.rfo.core-fonts.info"
Packit 46375d
    fi
Packit 46375d
  done
Packit 46375d
Packit 46375d
  echo ""
Packit 46375d
  cd ..
Packit 46375d
done
Packit 46375d
Packit 46375d
echo ""
Packit 46375d
echo "Analysing files…"
Packit 46375d
Packit 46375d
find . -type d | grep "$bad_pattern" \
Packit 46375d
  | while read dir ; do
Packit 46375d
      mkdir -p $(echo "$dir" | sed "s+$bad_pattern+_+g")
Packit 46375d
    done
Packit 46375d
Packit 46375d
find . -type f | grep "$bad_pattern" \
Packit 46375d
  | while read file ; do
Packit 46375d
      mv "$file" $(echo "$file"| sed "s+$bad_pattern+_+g")
Packit 46375d
    done
Packit 46375d
Packit 46375d
# There must be a cleaner way to do this
Packit 46375d
parallelism=$(($(cat /proc/cpuinfo | grep processor | wc -l)+1))
Packit 46375d
make -s -r -j $parallelism -f "$DATADIR/repo-font-audit.mk"
Packit 46375d
Packit 46375d
find .  -name "*\.rfo\.fonts" \
Packit 46375d
     -o -name "*\.rfo\.core-fonts" \
Packit 46375d
     -o -name processed-font-links.txt \
Packit 46375d
  | while read datafile ; do
Packit 46375d
      cat "$datafile" >> "$FL.2"
Packit 46375d
    done
Packit 46375d
Packit 46375d
mkdir ../data
Packit 46375d
for rpmlint in */rpmlint.txt ; do
Packit 46375d
  mkdir "../data/$(dirname $rpmlint)"
Packit 46375d
  mv "$rpmlint" "../data/$rpmlint"
Packit 46375d
done
Packit 46375d
Packit 46375d
for ext in fontlint unicover fc-query ; do
Packit 46375d
  find . -name "*\.rfo\.$ext" \
Packit 46375d
     | while read file ; do
Packit 46375d
          dest=$(echo "$file" \
Packit 46375d
            | sed "s+./\([^/]*\)/tmp/\(.*\).rfo.$ext+\1|\2.$ext.txt+" \
Packit 46375d
            | sed 's+/+_+g' | sed 's+|+/+g')
Packit 46375d
          [ -s "$file" ] && mv "$file" "../data/$dest"
Packit 46375d
       done
Packit 46375d
done
Packit 46375d
Packit 46375d
rm -fr "*/"
Packit 46375d
echo " ♻"
Packit 46375d
cd ..
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
consolidate() {
Packit 46375d
echo ""
Packit 46375d
echo "Consolidating data…"
Packit 46375d
Packit 46375d
echo "Maintainer|SRPM|RPM|EVR|Arch|RPM size|RPM metadata|foreign data|\
Packit 46375d
rpmlint score|filename|family name|face name|fixed family name|\
Packit 46375d
fixed face name|format (fontconfig)|format (libmagic)|file size|checksum|\
Packit 46375d
partial scripts|partial blocks|fontlint|symlink target|symlink provider|\
Packit 46375d
core fonts use" > "$FL"
Packit 46375d
Packit 46375d
if  [ -s "tmp/$FL.2" -a -r "tmp/$FL.2" ] ; then
Packit 46375d
Packit 46375d
  # FIXME: make this distro-agnostic
Packit 46375d
  cut -d "|" -f 1 "tmp/$FL.2" | sort | uniq \
Packit 46375d
    | /usr/bin/fedoradev-pkgowners 2>/dev/null \
Packit 46375d
    | sed 's+ +|+g' \
Packit 46375d
    | awk -F "|" -v file="tmp/$FL.2" '
Packit 46375d
        { owner[$2]=$1 }
Packit 46375d
        END {
Packit 46375d
          while ((getline < file) > 0) {
Packit 46375d
            print owner[$1] "|" $0
Packit 46375d
          }
Packit 46375d
        }' | sort -df -t "|" -k 1 -k 2 -k 3 > "tmp/$FL.3"
Packit 46375d
Packit 46375d
  awk -F "|" '
Packit 46375d
    ($16 != "Link") { source[$10] = $3 "-" $4
Packit 46375d
                      out[$0] = $0 "|" }
Packit 46375d
    ($16 == "Link") { link[$0] = $22 }
Packit 46375d
    END {
Packit 46375d
      for (line in link) {
Packit 46375d
        out[line] = line "|" source[link[line]]
Packit 46375d
      }
Packit 46375d
      n = asort(out)
Packit 46375d
      for (i = 1; i <= n; i++) print out[i]
Packit 46375d
    }' "tmp/$FL.3" > "tmp/$FL.4"
Packit 46375d
Packit 46375d
  cat "tmp/$FL.4" \
Packit 46375d
    | sort -df -t "|" -k 1 -k 2 -k 3 -k 4n -k 13 -k 14 -k 10 \
Packit 46375d
    | sed 's=$=|=g' | sed 's=|0|=||=g' | sed 's=|0|=||=g' | sed 's=|\+$==g' \
Packit 46375d
    >> "$FL"
Packit 46375d
Packit 46375d
fi
Packit 46375d
Packit 46375d
echo "Maintainer|SRPM|RPM|EVR|Arch|File" > "$TSUM"
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
analyse() {
Packit 46375d
Packit 46375d
echo ""
Packit 46375d
echo "Conducting tests:"
Packit 46375d
echo ""
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" outside-usr-share-fonts title }
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($16 != "Link") && ($24!="X") && \
Packit 46375d
            ($10 !~ /^\/usr\/share\/fonts\//)' "$FL" \
Packit 46375d
  | sort -df -t "|" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup outside-usr-share-fonts tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" without-rpm-metadata title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($16 != "Link") && ($24!="X") && \
Packit 46375d
            ($7 != "M")' "$FL" \
Packit 46375d
  | sort -df -t "|" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup without-rpm-metadata tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" family-mixing title
Packit 46375d
Packit 46375d
awk -F '|' '
Packit 46375d
  (NR > 1) && ($11 != "") {
Packit 46375d
    rpm = $3 "-" $4 "." $5
Packit 46375d
    files[rpm] = files[rpm] $0 "#"
Packit 46375d
    if ( ! family[rpm] ) {
Packit 46375d
      family[rpm] = $11
Packit 46375d
    }
Packit 46375d
    else {
Packit 46375d
      if (family[rpm] != $11) {
Packit 46375d
        mixed[rpm] = 1
Packit 46375d
      }
Packit 46375d
    }
Packit 46375d
  }
Packit 46375d
  END {
Packit 46375d
    for (rpm in mixed) {
Packit 46375d
      sub("#$", "", files[rpm])
Packit 46375d
      split(files[rpm], lines,"#")
Packit 46375d
      for (l in lines) {
Packit 46375d
        print lines[l]
Packit 46375d
      }
Packit 46375d
    }
Packit 46375d
  }' "$FL" \
Packit 46375d
  | sort -df -t "|" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup family-mixing tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" duplicated-file title
Packit 46375d
Packit 46375d
awk -F '|' '
Packit 46375d
  (NR > 1) && ($24 != "X") && ($16 != "Link") {
Packit 46375d
    files[$18] = files[$18] $0 "#"
Packit 46375d
  }
Packit 46375d
  END {
Packit 46375d
    for (checksum in files) {
Packit 46375d
      sub("#$", "", files[checksum])
Packit 46375d
      count = split(files[checksum], lines,"#")
Packit 46375d
      if (count > 1) {
Packit 46375d
        for (l in lines) {
Packit 46375d
          print lines[l]
Packit 46375d
        }
Packit 46375d
      }
Packit 46375d
    }
Packit 46375d
  }' "$FL" \
Packit 46375d
  | sort -g -t "|" -k 18 > tmp/tmp.csv
Packit 46375d
Packit 46375d
[ $(cat tmp/tmp.csv | wc -l) -gt 0 ] && \
Packit 46375d
awk -F '|' '
Packit 46375d
  {
Packit 46375d
    rpm = $3
Packit 46375d
    if ( $7 == "M" ) { rpm = "[" rpm "]" }
Packit 46375d
    sub(".*/", "", $10)
Packit 46375d
    if ( $11 != "" ) { sig = $11 }
Packit 46375d
    if ( $12 != "") {
Packit 46375d
      if ( sig != "" ) { sig = sig ", " }
Packit 46375d
      sig = sig $12
Packit 46375d
    }
Packit 46375d
    if ( sig != "" ) { sig = "#(" sig ")" }
Packit 46375d
    print rpm "|" $18 "|" $10 sig
Packit 46375d
  }' tmp/tmp.csv | enum_rpm
Packit 46375d
Packit 46375d
test_wrapup duplicated-file tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" duplicated-face-ext title
Packit 46375d
Packit 46375d
awk -F '|' '
Packit 46375d
  (NR > 1) && ($11 != "") && ($12 != "") {
Packit 46375d
    face = $11 "|" $12
Packit 46375d
    rpm  = $3  "-" $4 "." $5
Packit 46375d
    files[face] = files[face] $0 "#"
Packit 46375d
    if ( ! loc[face] ) { loc[face] = rpm }
Packit 46375d
    else {
Packit 46375d
      if (loc[face] != rpm) {
Packit 46375d
        duplicated[face] = 1
Packit 46375d
      }
Packit 46375d
    }
Packit 46375d
  }
Packit 46375d
  END {
Packit 46375d
    for (face in duplicated) {
Packit 46375d
      sub("#$", "", files[face])
Packit 46375d
      split(files[face], lines,"#")
Packit 46375d
      for (l in lines) {
Packit 46375d
        print lines[l]
Packit 46375d
      }
Packit 46375d
    }
Packit 46375d
  }' "$FL" \
Packit 46375d
  | sort -df -t "|" -k 11 -k 12 > tmp/tmp.csv
Packit 46375d
Packit 46375d
[ $(cat tmp/tmp.csv | wc -l) -gt 0 ] && \
Packit 46375d
awk -F '|' '
Packit 46375d
  {
Packit 46375d
    rpm = $3
Packit 46375d
    if ( $7 == "M" ) { rpm = "[" rpm "]" }
Packit 46375d
    sub(".*/", "", $10)
Packit 46375d
    print rpm "|" $11 ", " $12 "|" $10
Packit 46375d
  }' tmp/tmp.csv | enum_rpm
Packit 46375d
Packit 46375d
test_wrapup duplicated-face-ext tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" fc-query title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($16 != "Link") && ($24!="X") && \
Packit 46375d
            ($15 == "")' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup fc-query tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" libmagic title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($16 != "Link") && ($24!="X") && \
Packit 46375d
            (tolower(" " $16 " ") !~ / font /)' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup libmagic tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" broken-symlink title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($16 == "Link") && ($23 == "")' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
[ $(cat tmp/tmp.csv | wc -l) -gt 0 ] && \
Packit 46375d
awk -F '|' '
Packit 46375d
  {
Packit 46375d
    rpm = $3
Packit 46375d
    if ( $7 == "M" ) { rpm = "[" rpm "]" }
Packit 46375d
    sub(".*/", "", $10)
Packit 46375d
    print rpm "|" $10 " ↛ " $22
Packit 46375d
  }' tmp/tmp.csv | enum_rpm
Packit 46375d
Packit 46375d
test_wrapup broken-symlink tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" rpmlint title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($16 != "Link") && ($24 != "X") && \
Packit 46375d
            ($9 != "")' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup rpmlint tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" mixed-with-non-font-data title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($16 != "Link") && ($24 != "X") && \
Packit 46375d
            ($8 != "")' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup mixed-with-non-font-data tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" arch-package title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($16 != "Link") && ($24 != "X") && \
Packit 46375d
            ($5 != "noarch")' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup arch-package tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" bad-rpm-naming title
Packit 46375d
Packit 46375d
awk -F "|" '(NR > 1) && ($16 != "Link") && ($24!="X") && \
Packit 46375d
            $3 !~ /^[0-9abcdefghijklmnopqrstuvwxyz\.-]*-fonts$/' "$FL" \
Packit 46375d
            > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup bad-rpm-naming tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" bad-naming title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && \
Packit 46375d
            ((tolower($11)!=tolower($13)) || (tolower($12)!=tolower($14)))' \
Packit 46375d
    "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
[ $(cat tmp/tmp.csv | wc -l) -gt 0 ] && \
Packit 46375d
awk -F '|' '
Packit 46375d
  {
Packit 46375d
    rpm = $3
Packit 46375d
    if ( $7 == "M" ) { rpm = "[" rpm "]" }
Packit 46375d
    sub(".*/", "", $10)
Packit 46375d
    print rpm "|" $11 ", " $12 " → " $13 ", " $14 "|" $10
Packit 46375d
  }' tmp/tmp.csv | enum_rpm
Packit 46375d
Packit 46375d
test_wrapup bad-naming tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" core-fonts title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($24=="X")' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup core-fonts tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" font-linking title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($16=="Link")' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup font-linking tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" duplicated-face-int title
Packit 46375d
Packit 46375d
awk -F '|' '
Packit 46375d
  (NR > 1) && ($24!="X") && \
Packit 46375d
    ($15 != "PCF") && ($15 != "Type 1") && \
Packit 46375d
    ($11 != "") && ($12 != "") {
Packit 46375d
    sig = $3 "|" $4 "|" $5 "|" $11 "|" $12
Packit 46375d
    files[sig] = files[sig] $0 "#"
Packit 46375d
  }
Packit 46375d
  END {
Packit 46375d
    for (sig in files) {
Packit 46375d
      sub("#$", "", files[sig])
Packit 46375d
      n = split(files[sig],lines,"#")
Packit 46375d
      if (n > 1) {
Packit 46375d
        for (l in lines) { print lines[l] }
Packit 46375d
      }
Packit 46375d
    }
Packit 46375d
  }' "$FL" \
Packit 46375d
  | sort -df -t "|" -k 11 -k 12 -k 3 -k 2 > tmp/tmp.csv
Packit 46375d
Packit 46375d
[ $(cat tmp/tmp.csv | wc -l) -gt 0 ] && \
Packit 46375d
awk -F '|' '
Packit 46375d
  {
Packit 46375d
    rpm = $3
Packit 46375d
    if ( $7 == "M" ) { rpm = "[" rpm "]" }
Packit 46375d
    sub(".*/", "", $10)
Packit 46375d
    print rpm "|" $11 ", " $12 "|" $10
Packit 46375d
  }' tmp/tmp.csv | enum_rpm
Packit 46375d
Packit 46375d
test_wrapup duplicated-face-int tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" fontlint title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($24!="X") && ($21 > 0)' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup fontlint tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" no-english-metadata title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($24!="X") && \
Packit 46375d
            ($15 != "") && (($11 == "") || ($12 == ""))' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
[ $(cat tmp/tmp.csv | wc -l) -gt 0 ] && \
Packit 46375d
awk -F '|' '
Packit 46375d
  {
Packit 46375d
    rpm = $3 "-" $4 "." $5
Packit 46375d
    if ( $7 == "M" ) { rpm = "[" rpm "]" }
Packit 46375d
    print $10 "|" rpm
Packit 46375d
  }' tmp/tmp.csv \
Packit 46375d
  | column -t -s '|' | pretty_indent
Packit 46375d
Packit 46375d
test_wrapup no-english-metadata tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" partial-scripts title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($24!="X") && ($19 > 0)' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup partial-scripts tmp/tmp.csv "$TSUM"
Packit 46375d
Packit 46375d
Packit 46375d
echo -n "— "
Packit 46375d
"$DATADIR/test-info" partial-blocks title
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($24!="X") && ($20 > 0)' "$FL" > tmp/tmp.csv
Packit 46375d
Packit 46375d
list_rpm tmp/tmp.csv
Packit 46375d
test_wrapup partial-blocks tmp/tmp.csv "$TSUM"
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
sum_up() {
Packit 46375d
echo ""
Packit 46375d
echo "Audit results:"
Packit 46375d
echo ""
Packit 46375d
Packit 46375d
echo "– packages that declare font metadata:"
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($7 == "M") && ($24!="X")' "$FL" > tmp/tmp.csv
Packit 46375d
stats tmp/tmp.csv
Packit 46375d
Packit 46375d
echo "☛ File size is computed as extracted, while rpm is a compressed \
Packit 46375d
format." | pretty_indent
Packit 46375d
echo "☛ Mid-term, files in legacy PCF or Type1 formats need to be converted \
Packit 46375d
or removed." | pretty_indent
Packit 46375d
echo ""
Packit 46375d
Packit 46375d
echo "– font files in other packages (we should not find any!)"
Packit 46375d
Packit 46375d
awk -F '|' '(NR > 1) && ($7 != "M") && ($16 != "Link") && ($24!="X")' "$FL" > tmp/tmp.csv
Packit 46375d
stats tmp/tmp.csv
Packit 46375d
Packit 46375d
[ $(cat tmp/tmp.csv | wc -l) -gt 0 ] && \
Packit 46375d
echo "☛ Bad packaging may result in arched packages or mixed content." \
Packit 46375d
| pretty_indent && echo ""
Packit 46375d
Packit 46375d
echo "– errors, warnings and suggestions:"
Packit 46375d
echo ""
Packit 46375d
Packit 46375d
test_score "$TSUM"
Packit 46375d
Packit 46375d
}
Packit 46375d
Packit 46375d
Packit 46375d
prepare_spam() {
Packit 46375d
echo ""
Packit 46375d
echo "Packing mail data…"
Packit 46375d
Packit 46375d
mkdir spam
Packit 46375d
Packit 46375d
for srpm in $(awk -F '|' 'FNR>1 { print $2 }' "$TSUM" | uniq) ; do
Packit 46375d
   [ ! -d "tmp/$srpm" ] && mkdir "tmp/$srpm"
Packit 46375d
  cp -p report.txt "tmp/$srpm/repo-report.txt"
Packit 46375d
  for file in "$FL" "$TSUM" ; do
Packit 46375d
    awk 'FNR==1' "$file" > "tmp/$srpm/$file"
Packit 46375d
    awk -F '|' -v srpm="$srpm" 'FNR>1 && $2==srpm' "$file" >> "tmp/$srpm/$file"
Packit 46375d
  done
Packit 46375d
  for rpm in $(awk -F '|' 'FNR>1 { print $3 "-" $4 "." $5 }' "tmp/$srpm/$TSUM" | uniq | sed "s+$bad_pattern+_+g") ; do
Packit 46375d
    cp -pr "data/$rpm" "tmp/$srpm"
Packit 46375d
  done
Packit 46375d
  cat > tmp/$srpm/message.txt << EOF
Packit 46375d
Dear packager,
Packit 46375d
Packit 46375d
At $TIMESTAMP, your “$srpm” package failed one or more of the tests
Packit 46375d
I was performing on the “$ID” repository located at:
Packit 46375d
$REPOURL
Packit 46375d
Packit 46375d
There are three different reasons that may cause this message:
Packit 46375d
1. your package is including one or more font files, but not packaging
Packit 46375d
   them properly;
Packit 46375d
2. your package is including one or more font files, and I've found
Packit 46375d
   issues in some of them;
Packit 46375d
3. your package is not shipping any font file, but the way it accesses
Packit 46375d
   fonts in other packages is not satisfying.
Packit 46375d
Packit 46375d
To stop receiving this message, you need to:
Packit 46375d
1. drop the font files or fix their packaging;
Packit 46375d
2. relay the fonts issues to the fonts upstream to get them revised;
Packit 46375d
3. work with the code upstream to improve the way it accesses font
Packit 46375d
   files (usually by making it use fontconfig through a higher-level
Packit 46375d
   text library such as pango, pango-cairo, harfbuzz, or QT)
Packit 46375d
Packit 46375d
You can self-check your packages at any time by:
Packit 46375d
1. installing createrepo and fontpackages-tools:
Packit 46375d
# yum install createrepo fontpackages-tools
Packit 46375d
2. putting your packages and any font package they depends on in a
Packit 46375d
   test directory
Packit 46375d
3. indexing this directory with createrepo:
Packit 46375d
$ createrepo path-to-test-directory
Packit 46375d
4. running repo-font-audit:
Packit 46375d
$ repo-font-audit test absolute-path-to-test-directory
Packit 46375d
Packit 46375d
A summary of the issues I detected is appended here. For your
Packit 46375d
convenience a more comprehensive analysis is also attached to this
Packit 46375d
message.
Packit 46375d
Packit 46375d
Errors, warnings and suggestions:
Packit 46375d
Packit 46375d
$(test_score "tmp/$srpm/$TSUM")
Packit 46375d
Packit 46375d
Please take the appropriate measures to fix the “$srpm” package.
Packit 46375d
I will warn you again if it is still necessary next time I am ran.
Packit 46375d
Packit 46375d
This report was generated by the repo-font-audit command from:
Packit 46375d
http://fedoraproject.org/wiki/fontpackages
Packit 46375d
Packit 46375d
Please post questions, suggestions, patches or bug reports to:
Packit 46375d
https://admin.fedoraproject.org/mailman/listinfo/fonts
Packit 46375d
(subscription required)
Packit 46375d
Packit 46375d
Your friendly QA robot,
Packit 46375d
Packit 46375d
-- 
Packit 46375d
repo-font-audit
Packit 46375d
EOF
Packit 46375d
  cd tmp
Packit 46375d
  tar cf "$srpm.tar" "$srpm"
Packit 46375d
  cd ..
Packit 46375d
  xz -9  "tmp/$srpm.tar"
Packit 46375d
  mv "tmp/$srpm.tar.xz" spam
Packit 46375d
done
Packit 46375d
cat > spam/send-messages.sh << EOF
Packit 46375d
#!/bin/sh
Packit 46375d
# Send warnings to problem package owners
Packit 46375d
# This is a bit distribution-specific, people from other distributions are
Packit 46375d
# welcome to suggest how to make it more agnostic
Packit 46375d
Packit 46375d
#EMAIL="repo-font-audit <your@mail>"
Packit 46375d
#REPLYTO=another@mail
Packit 46375d
Packit 46375d
#export EMAIL REPLYTO
Packit 46375d
Packit 46375d
for srpm in \\
Packit 46375d
$(awk -F '|' 'FNR>1 { print $2 " \\" }' "$TSUM" | uniq)
Packit 46375d
; do
Packit 46375d
  tar -xf \$srpm.tar.xz */message.txt -O \\
Packit 46375d
    | mutt -s "[RFA] Your \$srpm $ID package did not pass QA" \\
Packit 46375d
           -a \$srpm.tar.xz -- \$srpm-owner@fedoraproject.org
Packit 46375d
  sleep 5
Packit 46375d
done
Packit 46375d
Packit 46375d
EOF
Packit 46375d
chmod +x spam/send-messages.sh
Packit 46375d
}
Packit 46375d
Packit 46375d
pack_data() {
Packit 46375d
echo "Packing result data…"
Packit 46375d
Packit 46375d
Packit 46375d
mv spam "$SPAM"
Packit 46375d
Packit 46375d
mkdir -p "$RES/data"
Packit 46375d
cp "$TSUM" summary.txt report.txt "$FL" "$RES/"
Packit 46375d
cp -pr data/* "$RES/data" 2>/dev/null
Packit 46375d
Packit 46375d
mkdir "$SRES/"
Packit 46375d
cp "$TSUM" summary.txt report.txt "$SRES/"
Packit 46375d
Packit 46375d
for report in "$RES" "$SRES" "$SPAM" ; do
Packit 46375d
  tar cf "$report.tar" "$report"
Packit 46375d
  xz -9  "$report.tar"
Packit 46375d
  mv "$report.tar.xz" "$ORIGDIR/"
Packit 46375d
done
Packit 46375d
Packit 46375d
echo ""
Packit 46375d
echo "Audit complete!"
Packit 46375d
Packit 46375d
awk 'NR > 1' "$FL" > "tmp/$FL"
Packit 46375d
Packit 46375d
end_time=$(date "+%s")
Packit 46375d
t=$(($end_time-$start_time))
Packit 46375d
th=$(($t/(60*60)))
Packit 46375d
tm=$((($t/60)-(th*60)))
Packit 46375d
ts=$(($t-(($th*60+$tm)*60)))
Packit 46375d
[ $th -gt 0 ] && elapsed_time="$th h"
Packit 46375d
if [ $tm -gt 0 ] ; then
Packit 46375d
  [ "$elapsed_time" != "" ] \
Packit 46375d
    && elapsed_time="$elapsed_time $tm min" \
Packit 46375d
    || elapsed_time="$tm min"
Packit 46375d
fi
Packit 46375d
if [ $ts -gt 0 ] ; then
Packit 46375d
  [ "$elapsed_time" != "" ] \
Packit 46375d
    && elapsed_time="$elapsed_time $ts s" \
Packit 46375d
    || elapsed_time="$ts s"
Packit 46375d
fi
Packit 46375d
Packit 46375d
(
Packit 46375d
cat << EOF
Packit 46375d
Packit 46375d
Run time: $elapsed_time.
Packit 46375d
Number of items processed:
Packit 46375d
$(summary "tmp/$FL")
Packit 46375d
Packit 46375d
1. Extracted data: $ORIGDIR/$RES.tar.xz
Packit 46375d
2. Short summary: $ORIGDIR/$SRES.tar.xz
Packit 46375d
3. Mail data: $ORIGDIR/$SPAM.tar.xz
Packit 46375d
Packit 46375d
This report was generated by the repo-font-audit command from:
Packit 46375d
http://fedoraproject.org/wiki/fontpackages
Packit 46375d
Packit 46375d
Please post questions, suggestions, patches or bug reports to:
Packit 46375d
https://admin.fedoraproject.org/mailman/listinfo/fonts
Packit 46375d
(subscription required)
Packit 46375d
EOF
Packit 46375d
) | pretty_indent
Packit 46375d
Packit 46375d
}
Packit 46375d
Packit 46375d
# End of function declarations
Packit 46375d
Packit 46375d
[ "$#" -lt "2" ] && usage
Packit 46375d
Packit 46375d
TIMESTAMP=$(date -u +%Y%m%dT%H%M%SZ)
Packit 46375d
ID=$1
Packit 46375d
REPOID="$1-rfa-$TIMESTAMP"
Packit 46375d
REPOURL=$(echo "$2" | fix_url)
Packit 46375d
ORIGDIR="$PWD"
Packit 46375d
Packit 46375d
FPL="font-packages.csv"
Packit 46375d
PWFL="packages-with-fonts.csv"
Packit 46375d
XPL="package-using-x11.csv"
Packit 46375d
CSL="checksums.csv"
Packit 46375d
FL="consolidated-data.csv"
Packit 46375d
TSUM="test-summary.csv"
Packit 46375d
RES="repo-font-audit-$ID-$TIMESTAMP"
Packit 46375d
SRES="repo-font-audit-$ID-$TIMESTAMP-short"
Packit 46375d
SPAM="repo-font-audit-$ID-$TIMESTAMP-mail"
Packit 46375d
Packit 46375d
TMPDIR=$(mktemp -d --tmpdir=/tmp $RES-XXXXXXXXXX)
Packit 46375d
cd $TMPDIR
Packit 46375d
Packit 46375d
mkdir tmp
Packit 46375d
Packit 46375d
collect
Packit 46375d
consolidate
Packit 46375d
analyse | tee report.txt
Packit 46375d
sum_up  | tee summary.txt
Packit 46375d
prepare_spam
Packit 46375d
pack_data
Packit 46375d
Packit 46375d
cd "$ORIGDIR"
Packit 46375d
rm -fr "$TMPDIR"
Packit 46375d
echo "♻"