class Zip
Same name in this branch
- 11.1.x core/lib/Drupal/Core/Archiver/Zip.php \Drupal\Core\Archiver\Zip
- 11.1.x core/modules/system/src/Plugin/Archiver/Zip.php \Drupal\system\Plugin\Archiver\Zip
@author Andreas Schempp <andreas.schempp@terminal42.ch>
Hierarchy
- class \Composer\Util\Zip
Expanded class hierarchy of Zip
1 file declares its use of Zip
- ArtifactRepository.php in vendor/
composer/ composer/ src/ Composer/ Repository/ ArtifactRepository.php
11 string references to 'Zip'
- ArchiveManager::getSupportedFormats in vendor/
composer/ composer/ src/ Composer/ Package/ Archiver/ ArchiveManager.php - ArtifactRepository::getComposerInformation in vendor/
composer/ composer/ src/ Composer/ Repository/ ArtifactRepository.php - ArtifactRepository::__construct in vendor/
composer/ composer/ src/ Composer/ Repository/ ArtifactRepository.php - DiagnoseCommand::execute in vendor/
composer/ composer/ src/ Composer/ Command/ DiagnoseCommand.php - Executes the current command.
- Factory::createDownloadManager in vendor/
composer/ composer/ src/ Composer/ Factory.php
File
-
vendor/
composer/ composer/ src/ Composer/ Util/ Zip.php, line 18
Namespace
Composer\UtilView source
class Zip {
/**
* Gets content of the root composer.json inside a ZIP archive.
*/
public static function getComposerJson(string $pathToZip) : ?string {
if (!extension_loaded('zip')) {
throw new \RuntimeException('The Zip Util requires PHP\'s zip extension');
}
$zip = new \ZipArchive();
if ($zip->open($pathToZip) !== true) {
return null;
}
if (0 === $zip->numFiles) {
$zip->close();
return null;
}
$foundFileIndex = self::locateFile($zip, 'composer.json');
$content = null;
$configurationFileName = $zip->getNameIndex($foundFileIndex);
$stream = $zip->getStream($configurationFileName);
if (false !== $stream) {
$content = stream_get_contents($stream);
}
$zip->close();
return $content;
}
/**
* Find a file by name, returning the one that has the shortest path.
*
* @throws \RuntimeException
*/
private static function locateFile(\ZipArchive $zip, string $filename) : int {
// return root composer.json if it is there and is a file
if (false !== ($index = $zip->locateName($filename)) && $zip->getFromIndex($index) !== false) {
return $index;
}
$topLevelPaths = [];
for ($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
$dirname = dirname($name);
// ignore OSX specific resource fork folder
if (strpos($name, '__MACOSX') !== false) {
continue;
}
// handle archives with proper TOC
if ($dirname === '.') {
$topLevelPaths[$name] = true;
if (\count($topLevelPaths) > 1) {
throw new \RuntimeException('Archive has more than one top level directories, and no composer.json was found on the top level, so it\'s an invalid archive. Top level paths found were: ' . implode(',', array_keys($topLevelPaths)));
}
continue;
}
// handle archives which do not have a TOC record for the directory itself
if (false === strpos($dirname, '\\') && false === strpos($dirname, '/')) {
$topLevelPaths[$dirname . '/'] = true;
if (\count($topLevelPaths) > 1) {
throw new \RuntimeException('Archive has more than one top level directories, and no composer.json was found on the top level, so it\'s an invalid archive. Top level paths found were: ' . implode(',', array_keys($topLevelPaths)));
}
}
}
if ($topLevelPaths && false !== ($index = $zip->locateName(key($topLevelPaths) . $filename)) && $zip->getFromIndex($index) !== false) {
return $index;
}
throw new \RuntimeException('No composer.json found either at the top level or within the topmost directory');
}
}
Members
Title Sort descending | Modifiers | Object type | Summary |
---|---|---|---|
Zip::getComposerJson | public static | function | Gets content of the root composer.json inside a ZIP archive. |
Zip::locateFile | private static | function | Find a file by name, returning the one that has the shortest path. |