dtneededsizerpms: +echo done
[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     ||-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 ""
121   .$0.' [-r <rpmqafile>] [-a] {""|.dt.rpm|.dt5.rpm} {""|.dt.rpm|.dt5.rpm}'."\n"
122   .$0.' .dt.rpm "";'.$0.' .dt5.rpm .dt.rpm;'.$0.' .dt5.rpm ""'."\n"
123   if @ARGV!=2;
124 ($exta,$extb)=@ARGV;
125 #my $allpkgs=readfile "dnf -C --disablerepo='*' --enablerepo=rawhide-source repoquery -a --arch src 2>/dev/null|";
126 my $allpkgs=readfile "all";
127 my %allpkgs=map(("build/$_.src.rpm"=>1),grep /./,(split /\n/,$allpkgs));
128 my $extras=0;
129 for my $srcrpmdone (glob "build/*.src.rpm.done") {
130   (my $srcrpm=$srcrpmdone)=~s{\Q.done\E$}{} or die $srcrpmdone;
131   if (%rpmqa) {
132     $srcrpm=~m{^build/(.*)-[^-]*-[^-]*$} or die;
133     next if !$rpmqa{$1};
134   }
135   if (!$allpkgs{$srcrpm}) {
136     warn "extra: $srcrpm\n";
137     ++$extras;
138     next;
139   }
140   ++$allpkgs{$srcrpm};
141   onesrcrpm $srcrpm;
142 }
143 my $unbuilt=0;
144 for my $srcrpm (keys(%allpkgs)) {
145   next if $allpkgs{$srcrpm}>1;
146   warn "unbuilt: $srcrpm\n";
147   ++$unbuilt;
148 }
149 $allpkgs=~tr/\n//cd;
150 die if length($allpkgs)!=keys(%allpkgs);
151 $allpkgs=keys(%allpkgs);
152 die if $allpkgs!=$done+$mockfail+$extbmockfail+$unbuilt;
153 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";
154 print "${exta}winbyfile=$extawinbyfile"." ${extb}winbyfile=$extbwinbyfile"." equalbyfile=$equalbyfile"." emptybyfile=$emptybyfile"."\n";
155 print "${exta}winbyrpm =$extawinbyrpm" ." ${extb}winbyrpm =$extbwinbyrpm" ." equalbyrpm =$equalbyrpm" ." emptybyrpm =$emptybyrpm" ."\n";
156 print "${exta}filesizetot=$extafilesizetot"." ${extb}filesizetot=$extbfilesizetot"." = ".($extafilesizetot/$extbfilesizetot*100)."%\n";
157 print " ${exta}rpmsizetot=$extarpmsizetot" ."  ${extb}rpmsizetot=$extbrpmsizetot" ." = ".( $extarpmsizetot/ $extbrpmsizetot*100)."%\n";
158 #print "equal: $_\n" for @{$filestat{1}};
159 my @sorted=map @{$filestat{$_}},sort {$a<=>$b;} keys(%filestat);
160 sub out($) {
161   my($ix)=@_;
162   print($sorted[$ix]."\n");
163 }
164 if ($all_sorted) {
165   out $_ for 0..$#sorted;
166 } else {
167   my $p=5;
168   out $_ for 0..$p-1;
169   out $_ for @sorted-$p..$#sorted;
170 }
171 print "debuginfod download size: ";
172 my $extasizetot=0;
173 my $extbsizetot=0;
174 for my $srcrpm (@srcrpms) {
175   my $rpmsizes="$srcrpm.rpmsizes";
176   -e $rpmsizes or (system "./debuginfosize $srcrpm" and die $srcrpm);
177   -e $rpmsizes or die $srcrpm;
178   my $f=readfile $rpmsizes;
179   $f=~/^(\d+) (\d+)\n$/s;
180   my $extasize=$1;
181   my $extbsize=$2;
182   $extasizetot+=$extasize;
183   $extbsizetot+=$extbsize;
184 }
185 print "${exta}sizetot=$extasizetot ${extb}sizetot=$extbsizetot = ".sprintf("%.2f",$extasizetot/$extbsizetot*100)."%\n";
186 print "build time: ";
187 my $extatime=0;
188 my $extbtime=0;
189 for my $srcrpm (@srcrpms) {
190   sub onemocklog($) {
191     my($mocklog)=@_;
192     my $mocklogtime="$mocklog.time";
193     return 0+readfile $mocklogtime if -e $mocklogtime;
194     my $f=readfile($mocklog);
195     # INFO: Done(firefox-78.0-2.fc33.src.rpm) Config(fedora-rawhide-x86_64) 288 minutes 35 seconds
196     my $t;
197     $t=$1*60+$2 while $f=~/\nINFO: Done[(][^\n]*[)] (\d+) minutes (\d+) seconds\n/g;
198     defined $t or die $mocklog;
199     writefile $mocklogtime,"$t\n";
200     return $t;
201   }
202   $extatime+=onemocklog "$srcrpm$exta.mocklog";
203   $extbtime+=onemocklog "$srcrpm$extb.mocklog";
204 }
205 print "${exta}time=$extatime ${extb}time=$extbtime = ".sprintf("%.2f",$extatime/$extbtime*100)."%\n";