1
0
Fork 0

Make use of new dist properties, refactored ZipDownloader

pull/8/merge
Jordi Boggiano 2011-07-06 21:06:52 +02:00
parent 64978d40ba
commit 49c3446ac1
8 changed files with 88 additions and 25 deletions

View File

@ -23,6 +23,9 @@ class InstallCommand
{
$this->composer = $composer;
// TODO this needs a parameter to enable installing from source (i.e. git clone, instead of downloading archives)
$sourceInstall = false;
$config = $this->loadConfig();
foreach ($config['repositories'] as $name => $spec) {
@ -50,11 +53,25 @@ class InstallCommand
if (!isset($package)) {
throw new \UnexpectedValueException('Could not find package '.$name.' in any of your repositories');
}
echo '> Installing '.$package->getName().PHP_EOL;
if ($sourceInstall) {
// TODO
} else {
if ($package->getDistType()) {
$downloader = $composer->getDownloader($package->getDistType());
$type = 'dist';
} elseif ($package->getSourceType()) {
echo 'Package '.$package->getName().' has no dist url, installing from source instead.';
$downloader = $composer->getDownloader($package->getSourceType());
$installer = $composer->getInstaller($package->getType());
$lock[$name] = $installer->install($package, $downloader);
echo '> '.$name.' installed'.PHP_EOL;
$type = 'source';
} else {
throw new \UnexpectedValueException('Package '.$package->getName().' has no source or dist URL.');
}
$installer = $composer->getInstaller($package->getType());
$lock[$name] = $installer->install($package, $downloader, $type);
}
}
echo '> Done'.PHP_EOL;
$this->storeLockFile($lock);
}

View File

@ -26,7 +26,7 @@ class GitDownloader
$this->clone = $clone;
}
public function download(PackageInterface $package, $path)
public function download(PackageInterface $package, $path, $url, $checksum = null)
{
if (!is_dir($path)) {
if (file_exists($path)) {
@ -37,9 +37,9 @@ class GitDownloader
}
}
if ($this->clone) {
system('git clone '.escapeshellarg($package->getSourceUrl()).' -b master '.escapeshellarg($path.'/'.$package->getName()));
system('git clone '.escapeshellarg($url).' -b master '.escapeshellarg($path.'/'.$package->getName()));
} else {
system('git archive --format=tar --prefix='.escapeshellarg($package->getName()).' --remote='.escapeshellarg($package->getSourceUrl()).' master | tar -xf -');
system('git archive --format=tar --prefix='.escapeshellarg($package->getName()).' --remote='.escapeshellarg($url).' master | tar -xf -');
}
}
}

View File

