#!/usr/bin/python2.7 # -*- coding: utf-8 -*- # Copyright (C) 2010, 2012 Canonical Ltd. # Author: Martin Pitt # 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; version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Do a size comparison of the files on two ISOs. This can be used to find out # which packages were added, removed, and significantly changed in size between # two releases or daily builds. Note that this only really works for # alternates, since desktop CDs by and large just have one big squashfs image. from __future__ import print_function import subprocess import sys def deb_size_map(iso_path): map = {} # package -> (version, size) isoinfo = subprocess.Popen( ['isoinfo', '-lR', '-i', iso_path], stdout=subprocess.PIPE, universal_newlines=True) out = isoinfo.communicate()[0] assert isoinfo.returncode == 0 for l in out.splitlines(): l = l.strip() if not l.endswith('.deb'): continue fields = l.split() size = int(fields[4]) fname = fields[11] (pkg, version, _) = fname.split('_') map[pkg] = (version, size) return map # # main # if len(sys.argv) != 3: print('Usage: %s ' % sys.argv[0], file=sys.stderr) sys.exit(1) old_map = deb_size_map(sys.argv[1]) new_map = deb_size_map(sys.argv[2]) print('== Removed packages ==') sum = 0 for p, (v, s) in old_map.iteritems(): if p not in new_map: print('%s (%.1f MB)' % (p, s / 1000000.)) sum += s print('TOTAL: -%.1f MB' % (sum / 1000000.)) sum = 0 print('\n== Added packages ==') for p, (v, s) in new_map.iteritems(): if p not in old_map: print('%s (%.1f MB)' % (p, s / 1000000.)) sum += s print('TOTAL: +%.1f MB' % (sum / 1000000.)) print('\n== Changed packages ==') sum = 0 for p, (v, s) in old_map.iteritems(): if p not in new_map: continue new_s = new_map[p][1] sum += new_s - s # only show differences > 100 kB to filter out noise if new_s - s > 100000: print('%s (Δ %.1f MB - %s: %.1f MB %s: %.1f MB)' % ( p, (new_s - s) / 1000000., v, s / 1000000., new_map[p][0], new_s / 1000000.)) print('TOTAL difference: %.1f MB' % (sum / 1000000.))