mirror of
				https://github.com/Rockbox/rockbox.git
				synced 2025-10-29 00:36:22 -04:00 
			
		
		
		
	Change-Id: Id7f4717d51ed02d67cb9f9cb3c0ada4a81843f97 Reviewed-on: http://gerrit.rockbox.org/137 Reviewed-by: Nils Wallménius <nils@rockbox.org> Tested-by: Nils Wallménius <nils@rockbox.org>
		
			
				
	
	
		
			161 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/python
 | |
| # -*- coding: utf8 -*-
 | |
| #             __________               __   ___.
 | |
| #   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 | |
| #   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 | |
| #   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 | |
| #   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 | |
| #                     \/            \/     \/    \/            \/
 | |
| #
 | |
| # Copyright © 2010 Rafaël Carré <rafael.carre@gmail>
 | |
| #
 | |
| # This program is free software; you can redistribute it and/or
 | |
| # modify it under the terms of the GNU General Public License
 | |
| # as published by the Free Software Foundation; either version 2
 | |
| # of the License, or (at your option) any later version.
 | |
| #
 | |
| # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 | |
| # KIND, either express or implied.
 | |
| #
 | |
| 
 | |
| # TODO: iram
 | |
| 
 | |
| import sys
 | |
| import os
 | |
| import re
 | |
| import stat
 | |
| import fnmatch
 | |
| 
 | |
| 
 | |
| def percent_diff(old, new):
 | |
|     if old == 0:
 | |
|         return '?'
 | |
|     diff = 100.0*(new-old)/old
 | |
|     return format(diff, '+2.2f') + '%'
 | |
| 
 | |
| 
 | |
| def find_map(dir):
 | |
|     dirs = []
 | |
|     for file in os.listdir(dir):
 | |
|         path = os.path.join(dir, file)
 | |
|         if stat.S_ISDIR(os.stat(path).st_mode) != 0:
 | |
|             dirs += find_map(path)
 | |
|         elif fnmatch.fnmatch(file, '*.map'):
 | |
|             dirs += [path]
 | |
|     return dirs
 | |
| 
 | |
| 
 | |
| def rb_version(dir):
 | |
|     info = os.path.join(dir, 'rockbox-info.txt')
 | |
|     if not os.path.lexists(info):
 | |
|         return 'unknown'
 | |
|     info = open(info).read()
 | |
|     s = re.search('^Version: .*', info, re.MULTILINE)
 | |
|     if not s:
 | |
|         return 'unknown'
 | |
|     return re.sub('^Version: ', '', info[s.start():s.end()])
 | |
| 
 | |
| 
 | |
| def map_info(map):
 | |
|     file = os.path.basename(map)
 | |
|     name = file.rsplit('.map', 1)[0]
 | |
| 
 | |
|     # ignore ape-pre map, used to fill IRAM
 | |
|     if name == 'ape-pre':
 | |
|         return None
 | |
| 
 | |
|     # ignore overlays
 | |
|     ovlmap = os.path.join(os.path.dirname(map), name, file)
 | |
|     if os.path.lexists(ovlmap):
 | |
|         return None
 | |
| 
 | |
|     f = open(map).read() # read map content
 | |
| 
 | |
|     s = re.search('^PLUGIN_RAM *0x(\d|[abcdef])*', f, re.MULTILINE)
 | |
|     if not s: return (name, 0)
 | |
|     plugin_start = re.sub('^PLUGIN_RAM *0x0*', '', f[s.start():s.end()])
 | |
| 
 | |
|     s = re.search('^\.pluginend *0x(\d|[abcdef])*', f, re.MULTILINE)
 | |
|     if not s: return (name, 0)
 | |
|     plugin_end   = re.sub('^\.pluginend *0x0*', '', f[s.start():s.end()])
 | |
| 
 | |
|     size = int(plugin_end, 16) - int(plugin_start, 16)
 | |
|     return (name, size)
 | |
| 
 | |
| 
 | |
| def get_new(oldinfo, newinfo, name):
 | |
|     i = 0
 | |
|     while i < len(oldinfo) and i < len(newinfo):
 | |
|         if newinfo[i][0] == name:
 | |
|             return newinfo[i]
 | |
|         i += 1
 | |
|     return None
 | |
| 
 | |
| 
 | |
| def compare(olddir, newdir, oldver, newer):
 | |
|     oldinfo = []
 | |
|     for map in find_map(olddir):
 | |
|         info = map_info(map)
 | |
|         if info:
 | |
|             oldinfo += [info]
 | |
| 
 | |
|     newinfo = []
 | |
|     for map in find_map(newdir):
 | |
|         info = map_info(map)
 | |
|         if info:
 | |
|             newinfo += [info]
 | |
| 
 | |
|     oldinfo.sort()
 | |
|     newinfo.sort()
 | |
| 
 | |
|     diff = []
 | |
|     longest_name = 0
 | |
|     for (name, old_size) in oldinfo:
 | |
|         new = get_new(oldinfo, newinfo, name)
 | |
|         if not new:
 | |
|             continue
 | |
|         (name, new_size) = new
 | |
|         if len(name) > longest_name:
 | |
|             longest_name = len(name)
 | |
|         diff += [(name, new_size - old_size, old_size)]
 | |
| 
 | |
|     spacelen = (longest_name + 3)
 | |
| 
 | |
|     print(' ' * spacelen + oldver + '\t\t' + newver + '\n')
 | |
| 
 | |
|     for (name, diff, old_size) in diff:
 | |
|         space = ' ' * (longest_name - len(name) + 3)
 | |
|         new_size = old_size + diff
 | |
|         pdiff = percent_diff(old_size, new_size)
 | |
|         diff = str(diff)
 | |
|         if diff[0] != '-':
 | |
|             diff = '+' + diff
 | |
| 
 | |
|         print(name + space + str(old_size) + '\t' + diff + \
 | |
|             '\t=\t' + str(new_size) + '\t-->\t' + pdiff)
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| ### main
 | |
| 
 | |
| 
 | |
| if len(sys.argv) != 3:
 | |
|     print('Usage: ' + sys.argv[0] + ' build-old build-new')
 | |
|     sys.exit(1)
 | |
| 
 | |
| oldver = rb_version(sys.argv[1])
 | |
| newver = rb_version(sys.argv[2])
 | |
| 
 | |
| oldplugindir = sys.argv[1] + '/apps/plugins'
 | |
| newplugindir = sys.argv[2] + '/apps/plugins'
 | |
| oldcodecsdir = sys.argv[1] + '/lib/rbcodec/codecs'
 | |
| newcodecsdir = sys.argv[2] + '/lib/rbcodec/codecs'
 | |
| 
 | |
| if os.path.lexists(oldplugindir) and os.path.lexists(newplugindir):
 | |
|     compare(oldplugindir, newplugindir, oldver, newver)
 | |
| 
 | |
| print('\n\n\n')
 | |
| 
 | |
| if os.path.lexists(oldcodecsdir) and os.path.lexists(newcodecsdir):
 | |
|     compare(oldcodecsdir, newcodecsdir, oldver, newver)
 |