|
@@ -18,13 +18,13 @@ use Composer\Util\Filesystem;
|
|
|
use Composer\Util\RemoteFilesystem;
|
|
|
|
|
|
/**
|
|
|
- * Base downloader for file packages
|
|
|
+ * Base downloader for files
|
|
|
*
|
|
|
* @author Kirill chEbba Chebunin <iam@chebba.org>
|
|
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
|
|
* @author François Pluchino <francois.pluchino@opendisplay.com>
|
|
|
*/
|
|
|
-abstract class FileDownloader implements DownloaderInterface
|
|
|
+class FileDownloader implements DownloaderInterface
|
|
|
{
|
|
|
protected $io;
|
|
|
|
|
@@ -63,18 +63,11 @@ abstract class FileDownloader implements DownloaderInterface
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- $fileName = rtrim($path.'/'.md5(time().rand()).'.'.pathinfo($url, PATHINFO_EXTENSION), '.');
|
|
|
+ $fileName = $this->getFileName($package, $path);
|
|
|
|
|
|
$this->io->write(" - Package <info>" . $package->getName() . "</info> (<comment>" . $package->getPrettyVersion() . "</comment>)");
|
|
|
|
|
|
- if (!extension_loaded('openssl') && (0 === strpos($url, 'https:') || 0 === strpos($url, 'http://github.com'))) {
|
|
|
- // bypass https for github if openssl is disabled
|
|
|
- if (preg_match('{^https?://(github.com/[^/]+/[^/]+/(zip|tar)ball/[^/]+)$}i', $url, $match)) {
|
|
|
- $url = 'http://nodeload.'.$match[1];
|
|
|
- } else {
|
|
|
- throw new \RuntimeException('You must enable the openssl extension to download files via https');
|
|
|
- }
|
|
|
- }
|
|
|
+ $url = $this->processUrl($url);
|
|
|
|
|
|
$rfs = new RemoteFilesystem($this->io);
|
|
|
$rfs->copy($package->getSourceUrl(), $url, $fileName);
|
|
@@ -86,32 +79,7 @@ abstract class FileDownloader implements DownloaderInterface
|
|
|
}
|
|
|
|
|
|
if ($checksum && hash_file('sha1', $fileName) !== $checksum) {
|
|
|
- throw new \UnexpectedValueException('The checksum verification of the archive failed (downloaded from '.$url.')');
|
|
|
- }
|
|
|
-
|
|
|
- $this->io->write(' Unpacking archive');
|
|
|
- $this->extract($fileName, $path);
|
|
|
-
|
|
|
- $this->io->write(' Cleaning up');
|
|
|
- unlink($fileName);
|
|
|
-
|
|
|
- // If we have only a one dir inside it suppose to be a package itself
|
|
|
- $contentDir = glob($path . '/*');
|
|
|
- if (1 === count($contentDir)) {
|
|
|
- $contentDir = $contentDir[0];
|
|
|
-
|
|
|
- // Rename the content directory to avoid error when moving up
|
|
|
- // a child folder with the same name
|
|
|
- $temporaryName = md5(time().rand());
|
|
|
- rename($contentDir, $temporaryName);
|
|
|
- $contentDir = $temporaryName;
|
|
|
-
|
|
|
- foreach (array_merge(glob($contentDir . '/.*'), glob($contentDir . '/*')) as $file) {
|
|
|
- if (trim(basename($file), '.')) {
|
|
|
- rename($file, $path . '/' . basename($file));
|
|
|
- }
|
|
|
- }
|
|
|
- rmdir($contentDir);
|
|
|
+ throw new \UnexpectedValueException('The checksum verification of the file failed (downloaded from '.$url.')');
|
|
|
}
|
|
|
|
|
|
$this->io->write('');
|
|
@@ -122,8 +90,7 @@ abstract class FileDownloader implements DownloaderInterface
|
|
|
*/
|
|
|
public function update(PackageInterface $initial, PackageInterface $target, $path)
|
|
|
{
|
|
|
- $fs = new Filesystem();
|
|
|
- $fs->removeDirectory($path);
|
|
|
+ $this->remove($initial, $path);
|
|
|
$this->download($target, $path);
|
|
|
}
|
|
|
|
|
@@ -137,12 +104,31 @@ abstract class FileDownloader implements DownloaderInterface
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Extract file to directory
|
|
|
+ * Gets file name for specific package
|
|
|
*
|
|
|
- * @param string $file Extracted file
|
|
|
- * @param string $path Directory
|
|
|
+ * @param PackageInterface $package package instance
|
|
|
+ * @param string $path download path
|
|
|
+ * @return string file name
|
|
|
+ */
|
|
|
+ protected function getFileName(PackageInterface $package, $path)
|
|
|
+ {
|
|
|
+ return $path.'/'.pathinfo($package->getDistUrl(), PATHINFO_BASENAME);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Process the download url
|
|
|
+ *
|
|
|
+ * @param string $url download url
|
|
|
+ * @return string url
|
|
|
*
|
|
|
- * @throws \UnexpectedValueException If can not extract downloaded file to path
|
|
|
+ * @throws \RuntimeException If any problem with the url
|
|
|
*/
|
|
|
- protected abstract function extract($file, $path);
|
|
|
+ protected function processUrl($url)
|
|
|
+ {
|
|
|
+ if (!extension_loaded('openssl') && (0 === strpos($url, 'https:') || 0 === strpos($url, 'http://github.com'))) {
|
|
|
+ throw new \RuntimeException('You must enable the openssl extension to download files via https');
|
|
|
+ }
|
|
|
+
|
|
|
+ return $url;
|
|
|
+ }
|
|
|
}
|