#! /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=) 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"; } 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; } #my $allpkgs=readfile "dnf -C --disablerepo='*' --enablerepo=rawhide-source repoquery -a --arch src 2>/dev/null|"; my $allpkgs=readfile "all"; my %allpkgs=map(("build/$_.src.rpm"=>1),grep /./,(split /\n/,$allpkgs)); my $extras=0; 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}; } if (!$allpkgs{$srcrpm}) { warn "extra: $srcrpm\n"; ++$extras; next; } ++$allpkgs{$srcrpm}; onesrcrpm $srcrpm; } my $unbuilt=0; for my $srcrpm (keys(%allpkgs)) { next if $allpkgs{$srcrpm}>1; warn "unbuilt: $srcrpm\n"; ++$unbuilt; } $allpkgs=~tr/\n//cd; die if length($allpkgs)!=keys(%allpkgs); $allpkgs=keys(%allpkgs); die if $allpkgs!=$done+$mockfail+$dtmockfail+$unbuilt; print "extras=$extras; unbuilt=$unbuilt; done=$done + mockfail=$mockfail + dtmockfail=$dtmockfail = ".($done+$mockfail+$dtmockfail)." all=$allpkgs processed=".(($done+$mockfail+$dtmockfail)/$allpkgs*100)."%\n"; print "dwzwinbyfile=$dwzwinbyfile"." dtwinbyfile=$dtwinbyfile"." equalbyfile=$equalbyfile"." emptybyfile=$emptybyfile"."\n"; print "dwzwinbyrpm =$dwzwinbyrpm" ." dtwinbyrpm =$dtwinbyrpm" ." equalbyrpm =$equalbyrpm" ." emptybyrpm =$emptybyrpm" ."\n"; print "dwzfilesizetot=$dwzfilesizetot"." dtfilesizetot=$dtfilesizetot"." = ".($dwzfilesizetot/$dtfilesizetot*100)."%\n"; print " dwzrpmsizetot=$dwzrpmsizetot" ." dtrpmsizetot=$dtrpmsizetot" ." = ".( $dwzrpmsizetot/ $dtrpmsizetot*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";