#! /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($exta,$extb); my $mockfail=0; my $extbmockfail=0; my $emptybyfile=0; my $extawinbyfile=0; my $extbwinbyfile=0; my $equalbyfile=0; my $emptybyrpm=0; my $extawinbyrpm=0; my $extbwinbyrpm=0; my $equalbyrpm=0; my $extafilesizetot=0; my $extbfilesizetot=0; my $extarpmsizetot=0; my $extbrpmsizetot=0; my $done=0; my %filestat; my @srcrpms; sub onesrcrpm($) { my($srcrpm)=@_; # print "$srcrpm\n"; if (-e "$srcrpm.mockfail" ||-e "$srcrpm$exta.mockfail" ||-e "$srcrpm$extb.mockfail") { warn "mockfail: $srcrpm"; ++$mockfail; return; } if (-e "$srcrpm.bsmockfail" ||-e "$srcrpm.bsmockefail" ||-e "$srcrpm$exta.bsmockfail" ||-e "$srcrpm$exta.bsmockefail" ||-e "$srcrpm$extb.bsmockfail" ||-e "$srcrpm$extb.bsmockefail" ) { warn "bsmock(|e)fail: $srcrpm"; ++$mockfail; return; } if (-e "$srcrpm$exta.mockfail" ||-e "$srcrpm$extb.mockfail") { warn "${extb}mockfail: $srcrpm"; ++$extbmockfail; return; } if (!-e "$srcrpm$exta.filesize" ||!-e "$srcrpm$extb.filesize") { warn "!filesize: $srcrpm"; ++$extbmockfail; return; } my $extafilesize=0+readfile "$srcrpm$exta.filesize"; my $extarpmsize=0+readfile "$srcrpm$exta.rpmsize"; my $extbfilesize=0+readfile "$srcrpm$extb.filesize"; my $extbrpmsize=0+readfile "$srcrpm$extb.rpmsize"; $extafilesizetot+=$extafilesize; $extbfilesizetot+=$extbfilesize; $extarpmsizetot+=$extarpmsize; $extbrpmsizetot+=$extbrpmsize; if (($extafilesize>=$extbfilesize)!=($extarpmsize>=$extbrpmsize)) { #warn "file vs. rpm size do not match (${exta}filesize=$extafilesize ${extb}filesize=$extbfilesize ${exta}rpmsize=$extarpmsize ${extb}rpmsize=$extbrpmsize: $srcrpm"; } if ($extafilesize==0&&$extbfilesize==0) { ++$emptybyfile; } elsif ($extafilesize<$extbfilesize) { #warn "exta ${exta}filesize $extafilesize < ${extb}filesize $extbfilesize: $srcrpm"; ++$extawinbyfile; } elsif ($extafilesize>$extbfilesize) { ++$extbwinbyfile; } else { ++$equalbyfile; } push @{$filestat{$extafilesize-$extbfilesize}},sprintf("%.2f",100*$extafilesize/$extbfilesize).": $srcrpm ${exta}filesize=$extafilesize ${extb}filesize=$extbfilesize" if $extbfilesize; if ($extarpmsize==0&&$extbrpmsize==0) { ++$emptybyrpm; } elsif ($extarpmsize<$extbrpmsize) { ++$extawinbyrpm; } elsif ($extarpmsize>$extbrpmsize) { ++$extbwinbyrpm; } 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 $all_sorted=shift @ARGV if ($ARGV[0]||"") eq "-a"; die "" .$0.' [-r ] [-a] {""|.dt.rpm|.dt5.rpm} {""|.dt.rpm|.dt5.rpm}'."\n" .$0.' .dt.rpm "";'.$0.' .dt5.rpm .dt.rpm;'.$0.' .dt5.rpm ""'."\n" if @ARGV!=2; ($exta,$extb)=@ARGV; #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+$extbmockfail+$unbuilt; print "extras=$extras; unbuilt=$unbuilt; done=$done + ${exta}mockfail=$mockfail + ${extb}mockfail=$extbmockfail = ".($done+$mockfail+$extbmockfail)." all=$allpkgs processed=".(($done+$mockfail+$extbmockfail)/$allpkgs*100)."%\n"; print "${exta}winbyfile=$extawinbyfile"." ${extb}winbyfile=$extbwinbyfile"." equalbyfile=$equalbyfile"." emptybyfile=$emptybyfile"."\n"; print "${exta}winbyrpm =$extawinbyrpm" ." ${extb}winbyrpm =$extbwinbyrpm" ." equalbyrpm =$equalbyrpm" ." emptybyrpm =$emptybyrpm" ."\n"; print "${exta}filesizetot=$extafilesizetot"." ${extb}filesizetot=$extbfilesizetot"." = ".($extafilesizetot/$extbfilesizetot*100)."%\n"; print " ${exta}rpmsizetot=$extarpmsizetot" ." ${extb}rpmsizetot=$extbrpmsizetot" ." = ".( $extarpmsizetot/ $extbrpmsizetot*100)."%\n"; #print "equal: $_\n" for @{$filestat{1}}; my @sorted=map @{$filestat{$_}},sort {$a<=>$b;} keys(%filestat); sub out($) { my($ix)=@_; print($sorted[$ix]."\n"); } if ($all_sorted) { out $_ for 0..$#sorted; } else { my $p=5; out $_ for 0..$p-1; out $_ for @sorted-$p..$#sorted; } #print "debuginfod download size: "; #my $extasizetot=0; #my $extbsizetot=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 $extasize=$1; # my $extbsize=$2; # $extasizetot+=$extasize; # $extbsizetot+=$extbsize; #} #print "${exta}sizetot=$extasizetot ${extb}sizetot=$extbsizetot = ".sprintf("%.2f",$extasizetot/$extbsizetot*100)."%\n"; print "build time: "; my $extatime=0; my $extbtime=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; } $extatime+=onemocklog "$srcrpm$exta.mocklog"; $extbtime+=onemocklog "$srcrpm$extb.mocklog"; } print "${exta}time=$extatime ${extb}time=$extbtime = ".sprintf("%.2f",$extatime/$extbtime*100)."%\n";