[SPIP] +spip v3.0.17
[lhc/web/clavette_www.git] / www / plugins-dist / svp / teleporter / svn.php
1 <?php
2 /**
3 * Gestion du téléporteur HTTP.
4 *
5 * @plugin SVP pour SPIP
6 * @license GPL
7 * @package SPIP\SVP\Teleporteur
8 */
9
10 /**
11 * Téléporter et déballer un composant SVN
12 *
13 * Déployer un repository SVN depuis une source et une révision données
14 *
15 * @param string $methode
16 * Méthode de téléportation : http|git|svn|...
17 * @param string $source
18 * URL de la source SVN
19 * @param string $dest
20 * Chemin du répertoire de destination
21 * @param array $options
22 * Tableau d'options. Index possibles :
23 * - revision => 'nnn'
24 * - literal => --ignore-externals
25 * @return bool
26 * True si l'opération réussie, false sinon.
27 */
28 function teleporter_svn_dist($methode,$source,$dest,$options=array()){
29 if (is_dir($dest)){
30 $infos = teleporter_svn_read($dest);
31 if (!$infos){
32 spip_log("Suppression de $dest qui n'est pas au format SVN","teleport");
33 $old = teleporter_nettoyer_vieille_version($dest);
34 }
35 elseif ($infos['source']!==$source) {
36 spip_log("Suppression de $dest qui n'est pas sur le bon repository SVN","teleport");
37 $old = teleporter_nettoyer_vieille_version($dest);
38 }
39 elseif (!isset($options['revision'])
40 OR $options['revision']!=$infos['revision']){
41 $command = "svn up ";
42 if (isset($options['revision']))
43 $command .= escapeshellarg("-r".$options['revision'])." ";
44 if (isset($options['ignore-externals']))
45 $command .= "--ignore-externals ";
46
47 $command .= escapeshellarg($dest);
48 spip_log($command,"teleport");
49 exec($command);
50 }
51 else {
52 // Rien a faire !
53 spip_log("$dest deja a jour (Revision ".$options['revision']." SVN de $source)","teleport");
54 }
55 }
56
57 if (!is_dir($dest)){
58 $command = "svn co ";
59 if (isset($options['revision']))
60 $command .= escapeshellarg("-r".$options['revision'])." ";
61 if (isset($options['ignore-externals']))
62 $command .= "--ignore-externals ";
63 $command .= escapeshellarg($source)." ".escapeshellarg($dest);
64 spip_log($command,"teleport");
65 exec($command);
66 }
67
68 // verifier que tout a bien marche
69 $infos = teleporter_svn_read($dest);
70 if (!$infos) return false;
71
72 return true;
73 }
74
75 /**
76 * Lire source et révision d'un répertoire SVN
77 * et reconstruire la ligne de commande
78 *
79 * @param string $dest
80 * Chemin du répertoire SVN
81 * @param array $options
82 * Options
83 * @return array|string
84 * Chaîne vide si pas SVN ou erreur de lecture,
85 * Tableau sinon avec les index :
86 * - source : URL de la source SVN
87 * - revision : numéro de la révision SVN
88 * - dest : Chemin du répertoire
89 */
90 function teleporter_svn_read($dest,$options=array()){
91
92 if (!is_dir("$dest/.svn"))
93 return "";
94
95 // on veut lire ce qui est actuellement deploye
96 // et reconstituer la ligne de commande pour le deployer
97 exec("svn info ".escapeshellarg($dest),$output);
98 $output = implode("\n",$output);
99
100 // URL
101 // URL: svn://trac.rezo.net/spip/spip
102 if (!preg_match(",^URL[^:\w]*:\s+(.*)$,Uims",$output,$m))
103 return "";
104 $source = $m[1];
105
106 // Revision
107 // Revision: 18763
108 if (!preg_match(",^R..?vision[^:\w]*:\s+(\d+)$,Uims",$output,$m))
109 return "";
110
111 $revision = $m[1];
112
113 return array(
114 'source' => $source,
115 'revision' => $revision,
116 'dest' => $dest
117 );
118 }