/** * 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; }