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