#!/usr/bin/perl
#======================================================================
# Copyright (c) 1998 Daniele Giacomini daniele@pluto.linux.it
#
# 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.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#======================================================================
# rpmdoppi
#
# Interviene sulla directory *corrente* eliminando i file doppi,
# pi vecchi.
#======================================================================

$file0 = "";
$file1 = "";

$nome0 = "";
$nome1 = "";

$versione0 = "";
$versione1 = "";

$rilascio0 = "";
$rilascio1 = "";

$architettura0 = "";
$architettura1 = "";

$verA0 = "";
$verA1 = "";
$verB0 = "";
$verB1 = "";
$verC0 = "";
$verC1 = "";
$verD0 = "";
$verD1 = "";
$verE0 = "";
$verE1 = "";
$verF0 = "";
$verF1 = "";

#----------------------------------------------------------------------
# Carica l'elenco dei file dalla directory corrente.
#----------------------------------------------------------------------
open ( ELENCO, "ls *.rpm | sort |" );

#----------------------------------------------------------------------
# Scandisce nome per nome.
#----------------------------------------------------------------------
while ( $file1 = <ELENCO> ) {

    #------------------------------------------------------------------
    # Estrae gli elementi che compongono il nome del file.
    #------------------------------------------------------------------
    $file1 =~ m{^(.*)-([^-]*)-([^-]*)\.([^._-]*)\.rpm};

    #------------------------------------------------------------------
    # Distribuisce i vari pezzi a variabili pi comprensibili.
    #------------------------------------------------------------------
    $nome1 = $1;
    $versione1 = $2;
    $rilascio1 = $3;
    $architettura1 = $4;

    #------------------------------------------------------------------
    # Verifica se i nomi sono comparabili.
    #------------------------------------------------------------------
    if ( $nome1 eq $nome0 ) {
	if ( $architettura1 eq $architettura0 ) {

	    #----------------------------------------------------------
	    # Ok, i nomi sono comparabili.
	    #----------------------------------------------------------
	    ;
	} else {

	    #----------------------------------------------------------
	    # Le architetture sono differenti.
	    #----------------------------------------------------------
	    print "Attenzione all'architettura:\n";
	    print "	$file0";
	    print "	$file1";
	    
	    #----------------------------------------------------------
	    # Riprende il ciclo.
	    #----------------------------------------------------------
	    next;
	};

    } else {

	#--------------------------------------------------------------
	# I nomi sono differenti, quindi ripete il ciclo.
	#--------------------------------------------------------------
	next;
    }
    
    #------------------------------------------------------------------
    # Qui i nomi e le architetture sono uguali.
    #------------------------------------------------------------------

    #------------------------------------------------------------------
    # Se l'ultima cifra della versione  alfabetica, e la penultima
    #  numerica, quella alfabetica viene
    # trasformata in numerica per facilitare il confronto.
    #------------------------------------------------------------------
    if ( $versione1 =~ m{^.*\d[A-Za-z]$}
	&& $versione0 =~ m{^.*\d[A-Za-z]$} ) {

	#--------------------------------------------------------------
	# L'ultimo elemento della versione  una lettera alfabetica.
	# Converte la lettera in numero.
	#--------------------------------------------------------------
    	$versione1 =~ m{^(.*)([A-Za-z])$};
	$versione1 = $1 . ord $2;
	$versione0 =~ m{^(.*)([A-Za-z])$};
	$versione0 = $1 . ord $2;
    }

    #------------------------------------------------------------------
    # Si verifica che la versione sia numerica.
    #------------------------------------------------------------------
    if ( $versione1 =~ m{^[0-9.]*$} && $versione0 =~ m{^[0-9.]*$} ) {

	#--------------------------------------------------------------
	# La versione  correttamente numerica.
	# Si procede ad estrarre i vari valori separati da punti
	# (al massimo sei).
	#--------------------------------------------------------------
	$versione1 =~ m{^(\d*)\.*(\d*)\.*(\d*)\.*(\d*)\.*(\d*)\.*(\d*)$};
	$verA1 = $1;
	$verB1 = $2;
	$verC1 = $3;
	$verD1 = $4;
	$verE1 = $5;
	$verF1 = $6;
	$versione0 =~ m{^(\d*)\.*(\d*)\.*(\d*)\.*(\d*)\.*(\d*)\.*(\d*)$};
	$verA0 = $1;
	$verB0 = $2;
	$verC0 = $3;
	$verD0 = $4;
	$verE0 = $5;
	$verF0 = $6;

	#--------------------------------------------------------------
	# Si procede al confronto tra le versioni.
	#--------------------------------------------------------------
	if ( $verA1 > $verA0 ) {
	    print "Eliminazione del file $file0";
	    system( "rm $file0" );
	    next;
	} elsif ( $verA1 < $verA0 ) {
	    print "Eliminazione del file $file1";
	    system( "rm $file1" );
	    next;
	} elsif ( $verB1 > $verB0 ) {
	    print "Eliminazione del file $file0";
	    system( "rm $file0" );
	    next;
	} elsif ( $verB1 < $verB0 ) {
	    print "Eliminazione del file $file1";
	    system( "rm $file1" );
	    next;
	} elsif ( $verC1 > $verC0 ) {
	    print "Eliminazione del file $file0";
	    system( "rm $file0" );
	    next;
	} elsif ( $verC1 < $verC0 ) {
	    print "Eliminazione del file $file1";
	    system( "rm $file1" );
	    next;
	} elsif ( $verD1 > $verD0 ) {
	    print "Eliminazione del file $file0";
	    system( "rm $file0" );
	    next;
	} elsif ( $verD1 < $verD0 ) {
	    print "Eliminazione del file $file1";
	    system( "rm $file1" );
	    next;
	} elsif ( $verE1 > $verE0 ) {
	    print "Eliminazione del file $file0";
	    system( "rm $file0" );
	    next;
	} elsif ( $verE1 < $verE0 ) {
	    print "Eliminazione del file $file1";
	    system( "rm $file1" );
	    next;
	} elsif ( $verF1 > $verF0 ) {
	    print "Eliminazione del file $file0";
	    system( "rm $file0" );
	    next;
	} elsif ( $verF1 < $verF0 ) {
	    print "Eliminazione del file $file1";
	    system( "rm $file1" );
	    next;
	};

    } elsif ( $versione1 =~ m{^$versione0$} ) {

	#--------------------------------------------------------------
	# Le versioni sono uguali, allora si verifica il numero
	# di rilascio.
	#--------------------------------------------------------------
	;

    } else {

	#--------------------------------------------------------------
	# La versione contiene simboli non numerici incompatibili.
	#--------------------------------------------------------------
    	print "Attenzione ai file seguenti (versione non numerica)\n";
    	print "	$file0";
    	print "	$file1";
        next;
    }

    #------------------------------------------------------------------
    # Qui le versioni sono uguali.
    #------------------------------------------------------------------

    #------------------------------------------------------------------
    # Si verifica che il rilascio sia numerico.
    #------------------------------------------------------------------
    if ( $rilascio1 =~ m{^[0-9.]*$} && $rilascio0 =~ m{^[0-9.]*$} ) {

	#--------------------------------------------------------------
	# Il rilascio  correttamente numerico.
	# Si procede ad estrarre i vari valori separati da punti
	# (al massimo 3).
	#--------------------------------------------------------------
	$rilascio1 =~ m{^(\d*)\.*(\d*)\.*(\d*)$};
	$verA1 = $1;
	$verB1 = $2;
	$verC1 = $3;
	$rilascio0 =~ m{^(\d*)\.*(\d*)\.*(\d*)$};
	$verA0 = $1;
	$verB0 = $2;
	$verC0 = $3;

	#--------------------------------------------------------------
	# Si procede al confronto tra i rilasci.
	#--------------------------------------------------------------
	if ( $verA1 > $verA0 ) {
	    print "Eliminazione del file $file0";
	    system( "rm $file0" );
	    next;
	} elsif ( $verA1 < $verA0 ) {
	    print "Eliminazione del file $file1";
	    system( "rm $file1" );
	    next;
	} elsif ( $verB1 > $verB0 ) {
	    print "Eliminazione del file $file0";
	    system( "rm $file0" );
	    next;
	} elsif ( $verB1 < $verB0 ) {
	    print "Eliminazione del file $file1";
	    system( "rm $file1" );
	    next;
	} elsif ( $verC1 > $verC0 ) {
	    print "Eliminazione del file $file0";
	    system( "rm $file0" );
	    next;
	} elsif ( $verC1 < $verC0 ) {
	    print "Eliminazione del file $file1";
	    system( "rm $file1" );
	    next;
	} else {
	    print "I file seguenti sembrano identici\n";
	    print "	$file0";
	    print "	$file1";
	    next;
	};

    } else {

	#--------------------------------------------------------------
	# Il rilascio contiene simboli non numerici.
	#--------------------------------------------------------------
    	print "Attenzione ai file seguenti (rilascio non numerico)\n";
    	print "	$file0";
    	print "	$file1";
        next;
    }

} continue {

    #------------------------------------------------------------------
    # Accantona i dati per il confronto.
    #------------------------------------------------------------------

    $file0 = $file1;
    $nome0 = $nome1;
    $versione0 = $versione1;
    $rilascio0 = $rilascio1;
    $architettura0 = $architettura1;

};

#----------------------------------------------------------------------
# Il lavoro  terminato; viene chiuso l'elenco dei file.
#----------------------------------------------------------------------
close ( ELENCO );

#======================================================================

