source: spip-zone/_core_/plugins/svp/teleporter/git.php

Last change on this file was 125009, checked in by Matthieu Marcillaud, 5 weeks ago

Tickets #4473 et #4474 (Real3t) : réparer partièlement le téléchargement par vcs.
On fait fonctionner Git. Mais si SVN, on n’a plus l’URL actuellement (donc on ne le fait pas).
On utilise dans tous les cas la valeur de src_archive uniquement.

File size: 4.6 KB
Line 
1<?php
2/**
3 * Gestion du téléporteur GIT.
4 *
5 * @plugin SVP pour SPIP
6 * @license GPL
7 * @package SPIP\SVP\Teleporteur
8 */
9
10if (!defined('_GIT_COMMAND')) {
11        define('_GIT_COMMAND', 'git');
12} // Securite : on peut indiquer le chemin absolu dans mes_options.php
13
14/**
15 * Téléporter et déballer un composant GIT
16 *
17 * Déployer un repository GIT depuis une source et une révision données
18 *
19 * @param string $methode
20 *     Méthode de téléportation : http|git|svn|...
21 * @param string $source
22 *     URL de la source GIT
23 * @param string $dest
24 *     Chemin du répertoire de destination
25 * @param array $options
26 *     Tableau d'options. Index possibles :
27 *     - revision => 'ae89'
28 *     - branche => 'xxx'
29 * @return bool
30 *     True si l'opération réussie, false sinon.
31 */
32function teleporter_git_dist($methode, $source, $dest, $options = array()) {
33
34        $branche = (isset($options['branche']) ? $options['branche'] : 'master');
35        if (is_dir($dest)) {
36                $infos = teleporter_git_read($dest, array('format' => 'assoc'));
37                if (!$infos) {
38                        spip_log("Suppression de $dest qui n'est pas au format GIT", "teleport");
39                        $old = teleporter_nettoyer_vieille_version($dest);
40                } elseif ($infos['source'] !== $source) {
41                        spip_log("Suppression de $dest qui n'est pas sur le bon repository GIT", "teleport");
42                        $old = teleporter_nettoyer_vieille_version($dest);
43                } elseif (!isset($options['revision'])
44                        or $options['revision'] != $infos['revision']
45                ) {
46                        $command = _GIT_COMMAND . " checkout " . escapeshellarg($branche);
47                        teleporter_git_exec($dest, $command);
48                        $command = _GIT_COMMAND . " pull --all";
49                        teleporter_git_exec($dest, $command);
50
51                        if (isset($options['revision'])) {
52                                $command = _GIT_COMMAND . " checkout " . escapeshellarg($options['revision']);
53                                teleporter_git_exec($dest, $command);
54                        } else {
55                                $command = _GIT_COMMAND . " checkout " . escapeshellarg($branche);
56                                teleporter_git_exec($dest, $command);
57                        }
58                } else {
59                        spip_log("$dest deja sur GIT $source Revision " . $options['revision'], "teleport");
60                }
61        }
62
63        if (!is_dir($dest)) {
64                // on clone depuis le répertoire parent...
65                $into = basename($dest);
66                $dir = dirname($dest);
67                if (!is_dir($dir)) {
68                        @mkdir($dir, _SPIP_CHMOD, true);
69                        if (!is_dir($dir)) {
70                                spip_log("$dir impossible a créer pour clone $source.", "teleport");
71                                return false;
72                        }
73                }
74                $command = _GIT_COMMAND . " clone ";
75                $command .= escapeshellarg($source) . " " . escapeshellarg($into);
76                teleporter_git_exec($dir, $command);
77                if (isset($options['revision'])) {
78                        $command = _GIT_COMMAND . " checkout " . escapeshellarg($options['revision']);
79                        teleporter_git_exec($dest, $command);
80                }
81        }
82
83        // verifier que tout a bien marche
84        $infos = teleporter_git_read($dest);
85        if (!$infos) {
86                return false;
87        }
88
89        return true;
90}
91
92/**
93 * Lire l'état GIT du repository
94 *
95 * Retourne les informations GIT d'un répertoire donné
96 *
97 * @param string $dest
98 *     Chemin du répertoire à tester
99 * @param array $options
100 *     Tableau d'options
101 * @return string|bool|array
102 *     - Chaîne vide si pas un dépot GIT
103 *     - False si erreur sur le dépot GIT
104 *     - array sinon. Tableau avec 3 index :
105 *     -- source : Source du dépot GIT à cette destination
106 *     -- revision : Révision du dépot
107 *     -- dest : Répertoire du dépot.
108 */
109function teleporter_git_read($dest, $options = array()) {
110
111        if (!is_dir("$dest/.git")) {
112                return "";
113        }
114
115        $curdir = getcwd();
116        chdir($dest);
117
118        exec(_GIT_COMMAND . " remote -v", $output);
119        $output = implode("\n", $output);
120
121        $source = "";
122        if (preg_match(",(\w+://.*)\s+\(fetch\)$,Uims", $output, $m)) {
123                $source = $m[1];
124        } elseif (preg_match(",([^@\s]+@[^:\s]+:.*)\s+\(fetch\)$,Uims", $output, $m)) {
125                $source = $m[1];
126        }
127
128        if (!$source) {
129                chdir($curdir);
130
131                return "";
132        }
133
134        $source = $m[1];
135
136        exec(_GIT_COMMAND . " log -1", $output);
137        $hash = explode(" ", reset($output));
138        $hash = end($hash);
139
140        // [TODO] lire la branche ?
141        chdir($curdir);
142
143        if (preg_match(",[^0-9a-f],i", $hash)) {
144                return false;
145        }
146
147        return array(
148                'source' => $source,
149                'revision' => substr($hash, 0, 7),
150                'dest' => $dest
151        );
152}
153
154
155/**
156 * Exécuter une commande GIT
157 *
158 * @param string $dest
159 *     Répertoire de destination
160 * @param string $command
161 *     Commande à exécuter
162 * @return void
163 */
164function teleporter_git_exec($dest, $command) {
165        spip_log("{$dest}:{$command}", "teleport");
166        $curdir = getcwd();
167        chdir($dest);
168        exec($command);
169        chdir($curdir);
170}
171
172
173/**
174 * Tester si la commande 'git' est disponible
175 *
176 * @return bool
177 *     true si on peut utiliser la commande svn
178 **/
179function teleporter_git_tester() {
180        static $erreurs = null;
181        if (is_null($erreurs)) {
182                exec(_GIT_COMMAND . " --version", $output, $erreurs);
183        }
184
185        return !$erreurs;
186}
Note: See TracBrowser for help on using the repository browser.