+#! /usr/bin/perl
+use strict;
+use warnings;
+
+$|=1;
+sub readfile {
+ my($fname)=@_;
+ local *F;
+ open F,"$fname" or die $fname;
+ local $/=undef();
+ defined(my $r=<F>) or die $fname;
+ close F or die $fname;
+ return $r;
+}
+sub writefile {
+ my($fname,$content)=@_;
+ local *F;
+ open F,">$fname" or die $fname;
+ print F $content or die $fname;
+ close F or die $fname;
+}
+
+my $mockfail=0;
+my $dtmockfail=0;
+my $emptybyfile=0;
+my $dwzwinbyfile=0;
+my $dtwinbyfile=0;
+my $equalbyfile=0;
+my $emptybyrpm=0;
+my $dwzwinbyrpm=0;
+my $dtwinbyrpm=0;
+my $equalbyrpm=0;
+my $dwzfilesizetot=0;
+my $dtfilesizetot=0;
+my $dwzrpmsizetot=0;
+my $dtrpmsizetot=0;
+my $done=0;
+my %filestat;
+my @srcrpms;
+sub onesrcrpm($) {
+ my($srcrpm)=@_;
+# print "$srcrpm\n";
+ if (-e "$srcrpm.mockfail") {
+ die if -e "$srcrpm.dt.rpm.mockfail";
+ warn "mockfail: $srcrpm";
+ ++$mockfail;
+ return;
+ }
+ if (-e "$srcrpm.dt.rpm.mockfail") {
+ warn "dtmockfail: $srcrpm";
+ ++$dtmockfail;
+ return;
+ }
+ my $dwzfilesize=0+readfile "$srcrpm.filesize";
+ my $dwzrpmsize=0+readfile "$srcrpm.rpmsize";
+ my $dtfilesize=0+readfile "$srcrpm.dt.rpm.filesize";
+ my $dtrpmsize=0+readfile "$srcrpm.dt.rpm.rpmsize";
+ $dwzfilesizetot+=$dwzfilesize;
+ $dtfilesizetot+=$dtfilesize;
+ $dwzrpmsizetot+=$dwzrpmsize;
+ $dtrpmsizetot+=$dtrpmsize;
+ if (($dwzfilesize>=$dtfilesize)!=($dwzrpmsize>=$dtrpmsize)) {
+ #warn "file vs. rpm size do not match (dwzfilesize=$dwzfilesize dtfilesize=$dtfilesize dwzrpmsize=$dwzrpmsize dtrpmsize=$dtrpmsize: $srcrpm";
+ return;
+ }
+ if ($dwzfilesize==0&&$dtfilesize==0) {
+ ++$emptybyfile;
+ } elsif ($dwzfilesize<$dtfilesize) {
+ #warn "dwz dwzfilesize $dwzfilesize < dtfilesize $dtfilesize: $srcrpm";
+ ++$dwzwinbyfile;
+ } elsif ($dwzfilesize>$dtfilesize) {
+ ++$dtwinbyfile;
+ } else {
+ ++$equalbyfile;
+ }
+ push @{$filestat{$dwzfilesize/$dtfilesize}},"$srcrpm dwzfilesize=$dwzfilesize dtfilesize=$dtfilesize" if $dtfilesize;
+ if ($dwzrpmsize==0&&$dtrpmsize==0) {
+ ++$emptybyrpm;
+ } elsif ($dwzrpmsize<$dtrpmsize) {
+ ++$dwzwinbyrpm;
+ } elsif ($dwzrpmsize>$dtrpmsize) {
+ ++$dtwinbyrpm;
+ } else {
+ ++$equalbyrpm;
+ }
+ ++$done;
+ push @srcrpms,$srcrpm;
+}
+my %rpmqa;
+if (($ARGV[0]||"") eq "-r") {
+ shift;
+ local $_;
+ for (split /\n/,readfile($ARGV[0] eq "-"?"rpm -qa '*-debuginfo'|":$ARGV[0])) {
+ next if /^\s*$/s;
+ /^(.*)-debuginfo-[^-]*-[^-]*$/ or die;
+ $rpmqa{$1}=1;
+ }
+ shift;
+}
+for my $srcrpmdone (glob "build/*.src.rpm.done") {
+ (my $srcrpm=$srcrpmdone)=~s{\Q.done\E$}{} or die $srcrpmdone;
+ if (%rpmqa) {
+ $srcrpm=~m{^build/(.*)-[^-]*-[^-]*$} or die;
+ next if !$rpmqa{$1};
+ }
+ onesrcrpm $srcrpm;
+}
+print "dwzwinbyfile=$dwzwinbyfile"." dtwinbyfile=$dtwinbyfile"." equalbyfile=$equalbyfile"." emptybyfile=$emptybyfile"."\n";
+print "dwzwinbyrpm =$dwzwinbyrpm" ." dtwinbyrpm =$dtwinbyrpm" ." equalbyrpm =$equalbyrpm" ." emptybyrpm =$emptybyrpm" ."\n";
+print "mockfail=$mockfail dtmockfail=$dtmockfail\n";
+print "dwzfilesizetot=$dwzfilesizetot"." dtfilesizetot=$dtfilesizetot"." = ".($dwzfilesizetot/$dtfilesizetot*100)."%\n";
+print " dwzrpmsizetot=$dwzrpmsizetot" ." dtrpmsizetot=$dtrpmsizetot" ." = ".( $dwzrpmsizetot/ $dtrpmsizetot*100)."%\n";
+my $fail=0;
+for my $srcrpmfail (glob "build/*.src.rpm.*fail*") {
+ ++$fail;
+}
+my $allpkgs=readfile "dnf -C --disablerepo='*' --enablerepo=rawhide-source repoquery -a --arch src 2>/dev/null|";
+$allpkgs=~tr/\n//cd;
+$allpkgs=length $allpkgs;
+print "done=$done + fail=$fail = ".($done+$fail)." all=$allpkgs processed=".(($done+$fail)/$allpkgs*100)."%\n";
+#print "equal: $_\n" for @{$filestat{1}};
+my @sorted=map({ my $r=$_; map(($_,$r),@{$filestat{$_}}); } sort {$a<=>$b;} keys %filestat);
+sub out($) {
+ my($ix)=@_;
+ my $name=$sorted[2*$ix+0];
+ my $ratio=$sorted[2*$ix+1];
+ print(sprintf("%.2f",$ratio*100)."%: $name\n");
+}
+my $sorted=@sorted/2;
+if (@ARGV) {
+ out $_ for 0..$sorted-1;
+} else {
+ my $p=5;
+ out $_ for 0..$p-1;
+ out $_ for $sorted-$p..$sorted-1;
+}
+print "debuginfod download size: ";
+my $dwzsizetot=0;
+my $dtsizetot=0;
+for my $srcrpm (@srcrpms) {
+ my $rpmsizes="$srcrpm.rpmsizes";
+ -e $rpmsizes or (system "./debuginfosize $srcrpm" and die $srcrpm);
+ -e $rpmsizes or die $srcrpm;
+ my $f=readfile $rpmsizes;
+ $f=~/^(\d+) (\d+)\n$/s;
+ my $dwzsize=$1;
+ my $dtsize=$2;
+ $dwzsizetot+=$dwzsize;
+ $dtsizetot+=$dtsize;
+}
+print "dwzsizetot=$dwzsizetot dtsizetot=$dtsizetot = ".sprintf("%.2f",$dwzsizetot/$dtsizetot*100)."%\n";
+print "build time: ";
+my $dwztime=0;
+my $dttime=0;
+for my $srcrpm (@srcrpms) {
+ sub onemocklog($) {
+ my($mocklog)=@_;
+ my $mocklogtime="$mocklog.time";
+ return 0+readfile $mocklogtime if -e $mocklogtime;
+ my $f=readfile($mocklog);
+ # INFO: Done(firefox-78.0-2.fc33.src.rpm) Config(fedora-rawhide-x86_64) 288 minutes 35 seconds
+ my $t;
+ $t=$1*60+$2 while $f=~/\nINFO: Done[(][^\n]*[)] (\d+) minutes (\d+) seconds\n/g;
+ defined $t or die $mocklog;
+ writefile $mocklogtime,"$t\n";
+ return $t;
+ }
+ $dwztime+=onemocklog "$srcrpm.mocklog";
+ $dttime+=onemocklog "$srcrpm.dt.rpm.mocklog";
+}
+print "dwztime=$dwztime dttime=$dttime = ".sprintf("%.2f",$dwztime/$dttime*100)."%\n";