Changeset 92943 in spip-zone


Ignore:
Timestamp:
Nov 15, 2015, 11:46:14 AM (4 years ago)
Author:
marcimat@…
Message:

Permettre de générer uniquement un certain prefixe lorsqu'on demande à générer tout un fichier qui liste de documentations (autodoc.txt).

Location:
_galaxie_/code.spip.net/autodoc/trunk/src/autodoc/Helpers
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _galaxie_/code.spip.net/autodoc/trunk/src/autodoc/Helpers/Command/FromFile.php

    r92923 r92943  
    3838            ->addOption('topnav', null, InputOption::VALUE_OPTIONAL, "URL d'un fichier JS à charger dans le head html. <comment>Exemple : '//boussole.spip.net/?page=spipnav.js&lang=fr'</comment>")
    3939            ->addOption('avec_boussole_spip', null, InputOption::VALUE_NONE, "Intègre le JS de la boussole SPIP en entête topnav.")
     40            ->addOption('prefixe', 'p', InputOption::VALUE_OPTIONAL, "Préfixe de plugin. Lui seul sera actualisé si présent.")
    4041            ;
    4142    }
  • _galaxie_/code.spip.net/autodoc/trunk/src/autodoc/Helpers/Generator.php

    r92923 r92943  
    172172        }
    173173
     174        // si un prefixe spécifique de plugin est indiqué,
     175        // seul lui sera actualisé dans la liste des plugins.
     176        // et on considère que le fichier autodoc.txt n'a pas bougé dans le cas.
     177        $prefixe = $this->getOption('prefixe', null);
     178
    174179        // définir les chemins et faire tourner le backup précédent
    175180        $this->files['autodoc.txt'] = $this->dirs['work'] . '/autodoc.txt';
    176181        $this->files['autodoc.txt.bak'] = $this->files['autodoc.txt'] . '.bak';
    177182
    178         if (file_exists( $this->files['autodoc.txt.bak'] )) {
    179             unlink($this->files['autodoc.txt.bak']);
    180         }
    181 
    182         if (file_exists( $this->files['autodoc.txt'] )) {
    183             copy($this->files['autodoc.txt'], $this->files['autodoc.txt.bak']);
    184             unlink($this->files['autodoc.txt']);
    185         }
    186 
    187         // copier le fichier de liste chez soi
    188         if (0 === strpos($file, 'svn://')) {
    189             $this->output->write("* Obtenir <info>$file</info>  ");
    190 
    191             // si c'est en svn, on l'exporte simplement.
    192             if ($res = $this->makeSvnCommand("export $file autodoc.txt", true, $this->dirs['work'])) {
    193                 $this->output->writeln("[<info>OK</info>]");
    194             } else {
    195                 $this->output->writeln("[<info>Error</info>]");
    196                 throw new \Exception("Impossible de récupérer le fichier SVN : $file");
    197             }
     183        // à quel endroit sont générées les documentation des fichiers
     184        $output_base = $this->input->getOption('sorties');
     185        if (!$output_base) {
     186            $output_base = $this->dirs['work'] . '/output';
     187        }
     188        $this->setOption('site', '../index.html');
     189
     190
     191        if ($prefixe) {
     192            // autodoc.txt est censé être déjà là
     193            $this->output->writeln("* Lecture des informations du fichier (sans l'actualiser)");
     194            $presents = $this->parseFile($this->files['autodoc.txt']);
     195            // ne conserver que ce prefixe
     196            $presents = array_intersect_key($presents, array($prefixe => ''));
    198197        } else {
    199             if (file_exists($file)) {
    200                 copy($file, $this->files['autodoc.txt']);
    201             } else {
    202                 throw new \Exception("Impossible de trouver le fichier : $file");
    203             }
    204         }
    205 
    206         $this->output->writeln("* Lecture des informations du fichier");
    207         $anciens  = $this->parseFile($this->files['autodoc.txt.bak'], false);
    208         $presents = $this->parseFile($this->files['autodoc.txt']);
    209 
    210         $output_base = $this->input->getOption('sorties');
    211         if (!$output_base) $output_base = $this->dirs['work'] . '/output';
    212         $this->setOption('site', '../index.html');
    213 
    214         if ($anciens) {
    215             $absents = array_diff_key($anciens, $presents);
    216             if ($absents) {
    217                 $this->output->writeln("   <comment>Certaines documentations ne sont plus à générer.</comment>");
    218                 foreach ($absents as $prefixe=>$absent) {
    219                     $this->output->writeln("   <comment>- Effacement de $prefixe.</comment>");
    220                     $this->deleteDirectoryContent($output_base . '/$prefixe', true);
    221                     $this->deleteDirectoryContent($this->dirs['work'] . 'log/$prefixe', true);
    222                     $this->deleteDirectoryContent($this->dirs['work'] . 'input/$prefixe', true);
    223                     $this->deleteDirectoryContent($this->dirs['work'] . 'cache/$prefixe', true);
    224                 }
    225             }
    226         }
    227 
     198            // autodoc.txt doit être téléchargé ou mis à jour
     199            $this->actualiser_liste_source($file);
     200
     201            $this->output->writeln("* Lecture des informations du fichier");
     202            $anciens  = $this->parseFile($this->files['autodoc.txt.bak'], false);
     203            $presents = $this->parseFile($this->files['autodoc.txt']);
     204
     205            if ($anciens) {
     206                $absents = array_diff_key($anciens, $presents);
     207                $this->supprimer_vieux_plugins($absents);
     208            }
     209        }
    228210
    229211        $nb_erreur = 0;
    230         foreach ($presents as $prefixe => $present) {
    231 
    232             $this->output->writeln("\n");
    233             $titre = "Générer la documentation de $prefixe";
    234             $this->output->writeln("<comment>$titre</comment>");
    235             $this->output->writeln("<comment>" . str_repeat("-", strlen($titre)) . "</comment>");
    236 
    237             // ces options sont créées par retrouverInfoPaquetXml() SI elles n'existent pas.
    238             // il faut les nettoyer à chaque passage !
    239             $this->setOption('titre', null);
    240             $this->setOption('description', null);
    241             $this->setOption('presentation', null);
    242 
    243             $ok = false;
    244             $update = true;
    245 
    246             if ($this->createDirectories($prefixe)) {
    247                 $revision_actuelle = $this->recuperer_revision_svn();
    248 
    249                 if ($this->getSvnSource($present['source'])) {
    250                     $ok = $this->retrouverInfoPaquetXml()
    251                         && $this->prepareConfigXml();
    252 
    253                     if ($ok) {
    254                         // pas besoin de mettre à jour, si l'update n'a pas augmenté la révision
    255                         $revision_nouvelle = $this->recuperer_revision_svn();
    256                         if ($revision_nouvelle > $revision_actuelle) {
    257                             $ok = $ok && $this->clearLogs();
    258                         } else {
    259                             $update = false;
    260                         }
     212        $nb_update = 0;
     213
     214        foreach ($presents as $_prefixe => $description) {
     215            $ok = $this->obtenir_fichiers_a_documenter($_prefixe, $description);
     216            if ($ok) {
     217                $nb_update++;
     218                $this->execute();
     219            } elseif ($ok === false) {
     220                $nb_erreur++;
     221            }
     222        }
     223
     224        $this->output->writeln("\n");
     225        if ($nb_erreur) {
     226            $this->output->writeln("<comment>$nb_erreur documentation(s) non générée(s) sur " . count($presents) . ".</comment>");
     227        } else {
     228            $this->output->writeln("<comment>Documentations générées : " . $nb_update . " / " . count($presents) . ".</comment>");
     229        }
     230
     231        // générer la page sommaire (si pas uniquement 1 seul prefixe actualisé
     232        if (!$prefixe) {
     233            $this->generer_sommaire_documentations($presents, $output_base);
     234        }
     235
     236        $this->output->writeln(sprintf("%-'-81s", ""));
     237        $this->output->write(sprintf('%-68.68s .. ', "Temps total"));
     238        $this->output->writeln(sprintf('%8.3fs', microtime(true) - $timerStart));
     239        $this->output->writeln("Fin");
     240    }
     241
     242    /**
     243     * Télécharge ou actualise les fichiers d'une documentation
     244     *
     245     * Si la mise à jour ne modifie pas les fichiers,
     246     * la documentation n'est pas à actualiser (retourne null).
     247     *
     248     * @param string $prefixe
     249     *      Préfixe de cette documentation
     250     * @param array $description
     251     *      Description. La clé 'source' a l'url SVN
     252     * @return bool|null
     253     *     - True si OK et mise à jour à faire.
     254     *     - null : ok, mais mise à jour inutile
     255     *     - False : erreur
     256    **/
     257    public function obtenir_fichiers_a_documenter($prefixe, $description) {
     258        $this->output->writeln("\n");
     259        $titre = "Générer la documentation de $prefixe";
     260        $this->output->writeln("<comment>$titre</comment>");
     261        $this->output->writeln("<comment>" . str_repeat("-", strlen($titre)) . "</comment>");
     262
     263        // ces options sont créées par retrouverInfoPaquetXml() SI elles n'existent pas.
     264        // il faut les nettoyer à chaque passage !
     265        $this->setOption('titre', null);
     266        $this->setOption('description', null);
     267        $this->setOption('presentation', null);
     268
     269        $ok = false;
     270        $update = true;
     271
     272        if ($this->createDirectories($prefixe)) {
     273            $revision_actuelle = $this->recuperer_revision_svn();
     274
     275            if ($this->getSvnSource($description['source'])) {
     276                $ok = $this->retrouverInfoPaquetXml()
     277                    && $this->prepareConfigXml();
     278
     279                if ($ok) {
     280                    // pas besoin de mettre à jour, si l'update n'a pas augmenté la révision
     281                    $revision_nouvelle = $this->recuperer_revision_svn();
     282                    if ($revision_nouvelle > $revision_actuelle) {
     283                        $ok = $ok && $this->clearLogs();
     284                    } else {
     285                        $update = false;
    261286                    }
    262287                }
    263288            }
    264             if (!$update) {
    265                 $this->output->writeln("* Documentation déjà à jour.");
    266                 continue;
    267             }
    268             if (!$ok) {
    269                 $nb_erreur++;
    270                 $this->output->writeln("<error>* La documentation de $prefixe est ignorée à cause d'une erreur.</error>");
    271                 continue;
    272             }
    273             $this->execute();
    274         }
    275 
    276 
    277         $this->output->writeln("\n\n\n");
    278         if ($nb_erreur) {
    279             $this->output->writeln("<comment>$nb_erreur documentation(s) non générée(s) sur "
    280                 . count($presents) . ".</comment>");
    281         } else {
    282             $this->output->writeln("<comment>Toutes les documentations ("
    283                 . count($presents) . ") ont été générées.</comment>\n");
    284         }
    285 
     289        }
     290
     291        if (!$update) {
     292            $this->output->writeln("* Documentation déjà à jour.");
     293            return null;
     294        }
     295
     296        if (!$ok) {
     297            $this->output->writeln("<error>* La documentation de $prefixe est ignorée à cause d'une erreur.</error>");
     298            return false;
     299        }
     300
     301        return true;
     302    }
     303
     304
     305    /**
     306     * Générer le sommaire des documentations réalisés à partir d'un fichier source d'url
     307     *
     308     * @param array $presents
     309     *      Liste des plugins du fichier
     310     * @param string $outut_base
     311     *      Répertoire où on été enregistré les documentations
     312     * @return
     313    **/
     314    public function generer_sommaire_documentations($presents, $output_base) {
    286315
    287316        // générer un sommaire de toutes ces documentations
     
    335364            'topnav' => $topnav,
    336365        ));
     366
    337367        file_put_contents($index, $content);
    338 
    339 
    340         $this->output->writeln('');
    341         $this->output->writeln(sprintf("%-'-81s", ""));
    342         $this->output->write(sprintf('%-68.68s .. ', "Temps total"));
    343         $this->output->writeln(sprintf('%8.3fs', microtime(true) - $timerStart));
    344 
    345         $this->output->writeln("\nFin");
    346     }
    347 
     368    }
     369
     370
     371    /**
     372     * Télécharge la source de liste des documentations à faire dans autodoc.txt
     373     * et fait une rotation avec l'ancienne liste
     374     *
     375     * @param strig $file
     376     *     URL du fichier source (svn) de la liste des docémentations à générer
     377     * @return bool True si ok.
     378    **/
     379    public function actualiser_liste_source($file) {
     380        // supprimer l'ancienne rotation
     381        if (file_exists( $this->files['autodoc.txt.bak'] )) {
     382            unlink($this->files['autodoc.txt.bak']);
     383        }
     384        // rotation
     385        if (file_exists( $this->files['autodoc.txt'] )) {
     386            copy($this->files['autodoc.txt'], $this->files['autodoc.txt.bak']);
     387            unlink($this->files['autodoc.txt']);
     388        }
     389
     390        // copier le fichier de liste chez soi
     391        if (0 === strpos($file, 'svn://')) {
     392            $this->output->write("* Obtenir <info>$file</info>  ");
     393
     394            // si c'est en svn, on l'exporte simplement.
     395            if ($res = $this->makeSvnCommand("export $file autodoc.txt", true, $this->dirs['work'])) {
     396                $this->output->writeln("[<info>OK</info>]");
     397            } else {
     398                $this->output->writeln("[<info>Error</info>]");
     399                throw new \Exception("Impossible de récupérer le fichier SVN : $file");
     400            }
     401        } else {
     402            if (file_exists($file)) {
     403                copy($file, $this->files['autodoc.txt']);
     404            } else {
     405                throw new \Exception("Impossible de trouver le fichier : $file");
     406            }
     407        }
     408
     409        return true;
     410    }
     411
     412    /**
     413     * Effacte une ou plusieurs documentations qui ne sont plus listés
     414     * dans la description du fichier autodoc.txt
     415     *
     416     * @param array $absents
     417     *     Liste [ prefixe => url ]
     418     * @return bool
     419     *     True si au moins une documentation, et ses caches, ont été effacés.
     420    **/
     421    public function supprimer_vieux_plugins($absents) {
     422        if ($absents) {
     423            $this->output->writeln("<comment>Certaines documentations ne sont plus à générer.</comment>");
     424            foreach ($absents as $prefixe=>$absent) {
     425                $this->output->writeln("<comment>- Effacement de $prefixe.</comment>");
     426                $this->deleteDirectoryContent($output_base . '/$prefixe', true);
     427                $this->deleteDirectoryContent($this->dirs['work'] . 'log/$prefixe', true);
     428                $this->deleteDirectoryContent($this->dirs['work'] . 'input/$prefixe', true);
     429                $this->deleteDirectoryContent($this->dirs['work'] . 'cache/$prefixe', true);
     430            }
     431            return true;
     432        }
     433        return false;
     434    }
    348435
    349436    /**
     
    529616
    530617                if (!$res = $this->makeSvnCommand("update")) {
    531                     $this->output->writeln("[<error>Echec</error>]");
     618                    $this->output->writeln("<error>[Echec Update]</error>");
    532619                    return false;
    533620                }
     
    546633
    547634            if (!$res = $this->makeSvnCommand("checkout $source .")) {
    548                 $this->output->writeln("<error>[Echec]</error>");
     635                $this->output->writeln("<error>[Echec Checkout]</error>");
    549636                return false;
    550637            }
Note: See TracChangeset for help on using the changeset viewer.