#!/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.
#======================================================================
# rpmlinkorig
#
# Crea dei link hardware con i file .rpm aggiornati per mantenere la
# conformit con il sistema di installazione.
#======================================================================

$fileO = "";
$fileA = "";

$nomeO = "";
$nomeA = "";

$architetturaO = "";
$architetturaA = "";

#----------------------------------------------------------------------
# Carica gli elenchi.
#----------------------------------------------------------------------
open ( ORIGINALI, "cat RPMS.ORIG | sort |" );
open ( ATTUALI, "ls *.rpm | sort |" );

#----------------------------------------------------------------------
# Scandisce nome per nome, a partire dagli originali.
#----------------------------------------------------------------------
while ( $fileO = <ORIGINALI> ) {

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

    #------------------------------------------------------------------
    # Distribuisce i vari pezzi a variabili pi comprensibili.
    #------------------------------------------------------------------
    $nomeO = $1;
    #La versione viene ignorata ( $2 )
    #L'architettura viene ignorata ( $3 )
    $architetturaO = $4;

    #------------------------------------------------------------------
    # Cerca il nome attuale corrispondente.
    #------------------------------------------------------------------
    while ( 1 ) {
    
        #--------------------------------------------------------------
	# Se il nome originale  pi avanti, occorre leggere ancora
	# dall'elenco attuale.
        #--------------------------------------------------------------
	if ( $nomeO gt $nomeA ) {

	    if ( $fileA = <ATTUALI> ) {

	        #------------------------------------------------------
	        # Toglie il newline finale.
	        #------------------------------------------------------
	        chomp $fileA;
		; # OK
	    } else {

    		#------------------------------------------------------
		# L'elenco dei file esistenti  terminato
		# prematuramente.
    		#------------------------------------------------------
		print "Manca la corrispondenza per il file $fileO";

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

	    #----------------------------------------------------------
            # Distribuisce i vari pezzi a variabili pi comprensibili.
    	    #----------------------------------------------------------
    	    $nomeA = $1;
    	    #La versione viene ignorata ( $2 )
	    #L'architettura viene ignorata ( $3 )
    	    $architetturaA = $4;

    	    #----------------------------------------------------------
	    # Ripete il ciclo.
    	    #----------------------------------------------------------
	    next;

	} elsif ( $nomeO lt $nomeA ) {
	
    	    #----------------------------------------------------------
	    # Il file originale non ha un corrispondente.
    	    #----------------------------------------------------------
	    print "Manca la corrispondenza per il file $fileO";

    	    #----------------------------------------------------------
	    # Termina il ciclo interno per riprendere quello esterno.
    	    #----------------------------------------------------------
	    last;
	
	} else {

    	    #----------------------------------------------------------
	    # Finalmente i nomi sono uguali.
    	    #----------------------------------------------------------
	    if ( $architetturaO ne $architetturaA ) {

    		#------------------------------------------------------
		# I file hanno architetture differenti e questo non
		#  ammissibile.
    		#------------------------------------------------------
		print "I file seguenti hanno architetture differenti\n";
		print "$fileO";
		print "$fileA";
		
	    } elsif ( $fileO eq $fileA ) {

    		#------------------------------------------------------
		# I file sono identici, quindi non occorre altro.
    		#------------------------------------------------------
		;

	    } else {
	    
    		#------------------------------------------------------
		# I file hanno versione o rilascio differenti,
		# quindi si fa il link hardware.
    		#------------------------------------------------------
		system( "ln $fileA $fileO" );
		##print "$fileO --> $fileA\n";
	    };

    	    #----------------------------------------------------------
	    # Termina il ciclo interno, dal momento che la
	    # corrispondenza  stata trovata.
    	    #----------------------------------------------------------
	    last;
	};
    };
};	    

#----------------------------------------------------------------------
# Chiude gli elenchi.
#----------------------------------------------------------------------
close ( ORIGINALI );
close ( ATTUALI );

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

