Browse Source

Merge pull request #2765 from neoascetic/gzip_downloader

Gzip downloader (resolves #2521)
Jordi Boggiano 11 years ago
parent
commit
78343ead10
2 changed files with 72 additions and 0 deletions
  1. 71 0
      src/Composer/Downloader/GzipDownloader.php
  2. 1 0
      src/Composer/Factory.php

+ 71 - 0
src/Composer/Downloader/GzipDownloader.php

@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Downloader;
+
+use Composer\Config;
+use Composer\Cache;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\Package\PackageInterface;
+use Composer\Util\ProcessExecutor;
+use Composer\IO\IOInterface;
+
+/**
+ * GZip archive downloader.
+ *
+ * @author Pavel Puchkin <i@neoascetic.me>
+ */
+class GzipDownloader extends ArchiveDownloader
+{
+    protected $process;
+
+    public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null)
+    {
+        $this->process = $process ?: new ProcessExecutor($io);
+        parent::__construct($io, $config, $eventDispatcher, $cache);
+    }
+
+    protected function extract($file, $path)
+    {
+        $targetFilepath = $path . DIRECTORY_SEPARATOR . basename(substr($file, 0, -3));
+
+        // Try to use gunzip on *nix
+        if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
+            $command = 'gzip -cd ' . escapeshellarg($file) . ' > ' . escapeshellarg($targetFilepath);
+
+            if (0 === $this->process->execute($command, $ignoredOutput)) {
+                return;
+            }
+
+            $processError = 'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput();
+            throw new \RuntimeException($processError);
+        }
+
+        // Windows version of PHP has built-in support of gzip functions
+        $archiveFile = gzopen($file, 'rb');
+        $targetFile = fopen($targetFilepath, 'wb');
+        while ($string = gzread($archiveFile, 4096)) {
+            fwrite($targetFile, $string, strlen($string));
+        }
+        gzclose($archiveFile);
+        fclose($targetFile);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function getFileName(PackageInterface $package, $path)
+    {
+        return $path.'/'.pathinfo(parse_url($package->getDistUrl(), PHP_URL_PATH), PATHINFO_BASENAME);
+    }
+}
+

+ 1 - 0
src/Composer/Factory.php

@@ -365,6 +365,7 @@ class Factory
         $dm->setDownloader('zip', new Downloader\ZipDownloader($io, $config, $eventDispatcher, $cache));
         $dm->setDownloader('rar', new Downloader\RarDownloader($io, $config, $eventDispatcher, $cache));
         $dm->setDownloader('tar', new Downloader\TarDownloader($io, $config, $eventDispatcher, $cache));
+        $dm->setDownloader('gzip', new Downloader\GzipDownloader($io, $config, $eventDispatcher, $cache));
         $dm->setDownloader('phar', new Downloader\PharDownloader($io, $config, $eventDispatcher, $cache));
         $dm->setDownloader('file', new Downloader\FileDownloader($io, $config, $eventDispatcher, $cache));