Changeset 59476 in spip-zone


Ignore:
Timestamp:
Mar 17, 2012, 10:34:06 AM (8 years ago)
Author:
marcimat@…
Message:
  • Ajout de la colonne «prefixe» sur la table spip_paquets (qui duplique donc celle du plugin) ce qui permet une meilleure lisibilité dans la table et quelques jointures en moins potentiellement.
  • Ajout d'une colonne «attente» dans spip_paquets pour gérer le statut «attente» sur un plugin, statut un peu barbare du core de SPIP 3 : si un plugin était actif, mais qu'une de ses dépendance venait à manquer (par une suppression en FTP par exemple), le plugin se désactive TANT que sa dépendance n'est pas revenue, et le plugn reste visible dans les plugins actifs.

On gère cela dans SVP en laissant ce plugin dans les actifs, avec une belle erreur, tout en permettant à la fois de le désactiver, ou de l'activer (cela tentera de réactiver les dépendances manquantes).

Location:
_core_/plugins/svp
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/svp/base/svp_declarer.php

    r56743 r59476  
    115115                        "id_paquet"             => "bigint(21) NOT NULL",
    116116                        "id_plugin"             => "bigint(21) NOT NULL",
     117                        "prefixe"               => "varchar(30) DEFAULT '' NOT NULL",
    117118                        "logo"                  => "varchar(255) DEFAULT '' NOT NULL", // chemin du logo depuis la racine du plugin
    118119                        "version"               => "varchar(24) DEFAULT '' NOT NULL",
     
    139140                        "src_archive"   => "VARCHAR(255) DEFAULT '' NOT NULL", // source de l'archive sur le depot
    140141                        "traductions"   => "text DEFAULT '' NOT NULL", // tableau serialise par module des langues traduites et de leurs traducteurs
    141             "actif"                     => "varchar(3) DEFAULT 'non' NOT NULL", // est actif ? oui / non
    142                 "installe"              => "varchar(3) DEFAULT 'non' NOT NULL", // est desinstallable ? oui / non
    143                 "recent"                => "int(2) DEFAULT 0 NOT NULL", // a ete utilise recemment ? > 0 : oui
    144                 "maj_version"   => "VARCHAR(255) DEFAULT '' NOT NULL", // version superieure existante (mise a jour possible)
    145                 "superieur"             => "varchar(3) DEFAULT 'non' NOT NULL", // superieur : version plus recente disponible (distant) d'un plugin (actif?) existant
    146                 "obsolete"              => "varchar(3) DEFAULT 'non' NOT NULL", // obsolete : version plus ancienne (locale) disponible d'un plugin local existant
    147                 "constante"             => "VARCHAR(30) DEFAULT '' NOT NULL", // nom de la constante _DIR_(PLUGINS|EXTENSIONS|PLUGINS_SUPP)
    148                 "signature"             => "VARCHAR(32) DEFAULT '' NOT NULL"), // hash MD5 d'un paquet
     142                        "actif"                 => "varchar(3) DEFAULT 'non' NOT NULL", // est actif ? oui / non
     143                        "installe"              => "varchar(3) DEFAULT 'non' NOT NULL", // est desinstallable ? oui / non
     144                        "recent"                => "int(2) DEFAULT 0 NOT NULL", // a ete utilise recemment ? > 0 : oui
     145                        "maj_version"   => "VARCHAR(255) DEFAULT '' NOT NULL", // version superieure existante (mise a jour possible)
     146                        "superieur"             => "varchar(3) DEFAULT 'non' NOT NULL", // superieur : version plus recente disponible (distant) d'un plugin (actif?) existant
     147                        "obsolete"              => "varchar(3) DEFAULT 'non' NOT NULL", // obsolete : version plus ancienne (locale) disponible d'un plugin local existant
     148                        "attente"               => "varchar(3) DEFAULT 'non' NOT NULL", // attente : plugin semi actif (il etait actif, mais il lui manque maintenant une dependance : il reste coche actif jusqu'a resolution ou desactivation manuelle)
     149                        "constante"             => "VARCHAR(30) DEFAULT '' NOT NULL", // nom de la constante _DIR_(PLUGINS|EXTENSIONS|PLUGINS_SUPP)
     150                        "signature"             => "VARCHAR(32) DEFAULT '' NOT NULL"), // hash MD5 d'un paquet
    149151                'key'                                   => array(
    150152                        "PRIMARY KEY"   => "id_paquet",
  • _core_/plugins/svp/formulaires/admin_plugin.html

    r56134 r59476  
    11<div class="formulaire_spip formulaire_admin_plugin" id="formulaire_admin_plugin">
    2         <h3 class="titrem">[(#CHEMIN_IMAGE{plugin-24.gif}|balise_img{icone plugin-24,cadre-icone})]<:plugins_liste:></h3>
     2        <h3 class="titrem">[(#CHEMIN_IMAGE{plugin-24.png}|balise_img{icone plugin-24,cadre-icone})]<:plugins_liste:></h3>
    33        [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
    44        [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
  • _core_/plugins/svp/formulaires/admin_plugin.php

    r59354 r59476  
    6464                                        $a_actionner[$i] = $action;
    6565                                }
    66                         }                       
     66                        }
    6767                }
    6868                // lancer les verifications
  • _core_/plugins/svp/formulaires/inc-admin_plugin.html

    r59354 r59476  
    33<div class="liste plugins">
    44        <ul class="liste-items">
    5 <BOUCLE_plugins(PAQUETS plugins){tout}{par multi nom, prefixe}{!par constante, actif}{id_depot=0}{actif ?}{constante ?IN #ENV{constante}}>
     5<BOUCLE_plugins(PAQUETS plugins){tout}{par multi nom, paquets.prefixe}{!par constante, actif}{id_depot=0}{actif ?}{constante ?IN #ENV{constante}}>
    66                #SET{incompatible, #COMPATIBILITE_SPIP|plugin_version_compatible{#GET{vspip}}|non}
    77                #SET{verrou,#CONSTANTE|=={_DIR_EXTENSIONS}|oui}
    8                 <li class="item[ (#ACTIF|=={oui}|?{actif,inactif})][(#OBSOLETE|=={oui}|ou{#GET{incompatible}}|oui) disabled][(#GET{verrou}|oui) verrou][(#MAJ_VERSION|oui) up]"[ id="(#PREFIXE|strtolower)-#COMPTEUR_BOUCLE"]>
    9                         [(#OBSOLETE|=={non}|et{#CONSTANTE|!={_DIR_EXTENSIONS}}|et{#GET{incompatible}|non}|oui)
     8                <li class="item[ (#ACTIF|=={oui}|?{actif,inactif})][(#OBSOLETE|=={oui}|ou{#ATTENTE|=={oui}}|ou{#GET{incompatible}}|oui) disabled][(#GET{verrou}|oui) verrou][(#MAJ_VERSION|oui) up]"[ id="(#PREFIXE|strtolower)-#COMPTEUR_BOUCLE"]>
     9                        [(#OBSOLETE|=={non}|et{#CONSTANTE|!={_DIR_EXTENSIONS}}|et{#GET{incompatible}|non}|ou{#ATTENTE|=={oui}}|oui)
    1010                        <div class="check">
    1111                                <input type="checkbox" class="checkbox select_plugin" name="ids_paquet[(#VAL{91}|chr)][(#VAL{93}|chr)]" value="#ID_PAQUET" />
     
    1717                                <span class="etat">[ - (#ETAT)]</span>
    1818                                [(#SET{erreur,[<span class="information">(#OBSOLETE|=={oui}|oui)<:svp:info_plugin_obsolete:></span> ]})]
     19                                [(#SET{erreur,[(#GET{erreur}|concat{[- <span class="information">(#ATTENTE|=={oui}|oui)<:svp:info_plugin_attente_dependance:></span> ]})]})]
    1920                                [(#SET{erreur,[(#GET{erreur}|concat{[- <span class="information">(#GET{incompatible}|oui)<:svp:info_plugin_incompatible:></span>]})]})]
    2021                                <div class="short">[(#GET{erreur}|ltrim{'-'}|sinon{#SLOGAN|extraire_multi|typo|sinon{#DESCRIPTION|extraire_multi|propre}|PtoBR|explode{'<br />'}|reset|couper{80}})]</div>
     
    3536                        ]
    3637                        [(#OBSOLETE|=={non}|et{#CONSTANTE|!={_DIR_EXTENSIONS}}|et{#GET{incompatible}|non}|oui)
    37                                 [(#ACTIF|=={oui}|non)
     38                                [(#ACTIF|=={oui}|non|ou{#ATTENTE|=={oui}})
    3839                                        <input type="submit" name="[(#ID_PAQUET|svp_nom_action{on})]" class="submit" value="<:svp:bouton_activer:>" />
    3940                                ]
  • _core_/plugins/svp/formulaires/inc-confirmer_actions.html

    r55799 r59476  
    11
    22<input type="hidden" name="_todo" class='hidden' value="[(#ENV{_todo})]" />
    3                
     3
    44[<div class="reponse_formulaire reponse_formulaire_erreur">
    5         (#ENV**{erreurs}|table_valeur{decideur_erreurs}|foreach{svp_presenter_actions})
     5        (#ENV**{erreurs/decideur_erreurs}|foreach{svp_presenter_actions})
    66</div>]
    77
    88[<div id="charger_plugin_confirm">
    9        
     9
    1010        <div class="reponse_formulaire reponse_formulaire_ok">
    1111                <strong><:svp:actions_demandees:></strong>
    12                 <ul>(#ENV**{erreurs}|table_valeur{decideur_demandes}|foreach{svp_presenter_actions})</ul>
     12                <ul>(#ENV**{erreurs/decideur_demandes}|foreach{svp_presenter_actions})</ul>
    1313        </div>
    1414        [<div class="reponse_formulaire reponse_formulaire_ok">
    1515                <strong><:svp:actions_necessaires:></strong>
    16                 <ul>(#ENV**{erreurs}|table_valeur{decideur_propositions}|foreach{svp_presenter_actions})</ul>
     16                <ul>(#ENV**{erreurs/decideur_propositions}|foreach{svp_presenter_actions})</ul>
    1717        </div>]
    1818        <p class="boutons">
  • _core_/plugins/svp/inc/svp_decider.php

    r57485 r59476  
    1515        );
    1616
    17     // plugins actifs a la fin des modifications effectuees
    18     var $end = array(
    19         'i' => array(),
    20         'p' => array(),
    21     );
    22 
    23     // plugins procure par SPIP
    24     var $procure = array();
     17        // plugins actifs a la fin des modifications effectuees
     18        var $end = array(
     19                'i' => array(),
     20                'p' => array(),
     21        );
     22
     23        // plugins procure par SPIP
     24        var $procure = array();
    2525
    2626        var $ask = array();     // toutes les actions a faire demandees
     
    4444        /* Liste des plugins deja actifs */
    4545        function liste_plugins_actifs() {
    46                 return $this->infos_courtes('pa.actif='.sql_quote('oui'));
    47         }
    48 
    49     /* Liste des plugins procure par SPIP */
    50     function liste_plugins_procure() {
    51         $procure = array();
    52         $get_infos = charger_fonction('get_infos','plugins');
    53         $infos['_DIR_RESTREINT'][''] = $get_infos('./',false,_DIR_RESTREINT,'plugin.xml');
    54 
    55         foreach($infos['_DIR_RESTREINT']['']['procure'] as $_procure) {
    56                 $prefixe = strtoupper($_procure['id']);
    57                 $procure[$prefixe] = $_procure['version'];
    58         }
    59 
    60         return $procure;
    61     }
     46                return $this->infos_courtes(array('pa.actif='.sql_quote('oui'),  'pa.attente=' . sql_quote('non')));
     47        }
     48       
     49        /* Liste des plugins en attente */
     50        function est_attente_id($id) {
     51                static $attente = null;
     52                if (is_null($attente)) {
     53                        $attente = $this->infos_courtes('pa.attente=' . sql_quote('oui'));
     54                }
     55                return isset($attente['i'][$id]) ? $attente['i'][$id] : false;
     56        }
     57
     58        /* Liste des plugins procure par SPIP */
     59        function liste_plugins_procure() {
     60                $procure = array();
     61                $get_infos = charger_fonction('get_infos','plugins');
     62                $infos['_DIR_RESTREINT'][''] = $get_infos('./',false,_DIR_RESTREINT,'plugin.xml');
     63
     64                foreach($infos['_DIR_RESTREINT']['']['procure'] as $_procure) {
     65                        $prefixe = strtoupper($_procure['id']);
     66                        $procure[$prefixe] = $_procure['version'];
     67                }
     68
     69                return $procure;
     70        }
    6271
    6372        function log($quoi) {
     
    9099                );
    91100
    92         $from = array('spip_paquets AS pa', 'spip_plugins AS pl');
     101                $from = array('spip_paquets AS pa', 'spip_plugins AS pl');
    93102                $orderby = $multiple ? 'pa.etatnum DESC' : '';
    94         $where = array('pa.id_plugin = pl.id_plugin');
    95         if (is_array($condition))
    96             $where = array_merge($where, $condition);
    97         else
    98             $where[] = $condition;
    99 
    100         include_spip('inc/filtres'); // extraire_multi()
     103                $where = array('pa.id_plugin = pl.id_plugin');
     104                if (is_array($condition))
     105                        $where = array_merge($where, $condition);
     106                else
     107                        $where[] = $condition;
     108
     109                include_spip('inc/filtres'); // extraire_multi()
    101110                $res = sql_allfetsel(array(
    102111                        'pa.id_paquet AS i',
     
    424433                                                // (il l'est peut etre deja)
    425434                                                if ($info = $this->sera_actif_id($id)
    426                                                 or  $info_off = $this->sera_off_id($id)) {
     435                                                or  $info_off = $this->sera_off_id($id)
     436                                                // un plugin en attente (desactive parce sa dependance a disparu certainement par ftp)
     437                                                // peut etre desactive
     438                                                or $info = $this->est_attente_id($id)) {
    427439                                                        // annuler le signalement en "proposition" (due a une mise a 'off' recursive)
    428440                                                        // de cet arret de plugin, vu qu'on le demande reellement
     
    431443                                                                $this->annule_change($info);
    432444                                                        }
    433                                                         $this->log("--> $t : " . $info['p'] . ' en version : ' . $info['v'] );
     445                                                        $this->log("--> $t : " . $info['p'] . ' en version : ' . denormaliser_version($info['v']) );
    434446                                                        $this->ask($info, $t);
    435447                                                        $this->todo($info, $t);
     
    521533                        return false;
    522534                }
    523                                        
     535
    524536                // 2
    525537                // ajouter les librairies necessaires a notre paquet
     
    548560                                                        'v' => $l['lien'],
    549561                                                ), 'getlib');
     562                                                $this->log("- La librairie $lib sera a télécharger");
    550563                                        }
    551                                        
    552564                                }
    553565                        }
     
    571583                                }
    572584
    573                 // le core procure le paquet que l'on demande !
    574                 elseif ((array_key_exists($p, $this->procure))
    575                   and (plugin_version_compatible($v, $this->procure[$p]))) {
    576                     // rien a faire...
    577                     $this->log("-- est procure par le core ($p)");
     585                                // le core procure le paquet que l'on demande !
     586                                elseif ((array_key_exists($p, $this->procure))
     587                                  and (plugin_version_compatible($v, $this->procure[$p]))) {
     588                                        // rien a faire...
     589                                        $this->log("-- est procure par le core ($p)");
    578590
    579591                                }
  • _core_/plugins/svp/inc/svp_depoter_distant.php

    r58932 r59476  
    7979function svp_supprimer_depot($id){
    8080        $id = intval($id);
    81        
     81
    8282        // Pas de depot a cet id ?
    8383        if (!$id_depot = sql_getfetsel('id_depot', 'spip_depots', 'id_depot='. sql_quote($id)) ){
     
    8787        // on calcule les versions max des plugins heberges par le depot
    8888        $vmax =array();
    89                        
     89
    9090        if ($resultats = sql_allfetsel('id_plugin, version', 'spip_paquets', 'id_depot='. sql_quote($id))) {
    9191                foreach ($resultats as $paquet) {
     
    428428                                                }
    429429                                        }
    430        
     430
    431431                                        // On traite maintenant le paquet connaissant l'id du plugin
    432432                                        // temporaire qui sera supprime lors de la connaissance de l'id_paquet
     
    446446                                        // Ce n'est pas un plugin, donc id_plugin=0 et toutes les infos plugin sont nulles
    447447                                        $insert_paquet['id_plugin'] = 0;
    448                                         $insert_contribs[] = $insert_paquet;                            }
    449                                 else
     448                                        $insert_contribs[] = $insert_paquet;
     449                                } else
    450450                                        $collision = true;
    451451                        }
     
    531531       
    532532        if (count($insert_paquets)) {
    533                
     533
     534                // on cherche tous les id_plugin/prefixe que l'on a a recuperer
     535                // en une seule requete
    534536                $prefixes_manquants = array();
    535537                foreach ($insert_paquets as $p) {
     538                        // on ne connait que le prefixe
    536539                        if (isset($p['prefixe']) and !isset($prefixes[ $p['prefixe'] ])) {
    537                                 $prefixes_manquants[] = $p['prefixe'];
    538                         }
     540                                $prefixes_manquants[] = $p['prefixe']; 
     541                        } 
    539542                }
    540543
     
    546549
    547550                // inserer les id_plugin dans les paquets a inserer
     551                // inserer le prefixe dans le paquet (pour raccourcis de jointures)
    548552                foreach ($insert_paquets as $c=>$p) {
    549553                        if (isset($p['prefixe'])) {
    550554                                $insert_paquets[$c]['id_plugin'] = $prefixes[ $insert_paquets[$c]['prefixe'] ];
    551                                 unset($insert_paquets[$c]['prefixe']);
     555                        } else {
     556                                $insert_paquets[$c]['prefixe'] = array_search($p['id_plugin'], $prefixes);
    552557                        }
    553558                }
  • _core_/plugins/svp/inc/svp_depoter_local.php

    r57483 r59476  
    143143        $installes  = lire_config('plugin_installes');
    144144        $actifs  = lire_config('plugin');
     145        $attentes  = lire_config('plugin_attente');
    145146
    146147        foreach($paquets_locaux as $const_dir => $paquets) {
     
    209210                                }
    210211
    211                                 // ajout du prefixe dans le paquet, supprime avant insertion...
     212                                // ajout du prefixe dans le paquet
    212213                                $le_paquet['prefixe']     = $prefixe;
    213214                                $le_paquet['constante']   = $const_dir;
     
    217218                                $le_paquet['obsolete']    = 'non';
    218219                                $le_paquet['signature']   = $paquet['signature'];
    219                                
     220
     221                                // le plugin est il actuellement actif ?
    220222                                $actif = "non";
    221223                                if (isset($actifs[$prefixe])
     
    225227                                }
    226228                                $le_paquet['actif'] = $actif;
     229
     230                                // le plugin etait il actif mais temporairement desactive
     231                                // parce qu'une dependence a disparue ?
     232                                $attente = "non";
     233                                if (isset($attentes[$prefixe])
     234                                        and ($attentes[$prefixe]['dir_type'] == $const_dir)
     235                                        and ($attentes[$prefixe]['dir'] == $chemin)) {
     236                                        $attente = "oui";
     237                                        $le_paquet['actif'] = "oui"; // il est presenté dans la liste des actifs (en erreur).
     238                                }
     239                                $le_paquet['attente'] = $attente;
     240
    227241                                // on recherche d'eventuelle mises a jour existantes
    228242                                if ($res = sql_allfetsel(
     
    270284                        $insert_paquets[$c]['id_plugin'] = $cle_plugins[$p['prefixe']];
    271285                        $id_plugin_concernes[ $insert_paquets[$c]['id_plugin'] ] = true;
    272                         unset($insert_paquets[$c]['prefixe']);
    273286
    274287                        // remettre les necessite, utilise, librairie dans la cle 0
     
    304317        $installes  = lire_config('plugin_installes');
    305318        $actifs  = lire_config('plugin');
     319        $attentes  = lire_config('plugin_attente');
    306320
    307321        $locaux = sql_allfetsel(
    308                 array('pa.id_paquet', 'pl.prefixe', 'pa.actif', 'pa.installe', 'pa.constante', 'pa.src_archive'),
    309                 array('spip_paquets AS pa', 'spip_plugins AS pl'),
    310                 array('pa.id_plugin=pl.id_plugin', 'id_depot='.sql_quote(0)));
     322                array('id_paquet', 'prefixe', 'actif', 'installe', 'attente', 'constante', 'src_archive'),
     323                'spip_paquets',
     324                'id_depot='.sql_quote(0));
    311325        $changements = array();
    312326
     
    322336                        $copie['actif'] = "non";
    323337                }
    324                        
     338               
     339                // attente ?
     340                if (isset($attentes[$prefixe])
     341                        and ($attentes[$prefixe]['dir_type'] == $l['constante'])
     342                        and ($attentes[$prefixe]['dir'] == $l['src_archive'])) {
     343                        $copie['attente'] = "oui";
     344                        $copie['actif'] = "oui"; // il est presente dans la liste des actifs (en erreur).
     345                } else {
     346                        $copie['attente'] = "non";
     347                }
     348               
    325349                // installe ?
    326350                if (in_array($l['src_archive'], $installes)) {
     
    331355
    332356                if ($copie != $l) {
    333                         $changements[ $l['id_paquet'] ] = array( 'actif'=> $copie['actif'], 'installe'=>$copie['installe'] );
     357                        $changements[ $l['id_paquet'] ] = array(
     358                                'actif'    => $copie['actif'],
     359                                'installe' => $copie['installe'],
     360                                'attente'  => $copie['attente'] );
    334361                }
    335362        }
     
    340367                        sql_demarrer_transaction();
    341368                }
    342                                
     369
    343370                foreach ($changements as $id_paquet => $data) {
    344371                        sql_updateq('spip_paquets', $data, 'id_paquet=' . intval($id_paquet));
    345372                }
    346                
     373
    347374                if (sql_preferer_transaction()) {
    348375                        sql_terminer_transaction();
  • _core_/plugins/svp/lang/svp_fr.php

    r59471 r59476  
    124124        'info_plugin_installe' => 'déjà installé',
    125125        'info_plugin_obsolete' => 'version obsolète',
     126        'info_plugin_attente_dependance' => 'dépendences manquantes',
    126127        'info_plugins_disponibles' => '@total_plugins@ plugin(s) disponible(s)',
    127128        'info_plugins_heberges' => '@total_plugins@ plugin(s) hébergé(s)',
  • _core_/plugins/svp/paquet.xml

    r59471 r59476  
    22        prefix="svp"
    33        categorie="maintenance"
    4         version="0.77.0"
     4        version="0.78.0"
    55        etat="test"
    66        compatibilite="[3.0.0-beta;3.0.*]"
    77        logo="svp-64.png"
    8         schema="0.2"
     8        schema="0.3"
    99        documentation="http://blog.smellup.net/spip.php?rubrique1"
    10 >       
     10>
    1111
    1212        <nom>SVP</nom>
  • _core_/plugins/svp/svp_administrations.php

    r55614 r59476  
    99        $maj['create'][] = array('maj_tables', array('spip_depots','spip_plugins','spip_depots_plugins','spip_paquets'));
    1010        $maj['0.2'][]    = array('maj_tables', 'spip_paquets');
    11        
     11        $maj['0.3'][]    = array('maj_tables', 'spip_paquets'); // prefixe et attente
     12        $maj['0.3'][]    = array('svp_synchroniser_prefixe');
     13
    1214        include_spip('base/upgrade');
    1315        maj_plugin($nom_meta_base_version, $version_cible, $maj);
     
    2426}
    2527
     28
     29// ajoute le prefixe des plugins dans chaque ligne de paquets
     30function svp_synchroniser_prefixe() {
     31        $paquets = sql_allfetsel(
     32                array('pa.id_paquet', 'pl.prefixe'),
     33                array('spip_paquets AS pa', 'spip_plugins AS pl'),
     34                'pl.id_plugin=pa.id_plugin');
     35
     36        if ($paquets) {
     37                // On insere, en encapsulant pour sqlite...
     38                if (sql_preferer_transaction()) {
     39                        sql_demarrer_transaction();
     40                }
     41               
     42                foreach ($paquets as $paquet) {
     43                        sql_updateq('spip_paquets',
     44                                array('prefixe' => $paquet['prefixe']),
     45                                'id_paquet=' . intval($paquet['id_paquet']));
     46                }
     47
     48                if (sql_preferer_transaction()) {
     49                        sql_terminer_transaction();
     50                }
     51        }
     52}
    2653?>
Note: See TracChangeset for help on using the changeset viewer.