#!/usr/bin/bash

#  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; either version 2 of the License, or
#  (at your option) any later version.
#  
#  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.
#  https://www.gnu.org/licenses/gpl-2.0.html
#  Creado por José Alberto Valle Cid (katnatek) <j.alberto.vc@gmail.com>
#  Este script pretende ayudar a los que crean sus propios paquetes
#  Entre las características están
#  Preparar el sistema antes del empaquetado
#  Instalar dependencias de construcción desde archivos .spec o .src.rpm
#  Quitar los paquetes instalados cuando se termina la construcción del paquete
#  Se asume que el usuario ha generado ~/.rpmmacros y la jerarquía de carpetas
#  de  %_topdir
# Versión 2.0 06/09/2021
[ ! -f /tmp/pack-rootscript ] && echo "#!/bin/bash" > /tmp/pack-rootscript
#sbin no esta incluido por defecto en la trayectoria
#lo agrego aquí para evitar que falle en encontrar
#urpmi y urpme
export PATH=${PATH}:/sbin
now=$(date +%F)
WorkDir="$(rpm -E %_topdir)"
prep_line="urpmi --auto-update --auto
rpm -qa --nosignature --qf %{NAME}\\\n > ${WorkDir}/last-update
chmod a+rw ${WorkDir}/last-update"
clean_line="echo \"Se realizara limpieza de dependencias..\"
urpme \$(cat ${WorkDir}/remove)"
dep_line="echo \"Instalando dependencias de construcción..\"
if urpmi --buildrequires \"$(readlink -f $1)\" --auto ; then
	echo  \"Calculando paquetes nuevos..\"
	rpm -qa --nosignature --qf %{NAME}\\\n > ${WorkDir}/new
	sdiff --suppress-common-lines ${WorkDir}/last-update ${WorkDir}/new|grep -v \<$|cut -d '>' -f 2-|sed s/\"[\\t ]\"//g> ${WorkDir}/remove
	chmod a+rw ${WorkDir}/{new,remove}
	echo \"Ya esta todo listo para empaquetar...\"
else
	echo \"No se pudieron instalar dependencias\"
	exit 1
fi
"
acciones=""

function prep
{
	if [ -f "${WorkDir}/remove" ]; then
		if ! file "${WorkDir}/remove"|grep "empty" ; then
			echo -e "Se detectaron dependencias instaladas..\\n"
			echo -n "¿Desea quitarlas 1=S/2=N"
			read resp
			while [ "$resp" != "1" -a "$resp" != "2" ]; do
				echo "Respuesta incorrecta" >&2
				echo
				echo -e "Se detectaron dependencias instaladas..\\n"
				echo -n "¿Desea quitarlas 1=S/2=N"
				read resp;
			done
			[ "$resp" == "1" ] && clean
			[ "$resp" == "2" ] && prep_line="urpmi --auto-update --auto"
		fi
	fi
	if [ ! -f "${WorkDir}/last-update" ] || [[ ${now} > $(stat -c %y "${WorkDir}/last-update"|cut -d ' ' -f1) ]]; then
		resp="1"
	else
			echo -e "No se necesita actualizar..\\n"
			echo -n "¿Desea actualizar 1=S/2=N"
			read resp
			while [ "$resp" != "1" -a "$resp" != "2" ]; do
				echo "Respuesta incorrecta" >&2
				echo
				echo -e "No se necesita actualizar..\\n"
				echo -n "¿Desea actualizar 1=S/2=N"
				read resp;
			done
	fi
	[ "$resp" == "1" ] && echo "$prep_line"  >> /tmp/pack-rootscript && acciones="$acciones
Preparar Sistema"
}

function dep
{
	echo "$dep_line"  >> /tmp/pack-rootscript
	acciones="$acciones
Instalar dependencias"
}

function clean
{
	if ! file ${WorkDir}/remove|grep "empty" ; then
		echo "$clean_line"  >> /tmp/pack-rootscript
		acciones="$acciones
Limpiar dependencias"
	fi
}

function usage
{
	clear
	echo "pack-help es una herramienta para auxiliar a los empaquetadores"
	echo "Formas de uso:"
	echo
	echo "pack-help archivo.src.rpm"
	echo 
	echo "o"
	echo
	echo "pack-help archivo.spec"
	echo
	echo "Al terminar de construir el paquete, para desinstalar las dependencias de construcción"
	echo
	echo "pack-help clean"
	echo
	exit
}
while [ -n "$1" ]; do
	if [ -f "$1" ] ; then
		if [[ ( "$1" == *.src.rpm ) || ( "$1" == *.spec ) ]]; then
			if [[ ( "$1" == *.spec ) ]]; then 
				if ! spec_error="$(rpmspec -P $1 2>&1)"  ; then
					echo "Debe corregir el archivo $1
$spec_error"
					exit 1
				fi
			fi
			prep
			dep
		else
			echo "El archivo no es .src.rpm ni .spec"
			exit 1
		fi
	else
		case "$1" in
			"clean") 
				if [ ! -f "${WorkDir}/remove" ] || file "${WorkDir}/remove"|grep "empty" ; then
					echo "No hay dependencias a desinstalar"
					rm -f /tmp/pack-rootscript
					exit
				else
					clean_line="$clean_line
rm -f ${WorkDir}/{remove,new}"
					clean
				fi ;;
			--help|-h|*) usage ;;
		esac
	fi
	shift
done
if grep -v -q '#!/bin/bash' /tmp/pack-rootscript ; then
	echo "Proporcione clave de root para:
$acciones"
	if ! su - -c "bash /tmp/pack-rootscript" ; then
		echo "No se realizaron las acciones"
	fi
	rm -f /tmp/pack-rootscript
else
	usage
fi
