#!/usr/bin/env python

import os
import sys
import shutil
import subprocess

arch = 'x86_64'

# create a dictionary of pkg name->pkgfile.
def get_lookup(dir):
	# initial variables
	pkg_lookup = {}
	# read the directory and parse the files
	dir = [x for x in os.listdir(dir) if x.endswith('.pkg.tar.gz')]
	for pkg in dir:
		name = pkg.replace('-%s.pkg.tar.gz' % arch, '')
		name = name.rsplit('-',2)[0]
		pkg_lookup.setdefault(name,[])
		pkg_lookup[name].append(pkg)
	# sort the pkgs
	for name, files in pkg_lookup.iteritems():
		files.sort(key=get_ver,
				cmp=lambda x,y: cmp(x[:-1], y[:-1]) or x[-1]-y[-1],
				reverse=False)
	return pkg_lookup

def get_ver(fname, str=False):
	ver = fname.replace('.pkg.tar.gz', '')
	ver = ver.replace('-%s' % arch, '')
	ver = ver.rsplit('-',2)[1:]
	if str:
		return '-'.join(ver)
	ver = ver.pop(0).split('.') + ver
	ver = [int(x) for x in ver if x.isdigit()]
	return ver

if __name__ == '__main__':
	dir = '/var/cache/pacman/pkg'
	pkg_lookup = get_lookup(dir)
	deltas_size = {}
	for pkg, files in pkg_lookup.iteritems():
		last = None
		if len(files) == 1:
			continue
		deltas = []
		for file in files:
			if not last:
				last = file
				continue
			ver_last = get_ver(last,1)
			ver_file = get_ver(file,1)
			delta_file =  '%s-%s_to_%s-%s.delta' % (pkg, ver_last, ver_file, arch)
			deltas.append(delta_file)
			#print 'creating:', delta_file
			full_last = '%s/%s' % (dir,last)
			full_file = '%s/%s' % (dir,file)
			subprocess.call(['xdelta3', '-q','-f','-s',full_last, full_file, delta_file])
			last = file
		#print 'copying %s' % last
		#shutil.copy('%s/%s' % (dir,last), '.')
		pkgsize = os.path.getsize('%s/%s' % (dir,last))
		for delta in deltas:
			deltasize = os.path.getsize(delta)
			percent = deltasize * 100 / pkgsize
			deltas_size.setdefault(percent,[])
			deltas_size[percent].append(delta)
	percents = deltas_size.keys()
	percents.sort()
	for percent in percents:
		for delta in deltas_size[percent]:
			print '%d%% : %s' % (percent,delta)
	

