#!/usr/bin/perl -W

# TP synchronisation de fichiers en perl
#
# Question 2
# version sans références (passage par variable globales)
# 
# Antoine Miné
# 26/01/2007

$dirB = $ARGV[0];
$dirA = $ARGV[1] or die "utilisation: $0 repertoire-courant repertoire-archive";


# parcours($dir) parcours récursivement le répertoire $root/$dir.
# Pour chaque fichier f normal de $root/$dir, son hash h est calculé, et
# le couple ($dir/f,h) est ajouté à %table.
# %table et $root sont globaux.
# $root vaudra soit $dirA, soit $dirB.
sub parcours {
    my $dir  = shift;

    opendir(DIR,"$root/$dir") or return;
    my @files = readdir(DIR) or return;
    closedir(DIR);

    foreach (@files) {
	next if /^\.\.?$/;

	$filename = "$dir/$_";              # chemin depuis root
	$fullfilename = "$root/$filename";  # chemin complet

	if (-d $fullfilename) { parcours($filename); }
	elsif (-f $fullfilename) {
	    # lance la commande sha1sum et récupère son résultat
	    # ATTENTION aux " ": indispensables si $fullfilename contient
            # des espaces!
	    $result = `sha1sum "$fullfilename"`;
	    # mange la fin de la ligne (nom de fichier) pour ne garder que
	    # la signature
	    chomp $result;
	    $result =~ s/ .*$//;
	    # stocke le résultat
	    $table{$filename} = $result;
	}
    }
}


# calcule la table de A
$root = $dirA; 
%table = (); 
parcours("."); 
%tableA = %table;

# calcule la table de B
$root = $dirB; 
%table = (); 
parcours("."); 
%tableB = %table;

# cherche les fichier de B à copier dans A
# il s'agit des fichiers de B non présent dans A, ou de sha différent
for (keys %tableB) {
    next if defined($tableA{$_}) && $tableA{$_} eq $tableB{$_};
    print "copie $dirB/$_ => $dirA/$_\n";
}

# cherche les fichiers de A à effacer
# il s'agit des fichiers de A non présent dans B
for (keys %tableA) {
    next if defined($tableB{$_});
    print "détruit $dirA/$_\n";
}
