#!/usr/bin/env python
#-*- coding: iso8859-15 -*-

# limpiar_distfiles  0.2
# Autor: Rafael Antonio Porras Samaniego
# 	rafa (en) distrobit (punto) net
#
# Testeo y pruebas: Daniel Plaza


# Cargar los paquetes necesarios
try:
	import os,sys,bz2,getopt
	from bz2 import BZ2File
except:
	print "Error al cargar los paquetes necesarios. No se pudo continuar."

# Los colores
sys.path = ["/usr/lib/portage/pym"]+sys.path
try:
	import portage,output
except:
	print "Error al cargar los paquetes necesarios. No se pudo continuar."
			

# Constantes
DIR = "/var/db/pkg"
distfiles = "/usr/portage/distfiles"


# Localiza los ficheros a proteger		
def ficheros_programa (dir):
	total = []

	# Primero se buscan  todos los ebuilds instalados
	for categoria in os.listdir(dir):
		ruta_categoria = dir + "/" + categoria
		if os.path.isdir(ruta_categoria):
			for programa in os.listdir(ruta_categoria):
				ruta_programa = ruta_categoria + "/" + programa
				if os.path.isdir(ruta_programa) and os.path.isfile(ruta_programa + "/environment.bz2"):
					ebz2 = BZ2File (ruta_programa + "/environment.bz2",'r')
					temp = ebz2.readline()[2:]
					if temp[0] == "'":
						for i in temp[1:-2].split():
							total.append(i)
					else:
						total.append(temp[:-1])
	
	return total

# Muestra una lista por pantalla
def muestra(lista):
	lista.sort()
	for i in lista:
		print i
		
# Busca los ficheros que se van a borrar
def lista_borrar (protegidos, ruta):
	a_borrar = []
	for fichero in os.listdir(ruta):
		if fichero not in protegidos and not os.path.isdir(ruta + "/" + fichero):
			a_borrar.append(fichero)
	
	return a_borrar
		

# Borra los ficheros que no estén en la lista en la ruta indicada
def borrar (ruta,a_borrar):
	for i in a_borrar:
		try:
			os.remove (ruta + "/" + i)
		except:
			print "No se pudo eliminar: " + i
			continue
		print "Se ha eliminado: " + i


# Comenzamos
opts, args = getopt.getopt(sys.argv[1:], "f")
borrado = False
for o, a in opts:
	if o == "-f":
		borrado = True
	

# Mensaje de bienvenida
print "\n\t" + output.green ("limpiar_distfiles 0.2")
print "\nDudas y errores a: rafa (en) distrobit (punto) net"
print "\nEste script localiza ficheros en " + output.red(distfiles) + " que no son necesarios para ningún ebuild que esté instalado. Use este script bajo su propia responsabilidad. Espere mientras se localizan los ficheros que se borrarán..."

# Localizamos los ficheros
total = ficheros_programa(DIR)

# Mostramos los ficheros a borrar
a_borrar = lista_borrar (total, distfiles)
if not a_borrar:
	print "\nNo hay archivos que eliminar."
	sys.exit(0)
	
print "\nLos siguiente ficheros se eliminarán:\n"	
muestra(a_borrar)

# Informar de como borrar
if not borrado:
	print "\nSi desea borrar esos ficheros, ejecute este script con el parámetro: " + output.red("-f") + "."
	sys.exit(0)

# Borrar los ficheros
print "\nA continuación procederá a limpiarse el directorio " + output.red(distfiles) + " de ficheros obsoletos." + \
" Es decir, se eliminarán todos aquellos que estén en la lista previamente mostrada."
res = raw_input(output.red("¿Desea continuar? (si / no) "))
if res == 's' or res == 'S' or res =='si' or res == 'Si':
	print "Borrando ficheros:"
	borrar(distfiles,a_borrar)
else:
	print "No se ha borrado ningún fichero."

