source: spip-zone/_outils_/spip-cli/trunk/spip-cli/IntegraalGenerer.php @ 107677

Last change on this file since 107677 was 107677, checked in by tcharlss@…, 3 years ago

Indiquer les valeurs possibles pour l'option -t

File size: 6.0 KB
Line 
1<?php
2
3use Symfony\Component\Console\Command\Command;
4use Symfony\Component\Console\Input\InputArgument;
5use Symfony\Component\Console\Input\InputInterface;
6use Symfony\Component\Console\Input\InputOption;
7use Symfony\Component\Console\Output\OutputInterface;
8use Symfony\Component\Console\Question\ChoiceQuestion;
9
10/**
11 * Générer un nouveau projet à partir de l'échafaudage Intégraal
12 *
13 * La commande génère un nouveau projet dans le dossier des plugins, et renomme les fichiers et contenus.
14 * Usage : spip integraal:generer -c /dossier/local/integraal monprojet "Mon super projet"
15 **/
16class IntegraalGenerer extends Command {
17        protected function configure() {
18                $this
19                        ->setName('integraal:generer')
20                        ->setDescription('Génèrer un nouveau projet à partir de l‘échafaudage Intégraal.')
21                        ->addArgument(
22                                'prefixe',
23                                InputArgument::REQUIRED,
24                                'Préfixe du nouveau projet'
25                        )
26                        ->addArgument(
27                                'nom',
28                                InputArgument::REQUIRED,
29                                'Nom humain du projet'
30                        )
31                        ->addOption(
32                                'chemin_integraal',
33                                'c',
34                                InputOption::VALUE_REQUIRED,
35                                'Chemin local ou URL distante où trouver Intégraal',
36                                'svn://zone.spip.org/spip-zone/_squelettes_/integraal'
37                        )
38                        ->addOption(
39                                'auteur',
40                                'a',
41                                InputOption::VALUE_REQUIRED,
42                                'Auteur du projet'
43                        )
44                        ->addOption(
45                                'url',
46                                'u',
47                                InputOption::VALUE_REQUIRED,
48                                'URL de l’auteur du projet'
49                        )
50                        ->addOption(
51                                'theme',
52                                't',
53                                InputOption::VALUE_REQUIRED,
54                                'Version du thème à utiliser : gulp ou scssphp',
55                                'gulp'
56                        )
57                ;
58        }
59
60        protected function execute(InputInterface $input, OutputInterface $output) {
61                // On récupère les arguments
62                $prefixe = $input->getArgument('prefixe');
63                if (!$nom = $input->getArgument('nom')) {
64                        $nom = $prefixe;
65                }
66               
67                // On récupère les options
68                $chemin_integraal = rtrim($input->getOption('chemin_integraal'), '/') . '/';
69                $auteur = $input->getOption('auteur');
70                $url = $input->getOption('url');
71                $version_theme = $input->getOption('theme');
72               
73                // [TODO] Si des arguments nécessaires manquent, on pose des questions
74                /*
75                if (!$version_theme) {
76                        $helper = $this->getHelper('question');
77                        $question_theme = new ChoiceQuestion(
78                                'Quelle version du thème utiliser ? (défaut : gulp)',
79                                array('gulp', 'scssphp'),
80                                0
81                        );
82                        $version_theme = $helper->ask($input, $output, $question_theme);
83                        $output->writeln('Vous avez choisi : '.$version_theme);
84                }
85                */
86               
87                // On se déplace dans le dossier des plugins si on est dans un SPIP
88                if (
89                        !isset($GLOBALS['spip_loaded'])
90                        or !$GLOBALS['spip_loaded']
91                        or !chdir($GLOBALS['spip_racine'])
92                        or !is_dir(_DIR_PLUGINS)
93                ) {
94                        $output->writeln("<error>Vous n’êtes pas dans un SPIP ou vous n’avez pas de dossiers des plugins.</error>");
95                } elseif (!function_exists('passthru')){
96                        $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>");
97                } else {
98                        // On se déplace dans le dossier des plugins
99                        chdir(_DIR_PLUGINS);
100                       
101                        // On télécharge Intégraal
102                        $output->writeln("<info>Téléchargement de l’échafaudage IntéGraal.</info>");
103                       
104                        // On créé un nouveau répertoire pour y accueillir les 3 plugins d'Intégraal
105                        if (!$dir_integraal = mkdir($prefixe, 0775)) {
106                                $output->writeln("<error>Le répertoire « $prefixe » n’a pas pu être créé dans le dossier des plugins.</error>");
107                        } else {
108                               
109                                // On se déplace dans le dossier du nouveau projet
110                                chdir($prefixe);
111                               
112                                // Retrouver le chemin correspondant à la version du thème choisie
113                                if (!in_array($version_theme, array('gulp', 'scssphp'))) {
114                                        $version_theme = 'gulp';
115                                        $output->writeln("<error>Version du thème inconnue. La version « $version_theme » sera utilisée</error>");
116                                }
117                                $chemins_theme = array(
118                                        'gulp'    => 'theme/trunk',
119                                        'scssphp' => 'theme/branches/scssphp',
120                                );
121                                $chemin_theme = $chemins_theme[$version_theme];
122                               
123                                // On lance la commande SVN pour télécharger les 3 plugins
124                                // dans le répertoire courant
125                                $erreur_telecharger = false;
126                                $sous_chemins_integraal = array(
127                                        'squelettes',
128                                        $chemin_theme,
129                                        'core'
130                                );
131                                foreach($sous_chemins_integraal as $dossier){
132                                        $chemin_sous_dossier = $chemin_integraal . $dossier;
133                                        passthru("svn export {$chemin_sous_dossier}", $erreur);
134                                        if ($erreur !== 0) {
135                                                $erreur_telecharger = true;
136                                                break;
137                                        }
138                                }
139                               
140                                if ($erreur_telecharger) {
141                                        $output->writeln("<error>Une erreur s’est produite durant le téléchargement.</error>");
142                                } else {
143                                       
144                                        // Mettre les bonnes permissions
145                                        passthru("chmod 775 -R *");
146                                       
147                                        // On renomme le dossier du theme
148                                        $dossier_theme = ltrim(strrchr($chemin_theme, '/'), '/');
149                                        passthru("mv $dossier_theme theme", $erreur);
150                                        if ($erreur){
151                                                $output->writeln("<error>Le dossier du theme (${dossier_theme}) n’a pas pu être renommé en « theme »</error>");
152                                        }
153                                       
154                                        // On renomme tous les fichiers avec "integraal"
155                                        passthru("find . | rename -v 's/integraal/{$prefixe}/g'", $erreur);
156                                       
157                                        // On affiche une erreur mais on continue quand même le renommage des contenus ensuite
158                                        if ($erreur !== 0) {
159                                                $output->writeln("<error>Une erreur s’est produite durant le renommage des fichiers.</error>");
160                                        }
161                                       
162                                        // On remplace à l'intérieur des contenus
163                                        passthru("find . -type f -exec sed -i 's/integraal/{$prefixe}/g' {} \;", $erreur);
164                                        passthru("find . -type f -exec sed -i 's/IntéGraal/{$nom}/g' {} \;", $erreur);
165                                       
166                                        // Si on demande à changer l'auteur
167                                        if ($auteur) {
168                                                passthru("find . -type f -exec sed -i 's/Les Développements Durables/{$auteur}/g' {} \;", $erreur);
169                                        }
170                                        // Si on demande à changer l'url
171                                        if ($url) {
172                                                passthru("find . -type f -exec sed -i 's|http://www\.ldd\.fr|{$url}|g' {} \;", $erreur);
173                                        }
174                                       
175                                        $output->writeln('<info>C’est fini ! Vous pouvez maintenant personnaliser les fichiers selon vos besoins.</info>');
176                                }
177                        }
178                }
179        }
180}
Note: See TracBrowser for help on using the repository browser.