Bonjour, déjà, merci d'avoir cliqué sur cette discussion, vous allez surement pouvoir m'aider ^^
Pour commencer, je vais résumer la situation :
Je développe une application Web en PHP afin de ( pour le moment ) afficher l'arborescence d'un dépot SVN ( Subversion ). Le truc, c'est qu'il faut que je fasse ressortir les fichiers qui ont été modifiés. Pour ça, j'ai fait un p'tit script ( qui marche sous UNIX, en bash ) que j'ai commenté ( ci dessous ), mais j'ai pas encore pu le tester en PHP pour la simple est bonne raison que je n'ai pas ( encore ) les accès au serveur PHP, donc c'est juste pour des points techniques, s'il manque des déclarations, ";" ou autre, osef !
Pour mon arborescence, qui est une fonction récursive, j'ai choisi de la faire dans un tableau à 2D pour que ça donne qqchose comme ça : ( version simplifiée )
i\j | ---- 0 | -------1| -------2 | .....
0 | Tags / | --------| -------- | ....
1 | -------| Projet1/ | ------- | ---------- | Projet2 / | ----------- | ....
2 | -------| --------| toto.txt | tagada.txt | ---------| toto_v2.txt | ....
( désolé c'est pas forcément très lisible, mais j'ai fait du mieux que je pouvais ! )
J'ai testé l'algo "arborescence" en shell, il fonctionne sans pb (par contre j'affiche que le dossier est modifié après les fichiers qu'il contient), même si en php j'ai peut-être des erreurs de syntaxe.function arborescence ($url_pere) {
exec("ls ".$url_pere."/",$liste) ; // exec() sert à lancer des commandes Unix depuis PHP, en théorie....
foreach ( $liste as $element ) {
$i++ ;}
cpt_modif = 0 ;
$url_element = $url_pere."/".$element ;
exec("[ -f \"".$url_element."\" ]",$test_fichier);
exec("[ -d \"".$url_element."\" ]",$test_dossier);
//Si l'élément est un dossier :
if ( $test_dossier == 0 ) {
// Si l'élément est un fichier :
$cpt_arbo++ ; // Ce compteur doit être une variable globale initialisée à 2
$saveJ = $j++ ;
$saveI = $i++ ;
// Je peux afficher ici le nom du dossier, avant l'appel, comme ça il sera avant, mais je ne connaitrais pas son statut (modifié/pas modifié)
arborescence ($url_element) ; // Appel récursif à partir du sous-dossier
$i = --$saveI ;
$j = --$saveJ ;
// Si l'élément a été modifié :
if ( $cpt_modif == 1 ) {
elseif ( $cpt_modif == 0 ) {
//Je récupère son nom parmis l'url complète, ex : /Work/Tags/Projet1/, je récupère Projet1 uniquement
exec($url_element." >> url_temp") ;
exec("grep . url_temp | cut -d/ -f2-".$cpt_arbo."", $temp);
$monTableau[$saveI][$saveJ] = "dm ".$temp ; // les deux premières lettres correspondent au statut : d pour dossier, m pour modifié
exec("rm url_temp") ;
$cpt_modif++ ; // On incréminte le compteur pour signaler que l'exécution appelante n'ait pas à resignaler la modification du dossier
}
$cpt_arbo-- ;
// Idem si le dossier n'a pas été modifié, on change juste les deux premieres lettre de son nom en "dn" pour "non modifié", ça correspond au statut du dossier
}
$j-- ;
}
elseif ( $test_fichier == 0 ) {
// On compare la version la plus récente contenue dans le dépôt Trunk (courant) de SubVersioN}
exec("diff ".$url_element." `svn ls -v -R | sort -r | find -name ".$element." | grep Trunk/ | sort -r | sed -e 2,10d`", $modif) ;
// Si l'élément a été modifié :
if ( $modif == 1 ) {
$monTableau[$i][$j] = "fm ".$element ;}
$cpt_modif++ ; // On incréminte le compteur pour signaler que le fichier est modifié
else {
$monTableau[$i][$j] = "fn ".$element ;}
}
Par contre, avec mon algo, je ne peux tester si un dossier a été modifié QU'une fois que j'ai regardé son contenu ( si au moins un fichier a été modifié ). Du coup, je suis obligé de faire qq bricolages pour que mon dossier soit situé avant dans monTableau ( d'où les saveI et saveJ ) et donc dans mon arborescence.
Mon pb, c'est que derrière ça, pour respecter le modèle MVC, j'ai une vue qui tente d'acceder à monTableau.
L'autre façon, ça aurait été de rentrer mon dossier AVANT, mais dans ce cas, je ne sais pas s'il a été modifié, et il faudrait que je teste dans ma vue si un des fichiers qui suit (au moins) est modifié pour décider du statut de mon dossier.....bref, ça serait un peu nawak, déjà que là....
Et voici ma vue :
Le pb, c'est que je ne suis pas du tout sûr de pouvoir accéder aux indices de $cellule contenue dans monTableau[][] dans cette vue, je ne suis pas du tout sur que getAttribute() serve à ça, et encore moins qu'elle marcherait dans mon cas. Ce qui fait que je ne peux pas récuppérer les indices i et j, et du coup, ça ne me permet pas de revenir tester où je suis dans mon arborescence.$monTableau = array(array()) ;
$monTableau = desssin_arborescence($_POST['url_pere'], $_POST['arg']) ;
echo "<uL>" ;
foreach $monTableau as $cellule {
if ( $cellule != NULL ) {}
$type = substring($cellule, 0, 2) ;
$nom = substring($cellule, 3) ;
$i = getAttribute($cellule, '$i') ;
$j = getAttribute($cellule, '$j') ;
if ( $monTableau[i-1][j-1] != NULL )echo "<uL>" ;
switch ( $type ) {
case "dn":}
echo "<li><img = src='images/dossier_non_modifie' alt='".$nom." est un dossier non modifié".$nom."</li>" ; break ;// Gestion des autres cas
if ( $monTableau[i+1][j+1] != NULL )echo "</uL>" ;
echo "<uL>" ;
}
En résumé, c'est un peu la pagaille dans mon code. Mon soucis c'est plutôt de savoir si j'ai une meilleure façon de faire que celle que j'utilise actuellement, parceque ça me complique pas mal....
Le topic est long, et compliqué, mais j'espère que quelqu'un aura la sympathie de passer qq minutes dessus. Merci d'avance !
Partager