#!/bin/sh
##
## make-packages
##
#
# la directory di partenza deve essere quella da cui si
# dirama la directory "dists/"
#
START_DIR=`pwd`
#
# Definisce il file da usare per i messaggi di errore e lo
# svuota.
#
ERROR_MESSAGES="$START_DIR/error-messages"
echo > $ERROR_MESSAGES
#
# Definisce il contenuto dei file ".disk/info"
# ATTENZIONE! il file ".disk/info" è obbligatorio per
# "dselect"!
#
DISTRIBUTION=`cat $START_DIR/DIST`
DATE=`date "+%Y.%m.%d %H:%M"`
rm -rf $START_DIR/.disk
mkdir $START_DIR/.disk
echo "$DISTRIBUTION $DATE" > $START_DIR/.disk/info
#
# Carica il nome che identifica i supporti.
# ATTENZIONE! il file ".disk/info" è obbligatorio per
# "dselect"!
#
MEDIA=`cat .disk/info`
#
# Dichiara la funzione che sistema i file.
#
function debian_arrange_files ()
{
    DISTRIBUTION="$1"
    PREVIOUS_LEVEL="$2"
    #
    # Inizializza le variabili di ambiente che servono per
    # accumulare i valori per il confronto.
    #
    ARCHIVE_0=""
    ARCHIVE_1=""
    #
    PACKAGE_0=""
    PACKAGE_1=""
    #
    VERSION_0=""
    VERSION_1=""
    #
    ARCHITECTURE_0=""
    ARCHITECTURE_1=""
    #
    CORRECT_NAME_0=""
    CORRECT_NAME_1=""
    #
    # Inizia il ciclo di scansione degli archivi Debian che
    # si trovano nella directory corrente.
    #
    for ARCHIVE_1 in *.deb
    do
        #
        # Se il nome è «*.deb», non ci sono file del genere.
        #
        if [ "$ARCHIVE_1" = "*.deb" ]
        then
            #
            # Non si fa nulla.
            #
            return
        fi
        #
        # Estrae il nome del pacchetto.
        #
        PACKAGE_1=`dpkg --field $ARCHIVE_1 package`
        #
        # Estrae la versione del pacchetto.
        #
        VERSION_1=`dpkg --field $ARCHIVE_1 version`
        #
        # Estrae il nome dell'architettura.
        #
        ARCHITECTURE_1=\
`dpkg --field $ARCHIVE_1 architecture`
        #
        # Compone il nome teorico.
        #
        CORRECT_NAME_1=\
"${PACKAGE_1}_${VERSION_1}_${ARCHITECTURE_1}.deb"
        #
        # Confronta con il nome dell'archivio.
        #
        if [ "$CORRECT_NAME_1" != "$ARCHIVE_1" ]
        then
            #
            # I nomi sono differenti.
            #
            # Modifica il nome forzando la situazione (prima
            # si usava l'opzione -i).
            #
            echo "n" | mv -f "$ARCHIVE_1" \
                             "$CORRECT_NAME_1" 2> /dev/null
            echo "$ARCHIVE_1 ---> $CORRECT_NAME_1"
            #
            echo "$ARCHIVE_1 ---> $CORRECT_NAME_1" \
                 >> $ERROR_MESSAGES
            #
            # Meglio annotare il nome nuovo nella variabile.
            #
            ARCHIVE_1="$CORRECT_NAME_1"
            #
        fi
        #
        # Confronta con il pacchetto precedente.
        #
        if [ "$PACKAGE_1" == "$PACKAGE_0" ]
        then
            if dpkg --compare-versions "$VERSION_1" \
                                       eq "$VERSION_0"
            then
                #
                # Si tratta di un'anomalia in cui si deve
                # intervenire a mano.
                #
                echo "Same version: $ARCHIVE_0 $ARCHIVE_1"
                #
                echo "Same version: $ARCHIVE_0 $ARCHIVE_1"\
                     >> $ERROR_MESSAGES
                #
                # In questo caso, non occorre spostare i
                # valori nelle variabili.
                #
            elif dpkg --compare-versions "$VERSION_1" \
                                         gt "$VERSION_0"
            then
                #
                # Si sposta l'archivio doppio nel livello
                # precedente.
                #
                echo \
"$DISTRIBUTION/$ARCHIVE_0 --> $PREVIOUS_LEVEL"
                mv $ARCHIVE_0 ../$PREVIOUS_LEVEL/$ARCHIVE_0
                #
                # Sposta i valori nelle variabili.
                #
                ARCHIVE_0="$ARCHIVE_1"
                PACKAGE_0="$PACKAGE_1"
                ARCHITECTURE_0="$ARCHITECTURE_1"
                VERSION_0="$VERSION_1"
                CORRECT_NAME_0="$CORRECT_NAME_1"
                #
            elif dpkg --compare-versions "$VERSION_1" \
                                         lt "$VERSION_0"
            then
                #
                # Si sposta l'archivio doppio nel livello
                # precedente.
                #
                echo \
"$DISTRIBUTION/$ARCHIVE_1 --> $PREVIOUS_LEVEL"
                mv $ARCHIVE_1 ../$PREVIOUS_LEVEL/$ARCHIVE_1
                #
                # In questo caso, non occorre spostare i
                # valori nelle variabili.
                #
            else
                #
                # Questo caso non dovrebbe verificarsi.
                #
                echo "There is an error matching the"
                echo "following archives:"
                echo "    $ARCHIVE_0"
                echo "    $ARCHIVE_1"
                #
                echo "There is an error matching the"\
                echo "following archives:"
                     >> $ERROR_MESSAGES
                echo "    $ARCHIVE_0"\
                     >> $ERROR_MESSAGES
                echo "    $ARCHIVE_1"\
                     >> $ERROR_MESSAGES
                #
                # In questo caso, non occorre spostare i
                # valori nelle variabili.
                #
            fi
        else
            #
            # Dal momento che i pacchetti sono differenti,
            # si devono salvare le variabili prima di
            # procedere.
            #
            ARCHIVE_0="$ARCHIVE_1"
            PACKAGE_0="$PACKAGE_1"
            ARCHITECTURE_0="$ARCHITECTURE_1"
            VERSION_0="$VERSION_1"
            CORRECT_NAME_0="$CORRECT_NAME_1"
            #
            # mostra cosa è stato fatto
            #
            echo "$PACKAGE_1"
        fi
    done
}
#
# Dichiara la funzione che esegue le operazioni ripetitive
# su ogni sezione di ogni distribuzione, per ogni disco.
#
function process_disk_distribution_section ()
{
    MEDIA="$1"
    DISTRIBUTION="$2"
    PREVIOUS_LEVEL="$3"
    SECTION="$4"
    #
    echo "$MEDIA, $DISTRIBUTION, $SECTION" 
    #
    cd $START_DIR/dists/$DISTRIBUTION/$SECTION/binary-i386
    debian_arrange_files $DISTRIBUTION $PREVIOUS_LEVEL
    #
    cd $START_DIR
    dpkg-scanpackages                                      \
       dists/$DISTRIBUTION/$SECTION/binary-i386            \
       $START_DIR/indices/override.gz                      \
       > dists/$DISTRIBUTION/$SECTION/binary-i386/Packages \
       2>> $ERROR_MESSAGES
    #
    cat dists/$DISTRIBUTION/$SECTION/binary-i386/Packages  \
        | gzip -9                                          \
    > dists/${DISTRIBUTION}/$SECTION/binary-i386/Packages.gz
}
#
# Funzione frontale.
#
function process_section () {
    DISTRIBUTION="$1"
    PREVIOUS_LEVEL="$2"
    SECTION="$3"
    #
    process_disk_distribution_section \
        "$MEDIA" $DISTRIBUTION $PREVIOUS_LEVEL $SECTION
    #
    # Prepara i file "Packages.cd" e "Packages.cd.gz"
    #
    cd $START_DIR
    #
    cat dists/$DISTRIBUTION/$SECTION/binary-i386/Packages  \
      > dists/$DISTRIBUTION/$SECTION/binary-i386/Packages.cd
    #
    cd $START_DIR/dists/$DISTRIBUTION/$SECTION/binary-i386
    cat Packages.cd | gzip -9 > Packages.cd.gz
    #
    cd $START_DIR
}
#
# Inizia il programma.
#
cd $START_DIR
#
process_section 03 02 main
process_section 02 01 main
process_section 01 00 main
