[SPIP] +spip v3.0.17
[lhc/web/clavette_www.git] / www / plugins-dist / svp / teleporter / svn.php
diff --git a/www/plugins-dist/svp/teleporter/svn.php b/www/plugins-dist/svp/teleporter/svn.php
new file mode 100644 (file)
index 0000000..26952e1
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Gestion du téléporteur HTTP. 
+ *
+ * @plugin SVP pour SPIP
+ * @license GPL
+ * @package SPIP\SVP\Teleporteur
+ */
+/**
+ * Téléporter et déballer un composant SVN
+ * 
+ * Déployer un repository SVN depuis une source et une révision données
+ *
+ * @param string $methode
+ *     Méthode de téléportation : http|git|svn|...
+ * @param string $source
+ *     URL de la source SVN
+ * @param string $dest
+ *     Chemin du répertoire de destination
+ * @param array $options
+ *     Tableau d'options. Index possibles :
+ *     - revision => 'nnn'
+ *     - literal => --ignore-externals
+ * @return bool
+ *     True si l'opération réussie, false sinon.
+ */
+function teleporter_svn_dist($methode,$source,$dest,$options=array()){
+       if (is_dir($dest)){
+               $infos = teleporter_svn_read($dest);
+               if (!$infos){
+                       spip_log("Suppression de $dest qui n'est pas au format SVN","teleport");
+                       $old = teleporter_nettoyer_vieille_version($dest);
+               }
+               elseif ($infos['source']!==$source) {
+                       spip_log("Suppression de $dest qui n'est pas sur le bon repository SVN","teleport");
+                       $old = teleporter_nettoyer_vieille_version($dest);
+               }
+               elseif (!isset($options['revision'])
+                 OR $options['revision']!=$infos['revision']){
+                       $command = "svn up ";
+                       if (isset($options['revision']))
+                               $command .= escapeshellarg("-r".$options['revision'])." ";
+                       if (isset($options['ignore-externals']))
+                               $command .= "--ignore-externals ";
+
+                       $command .= escapeshellarg($dest);
+                       spip_log($command,"teleport");
+                       exec($command);
+               }
+               else {
+                       // Rien a faire !
+                       spip_log("$dest deja a jour (Revision ".$options['revision']." SVN de $source)","teleport");
+               }
+       }
+
+       if (!is_dir($dest)){
+               $command = "svn co ";
+               if (isset($options['revision']))
+                       $command .= escapeshellarg("-r".$options['revision'])." ";
+               if (isset($options['ignore-externals']))
+                       $command .= "--ignore-externals ";
+               $command .= escapeshellarg($source)." ".escapeshellarg($dest);
+               spip_log($command,"teleport");
+               exec($command);
+       }
+
+       // verifier que tout a bien marche
+       $infos = teleporter_svn_read($dest);
+       if (!$infos) return false;
+
+       return true;
+}
+
+/**
+ * Lire source et révision d'un répertoire SVN
+ * et reconstruire la ligne de commande
+ * 
+ * @param string $dest
+ *     Chemin du répertoire SVN
+ * @param array $options
+ *     Options
+ * @return array|string
+ *     Chaîne vide si pas SVN ou erreur de lecture,
+ *     Tableau sinon avec les index :
+ *     - source : URL de la source SVN
+ *     - revision : numéro de la révision SVN
+ *     - dest : Chemin du répertoire
+ */
+function teleporter_svn_read($dest,$options=array()){
+
+       if (!is_dir("$dest/.svn"))
+               return "";
+
+       // on veut lire ce qui est actuellement deploye
+       // et reconstituer la ligne de commande pour le deployer
+       exec("svn info ".escapeshellarg($dest),$output);
+       $output = implode("\n",$output);
+
+       // URL
+       // URL: svn://trac.rezo.net/spip/spip
+       if (!preg_match(",^URL[^:\w]*:\s+(.*)$,Uims",$output,$m))
+               return "";
+       $source = $m[1];
+
+       // Revision
+       // Revision: 18763
+       if (!preg_match(",^R..?vision[^:\w]*:\s+(\d+)$,Uims",$output,$m))
+               return "";
+
+       $revision = $m[1];
+
+       return array(
+               'source' => $source,
+               'revision' => $revision,
+               'dest' => $dest
+       );
+}