Changeset 119837 in spip-zone


Ignore:
Timestamp:
Jan 20, 2020, 4:38:49 AM (8 months ago)
Author:
Cerdic
Message:

fin refactoring ecriveur pour support git/svn/multimodules, a debug

Location:
_plugins_/trad-lang/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/trad-lang/trunk

    • Property subgit:lock:4a818f39ef61a3acce3f8b14c12019cdaa463bcc deleted
    • Property subgit:lock:1559b0188361028cb38e3178a89b604a90d1b5ac set to 2020-01-20T09:05:31.983
  • _plugins_/trad-lang/trunk/inc/salvatore_ecriveur.php

    r119836 r119837  
    3838/**
    3939 * @param array $liste_sources
     40 * @param string $message_commit
    4041 * @param string $dir_modules
     42 * @param string $dir_depots
    4143 * @throws Exception
    4244 */
    43 function salvatore_ecrire($liste_sources, $dir_modules = null, $message_commit=''){
     45function salvatore_ecrire($liste_sources, $message_commit='', $dir_modules = null, $dir_depots=null){
    4446        include_spip('inc/salvatore');
    4547        salvatore_init();
     
    5254        }
    5355        salvatore_check_dir($dir_modules);
     56
     57        if (is_null($dir_depots)) {
     58                $dir_depots = _DIR_SALVATORE_DEPOTS;
     59        }
     60        salvatore_check_dir($dir_depots);
     61
    5462        $url_gestionnaire = salvatore_get_self_url();
    5563
     
    7179                        // url de l'interface de traduction d'un module
    7280                        $url_trad_module = url_absolue(generer_url_entite($id_tradlang_module, 'tradlang_module'), $url_gestionnaire);
    73                         salvatore_exporter_module($id_tradlang_module, $source, $url_gestionnaire, $url_trad_module, $message_commit);
     81                        salvatore_exporter_module($id_tradlang_module, $source, $url_gestionnaire, $url_trad_module, $dir_modules, $dir_depots, $message_commit);
    7482                }
    7583        }
     
    8492 * @param string $url_trad_module
    8593 * @param string $dir_modules
     94 * @param string $dir_depots
    8695 * @param string $message_commit
    87  */
    88 function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url_trad_module, $dir_modules, $message_commit = ''){
     96 * @return false|int
     97 */
     98function salvatore_exporter_module($id_tradlang_module, $source, $url_site, $url_trad_module, $dir_modules, $dir_depots, $message_commit = ''){
    8999
    90100        $url_repo = $source['url'];
     
    107117        }
    108118
    109         // charger la langue originale, pour la copier si necessaire
    110         // TODO : simplifier ? aucune reference a $trad_reference
    111         $trad_reference = [];
    112         $count_trad_reference = 0;
    113         $rows = sql_allfetsel('id, id_tradlang_module,str,comm,statut', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . ' AND lang=' . sql_quote($row_module['lang_mere']) . " AND statut='OK'", 'id');
    114         foreach ($rows as $row){
    115                 $row['statut'] = 'NEW';
    116                 $trad_reference[$row['id']] = $row;
    117                 $count_trad_reference++;
    118         }
    119 
     119
     120        $xml_infos = $commit_infos = array();
    120121        $liste_lang = $liste_lang_non_exportees = $liste_lang_a_supprimer = array();
     122
     123        $count_trad_reference = sql_countsel('spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . ' AND lang=' . sql_quote($row_module['lang_mere']) . " AND statut='OK'", 'id');
    121124        $minimal = ceil((($count_trad_reference*$seuil_export)/100));
    122125        salvatore_log("Minimal = $minimal ($seuil_export %)");
     
    129132                if ($langue['count']>=$minimal){
    130133                        $liste_lang[] = $langue['lang'];
     134                        $commit_infos[$langue['lang']] = array();
    131135                }
    132136                else {
     
    142146                                 */
    143147                                $liste_lang[] = $langue['lang'];
     148                                $commit_infos[$langue['lang']] = array();
    144149                                $liste_lang_a_supprimer[] = $langue['lang'];
    145150                                $percent = (($langue['count']/$count_trad_reference)*100);
    146151                                if ($percent<($seuil_export-15)){
    147                                         $message_commit .= "La langue '" . $langue['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n";
     152                                        $commit_infos[$langue['lang']]['message'] = "La langue '" . $langue['lang'] . "' devrait être supprimée car trop peu traduite (" . number_format($percent, 2) . " %)\n";
    148153                                }
    149154                        }
     
    152157
    153158        // traiter chaque langue
    154         $infos = $commiteurs = array();
    155159        foreach ($liste_lang as $lang){
    156160                salvatore_log("Generation de la langue $lang");
    157                 // Proteger les caracteres typographiques a l'interieur des tags html
    158                 $typo = (in_array($lang, array('eo', 'fr', 'cpf')) || strncmp($lang, 'fr_', 3)==0) ? 'fr' : 'en';
    159                 $typographie = charger_fonction($typo, 'typographie');
    160                 $tab = "\t";
     161                $indent = "\t";
    161162
    162163                $php_lines = $chaines = $id_tradlangs = array();
     
    177178                        if ($initiale !== strtoupper($chaine['id'][0])){
    178179                                $initiale = strtoupper($chaine['id'][0]);
    179                                 $php_lines[] = "\n$tab// $initiale";
     180                                $php_lines[] = "\n$indent// $initiale";
    180181                        }
    181182
     
    198199                        }
    199200
    200                         $php_lines[] = $tab . var_export($chaine['id'], 1) . ' => ' . var_export($str, 1) . ',' . $comment;
     201                        $php_lines[] = $indent . var_export($chaine['id'], 1) . ' => ' . var_export($str, 1) . ',' . $comment;
    201202                }
    202203
    203204                salvatore_log(" - traduction (".$total_chaines['OK']."/$count_trad_reference OK | ".$total_chaines['RELIRE']."/$count_trad_reference RELIRE | ".$total_chaines['MODIF']."/$count_trad_reference MODIFS), export");
    204                 salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines, $url_trad_module, ($lang==$lang_ref) ? $url_repo : false);
     205                $file_name = salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines, $url_trad_module, ($lang==$lang_ref) ? $url_repo : false);
    205206
    206207                // noter la langue et les traducteurs pour lang/module.xml
    207                 $infos[$lang] = $people_unique = array();
    208                 $infos[$lang]['traducteurs'] = array();
    209                 $infos[$lang]['traduits'] = $total_chaines['OK'];
    210                 $infos[$lang]['modifs'] = $total_chaines['MODIF'];
    211                 $infos[$lang]['relire'] = $total_chaines['RELIRE'];
     208                $people_unique = array();
     209                $xml_infos[$lang] = array(
     210                        'traducteurs' => array(),
     211                        'traduits' => $total_chaines['OK'],
     212                        'modifs' => $total_chaines['MODIF'],
     213                        'relire' => $total_chaines['RELIRE'],
     214                );
    212215                if (defined('_ID_AUTEUR_SALVATORE') and intval(_ID_AUTEUR_SALVATORE)>0){
    213216                        $people_unique[] = _ID_AUTEUR_SALVATORE;
    214217                }
    215                 $s = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module = ' . intval($row_module['id_tradlang_module']) . ' AND lang = ' . sql_quote($lang));
    216                 foreach ($s as $t){
     218
     219                // ici on prend tous les statut de chaine (?)
     220                $traducteurs = sql_allfetsel('DISTINCT(traducteur)', 'spip_tradlangs', 'id_tradlang_module=' . intval($id_tradlang_module) . ' AND lang=' . sql_quote($lang));
     221                foreach ($traducteurs as $t){
    217222                        $traducteurs_lang = explode(',', $t['traducteur']);
    218223                        foreach ($traducteurs_lang as $traducteur){
    219224                                if (!in_array($traducteur, $people_unique)){
     225                                        $traducteur_supp = array();
    220226                                        if (is_numeric($traducteur) and $id_auteur = intval($traducteur)){
    221227                                                $traducteur_supp['nom'] = extraire_multi(sql_getfetsel('nom', 'spip_auteurs', 'id_auteur = ' . $id_auteur));
     
    226232                                        }
    227233                                        if (isset($traducteur_supp['nom'])){
    228                                                 $infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp;
     234                                                $xml_infos[$lang]['traducteurs'][strtolower($traducteur_supp['nom'])] = $traducteur_supp;
    229235                                        }
    230                                         unset($traducteur_supp);
    231236                                        $people_unique[] = $traducteur;
    232237                                }
     
    235240                unset($people_unique);
    236241
    237                 if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . '_' . $lang . '.php'), 0, 1)=='?'){
    238                         if ($row_module['limite_trad']==0){
    239                                 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : '';
    240                         } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) {
    241                                 if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)){
    242                                         passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
    243                                 }
    244                         }
    245                 }
    246                 /**
    247                  * Le fichier a été modifié ou ajouté (svn status A ou M)
    248                  *
    249                  * On récupère la date de dernier changement avec svn info
    250                  * On cherche toutes les dernières modifications dans la base de donnée
    251                  * Si un seul auteur de révisions (Hors salvatore et -1) on l'ajoute comme commiteur
    252                  * Si plusieurs auteurs le commiteur sera Salvatore
    253                  */
    254                 if (in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1), array('A', 'M'))){
    255                         $last_change = exec('env LC_MESSAGES=en_US.UTF-8 svn info ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php | awk '/^Last Changed Date/ { print $4 \" \" $5 }'");
    256                         $auteur_versions = sql_allfetsel('id_auteur', 'spip_versions', 'objet="tradlang" AND date > ' . sql_quote($last_change) . ' AND ' . sql_in('id_objet', $id_tradlangs) . ' AND id_auteur != "-1" AND id_auteur !=' . intval(_ID_AUTEUR_SALVATORE), 'id_auteur');
     242                $commit_infos[$lang]['file_name'] = basename($file_name);
     243                $commit_infos[$lang]['lastmodified'] = salvatore_read_lastmodified_file(basename($file_name), $source, $dir_depots);
     244                $commit_infos[$lang]['must_add'] = false;
     245
     246                if ($row_module['limite_trad']==0){
     247                        $commit_infos[$lang]['must_add'] = true;
     248                } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) {
     249                        if ((intval(($xml_infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)){
     250                                $commit_infos[$lang]['must_add'] = true;
     251                        }
     252                }
     253
     254                // trouver le commiteur si c'est un fichier deja versionne ou a ajouter
     255                if ($commit_infos[$lang]['lastmodified'] or $commit_infos[$lang]['must_add']) {
     256                        $where = [
     257                                "objet='tradlang'",
     258                                sql_in('id_objet', $id_tradlangs),
     259                                "id_auteur != '-1'",
     260                                'id_auteur !=' . intval(_ID_AUTEUR_SALVATORE),
     261                        ];
     262                        if ($commit_infos[$lang]['lastmodified']) {
     263                                $where[] = "date>".sql_quote(date('Y-m-d H:i:s', $commit_infos[$lang]['lastmodified']));
     264                        }
     265                        $auteur_versions = sql_allfetsel('DISTINCT id_auteur', 'spip_versions',  $where);
    257266                        if (count($auteur_versions)==1){
    258267                                $email = sql_getfetsel('email', 'spip_auteurs', 'id_auteur = ' . intval($auteur_versions[0]['id_auteur']));
    259268                                if ($email){
    260                                         $commiteurs[$lang] = $email;
     269                                        $commit_infos[$lang]['author'] = $email;
     270                                        salvatore_log("Le commiteur pour la langue $lang : $email");
    261271                                }
    262                                 salvatore_log("\nLe commiteur sera pour la langue $lang : " . $commiteurs[$lang] . " \n");
    263                         }
    264                 }
    265         }
    266 
    267         // ecrire lang/module.xml
    268         $xml = "<traduction module=\"$module\" gestionnaire=\"salvatore\" url=\"$url_site\" source=\"$url_repo\" reference=\"$lang_ref\">\n";
    269         foreach ($infos as $lang => $info){
     272                        }
     273                }
     274        }
     275
     276        // le fichier XML recapitulatif
     277        $indent = "\t";
     278        $xml = "<traduction
     279{$indent}module=\"$module\"
     280{$indent}dir_module=\"".$row_module['dir_module']."\"
     281{$indent}gestionnaire=\"salvatore\"
     282{$indent}url=\"$url_site\"
     283{$indent}source=\"$url_repo\"
     284{$indent}reference=\"$lang_ref\">\n";
     285        foreach ($xml_infos as $lang => $info){
    270286                if (count($info['traducteurs']>0)){
    271                         $xml .= "       <langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" total=\"$count_trad_reference\" traduits=\"" . $info['traduits'] . '" relire="' . $info['relire'] . '" modifs="' . $info['modifs'] . '" nouveaux="' . ($count_trad_reference-($info['modifs']+$info['traduits']+$info['relire'])) . '" pourcent="' . number_format((($info['traduits']/$count_trad_reference)*100), 2) . "\">\n";
     287                        $xml .= "$indent<langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" total=\"$count_trad_reference\" traduits=\"" . $info['traduits'] . '" relire="' . $info['relire'] . '" modifs="' . $info['modifs'] . '" nouveaux="' . ($count_trad_reference-($info['modifs']+$info['traduits']+$info['relire'])) . '" pourcent="' . number_format((($info['traduits']/$count_trad_reference)*100), 2) . "\">\n";
    272288                        ksort($info['traducteurs']);
    273289                        foreach ($info['traducteurs'] as $nom => $people){
    274                                 $xml .= '               <traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n";
    275                         }
    276                         $xml .= "       </langue>\n";
     290                                $xml .= $indent . $indent . '<traducteur nom="' . entites_html($people['nom']) . '" lien="' . entites_html($people['lien']) . "\" />\n";
     291                        }
     292                        $xml .= "$indent</langue>\n";
    277293                } else {
    278                         $xml .= "       <langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" />\n";
    279                 }
    280         }
    281         unset($traducteurs[$lang_ref]);
     294                        $xml .= "$indent<langue code=\"$lang\" url=\"" . parametre_url($url_trad_module, 'lang_cible', $lang) . "\" />\n";
     295                }
     296        }
    282297        $xml .= "</traduction>\n";
    283 
    284         ecrire_fichier($dir_module . '/' . $module . '.xml', $xml);
     298        file_put_contents($dir_module . '/' . $module . '.xml', $xml);
     299
    285300
    286301        if (isset($liste_lang_non_exportees) and (count($liste_lang_non_exportees)>0)){
    287                 $liste_lang_non_exportees_string = implode(', ', $liste_lang_non_exportees);
    288                 salvatore_log("\nLes langues suivantes ne sont pas exportées car trop peu traduites:\n");
    289                 salvatore_log("$liste_lang_non_exportees_string\n");
     302                salvatore_log("Les langues suivantes ne sont pas exportées car trop peu traduites:");
     303                salvatore_log(implode(', ', $liste_lang_non_exportees));
    290304        }
    291305        if (isset($liste_lang_a_supprimer) and (count($liste_lang_a_supprimer)>0)){
    292                 $liste_lang_a_supprimer_string = implode(', ', $liste_lang_a_supprimer);
    293                 salvatore_log("\nLes langues suivantes devraient être supprimées car trop peu traduites:\n");
    294                 salvatore_log("$liste_lang_a_supprimer_string\n");
    295         }
    296         if ($row_module['limite_trad']==0){
    297                 foreach ($liste_lang as $lang){
    298                         passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
    299                 }
    300         } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) {
    301                 salvatore_log('Limite trad = ' . $seuil_export);
    302                 foreach ($liste_lang as $lang){
    303                         if ((intval(($infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)
    304                                 and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1)=='?')){
    305                                 passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
    306                         }
    307                 }
    308         }
    309         salvatore_log("\n" . passthru('svn status ' . _DIR_SALVATORE_TMP . $module . '/') . "\n");
    310         if (strlen($message_commit)>1 || count($commiteurs)>0){
    311                 $fd = fopen($dir_module . '/message_commit.inc', 'w');
    312                 # ecrire le fichier
    313                 fwrite(
    314                         $fd,
    315                         '<' . '?php
    316 $message_commit = "' . $message_commit . '";
    317 
    318 $commiteurs = ' . var_export($commiteurs, 1) . ';
    319 
    320 ?' . '>
    321 '
    322                 );
    323                 fclose($fd);
    324         }
     306                salvatore_log("Les langues suivantes devraient être supprimées car trop peu traduites:");
     307                salvatore_log(implode(', ', $liste_lang_a_supprimer));
     308        }
     309
     310        $nb_to_commit = 0;
     311        // et on ecrit un json pour que le pousseur sache quoi commit
     312        if (count($commit_infos)) {
     313                $nb_to_commit = count($commit_infos);
     314                if ($message_commit) {
     315                        $commit_infos['message'] = $message_commit;
     316                }
     317                file_put_contents($dir_module . '/' . $module . '.commit.json', json_encode($commit_infos));
     318        }
     319
     320        $log = salvatore_read_status_modif($module, $source, $dir_depots);
     321        salvatore_log($log);
     322        return $nb_to_commit;
    325323}
    326324
     
    341339}
    342340
     341
    343342/**
    344343 * Generer un fichier de langue a partir de ses lignes php
     
    349348 * @param string $url_trad_module
    350349 * @param $origin
     350 * @return string
    351351 */
    352352function salvatore_exporter_fichier_php($dir_module, $module, $lang, $php_lines, $url_trad_module, $origin) {
     
    376376        $file_content .= implode("\n", $php_lines);
    377377        file_put_contents($file_name, $file_content);
    378 }
     378        return $file_name;
     379}
     380
     381
     382/**
     383 * Lire la date de derniere modif d'un fichier de langue
     384 * @param string $file_name
     385 * @param array $source
     386 * @param string $dir_depots
     387 * @return false|int
     388 */
     389function salvatore_read_lastmodified_file($file_name, $source, $dir_depots) {
     390
     391        $file_path_relative = $file_name;
     392        if ($source['dir']) {
     393                $file_path_relative = $source['dir'] . DIRECTORY_SEPARATOR . $file_path_relative;
     394        }
     395        $file_path = $dir_depots . $source['dir_checkout'] . DIRECTORY_SEPARATOR . $file_path_relative;
     396
     397        $lastmodified = 0;
     398        switch ($source['methode']) {
     399                case 'git':
     400                        $d = getcwd();
     401                        chdir($dir_depots . $source['dir_checkout']);
     402                        $lastmodified = exec("git log -1 -c --pretty=tformat:'%ct' $file_path_relative | head -1");
     403                        $lastmodified = intval(trim($lastmodified));
     404                        chdir($d);
     405                        break;
     406                case 'svn':
     407                        $lastmodified = exec('env LC_MESSAGES=en_US.UTF-8 svn info ' . $file_path . "| awk '/^Last Changed Date/ { print $4 \" \" $5 }'");
     408                        $lastmodified = strtotime($lastmodified);
     409                        break;
     410        }
     411
     412        return $lastmodified;
     413}
     414
     415
     416/**
     417 * Afficher le status des fichiers modifies pour un module
     418 * @param string $module
     419 * @param array $source
     420 * @param $dir_depots
     421 * @return string
     422 */
     423function salvatore_read_status_modif($module, $source, $dir_depots) {
     424        $pre = "";
     425        if ($source['dir']) {
     426                $pre = $source['dir'] . DIRECTORY_SEPARATOR;
     427        }
     428        $files_list = [$pre . $module . '_*', $pre . $module . '.xml'];
     429        $files_list = implode(' ', $files_list);
     430
     431        $d = getcwd();
     432        chdir($dir_depots . $source['dir_checkout']);
     433        $output = array();
     434        switch ($source['methode']) {
     435                case 'git':
     436                        exec("git status $files_list 2>&1", $output);
     437                        break;
     438                case 'svn':
     439                        exec("svn status $files_list 2>&1", $output);
     440                        break;
     441        }
     442        chdir($d);
     443        return implode("\n", $output);
     444}
     445
     446/*
     447if ($row_module['limite_trad']==0){
     448        foreach ($liste_lang as $lang){
     449                passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
     450        }
     451} elseif (!in_array($module, array('ecrire', 'spip', 'public'))) {
     452        salvatore_log('Limite trad = ' . $seuil_export);
     453        foreach ($liste_lang as $lang){
     454                if ((intval(($xml_infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)
     455                        and (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php"), 0, 1)=='?')){
     456                        passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
     457                }
     458        }
     459}
     460*/
     461
     462/*
     463
     464                if (substr(exec('svn status ' . _DIR_SALVATORE_TMP . $module . '/' . $module . '_' . $lang . '.php'), 0, 1)=='?'){
     465                        if ($row_module['limite_trad']==0){
     466                                passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php 2> /dev/null") ? salvatore_log("$log\n") : '';
     467                        } elseif (!in_array($module, array('ecrire', 'spip', 'public'))) {
     468                                if ((intval(($xml_infos[$lang]['traduits']/$count_trad_reference)*100)>$seuil_export)){
     469                                        passthru('svn add ' . _DIR_SALVATORE_TMP . $module . '/' . $module . "_$lang.php* 2> /dev/null") ? salvatore_log("$log\n") : '';
     470                                }
     471                        }
     472                }
     473
     474
     475 */
  • _plugins_/trad-lang/trunk/spip-cli/SalvatoreEcrire.php

    r119824 r119837  
    8585                $message = $input->getOption('message');
    8686
    87                 salvatore_ecrire($liste_trad, null, $message ? $message : '');
     87                salvatore_ecrire($liste_trad, $message ? $message : '');
    8888        }
    8989}
Note: See TracChangeset for help on using the changeset viewer.