Rev Author Line No. Line
30461 cedric@yte 1 <?php
2  
44979 eric@smell 3 // -------------------------------------- APPEL PRINCIPAL ------------------------------------------
40015 esj@rezo.n 4  
44979 eric@smell 5 // Fonction principale appelee par le script empaqueteur.php
6 // Elle lance successivement:
7 // 1. la creation des zips et de la base des logos
8 // 2. le nettoyage des paquets obsoletes
9 // 3. la creation du fichier xml des paquets
10 // 4. la creation du fichier des traductions de Salvatore
11 // 5. la creation d'un index des logos
12 //
13 // $url : url du repository des sources (ex: svn://zone.spip.org/spip-zone)
14 // $dir_repo : repertoire racine des sources extraits du repository (ex: spip-zone)
15 // $dir_paq : repertoire de depot des paquets crees (ex: paquets)
16 // $src : nom du fichier listant les archives a creer (ex: archivelist.txt)
17 // $dest : nom sans extension du fichier xml recapitulant toutes les archives (ex: archives)
51219 eric@smell 18 // $dtd_prio : DTD a utiliser en priorite (plugin ou paquet)
44979 eric@smell 19 // $nom_vcs : gestionnaire de versions motorisant le repository concerne (ex: svn)
20 // $mail_to : destinataire des mails d'information
21 // $mail_from : emetteur des mails d'information
22 //
23 // return : aucun
51219 eric@smell 24 function empaqueteur($url, $dir_repo, $dir_paq, $src, $dest, $dtd_prio, $nom_vcs, $mail_to, $mail_from) {
39967 esj@rezo.n 25 global $erreurs;
47298 kent1@arsc 26 $dir_tmp = $dir_paq.'tmp/';
44979 eric@smell 27 require('inc_outils.php');
30527 cedric@yte 28  
51219 eric@smell 29 // On charge les includes correspondant aux DTD utilisees
30 require('empaqueteur_plugin.php');
31 require('empaqueteur_paquet.php');
43982 esj@rezo.n 32  
40079 esj@rezo.n 33 $erreurs = array();
39967 esj@rezo.n 34 $url = trim($url);
35 $dir_repo = rtrim($dir_repo ? $dir_repo : basename($url),'/') .'/';
36 $dir_paq = rtrim($dir_paq ? $dir_paq : '.','/') .'/';
40079 esj@rezo.n 37  
44979 eric@smell 38 // 1. creation des zips et de la base des logos
53825 eric@smell 39 list($depot, $zips, $logos, $xmls) = empaqueteur_archives($url, $dir_repo, $dir_paq, $src, $nom_vcs, $dtd_prio);
44979 eric@smell 40  
47936 eric@smell 41 // 2. nettoyage des paquets et logos obsoletes
40079 esj@rezo.n 42 if (!$erreurs) {
51219 eric@smell 43 $fichiers_a_conserver = array_keys($zips);
44 $fichiers_a_conserver = array_merge($fichiers_a_conserver, $logos);
53824 eric@smell 45 $fichiers_a_conserver = array_merge($fichiers_a_conserver, $xmls);
40079 esj@rezo.n 46 // ne pas nettoyer le fichier archives.xml !
41878 cedric@yte 47 foreach(is_array($dest) ? $dest : array($dest) as $nom_dest)
51219 eric@smell 48 $fichiers_a_conserver[] = $nom_dest . '.xml';
47936 eric@smell 49 // ne pas nettoyer le fichier traductions.txt !
51219 eric@smell 50 $fichiers_a_conserver[] = 'traductions.txt';
47936 eric@smell 51 // ne pas nettoyer l'index des logos logos.php !
51219 eric@smell 52 $fichiers_a_conserver[] = 'logos.php';
53 nettoyer_vieux_fichiers($fichiers_a_conserver, $dir_paq . $dir_repo, $dir_tmp);
44979 eric@smell 54 }
55 elseif ($mail_to)
56 envoyer_mail($erreurs, $mail_to, $mail_from);
40079 esj@rezo.n 57  
44979 eric@smell 58  
59 // 3. la creation du fichier xml des paquets
51219 eric@smell 60 // -- obtention des contenus du fichier xml des paquets et de celui des traductions Salvatore
61 list($archives, $salvatore) = empaqueteur_resultats($depot, $zips);
44014 eric@smell 62 if ($archives)
44979 eric@smell 63 empaqueteur_xml_archives($dest . '.xml', $archives, $dir_paq, $dir_repo);
44014 eric@smell 64 else
65 echo_trace("Aucun Zip produit");
66  
44979 eric@smell 67 // 4. la creation du fichier des traductions de Salvatore
44014 eric@smell 68 if ($salvatore)
44979 eric@smell 69 empaqueteur_salvatore('traductions.txt', $salvatore, $dir_paq, $dir_repo);
44014 eric@smell 70 else
71 echo_trace("Aucune traduction avec Salvatore");
44043 eric@smell 72  
44979 eric@smell 73 // 5. la creation d'un index des logos
45336 eric@smell 74 empaqueteur_index_logos('logos.php', $dir_paq, $dir_repo);
43982 esj@rezo.n 75 }
76  
77  
44979 eric@smell 78 // ---------------------------------- CREATION DES ARCHIVES ----------------------------------------
40079 esj@rezo.n 79  
44979 eric@smell 80 // Fonction de creation des zips et de la base des logos
81 // Elle lance successivement:
82 // 1. Creation des repertoires de travail et import initial (uniquement la premiere fois)
83 // 2. Check-out ou update des sources a archiver
84 // 3. Lecture de la liste des archives a creer
85 // 4. Creation de la liste des archives requises
86 //
87 // $url : url du repository des sources (ex: svn://zone.spip.org/spip-zone)
88 // $dir_repo : repertoire racine des sources extraits du repository (ex: spip-zone)
89 // $dir_paq : repertoire de depot des paquets crees (ex: paquets)
90 // $src : nom du fichier listant les archives a creer (ex: archivelist.txt)
91 // $nom_vcs : gestionnaire de versions motorisant le repository concerne (ex: svn)
51219 eric@smell 92 // $dtd_prio : DTD a utiliser en priorite (plugin ou paquet)
44979 eric@smell 93 //
94 // return : tableau des infos du depot et des zips crees
95 // 0 : tableau associatif (info -> valeur) de chaque info collectee sur le depot
96 // 1 : tableau associatif (nom de l'archive -> liste des infos) des zips crees
53836 eric@smell 97 // 2 : tableau de logos crees
98 // 3 : tableau des xml copies
51219 eric@smell 99 function empaqueteur_archives($url, $dir_repo, $dir_paq, $src, $nom_vcs, $dtd_prio) {
44979 eric@smell 100 // Definition des deux sous-repertoires temporaires et definitifs des paquets
39967 esj@rezo.n 101 $dir_tmp = $dir_paq.'tmp/';
102 $dir_paq .= $dir_repo;
103  
44979 eric@smell 104 // 1. Creation des repertoires de travail et import initial
39988 esj@rezo.n 105 if (!file_exists($dir_repo)){
119149 cedric@yte 106 // TODO : refaire
107 die("$dir_repo non initialise avec $nom_vcs");
108 //preparer_chemin(dirname(rtrim($dir_repo,'/')));
109 //if ($url) $vcs("checkout", "$url $dir_repo");
39967 esj@rezo.n 110 }
39988 esj@rezo.n 111 if (!file_exists($dir_paq))
112 preparer_chemin($dir_paq);
113 if (!file_exists($dir_tmp))
114 preparer_chemin($dir_tmp);
36918 cedric@yte 115  
44979 eric@smell 116 // 2. Check-out ou update des sources a archiver
43250 eric@smell 117 // Si le repo est en file:// on fait un svnsync dessus,
39988 esj@rezo.n 118 // le up est fait par un hook post-commit sur ce qui a change uniquement
119 // sauf une fois par jour
119149 cedric@yte 120 if (vcs_smart_update($nom_vcs, $dir_repo, _FORCE_UPDATE)
121 and !_FORCE_UPDATE) {
122 // fichiers modifies depuis la derniere heure
123 $dirs_changed = dirschanged_read($dir_repo, time()-3600);
124 if ($dirs_changed) {
69157 cedric@yte 125 echo_trace("Dossiers modifies : ".implode(", ",$dirs_changed));
126 }
119156 cedric@yte 127 else {
128 echo_trace("Aucun dossiers modifie");
129 }
41873 cedric@yte 130 }
119149 cedric@yte 131 else {
132 $dirs_changed = null;
39988 esj@rezo.n 133 }
134  
51219 eric@smell 135 // 3. Lecture de la liste des archives a creer et des informations sur le depot
44979 eric@smell 136 list($depot, $paquets) = lister_paquets($dir_repo . $src);
137  
138 // 4. Creation de la liste des archives requises
53836 eric@smell 139 $zips = $logos = $xmls = array();
51219 eric@smell 140 foreach($paquets as $_paquet){
141 if ($_paquet['revision']=='HEAD'
119149 cedric@yte 142 AND list($infos, $logo, $xml) = creer_paquet($_paquet, $dir_repo, $dir_paq, $dir_tmp, $nom_vcs, $dtd_prio, $dirs_changed)) {
51219 eric@smell 143 $zips[$_paquet['nom'] .".zip"] = $infos;
47936 eric@smell 144 if ($logo) $logos[] = $logo;
53824 eric@smell 145 if ($xml) $xmls[] = $xml;
39988 esj@rezo.n 146 if (intval(_SLEEP_BETWEEN)) usleep(_SLEEP_BETWEEN);
30461 cedric@yte 147 }
148 }
39988 esj@rezo.n 149 echo_trace(count($zips) . " trouves");
44979 eric@smell 150  
53824 eric@smell 151 return array($depot, $zips, $logos, $xmls);
30461 cedric@yte 152 }
44979 eric@smell 153  
154  
155 // Lister les paquets demandes dans le fichier des archives
156 // et compiler les informations sur le depot
157 //
158 // $src : nom du fichier listant les archives a creer
159 //
160 // return : tableau des infos du depot et des archives a creer
161 // 0 : tableau associatif (info -> valeur) de chaque info collectee sur le depot
162 // 1 : tableau associatif des archives a creer (source, nom, nom_dossier et revision)
51219 eric@smell 163 function lister_paquets($src) {
44979 eric@smell 164  
165 echo_trace("chargement de $src");
166 if (!$archivefile=file($src)){
167 echo_trace("Erreur : Impossible de lire $src");
168 return array();
169 }
170  
171 $depot = array();
172 $paquets = array();
173 foreach($archivefile as $ligne=>$lignepaquet){
51219 eric@smell 174 //on vire le retour ligne de la fin
175 $lignepaquet=rtrim($lignepaquet);
44979 eric@smell 176 if (strlen($lignepaquet)) {
177 if (substr($lignepaquet,0,1)!="#") {
178 // C'est une ligne de definition d'un paquet :
179 // - on separe les parametres
180 // - et on fixe ceux manquants
181 $a = explode(";",$lignepaquet);
182 $b = preg_split("/:/",$a[0]);
52990 eric@smell 183 $source = trim($b[0]);
184 $svn_version = empty($b[1]) ?'HEAD' : trim($b[1]);
185 $nom_paquet = empty($a[1]) ? basename($source) : trim($a[1]);
186 $nom_dossier = empty($a[2]) ? $nom_paquet : trim($a[2]);
44979 eric@smell 187 // Ajout au tableau des paquets a construire
188 $paquets[] = array('source'=>rtrim($source,'/'),
189 'nom'=>$nom_paquet,
190 'nom_dossier'=>$nom_dossier,
191 'revision'=>$svn_version);
192 }
193 else if (preg_match('#@([^=\s]+)\s*=(.+)$#', substr($lignepaquet, 1), $matches)){
194 // C'est une ligne d'information sur le depot
195 // - on stocke le parametre trouve
196 $depot[trim($matches[1])] = trim($matches[2]);
197 }
198 }
199 }
200  
201 echo_trace(count($depot)." informations de depot definies");
202 echo_trace(count($paquets)." paquets definis");
203 return array($depot, $paquets);
204 }
39988 esj@rezo.n 205  
44979 eric@smell 206  
207 // Fonction de creation d'un paquet soit :
208 // - de l'archive des sources (zip actuellement)
45574 eric@smell 209 // - des informations completes sur le paquet (yc la liste des traductions)
44979 eric@smell 210 // - et de son logo eventuel
211 //
212 // $paquet : tableau des infos sur l'archive a creer
213 // $dir_repo : repertoire racine des sources extraits du repository
214 // $dir_paq : repertoire de depot des paquets crees
215 // $dir_tmp : repertoire temporaire de depot des archives crees
119149 cedric@yte 216 // $nom_vcs : methode vcs (git, gitsvn, svn)
51219 eric@smell 217 // $dtd_prio : DTD a utiliser en priorite (plugin ou paquet)
84278 eric@smell 218 // $dirs_changed : repertoires modifies depuis le dernier passage
44979 eric@smell 219 //
51219 eric@smell 220 // return : tableau des infos
221 // 0 : paquet cree
222 // 0 : taille du paquet
223 // 1 : date du paquet
224 // 2 : arborescence des sources du paquet (relatif a l'url des sources)
225 // 3 : date du dernier commit
226 // 4 : liste des traductions sous la forme de la balise XML <traductions>
227 // 5 : contenu du fichier xml du plugin
228 // 6 : balises nom, slogan et description en multi tirees des fichiers de langue
229 // 7 : dtd utilisee
230 // 1 : logo cree (fichier)
53824 eric@smell 231 // 2 : xml recopie (fichier)
119149 cedric@yte 232 function creer_paquet($paquet, $dir_repo, $dir_paq, $dir_tmp, $nom_vcs, $dtd_prio, $dirs_changed=null) {
44979 eric@smell 233 // Verifier le repertoire source du paquet a creer
43982 esj@rezo.n 234 $dsource = $dir_repo. $paquet['source'];
235 if (!file_exists($dsource)){
236 echo_trace("Erreur : $dsource inexistant");
237 return false;
238 }
69157 cedric@yte 239  
69163 cedric@yte 240 $cache = $dir_paq . ".".str_replace("/",".",$paquet['nom']).".cache";
43982 esj@rezo.n 241 $zip = $paquet['nom'] .".zip";
242 $zippath = $dir_paq.$zip;
69157 cedric@yte 243  
119152 cedric@yte 244 $changed = true;
245 if (strpos($paquet['source'], 'tags/') === 0) {
246 // un tag ne change jamais : une fois que le zip existe on ne le regenere jamais
247 $changed = false;
248 }
249 else {
250 // si on a une liste des repertoires modifies, on sait si le contenu a change ou pas
251 if (!is_null($dirs_changed) AND !in_array($dsource,$dirs_changed)) {
252 $changed = false;
253 }
254 }
255  
256 if (!$changed
69157 cedric@yte 257 AND file_exists($zippath)
258 AND file_exists($cache)
259 AND $res = file_get_contents($cache)
260 AND $res = unserialize($res)
119154 cedric@yte 261 AND $res[0][2] == $paquet['source']
69157 cedric@yte 262 ) {
263  
264 // rien a faire
69160 cedric@yte 265 echo_trace("(info) $zippath depuis le cache $cache");
43982 esj@rezo.n 266 }
69157 cedric@yte 267 else {
44979 eric@smell 268  
119152 cedric@yte 269 // verifier les externals si besoin (concerne le core principalement)
270 vcs_externals_smart_update($nom_vcs, $dir_repo, $paquet['source']);
271  
69157 cedric@yte 272 // Creation de l'archive
273 // -- Ajouter le fichier svn.revision dans les fichiers de l'archive pour les besoins de SPIP
119149 cedric@yte 274 $file_rev = $dsource . "/svn.revision";
275 $last_commit = renseigner_revision_paquet($nom_vcs, $dir_repo, $paquet['source'], $file_rev);
276 $date_commit = $last_commit[1];
69157 cedric@yte 277 // -- zipper les sources incluant le fichier svn.revision
119149 cedric@yte 278 if (!archiver($dsource, $zip, $zippath, $paquet['nom_dossier'], $last_commit, $dir_tmp))
69157 cedric@yte 279 return false;
280 // -- Traiter le cas de SPIP :
281 // copier le svn.revision de stable/spip.zip qui permet de connaitre la derniere version stable
282 if ($zip=="stable/spip.zip") {
283 // necessaire de remettre le fichier a la date actuelle
284 // car il a la date du dernier commit sur ce paquet
285 # touch($dsource."/svn.revision");
119149 cedric@yte 286 copie_update($file_rev, $dir_paq.dirname($zip)."/svn.revision");
69157 cedric@yte 287 }
288 // -- supprimer le fichier info revision cree ci-dessus
119149 cedric@yte 289 @unlink($file_rev);
69157 cedric@yte 290  
291 // Determination de la dtd a utiliser
292 $dtd = '';
84278 eric@smell 293 $desc = '';
69157 cedric@yte 294 $f = $dsource . '/' . $dtd_prio . '.xml';
51219 eric@smell 295 if (file_exists($f))
69157 cedric@yte 296 $dtd = $dtd_prio;
51219 eric@smell 297 else {
69157 cedric@yte 298 $autre_dtd = ($dtd_prio == 'plugin') ? 'paquet' : 'plugin';
299 $f = $dsource . '/' . $autre_dtd . '.xml';
300 if (file_exists($f))
301 $dtd = $autre_dtd;
302 else {
303 // Paquet sans xml correspondant a une contribution quelconque
304 echo_trace("(info) Paquet $zip sans fichier XML");
305 }
306 }
44979 eric@smell 307  
69157 cedric@yte 308 $traductions = '';
309 $logo = '';
310 $multis = '';
311 $xml = false;
84278 eric@smell 312 $autorisations = '';
69157 cedric@yte 313 if ($dtd) {
314 // Recuperer le xml qui decrit le plugin et suppression de l'entete XML si elle existe
315 $re = ",<"."\?xml[^>]*\?".">,Uims";
316 $desc = trim(preg_replace($re, '', file_get_contents($f)));
45574 eric@smell 317  
69157 cedric@yte 318 // Construire la liste des traductions du plugin
319 $traductions = compiler_traductions($dsource);
51219 eric@smell 320  
69157 cedric@yte 321 // Contruire les balises multi du nom, slogan et description qui ne sont plus dans le paquet
322 $f = 'empaqueteur_' . $dtd . '_multi';
323 $multis = !function_exists($f) ? '' : $f($dsource);
324  
84278 eric@smell 325 // Lister les autorisations du plugin
326 // -- détermination de la regexp en fonction de la DTD
327 $regexp = ($dtd == 'plugin')
328 ? "#<pipeline>\s*<nom>\s*autoriser\s*</nom>\s*<inclure>\s*([\w/_.]*)\s*</inclure>#imU"
329 : "#<pipeline\s+nom=['\"]autoriser['\"]\s+inclure=['\"]([\w/_.]*)['\"][^>]*>#imU";
330 // -- récupération des autorisations si elle existe
331 $autorisations = lister_autorisations($regexp, $desc, $dsource);
332  
69157 cedric@yte 333 // Creer le logo du paquet
334 $f = 'empaqueteur_' . $dtd . '_logo';
335 $f = !function_exists($f) ? '' : $f($desc, $dsource);
336 if ($f AND file_exists($f) AND preg_match('/[.][^.]*$/', $f, $r)) {
337 $logo = $paquet['nom'] . $r[0];
338 $d = $dir_paq . $logo;
339 copy($f, $d);
340 }
341  
342 // Copier le fichier xml de description du plugin au meme endroit que les logos et zips
343 $xml = $paquet['nom'] . '.xml';
344 if (strlen($desc))
345 file_put_contents($dir_paq . $xml, $desc);
43985 esj@rezo.n 346 }
53824 eric@smell 347  
69157 cedric@yte 348 $res = array(
119154 cedric@yte 349 array(
350 filesize($zippath),
351 filemtime($zippath),
352 $paquet['source'],
353 $date_commit,
354 $traductions,
355 $desc,
356 $multis,
357 $dtd,
358 $autorisations),
69157 cedric@yte 359 $logo,
360 $xml);
361  
362 file_put_contents($cache,serialize($res));
43982 esj@rezo.n 363 }
44979 eric@smell 364  
69157 cedric@yte 365 return $res;
43982 esj@rezo.n 366 }
367  
30461 cedric@yte 368  
44979 eric@smell 369 // Fonction de creation d'une archive des sources contenu dans une arborescence donnee.
370 // Aujourd'hui l'archive est toujours un zip
371 //
372 // $source : emplacement des sources a archiver
373 // $zip : nom de l'archive a creer
374 // $zippath : chemin complet de l'archive a creer
375 // $nom_dossier : arborescence dans le zip qui sera cree lors du dezippage
376 // $rev : tableau des informations sur le dernier commit (revision, date)
377 // $dir_tmp : repertoire temporaire de depot des archives creees
378 //
379 // return : true/false
380 function archiver($source, $zip, $zippath, $nom_dossier, $rev, $dir_tmp){
30674 cedric@yte 381 $zipfile = basename($zip);
44979 eric@smell 382 list($revision, $date_commit) = $rev;
39967 esj@rezo.n 383 $date_paquet = file_exists($zippath) ? filemtime($zippath) : 0;
30677 cedric@yte 384 // tester si le paquet est a jour
51248 cedric@yte 385 if (strtotime($date_commit) <= $date_paquet AND !_FORCE_UPDATE) {
30677 cedric@yte 386 echo_trace("$zip OK : du ".date('Y-m-d H:i:s',$date_paquet)." / dernier commit du $date_commit");
43982 esj@rezo.n 387 return true;
30677 cedric@yte 388 }
389 else {
51245 cedric@yte 390 echo_trace("$zip OLD : du ".date('Y-m-d H:i:s',$date_paquet)." / dernier commit du $date_commit");
43982 esj@rezo.n 391 $tmp = $dir_tmp.$nom_dossier;
392 preparer_chemin($tmp);
393 if (!rename($source,$tmp)) {
394 echo_trace("Erreur : $source --> $tmp");
395 return false;
39973 esj@rezo.n 396 } else {
397 $d = getcwd();
398 chdir($dir_tmp);
114642 cedric@yte 399 // avant de zipper il faut timestamper le dossier conteneur a la date du dernier commit
400 // pour que le shasum du zip ne change que si le dernier commit change
401 $dp = explode('/', $nom_dossier);
402 $base_dir = reset($dp);
403 $timestamp = strtotime($date_commit);
114646 cedric@yte 404 $dirchtime = '';
114642 cedric@yte 405 while (count($dp) and $part = array_shift($dp)) {
114646 cedric@yte 406 $dirchtime .= "$part/";
114642 cedric@yte 407 @touch($dirchtime, $timestamp);
408 }
39973 esj@rezo.n 409 // zipper en prenant la date du fichier le plus recent
410 // comme date du paquet
114851 cedric@yte 411 exec_trace("zip -roXq $zipfile $base_dir -x \*/.svn\*");
39973 esj@rezo.n 412 chdir($d);
30674 cedric@yte 413  
39973 esj@rezo.n 414 $date_paquet = filemtime($dir_tmp.$zipfile);
415 // cas ou le dernier commit consiste en la suppression de fichiers
416 // du coup le zip est plus ancien que le dernier commit
417 // on corrige manuellement
418 if ($date_paquet<strtotime($date_commit)) {
419 touch($dir_tmp.$zipfile,strtotime($date_commit)+1);
420 }
43982 esj@rezo.n 421 rename($tmp,$source);
30909 cedric@yte 422 }
39967 esj@rezo.n 423 supprimer_chemin($dir_tmp,$nom_dossier);
424 copie_update($dir_tmp.$zipfile,$zippath);
43982 esj@rezo.n 425 return true;
30677 cedric@yte 426 }
30461 cedric@yte 427 }
428  
44979 eric@smell 429  
45574 eric@smell 430 // Fonction de compilation de la liste des traductions d'un plugin sous forme d'une suite
431 // de balises <traduction>
432 // On considere que les fichiers de langue ou les rapports de salvatore sont toujours dans
433 // le sous-repertoire lang/
434 //
435 // $source : emplacement des sources du plugin
436 //
437 // return : chaine composee des balises <traduction>
438 function compiler_traductions($source){
439  
440 // On charge une fois la liste des codes de langues
441 if (empty($GLOBALS['codes_langues']));
442 include('inc_langues.php');
443  
444 $traductions = '';
445  
446 // Determination des modules sous salvatore : on cherche les rapports xml
447 $modules_salvatore = array();
448 if ($rapports = glob($source . '/lang/*.xml')) {
449 foreach ($rapports as $_rapport) {
450 $modules_salvatore[] = basename($_rapport, '.xml');
451 $contenu = file_get_contents($_rapport);
51240 eric@smell 452 $traductions .= $contenu;
45574 eric@smell 453 }
454 }
455  
456 // Determination des modules non traduits par salvatore
457 // Cette recherche n'est pas totalement deterministe car on est oblige de considerer
458 // qu'il existe toujours un fichier module_fr.php pour identifier le nom du module
459 if ($fichiers_fr = glob($source . '/lang/*_fr.php')) {
460 foreach ($fichiers_fr as $_fichier_fr) {
461 $nom_fichier = basename($_fichier_fr, '.php');
51219 eric@smell 462 // On exclut les fichiers de traduction du paquet.xml
463 if (strpos($nom_fichier, 'paquet-') === false ) {
464 $module = substr($nom_fichier, 0, strlen($nom_fichier)-3);
465 // Si ce module n'a pas ete traite dans un rapport Salvatore on cherche toutes
466 // ses traductions via les fichiers de langue.
64206 kent1@arsc 467 if (isset($module) && !in_array($module, $modules_salvatore)
468 AND ($fichiers_langue = glob($source . "/lang/".$module."_*.php"))) {
51219 eric@smell 469 $liste_langues = '';
470 foreach ($fichiers_langue as $_fichier_langue) {
471 $nom_fichier = basename($_fichier_langue, '.php');
472 $langue = substr($nom_fichier, strlen($module) + 1 - strlen($nom_fichier));
473 // Si la langue est reconnue, on l'ajoute a la liste des traductions
474 // Comme on ne connait pas les traducteurs, la balise est donc vide
475 if (isset($GLOBALS['codes_langues'][$langue]) AND $langue != 'fr')
51240 eric@smell 476 $liste_langues .= "\t" . '<langue code="' . $langue . '" />' . "\n";
51219 eric@smell 477 }
478 // Le gestionnaire n'est pas precise et la langue de reference est toujours le fr
51240 eric@smell 479 $traductions .= '<traduction module="' . $module . '" reference="fr">' . "\n" .
51219 eric@smell 480 $liste_langues .
51240 eric@smell 481 '</traduction>' . "\n";
45574 eric@smell 482 }
483 }
484 }
485 }
486  
45584 eric@smell 487 // On inclus les balise <traduction> dans une balise <traductions> sans attribut qui
488 // facilite le travail du parser
489 if ($traductions)
51219 eric@smell 490 $traductions = '<traductions>' . "\n" . $traductions . '</traductions>' . "\n";
45574 eric@smell 491  
492 return $traductions;
493 }
494  
495  
84278 eric@smell 496 // Fonction de compilation de la liste des autorisations d'un plugin sous forme d'une suite
497 // de balises <autorisation> incluses dans une balise englobantes <autorisations>
498 //
499 // $regexp : regpex de récupération du pipeline autoriser dans le xml
500 // $xml : contenu de fichier xml du plugin
501 // $source : emplacement des sources du plugin
502 //
503 // return : chaine composee des balises <autorisation>
504 function lister_autorisations($regexp, $xml, $source) {
505 $autorisations = '';
506  
507 // Recherche du pipeline autoriser dans le xml du plugin
508 if (preg_match($regexp, $xml, $matches)) {
509 $fichier_autorisations = $source . '/' . $matches[1];
510 if (file_exists($fichier_autorisations)) {
511 $contenu = file_get_contents($fichier_autorisations);
512 if (preg_match_all("%function\s+autoriser_([^\(]*)%ims", $contenu, $matches)) {
513 $fonctions = array_map('trim', $matches[1]);
514 foreach($fonctions as $_fonction) {
515 if (substr($_fonction, -5)=='_dist') {
516 $dist = 'oui';
517 $nom = substr($_fonction, 0, strlen($_fonction)-5);
518 } else {
519 $dist = 'non';
520 $nom = $_fonction;
521 }
522 $autorisations .= "\t" . '<autorisation nom="' . $nom . '" dist="' . $dist . '" />' . "\n";
523 }
524 }
525 }
526 }
527  
528 return ($autorisations ? "<autorisations>\n$autorisations</autorisations>" : '');
529 }
530  
531  
44979 eric@smell 532 // --------------------------- CREATION DES FICHIERS RESULTAT --------------------------------------
533  
51219 eric@smell 534 // Construit la concatenation des informations essentielles
535 // contenu dans les fichiers plugin.xml et des informations relatives a chaque paquet
536 // Construit egalement les informations de traduction par salvatore a destination du fichier traductions.txt
537 function empaqueteur_resultats($depot, $zips) {
538 $xml = '';
539 $salvatore = '';
540 foreach($zips as $zip => $infos) {
84278 eric@smell 541 list($size, $time, $source, $commit, $traductions, $descr_xml, $multis, $dtd, $autorisations) = $infos;
51219 eric@smell 542 $f = 'empaqueteur_' . $dtd . '_xml';
543 // Bloc d'info du paquet
51374 eric@smell 544 $xml .= "<archive id=\"$zip\"" . ($dtd ? " dtd=\"$dtd\"" : "") . ">
51219 eric@smell 545 <zip>
546 <file>$zip</file>
547 <size>$size</size>
548 <date>$time</date>
549 <source>$source</source>
550 <last_commit>$commit</last_commit>
551 </zip>
51240 eric@smell 552 $traductions
553 $descr_xml
554 $multis
84278 eric@smell 555 $autorisations
51240 eric@smell 556 \n</archive>\n\n";
51219 eric@smell 557 // Bloc d'info pour Salvatore si il existe
558 if (preg_match_all("#<salvatore\s+module=['\"](\w*)['\"]\s+reference=['\"](\w*)['\"]\s*/>#i", $descr_xml, $matches)) {
559 foreach ($matches[1] as $_i => $_module) {
560 $salvatore .= rtrim($depot['url_serveur'], '/') . '/' . rtrim($source, '/') . '/lang/;' .
561 $_module . ';' .
562 $matches[2][$_i] . "\n";
563 }
564 }
565 }
566  
567 // On complete les archives avec les informations du depot
568 // Pour l'instant ce bloc n'implemente pas la nouvelle DTD
569 if (!$xml) return '';
570 $xml_depot = '';
571 foreach ($depot as $_balise => $_valeur) {
572 $xml_depot .= "<$_balise>$_valeur</$_balise>\n";
573 }
574 if ($xml_depot)
575 $xml_depot = "<depot>\n$xml_depot</depot>\n";
51240 eric@smell 576 $xml = "$xml_depot
577 <archives>
51219 eric@smell 578 $xml
579 </archives>";
580  
581 if($salvatore){
582 // On ajoute une en-tete au fichier genere
583 $salvatore =
584 "# LISTE DES PLUGINS / SQUELETTES UTILISANT SALVATORE
585 # --------------------------------------------------
586 # Depot : " . $depot['titre'] . "
587 # Generation par Smart-Paquets le " . date('d-m-Y H:i') . "
588 #\n" . $salvatore;
589 }
590 return array($xml, $salvatore);
591 }
592  
44979 eric@smell 593 // Fonction creant le fichier xml recapitulant toutes les archives creees
55364 eric@smell 594 // et le fichier representant son sha
595 //
44979 eric@smell 596 // Ne pas le reecrire si rien de neuf, c'est + efficace et ca permet
597 // au detecteur de nouvelle version d'utiliser If-Modified-Since.
598 //
599 // Attention, file_put_contents fait ce qu'il veut de certaines lignes vides
600 // http://fr2.php.net/manual/fr/function.file-put-contents.php
601 //
45350 eric@smell 602 // $nom_fichier : nom du fichier xml recapitulant toutes les archives
44979 eric@smell 603 // $archives : contenu du nouveau fichier xml resultant des archives creees
604 // $dir_paq : repertoire de depot des paquets crees
605 // $dir_repo : repertoire racine des sources extraits du repository
606 //
607 // return : aucun
608 function empaqueteur_xml_archives($nom_fichier, $archives, $dir_paq, $dir_repo)
609 {
610 $taille = strlen($archives);
111039 cedric@yte 611 $fichier = $dir_paq . $dir_repo . $nom_fichier;
612 $fichier_tmp = $fichier . '.last';
613 // ecriture du fichier xml dans un fichier archives.xml.last
614 file_put_contents($fichier_tmp, $archives);
615  
616 // on compare le md5 de archives.xml.last et archives.xml
617 // et on update archives.xml uniquement si il a change
618 if (!file_exists($fichier) or md5_file($fichier)!==md5_file($fichier_tmp)) {
619 @rename($fichier_tmp, $fichier);
620 echo_trace("Nouveau $fichier de taille $taille");
30461 cedric@yte 621 }
111039 cedric@yte 622 else {
623 echo_trace("$fichier non modifie (taille: $taille)");
624 }
625  
30461 cedric@yte 626 }
627  
628  
44979 eric@smell 629 // Fonction creant le fichier des traductions de Salvatore
630 //
631 // Ne pas le reecrire si rien de neuf, c'est + efficace et ca permet
632 // au detecteur de nouvelle version d'utiliser If-Modified-Since.
633 //
634 // Attention, file_put_contents fait ce qu'il veut de certaines lignes vides
635 // http://fr2.php.net/manual/fr/function.file-put-contents.php
636 //
45350 eric@smell 637 // $nom_fichier : nom du fichier des traductions
44979 eric@smell 638 // $salvatore : contenu du nouveau fichier des traductions Salvatore
639 // $dir_paq : repertoire de depot des paquets crees
640 // $dir_repo : repertoire racine des sources extraits du repository
641 //
642 // return : aucun
643 function empaqueteur_salvatore($nom_fichier, $salvatore, $dir_paq, $dir_repo)
644 {
645 $taille = strlen($salvatore);
646 $fichier = $dir_paq . $dir_repo . $nom_fichier;
647 $old = (file_exists($fichier)) ? trim(file_get_contents($fichier)) : '';
648 if ($old != $salvatore) {
649 echo_trace("Nouveau $fichier de taille $taille");
650 file_put_contents($fichier, $salvatore);
651 return;
30461 cedric@yte 652 }
44979 eric@smell 653 echo_trace("$fichier intact (taille: $taille)");
654 }
30461 cedric@yte 655  
656  
44979 eric@smell 657 // Fonction creant le fichier index des logos permettant d'afficher une page
658 // de controle des logos
659 //
660 // Le fichier est recree systematiquement
661 //
45350 eric@smell 662 // $nom_fichier : nom du fichier index des logos
44979 eric@smell 663 // $dir_paq : repertoire de depot des paquets crees
664 // $dir_repo : repertoire racine des sources extraits du repository
665 //
666 // return : aucun
667 function empaqueteur_index_logos($nom_fichier, $dir_paq, $dir_repo)
668 {
47298 kent1@arsc 669 $contenu = '';
44979 eric@smell 670 $logos = array_merge(glob($dir_paq . $dir_repo . '*.png'),
671 glob($dir_paq . $dir_repo . '*.gif'),
672 glob($dir_paq . $dir_repo . '*.jpg'));
673 foreach($logos as $_logo)
674 $contenu .= '<img src="' . basename($_logo) . '" />' . "\n";
675  
676 $fichier = $dir_paq . $dir_repo . $nom_fichier;
47298 kent1@arsc 677 if(strlen($contenu)){
678 file_put_contents($fichier, $contenu);
679 echo_trace("Nouvel index cree : " . count($logos) . " logos");
680 }else{
681 echo_trace("Aucun logo trouvés, pas d'index créé");
682 }
30461 cedric@yte 683 }
684  
30466 cedric@yte 685 ?>