Changeset 43982 in spip-zone


Ignore:
Timestamp:
Jan 29, 2011, 5:04:00 PM (10 years ago)
Author:
esj@…
Message:

smart_paquets. Mettre dans un fichier à part, et le charger automatiquement, ce qui est spécifique à la production de archives.xml pour plugin.xml, afin de pouvoir à terme basculer automatiquement sur une autre fonction pour paquet.xml. Et blinder un peu les cas d'erreur.

Location:
_outils_/smart_paquets
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • _outils_/smart_paquets/inc_empaqueteur.php

    r43250 r43982  
    88#error_reporting(E_ALL);
    99
    10 // Fonction creant le fichier archives.xml final.
    11 // Ne pas le reecrire si rien de neuf, c'est + efficace et ca permet
    12 // au detecteur de nouvelle version d'utiliser If-Modified-Since.
    13 // Attention, file_put_contents fait ce qu'il veut de certaines lignes vides
    14 // http://fr2.php.net/manual/fr/function.file-put-contents.php
    15 
    16 function empaqueteur_xml_archives($depot, $zips, $dir_paq, $dir_repo, $srcname)
    17 {
    18         $xml = '';
    19         $re = ",<"."\?xml[^>]*\?".">,Uims";
    20         foreach($zips as $zip => $res) {
    21                 list($size, $time, $source, $commit) = $res;
    22 #               if (file_exists($dir_repo . $source . '/lang'))
    23 #                 echo_trace("$source a des chaines de langues");
    24                 // Recuperer le xml qui decrit le plugin
    25                 $f = $dir_repo . $source . '/' . $srcname ;
    26                 if (file_exists($f))
    27                         $desc = trim(preg_replace($re,'',file_get_contents($f)));
    28                 else {
    29                         echo_trace("(info) Paquet $zip sans plugin.xml");
    30                         $desc = '';
    31                 }
    32 
    33                 $xml .= "<archive id=\"$zip\">
    34 <file>$zip</file>
    35 <size>$size</size>
    36 <date>$time</date>
    37 <source>$source</source>
    38 <last_commit>$commit</last_commit>
    39 $desc
    40 </archive>\n\n";
    41         }
    42         if ($xml) {
    43                 $xml_depot = empaqueteur_xml_depot($depot);
    44                 $all = "$xml_depot
    45 <archives>
    46 $xml
    47 </archives>";
    48                 $xml = strlen($all);
    49                 $f = $dir_paq . $dir_repo . 'archives.xml';
    50                 $old = (file_exists($f)) ? trim(file_get_contents($f)) : '';
    51                 if ($old != $all) {
    52                         echo_trace("Nouveau $f de taille $xml");
    53                         file_put_contents($f, $all);
    54                         return;
    55                 }
    56         }
    57         echo_trace("$f intact (taille: $xml)");
    58 }
    59 
    60 // Fonction de construction du bloc xml du depot
    61 // Pour l'instant ce bloc n'implemente pas la nouvelle DTD
    62 function empaqueteur_xml_depot($depot) {
    63         $xml = '';
    64         foreach ($depot as $_balise => $_valeur) {
    65                 $xml .= "<$_balise>$_valeur</$_balise>\n";
    66         }
    67         if ($xml)
    68                 $xml = "<depot>\n$xml\n</depot>";
    69 
    70         return $xml;
    71 }
    72 
    7310function empaqueteur($url, $dir_repo, $dir_paq, $src, $dest, $xml, $nom_vcs, $mail_to, $mail_from)
    7411{
    7512        global $erreurs;
     13
     14        $producteur =  'empaqueteur_' . basename($xml, '.xml');
     15        require($producteur . '.php');
    7616
    7717        $erreurs = array();
     
    8020        $dir_paq = rtrim($dir_paq ? $dir_paq : '.','/') .'/';
    8121       
    82         list($depot, $zips) = empaqueteur_zips($url, $dir_repo, $dir_paq, $src, $nom_vcs);
     22        list($depot, $zips) = empaqueteur_zips($url, $dir_repo, $dir_paq, $src, $nom_vcs, $xml);
    8323        if (!$erreurs) {
    8424                // ne pas nettoyer le fichier archives.xml !
     
    8929        } elseif ($mail_to) empaqueteur_mail($erreurs, $mail_to, $mail_from);
    9030
    91         foreach(is_array($dest) ? $dest : array($dest) as $nom_dest) {
    92                 if (!function_exists($dest = 'empaqueteur_xml_' . $nom_dest)) {
    93                         echo_trace("Producteur xml inconnu: '$nom_dest'");
    94                 } else $dest($depot, $zips, $dir_paq, $dir_repo, $xml);
    95         }
    96 }
    97 
    98 function empaqueteur_zips($url, $dir_repo, $dir_paq, $src, $nom_vcs)
     31        $all = $producteur($depot, $zips);
     32        if ($all)
     33                empaqueteur_xml_archives($all, $dir_paq, $dir_repo);
     34        else    echo_trace("Aucun Zip produit");
     35}
     36
     37// Fonction creant le fichier archives.xml final.
     38// Ne pas le reecrire si rien de neuf, c'est + efficace et ca permet
     39// au detecteur de nouvelle version d'utiliser If-Modified-Since.
     40// Attention, file_put_contents fait ce qu'il veut de certaines lignes vides
     41// http://fr2.php.net/manual/fr/function.file-put-contents.php
     42
     43function empaqueteur_xml_archives($all, $dir_paq, $dir_repo)
     44{
     45        $xml = strlen($all);
     46        $f = $dir_paq . $dir_repo . 'archives.xml';
     47        $old = (file_exists($f)) ? trim(file_get_contents($f)) : '';
     48        if ($old != $all) {
     49                echo_trace("Nouveau $f de taille $xml");
     50                file_put_contents($f, $all);
     51                return;
     52        }
     53        echo_trace("$f intact (taille: $xml)");
     54}
     55
     56function empaqueteur_zips($url, $dir_repo, $dir_paq, $src, $nom_vcs, $xml)
    9957{
    10058        $dir_tmp = $dir_paq.'tmp/';
    10159        $dir_paq .= $dir_repo;
    102         $zips = array();
    10360
    10461        if (!function_exists($vcs = 'empaqueteur_exec_' . $nom_vcs)) {
     
    13087
    13188        list($depot, $paquets) = liste_paquets($dir_repo . $src);
     89        $zips = array();
    13290        foreach($paquets as $paquet){
    133                 if ($paquet['revision']=='HEAD') {
    134                         $source = rtrim($paquet['source'],'/');
    135                         $dsource = $dir_repo.$source;
    136                         if (!file_exists($dsource)){
    137                                 echo_trace("Erreur : $dsource inexistant");
    138                         } else {
    139                                 // ajouter le fichier svn.revision
    140                                 $rev = $dsource . "/svn.revision";
    141                                 $vcs("info", "$dsource > $rev");
    142                                 $info = renseigner_revision_paquet($rev);
    143                                 $zip = $paquet['nom'] .".zip";
    144                                 $zippath = $dir_paq.$zip;
    145                                 $res = paqueter($dsource, $zip, $zippath, $paquet['nom_dossier'], $info, $dir_tmp);
    146                                 // copier le svn.revision de stable/spip.zip qui permet de connaitre la derniere version stable
    147                                 if ($zip=="stable/spip.zip") {
    148                                         // necessaire de remettre le fichier a la date actuelle
    149                                         // car il a la date du dernier commit sur ce paquet
    150                                         # touch($dsource."/svn.revision");
    151                                         copie_update($rev,$dir_paq.dirname($zip)."/svn.revision");
    152                                 }
    153                                 // supprimer le fichier info revision cree ci-dessus
    154                                 @unlink($rev);
    155                                 $zips[$zip] = array(
    156                                                     filesize($zippath),
    157                                                     filemtime($zippath),
    158                                                     $source,
    159                                                     $info[1]);
    160                         }
     91                if ($paquet['revision']=='HEAD' AND
     92                    $r = empaqueteur_zip($paquet, $dir_repo, $dir_paq, $dir_tmp, $vcs, $xml)) {
     93                        $zips[$paquet['nom'] .".zip"] = $r;
    16194                        if (intval(_SLEEP_BETWEEN)) usleep(_SLEEP_BETWEEN);
    16295                }
     
    16699}
    167100       
     101function empaqueteur_zip($paquet, $dir_repo, $dir_paq, $dir_tmp, $vcs, $xml)
     102{
     103        $dsource = $dir_repo. $paquet['source'];
     104        if (!file_exists($dsource)){
     105                echo_trace("Erreur : $dsource inexistant");
     106                return false;
     107        }
     108        // ajouter le fichier svn.revision
     109        $rev = $dsource . "/svn.revision";
     110        $vcs("info", "$dsource > $rev");
     111        $info = renseigner_revision_paquet($rev);
     112        $zip = $paquet['nom'] .".zip";
     113        $zippath = $dir_paq.$zip;
     114        if (!paqueter($dsource, $zip, $zippath, $paquet['nom_dossier'], $info, $dir_tmp))
     115                return false;
     116        // copier le svn.revision de stable/spip.zip qui permet de connaitre la derniere version stable
     117        if ($zip=="stable/spip.zip") {
     118                // necessaire de remettre le fichier a la date actuelle
     119                // car il a la date du dernier commit sur ce paquet
     120                # touch($dsource."/svn.revision");
     121                copie_update($rev,$dir_paq.dirname($zip)."/svn.revision");
     122        }
     123        // supprimer le fichier info revision cree ci-dessus
     124        @unlink($rev);
     125        // Recuperer le xml qui decrit le plugin
     126        $f = $dsource . '/' . $xml ;
     127        if (!file_exists($f)) {
     128                echo_trace("(info) Paquet $zip sans $xml");
     129                $desc = '';
     130        } else {
     131                $re = ",<"."\?xml[^>]*\?".">,Uims";
     132                $desc = trim(preg_replace($re,'',file_get_contents($f)));
     133        }
     134
     135        return array(
     136                filesize($zippath),
     137                filemtime($zippath),
     138                $paquet['source'],
     139                $info[1],
     140                $desc);
     141}
     142
    168143function empaqueteur_mail($erreurs, $mail_to, $mail_from)
    169144{
     
    312287        if (strtotime($date_commit)<$date_paquet AND !_FORCE_UPDATE) {
    313288                echo_trace("$zip OK : du ".date('Y-m-d H:i:s',$date_paquet)." / dernier commit du $date_commit");
     289                return true;
    314290        }
    315291        else {
    316                 preparer_chemin($dir_tmp.$nom_dossier);
    317                 if (!rename($source,$dir_tmp.$nom_dossier)) {
    318                         echo_trace("Erreur: impossible de renommer $source");
     292                $tmp = $dir_tmp.$nom_dossier;
     293                preparer_chemin($tmp);
     294                if (!rename($source,$tmp)) {
     295                        echo_trace("Erreur : $source --> $tmp");
     296                        return false;
    319297                } else {
    320298                        $d = getcwd();
     
    333311                                touch($dir_tmp.$zipfile,strtotime($date_commit)+1);
    334312                        }
    335 
    336                         rename($dir_tmp.$nom_dossier,$source);
     313                        rename($tmp,$source);
    337314                }
    338315                supprimer_chemin($dir_tmp,$nom_dossier);
    339316                copie_update($dir_tmp.$zipfile,$zippath);
     317                return true;
    340318        }
    341319}
     
    385363                if (strlen($lignepaquet)) {
    386364                        if (substr($lignepaquet,0,1)!="#") {
    387                                 // C'est une ligne de fefinition d'un paquet :
     365                                // C'est une ligne de definition d'un paquet :
    388366                                // - on separe les parametres
    389367                                // - et on fixe ceux manquants
     
    395373                                $nom_dossier = empty($a[2]) ? $nom_paquet : $a[2];
    396374                                // Ajout au tableau des paquets a construire
    397                                 $paquets[] = array('source'=>$source,'nom'=>$nom_paquet,'nom_dossier'=>$nom_dossier,'revision'=>$svn_version);
     375                                $paquets[] = array('source'=>rtrim($source,'/'),
     376                                                   'nom'=>$nom_paquet,
     377                                                   'nom_dossier'=>$nom_dossier,
     378                                                   'revision'=>$svn_version);
    398379                        }
    399380                        else if (preg_match('#@([^=\s]+)\s*=(.+)$#', substr($lignepaquet, 1), $matches)){
Note: See TracChangeset for help on using the changeset viewer.