#!/usr/bin/perl

$repertoire = shift;
# 1° paramère à la ligne de commande

$pwd =`pwd`;
chomp $pwd;

# déterminer le répertoire observé (en chemin absolu)
if ($repertoire eq "") {
	# si pas d'argument : par défaut on observe le répertoire courant
	$repertoire_observe = $pwd;
} elsif ( ! -d $repertoire) {
	print "L'argument doit être un répertoire :";
	print "$repertoire n'est pas  un répertoire :";
	exit;
} elsif ($repertoire =~ /^\//) {
	# il est déjà absolu
	$repertoire_observe = $repertoire;
} elsif ($repertoire =~ /^\.\./) {
	print "Ce script ne prend pas encore en compte les chemins relatifs avec 'parent'";
	exit;	
} else {
	$repertoire =~ s/^\.\///;
	# enlever le './' initial du chemin relatif
	$repertoire =~ s/^\.//;
	# sinon, enlever le '.' du répertoire courant
	$repertoire_observe = "$pwd/$repertoire";
	# et le concaténer au répertoire courant
}


print "répertoire observé :";
print "\n";
print "$repertoire_observe";
print "\n";
print "\n";

# noms des fichers plus descriptifs : 'lsr_before' et 'lsr_after'
$lsr = `/bin/ls -R $repertoire_observe > lsr_before`;
# sauvegarder l'état de départ des fichiers dans $repertoire dans le fichier 'lsr_before'

print "créez ou supprimez un fichier (dans $repertoire_observe, ou sous-répertoire)\n";
print "\npuis faites 'ENTER'\n";
$stdin = <STDIN>;
# entrée au clavier : ne sert qu'à attendre le 'ENTER', on n'utilise pas la valeur entrée

$lsr2 = `/bin/ls -R $repertoire_observe > lsr_after`;
# sauvegarder l'état final des fichiers dans $repertoire dans le fichier 'lsr_after'


$difflsr = `diff lsr_before lsr_after`;
# détecter la différence départ/final par la commande 'diff' et le mettre dans la variable $difflsr
print $difflsr;
# l'afficher
@difflsr = split(/\n/, $difflsr);
# transformer en vecteur par split
foreach (@difflsr) {
# parcourir le vecteur
	chomp;
	if (/^\d+/) {
	# si la ligne commence par un nombre
# 		s/^(\d+).*/$1/;
# 		# le récupérer
# cette partie était incohérente dans les versions précédantes :
# le nombre en début de ligne concerne le numéro de ligne dans le fichier 'lsr_before' (ex 'lsr')
# et je l'utilisais pour le fichier 'lsr_after' (ex 'lsr2')
# je passe à la récupération des numéros de ligne dans le fichier 'lsr_after'
# qui sont après la lettre indiquant le type de modification
 		s/^(\d+),{0,1}\d*[acd](\d+).*/$2/;
		$line = $_;
		$directory_nb++;
		# incrémenter le nombre de répertoires contenant des fichiers créés/supprimés
		# REMARQUE : les indices utilisés dans 'lsr9' [$line] n'étaient pas corrects !
		$line_files[$directory_nb] = "$line\t";
		# c'est un numéro de ligne dans le fichier final (ici 'lsr_after')
		# je structure les composantes du vecteur @line_files ainsi :
		# line\tfile\nfile\nfile\nfile\n ...
		
	} else {	
		# je garde les '>' et '<' pour distinguer les création des suppressions
		$line_files[$directory_nb] .= "$_\n";
		# REMARQUE : les indices utilisés dans 'lsr9' [$line] n'étaient pas corrects !
		# et l'ajouter (par .=)
		# ce qui suit ' >' (ou ' <') est le nom du fichier
	}

}
$total_directory_nb = $directory_nb;
print "\nNombre de répertoires contenant des fichiers créés/supprimés = $total_directory_nb\n";

# on a maintenant des numéro de ligne où il y a une différence
# et quelle est cette différence (= les noms des fichiers)

foreach (@line_files) {
	if (/^\d+/) {
		# les récupérer par un split :
		($line, $files) = split(/\t/, $_);
		if ($line eq "") {
			next;
			# pour ne pas tenir compte de la composante d'indice '0' de @line_files
			# qui ne contient rien
		}
		print "\n";
		print "à la ligne ";
		print "\n";
		print $line;
		print "\n";
		print "du fichier 'lsr_after'\n";
		print "il y a une différence avec le fichier 'lsr_before'";
		print "\n";
		print "Elle concerne les noms de fichier :\n";
		print $files;
	}
}


# pour savoir dans quel répertoire ce fichier se trouve
# on va parcourir le fichier 'lsr2'
# qui contient une liste de répertoires absolus
# chacun suivi des noms des fichiers qu'il contient
print "\n";
print "répertoires mentionnés dans 'lsr_after'";
print "\n";
print "(jusqu'à ce qu'on trouvé tous ceux contenant des fichiers créés/supprimés) :";
print "\n";
print "\n";

if ($difflsr ne "") {
	$directory_nb = 1;
	# réitialiser $directory_nb
	($line, $files) = split(/\t/, $line_files[$directory_nb]);
#	$files =~ s/ //;
	# enlever le premier espace
#	($line, @files) = split(/ /, $line_files[$directory_nb]);
#	$line_files = $line_files[$directory_nb];
#	$line_files =~ s/([^ ]+) (.*)//; 
	open(LSRA, "<lsr_after");
	while (<LSRA>) {
		$linenb++;
		if (/^\//) {
		# si la ligne commence par un /, c'est le chemin absolu d'un répertoire
			chomp;
			s/:$//;
			$absolute_directory = $_;
			print "$absolute_directory";
			print "\n";
			# et on l'affiche
			if ($selected_directory eq "true") {	
			# si on était dans un répertoire contenant des modifications
				$selected_directory = "false";
				# on en est sorti
				$directory_nb++;
				if ($directory_nb > $total_directory_nb) {
				# s'il n'y a plus de répertoires à chercher
					last;
					# on termine la recherche
				}
				# sinon on passe à la recherche du suivant
				($line, $files) = split(/\t/, $line_files[$directory_nb]);
			}
		}
		if ($linenb == $line) {
		# si on atteint le numéro d'une ligne qui concerne un fichier modifié
			$files_per_directory{$absolute_directory} .= $files;
			# on met dans un hash dont les clé sont
			# les répertoires contenant des fichiers créés/supprimés
			# on le fait en concaténation '.=' car il pourrait y avoir 
			# plusieurs contributions séparées à un même répertoire
			$selected_directory = "true";
		}
	}
	close(LSRA);		

}

foreach (sort keys %files_per_directory) {
	print "\n";
	print "Dans le répertoire $_";
	print "\n";
	
	print "les fichier suivants ont été supprimé/créé :";
	print "\n";
	foreach ($files_per_directory{$_}) {
		print;
	}
	print "\n";
}

 


