1 | #!/usr/bin/perl -w |
---|
2 | # usage: |
---|
3 | # [somebody@somewhere ~/gpxe/src]$ ./util/diffsize.pl [<old rev> [<new rev>]] |
---|
4 | # by default <old rev> is HEAD and <new rev> is the working tree |
---|
5 | |
---|
6 | use strict; |
---|
7 | |
---|
8 | -d "bin" or die "Please run me in the gPXE src directory\n"; |
---|
9 | mkdir ".sizes"; |
---|
10 | |
---|
11 | my($oldrev, $newrev); |
---|
12 | my($oldname, $newname); |
---|
13 | |
---|
14 | if (@ARGV) { |
---|
15 | $oldname = shift; |
---|
16 | } else { |
---|
17 | $oldname = "HEAD"; |
---|
18 | } |
---|
19 | |
---|
20 | if (@ARGV) { |
---|
21 | $newname = shift; |
---|
22 | } else { |
---|
23 | $newrev = "tree" . time(); |
---|
24 | } |
---|
25 | |
---|
26 | $oldrev = `git rev-parse $oldname`; |
---|
27 | chomp $oldrev; |
---|
28 | |
---|
29 | unless (defined $newrev) { |
---|
30 | $newrev = `git rev-parse $newname`; |
---|
31 | chomp $newrev; |
---|
32 | } |
---|
33 | |
---|
34 | sub calc_sizes($$) { |
---|
35 | my($name, $rev) = @_; |
---|
36 | my $output; |
---|
37 | my $lastrev; |
---|
38 | my $stashed = 0; |
---|
39 | my $res = 0; |
---|
40 | |
---|
41 | return if -e ".sizes/$rev.sizes"; |
---|
42 | |
---|
43 | if (defined $name) { |
---|
44 | $output = `git stash`; |
---|
45 | $stashed = 1 unless $output =~ /No local changes to save/; |
---|
46 | $lastrev = `git name-rev --name-only HEAD`; |
---|
47 | system("git checkout $name >/dev/null"); $res ||= $?; |
---|
48 | } |
---|
49 | |
---|
50 | system("make -j4 bin/gpxe.lkrn >/dev/null"); $res ||= $?; |
---|
51 | system("make bin/gpxe.lkrn.sizes > .sizes/$rev.sizes"); $res ||= $?; |
---|
52 | |
---|
53 | if (defined $name) { |
---|
54 | system("git checkout $lastrev >/dev/null"); $res ||= $?; |
---|
55 | system("git stash pop >/dev/null") if $stashed; $res ||= $?; |
---|
56 | } |
---|
57 | |
---|
58 | if ($res) { |
---|
59 | unlink(".sizes/$rev.sizes"); |
---|
60 | die "Error making sizes file\n"; |
---|
61 | } |
---|
62 | } |
---|
63 | |
---|
64 | our %Sizes; |
---|
65 | |
---|
66 | sub save_sizes($$) { |
---|
67 | my($id, $rev) = @_; |
---|
68 | my $file = ".sizes/$rev.sizes"; |
---|
69 | |
---|
70 | open SIZES, $file or die "opening $file: $!\n"; |
---|
71 | while (<SIZES>) { |
---|
72 | my($text, $data, $bss, $total, $hex, $name) = split; |
---|
73 | $name =~ s|bin/||; $name =~ s|\.o$||; |
---|
74 | |
---|
75 | # Skip the header and totals lines |
---|
76 | next if $total =~ /[a-z]/ or $name =~ /TOTALS/; |
---|
77 | |
---|
78 | # Skip files named with dash, due to old Makefile bug |
---|
79 | next if $name =~ /-/; |
---|
80 | |
---|
81 | $Sizes{$name} = {old => 0, new => 0} unless exists $Sizes{$name}; |
---|
82 | $Sizes{$name}{$id} = $total; |
---|
83 | } |
---|
84 | } |
---|
85 | |
---|
86 | calc_sizes($oldname, $oldrev); |
---|
87 | calc_sizes($newname, $newrev); |
---|
88 | |
---|
89 | save_sizes('old', $oldrev); |
---|
90 | save_sizes('new', $newrev); |
---|
91 | |
---|
92 | my $total = 0; |
---|
93 | |
---|
94 | for (sort keys %Sizes) { |
---|
95 | my $diff = $Sizes{$_}{new} - $Sizes{$_}{old}; |
---|
96 | if (abs($diff) >= 16) { |
---|
97 | printf "%12s %+d\n", substr($_, 0, 12), $Sizes{$_}{new} - $Sizes{$_}{old}; |
---|
98 | } |
---|
99 | $total += $diff; |
---|
100 | } |
---|
101 | printf " TOTAL: %+d\n", $total; |
---|