[spip-dev] <utilise> non pris en compte en 2.1

Bonjour,

Je n'ai pas encore cherché plus loin, mais utilise n'est plus pris en compte en 2.1, du moins pas correctement...

soit un plugin qui a :

<necessite id='a' />
<utilise id='b' />

et que mon plugin surcharge un fichier de b... c'est celui de b qui est pris en compte. Si je passe <necessite id='b' />, c'est bien celui de mon plugin qui est pris... si je remets <utilise id='b' /> c'est toujours celui de mon plugin qui est pris (et plus celui de b pour le coup).

Bref, il se passe un truc louche à un moment donné qui fait que l'ordre de mise en place des chemins avec <utilise> n'est pas correctement traité.

- la condition de version est bien respectée dans le <utilise >, avant
et après ?
- le problème peut aussi venir du cache de chemin qui ne serait pas vidé

Cédric

Il semblerait que ça soit des lignes de ecrire/inc/plugin qui posent problème :

$utilise_ok = true;
if (!erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste_non_classee))
  $utilise_ok = !erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste);

Si je logue ces erreurs, pour le cas du plugin «documentation» qui surcharge un modèle du plugin «tradrub» en le déclarant en utilise (mais qui a d'autres déclarations nécessite et utilise aussi) donne :

echo "- $plug :: $necessite_ok - $utilise_ok;<br />\n";
echo "- $plug :: " . erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste_non_classee) . "<br />\n";
echo "- $plug :: " . erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste) . "<br />\n";

[...]

- minizone/plugin_documentation ::

     * Nécessite le plugin PORTE_PLUME en version minimum.
     * Nécessite le plugin TICKETS en version [1.62;] minimum.
     * Nécessite le plugin NOSPAM en version [0.6;] minimum.
     * Nécessite le plugin COLORATION_CODE en version [0.5.4;] minimum.
     * Nécessite le plugin PAGES en version minimum.

- minizone/plugin_documentation ::

     * Nécessite le plugin TRADRUB en version [1.2;] minimum.

- minizone/tradrub/210 :: 1 - 1;
- minizone/tradrub/210 ::

[...]

Comme le premier if (!erreur_necessite ... renvoie du contenu (normal, tous ces <utilise> sont déjà dans le tableau $liste qui est classé.) le second est pas appelé ET du coup $utilise_ok reste à true.

Le problème est bien plus complexe que ces 3 lignes. Je crois qu'il faut revoir ces tests pour utilise. Il y a plusieurs cas, il semble que je sois tombé sur un posant problème, mais un autre arrive en tentant de corriger, donc... Quelques cas :

Un plugin A indique qu'il utilise : B, C et D. Cas possibles :
1) B, C et D ne sont pas activés
2) B uniquement est actif
3) B C et D sont actifs.

Si on sauve au début $toute_la_liste = $liste_non_classee; (avant que ce tableau soit modifié), il contient la liste de tous les plugs qui seront actifs. La fonction erreur_necessite() va retourner différentes erreurs :

erreur_necessite($infos[$dir_type][$plug]['utilise'], $toute_la_liste))
1) necessite le plugin B, C et D
2) necessite le plugin C et D
3) rien.

si l'on dit :
if (!erreur_necessite($infos[$dir_type][$plug]['utilise'], $toute_la_liste))) {
  $utilise_ok = !erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste);
}

le test rentrera UNIQUEMENT si tous les plugins utilisés sont présents, pour tester si la liste ordonnée accepte ce plugin. Dans le cas où tous les <utilise> sont là, ou tous absents, ces tests fonctionnent. Le hic étant quand certains sont là seulement. Dans le cas 2) erreur_necessite retourne une erreur, donc $utilise_ok = true; reste à true. Ainsi, si le plugin B est après dans la $liste_non_classee, le plugin A sera tout de même inséré dans la $liste classée.

Le comportement était encore plus aléatoire avec le code actuellement dedans qui teste if (!erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste_non_classee))) ... vu que en fonction des éléments déjà classés, on aura ou non des erreurs. Dans ce cas là le problème principal est que le point 1) peut aussi créer un mauvais ordre de plugin.

Si $liste contient B et C, que $liste_non_classée contient A et D et qu'on traite A, erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste_non_classee) retourne des erreurs :
- necessite B et C (ils sont dans $liste). Comme ils retournent une erreur, le test d'après n'est pas effectué et $utilise_ok reste aussi à true, intégrant alors A avant D dans les plugins triés.

Bref, c'est complexe, et en plus, là, ça ne fonctionne pas.
Je me demande s'il ne faudrait pas faire un traitement qui enleve les erreurs d'utilise dont les plugins sont absents.

en gros :
$absents_mais_cest_pas_grave = erreur_necessite($infos[$dir_type][$plug]['utilise'], $toute_la_liste)); // tous les plugins "utilise" absents
$absents_liste_tries = erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste)); // tous les plugins "utilise" absents de la liste deja trie
if (count($absents_liste_tries) - count($absents_mais_cest_pas_grave)) > 0 { $utilise_ok=false; }

Ça fait revoir le retour de erreur_necessite() qui là ne renvoie que tu texte, mais un argument en plus pourrait lui faire retourner un tableau des erreurs, pourquoi pas.

Ça donnerait ce diff (testé). Gogogo ?

Index: ecrire/inc/plugin.php

Intégré à peu de chose près par http://trac.rezo.net/trac/spip/changeset/15422