@ -20,7 +20,7 @@ use Composer\Package\PackageInterface;
*/
class PearDownloader
{
public function download(PackageInterface $package, $path)
public function download(PackageInterface $package, $path, $url, $checksum = null)
{
$targetPath = $path . "/" . $package->getName();
if (!is_dir($targetPath)) {
@ -35,17 +35,20 @@ class PearDownloader
$cwd = getcwd();
chdir($targetPath);
$source = $package->getSourceUrl();
$tarName = basename($source);
$tarName = basename($url);
echo 'Downloading '.$source.' to '.$targetPath.'/'.$tarName.PHP_EOL;
copy($package->getSourceUrl(), './'.$tarName);
echo 'Downloading '.$url.' to '.$targetPath.'/'.$tarName.PHP_EOL;
copy($url, './'.$tarName);
if (!file_exists($tarName)) {
throw new \UnexpectedValueException($package->getName().' could not be saved into '.$tarName.', make sure the'
.' directory is writable and you have internet connectivity.');
}
if ($checksum && hash_file('sha1', './'.$tarName) !== $checksum) {
throw new \UnexpectedValueException('The checksum verification failed for the '.$package->getName().' archive (downloaded from '.$url.'). Installation aborted.');
}
echo 'Unpacking archive'.PHP_EOL;
exec('tar -xzf "'.escapeshellarg($tarName).'"');

View File

@ -19,27 +19,58 @@ use Composer\Package\PackageInterface;
*/
class ZipDownloader
{
public function download(PackageInterface $package, $path)
public function download(PackageInterface $package, $path, $url, $checksum = null)
{
if (!class_exists('ZipArchive')) {
throw new \UnexpectedValueException('You need the zip extension enabled to use the ZipDownloader');
}
$tmpName = tempnam(sys_get_temp_dir(), '');
copy($package->getSourceUrl(), $tmpName);
$targetPath = $path . "/" . $package->getName();
if (!is_dir($targetPath)) {
if (file_exists($targetPath)) {
throw new \UnexpectedValueException($targetPath.' exists and is not a directory.');
}
if (!mkdir($targetPath, 0777, true)) {
throw new \UnexpectedValueException($targetPath.' does not exist and could not be created.');
}
}
if (!file_exists($tmpName)) {
throw new \UnexpectedValueException($path.' could not be saved into '.$tmpName.', make sure the'
$zipName = $targetPath.'/'.basename($url, '.zip').'.zip';
echo 'Downloading '.$url.' to '.$zipName.PHP_EOL;
copy($url, $zipName);
if (!file_exists($zipName)) {
throw new \UnexpectedValueException($path.' could not be saved into '.$zipName.', make sure the'
.' directory is writable and you have internet connectivity.');
}
$zipArchive = new ZipArchive();
if ($checksum && hash_file('sha1', $zipName) !== $checksum) {
throw new \UnexpectedValueException('The checksum verification failed for the '.$package->getName().' archive (downloaded from '.$url.'). Installation aborted.');
}
if (true === ($retval = $zipArchive->open($tmpName))) {
$zipArchive->extractTo($path.'/'.$package->getName());
$zipArchive = new \ZipArchive();
echo 'Unpacking archive'.PHP_EOL;
if (true === ($retval = $zipArchive->open($zipName))) {
$targetPath = $path.'/'.$package->getName();
$zipArchive->extractTo($targetPath);
$zipArchive->close();
echo 'Cleaning up'.PHP_EOL;
unlink($zipName);
if (false !== strpos($url, '//github.com/')) {
$contentDir = glob($targetPath.'/*');
if (1 === count($contentDir)) {
$contentDir = $contentDir[0];
foreach (array_merge(glob($contentDir.'/.*'), glob($contentDir.'/*')) as $file) {
if (trim(basename($file), '.')) {
rename($file, $targetPath.'/'.basename($file));
}
}
rmdir($contentDir);
}
}
} else {
throw new \UnexpectedValueException($tmpName.' is not a valid zip archive, got error code '.$retval);
throw new \UnexpectedValueException($zipName.' is not a valid zip archive, got error code '.$retval);
}
}
}

View File

@ -26,9 +26,15 @@ class LibraryInstaller
$this->dir = $dir;
}
public function install(PackageInterface $package, $downloader)
public function install(PackageInterface $package, $downloader, $type)
{
$downloader->download($package, $this->dir);
if ($type === 'dist') {
$downloader->download($package, $this->dir, $package->getDistUrl(), $package->getDistSha1Checksum());
} elseif ($type === 'source') {
$downloader->download($package, $this->dir, $package->getSourceUrl());
} else {
throw new \InvalidArgumentException('Type must be one of (dist, source), '.$type.' given.');
}
return array('version' => $package->getVersion());
}
}

View File

@ -51,6 +51,10 @@ class ComposerRepository extends ArrayRepository
$package->setSourceType($rev['source']['type']);
$package->setSourceUrl($rev['source']['url']);
$package->setDistType($rev['dist']['type']);
$package->setDistUrl($rev['dist']['url']);
$package->setDistSha1Checksum($rev['dist']['shasum']);
if (isset($rev['license'])) {
$package->setLicense($rev['license']);
}

View File

@ -18,6 +18,8 @@ use Composer\Package\Link;
use Composer\Package\LinkConstraint\VersionConstraint;
/**
* FIXME This is majorly broken and incomplete, it was an experiment
*
* @author Jordi Boggiano <j.boggiano@seld.be>
*/
class GitRepository extends ArrayRepository

View File

@ -74,8 +74,8 @@ class PearRepository extends ArrayRepository
$version = BasePackage::parseVersion($pearVersion);
$package = new MemoryPackage($packageName, $version['version'], $version['type']);
$package->setSourceType('pear');
$package->setSourceUrl($this->url.'/get/'.$packageName.'-'.$pearVersion.".tgz");
$package->setDistType('pear');
$package->setDistUrl($this->url.'/get/'.$packageName.'-'.$pearVersion.".tgz");
$depsLink = $releaseLink . "/deps.".$pearVersion.".txt";
$deps = file_get_contents($depsLink);