Changeset 109709 in spip-zone


Ignore:
Timestamp:
Mar 27, 2018, 10:12:52 PM (16 months ago)
Author:
rastapopoulos@…
Message:

Et voilà ! La commande "core:telecharger" (ou "dl") permet désormais de télécharger OU de mettre à jour (mais "mettre à jour" uniquement au sens changement du code source, donc toujours du téléchargement). L'autre commande "core:mettreajour" peut donc être supprimé, ou plus tard remise si elle fait autre chose de plus : mettre à jour la base de donnée automatiquement, vider le cache, etc, mais elle ne doit plus s'occuper du téléchargement du code.

Pour les mises à jour avec la même commande "dl", il n'y a rien qui change : ça prend exactement les mêmes paramètres que pour le téléchargement depuis zéro.
--release ou -r
--branche ou -b
seul ou avec un numéro précis ou avec un numéro flou

Pour ces mises à jour, si on est dans une branche (maintenance ou le trunk) et qu'on y reste, alors ça va faire un update classique. Pour tous les autres cas, ça va faire un switch intelligemment, soit suivant la version précise que vous demandez, soit encore plus intelligent suivant la dernière version de l'actuel.

Si vous être en release fixe 3.1.3 et que vous faites :

spip dl

ça téléchargera la release fixe 3.1.27 (enfin la dernière de la même X.Y)
Donc sans rien casser chez vous, ça puisque ça ne change que Z (sauf si vous demandez explicitement autre chose évidemment !).

Cette commande avec ou sans paramètre peut donc être lancée automatiquement sans humain, avec un Cron sur un serveur, sur un ou plusieurs sites, et ça mettre toujours à jour vers la bonne version sans rien vous casser !

