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

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

affinage du log de commit et presentation dans les logs salvatore

  • Property svn:eol-style set to native
File size: 9.5 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
31include_spip('inc/salvatore_git');
32include_spip('inc/salvatore_svn');
33
34/**
35 * @param array $liste_sources
36 * @param string|null $tmp
37 * @return bool
38 * @throws Exception
39 */
40function salvatore_pousser($liste_sources, $dir_modules=null, $dir_depots=null) {
41        include_spip('inc/salvatore');
42        salvatore_init();
43
44        if (is_null($dir_modules)) {
45                $dir_modules = _DIR_SALVATORE_MODULES;
46        }
47        salvatore_check_dir($dir_modules);
48
49        if (is_null($dir_depots)) {
50                $dir_depots = _DIR_SALVATORE_DEPOTS;
51        }
52        salvatore_check_dir($dir_depots);
53
54        $url_gestionnaire = salvatore_get_self_url();
55
56        foreach ($liste_sources as $source){
57                salvatore_log("\n<info>--- Module " . $source['module'] . " | " . $source['dir_module'] . " | " . $source['url']."</info>");
58
59                $dir_module = $dir_modules . $source['dir_module'];
60                $module = $source['module'];
61
62                // on peut poser un .salvatore.ignore.{module} manuellement pour forcer salvatore a ne jamais pousser certains modules
63                // (gestion de tensions sur certains plugins/modules)
64
65                $file_commit = $dir_module . '/' . $module . '.commit.json';
66
67                if (file_exists($dir_module . '/.salvatore.ignore.' . $module)) {
68                        salvatore_log("<info>Module $module ignoré</info>");
69                }
70                else {
71                        if (!file_exists($file_commit)
72                          or !$commit_infos = file_get_contents($file_commit)
73                          or !$commit_infos = json_decode($commit_infos, true)) {
74                                salvatore_log("<info>Module $module rien à faire (pas de fichier $file_commit ou fichier invalide)</info>");
75                        }
76                        else {
77                                // on a la liste des fichiers a commit
78                                $message_commit = '';
79                                if (isset($commit_infos['.message'])) {
80                                        $message_commit = trim($commit_infos['.message']) . "\n";
81                                        unset($commit_infos['.message']);
82                                }
83                                $dir_depot = $dir_depots . $source['dir_checkout'];
84                                $subdir = '';
85                                if (isset($source['dir'])) {
86                                        $subdir = $source['dir'] . DIRECTORY_SEPARATOR;
87                                }
88
89                                // reorganiser les fichiers a commit et preparer les messages de commit
90                                // - ignorer les fichiers non modifies, ou non versionnes et qui ne doivent pas etre ajoutes
91                                // - regrouper par auteur
92
93                                $commits_todo = array();
94                                $salvatore_status_file = "salvatore_" . $source['methode'] . "_status_file";
95                                foreach ($commit_infos as $what => $commit_info) {
96
97                                        $file = $commit_info['file_name'];
98
99                                        if ($commit_info['lastmodified'] or $commit_info['must_add']) {
100                                                $status = $salvatore_status_file($dir_depots . $source['dir_checkout'], $subdir . $file);
101
102                                                // fichier nouveau ou modifie (sinon on l'ignore)
103                                                if ($status) {
104                                                        $author = 0;
105                                                        if (!empty($commit_info['author'])) {
106                                                                $author = $commit_info['author'];
107                                                        }
108                                                        // si c'est le xml et qu'on a un seul auteur de commit, on lui fait commit aussi le xml
109                                                        elseif($what === '.xml' and count($commits_todo)===1) {
110                                                                $author = array_keys($commits_todo);
111                                                                $author = reset($author);
112                                                        }
113
114                                                        if (!isset($commits_todo[$author])) {
115                                                                $commits_todo[$author] = array(
116                                                                        'files' => array(),
117                                                                        'message' => []
118                                                                );
119                                                                if ($message_commit) {
120                                                                        $commits_todo[$author]['message'][] = $message_commit;
121                                                                }
122                                                        }
123                                                        $commits_todo[$author]['files'][] = $subdir . $file;
124                                                        if ($what === '.xml') {
125                                                                $message = "[Salvatore] [source:$subdir $module] Mise a jour du bilan depuis $url_gestionnaire";
126                                                        }
127                                                        else {
128                                                                $message = "[Salvatore] [source:$subdir $module] Export depuis $url_gestionnaire";
129                                                        }
130                                                        if (!empty($commit_info['lang'])) {
131                                                                $message .= " de la langue " . $commit_info['lang'];
132                                                        }
133                                                        if (!empty($commit_info['message'])) {
134                                                                $message .= "\n            " . $commit_info['message'];
135                                                        }
136                                                        $commits_todo[$author]['message'][] = $message;
137                                                }
138
139                                        }
140
141                                }
142
143                                // on peut maintenant lancer les commits
144                                // ajoutons les credentials dans la source pour pouvoir commit ou push
145                                $url_with_credentials = salvatore_set_credentials($source['methode'], $source['url'], $source['module']);
146                                $parts = parse_url($url_with_credentials);
147                                if (!empty($parts['user']) and !empty($parts['pass'])){
148                                        $source['user'] = $parts['user'];
149                                        $source['pass'] = $parts['pass'];
150                                }
151
152                                foreach ($commits_todo as $author => $commit_todo) {
153                                        if (!$author) {
154                                                $author = _SALVATORE_AUTHOR_COMMITS;
155                                        }
156                                        $message = implode("\n", $commit_todo['message']);
157                                        salvatore_log("Commit de <info>$author</info> :" . implode(', ', $commit_todo['files']));
158                                        salvatore_log("\t" . str_replace("\n", "\n\t", $message));
159
160                                        // TODO
161                                        //salvatore_git_commit_files($dir_depots . $source['dir_checkout'], $commit_todo['files'], $message)
162                                }
163
164                        }
165                }
166
167        }
168
169        return true;
170}
171
172return;
173
174/*
175foreach ($liste_sources as $source){
176        $credentials = false;
177        $module = $source[1];
178        salvatore_log("===== Module $module ======================================\n");
179
180
181        $f = _DIR_SALVATORE_TMP . $module . '/';
182
183        /**
184         * On ajoute les .xml
185         * /
186        salvatore_log(exec("svn add --quiet $f*xml 2>/dev/null") . "\n");
187        $ignore = array(
188                //      'spip','ecrire','public'
189                'couteau', 'couteauprive', 'paquet-couteau_suisse'// désactivés suite à scandale, je ne sais pas comment le gérer correctement
190        );
191
192        if (in_array($module, $ignore)){
193                salvatore_log("$module ignore'\n");
194        } else {
195                $depot = exec("env LC_MESSAGES=en_US.UTF-8 svn info $f |awk '/^Repository Root/ { print $3 }'") . '/';
196                $svn_url = exec("env LC_MESSAGES=en_US.UTF-8 svn info $f |awk '/^URL/ { print $2 }'") . '/';
197                $path_svn = str_replace($depot, '', $svn_url);
198                $message = $message_commit = $commiteurs = false;
199                if (file_exists($f . 'message_commit.inc')){
200                        $message = true;
201                        require_once(dirname(__FILE__) . '/' . str_replace('./', '', $f) . 'message_commit.inc');
202                }
203
204                if (is_array($commiteurs) && count($commiteurs)>0){
205                        foreach ($commiteurs as $lang => $email){
206                                if (strlen($email)>1){
207                                        $message_commit_unique = "[Salvatore] [source:$path_svn $module] Export depuis http://trad.spip.net de la langue $lang";
208                                        /**
209                                         * Si plusieurs commiteurs (veut dire que plusieurs fichiers sont à commiter)
210                                         * ou si le fichier original est modifié, on ne commit que fichier par fichier
211                                         * /
212                                        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'))){
213                                                $path = $f . $module . '_' . $lang . '.php';
214                                        } else {
215                                                /**
216                                                 * Sinon on ne s'embarasse pas, on balance tout avec cet utilisateur
217                                                 * /
218                                                $path = $f;
219                                        }
220                                        salvatore_log("On devrait commiter $path avec comme message '$message_commit_unique' avec l'email $email\n");
221                                        salvatore_log(exec("svn commit $path --username $user --password $pass --no-auth-cache --non-interactive --trust-server-cert -m " . escapeshellarg($message_commit_unique)) . "\n");
222                                        $revision = exec("svn up $path && env LC_MESSAGES=en_US.UTF-8 svn info $path |awk '/^Last Changed Rev/ { print $4 }'");
223                                        if ($propset){
224                                                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");
225                                                salvatore_log("svn propset --revprop -r $revision svn:author '$email' $path --username $user --password $pass --no-auth-cache --non-interactive --trust-server-cert\n");
226                                        }
227                                }
228                        }
229                }
230
231                /**
232                 * Si on a encore un fichier ajouté ou modifié
233                 * On commite le tout avec salvatore
234                 * /
235                if (strlen(trim(exec("svn status $f |awk /^[MA]/")))>1){
236                        $commit_message = "[Salvatore] [source:$path_svn $module] Export depuis http://trad.spip.net\n\n";
237                        $commit_message .= $message_commit . "\n";
238                        salvatore_log("On commit $f car il reste des fichiers\n");
239                        salvatore_log(exec("svn commit $f --username $user --password $pass --no-auth-cache --non-interactive --trust-server-cert -m " . escapeshellarg($commit_message)) . "\n");
240                        $revision_fin = exec("svn up $f && env LC_MESSAGES=en_US.UTF-8 svn info $f |awk '/^Last Changed Rev/ { print $4 }'");
241                        if (!$credentials && $propset){
242                                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");
243                                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");
244                        }
245                }
246
247                if (file_exists($f . 'message_commit.inc')){
248                        unlink($f . 'message_commit.inc');
249                }
250        }
251}
252
253return 0;
254/* MAIN ***********************************************************************/
Note: See TracBrowser for help on using the repository browser.