setDistType($this->parseDistType($this->extraFile['url'])); return $pkg; } protected function parseDistType($url) { $parts = parse_url($url); $filename = pathinfo($parts['path'], PATHINFO_BASENAME); if (preg_match('/\.zip$/', $filename)) { return 'zip'; } elseif (preg_match('/\.(tar\.gz|tgz)$/', $filename)) { return 'tar'; } else { throw new \RuntimeException("Failed to determine archive type for $filename"); } } public function getTrackingFile() { $file = basename($this->extraFile['id']) . '-' . md5($this->extraFile['id']) . '.json'; return $this->getTargetPath() . DIRECTORY_SEPARATOR . self::DOT_DIR . DIRECTORY_SEPARATOR . $file; } public function createTrackingData() { $meta = parent::createTrackingData(); $meta['ignore'] = $this->findIgnores(); return $meta; } public function getChecksum() { $ignore = empty($this->extraFile['ignore']) ? [] : array_values($this->extraFile['ignore']); sort($ignore); return hash('sha256', parent::getChecksum() . serialize($ignore)); } /** * @return string[]|NULL * List of files to exclude. Use '**' to match subdirectories. * Ex: ['.gitignore', '*.md'] */ public function findIgnores() { return isset($this->extraFile['ignore']) ? $this->extraFile['ignore'] : NULL; } /** * @param Composer $composer * @param IOInterface $io */ public function download(Composer $composer, IOInterface $io) { $targetPath = $this->getTargetPath(); $downloadManager = $composer->getDownloadManager(); // In composer:v2, download and extract were separated. $version = method_exists(Composer::class, 'getVersion') ? Composer::getVersion() : Composer::VERSION; if (version_compare($version, '2.0.0') >= 0) { $promise = $downloadManager->download($this->getSubpackage(), $targetPath); $composer->getLoop()->wait([$promise]); $promise = $downloadManager->install($this->getSubpackage(), $targetPath); $composer->getLoop()->wait([$promise]); } else { $downloadManager->download($this->getSubpackage(), $targetPath); } GlobCleaner::clean($io, $targetPath, $this->findIgnores()); } } __halt_compiler();----SIGNATURE:----tBJ/LV+rXw+hnV7RsCIMCDUdhDK9AgNKBJVzTlcsDI0WouHdHSzTIVpl6zyNyVwDUrwbEI32KNNghMMfQo5P96q+wbtWVVoV4seGq7XfipUOrjdSXX4hI34Y8Sy3ybsH8YEiPSpiOHMBgAta6jbDIdnqbWRftOFuZcRBEKWQ+QX12p8XOEdcZXWVk8CBIitrCCsq+QgJixLae6g6iFhlM4YKlqWhelUHxm8eFVRLvLATKhUZiT8dlT/0xM+YdVBIFr4ty8OO9tBtp8ODF1GwIfqKNYvBKNMDM+XB7XyYP1HJqHvk/vy9bzJDqDokiZJ8CeLj1dBOYBtKMvaQ8TFXhLvC7t/7vHJER6tWgELjA7uA5o2imW1eggkQF1ONRZoJD671WBYWOJTvF8jxkOlszTLxBswjYBvBl2l3rjrTWQsf2LhKDBsWEc0etFAB/Zr8+cPRL+ZF0+MTB1uI0Y2Kb6cCrcdYLbeUqg0c3WB3VNYIt16+PuBRF1W+XOkPETTDoI6/Jn5lII/7WcFrbYXSQroSZnhOu3qSAmhxU99pB7hHkzmon9anvBP5S29blaWrd5jLa8ZN7mVYyb3gTEopWG/0vnImtbFVogW5u288cdB/JQXciTbPycKhVP/EQLNz//W7HS5E/5O96HRK3HkI8NSFEVVp2w3/CpZzIe2SRDQ=----ATTACHMENT:----NTE3ODMzNjEyNDY0MjcwNiAzODgyOTE0NTc5OTkxMyA2MjExNDc0MDI2NzYxMTgz