svn.php 3.1 KB

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