%PDF- %PDF-
| Direktori : /var/www/projetos/suporte.iigd.com.br/vendor/wapmorgan/unified-archive/src/Drivers/ |
| Current File : /var/www/projetos/suporte.iigd.com.br/vendor/wapmorgan/unified-archive/src/Drivers/TarByPhar.php |
<?php
namespace wapmorgan\UnifiedArchive\Drivers;
use Exception;
use FilesystemIterator;
use Phar;
use PharData;
use PharFileInfo;
use RecursiveIteratorIterator;
use wapmorgan\UnifiedArchive\ArchiveEntry;
use wapmorgan\UnifiedArchive\ArchiveInformation;
use wapmorgan\UnifiedArchive\Drivers\Basic\BasicDriver;
use wapmorgan\UnifiedArchive\Drivers\Basic\BasicExtensionDriver;
use wapmorgan\UnifiedArchive\Exceptions\ArchiveCreationException;
use wapmorgan\UnifiedArchive\Exceptions\ArchiveExtractionException;
use wapmorgan\UnifiedArchive\Exceptions\ArchiveModificationException;
use wapmorgan\UnifiedArchive\Exceptions\UnsupportedOperationException;
use wapmorgan\UnifiedArchive\Formats;
class TarByPhar extends BasicExtensionDriver
{
const EXTENSION_NAME = 'phar';
public static $disabled = false;
/**
* @var PharData
*/
protected $tar;
/**
* @var float
*/
protected $compressRatio;
protected $pureFilesNumber;
/**
* @var int Flags for iterator
*/
const PHAR_FLAGS = FilesystemIterator::UNIX_PATHS;
/**
* @inheritDoc
*/
public static function getInstallationInstruction()
{
return 'install `phar` extension and optionally php-extensions (zlib, bz2)';
}
/**
* @inheritDoc
*/
public static function getDescription()
{
return 'adapter for ext-phar';
}
/**
* @return array
*/
public static function getSupportedFormats()
{
return [
Formats::TAR,
Formats::TAR_GZIP,
Formats::TAR_BZIP,
Formats::ZIP,
];
}
/**
* @param $format
* @return array
*/
public static function checkFormatSupport($format)
{
if (static::$disabled || !static::isInstalled()) {
return [];
}
$abilities = [
BasicDriver::OPEN,
BasicDriver::EXTRACT_CONTENT,
BasicDriver::STREAM_CONTENT,
BasicDriver::APPEND,
BasicDriver::DELETE,
BasicDriver::CREATE,
];
switch ($format) {
case Formats::TAR:
case Formats::ZIP:
return $abilities;
case Formats::TAR_GZIP:
return extension_loaded('zlib')
? $abilities
: [];
case Formats::TAR_BZIP:
return extension_loaded('bz2')
? $abilities
: [];
}
}
/**
* @inheritDoc
*/
public function __construct($archiveFileName, $format, $password = null)
{
parent::__construct($archiveFileName, $format);
$this->open();
}
/**
*
*/
protected function open()
{
$this->tar = new PharData($this->fileName, self::PHAR_FLAGS);
}
/**
* @inheritDoc
*/
public function getArchiveInformation()
{
$information = new ArchiveInformation();
$stream_path_length = strlen('phar://'.$this->fileName.'/');
$information->compressedFilesSize = filesize($this->fileName);
/**
* @var string $i
* @var PharFileInfo $file
*/
foreach (new RecursiveIteratorIterator($this->tar) as $i => $file) {
$information->files[] = substr($file->getPathname(), $stream_path_length);
$information->uncompressedFilesSize += $file->getSize();
}
$this->compressRatio = $information->compressedFilesSize > 0
? $information->uncompressedFilesSize / $information->compressedFilesSize
: 0;
$this->pureFilesNumber = count($information->files);
return $information;
}
/**
* @inheritDoc
*/
public function getFileNames()
{
$files = [];
$stream_path_length = strlen('phar://'.$this->fileName.'/');
foreach (new RecursiveIteratorIterator($this->tar) as $i => $file) {
$files[] = substr($file->getPathname(), $stream_path_length);
}
return $files;
}
/**
* @inheritDoc
*/
public function isFileExists($fileName)
{
try {
$this->tar->offsetGet($fileName);
return true;
} catch (Exception $e) {
return false;
}
}
/**
* @inheritDoc
*/
public function getFileData($fileName)
{
/** @var \PharFileInfo $entry_info */
$entry_info = $this->tar->offsetGet($fileName);
return new ArchiveEntry(
$fileName,
(
// $entry_info->getCompressedSize() > $entry_info->getSize()
$this->compressRatio > 1
? floor($entry_info->getSize() / $this->compressRatio)
: (
$entry_info->getCompressedSize() > 0
? $entry_info->getCompressedSize()
: 0
)
), //$entry_info->getCompressedSize(),
$entry_info->getSize(),
$entry_info->getMTime(),
$entry_info->isCompressed());
}
/**
* @inheritDoc
*/
public function getFileContent($fileName)
{
return $this->tar->offsetGet($fileName)->getContent();
}
/**
* @inheritDoc
*/
public function getFileStream($fileName)
{
return fopen('phar://'.$this->fileName . '/' . $fileName, 'rb');
}
/**
* @inheritDoc
*/
public function extractFiles($outputFolder, array $files)
{
$result = $this->tar->extractTo($outputFolder, $files, true);
if ($result === false) {
throw new ArchiveExtractionException('Error when extracting from '.$this->fileName);
}
return count($files);
}
/**
* @inheritDoc
*/
public function extractArchive($outputFolder)
{
$result = $this->tar->extractTo($outputFolder, null, true);
if ($result === false) {
throw new ArchiveExtractionException('Error when extracting from '.$this->fileName);
}
return $this->pureFilesNumber;
}
/**
* @inheritDoc
*/
public function deleteFiles(array $files)
{
$deleted = 0;
foreach ($files as $i => $file) {
if ($this->tar->delete($file))
$deleted++;
}
$this->tar = null;
$this->open();
return $deleted;
}
/**
* @inheritDoc
*/
public function addFiles(array $files)
{
$added = 0;
try {
foreach ($files as $localName => $filename) {
if (is_null($filename)) {
$this->tar->addEmptyDir($localName);
} else {
$this->tar->addFile($filename, $localName);
$added++;
}
}
} catch (Exception $e) {
throw new ArchiveModificationException('Could not add file "'.$filename.'": '.$e->getMessage(), $e->getCode());
}
$this->tar = null;
// reopen to refresh files list properly
$this->open();
return $added;
}
/**
* @param array $files
* @param string $archiveFileName
* @param int $archiveFormat
* @param int $compressionLevel
* @param null $password
* @param $fileProgressCallable
* @return int
* @throws ArchiveCreationException
* @throws UnsupportedOperationException
*/
public static function createArchive(
array $files,
$archiveFileName,
$archiveFormat,
$compressionLevel = self::COMPRESSION_AVERAGE,
$password = null,
$fileProgressCallable = null
)
{
if ($password !== null) {
throw new UnsupportedOperationException('Driver (' . __CLASS__ . ') could not encrypt an archive');
}
if ($fileProgressCallable !== null && !is_callable($fileProgressCallable)) {
throw new ArchiveCreationException('File progress callable is not callable');
}
if (preg_match('~^(.+)\.(tar\.(gz|bz2))$~i', $archiveFileName, $match)) {
$ext = $match[2];
$basename = $match[1];
} else {
$ext = pathinfo($archiveFileName, PATHINFO_EXTENSION);
$basename = dirname($archiveFileName).'/'.basename($archiveFileName, '.'.$ext);
}
$compression = null;
switch ($ext) {
case 'tar.gz':
case 'tgz':
$compression = Phar::GZ;
break;
case 'tar.bz2':
case 'tbz2':
$compression = Phar::BZ2;
break;
}
$destination_file = $basename . '.' . ($archiveFormat === Formats::ZIP ? 'zip' : 'tar');
// if compression used and there is .tar archive with that's name,
// use temp file
if ($compression !== null && file_exists($basename . '.' . ($archiveFormat === Formats::ZIP ? 'zip' : 'tar'))) {
$temp_basename = tempnam(sys_get_temp_dir(), 'tar-archive');
unlink($temp_basename);
$destination_file = $temp_basename. '.' . ($archiveFormat === Formats::ZIP ? 'zip' : 'tar');
}
$tar = new PharData(
$destination_file,
0, null, $archiveFormat === Formats::ZIP ? Phar::ZIP : Phar::TAR
);
try {
$current_file = 0;
$total_files = count($files);
foreach ($files as $localName => $filename) {
if (is_null($filename)) {
if (!in_array($localName, ['/', ''], true)) {
if ($tar->addEmptyDir($localName) === false) {
throw new ArchiveCreationException('Error when adding directory '.$localName.' to archive');
}
}
} else {
if ($tar->addFile($filename, $localName) === false) {
throw new ArchiveCreationException('Error when adding file '.$localName.' to archive');
}
}
if ($fileProgressCallable !== null) {
call_user_func_array($fileProgressCallable, [$current_file++, $total_files, $filename, $localName]);
}
}
} catch (Exception $e) {
throw new ArchiveCreationException('Error when creating archive: '.$e->getMessage(), $e->getCode(), $e);
}
switch ($compression) {
case Phar::GZ:
$tar->compress(Phar::GZ, $ext);
break;
case Phar::BZ2:
$tar->compress(Phar::BZ2, $ext);
break;
}
$tar = null;
// if compression used and original .tar file exist, clean it
if ($compression !== null && file_exists($destination_file)) {
unlink($destination_file);
}
// it temp file was used, rename it to destination archive name
if (isset($temp_basename)) {
rename($temp_basename . '.' . $ext, $archiveFileName);
}
return count($files);
}
/**
* @param string $inArchiveName
* @param string $content
* @return bool
*/
public function addFileFromString($inArchiveName, $content)
{
$this->tar->addFromString($inArchiveName, $content);
return true;
}
}