fcd9b3f0ee17784bac4935ff0e346f32331f94fb
[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 $mockfail=0;
24 my $dtmockfail=0;
25 my $emptybyfile=0;
26 my $dwzwinbyfile=0;
27 my $dtwinbyfile=0;
28 my $equalbyfile=0;
29 my $emptybyrpm=0;
30 my $dwzwinbyrpm=0;
31 my $dtwinbyrpm=0;
32 my $equalbyrpm=0;
33 my $dwzfilesizetot=0;
34 my $dtfilesizetot=0;
35 my $dwzrpmsizetot=0;
36 my $dtrpmsizetot=0;
37 my $done=0;
38 my %filestat;
39 my @srcrpms;
40 sub onesrcrpm($) {
41   my($srcrpm)=@_;
42 #  print "$srcrpm\n";
43   if (-e "$srcrpm.mockfail") {
44     die if -e "$srcrpm.dt.rpm.mockfail";
45     warn "mockfail: $srcrpm";
46     ++$mockfail;
47     return;
48   }
49   if (-e "$srcrpm.bsmockfail"
50     ||-e "$srcrpm.bsmockefail"
51     ||-e "$srcrpm.dt.rpm.bsmockfail"
52     ||-e "$srcrpm.dt.rpm.bsmockefail"
53     ) {
54     warn "bsmock(|e)fail: $srcrpm";
55     ++$mockfail;
56     return;
57   }
58   if (-e "$srcrpm.dt.rpm.mockfail") {
59     warn "dtmockfail: $srcrpm";
60     ++$dtmockfail;
61     return;
62   }
63   my $dwzfilesize=0+readfile "$srcrpm.filesize";
64   my $dwzrpmsize=0+readfile "$srcrpm.rpmsize";
65   my $dtfilesize=0+readfile "$srcrpm.dt.rpm.filesize";
66   my $dtrpmsize=0+readfile "$srcrpm.dt.rpm.rpmsize";
67   $dwzfilesizetot+=$dwzfilesize;
68   $dtfilesizetot+=$dtfilesize;
69   $dwzrpmsizetot+=$dwzrpmsize;
70   $dtrpmsizetot+=$dtrpmsize;
71   if (($dwzfilesize>=$dtfilesize)!=($dwzrpmsize>=$dtrpmsize)) {
72     #warn "file vs. rpm size do not match (dwzfilesize=$dwzfilesize dtfilesize=$dtfilesize dwzrpmsize=$dwzrpmsize dtrpmsize=$dtrpmsize: $srcrpm";
73   }
74   if ($dwzfilesize==0&&$dtfilesize==0) {
75     ++$emptybyfile;
76   } elsif ($dwzfilesize<$dtfilesize) {
77     #warn "dwz dwzfilesize $dwzfilesize < dtfilesize $dtfilesize: $srcrpm";
78     ++$dwzwinbyfile;
79   } elsif ($dwzfilesize>$dtfilesize) {
80     ++$dtwinbyfile;
81   } else {
82     ++$equalbyfile;
83   }
84   push @{$filestat{$dwzfilesize-$dtfilesize}},sprintf("%.2f",100*$dwzfilesize/$dtfilesize).": $srcrpm dwzfilesize=$dwzfilesize dtfilesize=$dtfilesize" if $dtfilesize;
85   if ($dwzrpmsize==0&&$dtrpmsize==0) {
86     ++$emptybyrpm;
87   } elsif ($dwzrpmsize<$dtrpmsize) {
88     ++$dwzwinbyrpm;
89   } elsif ($dwzrpmsize>$dtrpmsize) {
90     ++$dtwinbyrpm;
91   } else {
92     ++$equalbyrpm;
93   }
94   ++$done;
95   push @srcrpms,$srcrpm;
96 }
97 my %rpmqa;
98 if (($ARGV[0]||"") eq "-r") {
99   shift;
100   local $_;
101   for (split /\n/,readfile($ARGV[0] eq "-"?"rpm -qa '*-debuginfo'|":$ARGV[0])) {
102     next if /^\s*$/s;
103     /^(.*)-debuginfo-[^-]*-[^-]*$/ or die;
104     $rpmqa{$1}=1;
105   }
106   shift;
107 }
108 #my $allpkgs=readfile "dnf -C --disablerepo='*' --enablerepo=rawhide-source repoquery -a --arch src 2>/dev/null|";
109 my $allpkgs=readfile "all";
110 my %allpkgs=map(("build/$_.src.rpm"=>1),grep /./,(split /\n/,$allpkgs));
111 my $extras=0;
112 for my $srcrpmdone (glob "build/*.src.rpm.done") {
113   (my $srcrpm=$srcrpmdone)=~s{\Q.done\E$}{} or die $srcrpmdone;
114   if (%rpmqa) {
115     $srcrpm=~m{^build/(.*)-[^-]*-[^-]*$} or die;
116     next if !$rpmqa{$1};
117   }
118   if (!$allpkgs{$srcrpm}) {
119     warn "extra: $srcrpm\n";
120     ++$extras;
121     next;
122   }
123   ++$allpkgs{$srcrpm};
124   onesrcrpm $srcrpm;
125 }
126 my $unbuilt=0;
127 for my $srcrpm (keys(%allpkgs)) {
128   next if $allpkgs{$srcrpm}>1;
129   warn "unbuilt: $srcrpm\n";
130   ++$unbuilt;
131 }
132 $allpkgs=~tr/\n//cd;
133 die if length($allpkgs)!=keys(%allpkgs);
134 $allpkgs=keys(%allpkgs);
135 die if $allpkgs!=$done+$mockfail+$dtmockfail+$unbuilt;
136 print "extras=$extras; unbuilt=$unbuilt; done=$done + mockfail=$mockfail + dtmockfail=$dtmockfail = ".($done+$mockfail+$dtmockfail)." all=$allpkgs processed=".(($done+$mockfail+$dtmockfail)/$allpkgs*100)."%\n";
137 print "dwzwinbyfile=$dwzwinbyfile"." dtwinbyfile=$dtwinbyfile"." equalbyfile=$equalbyfile"." emptybyfile=$emptybyfile"."\n";
138 print "dwzwinbyrpm =$dwzwinbyrpm" ." dtwinbyrpm =$dtwinbyrpm" ." equalbyrpm =$equalbyrpm" ." emptybyrpm =$emptybyrpm" ."\n";
139 print "dwzfilesizetot=$dwzfilesizetot"." dtfilesizetot=$dtfilesizetot"." = ".($dwzfilesizetot/$dtfilesizetot*100)."%\n";
140 print " dwzrpmsizetot=$dwzrpmsizetot" ."  dtrpmsizetot=$dtrpmsizetot" ." = ".( $dwzrpmsizetot/ $dtrpmsizetot*100)."%\n";
141 #print "equal: $_\n" for @{$filestat{1}};
142 my @sorted=map @{$filestat{$_}},sort {$a<=>$b;} keys(%filestat);
143 sub out($) {
144   my($ix)=@_;
145   print($sorted[$ix]."\n");
146 }
147 if (@ARGV) {
148   out $_ for 0..$#sorted;
149 } else {
150   my $p=5;
151   out $_ for 0..$p-1;
152   out $_ for @sorted-$p..$#sorted;
153 }
154 print "debuginfod download size: ";
155 my $dwzsizetot=0;
156 my $dtsizetot=0;
157 for my $srcrpm (@srcrpms) {
158   my $rpmsizes="$srcrpm.rpmsizes";
159   -e $rpmsizes or (system "./debuginfosize $srcrpm" and die $srcrpm);
160   -e $rpmsizes or die $srcrpm;
161   my $f=readfile $rpmsizes;
162   $f=~/^(\d+) (\d+)\n$/s;
163   my $dwzsize=$1;
164   my $dtsize=$2;
165   $dwzsizetot+=$dwzsize;
166   $dtsizetot+=$dtsize;
167 }
168 print "dwzsizetot=$dwzsizetot dtsizetot=$dtsizetot = ".sprintf("%.2f",$dwzsizetot/$dtsizetot*100)."%\n";
169 print "build time: ";
170 my $dwztime=0;
171 my $dttime=0;
172 for my $srcrpm (@srcrpms) {
173   sub onemocklog($) {
174     my($mocklog)=@_;
175     my $mocklogtime="$mocklog.time";
176     return 0+readfile $mocklogtime if -e $mocklogtime;
177     my $f=readfile($mocklog);
178     # INFO: Done(firefox-78.0-2.fc33.src.rpm) Config(fedora-rawhide-x86_64) 288 minutes 35 seconds
179     my $t;
180     $t=$1*60+$2 while $f=~/\nINFO: Done[(][^\n]*[)] (\d+) minutes (\d+) seconds\n/g;
181     defined $t or die $mocklog;
182     writefile $mocklogtime,"$t\n";
183     return $t;
184   }
185   $dwztime+=onemocklog "$srcrpm.mocklog";
186   $dttime+=onemocklog "$srcrpm.dt.rpm.mocklog";
187 }
188 print "dwztime=$dwztime dttime=$dttime = ".sprintf("%.2f",$dwztime/$dttime*100)."%\n";