Browse Source

Une proposition pour les tickets 4420 et 4419.

- gestion d'une meta pour l'archive (fonctionne uniquement pour les zipArchive)
- traitement récursif pour les dossiers
pull/4422/head
Eric Lupinacci 10 months ago
parent
commit
1db2b1a187
  1. 2
      src/AbstractArchiver.php
  2. 10
      src/ArchiveInterface.php
  3. 5
      src/ArchiverInterface.php
  4. 36
      src/SpipArchiver.php
  5. 13
      src/TarArchive.php
  6. 14
      src/ZipArchive.php

2
src/AbstractArchiver.php

@ -98,7 +98,7 @@ abstract class AbstractArchiver implements ArchiverInterface
/**
* {@inheritDoc}
*/
abstract public function emballer(array $fichiers = [], ?string $racine = null): bool;
abstract public function emballer(array $fichiers = [], ?string $racine = null, ?string $meta = null): bool;
/**
* {@inheritDoc}

10
src/ArchiveInterface.php

@ -50,4 +50,14 @@ interface ArchiveInterface
* Fermer la resource du fichier d'archive.
*/
public function close(): bool;
/**
* Associer un commentaire à l'archive
*/
public function setMeta(string $meta): bool;
/**
* Lire le commentaire associé à l'archive si il existe
*/
public function getMeta();
}

5
src/ArchiverInterface.php

@ -49,11 +49,12 @@ interface ArchiverInterface
* Créer ou modifier des fichiers dans le fichier d'archive.
*
* @param array<mixed> $fichiers Liste des fichiers à ajouter ou modifier
* @param string $racine Repertoire racine des fichiers a retirer du chemin lorsqu'on zip
* @param string|null $racine Repertoire racine des fichiers a retirer du chemin lorsqu'on zip
* @param string|null $meta Commentaire à associer à l'archive
*
* @return bool Succès de l'opération
*/
public function emballer(array $fichiers = [], ?string $racine = null): bool;
public function emballer(array $fichiers = [], ?string $racine = null, ?string $meta = null): bool;
/**
* Retirer une liste de fichiers dans le fichier d'archive.

36
src/SpipArchiver.php

@ -2,6 +2,9 @@
namespace Spip\Archiver;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
/**
* {@inheritDoc}
* Implémentation des méthodes principales.
@ -24,6 +27,7 @@ class SpipArchiver extends AbstractArchiver implements ArchiverInterface
* raw
*/
],
'meta' => ''
];
$archive = $this->archiveEnLecture();
@ -36,6 +40,7 @@ class SpipArchiver extends AbstractArchiver implements ArchiverInterface
$liste['fichiers'] = $archive->list();
$liste['proprietes']['racine'] = $this->trouverRacine(array_column($liste['fichiers'], 'filename'));
$liste['meta'] = $archive->getMeta();
$archive->close();
}
@ -70,8 +75,8 @@ class SpipArchiver extends AbstractArchiver implements ArchiverInterface
/**
* {@inheritDoc}
*/
public function emballer(array $fichiers = [], ?string $racine = null): bool {
$source = is_null($racine) ? $this->trouverRacine($fichiers) : $racine;
public function emballer(array $chemins = [], ?string $racine = null, ?string $meta = null): bool {
$source = is_null($racine) ? $this->trouverRacine($chemins) : $racine;
if (!(is_dir($source) && is_readable($source))) {
$this->setErreur(7);
@ -88,7 +93,34 @@ class SpipArchiver extends AbstractArchiver implements ArchiverInterface
if ($archive) {
$retour = false;
if (1 === $archive->open($this->fichier_archive, 'creation')) {
// On établit la liste des fichiers en traitant éventuels les répertoires.
$fichiers = [];
foreach ($chemins as $chemin) {
if (is_dir($chemin)) {
$iterateur_dossier = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($chemin),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($iterateur_dossier as $fichier) {
if (!in_array($fichier->getFilename(), ['.', '..', '.ok'])) {
$fichiers[] = $fichier->getPathname();
}
}
} else {
$fichiers[] = $chemin;
}
}
$retour = $archive->compress($source, $fichiers);
// Ajout d'un commentaire si spécifié
if (
$retour
and !is_null($meta)
) {
$archive->setMeta($meta);
}
$archive->close();
}
$this->setErreur(intval(!$retour));

13
src/TarArchive.php

@ -100,4 +100,17 @@ class TarArchive implements ArchiveInterface
public function close(): bool {
return true;
}
/**
* {@inheritDoc}
*/
public function setMeta(string $meta): bool {
return true;
}
/**
* {@inheritDoc}
*/
public function getMeta() {
return '';
}
}

14
src/ZipArchive.php

@ -89,4 +89,18 @@ class ZipArchive implements ArchiveInterface
public function close(): bool {
return $this->zip->close();
}
/**
* {@inheritDoc}
*/
public function setMeta(string $meta): bool {
return $this->zip->setArchiveComment($meta);
}
/**
* {@inheritDoc}
*/
public function getMeta() {
return $this->zip->getArchiveComment();
}
}

Loading…
Cancel
Save