| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | 
							- #!/usr/bin/perl -w
 - # usage:
 - # [somebody@somewhere ~/ipxe/src]$ ./util/diffsize.pl [<old rev> [<new rev>]]
 - # by default <old rev> is HEAD and <new rev> is the working tree
 - 
 - use strict;
 - 
 - -d "bin" or die "Please run me in the iPXE src directory\n";
 - mkdir ".sizes";
 - 
 - my($oldrev, $newrev);
 - my($oldname, $newname);
 - 
 - if (@ARGV) {
 -   $oldname = shift;
 - } else {
 -   $oldname = "HEAD";
 - }
 - 
 - if (@ARGV) {
 -   $newname = shift;
 - } else {
 -   $newrev = "tree" . time();
 - }
 - 
 - $oldrev = `git rev-parse $oldname`;
 - chomp $oldrev;
 - 
 - unless (defined $newrev) {
 -   $newrev = `git rev-parse $newname`;
 -   chomp $newrev;
 - }
 - 
 - sub calc_sizes($$) {
 -   my($name, $rev) = @_;
 -   my $output;
 -   my $lastrev;
 -   my $stashed = 0;
 -   my $res = 0;
 - 
 -   return if -e ".sizes/$rev.sizes";
 - 
 -   if (defined $name) {
 -     $output = `git stash`;
 -     $stashed = 1 unless $output =~ /No local changes to save/;
 -     $lastrev = `git name-rev --name-only HEAD`;
 -     system("git checkout $name >/dev/null"); $res ||= $?;
 -   }
 - 
 -   system("make -j4 bin/ipxe.lkrn >/dev/null"); $res ||= $?;
 -   system("make bin/ipxe.lkrn.sizes > .sizes/$rev.sizes"); $res ||= $?;
 - 
 -   if (defined $name) {
 -     system("git checkout $lastrev >/dev/null"); $res ||= $?;
 -     system("git stash pop >/dev/null") if $stashed; $res ||= $?;
 -   }
 - 
 -   if ($res) {
 -     unlink(".sizes/$rev.sizes");
 -     die "Error making sizes file\n";
 -   }
 - }
 - 
 - our %Sizes;
 - 
 - sub save_sizes($$) {
 -   my($id, $rev) = @_;
 -   my $file = ".sizes/$rev.sizes";
 - 
 -   open SIZES, $file or die "opening $file: $!\n";
 -   while (<SIZES>) {
 -     my($text, $data, $bss, $total, $hex, $name) = split;
 -     $name =~ s|bin/||; $name =~ s|\.o$||;
 - 
 -     # Skip the header and totals lines
 -     next if $total =~ /[a-z]/ or $name =~ /TOTALS/;
 - 
 -     # Skip files named with dash, due to old Makefile bug
 -     next if $name =~ /-/;
 - 
 -     $Sizes{$name} = {old => 0, new => 0} unless exists $Sizes{$name};
 -     $Sizes{$name}{$id} = $total;
 -   }
 - }
 - 
 - calc_sizes($oldname, $oldrev);
 - calc_sizes($newname, $newrev);
 - 
 - save_sizes('old', $oldrev);
 - save_sizes('new', $newrev);
 - 
 - my $total = 0;
 - 
 - for (sort keys %Sizes) {
 -   my $diff = $Sizes{$_}{new} - $Sizes{$_}{old};
 -   if (abs($diff) >= 16) {
 -     printf "%12s %+d\n", substr($_, 0, 12), $Sizes{$_}{new} - $Sizes{$_}{old};
 -   }
 -   $total += $diff;
 - }
 - printf "      TOTAL: %+d\n", $total;
 
 
  |