source: spip-zone/_plugins_/trad-lang/trunk/inc/salvatore_pousseur.php @ 119843

Last change on this file since 119843 was 119843, checked in by Cerdic, 2 years ago

Debut refactoring pousseur

  • Property svn:eol-style set to native
File size: 9.3 KB
Line 
1<?php
2
3/*
4    This file is part of Salvatore, the translation robot of Trad-lang (SPIP)
5
6    Salvatore is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    Trad-Lang is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with Trad-Lang; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20    Copyright 2003-2020
21        Florent Jugla <florent.jugla@eledo.com>,
22        Philippe Riviere <fil@rezo.net>,
23        Chryjs <chryjs!@!free!.!fr>,
24        kent1 <kent1@arscenic.info>
25        Cerdic <cedric@yterium.com>
26*/
27
28
29// il commit et push les fichiers modifies
30
31
32/**
33 * @param array $liste_sources
34 * @param string|null $tmp
35 * @return bool
36 * @throws Exception
37 */
38function salvatore_pousser($liste_sources, $dir_modules=null, $dir_depots=null) {
39        include_spip('inc/salvatore');
40        salvatore_init();
41
42        if (is_null($dir_modules)) {
43                $dir_modules = _DIR_SALVATORE_MODULES;
44        }
45        salvatore_check_dir($dir_modules);
46
47        if (is_null($dir_depots)) {
48                $dir_depots = _DIR_SALVATORE_DEPOTS;
49        }
50        salvatore_check_dir($dir_depots);
51
52        $done = array();
53
54        foreach ($liste_sources as $source){
55                salvatore_log("\n<info>--- Module " . $source['module'] . " | " . $source['dir_module'] . " | " . $source['url']."</info>");
56
57                $dir_module = $dir_modules . $source['dir_module'];
58                $module = $source['module'];
59
60                // on peut poser un .salvatore.ignore.{module} manuellement pour forcer salvatore a ne jamais pousser certains modules
61                // (gestion de tensions sur certains plugins/modules)
62
63                $file_commit = $dir_module . '/' . $module . '.commit.json';
64
65                if (file_exists($dir_module . '/.salvatore.ignore.' . $module)) {
66                        salvatore_log("<info>Module $module ignoré</info>");
67                }
68                else {
69                        if (!file_exists($file_commit)
70                          or !$commit_infos = file_get_contents($file_commit)
71                          or !$commit_infos = json_decode($commit_infos, true)) {
72                                salvatore_log("<info>Module $module rien à faire (pas de fichier $file_commit ou fichier invalide)</info>");
73                        }
74                        else {
75                                // on a la liste des fichiers a commit
76                                $message_commit = '';
77                                if (isset($commit_infos['.message'])) {
78                                        $message_commit = $commit_infos['.message'];
79                                        unset($commit_infos['.message']);
80                                }
81
82
83
84
85                        }
86                }
87
88                /*
89                $url_with_credentials = salvatore_set_credentials($source['methode'], $source['url'], $source['module']);
90
91                $dir_checkout = $dir_depots . $source['dir_checkout'];
92                $dir_module = $dir_modules . $source['dir_module'];
93                $dir_target = $dir_checkout;
94                if ($source['dir']) {
95                        $dir_target .= "/" . $source['dir'];
96                }
97
98                $return = 0;
99                if (empty($done[$dir_checkout])) {
100                        $cmd = "checkout.php"
101                          . ' ' . $source['methode']
102                                . ($source['branche'] ? ' -b'.$source['branche'] : '')
103                                . ' ' . $url_with_credentials
104                                . ' ' . $dir_checkout;
105
106                        echo "$cmd\n";
107                        passthru("export FORCE_RM_AND_CHECKOUT_AGAIN_BAD_DEST=1 && $cmd 2>/dev/null", $return);
108                        $done[$dir_checkout] = true;
109                }
110
111                if ($return !== 0 or !is_dir($dir_checkout) or !is_dir($dir_target)) {
112                        $corps = $source['url'] . ' | ' . $source['module'] . "\n" . "Erreur lors du checkout";
113                        salvatore_fail('[Tireur] : Erreur', $corps);
114                }
115
116                if (file_exists($dir_module) and !is_link($dir_module)) {
117                        $corps = $source['url'] . ' | ' . $source['module'] . "\n" . "Il y a deja un repertoire $dir_module";
118                        salvatore_fail('[Tireur] : Erreur', $corps);
119                }
120
121                $dir_target = realpath($dir_target);
122                if (is_link($dir_module) and readlink($dir_module) !== $dir_target) {
123                        @unlink($dir_module);
124                }
125                if (!file_exists($dir_module)) {
126                        symlink($dir_target, $dir_module);
127                }
128
129                $fichier_lang_master = $dir_module . '/' . $source['module'] . '_' . $source['lang'] . '.php';
130                // controle des erreurs : requiert au moins 1 fichier par module !
131                if (!file_exists($fichier_lang_master)){
132                        salvatore_fail('[Tireur] : Erreur', "! Erreur pas de fichier de langue maitre $fichier_lang_master");
133                }
134                */
135        }
136
137        return true;
138}
139
140
141$propset = true;
142if (isset($NO_PROPSET)){
143        $propset = false;
144}
145
146$tmp = _DIR_SALVATORE_TMP;
147
148/* MAIN ***********************************************************************/
149
150salvatore_log("\n=======================================\nPOUSSEUR\nPrend les fichiers langue dans sa copie locale et les commite SVN\n=======================================\n");
151
152$liste_sources = salvatore_charger_fichier_traductions(); // chargement du fichier traductions.txt
153
154foreach ($liste_sources as $source){
155        $credentials = false;
156        $module = $source[1];
157        salvatore_log("===== Module $module ======================================\n");
158
159        $domaine_svn = parse_url($source[0]);
160        $domaine_svn = $domaine_svn['host'];
161        if (isset($domaines_exceptions) and is_array($domaines_exceptions) && in_array($domaine_svn, $domaines_exceptions)){
162                /**
163                 * On est dans une exception (Github?)
164                 */
165                if (is_array($domaines_exceptions_credentials) and isset($domaines_exceptions_credentials[$domaine_svn])){
166                        $user = $domaines_exceptions_credentials[$domaine_svn]['user'];
167                        $pass = $domaines_exceptions_credentials[$domaine_svn]['pass'];
168                        $credentials = true;
169                }
170        }
171        if (isset(${$module . '_user'})){
172                $user = ${$module . '_user'};
173                $pass = ${$module . '_passwd'};
174        } elseif (!$credentials) {
175                $user = $SVNUSER;
176                $pass = $SVNPASSWD;
177        }
178
179        $f = _DIR_SALVATORE_TMP . $module . '/';
180
181        /**
182         * On ajoute les .xml
183         */
184        salvatore_log(exec("svn add --quiet $f*xml 2>/dev/null") . "\n");
185        $ignore = array(
186                //      'spip','ecrire','public'
187                'couteau', 'couteauprive', 'paquet-couteau_suisse'// désactivés suite à scandale, je ne sais pas comment le gérer correctement
188        );
189
190        if (in_array($module, $ignore)){
191                salvatore_log("$module ignore'\n");
192        } else {
193                $depot = exec("env LC_MESSAGES=en_US.UTF-8 svn info $f |awk '/^Repository Root/ { print $3 }'") . '/';
194                $svn_url = exec("env LC_MESSAGES=en_US.UTF-8 svn info $f |awk '/^URL/ { print $2 }'") . '/';
195                $path_svn = str_replace($depot, '', $svn_url);
196                $message = $message_commit = $commiteurs = false;
197                if (file_exists($f . 'message_commit.inc')){
198                        $message = true;
199                        require_once(dirname(__FILE__) . '/' . str_replace('./', '', $f) . 'message_commit.inc');
200                }
201
202                if (is_array($commiteurs) && count($commiteurs)>0){
203                        foreach ($commiteurs as $lang => $email){
204                                if (strlen($email)>1){
205                                        $message_commit_unique = "[Salvatore] [source:$path_svn $module] Export depuis http://trad.spip.net de la langue $lang";
206                                        /**
207                                         * Si plusieurs commiteurs (veut dire que plusieurs fichiers sont à commiter)
208                                         * ou si le fichier original est modifié, on ne commit que fichier par fichier
209                                         */
210                                        if (count($commiteurs)>1 || in_array(substr(exec('svn status ' . _DIR_SALVATORE_TMP . $source[1] . '/' . $source[1] . '_' . $source[2] . '.php'), 0, 1), array('A', 'M'))){
211                                                $path = $f . $module . '_' . $lang . '.php';
212                                        } else {
213                                                /**
214                                                 * Sinon on ne s'embarasse pas, on balance tout avec cet utilisateur
215                                                 */
216                                                $path = $f;
217                                        }
218                                        salvatore_log("On devrait commiter $path avec comme message '$message_commit_unique' avec l'email $email\n");
219                                        salvatore_log(exec("svn commit $path --username $user --password $pass --no-auth-cache --non-interactive --trust-server-cert -m " . escapeshellarg($message_commit_unique)) . "\n");
220                                        $revision = exec("svn up $path && env LC_MESSAGES=en_US.UTF-8 svn info $path |awk '/^Last Changed Rev/ { print $4 }'");
221                                        if ($propset){
222                                                salvatore_log(exec("svn propset --revprop -r $revision svn:author '$email' $path --username $user --password $pass --no-auth-cache --non-interactive --trust-server-cert") . "\n");
223                                                salvatore_log("svn propset --revprop -r $revision svn:author '$email' $path --username $user --password $pass --no-auth-cache --non-interactive --trust-server-cert\n");
224                                        }
225                                }
226                        }
227                }
228
229                /**
230                 * Si on a encore un fichier ajouté ou modifié
231                 * On commite le tout avec salvatore
232                 */
233                if (strlen(trim(exec("svn status $f |awk /^[MA]/")))>1){
234                        $commit_message = "[Salvatore] [source:$path_svn $module] Export depuis http://trad.spip.net\n\n";
235                        $commit_message .= $message_commit . "\n";
236                        salvatore_log("On commit $f car il reste des fichiers\n");
237                        salvatore_log(exec("svn commit $f --username $user --password $pass --no-auth-cache --non-interactive --trust-server-cert -m " . escapeshellarg($commit_message)) . "\n");
238                        $revision_fin = exec("svn up $f && env LC_MESSAGES=en_US.UTF-8 svn info $f |awk '/^Last Changed Rev/ { print $4 }'");
239                        if (!$credentials && $propset){
240                                salvatore_log(exec("svn propset --revprop -r $revision_fin svn:author 'salvatore@rezo.net' $f --username $user --password $pass --no-auth-cache --non-interactive --trust-server-cert") . "\n");
241                                salvatore_log("svn propset --revprop -r $revision_fin svn:author 'salvatore@rezo.net' $f --username $user --password $pass --no-auth-cache --non-interactive --trust-server-cert\n");
242                        }
243                }
244
245                if (file_exists($f . 'message_commit.inc')){
246                        unlink($f . 'message_commit.inc');
247                }
248        }
249}
250
251return 0;
252/* MAIN ***********************************************************************/
Note: See TracBrowser for help on using the repository browser.