Changeset 110792 in spip-zone


Ignore:
Timestamp:
Jun 21, 2018, 3:25:54 PM (3 years ago)
Author:
marcimat@…
Message:

Réécriture de "plugins:lister".
On remet le code de Polatouche pour cette fonction.

  • N’affiche pas par défaut les plugins "procurés"
  • N’affiche pas par défaut les extensions PHP
  • Beaucoup d’options.

Exemple :
`
spip plugins:lister --short
spip plugins:lister --no-dist
spip plugins:lister --php
spip plugins:lister --inactifs --short
`

  • Permet d’exporter la liste des préfixes des plugins actifs

dans un fichier tmp/plugins.txt (genre avant une migation)
(une commande à venir permettra de réactiver des plugins à partir de ce fichier)

spip plugins:lister --export

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _outils_/spip-cli/trunk/src/Command/PluginsLister.php

    r110765 r110792  
    33namespace Spip\Cli\Command;
    44
     5use Spip\Cli\Console\Style\SpipCliStyle;
     6use Spip\Cli\Loader\Spip;
    57use Symfony\Component\Console\Command\Command;
    6 use Symfony\Component\Console\Input\InputArgument;
    78use Symfony\Component\Console\Input\InputInterface;
    89use Symfony\Component\Console\Input\InputOption;
    910use Symfony\Component\Console\Output\OutputInterface;
    10 use Symfony\Component\Console\Helper\Table;
     11
    1112
    1213class PluginsLister extends Command {
    13     protected function configure() {
    14         $this
    15             ->setName('plugins:lister')
    16             ->setDescription('Lister les plugins activés.')
    17             ->addOption(
    18                 'disponibles',
    19                 'd',
    20                 InputOption::VALUE_NONE,
    21                 'Montrer les plugins disponibles'
    22             )
    23             ->addOption(
    24                 'inactifs',
    25                 'i',
    26                 InputOption::VALUE_NONE,
    27                 'Montrer les plugins inactifs'
    28             )
    29         ;
    30     }
    31 
    32     protected function execute(InputInterface $input, OutputInterface $output) {
    33         global $spip_loaded;
    34         global $spip_racine;
    35         global $cwd;
    36 
    37         if ($spip_loaded) {
    38             chdir($spip_racine);
    39 
    40             if ($input->getOption('disponibles')) {
    41 
    42                 $plugins = lister_plugins(
    43                     'paquets.constante="_DIR_PLUGINS"'
    44                 );
    45 
    46             } else if ($input->getOption('inactifs')) {
    47 
    48                 $plugins = lister_plugins(array(
    49                     'paquets.constante="_DIR_PLUGINS"',
    50                     'paquets.actif!="oui"',
    51                 ));
    52 
    53             } else {
    54 
    55                 $plugins = unserialize($GLOBALS['meta']['plugin']);
    56 
    57             }
    58 
    59             include_spip('inc/filtres');
    60             $data = array_map(function ($plugin) {
    61                 return array(
    62                     trim(html_entity_decode(
    63                         extraire_multi($plugin['nom'], 'fr'))),
    64                     $plugin['etat'],
    65                     joli_no_version($plugin['version']),
    66                 );
    67             }, $plugins);
    68 
    69             $table = new Table($output);
    70             $table->setHeaders(array('Nom', 'État', 'Version'));
    71             $table->setRows($data);
    72             $table->render();
    73 
    74             chdir($cwd);
    75 
    76         } else {
    77 
    78             $output->writeln("<comment>Vous n'êtes pas dans une installation de SPIP, il n'y a pas de plugins disponibles.</comment>");
    79 
    80         }
    81     }
     14
     15        /** @var SpipCliStyle */
     16        protected $io;
     17
     18        protected function configure() {
     19                $this->setName("plugins:lister")
     20                        ->setDescription("Liste les plugins du site.")
     21                        ->addOption('dist', null, InputOption::VALUE_NONE, 'Uniquement les plugins dist')
     22                        ->addOption('no-dist', null, InputOption::VALUE_NONE, 'Exclure les plugins dist')
     23                        ->addOption('procure', null, InputOption::VALUE_NONE, 'Uniquement les plugins procurés')
     24                        ->addOption('php', null, InputOption::VALUE_NONE, 'Uniquement les extensions PHP présentes')
     25                        ->addOption('spip', null, InputOption::VALUE_NONE, 'Uniquement SPIP')
     26                        ->addOption('short', null, InputOption::VALUE_NONE, 'Affiche simplement le préfixe')
     27
     28                        ->addOption('inactifs', null, InputOption::VALUE_NONE, 'Liste les plugins inactifs.')
     29
     30                        ->addOption('export', 'e', InputOption::VALUE_NONE, 'Exporter la liste des plugins actifs dans un fichier')
     31                        ->addOption('name', null, InputOption::VALUE_OPTIONAL, 'Nom du fichier d’export', 'plugins')
     32                ;
     33        }
     34
     35        protected function execute(InputInterface $input, OutputInterface $output) {
     36                $this->io = $this->getApplication()->getIO($input, $output);
     37
     38                /** @var Spip $spip */
     39                $spip = $this->getApplication()->getService('spip.loader');
     40                $spip->load();
     41                $spip->chdir();
     42
     43                $this->io->title("Liste des plugins");
     44
     45                $this->actualiserPlugins();
     46
     47                if ($input->getOption('inactifs')) {
     48                        $this->showInactifs($input);
     49                } elseif ($input->getOption('export')) {
     50                        $this->exportActifs($input);
     51                } else {
     52                        $this->showActifs($input);
     53                }
     54        }
     55
     56        public function showActifs(InputInterface $input) {
     57                $options = [
     58                        'dist' => null,
     59                        'procure' => false,
     60                        'php' => false,
     61                        'spip' => false,
     62                ];
     63                $list = [];
     64
     65                if ($input->getOption('php')) {
     66                        $options['php'] = true;
     67                        $options['procure'] = true;
     68                        $list[] = 'Uniquement les extensions PHP procurées';
     69                }
     70
     71                if ($input->getOption('procure')) {
     72                        $options['procure'] = true;
     73                        $list[] = 'Uniquement les plugins procurés';
     74                }
     75
     76                if ($input->getOption('dist')) {
     77                        $options['dist'] = true;
     78                        $list[] = 'Uniquement les plugins-dist';
     79                } elseif ($input->getOption('no-dist')) {
     80                        $options['dist'] = false;
     81                        $list[] = 'Sans les plugins-dist';
     82                }
     83
     84                if ($input->getOption('spip')) {
     85                        $options['spip'] = true;
     86                        $list[] = 'Uniquement SPIP';
     87                }
     88
     89                if ($list) {
     90                        $this->io->listing($list);
     91                }
     92
     93                $actifs = $this->getPluginsActifs($options);
     94                $this->showPlugins($actifs, $input->getOption('short'));
     95        }
     96
     97        public function showInactifs(InputInterface $input) {
     98                $list = ["Liste des plugins inactifs"];
     99                $this->io->listing($list);
     100                $inactifs = $this->getPluginsInactifs();
     101                $this->showPlugins($inactifs);
     102        }
     103
     104        public function exportActifs(InputInterface $input) {
     105                $name = $input->getOption('name') . '.txt';
     106                $file = _DIR_TMP . $name;
     107
     108                $actifs = $this->getPluginsActifs([
     109                        'procure' => false,
     110                        'php' => false,
     111                ]);
     112
     113                $list = implode(" ", array_map('strtolower', array_keys($actifs)));
     114                if (file_put_contents($file, $list)) {
     115                        $this->io->check("Export dans : " . $file);
     116                } else {
     117                        $this->io->fail("Export raté : " . $file);
     118                }
     119                $this->io->text($list);
     120                // $this->io->columns(explode(" ", $list), 6, true);
     121        }
     122
     123        public function actualiserPlugins() {
     124                include_spip('inc/plugin');
     125                actualise_plugins_actifs();
     126        }
     127
     128        /**
     129         * Obtenir la liste des plugins actifs
     130         *
     131         * @param array $options {
     132         *     @var bool|null $php Afficher|Exclure|Uniquement les extensions PHP
     133         *     @var bool $spip Afficher le faux plugin 'SPIP'
     134         *     @var bool|null $dist Afficher|Exclure|Uniquement les plugins dist
     135         * }
     136         * @return array
     137         */
     138        public function getPluginsActifs(array $options = []) {
     139                $options += [
     140                        'procure' => null,
     141                        'php' => null,
     142                        'spip' => false, // only SPIP ?
     143                        'dist' => null,
     144                ];
     145                $plugins = unserialize($GLOBALS['meta']['plugin']);
     146                if ($options['spip']) {
     147                        return ['SPIP' => $plugins['SPIP']];
     148                } else {
     149                        unset($plugins['SPIP']);
     150                }
     151
     152                foreach ($plugins as $k => $v) {
     153                        $is = [
     154                                'php' => ($k === 'PHP' or strpos($k, 'PHP:') === 0),
     155                                'dist' => ($v['dir_type'] === '_DIR_PLUGINS_DIST'),
     156                                'procure' => (strpos($v['dir'], 'procure:') !== false),
     157                        ];
     158                        foreach ($is as $quoi => $test) {
     159                                if (!is_null($options[$quoi]) and ($options[$quoi] xor $is[$quoi])) {
     160                                        unset($plugins[$k]);
     161                                }
     162                        }
     163
     164                }
     165
     166                return $plugins;
     167        }
     168
     169        public function getPluginsInactifs() {
     170                // chercher dans les plugins dispo
     171                $get_infos = charger_fonction('get_infos','plugins');
     172
     173                $dirs = ['_DIR_PLUGINS' => _DIR_PLUGINS];
     174                if (defined('_DIR_PLUGINS_SUPPL') and _DIR_PLUGINS_SUPPL) {
     175                        $dirs['_DIR_PLUGINS_SUPPL'] = _DIR_PLUGINS_SUPPL;
     176                }
     177
     178                $list = [];
     179                foreach($dirs as $const => $dp) {
     180                        $plugins = liste_plugin_files($dp);
     181                        foreach($plugins as $dir){
     182                                $infos = $get_infos($dir, false, $dp);
     183                                $prefix = strtoupper($infos['prefix']);
     184                                $list[] = [
     185                                        'nom' => $prefix,
     186                                        'etat' => $infos['etat'],
     187                                        'version' => $infos['version'],
     188                                        'dir' => $dir,
     189                                        'dir_type' => $const,
     190                                ];
     191                        }
     192                }
     193                return $list;
     194        }
     195
     196        public function showPlugins(array $list, $short = false) {
     197                ksort($list);
     198                if ($short) {
     199                        $list = array_keys($list);
     200                        $list = array_map('strtolower', $list);
     201                        $list = array_map('ucfirst', $list);
     202                        $this->io->columns($list, 6, true);
     203                } else {
     204                        $this->io->atable($list);
     205                }
     206        }
     207
     208
     209        public function presenterListe(array $liste) {
     210                if (count($liste) > 4) {
     211                        $this->io->columns($liste, 6, true);
     212                } else {
     213                        $this->io->listing($liste);
     214                }
     215        }
    82216}
    83 
    84 function lister_plugins ($where) {
    85 
    86     include_spip('base/abstract_sql');
    87     $plugins = sql_allfetsel('plugins.nom, paquets.etat, paquets.version',
    88                              'spip_plugins as plugins' .
    89                              ' INNER JOIN spip_paquets as paquets' .
    90                              ' ON plugins.prefixe=paquets.prefixe',
    91                              $where);
    92 
    93     return $plugins;
    94 }
    95 
    96 function joli_no_version ($moche) {
    97 
    98     $tab_moche = explode('.', $moche);
    99 
    100     $tab_joli = array_map(function ($n) {
    101         return ltrim($n,'0') ?: '0';
    102     }, $tab_moche);
    103 
    104     return implode('.', $tab_joli);
    105 }
Note: See TracChangeset for help on using the changeset viewer.