'']; } $tar = new \PharData($destination); /** * @var string $relative */ foreach ($sources as $source => $relative) { if (\is_int($source)) { $source = $relative; } $source = FileUtils::absolute(\strtr($source, '\\', '/')); $relative = \strtr($relative, '\\', '/'); if (\is_dir($source)) { /** @var string[] $files */ $files = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($source, \FilesystemIterator::CURRENT_AS_PATHNAME), \RecursiveIteratorIterator::SELF_FIRST ); foreach ($files as $file) { $file = \strtr($file, '\\', '/'); /* Ignore . and .. */ if (($pos = \mb_strrpos($file, '/')) === false || \in_array(\mb_substr($file, $pos + 1), ['.', '..']) ) { continue; } $absolute = \realpath($file); $absolute = \str_replace('\\', '/', (string) $absolute); $dir = \ltrim(\rtrim($relative, '/\\') . '/' . \ltrim(\str_replace($source . '/', '', $absolute), '/\\'), '/\\'); if (\is_dir($absolute)) { $tar->addEmptyDir($dir . '/'); } elseif (\is_file($absolute)) { $tar->addFile($absolute, $dir); } } } elseif (\is_file($source)) { $tar->addFile($source, $relative); } else { continue; } } return true; } /** * {@inheritdoc} */ public static function unpack(string $source, string $destination) : bool { if (!\is_file($source)) { return false; } if (!\is_dir($destination)) { Directory::create($destination, recursive: true); } try { $destination = \strtr($destination, '\\', '/'); $destination = \rtrim($destination, '/'); $tar = new \PharData($source); $tar->extractTo($destination . '/'); return true; } catch (\Throwable $_) { return false; } } }