Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/04/2008, 14h45   #1
Modérateur
 
Avatar de Er3van
 
Homme Clément
Architecte Logiciel
Inscription : avril 2008
Messages : 1 370
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Architecte Logiciel
Secteur : Industrie

Informations forums :
Inscription : avril 2008
Messages : 1 370
Points : 2 093
Points : 2 093
Par défaut [Système] PHP + Linux + SVN - Besoin d'aide sur des petits points

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 ! )
Citation:
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 ) {

$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 ) {

//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
}
elseif ( $cpt_modif == 0 ) {


// 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
}
$cpt_arbo-- ;
$j-- ;
}
// Si l'élément est un fichier :
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 ;
}
}
}

}
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.

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 :

Citation:
$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&eacute;".$nom."</li>" ; break ;
// Gestion des autres cas
}

if ( $monTableau[i+1][j+1] != NULL )
echo "</uL>" ;
}
echo "<uL>" ;
}
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.


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 !
Er3van est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 15h00   #2
Membre Expert
 
Avatar de darkstar123456
 
Inscription : mars 2008
Messages : 1 180
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Belgique

Informations forums :
Inscription : mars 2008
Messages : 1 180
Points : 1 357
Points : 1 357
Envoyer un message via Skype™ à darkstar123456
hmmm je capte pas bien tout ce que tu veux faire mais d'après ce que j'ai lu, dans ton premier code tu as un soucis...

Tu veux faire appel à ta fonction de manière récursive en fonction de la valeur de $cpt_modif, or... $cpt_modif = TOUJOURS 0 vu qu'en début de fonction tu écris

$cpt_modif = 0;

darkstar123456 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 15h22   #3
Modérateur
 
Avatar de Er3van
 
Homme Clément
Architecte Logiciel
Inscription : avril 2008
Messages : 1 370
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Architecte Logiciel
Secteur : Industrie

Informations forums :
Inscription : avril 2008
Messages : 1 370
Points : 2 093
Points : 2 093
Je n'ai pas précisé, mais il y a des variables locales et globales, dont cpt_arbo qui est globale.

Pour cpt modif, j'avoue qu'effectivement, ça ne devrait pas marcher :S
Mais la magie d'Unix..... lol
En changeant de place cette affectation, en la mettant par exemple juste avant l'appel récursif, ça ne fonctionne plus ( enfin, ça ne marche plus pour tous ).

J'avais eu un pb dessus, mais je ne me rapppelle plus pk j'ai du mettre cette affectation ici, faudrait que je vérifie. M'enfin, c'est pas tant mon pb, l'algo marche, c'est juste que je doute de la methodologie.

Pour réexpliquer ce que je veux faire :

Je veux afficher une arborescence d'un dépot SVN, si vous ne connaissez pas, c'est un logiciel de versionning. En résumé, il s'organise selon 3 répertoire : Trunk, le tronc commum, Tags, qui sont les sauvegardes, et Branche qui est la partie expérimentale, où on fait les principaux développement. SVN permet qq fonctionnalités, mais en gros son boulot c'est d'organiser, gérer les sauvegardes, MaJ, et d'affecter des numéros de révisions ( qui permettent de savoir de quand date un fichier ou un MaJ ).
En gros, t'as un fichier config.php dasn Trunk/, à la révision 0 il vaut "XXXX : 1965". Tu sauvegarde la révision 0 dans Tags/ .Si tu le modifie en "XXXX : 1578", tu seras à la révision 1. Et donc la version 0 contenue dans Tags ne sera plus à jour.

Ce que je veux, c'est tester si mon contenu du répertoire Tags est à jour ou pas, par rappport au répertoire Trunk ( courant ). La partie du test de la modif du fichier, c'est une façon détourner via Unix de faire ce que SVN ne peut/veut pas faire ( ie comparer deux fichiers contenus dans deux répertoires distincts, SVN ne veut le faire qu'entre deux révisions d'un même fichier ).

Au final, j'ai plus besoin d'aide sur le "comment faire" que sur le "ça marche pas ton algo", puisque je sais comment je peux faire ( à peu près, faut juste que je recherche un peu plus les bonnes fonctions), c'est juste qu'à mon avis c'est pas du tout optimal, c'est plutôt du bidouillage....
Er3van est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 14h24   #4
Modérateur
 
Avatar de Er3van
 
Homme Clément
Architecte Logiciel
Inscription : avril 2008
Messages : 1 370
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Architecte Logiciel
Secteur : Industrie

Informations forums :
Inscription : avril 2008
Messages : 1 370
Points : 2 093
Points : 2 093
Bonjour !

Bon, j'ai fais pas mal de modif depuis hier :

J'ai créé mon controleur ( bêtement appelé index.php ), créé une vue FrontView découpée en plusieurs partie, dont VueArbo qui contient le code pour afficher l'arborescence.

J'ai installé un p'tit EasyPHP pour tester mon code et ça marche, par contre j'ai changé pas mal de points : plus de foreach mais un simple for avec parcours "intelligent" ( par rapport à mon tableau de base montré plus haut, il ne parcours pas l'intégralité, ce qui limite les pertes de temps ).

Mon modèle MVC est implémenté à la va vite, mais en théorie j'dois pas être loin. Le seul truc qu'il me reste à tester c'est le script arborescence, contenu dans Model_Arborescence, que je ne lance pour le moment pas ( j'suis pas sur le serveur contenant le dépot, donc ça risque de faire grand chose ^^ ). Du coup j'ai déclaré un tableau 2D en dur, qui est l'équivalent de ce que doit me renvoyer arborescence.

J'ai joint les fichiers, si y en a qui veulent jeter un coup d'oeil pour me donner leur avis je suis prenneur
Fichiers attachés
Type de fichier : php index.php (1,2 Ko, 2 affichages)
Type de fichier : php FrontView.php (411 octets, 2 affichages)
Type de fichier : php VueArbo.php (2,7 Ko, 2 affichages)
Type de fichier : php Model_Arborescence.php (3,5 Ko, 2 affichages)
Er3van est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h00.


 
 
 
 
Partenaires

Hébergement Web