#!/bin/sh
#METODI PER USARE UNA STRINGA COME ARRAY
#
#b="Pippo Pluto Paperino";stringa="";for i in $b; do stringa="$stringa $i";done;echo $stringa
#
#b="Pippo Pluto Paperino"; for i in $b; do echo $i; done


#se ci son meno di tre argomenti
if [ $# -lt 3 ]; then
    #se il primo argomento corrisponde ad -h o --help o help
    if [ $1 = -h ] || [ $1 = --help ] || [ $1 = help ]; then

        echo -e "\nQuesto script ricerca file o directory nel contenuto di un pacchetto tcz indicatogli e ne divide il contenuto in due pacchetti.\n"

        echo -e "Potete ricercare un file specificando il suo nome oppure parte di esso utilizzando gli asterischi, es. readme.txt module*.cfg *.pyc"
        echo "Esempi di tipi di file che si possono voler separare possono essere:"
        echo "Develop: .h .c .pc .pyc"
        echo -e "Locales: .mo\n"

        echo -e "Potete ricercare una directory specificando il suo nome preceduto da /, potete usare gli asterischi anche in questo caso. Non potete specificare un path e dovete ricordare che le ricerche sono case sensitive\n"

        echo -e 'Potete escludere dei file o directory da quelli che verranno divisi specificando il loro nome o parte di path anteponendogli un trattino  "-". Questa volta non potete usare gli asterischi per astrarre una parte di stringa.\n'

        echo "Alla conclusione il file originale verra' rinominato in <pacchetto>_original.tcz, quello che manterra' il nome iniziale sara' stato privato dei file ricercati che saranno confluiti nel nuovo file <pacchetto><-nome_aggiuntivo>.tcz"
        echo -e "I file in esso confluiti saranno elencati nel file <pacchetto><nome_aggiuntivo>filelist.txt, le directory verranno specificate senza il loro contenuto."
        echo -e "All'interno del file  <pacchetto><nome_aggiuntivo>filelist.txt.unpurged saranno elencati i file che sarebbero stati divisi senza quelli esclusi con gli argomenti preceduti dal trattino.\n"

        echo -e "\nCOME FUNZIONA"
        echo -e "Si pone lo script nella stessa directory del pacchetto da dividere e si usa questa sintassi:"
        echo -e "./tcz-externalizer <pacchetto.tcz> <suffisso> <file>...|<directory>...|-<pattern_escluso>\n"
        echo "Es:"
        echo "./tcz-externalizer geany.tcz -dev *.h *.la *.pc *.iface -pyconfig.h"
        echo -e "./tcz-externalizer geany.tcz -doc /doc -/guida/manuale\n"

    else
        echo -e "\nMi aspetto almeno 3 argomenti:"
        echo -e "./tcz-externalizer <pacchetto.tcz> <suffisso> <file>... | <directory>...|-<pattern_escluso>\n"
    fi




else
    # ERODEDDIR$1 is /path/to/*.tcz file
    PACKNAME=`echo $1 | sed 's/.*\///' | sed 's/.tcz//'`
                    #nome pacchetto senza path ne estensione
    PACKSURNAME=$2  #nome aggiuntivo primo argomento
    ERODEDDIR=`echo "$PACKNAME"_eroded`
                    #dir dove verranno decompressi e poi tolti i file
    FILTREDDIR=`echo "$PACKNAME""$PACKSRUNAME"_filtred`
    FILTREDLIST=`echo "$PACKNAME""$PACKSURNAME"_filelist.txt `
    #echo $PACKNAME $ERODEDDIR $FILTREDDIR $FILTREDLIST


if [ ! -f "$1" ]; then
    echo -e "\nPacchetto non esistente\n"
    exit 1
fi



    #se non esiste crea il backup del tcz originale
    if  [ ! -f "$PACKNAME"_original.tcz ]; then
        cp "$PACKNAME".tcz "$PACKNAME"_original.tcz
        echo -e '\nComplete package renamed in "$PACKNAME"_original.tcz"\n'
        sleep 1
    fi


    #clean any previous work
    sudo rm -rf ./$ERODEDDIR
    sudo rm -rf ./$FILTREDDIR
    sudo rm -rf ./$FILTREDLIST


    #unsquash *.tcz
    tce-load -i squashfs-tools-4.x &>/dev/null
    sudo unsquashfs -f -d $ERODEDDIR $1 &>/dev/null
    #decomprime il tcz in nomepack_eroded


    #Crea la lista dei file da copiare saltando gli arg. che iniziano con -
    shift; #skippa l'argomenti $0 al prossimo comando fino a fine script
    shift; #skippa l'argomenti $1 al prossimo comando fino a fine script
        for var in "$@"; do
            #trova il primo carattere
            FIRSTCHAR=`echo $var | sed -r 's/^(.).*$/\1/g'`
            if [ $FIRSTCHAR = "-" ]; then
                continue; #salta un giro
            else
                if [ $FIRSTCHAR = "/" ]; then
                    DIR=`echo $var | sed 's/^.//g'`
                    #find ./$ERODEDDIR -type d -name "$DIR"

                    #creo la lista delle directory
                    find ./$ERODEDDIR -type d -name "$DIR" > ./dir_temp && sleep 1

                    #creo un eseguibile che richiede la lista dei file per ogni directory nella lista precedente
                    cat ./dir_temp | sed 's/^/find /g' | sed "s,$, -not -type d >> ./$FILTREDLIST,g" > ./dir_temp_exec && sleep 1

                    #eseguo il file eseguibile riempiendo la lista delle sostituzioni
                    sh ./dir_temp_exec && sleep 1
                    echo -e "----directory /$DIR selezionate\n"
                    rm -rf ./dir_temp ./dir_temp_exec && sleep 1

                else
                    #filtra i file contenenti l'argomento $var e li accoda in un file
                    #find ./$ERODEDDIR -not -type d -name "$var"
                    find ./$ERODEDDIR -not -type d -name "$var" >> ./$FILTREDLIST && sleep 1
                    echo -e "----file $var selezionati\n"
                    sleep 1
                fi
            fi
        done

    #toglie le voci ripetute nel file
    cp ./$FILTREDLIST ./$FILTREDLIST.unduplicate
    sort -u ./$FILTREDLIST.unduplicate > ./$FILTREDLIST
    echo -e "----doppioni rimossi\n"


    #Cancella dalla lista i file degli argomenti che iniziano con -
    cp ./$FILTREDLIST ./$FILTREDLIST.unpurged
        for var in "$@"; do
            #trova il primo carattere e il secondo carattere
            FIRSTCHAR=`echo $var | sed -r 's/^(.).*$/\1/g'`
            SECNDCHAR=`echo $var | sed -r 's/^.(.).*$/\1/g'`

            if [ $FIRSTCHAR = "-" ]; then
                PATTERN=`echo $var | sed 's/.//'` #toglie il primo carattere
                SAFEPATTERN=$(printf '%s\n' "$PATTERN" | sed 's/[[\.*^$/]/\\&/g')
                sed -i "/.*$SAFEPATTERN.*/d" ./$FILTREDLIST && sleep 1 #rimuove le righe contenenti il pattern
                echo -e "----pattern $PATTERN deselezionati\n"
                sleep 1
            fi
        done



    echo -e "\nlista finale"
    cat ./$FILTREDLIST
    sleep 4



    #copy dev files in filtred directory
    mkdir ./$FILTREDDIR     #crea dir file separati
    cd ./$ERODEDDIR         #va nella dir da separare
    cat ../$FILTREDLIST | sed 's/^.*'$ERODEDDIR'/\./g' | sed 's/^/sudo cp -a --parents /g' | sed 's/$/ ..\/'$FILTREDDIR'\//g' > ../copyfile         #modifica la lista dei file da separare in modo che diventino comandi di copia
    sh ../copyfile
    cd ../
    rm -f ./copyfile


    #remove externalizzation files in eroded directory
    cat ./$FILTREDLIST | sed 's/^/sudo rm -rf /g' > ./removefile
    sh ./removefile && echo -e "\n\nfile da separare rimossi\n"
    sleep 1
    rm -f ./removefile
    ####remove empty folder in eroded directory
    ####meglio non cancellarle, non si sa mai che un programma malfunzioni
    #sudo find ./$ERODEDDIR -type d -depth -exec rmdir {} + 2>/dev/null && sleep 1
    #echo -e "\ntolte directory vuote\n\n\n"
    #sleep 1


    #create package with and without exernalized file
    rm -rf ./$PACKNAME'.tcz'
    mksquashfs ./$ERODEDDIR $PACKNAME'.tcz'
    mksquashfs ./$FILTREDDIR $PACKNAME$PACKSURNAME'.tcz'

    #final clean exluse the filtredlist.txt
    sudo rm -rf ./$ERODEDDIR
    sudo rm -rf ./$FILTREDDIR

fi

echo ""



####VECCHIO MODO DI RIMUOVERE I FILE
####pare non funzionare con liste troppo lunghe
##remove dev files in nodev directory
#REMOVE=`cat ./$FILTREDLIST | sed 's/^/sudo rm -rf /g'`
#$REMOVE
##remove empty folder in nodev directory
#sudo find ./$ERODEDDIR -type d -depth -exec rmdir {} + 2>/dev/null



#####per far funzionare le variabili con caratteri speciali all'interno di sed ho dovuto usare un SAFEPATTERN intermedio trovato in questo sito: http://backreference.org/2009/12/09/using-shell-variables-in-sed/
    #safe pattern
    #SAFEPATTERN=$(printf '%s\n' "$PATTERN" | sed 's/[[\.*^$/]/\\&/g')
    #per sed -r (regex extended) il safe pattern è:
    #SAFEPATTERN=$(printf '%s\n' "$pattern" | sed 's/[[\.*^$(){}?+|/]/\\&/g')