Location:
_outils_/spip-cli/trunk/spip-cli
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _outils_/spip-cli/trunk/spip-cli/CoreListerVersions.php

    r109683 r109709  
    3535                $type = $input->getOption('type');
    3636               
    37                 //~ // On vérifie qu'on est pas déjà dans une installation de SPIP !
    38                 //~ if ($GLOBALS['spip_loaded']) {
    39                         //~ $output->writeln('<info>Vous êtes déjà dans une installation de SPIP '.$GLOBALS['spip_version_branche'].'.</info> <comment>Téléchargement annulé.</comment>');
    40                 //~ }
    41                 //~ // Sinon c'est bon on peut télécharger SPIP
    42                 //~ else {
    43                         //~ // On vérifie que l'on connait la version
    44                         //~ if (!in_array($branche, array_keys($branches_ok))){
    45                                 //~ $output->writeln(array(
    46                                         //~ "<error>La version \"$branche\" n'est pas prise en charge.</error>",
    47                                         //~ 'Branches supportées : <info>'.join('</info>, <info>', array_keys($branches_ok)).'</info>'
    48                                 //~ ));
    49                         //~ }
    50                         //~ // Si c'est bon, on teste si on peut utiliser "passthru"
    51                         //~ else
    52                        
    5337                if (!function_exists('passthru')) {
    5438                        $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>");
  • _outils_/spip-cli/trunk/spip-cli/CoreTelecharger.php

    r109683 r109709  
    88
    99class CoreTelecharger extends Command {
     10        // Le type de version qui sera téléchargé, par défaut une release fixe (tag)
     11        protected $version_type = 'release';
     12        // La version demandée au départ, précise ou flou suivant une branche
     13        protected $version_demandee = '';
     14        // La version précise qui sera téléchargée
     15        protected $version_precise = '';
     16        // L'URL SVN où télécharger la version
     17        protected $url = '';
     18       
    1019        protected function configure() {
    1120                $this
     
    3443                $dossier = getcwd();
    3544               
     45                // On teste si on peut utiliser "passthru"
     46                if (!function_exists('passthru')){
     47                        $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>");
     48                }
     49                else {
     50                        // On détermine la demande de départ
     51                        $this->version_demandee = $input->getOption('release');
     52                        // Si pas de release prioritaire et qu'il y a une demande de branche
     53                        if (!$this->version_demandee and $input->hasParameterOption(array('--branche', '-b'))) {
     54                                $this->version_type = 'branche';
     55                                $this->version_demandee = $input->getOption('branche');
     56                        }
     57                       
     58                        // Si on est déjà dans un SPIP, on cherche à faire une mise à jour
     59                        if ($GLOBALS['spip_loaded']) {
     60                                // On se déplace dans la racine
     61                                chdir($GLOBALS['spip_racine']);
     62                               
     63                                // On lance la recherche de mise à jour
     64                                $this->mettre_a_jour($input, $output);
     65                        }
     66                        // Sinon on cherche à télécharger une nouvelle version
     67                        else {
     68                                $this->telecharger($input, $output);
     69                        }
     70                }
     71        }
     72       
     73        protected function mettre_a_jour(&$input, &$output) {
     74                // On cherche la version SVN actuelle
     75                ob_start();
     76                passthru('svn info --show-item url');
     77                $url_actuel = ob_get_contents();
     78                ob_end_clean();
     79               
     80                if (!$url_actuel) {
     81                        $output->writeln("<error>Cette installation de SPIP n'est pas installée avec SVN et ne peut être mise à jour avec cette commande.</error>");
     82                }
     83                else {
     84                        // On vérifie s'il y a des modifications de fichiers
     85                        exec('svn status --quiet --non-interactive .', $lignes, $erreur);
     86                        if ($erreur) {
     87                                $output->writeln(array("<error>Erreur SVN.</error>"));
     88                        }
     89                        else {
     90                                $lignes = array_filter($lignes, function ($ligne) {
     91                                        return preg_match(',^M,', $ligne);
     92                                });
     93                               
     94                                // S'il y a des fichiers modifiés
     95                                if (count($lignes) > 0) {
     96                                        $output->writeln(array(
     97                                                "<error>Pas de mise à jour car des fichiers ont été modifiés localement.</error>",
     98                                                 join("\n", $lignes),
     99                                        ));
     100                                }
     101                                // Sinon on peut se lancer dans une mise à jour
     102                                else {
     103                                        // Par défaut ça sera un switch sur la version demandée ou la dernière en date
     104                                        $mode_maj = 'switch';
     105                                        $version_type_actuel = null;
     106                                       
     107                                        // On cherche si on reconnait une version
     108                                        if (preg_match("|^svn://trac\.rezo\.net/spip/(.+?)(/spip-((\d+\.\d+).*?))?$|i", $url_actuel, $trouve)) {
     109                                                $dossier = $trouve[1];
     110                                                $version_actuelle = $trouve[3];
     111                                                $xy = $trouve[4];
     112                                               
     113                                                // Si on est dans un tag, ce sera toujours un switch
     114                                                if ($dossier == 'tags') {
     115                                                        $mode_maj = 'switch';
     116                                                        $version_type_actuel = 'release';
     117                                                       
     118                                                        // Et on cherchera la version stable la plus récente de la même branche X.Y, pour ne rien casser
     119                                                        if (!$this->version_demandee) {
     120                                                                $this->version_demandee = $xy;
     121                                                        }
     122                                                }
     123                                                else {
     124                                                        $version_type_actuel = 'branche';
     125                                                       
     126                                                        // S'il on a demandé une version, ou de changer pour une release : toujours switch
     127                                                        if ($this->version_demandee or $input->hasParameterOption(array('--release', '-r'))) {
     128                                                                $mode_maj = 'switch';
     129                                                        }
     130                                                        // Sinon on reste dans la même branche, donc on update simplement
     131                                                        else {
     132                                                                $mode_maj = 'update';
     133                                                        }
     134                                                }
     135                                        }
     136                                       
     137                                        // Si on doit faire update, facile
     138                                        if ($mode_maj == 'update') {
     139                                                $output->writeln("<info>C'est parti pour la mise à jour en restant dans la même branche $version_actuelle</info>");
     140                                                passthru('svn update');
     141                                        }
     142                                        // Si c'est un switch, on cherche version et URL
     143                                        elseif (
     144                                                $mode_maj == 'switch'
     145                                                and $version_precise = $this->chercher_version_precise($input, $output)
     146                                        ) {
     147                                                // Si la version trouvée est <= pour le même type qu'actuellement
     148                                                if ($version_type_actuel == $this->version_type and version_compare($version_precise, $version_actuelle, '<=')) {
     149                                                        $output->writeln("<info>Pas de version plus récente que votre version $version_actuelle</info>");
     150                                                }
     151                                                // Sinon on peut enfin faire le switch
     152                                                else {
     153                                                        $output->writeln("<info>C'est parti pour un changement de version de \"$version_actuelle\" à la {$this->version_type} \"{$this->version_precise}\"</info>");
     154                                                        $output->writeln("Patientez quelques minutes, le temps que SVN calcule les changements…");
     155                                                        passthru("svn switch {$this->url}");
     156                                                }
     157                                        }
     158                                }
     159                        }
     160                }
     161        }
     162       
     163        protected function telecharger(&$input, &$output) {
     164                // On cherche la bonne version suivant les params
     165                $this->chercher_version_precise($input, $output);
     166               
     167                // Si ya bien un URL au final
     168                if ($this->url) {
     169                        $output->writeln("<info>C'est parti pour le téléchargement de la {$this->version_type} \"{$this->version_precise}\" !</info>");
     170                       
     171                        // On lance la commande SVN dans le répertoire courant
     172                        passthru("svn co {$this->url}");
     173                }
     174        }
     175       
     176        protected function chercher_version_precise(&$input, &$output) {
    36177                $lister_versions = $this->getApplication()->find('core:listerversions');
    37178                $versions = $lister_versions->get_versions();
    38                
    39                 // On vérifie qu'on est pas déjà dans une installation de SPIP !
    40                 if ($GLOBALS['spip_loaded']) {
    41                         $output->writeln('<info>Vous êtes déjà dans une installation de SPIP '.$GLOBALS['spip_version_branche'].'.</info> <comment>Téléchargement annulé.</comment>');
    42                 }
    43                 // On teste si on peut utiliser "passthru"
    44                 elseif (!function_exists('passthru')){
    45                         $output->writeln("<error>Votre installation de PHP doit pouvoir exécuter des commandes externes avec la fonction passthru().</error>");
    46                 }
    47                 // Sinon c'est bon on peut télécharger SPIP
     179                $url = null;
     180               
     181                // S'il y a une release demandée, c'est prioritaire
     182                if ($this->version_type == 'release') {
     183                        // S'il y a une release précise demandée
     184                        if ($this->version_demandee) {
     185                                // Si la version pile exacte existe
     186                                if (isset($versions['tags'][$this->version_demandee])) {
     187                                        $this->version_precise = $this->version_demandee;
     188                                        $this->url = $versions['tags'][$this->version_demandee];
     189                                }
     190                                // Sinon on cherche le plus récent approchant
     191                                elseif ($this->version_precise = $lister_versions->get_last_release($this->version_demandee)) {
     192                                        $this->url = $versions['tags'][$this->version_precise];
     193                                }
     194                                // Sinon la release demandée n'existe pas
     195                                else {
     196                                        $output->writeln(array(
     197                                                "<error>La version \"{$this->version_demandee}\" n'est pas prise en charge.</error>",
     198                                                'Releases supportées : <info>'.join('</info>, <info>', array_keys($versions['tags'])).'</info>'
     199                                        ));
     200                                }
     201                        }
     202                        // Sinon la dernière parmi toutes les releases
     203                        else {
     204                                $this->version_precise = $lister_versions->get_last_release();
     205                                $this->url = $versions['tags'][$this->version_precise];
     206                        }
     207                }
     208                // Sinon s'il y a une branche demandée
     209                elseif ($this->version_type == 'branche') {
     210                        // S'il y a une branche précise demandée
     211                        if ($this->version_demandee) {
     212                                // Si la version pile exacte existe
     213                                if (isset($versions['branches'][$this->version_demandee])) {
     214                                        $this->version_precise = $this->version_demandee;
     215                                        $this->url = $versions['branches'][$this->version_demandee];
     216                                }
     217                                // Sinon on cherche le plus récent approchant
     218                                elseif ($this->version_precise = $lister_versions->get_last_branche($this->version_demandee)) {
     219                                        $this->url = $versions['branches'][$this->version_precise];
     220                                }
     221                                // Sinon la branche demandée n'exsite pas
     222                                else {
     223                                        $output->writeln(array(
     224                                                "<error>La version \"{$this->version_demandee}\" n'est pas prise en charge.</error>",
     225                                                'Branches supportées : <info>'.join('</info>, <info>', array_keys($versions['branches'])).'</info>'
     226                                        ));
     227                                }
     228                        }
     229                        // Sinon la dernière parmi toutes les branches
     230                        else {
     231                                $this->version_precise = $lister_versions->get_last_branche();
     232                                $this->url = $versions['branches'][$this->version_precise];
     233                        }
     234                }
     235                // Sinon on prend la dernière release stable
    48236                else {
    49                         // On détermine quelle version on doit télécharger
    50                         $url = null;
    51                         $mode = 'release';
    52                        
    53                         // S'il y a une release demandée, c'est prioritaire
    54                         if ($input->hasParameterOption(array('--release', '-r'))) {
    55                                 // S'il y a une release précise demandée
    56                                 if ($version = $demande = $input->getOption('release')) {
    57                                         // Si la version pile exacte existe
    58                                         if (isset($versions['tags'][$demande])) {
    59                                                 $url = $versions['tags'][$demande];
    60                                         }
    61                                         // Sinon on cherche le plus récent approchant
    62                                         elseif ($version = $lister_versions->get_last_release($demande)) {
    63                                                 $url = $versions['tags'][$version];
    64                                         }
    65                                         // Sinon le truc demandé n'existe pas
    66                                         else {
    67                                                 $output->writeln(array(
    68                                                         "<error>La version \"{$demande}\" n'est pas prise en charge.</error>",
    69                                                         'Releases supportées : <info>'.join('</info>, <info>', array_keys($versions['tags'])).'</info>'
    70                                                 ));
    71                                         }
    72                                 }
    73                                 // Sinon la dernière parmi toutes les releases
    74                                 else {
    75                                         $version = $lister_versions->get_last_release();
    76                                         $url = $versions['tags'][$version];
    77                                 }
    78                         }
    79                         // Sinon s'il y a une branche demandée
    80                         elseif ($input->hasParameterOption(array('--branche', '-b'))) {
    81                                 $mode = 'branche';
    82                                
    83                                 // S'il y a une branche précise demandée
    84                                 if ($version = $demande = $input->getOption('branche')) {
    85                                         // Si la version pile exacte existe
    86                                         if (isset($versions['branches'][$demande])) {
    87                                                 $url = $versions['branches'][$demande];
    88                                         }
    89                                         // Sinon on cherche le plus récent approchant
    90                                         elseif ($version = $lister_versions->get_last_branche($demande)) {
    91                                                 $url = $versions['branches'][$version];
    92                                         }
    93                                         else {
    94                                                 $output->writeln(array(
    95                                                         "<error>La version \"{$demande}\" n'est pas prise en charge.</error>",
    96                                                         'Branches supportées : <info>'.join('</info>, <info>', array_keys($versions['branches'])).'</info>'
    97                                                 ));
    98                                         }
    99                                 }
    100                                 // Sinon la dernière parmi toutes les branches
    101                                 else {
    102                                         $version = $lister_versions->get_last_branche();
    103                                         $url = $versions['branches'][$version];
    104                                 }
    105                         }
    106                         // Sinon on prend la dernière release stable
    107                         else {
    108                                 $version = $lister_versions->get_last_release();
    109                                 $url = $versions['tags'][$version];
    110                         }
    111                        
    112                         if ($url) {
    113                                 $output->writeln("<info>C'est parti pour le téléchargement de la $mode $version !</info>");
    114                        
    115                                 // On lance la commande SVN dans le répertoire courant
    116                                 passthru("svn co $url .");
    117                         }
    118                 }
     237                        $this->version_precise = $lister_versions->get_last_release();
     238                        $this->url = $versions['tags'][$this->version_precise];
     239                }
     240               
     241                return $this->version_precise;
    119242        }
    120243}
Note: See TracChangeset for help on using the changeset viewer.