Example #1
0
 /**
  * Télécharge un paquet
  * 
  * Supprime les fichiers obsolètes (si présents)
  *
  * @param int|array $id_or_row
  *     Identifiant du paquet ou description ligne SQL du paquet
  * @return bool|array
  *     False si erreur.
  *     Tableau de 2 index sinon :
  *     - dir : Chemin du paquet téléchargé depuis la racine
  *     - dossier : Chemin du paquet téléchargé, depuis _DIR_PLUGINS
  */
 function get_paquet_id($id_or_row)
 {
     // on peut passer direct le row sql...
     if (!is_array($id_or_row)) {
         $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($id_or_row));
     } else {
         $i = $id_or_row;
     }
     unset($id_or_row);
     if ($i['nom_archive'] and $i['id_depot']) {
         $this->log("Recuperer l'archive : " . $i['nom_archive']);
         if ($adresse = sql_getfetsel('url_archives', 'spip_depots', 'id_depot=' . sql_quote($i['id_depot']))) {
             $zip = $adresse . '/' . $i['nom_archive'];
             // destination : auto/prefixe/version (sinon auto/nom_archive/version)
             $prefixe = sql_getfetsel('pl.prefixe', array('spip_paquets AS pa', 'spip_plugins AS pl'), array('pa.id_plugin = pl.id_plugin', 'pa.id_paquet=' . sql_quote($i['id_paquet'])));
             // prefixe
             $base = $prefixe ? strtolower($prefixe) : substr($i['nom_archive'], 0, -4);
             // enlever .zip ...
             // prefixe/version
             $dest = $base . '/v' . denormaliser_version($i['version']);
             // si on tombe sur un auto/X ayant des fichiers (et pas uniquement des dossiers)
             // ou un dossier qui ne commence pas par 'v'
             // c'est que auto/X n'était pas chargé avec SVP
             // ce qui peut arriver lorsqu'on migre de SPIP 2.1 à 3.0
             // dans ce cas, on supprime auto X pour mettre notre nouveau paquet.
             $ecraser_base = false;
             if (is_dir(_DIR_PLUGINS_AUTO . $base)) {
                 $base_files = scandir(_DIR_PLUGINS_AUTO . $base);
                 if (is_array($base_files)) {
                     $base_files = array_diff($base_files, array('.', '..'));
                     foreach ($base_files as $f) {
                         if ($f[0] != '.' and $f[0] != 'v' or $f[0] != '.' and !is_dir(_DIR_PLUGINS_AUTO . $base . '/' . $f)) {
                             // commence par v mais pas repertoire
                             $ecraser_base = true;
                             break;
                         }
                     }
                 }
             }
             if ($ecraser_base) {
                 supprimer_repertoire(_DIR_PLUGINS_AUTO . $base);
             }
             // on recupere la mise a jour...
             include_spip('action/teleporter');
             $teleporter_composant = charger_fonction('teleporter_composant', 'action');
             $ok = $teleporter_composant('http', $zip, _DIR_PLUGINS_AUTO . $dest);
             if ($ok === true) {
                 return array('dir' => _DIR_PLUGINS_AUTO . $dest, 'dossier' => 'auto/' . $dest);
             }
             $this->err($ok);
             $this->log("Téléporteur en erreur : " . $ok);
         } else {
             $this->log("Aucune adresse pour le dépot " . $i['id_depot']);
         }
     }
     return false;
 }
 /**
  * Télécharge un paquet
  *
  * Supprime les fichiers obsolètes (si présents)
  *
  * @param int|array $id_or_row
  *     Identifiant du paquet ou description ligne SQL du paquet
  * @param string $dest_ancien
  *     Chemin vers l'ancien répertoire (pour les mises à jour par VCS)
  * @return bool|array
  *     False si erreur.
  *     Tableau de 2 index sinon :
  *     - dir : Chemin du paquet téléchargé depuis la racine
  *     - dossier : Chemin du paquet téléchargé, depuis _DIR_PLUGINS
  */
 public function get_paquet_id($id_or_row, $dest_ancien = "")
 {
     // on peut passer direct le row sql...
     if (!is_array($id_or_row)) {
         $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($id_or_row));
     } else {
         $i = $id_or_row;
     }
     unset($id_or_row);
     if ($i['nom_archive'] and $i['id_depot']) {
         $this->log("Recuperer l'archive : " . $i['nom_archive']);
         // on récupère les informations intéressantes du dépot :
         // - url des archives
         // - éventuellement : type de serveur (svn, git) et url de la racine serveur (svn://..../)
         $adresses = sql_fetsel(array('url_archives', 'type', 'url_serveur'), 'spip_depots', 'id_depot=' . sql_quote($i['id_depot']));
         if ($adresses and $adresse = $adresses['url_archives']) {
             // destination : auto/prefixe/version (sinon auto/nom_archive/version)
             $prefixe = sql_getfetsel('pl.prefixe', array('spip_paquets AS pa', 'spip_plugins AS pl'), array('pa.id_plugin = pl.id_plugin', 'pa.id_paquet=' . sql_quote($i['id_paquet'])));
             // prefixe
             $base = $prefixe ? strtolower($prefixe) : substr($i['nom_archive'], 0, -4);
             // enlever .zip ...
             // prefixe/version
             $dest_future = $base . '/v' . denormaliser_version($i['version']);
             // Nettoyer les vieux formats dans auto/
             if ($this->tester_repertoire_destination_ancien_format(_DIR_PLUGINS_AUTO . $base)) {
                 supprimer_repertoire(_DIR_PLUGINS_AUTO . $base);
             }
             // l'url est différente en fonction du téléporteur
             $teleporteur = $this->choisir_teleporteur($adresses['type']);
             if ($teleporteur == 'http') {
                 $url = $adresse . '/' . $i['nom_archive'];
                 $dest = $dest_future;
             } else {
                 $url = $adresses['url_serveur'] . '/' . $i['src_archive'];
                 $dest = $dest_ancien ? $dest_ancien : $dest_future;
             }
             // on recupere la mise a jour...
             include_spip('action/teleporter');
             $teleporter_composant = charger_fonction('teleporter_composant', 'action');
             $ok = $teleporter_composant($teleporteur, $url, _DIR_PLUGINS_AUTO . $dest);
             if ($ok === true) {
                 // pour une mise à jour via VCS, il faut rebasculer sur le nouveau nom de repertoire
                 if ($dest != $dest_future) {
                     rename(_DIR_PLUGINS_AUTO . $dest, _DIR_PLUGINS_AUTO . $dest_future);
                 }
                 return array('dir' => _DIR_PLUGINS_AUTO . $dest, 'dossier' => 'auto/' . $dest);
             }
             $this->err($ok);
             $this->log("Téléporteur en erreur : " . $ok);
         } else {
             $this->log("Aucune adresse pour le dépot " . $i['id_depot']);
         }
     }
     return false;
 }
 /**
  * Retourne un tableau des différentes actions qui seront faites
  *
  * @param string $quoi
  *     Type de demande
  *     - ask : les actions demandées
  *     - changes : les actions en plus par rapport à ce qui était demandé
  *     - todo : toutes les actions
  * @return array
  *     Liste des actions (joliement traduites et expliquées)
  **/
 public function presenter_actions($quoi)
 {
     $res = array();
     foreach ($this->{$quoi} as $id => $info) {
         $trads = array('plugin' => $info['n'], 'version' => denormaliser_version($info['v']));
         if (isset($info['maj'])) {
             $trads['version_maj'] = denormaliser_version($info['maj']);
         }
         $res[] = _T('svp:message_action_' . $info['todo'], $trads);
     }
     return $res;
 }