source: spip-zone/_plugins_/github_sync/spip-cli/GithubRev.php @ 93819

Last change on this file since 93819 was 93819, checked in by booz@…, 5 years ago

up géré aussi

File size: 5.9 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;
8
9class GithubRev extends Command {
10        protected function configure() {
11                $this
12                        ->setName('github:revision')
13                        ->setDescription("\tCommit de fichiers de contenu sur Github (svn status, up, add, commit etc…)\n\t\t\t\tInitialiser avec un dépot Github avec la commande : spip rev -g https://github.com/xx/xx.git\n")
14                        ->setAliases(array(
15                                'rev' // abbréviation commune pour "synchro"
16                        ))
17                        ->addOption(
18                                'dest',
19                                'd',
20                                InputOption::VALUE_OPTIONAL,
21                                'Répertoire de destination',
22                                'conversion_spip'
23                        )
24                        ->addOption(
25                                'depot',
26                                'g',
27                                InputOption::VALUE_OPTIONAL,
28                                'Dépot GIT ou synchroniser les conversions',
29                                ''
30                        )                       
31                        ->addOption(
32                                'action',
33                                'a',
34                                InputOption::VALUE_OPTIONAL,
35                                'Actions possibles : up, status, commit, diff, ...',
36                                ''
37                        )                       
38
39                ;
40        }
41
42        protected function execute(InputInterface $input, OutputInterface $output) {
43                global $spip_racine;
44                global $spip_loaded;
45
46                include_spip("iterateur/data");
47
48                $depot = $input->getOption('depot') ;
49               
50                // Répertoire de destination ou l'on effectue le svn checkout (/convertion_spip par défaut).
51                $dest = $input->getOption('dest') ;
52                if(!is_dir($dest)) mkdir($dest);
53                               
54                if ($spip_loaded) {
55                       
56                        chdir($spip_racine);
57                       
58                        exec('svn info ' . $dest , $r);
59                       
60                        // vérifions si on a un depot GIT                               
61                        if($r[0] == "Path: $dest"){
62                                $c = inc_ls_to_array_dist($dest . "/*/collections") ;
63                                $collections = $c[0]['dirname'] . "/" . $c[0]['basename'] ;
64                                $dest = "$collections" ;
65                                $output->writeln("<info>Dépot Git OK : $dest</info>");
66                        }else{ // pas de dépot GIT, on checkout
67                                if($depot){
68                                        $output->writeln("<error>Checkout du dépot $depot dans $dest</error>");
69                                        passthru("svn co $depot $dest");
70                                        $output->writeln("<info>Relancez la commande.</info>");
71                                        die() ;
72                                }else{
73                                        $output->writeln("<info>Relancez la commande avec l'option : spip rev -g https://github.com/xx/xx.git</info>");
74                                        die() ;
75                                }       
76                        }
77
78                        if (!function_exists('passthru')){
79                                $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>");
80                        }
81                        /* Si c'est bon on continue */
82                        else{
83                               
84                                chdir($dest);
85                               
86                                $output->writeln(
87                                        array(
88                                        "<info>C'est parti pour une vérif de commit.</info>"
89                                ));
90
91                                // ou en est-on dans les commit ?
92                                exec('svn up', $results, $err);
93                                                                       
94                                if ($err) {
95                                        $output->writeln(array("<error>Erreur SVN.</error>"));
96                                } else {
97                                        $output->writeln(array(
98                                                        '<info>Update</info>',
99                                                         join("\n", $results)
100                                        ));
101                                }
102                               
103                                $results = array();
104
105                                // Quelques vérifs en svn status.
106                                exec('svn status .', $results, $err);
107                                                                       
108                                if ($err) {
109                                        $output->writeln(array("<error>Erreur SVN.</error>"));
110                                } else {                                               
111
112                                        // Pas de modification de fichier notable => RAS, on quitte.   
113                                        if(sizeof($results) == 0){
114                                                $output->writeln(array(
115                                                         '<info>Status : RAS</info>'
116                                                ));     
117                                                die();
118                                        }
119
120                                        // Sinon détaillons le status
121                                        $output->writeln(array(
122                                                        '<info>Status</info>',
123                                                         join("\n", $results)
124                                        ));
125
126                                        // Ajouts ?
127                                        $results_n = array_filter($results, function ($line) {
128                                                return preg_match(',^\?,', $line);
129                                        });
130
131                                        if (count($results_n) > 0) {
132                                               
133                                                /* nettoyage */
134                                                foreach($results_n as $a){
135                                                        $a = preg_replace("/^\?\s*/", "", $a) ;
136                                                       
137                                                        if(is_dir($a))
138                                                                $dossiers_ajoutes[] = $a ;
139                                                        else
140                                                                $fichiers_ajoutes[] = $a ;
141                                                }
142
143                                                if(sizeof($dossiers_ajoutes) > 0){
144                                                        $output->writeln(array(
145                                                                "<info>Svn add des dossiers</info>",
146                                                                 join("\n", $dossiers_ajoutes)
147                                                        ));
148                                                       
149                                                        foreach($dossiers_ajoutes as $dos){
150                                                                exec("svn add " . $dos, $results, $err);
151                                                                if ($err) {
152                                                                        $output->writeln(array("<error>Erreur SVN add $dos</error>"));
153                                                                } else {
154                                                                        $output->writeln(array(
155                                                                                "<info>Svn add $dos</info>"
156                                                                        ));
157                                                                }
158                                                        }       
159                                                }
160                                                if(sizeof($fichiers_ajoutes) > 0){
161
162                                                        $output->writeln(array(
163                                                                "<info>Svn add des fichiers</info>",
164                                                                 join("\n", $fichiers_ajoutes)
165                                                        ));
166                                                        exec("svn add " . join(" , ", $fichiers_ajoutes), $results, $err);
167                                                        if ($err) {
168                                                                $output->writeln(array("<error>Erreur SVN add fichiers.</error>"));
169                                                        } else {
170                                                                $output->writeln(array(
171                                                                        "<info>Svn add </info>",
172                                                                         join(",", $fichiers_ajoutes)
173                                                                ));
174                                                        }
175                                                }
176                                               
177                                                $output->writeln(array(
178                                                         "<info>Relancez la commande.</info>"
179                                                ));
180                                                die();
181                                        }
182                                                                                       
183                                        // Modif ?
184                                        $results_m = array_filter($results, function ($line) {
185                                                return preg_match(',^M,', $line);
186                                        });
187
188                                        // Ajout ?
189                                        $results_a = array_filter($results, function ($line) {
190                                                return preg_match(',^A,', $line);
191                                        });
192
193                                        // Suppression ?
194                                        $results_d = array_filter($results, function ($line) {
195                                                return preg_match(',^D,', $line);
196                                        });
197
198
199                                        if (count($results_m) > 0 OR count($results_a) > 0 OR count($results_d) > 0) {
200                                               
201                                                if($input->getOption('action') != "commit"){
202                                                        $output->writeln(array(
203                                                                "<error>Des fichiers ont été modifié localement.</error>\n<info> Pour commiter : spip rev -a commit</info>"
204                                                        ));
205                                                        die();
206                                                }else{
207                                                        $output->writeln(array(
208                                                                "<info>Commit…</info>"
209                                                        ));
210
211                                                        exec('svn commit -m "Ajouts de fichiers"', $results, $err);
212                                                        if ($err) 
213                                                                $output->writeln(array("<error>Erreur SVN.</error>"));
214                                                       
215                                                }
216                                        }       
217                                }
218                        }
219
220                }
221                else{
222                        $output->writeln('<error>Vous n’êtes pas dans une installation de SPIP. Impossible de convertir le texte.</error>');
223                }
224        }
225}
Note: See TracBrowser for help on using the repository browser.