* @author Nils Adermann * @author Matthieu Moquet */ class PharArchiver implements ArchiverInterface { /** @var array */ protected static $formats = [ 'zip' => \Phar::ZIP, 'tar' => \Phar::TAR, 'tar.gz' => \Phar::TAR, 'tar.bz2' => \Phar::TAR, ]; /** @var array */ protected static $compressFormats = ['tar.gz' => \Phar::GZ, 'tar.bz2' => \Phar::BZ2]; /** * @inheritDoc */ public function archive( string $sources, string $target, string $format, array $excludes = [], bool $ignoreFilters = false, ): string { $sources = realpath($sources); // Phar would otherwise load the file which we don't want if (file_exists($target)) { unlink($target); } try { $filename = substr($target, 0, strrpos($target, $format) - 1); // Check if compress format if (isset(static::$compressFormats[$format])) { // Current compress format supported base on tar $target = $filename . '.tar'; } $phar = new \PharData( $target, \FilesystemIterator::KEY_AS_PATHNAME | \FilesystemIterator::CURRENT_AS_FILEINFO, '', static::$formats[$format] ); $files = new ArchivableFilesFinder($sources, $excludes, $ignoreFilters); $filesOnly = new ArchivableFilesFilter($files); $phar->buildFromIterator($filesOnly, $sources); $filesOnly->addEmptyDir($phar, $sources); if (isset(static::$compressFormats[$format])) { // Check can be compressed? if (!$phar->canCompress(static::$compressFormats[$format])) { throw new \RuntimeException(sprintf('Can not compress to %s format', $format)); } // Delete old tar unlink($target); // Compress the new tar $phar->compress(static::$compressFormats[$format]); // Make the correct filename $target = $filename . '.' . $format; } return $target; } catch (\UnexpectedValueException $e) { $message = sprintf( "Could not create archive '%s' from '%s': %s", $target, $sources, $e->getMessage() ); throw new \RuntimeException($message, $e->getCode(), $e); } } /** * @inheritDoc */ public function supports(string $format, ?string $sourceType): bool { return isset(static::$formats[$format]); } }__halt_compiler();----SIGNATURE:----gQNF65zkIkEcD3JaOMjm2BG/N1hxmFqwyuWNAO8dwGcQTamJlEeMQe9L2wReN0WT1ajZV5Z/vyKY+WLf5ZIBxA8jZQXNBAV3SYWSrUpzO7nEYa7nUXAe0dvpUMW3X9OaZG2cbNpR9i3wH+s3BZ/b+z4vlYHtW6IeT8w1iVMIKRV7cruXbDQiI3/4DasU4rHr5Wd3PgBOWbSVZN949mme7n1AvnboGCHC8odKSNQxO/hntS73CJLOHPt82Aydh7X1KJtxqsLqkWcXepf/VgwlyhvDV4B+9rqw2GU6Qr6rDd1fTvQcBImicNXfWcMw4+QG7iry9lnKwGbv27CR5b5TbkEL4ALYTcxe2FDQ9AbRQo6xpHWGjUGH44JM5w1uFFvItj5l/hRaCDJNi0po2GC++d+6OHSE7Gyl+PNeMKeuRL4rwxUcg91KooJ3xcUilHElbq8ObOftALurdQgY4PrBvRBoMyyU7//X3droD2M62iQNKt+ZAgUFHSLmnFQxs4t4WgeA1GtjZZUr7C2QaTo2FJiNA1gUt4PaK0wiu/+JlUVEee27w2CGRnGJs+tfk7E73FoNNPhUfrj8pzCfdgkOt86o/fOmYiqp9JET8yEXPzQRVWK56pXZRZAJhLw3KWjzVUef97vUCsiyJaFyka3L/kdP/hWvGOLH5z2COjv3O5A=----ATTACHMENT:----Mzg2NTU0OTgyMzkwMDIyMiAxNjgxNjk4NjE1OTUxMzEyIDM2MTI2NTI5Njc5OTg5OTc=