mirror of
https://github.com/captn3m0/Scripts.git
synced 2024-09-29 22:04:01 +00:00
106 lines
3.3 KiB
Python
106 lines
3.3 KiB
Python
|
#!/usr/bin/env python
|
||
|
'''
|
||
|
http://ubuntuforums.org/showthread.php?t=1154940&highlight=get_dependencies
|
||
|
'''
|
||
|
|
||
|
import sys
|
||
|
from subprocess import Popen,PIPE,STDOUT
|
||
|
|
||
|
|
||
|
__usage__='''
|
||
|
compute_total_pkg_size.py emacs
|
||
|
'''
|
||
|
|
||
|
pkg=sys.argv[1]
|
||
|
|
||
|
|
||
|
def report_lines(alist,max_len,vdiv,hline):
|
||
|
'''
|
||
|
alist is a list of tuples
|
||
|
report_lines returns a list of strings
|
||
|
'''
|
||
|
result=[]
|
||
|
svs=' '+vdiv+' '
|
||
|
for row in alist:
|
||
|
if row[0]=='-':
|
||
|
line_string=hline
|
||
|
else:
|
||
|
data_justified=[str(elt).rjust(num) for elt,num in zip(row,max_len)]
|
||
|
data_svs=svs.join(data_justified)
|
||
|
line_list=[vdiv,data_svs,vdiv]
|
||
|
line_string=' '.join(line_list)
|
||
|
result.append(line_string)
|
||
|
return result
|
||
|
|
||
|
def report_table(alist,corner='+',hdiv='-',vdiv='|',header=True):
|
||
|
max_len=max_col_len(alist)
|
||
|
hline_l=[corner,
|
||
|
corner.join([hdiv.ljust(max_num+2,hdiv)
|
||
|
for max_num in max_len]),
|
||
|
corner]
|
||
|
hline=''.join(hline_l)
|
||
|
result=report_lines(alist,max_len,vdiv,hline)
|
||
|
if header:
|
||
|
new_result=[hline,result[0],hline,]
|
||
|
new_result.extend(result[1:])
|
||
|
else:
|
||
|
new_result=[hline,]
|
||
|
new_result.extend(result)
|
||
|
new_result.append(hline)
|
||
|
result='\n'.join(new_result)+'\n'
|
||
|
return result
|
||
|
|
||
|
def max_col_len(alist):
|
||
|
return [max([len(str(elt)) for elt in column]) for column in zip(*alist)]
|
||
|
|
||
|
def find_installed():
|
||
|
'''
|
||
|
Returns a list of all the packages installed on the computer
|
||
|
'''
|
||
|
proc=Popen("dpkg --get-selections | awk '/install/{print $1}'",
|
||
|
shell=True, stdout=PIPE, stderr=open('/dev/null'),)
|
||
|
return proc.communicate()[0].split()
|
||
|
|
||
|
def get_size(pkg):
|
||
|
'''
|
||
|
Returns (download size, installed size) in KiB
|
||
|
'''
|
||
|
cmd='apt-cache show %s'%pkg
|
||
|
proc=Popen(cmd, shell=True, stdout=PIPE, )
|
||
|
size=0
|
||
|
install_size=0
|
||
|
for line in proc.communicate()[0].split('\n'):
|
||
|
if line.startswith('Size: '):
|
||
|
size=line.split()[-1]
|
||
|
elif line.startswith('Installed-Size: '):
|
||
|
install_size=line.split()[-1]
|
||
|
return (int(size)/1024,int(install_size))
|
||
|
|
||
|
def get_dependencies(pkg):
|
||
|
'''
|
||
|
Returns all the (recursive) dependencies of a package
|
||
|
'''
|
||
|
cmd='apt-rdepends -s=DEPENDS %s'%pkg
|
||
|
proc=Popen(cmd, shell=True, stdout=PIPE, )
|
||
|
return proc.communicate()[0].strip().split('\n')
|
||
|
|
||
|
deps=get_dependencies(pkg)
|
||
|
installed_packages=find_installed()
|
||
|
needed_packages=list(set(deps)-set(installed_packages))
|
||
|
(sizes_dep,sizes_dep_installed)=zip(*[get_size(pkg) for pkg in deps])
|
||
|
(sizes_needed,sizes_needed_installed)=zip(*[get_size(pkg) for pkg in needed_packages])
|
||
|
data=[('Package (*=needed)','Download size (KiB)','Installed size (KiB)')]
|
||
|
for apkg,size,install_size in zip(deps,sizes_dep,sizes_dep_installed):
|
||
|
if apkg in needed_packages:
|
||
|
data.append(('%s *'%apkg,size,install_size))
|
||
|
else:
|
||
|
data.append((apkg,size,install_size))
|
||
|
print(report_table(data))
|
||
|
|
||
|
data=[('','Sizes (KiB)')]
|
||
|
data.append(('Total download size',sum(sizes_dep)))
|
||
|
data.append(('Total installed size',sum(sizes_dep_installed)))
|
||
|
data.append(('Total download size needed',sum(sizes_needed)))
|
||
|
data.append(('Total installed size needed',sum(sizes_needed_installed)))
|
||
|
print(report_table(data))
|