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

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

Pour integraal on peut appeler la commande sans aucun paramètre, on les demandera gentiment à l'utilisateur.ice

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