source: spip-zone/_plugins_/trad-lang/trunk/salvatore/vcs/svn.php @ 119870

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

bugfix svn status sur file avec un * : il ne faut pas le quoter pour que svn comprenne le joker

  • Property svn:eol-style set to native
File size: 4.9 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 * Lire la date de derniere modif d'un fichier versionne
30 * (retourne 0 si le fichier n'est pas versionne)
31 * @param string $dir_repo
32 * @param string $file
33 * @return false|int
34 */
35function salvatore_vcs_svn_lastmodified_file_dist($dir_repo, $file) {
36
37        $d = getcwd();
38        chdir($dir_repo);
39        $file = escapeshellarg($file);
40        $lastmodified = exec('env LC_MESSAGES=en_US.UTF-8 svn info ' . $file . " 2>/dev/null | awk '/^Last Changed Date/ { print $4 \" \" $5 }'");
41        $lastmodified = strtotime($lastmodified);
42        chdir($d);
43        return $lastmodified;
44}
45
46/**
47 * Afficher le status d'un ou plusieurs fichiers
48 * @param string $dir_repo
49 * @param string|array $file_or_files
50 * @return string
51 */
52function salvatore_vcs_svn_status_file_dist($dir_repo, $file_or_files) {
53
54        if (is_array($file_or_files)) {
55                $escaped_file_or_files = array_map('escapeshellarg', $file_or_files);
56                // si on passe un nom de fichier avec un * il ne faut pas le quoter pour svn :(
57                foreach ($file_or_files as $k=>$file) {
58                        if (strpos($file, '*')!==false and $file === trim($escaped_file_or_files[$k], "'")) {
59                                $escaped_file_or_files[$k] = $file;
60                        }
61                }
62                $file_or_files = implode(' ', $escaped_file_or_files);
63        }
64        else {
65                $file_or_files = escapeshellarg($file_or_files);
66        }
67
68        $d = getcwd();
69        chdir($dir_repo);
70        $output = array();
71        exec("svn status $file_or_files 2>&1", $output);
72        chdir($d);
73        return implode("\n", $output);
74}
75
76
77/**
78 * Commit une liste de fichiers avec un message et auteur fourni
79 *
80 * @param string $dir_repo
81 * @param array $files
82 * @param string $message
83 * @param string $author
84 * @param string $user
85 * @param string $pass
86 * @return array
87 */
88function salvatore_vcs_svn_commit_files_dist($dir_repo, $files, $message, $author, $user=null, $pass=null) {
89
90        // lister deja les fichiers qui necessitent un svn add (fichiers ajoutes qui ne sont pas dans le repo)
91        $files_to_add = array();
92        foreach ($files as $file) {
93                if (!salvatore_vcs_svn_lastmodified_file($dir_repo, $file)) {
94                        $files_to_add[] = $file;
95                }
96        }
97
98        $files = array_map('escapeshellarg', $files);
99        $files = implode(' ', $files);
100
101        $files_to_add = array_map('escapeshellarg', $files_to_add);
102        $files_to_add = implode(' ', $files_to_add);
103
104        $d = getcwd();
105        chdir($dir_repo);
106        $output = array();
107        $res = true;
108
109        $auth = "";
110        $auth_disp = "";
111        if ($user) {
112                $auth .= " --username=".escapeshellarg($user);
113                $auth_disp .= " --username=".escapeshellarg('xxxxx');
114        }
115        if ($user) {
116                $auth .= " --password=".escapeshellarg($pass);
117                $auth_disp .= " --password=".escapeshellarg('xxxxx');
118        }
119
120        $commands = [];
121        if ($files_to_add) {
122                $commands[] = "svn add --quiet $files_to_add 2>&1";
123        }
124        // TODO : activer le commit quand on sera en prod
125        // $commands[] = "svn commit $files{$auth} --no-auth-cache --non-interactive --trust-server-cert -m " . escapeshellarg($message) . " 2>&1";
126
127        foreach ($commands as $command) {
128                $output[] = "> " . ($auth ? str_replace($auth, $auth_disp, $command) : $command);
129                $return_var = 0;
130                exec($command, $output, $return_var);
131                // si une erreur a eu lieu le signaler dans le retour
132                if ($return_var) {
133                        $res = false;
134                }
135        }
136        if ($res and $author and _SALVATORE_SVN_PROPSET) {
137                if ($revision = exec("svn up . && env LC_MESSAGES=en_US.UTF-8 svn info . |awk '/^Last Changed Rev/ { print $4 }'")) {
138                        $command = "svn propset --revprop -r $revision svn:author ".escapeshellarg($author). " .{$auth} --no-auth-cache --non-interactive --trust-server-cert";
139                        $output[] = "> " . ($auth ? str_replace($auth, $auth_disp, $command) : $command);
140                        exec($command, $output, $return_var);
141                        if ($return_var) {
142                                $res = false;
143                        }
144                }
145        }
146        chdir($d);
147
148        return array($res, implode("\n", $output));
149}
150
151
152
153/**
154 * Rien a faire : en svn le commit push, mais fonction symetrique de git
155 *
156 * @param string $dir_repo
157 * @param null $user
158 * @param null $pass
159 * @return array
160 */
161function salvatore_vcs_svn_push_repository_dist($dir_repo, $user=null, $pass=null) {
162        return array(true, '');
163}
Note: See TracBrowser for help on using the repository browser.