4 # Open \______ \ ____ ____ | | _\_ |__ _______ ___
5 # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
6 # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
7 # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 # Copyright © 2010 Rafaël Carré <rafael.carre@gmail>
12 # This program is free software; you can redistribute it and/or
13 # modify it under the terms of the GNU General Public License
14 # as published by the Free Software Foundation; either version 2
15 # of the License, or (at your option) any later version.
17 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 # KIND, either express or implied.
30 def percent_diff(old
, new
):
33 diff
= 100.0*(new
-old
)/old
34 return format(diff
, '+2.2f') + '%'
39 for file in os
.listdir(dir):
40 path
= os
.path
.join(dir, file)
41 if stat
.S_ISDIR(os
.stat(path
).st_mode
) != 0:
42 dirs
+= find_map(path
)
43 elif fnmatch
.fnmatch(file, '*.map'):
49 info
= os
.path
.join(dir, 'rockbox-info.txt')
50 if not os
.path
.lexists(info
):
52 info
= open(info
).read()
53 s
= re
.search('^Version: .*', info
, re
.MULTILINE
)
56 return re
.sub('^Version: ', '', info
[s
.start():s
.end()])
60 file = os
.path
.basename(map)
61 name
= file.rsplit('.map', 1)[0]
63 # ignore ape-pre map, used to fill IRAM
68 ovlmap
= os
.path
.join(os
.path
.dirname(map), name
, file)
69 if os
.path
.lexists(ovlmap
):
72 f
= open(map).read() # read map content
74 s
= re
.search('^PLUGIN_RAM *0x(\d|[abcdef])*', f
, re
.MULTILINE
)
75 plugin_start
= re
.sub('^PLUGIN_RAM *0x0*', '', f
[s
.start():s
.end()])
77 s
= re
.search('^\.pluginend *0x(\d|[abcdef])*', f
, re
.MULTILINE
)
78 plugin_end
= re
.sub('^\.pluginend *0x0*', '', f
[s
.start():s
.end()])
80 size
= int(plugin_end
, 16) - int(plugin_start
, 16)
84 def get_new(oldinfo
, newinfo
, name
):
86 while i
< len(oldinfo
) and i
< len(newinfo
):
87 if newinfo
[i
][0] == name
:
93 def compare(olddir
, newdir
, oldver
, newer
):
95 for map in find_map(olddir
):
101 for map in find_map(newdir
):
111 for (name
, old_size
) in oldinfo
:
112 new
= get_new(oldinfo
, newinfo
, name
)
115 (name
, new_size
) = new
116 if len(name
) > longest_name
:
117 longest_name
= len(name
)
118 diff
+= [(name
, new_size
- old_size
, old_size
)]
120 spacelen
= (longest_name
+ 3)
122 print(' ' * spacelen
+ oldver
+ '\t\t' + newver
+ '\n')
124 for (name
, diff
, old_size
) in diff
:
125 space
= ' ' * (longest_name
- len(name
) + 3)
126 new_size
= old_size
+ diff
127 pdiff
= percent_diff(old_size
, new_size
)
132 print(name
+ space
+ str(old_size
) + '\t' + diff
+ \
133 '\t=\t' + str(new_size
) + '\t-->\t' + pdiff
)
141 if len(sys
.argv
) != 3:
142 print('Usage: ' + sys
.argv
[0] + ' build-old build-new')
145 oldver
= rb_version(sys
.argv
[1])
146 newver
= rb_version(sys
.argv
[2])
148 oldplugindir
= sys
.argv
[1] + '/apps/plugins'
149 newplugindir
= sys
.argv
[2] + '/apps/plugins'
150 oldcodecsdir
= sys
.argv
[1] + '/apps/codecs'
151 newcodecsdir
= sys
.argv
[2] + '/apps/codecs'
153 if os
.path
.lexists(oldplugindir
) and os
.path
.lexists(newplugindir
):
154 compare(oldplugindir
, newplugindir
, oldver
, newver
)
158 if os
.path
.lexists(oldcodecsdir
) and os
.path
.lexists(newcodecsdir
):
159 compare(oldcodecsdir
, newcodecsdir
, oldver
, newver
)