diff --git a/Doc/doc_procedure_verification.tex b/Doc/doc_procedure_verification.tex index 79d05da..5d2f630 100644 --- a/Doc/doc_procedure_verification.tex +++ b/Doc/doc_procedure_verification.tex @@ -19,6 +19,7 @@ \usepackage{lscape} \usepackage{float} % paquet pour placer les images correctement avec \begin{figure}[H] +\usepackage{enumitem}%package pour gérer la puce avec \begin{enumerate}[label={blabla-\arabic*}] (ce qui donne comme puces : blabla-1, blabla-2, etc...) \usepackage{tabularx} \usepackage{multirow} @@ -369,16 +370,16 @@ Ce document est r %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{Vue d'ensemble} +\subsection{Vue d'ensemble}\label{subsection_vue_ensemble} Créer un nouveau test consiste à ajouter un nouveau répertoire dans le répertoire \verb|Batterie|. Le choix de son emplacement dans l'arborescence est libre en s'inspirant tout de m\^eme des descriptifs donnés en section \ref{section_classement_tests}. Le contenu du répertoire est celui défini en section \ref{section_contenu_repertoire_test}. Les fichiers facultatifs dépendent du type de traitement Herezh++. Dans tous les cas, l'arborescence du répertoire de test est de la forme montrée sur la figure \ref{arbo_repertoire_test} et les règles suivantes sont à respecter : \begin{itemize} -\item[$\bullet$] Le nom du nouveau répertoire est choisi en utilisant uniquement les lettres de a à z, les chiffres de 0 à 9, le signe moins "-" et le tiret bas "\_". Si le test est un test "Rapide" (moins de 30 secondes), le nom commence par \verb|Test_R|, sinon il commence par \verb|Test_L|. +\item[$\bullet$] Le nom du nouveau répertoire est choisi en utilisant uniquement les lettres de a à z (sans accent), les chiffres de 0 à 9, le signe moins "-" et le tiret bas "\_". Si le test est un test "Rapide" (moins de 30 secondes), le nom commence par \verb|Test_R|, sinon il commence par \verb|Test_L|. Pour savoir si un nom de répertoire existe déjà, il y a un script dédié présent dans le répertoire \verb|Perl| : \verb|verif_existence_repertoire_test.pl| (option \verb|-h| pour l'aide). Pour l'utiliser, il faut se placer à la racine du projet (c'est-à-dire au m\^eme niveau que le répertoire \verb|Batterie|) et taper \verb|Perl/verif_existence_repertoire_test.pl nom_repertoire|. \item[$\bullet$] Un seul fichier d'extension \verb|.info| doit \^etre présent dans le répertoire. Ce fichier doit \^etre présent m\^eme s'il est vide. \item[$\bullet$] Pour chaque calcul, il est nécessaire de créer un fichier \verb|.CVisu| (\verb|.CVisu1|, \verb|.CVisu2|, etc...) m\^eme si celui-ci est vide. Ces fichiers servent non seulement à Herezh++ mais également au script \verb|Perl/test.pl| pour repérer les calculs à lancer (un calcul par fichier \verb|.CVisu|). \item[$\bullet$] tous les fichiers \verb|.CVisu|[i] et les fichiers facultatifs nécessaires à l'exécution d'un test (\verb|.verif|[i], \verb|.commande|[i], etc...) ont la m\^eme racine que le fichier \verb|.info| (par exemple, si on a le fichier \verb|nom_fichier.info|, l'éventuel fichier \verb|.verif1| doit avoir pour nom \verb|nom_fichier.verif1|) \item[$\bullet$] le fichier \verb|README| contient obligatoirement les rubriques \it But du test \rm et \it Description du calcul \rm montrées sur la figure \ref{format_fichier_README}. Ces deux rubriques serviront à générer automatiquement une documentation pdf (catalogue de tests). Dans le m\^eme but, les rubriques \it Auteur \rm et \it Mots-cles\rm, qui ne sont pas obligatoires, donnent des informations précieuses (merci de les renseigner). -\item[] \bf Remarque importante : \rm ne pas écrire des lignes de tirets (\verb|---| et plus) dans le corps d'une rubrique.\\ +\item[] \bf Remarque importante : \rm ne pas écrire des lignes de 3 tirets ou plus (\verb|---| ou plus) dans le corps d'une rubrique.\\ \end{itemize} @@ -421,7 +422,39 @@ Les fichiers facultatifs d \label{arbo_repertoire_test} \end{figure} -La sous-section \ref{section_commandes_CVS} est un rappel des commandes CVS de base. Les sous-sections \ref{section_fichiers_obligatoires} et \ref{section_fichiers_facultatifs} donnent des informations sur les fichiers obligatoires et les fichiers facultatifs en lien avec l'exécution du test. Notamment, certains fichiers ont un format bien précis pour \^etre exploitables. Ensuite, la sous-section \ref{section_exemples_tests} a pour but de balayer les cas les plus courants de test et de donner des exemples. +La section \ref{subsection_methodologie} propose une méthodologie de travail pour construire un nouveau test. La section \ref{section_commandes_CVS} est un rappel des commandes CVS de base. Les sections \ref{section_fichiers_obligatoires} et \ref{section_fichiers_facultatifs} donnent des informations sur les fichiers obligatoires et les fichiers facultatifs en lien avec l'exécution du test. Notamment, certains fichiers ont un format bien précis pour \^etre exploitables. Ensuite, la section \ref{section_exemples_tests} a pour but de balayer les cas les plus courants de test et de donner des exemples. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{Méthodologie}\label{subsection_methodologie} + +Avant l'ajout définitif du répertoire de test dans la batterie, il est plus que conseillé de construire pas à pas le test dans un répertoire en dehors du projet CVS. Dans ce répertoire, on pourra tester son fonctionnement sans risquer d'altérer le reste du projet. La méthodologie préconisée est : +\begin{enumerate}[label={\arabic*})] +\item créer un répertoire quelconque (appelons ce répertoire : \verb|rep_tmp|) +\item copier le répertoire \verb|Perl| et le script \verb|verifier_exeHZ.pl| (ou \verb|verifier_exeHZ.zsh|) dans \verb|rep_tmp| +\item choisir un nom de répertoire de test (voir section \ref{subsection_vue_ensemble}) et le créer dans \verb|rep_tmp| (appelons ce répertoire : \verb|Test_R_nom_test|)\\ +(au besoin, pour choisir le nom du test :\\ +utiliser le script \verb|verif_existence_repertoire_test.pl| au niveau du répertoire \verb|Verif_Herezh/Batterie|) +\item créer tous les fichiers nécessaires au calcul dans \verb|Test_R_nom_test| (voir sections \ref{section_fichiers_obligatoires} et \ref{section_fichiers_facultatifs})\\ +\underline{Remarque} : Ne pas hésiter à s'inspirer des répertoires déjà existants dans la batterie +\item se placer dans \verb|rep_tmp| et exécuter le script \verb|verifier_exeHZ.pl(.zsh)|\\ +(si le test fonctionne, un rapport de test en bonne et due forme est produit) +\item si il y a un disfonctionnement : modifier les fichiers de calcul jusqu'à ce que le test fonctionne +\item créer le fichier \verb|README| dans \verb|Test_R_nom_test| (voir section \ref{section_fichiers_obligatoires}) +\item choisir un répertoire de destination dans la batterie (voir section \ref{section_classement_tests})\\ +(appelons ce répertoire \verb|rep_dest|) +\item enregistrer le test dans le projet CVS (voir section \ref{section_commandes_CVS}) : +\begin{itemize} +\item[$>$] Recopie du répertoire de test vers le projet :\\ +\verb|cp -R rep_tmp/Test_R_nom_test Verif_Herezh/Batterie/.../rep_dest/.| +\item[$>$] Ajout du répertoire sous CVS :\\ +\verb|cvs add Verif_Herezh/Batterie/.../rep_dest/Test_R_nom_test| +\item[$>$] Ajout de son contenu :\\ +\verb|cvs add Verif_Herezh/Batterie/.../rep_dest/Test_R_nom_test/*| +\item[$>$] Actualisation définitive du projet CVS en se plaçant dans le répertoire du projet :\\ +\verb|cvs commit -m 'ajout nouveau test etc...'| +\end{itemize} +\end{enumerate} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Commandes usuelles CVS}\label{section_commandes_CVS} @@ -673,7 +706,9 @@ L'arborescence pour ce genre de test devrait avoir la forme suivante :\\ \item[$\bullet$] 2015-07-16 (Julien Troufflard) : \begin{itemize} -\item[-] modif du script de génération automatique du catalogue de tests (script \verb|Perl/genere_catalogue_tests.pl|). Désormais, il est possible d'insérer des figures via une syntaxe par balises dans les fichiers README des tests. La méthode est expliquée dans la documentation utilisateur \verb|doc_procedure_verification.pdf| à la section \ref{section_fichiers_obligatoires} "Fichiers obligatoires" (fichier \verb|README|)\\ +\item[-] modif du script de génération automatique du catalogue de tests (script \verb|Perl/genere_catalogue_tests.pl|). Désormais, il est possible d'insérer des figures via une syntaxe par balises dans les fichiers README des tests. La méthode est expliquée à la section \ref{section_fichiers_obligatoires} "Fichiers obligatoires" (fichier \verb|README|)\\ +\item[-] ajout du script \verb|Perl/verif_existence_repertoire_test.pl|. Permet de savoir si un nom de répertoire de test existe déjà dans la batterie. Est utile au moment de l'ajout d'un nouveau test pour aider à choisir le nom et éviter de choisir un nom déjà existant (m\^eme si ce n'est pas dans le m\^eme répertoire de destination car le catalogue des tests ne tient pas compte du chemin complet). Explication de son utilisation à la section \ref{subsection_vue_ensemble}\\ +\item[-] méthodologie pour ajouter un nouveau test : il n'y avait aucune section exposant clairement les étapes à suivre pour créer et ajouter un test, d'où la création de la section \ref{subsection_methodologie}\\ \end{itemize}%tiret %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Perl/verif_existence_repertoire_test.pl b/Perl/verif_existence_repertoire_test.pl new file mode 100755 index 0000000..4bf16d7 --- /dev/null +++ b/Perl/verif_existence_repertoire_test.pl @@ -0,0 +1,169 @@ +#!/usr/bin/perl +#!/usr/local/bin/perl +use strict; +use warnings; +use English; +use File::Basename; +my $NOM_PROG = basename $PROGRAM_NAME; + + +##################################################################################################### +# script pour savoir si il existe deja un repertoire de test d un certain nom +# (utile lorsque l on veut ajouter un test dans la batterie, pour verifier si le nom que +# l on souhaite donner au repertoire existe deja ou non) +# +# IMPORTANT : 1) on considere comme nom d un repertoire de test, uniquement la partie apres Test_R_ ou Test_L_ +# par exemple : nom reel du repertoire : Test_R_non_dynamique => nom retenu : non_dynamique +# +# ainsi, par exemple, ce script considerera que les repertoires Test_R_blabla et Test_L_blabla +# ont le meme nom : blabla +# +# 2) les comparaisons sont insensibles a la casse (BlaBla est considere comme egal a blabla) +##################################################################################################### + + + +########################################################################## +########################################################################## +########################################################################## +# +# RECUPERATION ET VERIFICATION DES ARGUMENTS ET OPTIONS DU SCRIPT +# +########################################################################## +########################################################################## +########################################################################## +#indicateur de l option -h ou -help => affichage aide +my $is_opt_help = 0; +foreach my $arg (@ARGV) { + if($arg =~ /-h/i or $arg =~ /-help/i) { + $is_opt_help = 1; + last; + } +} + +#-------------------------------------------------------------------------- +# affichage de l aide si option -h ou -help ou si il n y a pas assez d arguments +#-------------------------------------------------------------------------- +if($is_opt_help or $#ARGV < 0) { + afficher_ligne_tirets('print'); + print "Script $NOM_PROG \n"; + afficher_ligne_tirets('print'); + print " Description :\n"; + print " script pour savoir si un nom de repertoire de test existe deja\n"; + print " quelque part dans l arborescence.\n"; + print " 3 cas possibles :\n"; + print " - le repertoire existe deja\n"; + print " - le repertoire existe mais dans l autre type\n"; + print " (Test_R au lieu de Test_L ou inversement)\n"; + print " - le repertoire n existe si en Test_R, ni en Test_L\n"; + print "\n"; + print " Usage : $NOM_PROG nom_rep\n"; + print "\n"; + print " Argument obligatoire :\n"; + print " nom_rep : nom de repertoire (doit commencer par Test_R_ ou Test_L_)\n"; + print "\n"; + print " Options :\n"; + print " aucune...\n"; + print "\n"; + print " Remarques :\n"; + print " 1) le prefixe Test_R_ ou Test_L_ est considere comme faisant\n"; + print " partie du nom\n"; + print " (exemple : on considere que Test_R_abcdef n est pas egal\n"; + print " a Test_L_abcdef)\n"; + print " 2) test insensible a la casse\n"; + print " (exemple : on considere Test_R_AbCDef egal a Test_R_abcdef)\n"; + afficher_ligne_tirets('print'); + print "\n"; + exit; +} + +#nom du repertoire a rechercher +my $nom_rep_propose = shift(@ARGV); +($nom_rep_propose =~ /^(Test_[RL])_/) or die "\nErreur (prog:$NOM_PROG) : repertoire donne en argument doit commencer par Test_R_ ou TesT_L_ ...\n\n"; +#type de test (Rapide ou Long) (connu grace a la regexp de la ligne precedente) +my $type_test_propose = $1; +#nom du test sans son type +my ($nom_rep_propose_sans_type) = $nom_rep_propose =~ /^Test_[RL]_+(\S+)/; + + +#liste des repertoires de test existants (en chemin complet) +#--tests rapides (Test_R_) +my @rep_tests_existants_R = map {chomp; $_} qx(find . -name "Test_R_*" -type d); +#--tests rapides (Test_L_) +my @rep_tests_existants_L = map {chomp; $_} qx(find . -name "Test_L_*" -type d); + ###print "$_\n" for (@rep_tests_existants_R, @rep_tests_existants_L); exit; + +#comparaison entre les repertoires @rep_tests_existants et le repertoire propose en argument $nom_rep_propose +foreach my $rep_test_existant (@rep_tests_existants_R, @rep_tests_existants_L) { + #on va tester uniquement le nom du repertoire (et non son chemin complet) + # donc, on ne garde que le basename + my $nom_rep_existant_basename = basename $rep_test_existant; + + #recuperation de son type (Rapide ou Long) que l on supprime de la chaine + my ($type_test_existant) = $nom_rep_existant_basename =~ /^(Test_[RL])/; + + #nom sans le type + my ($nom_rep_existant_sans_type) = $nom_rep_existant_basename =~ /^Test_[RL]_+(\S+)/; + + #----------------------------------- + #comparaison (insensible a la casse) + #----------------------------------- + if($nom_rep_existant_sans_type =~ /^$nom_rep_propose_sans_type$/i) { + # cas 1) meme type de test => le repertoire existe deja => affichage du chemin complet vers le repertoire existant + if($type_test_existant eq $type_test_propose) { + print "\n"; + print "Le repertoire $nom_rep_propose existe deja :\n"; + print " => $rep_test_existant\n"; + print "\n"; + exit; + } + # cas 2) pas le meme type de test => le repertoire n existe pas mais existe sous un autre type de test => affichage du chemin complet vers le repertoire existant + else { + print "\n"; + print "Le repertoire $nom_rep_propose n existe pas mais existe sous une version $type_test_existant :\n"; + print " => $rep_test_existant\n"; + print "\n"; + exit; + } + } +}#foreach my $rep_test_existant (@rep_tests_existants_R, @rep_tests_existants_L) + +#si on arrive ici, c est que le repertoire n existe ni en version Rapide, ni en version Long => affichage de sa non existence +print "\n"; +print "Le repertoire $nom_rep_propose n existe pas\n"; +print "\n"; + + + + +########################################################################## +########################################################################## +########################################################################## +# +# SUBROUTINES +# +########################################################################## +########################################################################## +########################################################################## + + +##################################################################################################### +#subroutine permettant d ecrire une ligne de tirets de la largeur du terminal +##################################################################################################### +# +# en entree : +# - print ou warn (suivant que l on souhaite afficher avec print (donc vers STDOUT) ou warn (donc vers STDERR) +# +sub afficher_ligne_tirets { + use Term::ReadKey; + my $nb_char_largeur_terminal = ( GetTerminalSize() )[0];#largeur du terminal en nombre de caracteres (via package Term::ReadKey) + + my $funct_disp = shift; + + + my $ligne_tirets = ''; + $ligne_tirets .= '-' for(1 .. $nb_char_largeur_terminal); + + print "$ligne_tirets\n" if($funct_disp eq 'print'); + warn "$ligne_tirets\n" if($funct_disp eq 'warn'); +}#sub afficher_ligne_tirets diff --git a/doc_procedure_verification.pdf b/doc_procedure_verification.pdf index 7483c9c..ab9e38d 100644 Binary files a/doc_procedure_verification.pdf and b/doc_procedure_verification.pdf differ