Valider 78722f65 rédigé par marcimat@rezo.net's avatar marcimat@rezo.net
Parcourir les fichiers

Report de r99161 et r99162 :

 Homogénéisation du tableau de description des dépendances (nécessite, librairie, utilise et procure)
qui dans certains cas étaient décrites dans un tableau intermédiaire d'index 0, et parfois non.

En fait SVP lorsqu'il analyse les paquet/plugin.xml présents dans une archivelist.xml met
ces informations de dépendances dans un index 0, et parfois en plus semble t'il dans un index
de compatibilité de version de spip SI la balise <spip> est présente dans le paquet/plugin.xml en question.

Cependant que lorsqu'on récupère les informations de paquet.xml présents dans plugins/ ou plugins-dist/
par la fonction prévue par SPIP, les informations de dépendances ne sont pas indéxées elles dans cette clé 0,
inutile d'ailleurs car on ne récupère que les infos correspondante à notre version de SPIP utilisée.

Pour harmoniser, un morceau de code était utilisé dans SVP, mais un peu tard. Cela faisait que
la fonction plugins_preparer_sql_paquet() recevait à l'ajout d'un dépot des paquets avec des dépendances utilisant la clé [0],
mais actualisait ensuite les paquets locaux sans cet index ensuite lors de l'appel à svp_actualiser_paquets_locaux().

Et l'ajout récent du code relatif à la balise <procure> montrait des notices PHP dans la fonction preparer_sql (avant ce
problème n'était pas visible).

En déplaçant un peu plus tôt le code qui harmonise tout dans l'index 0 et en ajoutant 'procure' au passage dedans, ce problème rentre dans l'ordre.

Je pense que cela pouvait entrainer des erreurs dans le calcul de l'ordre d'installation / désinstallation des plugins locaux.
En relation donc avec ​https://core.spip.net/issues/3689
parent 0fa1ebca
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+36 −18
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -136,7 +136,7 @@ function svp_base_modifier_paquets_locaux($paquets_locaux) {
	include_spip('inc/svp_depoter_distant');

	// On ne va modifier QUE les paquets locaux qui ont change
	// Et cela en comparant les md5 des informations fouries.
	// Et cela en comparant les md5 des informations fournies.
	$signatures = array();

	// recuperer toutes les signatures 
@@ -252,6 +252,12 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) {
				$paquet['description'] = (isset($multis['description'])) ? $multis['description'] : '';
			}

			// On met les neccesite, utilise, procure, dans la clé 0
			// pour être homogène avec le résultat d'une extraction de paquet xml 
			// dans une source d'archives. cf svp_phraser_plugin()
			$paquet = svp_adapter_structure_dependances($paquet);


			$le_paquet = $paquet_base;
			#$le_paquet['traductions'] = serialize($paquet['traductions']);

@@ -361,23 +367,6 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) {
		foreach ($insert_paquets as $c => $p) {
			$insert_paquets[$c]['id_plugin'] = $cle_plugins[$p['prefixe']];
			$id_plugin_concernes[$insert_paquets[$c]['id_plugin']] = true;

			// remettre les necessite, utilise, librairie dans la cle 0
			// comme SVP
			if ($dep = unserialize($insert_paquets[$c]['dependances']) and is_array($dep)) {
				foreach ($dep as $d => $contenu) {
					if ($contenu) {
						$new = array();
						foreach ($contenu as $n) {
							unset($n['id']);
							$new[strtolower($n['nom'])] = $n;
						}
						$dep[$d] = array($new);
					}
				}
				$insert_paquets[$c]['dependances'] = serialize($dep);
			}

		}

		sql_insertq_multi('spip_paquets', $insert_paquets);
@@ -387,6 +376,35 @@ function svp_base_inserer_paquets_locaux($paquets_locaux) {
}


/**
 * Adapte la structure des dépendances d'un paquet xml lu par SPIP
 * à une structure attendue par SVP.
 * 
 * C'est à dire, met les necessite, utilises, lib, procure dans une sous clé 0
 * 
 * @note
 *     Cette clé 0 indique la description principale du paquet.xml 
 *     mais d'autres clés semblent pouvoir exister 
 *     si la balise `<spip>` est présente dedans
 * 
 * @see svp_phraser_plugin() côté SVP
 * @see plugins_fusion_paquet() côté SVP
 * 
 * @see plugins_get_infos_dist() côté SPIP (extractions de tous les paquets d'un dossier)
 *
 * @param array $paquet Description d'un paquet
 * @return array Description d'un paquet adaptée
**/
function svp_adapter_structure_dependances($paquet) {
	// mettre les necessite, utilise, librairie dans la cle 0
	foreach (array('necessite', 'utilise', 'lib', 'procure') as $dep) {
		if (!empty($paquet[$dep])) {
			$paquet[$dep] = array($paquet[$dep]);
		}
	}
	return $paquet;
}

/**
 * Fait correspondre l'état des métas des plugins actifs & installés
 * avec ceux en base de données dans spip_paquets pour le dépot local
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<paquet
	prefix="svp"
	categorie="maintenance"
	version="1.0.3"
	version="1.0.4"
	etat="stable"
	compatibilite="[3.1.0;3.1.*]"
	logo="svp-64.png"
+5 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -101,12 +101,14 @@ function plugins_preparer_sql_paquet($plugin) {
	$dependances['utilise'] = $plugin['utilise'];
	$champs['dependances'] = serialize($dependances);

	// Calculer le champ 'procure' (tableau sérialisé prefixe => version)
	$champs['procure'] = '';
	if (isset($plugin['procure']) and $plugin['procure']) {
	if (!empty($plugin['procure'][0])) {
		$champs['procure'] = array();
		foreach ($plugin['procure'] as $procure) {
		foreach ($plugin['procure'][0] as $procure) {
			$p = strtoupper($procure['nom']);
			if (!isset($champs['procure'][$p])
			if (
				!isset($champs['procure'][$p])
				or spip_version_compare($procure['version'], $champs['procure'][$p], '>')
			) {
				$champs['procure'][$p] = $procure['version'];
+5 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -95,12 +95,14 @@ function plugins_preparer_sql_plugin($plugin) {
	$dependances['utilise'] = $plugin['utilise'];
	$champs['dependances'] = serialize($dependances);

	// Calculer le champ 'procure' (tableau sérialisé prefixe => version)
	$champs['procure'] = '';
	if (isset($plugin['procure']) and $plugin['procure']) {
	if (!empty($plugin['procure'][0])) {
		$champs['procure'] = array();
		foreach ($plugin['procure'] as $procure) {
		foreach ($plugin['procure'][0] as $procure) {
			$p = strtoupper($procure['nom']);
			if (!isset($champs['procure'][$p])
			if (
				!isset($champs['procure'][$p])
				or spip_version_compare($procure['version'], $champs['procure'][$p], '>')
			) {
				$champs['procure'][$p] = $procure['version'];