stat: +exta&extb
[massrebuild.git] / stat
1 #! /usr/bin/perl
2 use strict;
3 use warnings;
4
5 $|=1;
6 sub readfile {
7   my($fname)=@_;
8   local *F;
9   open F,"$fname" or die $fname;
10   local $/=undef();
11   defined(my $r=<F>) or die $fname;
12   close F or die $fname;
13   return $r;
14 }
15 sub writefile {
16   my($fname,$content)=@_;
17   local *F;
18   open F,">$fname" or die $fname;
19   print F $content or die $fname;
20   close F or die $fname;
21 }
22
23 my($exta,$extb);
24 my $mockfail=0;
25 my $extbmockfail=0;
26 my $emptybyfile=0;
27 my $extawinbyfile=0;
28 my $extbwinbyfile=0;
29 my $equalbyfile=0;
30 my $emptybyrpm=0;
31 my $extawinbyrpm=0;
32 my $extbwinbyrpm=0;
33 my $equalbyrpm=0;
34 my $extafilesizetot=0;
35 my $extbfilesizetot=0;
36 my $extarpmsizetot=0;
37 my $extbrpmsizetot=0;
38 my $done=0;
39 my %filestat;
40 my @srcrpms;
41 sub onesrcrpm($) {
42   my($srcrpm)=@_;
43 #  print "$srcrpm\n";
44   if (-e "$srcrpm.mockfail"
45     ||-e "$srcrpm$exta.mockfail") {
46     die if -e "$srcrpm${extb}.mockfail";
47     warn "mockfail: $srcrpm";
48     ++$mockfail;
49     return;
50   }
51   if (-e "$srcrpm.bsmockfail"
52     ||-e "$srcrpm.bsmockefail"
53     ||-e "$srcrpm$exta.bsmockfail"
54     ||-e "$srcrpm$exta.bsmockefail"
55     ||-e "$srcrpm$extb.bsmockfail"
56     ||-e "$srcrpm$extb.bsmockefail"
57     ) {
58     warn "bsmock(|e)fail: $srcrpm";
59     ++$mockfail;
60     return;
61   }
62   if (-e "$srcrpm$exta.mockfail"
63     ||-e "$srcrpm$extb.mockfail") {
64     warn "${extb}mockfail: $srcrpm";
65     ++$extbmockfail;
66     return;
67   }
68   if (!-e "$srcrpm$exta.filesize"
69     ||!-e "$srcrpm$extb.filesize") {
70     warn "!filesize: $srcrpm";
71     ++$extbmockfail;
72     return;
73   }
74   my $extafilesize=0+readfile "$srcrpm$exta.filesize";
75   my $extarpmsize=0+readfile "$srcrpm$exta.rpmsize";
76   my $extbfilesize=0+readfile "$srcrpm$extb.filesize";
77   my $extbrpmsize=0+readfile "$srcrpm$extb.rpmsize";
78   $extafilesizetot+=$extafilesize;
79   $extbfilesizetot+=$extbfilesize;
80   $extarpmsizetot+=$extarpmsize;
81   $extbrpmsizetot+=$extbrpmsize;
82   if (($extafilesize>=$extbfilesize)!=($extarpmsize>=$extbrpmsize)) {
83     #warn "file vs. rpm size do not match (${exta}filesize=$extafilesize ${extb}filesize=$extbfilesize ${exta}rpmsize=$extarpmsize ${extb}rpmsize=$extbrpmsize: $srcrpm";
84   }
85   if ($extafilesize==0&&$extbfilesize==0) {
86     ++$emptybyfile;
87   } elsif ($extafilesize<$extbfilesize) {
88     #warn "exta ${exta}filesize $extafilesize < ${extb}filesize $extbfilesize: $srcrpm";
89     ++$extawinbyfile;
90   } elsif ($extafilesize>$extbfilesize) {
91     ++$extbwinbyfile;
92   } else {
93     ++$equalbyfile;
94   }
95   push @{$filestat{$extafilesize-$extbfilesize}},sprintf("%.2f",100*$extafilesize/$extbfilesize).": $srcrpm ${exta}filesize=$extafilesize ${extb}filesize=$extbfilesize" if $extbfilesize;
96   if ($extarpmsize==0&&$extbrpmsize==0) {
97     ++$emptybyrpm;
98   } elsif ($extarpmsize<$extbrpmsize) {
99     ++$extawinbyrpm;
100   } elsif ($extarpmsize>$extbrpmsize) {
101     ++$extbwinbyrpm;
102   } else {
103     ++$equalbyrpm;
104   }
105   ++$done;
106   push @srcrpms,$srcrpm;
107 }
108 my %rpmqa;
109 if (($ARGV[0]||"") eq "-r") {
110   shift;
111   local $_;
112   for (split /\n/,readfile($ARGV[0] eq "-"?"rpm -qa '*-debuginfo'|":$ARGV[0])) {
113     next if /^\s*$/s;
114     /^(.*)-debuginfo-[^-]*-[^-]*$/ or die;
115     $rpmqa{$1}=1;
116   }
117   shift;
118 }
119 my $all_sorted=shift @ARGV if ($ARGV[0]||"") eq "-a";
120 die $0.' [-r <rpmqafile>] [-a] {""|.dt.rpm|.dt5.rpm} {""|.dt.rpm|.dt5.rpm}' if @ARGV!=2;
121 ($exta,$extb)=@ARGV;
122 #my $allpkgs=readfile "dnf -C --disablerepo='*' --enablerepo=rawhide-source repoquery -a --arch src 2>/dev/null|";
123 my $allpkgs=readfile "all";
124 my %allpkgs=map(("build/$_.src.rpm"=>1),grep /./,(split /\n/,$allpkgs));
125 my $extras=0;
126 for my $srcrpmdone (glob "build/*.src.rpm.done") {
127   (my $srcrpm=$srcrpmdone)=~s{\Q.done\E$}{} or die $srcrpmdone;
128   if (%rpmqa) {
129     $srcrpm=~m{^build/(.*)-[^-]*-[^-]*$} or die;
130     next if !$rpmqa{$1};
131   }
132   if (!$allpkgs{$srcrpm}) {
133     warn "extra: $srcrpm\n";
134     ++$extras;
135     next;
136   }
137   ++$allpkgs{$srcrpm};
138   onesrcrpm $srcrpm;
139 }
140 my $unbuilt=0;
141 for my $srcrpm (keys(%allpkgs)) {
142   next if $allpkgs{$srcrpm}>1;
143   warn "unbuilt: $srcrpm\n";
144   ++$unbuilt;
145 }
146 $allpkgs=~tr/\n//cd;
147 die if length($allpkgs)!=keys(%allpkgs);
148 $allpkgs=keys(%allpkgs);
149 die if $allpkgs!=$done+$mockfail+$extbmockfail+$unbuilt;
150 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";
151 print "${exta}winbyfile=$extawinbyfile"." ${extb}winbyfile=$extbwinbyfile"." equalbyfile=$equalbyfile"." emptybyfile=$emptybyfile"."\n";
152 print "${exta}winbyrpm =$extawinbyrpm" ." ${extb}winbyrpm =$extbwinbyrpm" ." equalbyrpm =$equalbyrpm" ." emptybyrpm =$emptybyrpm" ."\n";
153 print "${exta}filesizetot=$extafilesizetot"." ${extb}filesizetot=$extbfilesizetot"." = ".($extafilesizetot/$extbfilesizetot*100)."%\n";
154 print " ${exta}rpmsizetot=$extarpmsizetot" ."  ${extb}rpmsizetot=$extbrpmsizetot" ." = ".( $extarpmsizetot/ $extbrpmsizetot*100)."%\n";
155 #print "equal: $_\n" for @{$filestat{1}};
156 my @sorted=map @{$filestat{$_}},sort {$a<=>$b;} keys(%filestat);
157 sub out($) {
158   my($ix)=@_;
159   print($sorted[$ix]."\n");
160 }
161 if ($all_sorted) {
162   out $_ for 0..$#sorted;
163 } else {
164   my $p=5;
165   out $_ for 0..$p-1;
166   out $_ for @sorted-$p..$#sorted;
167 }
168 print "debuginfod download size: ";
169 my $extasizetot=0;
170 my $extbsizetot=0;
171 for my $srcrpm (@srcrpms) {
172   my $rpmsizes="$srcrpm.rpmsizes";
173   -e $rpmsizes or (system "./debuginfosize $srcrpm" and die $srcrpm);
174   -e $rpmsizes or die $srcrpm;
175   my $f=readfile $rpmsizes;
176   $f=~/^(\d+) (\d+)\n$/s;
177   my $extasize=$1;
178   my $extbsize=$2;
179   $extasizetot+=$extasize;
180   $extbsizetot+=$extbsize;
181 }
182 print "${exta}sizetot=$extasizetot ${extb}sizetot=$extbsizetot = ".sprintf("%.2f",$extasizetot/$extbsizetot*100)."%\n";
183 print "build time: ";
184 my $extatime=0;
185 my $extbtime=0;
186 for my $srcrpm (@srcrpms) {
187   sub onemocklog($) {
188     my($mocklog)=@_;
189     my $mocklogtime="$mocklog.time";
190     return 0+readfile $mocklogtime if -e $mocklogtime;
191     my $f=readfile($mocklog);
192     # INFO: Done(firefox-78.0-2.fc33.src.rpm) Config(fedora-rawhide-x86_64) 288 minutes 35 seconds
193     my $t;
194     $t=$1*60+$2 while $f=~/\nINFO: Done[(][^\n]*[)] (\d+) minutes (\d+) seconds\n/g;
195     defined $t or die $mocklog;
196     writefile $mocklogtime,"$t\n";
197     return $t;
198   }
199   $extatime+=onemocklog "$srcrpm$exta.mocklog";
200   $extbtime+=onemocklog "$srcrpm$extb.mocklog";
201 }
202 print "${exta}time=$extatime ${extb}time=$extbtime = ".sprintf("%.2f",$extatime/$extbtime*100)."%\n";