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

Grands changements dans Spip-Cli (en cours)

Maintenant que merveilleusement le répertoire vendor est sorti et qu’on a une installation normale par Composer,
on se rapproche un peu plus d’une arborescence de paquet Composer classique.

TL;DR (comme dirait James)
-----
```
svn up
composer update
cd bin
rm /usr/local/bin/spip
ln -s $(pwd)/spip /usr/local/bin/spip
# linux
rm /etc/bash_completion.d/spip
ln -s $(pwd)/spip_console_autocomplete /etc/bash_completion.d/spip
# macos
rm /usr/local/etc/bash_completion.d/spip
ln -s $(pwd)/spip_console_autocomplete /usr/local/etc/bash_completion.d/spip
```

Les exécutables :
-----------------
- On se crée un répertoire "bin" pour y mettre les exécutables (spip et spip_console_autocomplete)
- On déclare ces binaires à Composer, de sorte que si un autre paquet composer nécessite ce paquet, 
  les binaires seront liés dans vendor/bin/ plutôt que perdus quelque part dans vendor/...
- Par gentillesse, on conserve les anciens exécutables (spip.php et spip_completion.sh) à la racine (dépréciés)
  qui redirigent simplement sur les nouveaux. Il convient de modifier les liens symboliques
  qui avait été fait sur le serveur (ie: /usr/local/bin/spip et /etc/bash_completion.d/spip ou /usr/local/etc/bash_completion.d/spip)
- L’executable "spip" ne fait maintenant qu’executer l’application idoine (src/Application) et n’a pas de code en elle même.

 Les sources Spip-cli
---------------------
- Un nouveau répertoire 'src' regroupe de nouveaux fichiers gérant Spip-Cli ainsi que ses commandes fournies de base.
- Ce répertoire est dans le namespace 'Spip\Cli' déclaré à composer (et donc en autoloding).
- Les commandes Spip Cli se retrouvent dans src/Command, actuellement sans modification hormis l’ajout du namespace.
- src/Application étend l’application Console de sympfony. C’est ce fichier essentiellement (avec src/Loader/Spip) qui reçoit 
  l’ancien code de l’executable spip.php. Il se charge de : 
