#!/bin/sh
#
# backport.sh
# Version: 0.51
#
#
# 0.5, incorporada operación automática, sin detenerse (switch: auto)
# 0.51 ahora muestra todas las versiones de fuentes disponibles
#
# Para Musix GNU+Linux
# (C) 2008 by Marcos Guglielmetti under GNU GPL v3 or later
#
#
# Crea paquetes "backport" sobre un nombre de paquete que se le pasa
# en la línea de comandos, al estilo:
# backport.sh muse
# Eso sirve para utilizar programas actualizados a las últimas versiones
# de debian/unstable en nuestro debian/stable
# El usuario debe ser root
# 

# TODO: resolver el tema de las claves gpg y de la detección de
# los repos en sources.list... entre otras cosas

# Con información tomada de
# DE: http://musix.org.ar/wiki/index.php/Como_hacer_un_backport_en_Debian


#1- Añadir el repositorio de fuentes de Unstable o Testing , dependiendo de lo que se quiera , por ejemplo

# ANSI COLORS
CRE="
[K"
NORMAL="[0;39m"
# RED: Failure or error message
RED="[1;31m"
# GREEN: Success message
GREEN="[1;32m"
# YELLOW: Descriptions
YELLOW="[1;33m"
# BLUE: System messages
BLUE="[1;34m"
# MAGENTA: Found devices or drivers
MAGENTA="[1;35m"
# CYAN: Questions
CYAN="[1;36m"
# BOLD WHITE: Hint
WHITE="[1;37m"



paquete=$1

# TODO: testear y mejorar esto si es necesario: no encontrará versión
# la primer vez si no hacemos apt-get update antes
versionactual=`apt-cache policy $paquete | head -2 | tail -1`
versioncandidata=`apt-cache showsrc $paquete | grep Version | grep -v Stand | grep -v "Python-Version"` # | tail -1`



echo "Crea paquetes backport sobre un nombre de paquete que se le pasa
 en la línea de comandos, al estilo:
 backport.sh muse
 Eso sirve para utilizar programas actualizados a las últimas versiones
 de debian/unstable en nuestro debian/stable
 El usuario debe ser root

Paquete pasado en línea de comandos: $YELLOW  $paquete $NORMAL

La versión actual en el sistema es: $versionactual , la versión candidata disponible como código fuente es $versioncandidata

Para operar automáticamente, escribe: backport.sh nombre_paquete auto

Presiona $YELLOW [enter] $NORMAL para continuar,$RED Control+C $NORMAL para abortar"

if [ "$2" = "auto" ]
then
echo "operando automaticamente, sin detenerme"
else
# espera al usuario
read
fi

# TODO: mejorar esto: tiene que fijarse si las líneas no están comentadas con un #, es decir, deshabilitadas
cat /etc/apt/sources.list | grep "unstable main"
if [ "$?" = "1" ]
then
echo "$RED Adding unstable main sources to /etc/apt/sources.list $NORMAL"
#echo  'deb-src http://ftp.fi.debian.org/debian/ unstable main' >> /etc/apt/sources.list
echo  'deb ftp://ftp.fr.debian.org/debian unstable main' >> /etc/apt/sources.list


else
echo "$BLUE Found: unstable main sources on /etc/apt/sources.list $NORMAL"
fi

echo "# Ahora controlamos si algunas están deshabilitadas"
# Ahora controlamos si algunas están deshabilitadas
cat /etc/apt/sources.list | grep src | grep "unstable main" | grep "#"
if [ "$?" = "0" ]
then
echo "$RED Algunas líneas de repositorios unstables para fuentes en sources.list están deshabilitadas.
Por favor, remueve los # en /etc/apt/sources.list antes de continuar $NORMAL

$YELLOW [Enter] $NORMAL para continuar, $RED Control+C $NORMAL para abortar"
if [ "$2" = "auto" ]
then
echo "operando automaticamente, sin detenerme"
else
# espera al usuario
read
fi

fi


echo "$BLUE Actualizar base de datos de paquetes disponibles $NORMAL (s/n)"
if [ "$2" = "auto" ]
then
echo "operando automaticamente, sin detenerme"
else
# espera al usuario
read sn
fi

if [ "$sn" = "s" ]
then
#2- Actualizar . 
apt-get update
fi


#Si da problemas con las claves y ese lio , con esto debería solucionarse :

echo "$CYAN Intentanto obtener llaves gpg $NORMAL"

sudo gpg --keyserver www.keys.eu.pgp.net --recv-keys A70DAF536070D3A1
sudo gpg --armor --export A70DAF536070D3A1 | sudo apt-key add -

#Si no se usa sudo habrá que hacerlo como root.


#3- Instalar las herramientas para compilar ( no sé si estarán todas ahí ) :

echo "$YELLOW Asegurando que exista un entorno de compilación $NORMAL"

apt-get -y --force-yes install  devscripts build-essential fakeroot dh-make

#4- Luego se instalan las dependencias del paquete que se quiera compilar con :

echo "$MAGENTA Descargando dependencias de desarrollo del paquete $paquete $NORMAL"
apt-get -y --force-yes build-dep $paquete
#aptitude -y build-dep $paquete

if [ "$?" = "0" ]
then
echo "$BLUE: dependencias obtenidas, ahora descargaremos el código fuente y compilaremos $NORMAL"
else
echo "$RED ERROR: No pude obtener las dependencias. Controlar sources.list. Debe existir un repositorio con fuentes comenzando con deb-src, y debe pertenecer a la rama unstable $NORMAL

Quizá no sea posible realizar un backport: no en todos los casos
los backports son posibles.

Consultar:

http://musix.org.ar/wiki/index.php/Como_hacer_un_backport_en_Debian
"
fi



#5- Lo siguiente es obetener el código fuente de los repositorios

echo "$MAGENTA Descargando el código fuente del paquete: $paquete $NORMAL"

apt-get -y --force-yes source $paquete
if [ "$?" = "0" ]
then
echo "$BLUE: Código fuente obtenido, ahora compilaremos $NORMAL"
else
echo "$RED ERROR: No pude obtener las fuentes. Controlar sources.list. Debe existir un repositorio con fuentes comenzando con deb-src, y debe pertenecer a la rama unstable $NORMAL

Quizá la acción solicitada no sea posible.
"
fi



#6- Mudarse al directorio del paquete

 

# si el paquete es un -dev, no encontrará el directorio bien, por lo
# cual habría que: detectar si es un -dev, cortarlo antes del -
# y hacer algo así:

#ls -d $paquete*| sort -d | grep -v "\.gz" | grep -v "\.dsc" | grep -v "\.deb"

echo $paquete | grep "\-dev" > /dev/null
if [ "$?" = "0" ]
then
# cortando la parte posterior a - o sea dev.
paquete=`echo $paquete | cut -f1 -d"-"`
fi




directorio=`ls -d $paquete* | head -1`


echo $directorio | grep "dfsg" > /dev/null
if [ "$?" = "0" ]
then
# cortando la parte posterior a - o sea dev.
directorio=`echo $directorio | cut -f1 -d"+"`
directorio="$directorio+dfsg"
fi


echo "$MAGENTA cambiando al directorio $directorio $NORMAL"

cd $directorio
if [ "$?" = "1" ]
then
echo "$RED ERROR: No pude cambiar al directorio $directorio, seguramente no existe porque no hemos podido descargar el paquete $paquete $NORMAL"
fi


#7- Una vez en el directorio del paquete, escribir las palabras mágicas:


echo "$YELLOW compilando el paquete: $paquete $NORMAL"

fakeroot dpkg-buildpackage 
if [ "$?" = "0" ]
then
echo "$YELLOW Aparentemente sin errores. $NORMAL"
else
echo "$RED hubo algún ERROR $NORMAL, pero es posible que el paquete haya sido compilado mayormente bien..."

fi


echo "$YELLOW Trabajo terminado para $paquete ... $NORMAL"

echo "jey, Trabajo terminado para el paquete:, $paquete " | festival --tts

cd ..

instalarpkg=`ls $paquete*.deb | head -1`

ls $paquete*.deb
if [ "$?" = "0" ]
then
echo "Ahora puedes instalar $paquete
$CYAN [enter] $NORMAL para instalarlo, Control+C para abortar"
if [ "$2" = "auto" ]
then
echo "operando automaticamente, sin detenerme"
else
# espera al usuario
read
fi

dpkg -i $instalarpkg

fi

#Si todo va bien , algo que no tiene por qué pasar siempre , nos encontraremos los paquetes deb y otros que suele incluir un paquete debian oficial , (fuentes , changes , diff.gz , dsc ) en el directorio superior .