* Déclarer certains services (qui seront accessibles aux commandes via `$this->getApplication()->getService('xxx')` par exemple
* Déclarer les commandes natives de Spip-cli
* Démarrer SPIP (s’il est installé) [note] Je ne suis pas en accord avec cela et préfèrerais que chaque commande décide ou non d’elle même de démarrer SPIP ou pas, mais bon
* Déclarer les commandes contenus dans les plugins SPIP, dans les répertoires 'spip-cli' (si SPIP a démarré)

On tente un poil de s’approcher du fonctionnement de Cilex (comme j’avais fait avec l’essai Polatouche). J’ai hésité à le reprendre directement ici,
mais celui ci actuellement nécessite PHP 5.5.9 alors qu’actuellement Spip-cli est encore plus tolérant (5.4).
Du coup, je n’ai repris que l’utilisation de Pimple en tant que conteneur de configuration / services.

Des styles d’écriture
---------------------

J’ai ajouté un autre morceau de Polatouche qui était l’utilisation de SymfonyStyle pour écrire plus facilement les textes affichés sur la console.
Je l’avais étendu avec d’autres méthodes, et j’ai remis ce morceau ici également. Dans src/Console/Style/SpipCliStyle.

Ainsi, une commande peut faire :
```
$io = new Spip\Cli\Console\Style\SpipCliStyle($input, $output);
$io->title("Le joli titre");
```

C’est aussi (et de préférence) accessible avec le conteneur de service, avec le service 'console.io',
mais une méthode getIo() le récupère également :
```
/** @var SpipCliStyle $io */
$io = $this->getApplication()->getIo($input, $output);
$io->title($this->getDescription());
```

En plus les styles/méthodes que propose la classe symfony (warning, error, note, title, section, table, ...),
SpipCliStyle propose d’autres facilités comme "check, fail, care" qui ajoutent avant le texte à afficher
une icone de réussite, d’échec ou d’attention. Il y a également "atable" pour afficher rapidement un tableau cle/valeur, 
ou "columns" pour écrire en colonne…

Loader SQL
----------

J’en parle rapidement, mais je n’ai pas fini de le retester, je remets aussi une classe qui est capable 
d’analyser un fichier de connexion SQL SPIP et de génerer une instance de PDO avec, afin de réaliser des 
requetes SQL en dehors de l’API de SPIP (et de son chargement éventuel).


Objectifs à venir et notes
--------------------------

L’objectif à travers ces modifications est multiple
- pouvoir réutiliser plus facilement des choses que j’avais mises dans Polatouche…
- pouvoir utiliser spip-cli sur un spip mutualisé (l’accès sql va être important pour obtenir l’url du site avant de charger spip) et
  exécuter une commande sur un ensemble de sites/ d’une mutualisation.
- pouvoir lancer les mises à jour de BDD du core / des plugins en créant une commande pour le faire.

parent 712d6423
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+25 −18
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
* text=auto !eol
/README.md -text
bin/spip -text
bin/spip_console_autocomplete -text
/composer.json -text
/composer.lock -text
spip-cli/CacheDesactiver.php -text
spip-cli/CacheReactiver.php -text
spip-cli/CacheVider.php -text
spip-cli/CoreInstaller.php -text
spip-cli/CoreListerVersions.php -text
spip-cli/CoreMettreajour.php -text
spip-cli/CorePreparer.php -text
spip-cli/CoreTelecharger.php -text
spip-cli/IntegraalGenerer.php -text
spip-cli/PhpEval.php -text
spip-cli/PluginsActiver.php -text
spip-cli/PluginsDesactiver.php -text
spip-cli/PluginsLister.php -text
spip-cli/PluginsSvpDepoter.php -text
spip-cli/PluginsSvpTelecharger.php -text
spip-cli/ServerLocate.php -text
spip-cli/TextePropre.php -text
spip-cli/TexteTypo.php -text
/spip.php -text
/spip_completion.sh -text
src/Application.php -text
src/Command/CacheDesactiver.php -text
src/Command/CacheReactiver.php -text
src/Command/CacheVider.php -text
src/Command/CoreInstaller.php -text
src/Command/CoreListerVersions.php -text
src/Command/CoreMettreajour.php -text
src/Command/CorePreparer.php -text
src/Command/CoreTelecharger.php -text
src/Command/IntegraalGenerer.php -text
src/Command/PhpEval.php -text
src/Command/PluginsActiver.php -text
src/Command/PluginsDesactiver.php -text
src/Command/PluginsLister.php -text
src/Command/PluginsSvpDepoter.php -text
src/Command/PluginsSvpTelecharger.php -text
src/Command/ServerLocate.php -text
src/Command/TextePropre.php -text
src/Command/TexteTypo.php -text
src/Console/Style/SpipCliStyle.php -text
src/Loader/Spip.php -text
src/Loader/Sql.php -text
src/Tools/Files.php -text
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
spip-cli/.git*
src/Command/.git*
/vendor

bin/spip

0 → 100755
+17 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
#!/usr/bin/env php
<?php

if (file_exists(__DIR__ . '/../vendor/autoload.php')) {
	require_once __DIR__ . '/../vendor/autoload.php';
} elseif (file_exists(__DIR__ . '/../../../autoload.php')) {
	require_once __DIR__ . '/../../../autoload.php';
} else {
	throw new \Exception("Can't find autoloader. Need Composer install ?");
}

use Spip\Cli\Application;

#ini_set('display_errors', 'On');

$app = new Application();
$app->run();
+76 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
#!/bin/sh
#
# Symfony2 App/Console autocompletion (commands and arguments only)
# Copyright (c) 2014, Joshua Thijssen
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this
#   list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice, this
#   list of conditions and the following disclaimer in the documentation and/or
#   other materials provided with the distribution.
#
# * Neither the name of the {organization} nor the names of its
#   contributors may be used to endorse or promote products derived from
#   this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#
# Usable for both bash and zsh (probably)
#
# Usage:
#    Load the script (or add to your .bashrc)
#
#           source ./console_completion.sh
#
#    Autocomplete:
#
#           ./app/console <TAB>
#
#   Will autocomplete both commands and its arguments.
#

if [[ -n ${ZSH_VERSION-} ]]; then
    autoload -U +X bashcompinit && bashcompinit
fi

_complete_spip_app_console() {
    local cur

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"

    # Assume first word is the actual app/console command
    console="${COMP_WORDS[0]}"

    if [[ ${COMP_CWORD} == 1 ]] ; then
        # No command found, return the list of available commands
        #cmds=` ${console}  --no-ansi | sed -n -e '/^Available commands/,//p' | grep -n '^ ' | sed -e 's/^ \+//' | awk '{ print $2 }'`
        # seulement si la commande a une description, ce qui permet de ne pas présenter le nom d’une commande racine (ie: 'spip' si commande 'spip:sql:dump')
        cmds=` ${console}  --no-ansi | sed -n -e '/^Available commands/,//p' | grep -n '^ ' | sed -e 's/^ \+//' | awk '{ if ($3) { print $2} }'`

    else
        # Commands found, parse options
        cmds=` ${console} ${COMP_WORDS[1]} --no-ansi --help | sed -n -e '/^Options/,/^$/p' | grep -n '^ ' | sed -e 's/^ \+//' | awk '{ print $2 }'`
    fi

    COMPREPLY=( $(compgen -W "${cmds}" -- ${cur}) )
    return 0
}

export COMP_WORDBREAKS="\ \"\\'><=;|&("
complete -F _complete_spip_app_console spip
 No newline at end of file
+13 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
{
	"name": "spip/spip-cli",
	"description" : "Command Line for SPIP",
	"keywords"    : ["spip","cli"],
	"minimum-stability": "stable",
	"require": {
			"php": "^5.4|^7",
			"symfony/console": "^2.8"
			"symfony/console": "^2.8",
			"symfony/finder": "^2.8",
			"pimple/pimple" : "^3.2"
	},
	"config": {
			"platform": {
					"php": "5.4.45"
			}
	}
	},
	"autoload": {
		"psr-4": {"Spip\\Cli\\": "src"}
	},
	"bin": [
		"bin/spip",
		"bin/spip_console_autocomplete"
	]
}
Chargement en cours