diff --git a/doc/04-schema.md b/doc/04-schema.md index 71c93a9c9..7b67f4114 100644 --- a/doc/04-schema.md +++ b/doc/04-schema.md @@ -310,7 +310,7 @@ Example: All links are optional fields. `require` and `require-dev` additionally support _stability flags_ ([root-only](04-schema.md#root-package)). -They take the form "_constraint_@_stability flag_". +They take the form "_constraint_@_stability flag_". These allow you to further restrict or expand the stability of a package beyond the scope of the [minimum-stability](#minimum-stability) setting. You can apply them to a constraint, or apply them to an empty _constraint_ if you want to @@ -770,8 +770,6 @@ The following repository types are supported: using the `options` parameter. * **vcs:** The version control system repository can fetch packages from git, svn, fossil and hg repositories. -* **pear:** With this you can import any pear repository into your Composer - project. * **package:** If you depend on a project that does not have any support for composer whatsoever you can define the package inline using a `package` repository. You basically inline the `composer.json` object. @@ -800,10 +798,6 @@ Example: "type": "vcs", "url": "https://github.com/Seldaek/monolog" }, - { - "type": "pear", - "url": "https://pear2.php.net" - }, { "type": "package", "package": { diff --git a/doc/05-repositories.md b/doc/05-repositories.md index 3d0164bee..7a9cc8b46 100644 --- a/doc/05-repositories.md +++ b/doc/05-repositories.md @@ -395,92 +395,6 @@ for this server will be overwritten. To change this behavior by setting the } ``` -### PEAR - -It is possible to install packages from any PEAR channel by using the `pear` -repository. Composer will prefix all package names with `pear-{channelName}/` -to avoid conflicts. All packages are also aliased with prefix -`pear-{channelAlias}/`. - -Example using `pear2.php.net`: - -```json -{ - "repositories": [ - { - "type": "pear", - "url": "https://pear2.php.net" - } - ], - "require": { - "pear-pear2.php.net/PEAR2_Text_Markdown": "*", - "pear-pear2/PEAR2_HTTP_Request": "*" - } -} -``` - -In this case the short name of the channel is `pear2`, so the -`PEAR2_HTTP_Request` package name becomes `pear-pear2/PEAR2_HTTP_Request`. - -> **Note:** The `pear` repository requires doing quite a few requests per -> package, so this may considerably slow down the installation process. - -#### Custom vendor alias - -It is possible to alias PEAR channel packages with a custom vendor name. - -Example: - -Suppose you have a private PEAR repository and wish to use Composer to -incorporate dependencies from a VCS. Your PEAR repository contains the -following packages: - - * `BasePackage` - * `IntermediatePackage`, which depends on `BasePackage` - * `TopLevelPackage1` and `TopLevelPackage2` which both depend - on `IntermediatePackage` - -Without a vendor alias, Composer will use the PEAR channel name as the -vendor portion of the package name: - - * `pear-pear.foobar.repo/BasePackage` - * `pear-pear.foobar.repo/IntermediatePackage` - * `pear-pear.foobar.repo/TopLevelPackage1` - * `pear-pear.foobar.repo/TopLevelPackage2` - -Suppose at a later time you wish to migrate your PEAR packages to a -Composer repository and naming scheme, and adopt the vendor name of `foobar`. -Projects using your PEAR packages would not see the updated packages, since -they have a different vendor name (`foobar/IntermediatePackage` vs -`pear-pear.foobar.repo/IntermediatePackage`). - -By specifying `vendor-alias` for the PEAR repository from the start, you can -avoid this scenario and future-proof your package names. - -To illustrate, the following example would get the `BasePackage`, -`TopLevelPackage1`, and `TopLevelPackage2` packages from your PEAR repository -and `IntermediatePackage` from a Github repository: - -```json -{ - "repositories": [ - { - "type": "git", - "url": "https://github.com/foobar/intermediate.git" - }, - { - "type": "pear", - "url": "http://pear.foobar.repo", - "vendor-alias": "foobar" - } - ], - "require": { - "foobar/TopLevelPackage1": "*", - "foobar/TopLevelPackage2": "*" - } -} -``` - ### Package If you want to use a project that does not support Composer through any of the diff --git a/src/Composer/Downloader/PearPackageExtractor.php b/src/Composer/Downloader/PearPackageExtractor.php deleted file mode 100644 index 5eaf3edcd..000000000 --- a/src/Composer/Downloader/PearPackageExtractor.php +++ /dev/null @@ -1,266 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Downloader; - -use Composer\Util\Filesystem; - -/** - * Extractor for pear packages. - * - * Composer cannot rely on tar files structure when place it inside package target dir. Correct source files - * disposition must be read from package.xml - * This extract pear package source files to target dir. - * - * @author Alexey Prilipko - */ -class PearPackageExtractor -{ - private static $rolesWithoutPackageNamePrefix = array('php', 'script', 'www'); - /** @var Filesystem */ - private $filesystem; - private $file; - - public function __construct($file) - { - if (!is_file($file)) { - throw new \UnexpectedValueException('PEAR package file is not found at '.$file); - } - - $this->filesystem = new Filesystem(); - $this->file = $file; - } - - /** - * Installs PEAR source files according to package.xml definitions and removes extracted files - * - * @param string $target target install location. all source installation would be performed relative to target path. - * @param array $roles types of files to install. default role for PEAR source files are 'php'. - * @param array $vars used for replacement tasks - * @throws \RuntimeException - * @throws \UnexpectedValueException - */ - public function extractTo($target, array $roles = array('php' => '/', 'script' => '/bin'), $vars = array()) - { - $extractionPath = $target.'/tarball'; - - try { - $archive = new \PharData($this->file); - $archive->extractTo($extractionPath, null, true); - - if (!is_file($this->combine($extractionPath, '/package.xml'))) { - throw new \RuntimeException('Invalid PEAR package. It must contain package.xml file.'); - } - - $fileCopyActions = $this->buildCopyActions($extractionPath, $roles, $vars); - $this->copyFiles($fileCopyActions, $extractionPath, $target, $roles, $vars); - $this->filesystem->removeDirectory($extractionPath); - } catch (\Exception $exception) { - throw new \UnexpectedValueException(sprintf('Failed to extract PEAR package %s to %s. Reason: %s', $this->file, $target, $exception->getMessage()), 0, $exception); - } - } - - /** - * Perform copy actions on files - * - * @param array $files array of copy actions ('from', 'to') with relative paths - * @param string $source path to source dir. - * @param string $target path to destination dir - * @param array $roles array [role => roleRoot] relative root for files having that role - * @param array $vars list of values can be used for replacement tasks - */ - private function copyFiles($files, $source, $target, $roles, $vars) - { - foreach ($files as $file) { - $from = $this->combine($source, $file['from']); - $to = $this->combine($target, $roles[$file['role']]); - $to = $this->combine($to, $file['to']); - $tasks = $file['tasks']; - $this->copyFile($from, $to, $tasks, $vars); - } - } - - private function copyFile($from, $to, $tasks, $vars) - { - if (!is_file($from)) { - throw new \RuntimeException('Invalid PEAR package. package.xml defines file that is not located inside tarball.'); - } - - $this->filesystem->ensureDirectoryExists(dirname($to)); - - if (0 == count($tasks)) { - $copied = copy($from, $to); - } else { - $content = file_get_contents($from); - $replacements = array(); - foreach ($tasks as $task) { - $pattern = $task['from']; - $varName = $task['to']; - if (isset($vars[$varName])) { - if ($varName === 'php_bin' && false === strpos($to, '.bat')) { - $replacements[$pattern] = preg_replace('{\.bat$}', '', $vars[$varName]); - } else { - $replacements[$pattern] = $vars[$varName]; - } - } - } - $content = strtr($content, $replacements); - - $copied = file_put_contents($to, $content); - } - - if (false === $copied) { - throw new \RuntimeException(sprintf('Failed to copy %s to %s', $from, $to)); - } - } - - /** - * Builds list of copy and list of remove actions that would transform extracted PEAR tarball into installed package. - * - * @param string $source string path to extracted files - * @param array $roles array [role => roleRoot] relative root for files having that role - * @param array $vars list of values can be used for replacement tasks - * @throws \RuntimeException - * @return array array of 'source' => 'target', where source is location of file in the tarball (relative to source - * path, and target is destination of file (also relative to $source path) - */ - private function buildCopyActions($source, array $roles, $vars) - { - /** @var \SimpleXmlElement $package */ - $package = simplexml_load_string(file_get_contents($this->combine($source, 'package.xml'))); - if (false === $package) { - throw new \RuntimeException('Package definition file is not valid.'); - } - - $packageSchemaVersion = $package['version']; - if ('1.0' == $packageSchemaVersion) { - $children = $package->release->filelist->children(); - $packageName = (string) $package->name; - $packageVersion = (string) $package->release->version; - $sourceDir = $packageName . '-' . $packageVersion; - $result = $this->buildSourceList10($children, $roles, $sourceDir, '', null, $packageName); - } elseif ('2.0' == $packageSchemaVersion || '2.1' == $packageSchemaVersion) { - $children = $package->contents->children(); - $packageName = (string) $package->name; - $packageVersion = (string) $package->version->release; - $sourceDir = $packageName . '-' . $packageVersion; - $result = $this->buildSourceList20($children, $roles, $sourceDir, '', null, $packageName); - - $namespaces = $package->getNamespaces(); - $package->registerXPathNamespace('ns', $namespaces['']); - $releaseNodes = $package->xpath('ns:phprelease'); - $this->applyRelease($result, $releaseNodes, $vars); - } else { - throw new \RuntimeException('Unsupported schema version of package definition file.'); - } - - return $result; - } - - private function applyRelease(&$actions, $releaseNodes, $vars) - { - foreach ($releaseNodes as $releaseNode) { - $requiredOs = $releaseNode->installconditions && $releaseNode->installconditions->os && $releaseNode->installconditions->os->name ? (string) $releaseNode->installconditions->os->name : ''; - if ($requiredOs && $vars['os'] != $requiredOs) { - continue; - } - - if ($releaseNode->filelist) { - foreach ($releaseNode->filelist->children() as $action) { - if ('install' == $action->getName()) { - $name = (string) $action['name']; - $as = (string) $action['as']; - if (isset($actions[$name])) { - $actions[$name]['to'] = $as; - } - } elseif ('ignore' == $action->getName()) { - $name = (string) $action['name']; - unset($actions[$name]); - } else { - // unknown action - } - } - } - break; - } - } - - private function buildSourceList10($children, $targetRoles, $source, $target, $role, $packageName) - { - $result = array(); - - // enumerating files - foreach ($children as $child) { - /** @var $child \SimpleXMLElement */ - if ($child->getName() == 'dir') { - $dirSource = $this->combine($source, (string) $child['name']); - $dirTarget = $child['baseinstalldir'] ?: $target; - $dirRole = $child['role'] ?: $role; - $dirFiles = $this->buildSourceList10($child->children(), $targetRoles, $dirSource, $dirTarget, $dirRole, $packageName); - $result = array_merge($result, $dirFiles); - } elseif ($child->getName() == 'file') { - $fileRole = (string) $child['role'] ?: $role; - if (isset($targetRoles[$fileRole])) { - $fileName = (string) ($child['name'] ?: $child[0]); // $child[0] means text content - $fileSource = $this->combine($source, $fileName); - $fileTarget = $this->combine((string) $child['baseinstalldir'] ?: $target, $fileName); - if (!in_array($fileRole, self::$rolesWithoutPackageNamePrefix)) { - $fileTarget = $packageName . '/' . $fileTarget; - } - $result[(string) $child['name']] = array('from' => $fileSource, 'to' => $fileTarget, 'role' => $fileRole, 'tasks' => array()); - } - } - } - - return $result; - } - - private function buildSourceList20($children, $targetRoles, $source, $target, $role, $packageName) - { - $result = array(); - - // enumerating files - foreach ($children as $child) { - /** @var $child \SimpleXMLElement */ - if ('dir' == $child->getName()) { - $dirSource = $this->combine($source, $child['name']); - $dirTarget = $child['baseinstalldir'] ?: $target; - $dirRole = $child['role'] ?: $role; - $dirFiles = $this->buildSourceList20($child->children(), $targetRoles, $dirSource, $dirTarget, $dirRole, $packageName); - $result = array_merge($result, $dirFiles); - } elseif ('file' == $child->getName()) { - $fileRole = (string) $child['role'] ?: $role; - if (isset($targetRoles[$fileRole])) { - $fileSource = $this->combine($source, (string) $child['name']); - $fileTarget = $this->combine((string) ($child['baseinstalldir'] ?: $target), (string) $child['name']); - $fileTasks = array(); - foreach ($child->children('http://pear.php.net/dtd/tasks-1.0') as $taskNode) { - if ('replace' == $taskNode->getName()) { - $fileTasks[] = array('from' => (string) $taskNode->attributes()->from, 'to' => (string) $taskNode->attributes()->to); - } - } - if (!in_array($fileRole, self::$rolesWithoutPackageNamePrefix)) { - $fileTarget = $packageName . '/' . $fileTarget; - } - $result[(string) $child['name']] = array('from' => $fileSource, 'to' => $fileTarget, 'role' => $fileRole, 'tasks' => $fileTasks); - } - } - } - - return $result; - } - - private function combine($left, $right) - { - return rtrim($left, '/') . '/' . ltrim($right, '/'); - } -} diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index f50050604..85b958370 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -545,7 +545,6 @@ class Factory protected function createDefaultInstallers(Installer\InstallationManager $im, Composer $composer, IOInterface $io) { $im->addInstaller(new Installer\LibraryInstaller($io, $composer, null)); - $im->addInstaller(new Installer\PearInstaller($io, $composer, 'pear-library')); $im->addInstaller(new Installer\PluginInstaller($io, $composer)); $im->addInstaller(new Installer\MetapackageInstaller($io)); } diff --git a/src/Composer/Installer/PearBinaryInstaller.php b/src/Composer/Installer/PearBinaryInstaller.php deleted file mode 100644 index f0d6783bb..000000000 --- a/src/Composer/Installer/PearBinaryInstaller.php +++ /dev/null @@ -1,144 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Installer; - -use Composer\IO\IOInterface; -use Composer\Package\PackageInterface; -use Composer\Util\Filesystem; -use Composer\Util\ProcessExecutor; - -/** - * Utility to handle installation of package "bin"/binaries for PEAR packages - * - * @author Jordi Boggiano - */ -class PearBinaryInstaller extends BinaryInstaller -{ - private $installer; - private $vendorDir; - - /** - * @param IOInterface $io - * @param string $binDir - * @param string $vendorDir - * @param string $binCompat - * @param Filesystem $filesystem - * @param PearInstaller $installer - */ - public function __construct(IOInterface $io, $binDir, $vendorDir, $binCompat, Filesystem $filesystem, PearInstaller $installer) - { - parent::__construct($io, $binDir, $binCompat, $filesystem); - $this->installer = $installer; - $this->vendorDir = $vendorDir; - } - - protected function getBinaries(PackageInterface $package) - { - $binariesPath = $this->installer->getInstallPath($package) . '/bin/'; - $binaries = array(); - if (file_exists($binariesPath)) { - foreach (new \FilesystemIterator($binariesPath, \FilesystemIterator::KEY_AS_FILENAME | \FilesystemIterator::CURRENT_AS_FILEINFO) as $fileName => $value) { - if (!$value->isDir()) { - $binaries[] = 'bin/'.$fileName; - } - } - } - - return $binaries; - } - - protected function initializeBinDir() - { - parent::initializeBinDir(); - file_put_contents($this->binDir.'/composer-php', $this->generateUnixyPhpProxyCode()); - @chmod($this->binDir.'/composer-php', 0777 & ~umask()); - file_put_contents($this->binDir.'/composer-php.bat', $this->generateWindowsPhpProxyCode()); - @chmod($this->binDir.'/composer-php.bat', 0777 & ~umask()); - } - - protected function generateWindowsProxyCode($bin, $link) - { - $binPath = $this->filesystem->findShortestPath($link, $bin); - if ('.bat' === substr($bin, -4)) { - $caller = 'call'; - } else { - $handle = fopen($bin, 'r'); - $line = fgets($handle); - fclose($handle); - if (preg_match('{^#!/(?:usr/bin/env )?(?:[^/]+/)*(.+)$}m', $line, $match)) { - $caller = trim($match[1]); - } else { - $caller = 'php'; - } - - if ($caller === 'php') { - return "@echo off\r\n". - "pushd .\r\n". - "cd %~dp0\r\n". - "set PHP_PROXY=%CD%\\composer-php.bat\r\n". - "cd ".ProcessExecutor::escape(dirname($binPath))."\r\n". - "set BIN_TARGET=%CD%\\".basename($binPath)."\r\n". - "popd\r\n". - "%PHP_PROXY% \"%BIN_TARGET%\" %*\r\n"; - } - } - - return "@echo off\r\n". - "pushd .\r\n". - "cd %~dp0\r\n". - "cd ".ProcessExecutor::escape(dirname($binPath))."\r\n". - "set BIN_TARGET=%CD%\\".basename($binPath)."\r\n". - "popd\r\n". - $caller." \"%BIN_TARGET%\" %*\r\n"; - } - - private function generateWindowsPhpProxyCode() - { - $binToVendor = $this->filesystem->findShortestPath($this->binDir, $this->vendorDir, true); - - return - "@echo off\r\n" . - "setlocal enabledelayedexpansion\r\n" . - "set BIN_DIR=%~dp0\r\n" . - "set VENDOR_DIR=%BIN_DIR%\\".$binToVendor."\r\n" . - "set DIRS=.\r\n" . - "FOR /D %%V IN (%VENDOR_DIR%\\*) DO (\r\n" . - " FOR /D %%P IN (%%V\\*) DO (\r\n" . - " set DIRS=!DIRS!;%%~fP\r\n" . - " )\r\n" . - ")\r\n" . - "php.exe -d include_path=!DIRS! %*\r\n"; - } - - private function generateUnixyPhpProxyCode() - { - $binToVendor = $this->filesystem->findShortestPath($this->binDir, $this->vendorDir, true); - - return - "#!/usr/bin/env sh\n". - "SRC_DIR=`pwd`\n". - "BIN_DIR=`dirname $0`\n". - "VENDOR_DIR=\$BIN_DIR/".escapeshellarg($binToVendor)."\n". - "DIRS=\"\"\n". - "for vendor in \$VENDOR_DIR/*; do\n". - " if [ -d \"\$vendor\" ]; then\n". - " for package in \$vendor/*; do\n". - " if [ -d \"\$package\" ]; then\n". - " DIRS=\"\${DIRS}:\${package}\"\n". - " fi\n". - " done\n". - " fi\n". - "done\n". - "php -d include_path=\".\$DIRS\" $@\n"; - } -} diff --git a/src/Composer/Installer/PearInstaller.php b/src/Composer/Installer/PearInstaller.php deleted file mode 100644 index b4aa465ed..000000000 --- a/src/Composer/Installer/PearInstaller.php +++ /dev/null @@ -1,84 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Installer; - -use Composer\IO\IOInterface; -use Composer\Composer; -use Composer\Downloader\PearPackageExtractor; -use Composer\Repository\InstalledRepositoryInterface; -use Composer\Package\PackageInterface; -use Composer\Util\Platform; -use Composer\Util\Filesystem; - -/** - * Package installation manager. - * - * @author Jordi Boggiano - * @author Konstantin Kudryashov - */ -class PearInstaller extends LibraryInstaller -{ - /** - * Initializes library installer. - * - * @param IOInterface $io io instance - * @param Composer $composer - * @param string $type package type that this installer handles - */ - public function __construct(IOInterface $io, Composer $composer, $type = 'pear-library') - { - $filesystem = new Filesystem(); - $binaryInstaller = new PearBinaryInstaller($io, rtrim($composer->getConfig()->get('bin-dir'), '/'), rtrim($composer->getConfig()->get('vendor-dir'), '/'), $composer->getConfig()->get('bin-compat'), $filesystem, $this); - - parent::__construct($io, $composer, $type, $filesystem, $binaryInstaller); - } - - /** - * {@inheritDoc} - */ - public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) - { - $this->uninstall($repo, $initial); - $this->install($repo, $target); - } - - protected function installCode(PackageInterface $package) - { - parent::installCode($package); - - $isWindows = Platform::isWindows(); - $php_bin = $this->binDir . ($isWindows ? '/composer-php.bat' : '/composer-php'); - - if (!$isWindows) { - $php_bin = '/usr/bin/env ' . $php_bin; - } - - $installPath = $this->getInstallPath($package); - $vars = array( - 'os' => $isWindows ? 'windows' : 'linux', - 'php_bin' => $php_bin, - 'pear_php' => $installPath, - 'php_dir' => $installPath, - 'bin_dir' => $installPath . '/bin', - 'data_dir' => $installPath . '/data', - 'version' => $package->getPrettyVersion(), - ); - - $packageArchive = $this->getInstallPath($package).'/'.pathinfo($package->getDistUrl(), PATHINFO_BASENAME); - $pearExtractor = new PearPackageExtractor($packageArchive); - $pearExtractor->extractTo($this->getInstallPath($package), array('php' => '/', 'script' => '/bin', 'data' => '/data'), $vars); - - $this->io->writeError(' Cleaning up', true, IOInterface::VERBOSE); - $this->filesystem->unlink($packageArchive); - } -} diff --git a/src/Composer/Repository/Pear/BaseChannelReader.php b/src/Composer/Repository/Pear/BaseChannelReader.php deleted file mode 100644 index 9b9acf2f2..000000000 --- a/src/Composer/Repository/Pear/BaseChannelReader.php +++ /dev/null @@ -1,86 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -use Composer\Util\HttpDownloader; - -/** - * Base PEAR Channel reader. - * - * Provides xml namespaces and red - * - * @author Alexey Prilipko - */ -abstract class BaseChannelReader -{ - /** - * PEAR REST Interface namespaces - */ - const CHANNEL_NS = 'http://pear.php.net/channel-1.0'; - const ALL_CATEGORIES_NS = 'http://pear.php.net/dtd/rest.allcategories'; - const CATEGORY_PACKAGES_INFO_NS = 'http://pear.php.net/dtd/rest.categorypackageinfo'; - const ALL_PACKAGES_NS = 'http://pear.php.net/dtd/rest.allpackages'; - const ALL_RELEASES_NS = 'http://pear.php.net/dtd/rest.allreleases'; - const PACKAGE_INFO_NS = 'http://pear.php.net/dtd/rest.package'; - - /** @var HttpDownloader */ - private $httpDownloader; - - protected function __construct(HttpDownloader $httpDownloader) - { - $this->httpDownloader = $httpDownloader; - } - - /** - * Read content from remote filesystem. - * - * @param string $origin server - * @param string $path relative path to content - * @throws \UnexpectedValueException - * @return string - */ - protected function requestContent($origin, $path) - { - $url = rtrim($origin, '/') . '/' . ltrim($path, '/'); - try { - $content = $this->httpDownloader->get($url)->getBody(); - } catch (\Exception $e) { - throw new \UnexpectedValueException('The PEAR channel at ' . $url . ' did not respond.', 0, $e); - } - if (!$content) { - throw new \UnexpectedValueException('The PEAR channel at ' . $url . ' did not respond.'); - } - - return str_replace('http://pear.php.net/rest/', 'https://pear.php.net/rest/', $content); - } - - /** - * Read xml content from remote filesystem - * - * @param string $origin server - * @param string $path relative path to content - * @throws \UnexpectedValueException - * @return \SimpleXMLElement - */ - protected function requestXml($origin, $path) - { - // http://components.ez.no/p/packages.xml is malformed. to read it we must ignore parsing errors. - $xml = simplexml_load_string($this->requestContent($origin, $path), "SimpleXMLElement", LIBXML_NOERROR); - - if (false === $xml) { - throw new \UnexpectedValueException(sprintf('The PEAR channel at ' . $origin . ' is broken. (Invalid XML at file `%s`)', $path)); - } - - return $xml; - } -} diff --git a/src/Composer/Repository/Pear/ChannelInfo.php b/src/Composer/Repository/Pear/ChannelInfo.php deleted file mode 100644 index 69e33b887..000000000 --- a/src/Composer/Repository/Pear/ChannelInfo.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -/** - * PEAR channel info - * - * @author Alexey Prilipko - */ -class ChannelInfo -{ - private $name; - private $alias; - private $packages; - - /** - * @param string $name - * @param string $alias - * @param PackageInfo[] $packages - */ - public function __construct($name, $alias, array $packages) - { - $this->name = $name; - $this->alias = $alias; - $this->packages = $packages; - } - - /** - * Name of the channel - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Alias of the channel - * - * @return string - */ - public function getAlias() - { - return $this->alias; - } - - /** - * List of channel packages - * - * @return PackageInfo[] - */ - public function getPackages() - { - return $this->packages; - } -} diff --git a/src/Composer/Repository/Pear/ChannelReader.php b/src/Composer/Repository/Pear/ChannelReader.php deleted file mode 100644 index 14d48ad86..000000000 --- a/src/Composer/Repository/Pear/ChannelReader.php +++ /dev/null @@ -1,101 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -use Composer\Util\HttpDownloader; - -/** - * PEAR Channel package reader. - * - * Reads channel packages info from and builds Package's - * - * @author Alexey Prilipko - */ -class ChannelReader extends BaseChannelReader -{ - /** @var array of ('xpath test' => 'rest implementation') */ - private $readerMap; - - public function __construct(HttpDownloader $httpDownloader) - { - parent::__construct($httpDownloader); - - $rest10reader = new ChannelRest10Reader($httpDownloader); - $rest11reader = new ChannelRest11Reader($httpDownloader); - - $this->readerMap = array( - 'REST1.3' => $rest11reader, - 'REST1.2' => $rest11reader, - 'REST1.1' => $rest11reader, - 'REST1.0' => $rest10reader, - ); - } - - /** - * Reads PEAR channel through REST interface and builds list of packages - * - * @param string $url PEAR Channel url - * @throws \UnexpectedValueException - * @return ChannelInfo - */ - public function read($url) - { - $xml = $this->requestXml($url, "/channel.xml"); - - $channelName = (string) $xml->name; - $channelAlias = (string) $xml->suggestedalias; - - $supportedVersions = array_keys($this->readerMap); - $selectedRestVersion = $this->selectRestVersion($xml, $supportedVersions); - if (!$selectedRestVersion) { - throw new \UnexpectedValueException(sprintf('PEAR repository %s does not supports any of %s protocols.', $url, implode(', ', $supportedVersions))); - } - - $reader = $this->readerMap[$selectedRestVersion['version']]; - $packageDefinitions = $reader->read($selectedRestVersion['baseUrl']); - - return new ChannelInfo($channelName, $channelAlias, $packageDefinitions); - } - - /** - * Reads channel supported REST interfaces and selects one of them - * - * @param \SimpleXMLElement $channelXml - * @param string[] $supportedVersions supported PEAR REST protocols - * @return array|null hash with selected version and baseUrl - */ - private function selectRestVersion($channelXml, $supportedVersions) - { - $channelXml->registerXPathNamespace('ns', self::CHANNEL_NS); - - foreach ($supportedVersions as $version) { - $xpathTest = "ns:servers/ns:*/ns:rest/ns:baseurl[@type='{$version}']"; - $testResult = $channelXml->xpath($xpathTest); - - foreach ($testResult as $result) { - // Choose first https:// option. - $result = (string) $result; - if (preg_match('{^https://}i', $result)) { - return array('version' => $version, 'baseUrl' => $result); - } - } - - // Fallback to non-https if it does not exist. - if (count($testResult) > 0) { - return array('version' => $version, 'baseUrl' => (string) $testResult[0]); - } - } - - return null; - } -} diff --git a/src/Composer/Repository/Pear/ChannelRest10Reader.php b/src/Composer/Repository/Pear/ChannelRest10Reader.php deleted file mode 100644 index 9d14b71ea..000000000 --- a/src/Composer/Repository/Pear/ChannelRest10Reader.php +++ /dev/null @@ -1,165 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -use Composer\Downloader\TransportException; -use Composer\Util\HttpDownloader; - -/** - * Read PEAR packages using REST 1.0 interface - * - * At version 1.0 package descriptions read from: - * {baseUrl}/p/packages.xml - * {baseUrl}/p/{package}/info.xml - * {baseUrl}/p/{package}/allreleases.xml - * {baseUrl}/p/{package}/deps.{version}.txt - * - * @author Alexey Prilipko - */ -class ChannelRest10Reader extends BaseChannelReader -{ - private $dependencyReader; - - public function __construct(HttpDownloader $httpDownloader) - { - parent::__construct($httpDownloader); - - $this->dependencyReader = new PackageDependencyParser(); - } - - /** - * Reads package descriptions using PEAR Rest 1.0 interface - * - * @param string $baseUrl base Url interface - * - * @return PackageInfo[] - */ - public function read($baseUrl) - { - return $this->readPackages($baseUrl); - } - - /** - * Read list of packages from - * {baseUrl}/p/packages.xml - * - * @param string $baseUrl - * @return PackageInfo[] - */ - private function readPackages($baseUrl) - { - $result = array(); - - $xmlPath = '/p/packages.xml'; - $xml = $this->requestXml($baseUrl, $xmlPath); - $xml->registerXPathNamespace('ns', self::ALL_PACKAGES_NS); - foreach ($xml->xpath('ns:p') as $node) { - $packageName = (string) $node; - $packageInfo = $this->readPackage($baseUrl, $packageName); - $result[] = $packageInfo; - } - - return $result; - } - - /** - * Read package info from - * {baseUrl}/p/{package}/info.xml - * - * @param string $baseUrl - * @param string $packageName - * @return PackageInfo - */ - private function readPackage($baseUrl, $packageName) - { - $xmlPath = '/p/' . strtolower($packageName) . '/info.xml'; - $xml = $this->requestXml($baseUrl, $xmlPath); - $xml->registerXPathNamespace('ns', self::PACKAGE_INFO_NS); - - $channelName = (string) $xml->c; - $packageName = (string) $xml->n; - $license = (string) $xml->l; - $shortDescription = (string) $xml->s; - $description = (string) $xml->d; - - return new PackageInfo( - $channelName, - $packageName, - $license, - $shortDescription, - $description, - $this->readPackageReleases($baseUrl, $packageName) - ); - } - - /** - * Read package releases from - * {baseUrl}/p/{package}/allreleases.xml - * - * @param string $baseUrl - * @param string $packageName - * @throws \Composer\Downloader\TransportException|\Exception - * @return ReleaseInfo[] hash array with keys as version numbers - */ - private function readPackageReleases($baseUrl, $packageName) - { - $result = array(); - - try { - $xmlPath = '/r/' . strtolower($packageName) . '/allreleases.xml'; - $xml = $this->requestXml($baseUrl, $xmlPath); - $xml->registerXPathNamespace('ns', self::ALL_RELEASES_NS); - foreach ($xml->xpath('ns:r') as $node) { - $releaseVersion = (string) $node->v; - $releaseStability = (string) $node->s; - - try { - $result[$releaseVersion] = new ReleaseInfo( - $releaseStability, - $this->readPackageReleaseDependencies($baseUrl, $packageName, $releaseVersion) - ); - } catch (TransportException $exception) { - if ($exception->getCode() != 404) { - throw $exception; - } - } - } - } catch (TransportException $exception) { - if ($exception->getCode() != 404) { - throw $exception; - } - } - - return $result; - } - - /** - * Read package dependencies from - * {baseUrl}/p/{package}/deps.{version}.txt - * - * @param string $baseUrl - * @param string $packageName - * @param string $version - * @return DependencyInfo - */ - private function readPackageReleaseDependencies($baseUrl, $packageName, $version) - { - $dependencyReader = new PackageDependencyParser(); - - $depthPath = '/r/' . strtolower($packageName) . '/deps.' . $version . '.txt'; - $content = $this->requestContent($baseUrl, $depthPath); - $dependencyArray = unserialize($content); - - return $dependencyReader->buildDependencyInfo($dependencyArray); - } -} diff --git a/src/Composer/Repository/Pear/ChannelRest11Reader.php b/src/Composer/Repository/Pear/ChannelRest11Reader.php deleted file mode 100644 index 18b1b10f3..000000000 --- a/src/Composer/Repository/Pear/ChannelRest11Reader.php +++ /dev/null @@ -1,141 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -use Composer\Util\HttpDownloader; - -/** - * Read PEAR packages using REST 1.1 interface - * - * At version 1.1 package descriptions read from: - * {baseUrl}/c/categories.xml - * {baseUrl}/c/{category}/packagesinfo.xml - * - * @author Alexey Prilipko - */ -class ChannelRest11Reader extends BaseChannelReader -{ - private $dependencyReader; - - public function __construct(HttpDownloader $httpDownloader) - { - parent::__construct($httpDownloader); - - $this->dependencyReader = new PackageDependencyParser(); - } - - /** - * Reads package descriptions using PEAR Rest 1.1 interface - * - * @param string $baseUrl base Url interface - * - * @return PackageInfo[] - */ - public function read($baseUrl) - { - return $this->readChannelPackages($baseUrl); - } - - /** - * Read list of channel categories from - * {baseUrl}/c/categories.xml - * - * @param string $baseUrl - * @return PackageInfo[] - */ - private function readChannelPackages($baseUrl) - { - $result = array(); - - $xml = $this->requestXml($baseUrl, "/c/categories.xml"); - $xml->registerXPathNamespace('ns', self::ALL_CATEGORIES_NS); - foreach ($xml->xpath('ns:c') as $node) { - $categoryName = (string) $node; - $categoryPackages = $this->readCategoryPackages($baseUrl, $categoryName); - $result = array_merge($result, $categoryPackages); - } - - return $result; - } - - /** - * Read packages from - * {baseUrl}/c/{category}/packagesinfo.xml - * - * @param string $baseUrl - * @param string $categoryName - * @return PackageInfo[] - */ - private function readCategoryPackages($baseUrl, $categoryName) - { - $result = array(); - - $categoryPath = '/c/'.urlencode($categoryName).'/packagesinfo.xml'; - $xml = $this->requestXml($baseUrl, $categoryPath); - $xml->registerXPathNamespace('ns', self::CATEGORY_PACKAGES_INFO_NS); - foreach ($xml->xpath('ns:pi') as $node) { - $packageInfo = $this->parsePackage($node); - $result[] = $packageInfo; - } - - return $result; - } - - /** - * Parses package node. - * - * @param \SimpleXMLElement $packageInfo xml element describing package - * @return PackageInfo - */ - private function parsePackage($packageInfo) - { - $packageInfo->registerXPathNamespace('ns', self::CATEGORY_PACKAGES_INFO_NS); - $channelName = (string) $packageInfo->p->c; - $packageName = (string) $packageInfo->p->n; - $license = (string) $packageInfo->p->l; - $shortDescription = (string) $packageInfo->p->s; - $description = (string) $packageInfo->p->d; - - $dependencies = array(); - foreach ($packageInfo->xpath('ns:deps') as $node) { - $dependencyVersion = (string) $node->v; - $dependencyArray = unserialize((string) $node->d); - - $dependencyInfo = $this->dependencyReader->buildDependencyInfo($dependencyArray); - - $dependencies[$dependencyVersion] = $dependencyInfo; - } - - $releases = array(); - $releasesInfo = $packageInfo->xpath('ns:a/ns:r'); - if ($releasesInfo) { - foreach ($releasesInfo as $node) { - $releaseVersion = (string) $node->v; - $releaseStability = (string) $node->s; - $releases[$releaseVersion] = new ReleaseInfo( - $releaseStability, - isset($dependencies[$releaseVersion]) ? $dependencies[$releaseVersion] : new DependencyInfo(array(), array()) - ); - } - } - - return new PackageInfo( - $channelName, - $packageName, - $license, - $shortDescription, - $description, - $releases - ); - } -} diff --git a/src/Composer/Repository/Pear/DependencyConstraint.php b/src/Composer/Repository/Pear/DependencyConstraint.php deleted file mode 100644 index 13a790026..000000000 --- a/src/Composer/Repository/Pear/DependencyConstraint.php +++ /dev/null @@ -1,60 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -/** - * PEAR package release dependency info - * - * @author Alexey Prilipko - */ -class DependencyConstraint -{ - private $type; - private $constraint; - private $channelName; - private $packageName; - - /** - * @param string $type - * @param string $constraint - * @param string $channelName - * @param string $packageName - */ - public function __construct($type, $constraint, $channelName, $packageName) - { - $this->type = $type; - $this->constraint = $constraint; - $this->channelName = $channelName; - $this->packageName = $packageName; - } - - public function getChannelName() - { - return $this->channelName; - } - - public function getConstraint() - { - return $this->constraint; - } - - public function getPackageName() - { - return $this->packageName; - } - - public function getType() - { - return $this->type; - } -} diff --git a/src/Composer/Repository/Pear/DependencyInfo.php b/src/Composer/Repository/Pear/DependencyInfo.php deleted file mode 100644 index c6b266e37..000000000 --- a/src/Composer/Repository/Pear/DependencyInfo.php +++ /dev/null @@ -1,50 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -/** - * PEAR package release dependency info - * - * @author Alexey Prilipko - */ -class DependencyInfo -{ - private $requires; - private $optionals; - - /** - * @param DependencyConstraint[] $requires list of requires/conflicts/replaces - * @param array $optionals [groupName => DependencyConstraint[]] list of optional groups - */ - public function __construct($requires, $optionals) - { - $this->requires = $requires; - $this->optionals = $optionals; - } - - /** - * @return DependencyConstraint[] list of requires/conflicts/replaces - */ - public function getRequires() - { - return $this->requires; - } - - /** - * @return array [groupName => DependencyConstraint[]] list of optional groups - */ - public function getOptionals() - { - return $this->optionals; - } -} diff --git a/src/Composer/Repository/Pear/PackageDependencyParser.php b/src/Composer/Repository/Pear/PackageDependencyParser.php deleted file mode 100644 index 24f8fb9f9..000000000 --- a/src/Composer/Repository/Pear/PackageDependencyParser.php +++ /dev/null @@ -1,317 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -/** - * Read PEAR packages using REST 1.0 interface - * - * @author Alexey Prilipko - */ -class PackageDependencyParser -{ - /** - * Builds dependency information. It detects used package.xml format. - * - * @param array $depArray - * @return DependencyInfo - */ - public function buildDependencyInfo($depArray) - { - if (!is_array($depArray)) { - return new DependencyInfo(array(), array()); - } - if (!$this->isHash($depArray)) { - return new DependencyInfo($this->buildDependency10Info($depArray), array()); - } - - return $this->buildDependency20Info($depArray); - } - - /** - * Builds dependency information from package.xml 1.0 format - * - * https://pear.php.net/manual/en/guide.developers.package2.dependencies.php - * - * package.xml 1.0 format consists of array of - * { type="php|os|sapi|ext|pkg" rel="has|not|eq|ge|gt|le|lt" optional="yes" - * channel="channelName" name="extName|packageName" } - * - * @param array $depArray Dependency data in package.xml 1.0 format - * @return DependencyConstraint[] - */ - private function buildDependency10Info($depArray) - { - static $dep10toOperatorMap = array('has' => '==', 'eq' => '==', 'ge' => '>=', 'gt' => '>', 'le' => '<=', 'lt' => '<', 'not' => '!='); - - $result = array(); - - foreach ($depArray as $depItem) { - if (empty($depItem['rel']) || !array_key_exists($depItem['rel'], $dep10toOperatorMap)) { - // 'unknown rel type:' . $depItem['rel']; - continue; - } - - $depType = !empty($depItem['optional']) && 'yes' == $depItem['optional'] - ? 'optional' - : 'required'; - $depType = 'not' == $depItem['rel'] - ? 'conflicts' - : $depType; - - $depVersion = !empty($depItem['version']) ? $this->parseVersion($depItem['version']) : '*'; - - // has & not are special operators that does not requires version - $depVersionConstraint = ('has' == $depItem['rel'] || 'not' == $depItem['rel']) && '*' == $depVersion - ? '*' - : $dep10toOperatorMap[$depItem['rel']] . $depVersion; - - switch ($depItem['type']) { - case 'php': - $depChannelName = 'php'; - $depPackageName = ''; - break; - case 'pkg': - $depChannelName = !empty($depItem['channel']) ? $depItem['channel'] : 'pear.php.net'; - $depPackageName = $depItem['name']; - break; - case 'ext': - $depChannelName = 'ext'; - $depPackageName = $depItem['name']; - break; - case 'os': - case 'sapi': - $depChannelName = ''; - $depPackageName = ''; - break; - default: - $depChannelName = ''; - $depPackageName = ''; - break; - } - - if ('' != $depChannelName) { - $result[] = new DependencyConstraint( - $depType, - $depVersionConstraint, - $depChannelName, - $depPackageName - ); - } - } - - return $result; - } - - /** - * Builds dependency information from package.xml 2.0 format - * - * @param array $depArray Dependency data in package.xml 1.0 format - * @return DependencyInfo - */ - private function buildDependency20Info($depArray) - { - $result = array(); - $optionals = array(); - $defaultOptionals = array(); - foreach ($depArray as $depType => $depTypeGroup) { - if (!is_array($depTypeGroup)) { - continue; - } - if ('required' == $depType || 'optional' == $depType) { - foreach ($depTypeGroup as $depItemType => $depItem) { - switch ($depItemType) { - case 'php': - $result[] = new DependencyConstraint( - $depType, - $this->parse20VersionConstraint($depItem), - 'php', - '' - ); - break; - case 'package': - $deps = $this->buildDepPackageConstraints($depItem, $depType); - $result = array_merge($result, $deps); - break; - case 'extension': - $deps = $this->buildDepExtensionConstraints($depItem, $depType); - $result = array_merge($result, $deps); - break; - case 'subpackage': - $deps = $this->buildDepPackageConstraints($depItem, 'replaces'); - $defaultOptionals += $deps; - break; - case 'os': - case 'pearinstaller': - break; - default: - break; - } - } - } elseif ('group' == $depType) { - if ($this->isHash($depTypeGroup)) { - $depTypeGroup = array($depTypeGroup); - } - - foreach ($depTypeGroup as $depItem) { - $groupName = $depItem['attribs']['name']; - if (!isset($optionals[$groupName])) { - $optionals[$groupName] = array(); - } - - if (isset($depItem['subpackage'])) { - $optionals[$groupName] += $this->buildDepPackageConstraints($depItem['subpackage'], 'replaces'); - } else { - $result += $this->buildDepPackageConstraints($depItem['package'], 'optional'); - } - } - } - } - - if (count($defaultOptionals) > 0) { - $optionals['*'] = $defaultOptionals; - } - - return new DependencyInfo($result, $optionals); - } - - /** - * Builds dependency constraint of 'extension' type - * - * @param array $depItem dependency constraint or array of dependency constraints - * @param string $depType target type of building constraint. - * @return DependencyConstraint[] - */ - private function buildDepExtensionConstraints($depItem, $depType) - { - if ($this->isHash($depItem)) { - $depItem = array($depItem); - } - - $result = array(); - foreach ($depItem as $subDepItem) { - $depChannelName = 'ext'; - $depPackageName = $subDepItem['name']; - $depVersionConstraint = $this->parse20VersionConstraint($subDepItem); - - $result[] = new DependencyConstraint( - $depType, - $depVersionConstraint, - $depChannelName, - $depPackageName - ); - } - - return $result; - } - - /** - * Builds dependency constraint of 'package' type - * - * @param array $depItem dependency constraint or array of dependency constraints - * @param string $depType target type of building constraint. - * @return DependencyConstraint[] - */ - private function buildDepPackageConstraints($depItem, $depType) - { - if ($this->isHash($depItem)) { - $depItem = array($depItem); - } - - $result = array(); - foreach ($depItem as $subDepItem) { - if (!array_key_exists('channel', $subDepItem)) { - $subDepItem['channel'] = $subDepItem['uri']; - } - $depChannelName = $subDepItem['channel']; - $depPackageName = $subDepItem['name']; - $depVersionConstraint = $this->parse20VersionConstraint($subDepItem); - if (isset($subDepItem['conflicts'])) { - $depType = 'conflicts'; - } - - $result[] = new DependencyConstraint( - $depType, - $depVersionConstraint, - $depChannelName, - $depPackageName - ); - } - - return $result; - } - - /** - * Parses version constraint - * - * @param array $data array containing several 'min', 'max', 'has', 'exclude' and other keys. - * @return string - */ - private function parse20VersionConstraint(array $data) - { - static $dep20toOperatorMap = array('has' => '==', 'min' => '>=', 'max' => '<=', 'exclude' => '!='); - - $versions = array(); - $values = array_intersect_key($data, $dep20toOperatorMap); - if (0 == count($values)) { - return '*'; - } - if (isset($values['min']) && isset($values['exclude']) && $data['min'] == $data['exclude']) { - $versions[] = '>' . $this->parseVersion($values['min']); - } elseif (isset($values['max']) && isset($values['exclude']) && $data['max'] == $data['exclude']) { - $versions[] = '<' . $this->parseVersion($values['max']); - } else { - foreach ($values as $op => $version) { - if ('exclude' == $op && is_array($version)) { - foreach ($version as $versionPart) { - $versions[] = $dep20toOperatorMap[$op] . $this->parseVersion($versionPart); - } - } else { - $versions[] = $dep20toOperatorMap[$op] . $this->parseVersion($version); - } - } - } - - return implode(',', $versions); - } - - /** - * Softened version parser - * - * @param string $version - * @return null|string - */ - private function parseVersion($version) - { - if (preg_match('{^v?(\d{1,3})(\.\d+)?(\.\d+)?(\.\d+)?}i', $version, $matches)) { - $version = $matches[1] - .(!empty($matches[2]) ? $matches[2] : '.0') - .(!empty($matches[3]) ? $matches[3] : '.0') - .(!empty($matches[4]) ? $matches[4] : '.0'); - - return $version; - } - - return null; - } - - /** - * Test if array is associative or hash type - * - * @param array $array - * @return bool - */ - private function isHash(array $array) - { - return !array_key_exists(1, $array) && !array_key_exists(0, $array); - } -} diff --git a/src/Composer/Repository/Pear/PackageInfo.php b/src/Composer/Repository/Pear/PackageInfo.php deleted file mode 100644 index 3b2eb6d90..000000000 --- a/src/Composer/Repository/Pear/PackageInfo.php +++ /dev/null @@ -1,94 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -/** - * PEAR Package info - * - * @author Alexey Prilipko - */ -class PackageInfo -{ - private $channelName; - private $packageName; - private $license; - private $shortDescription; - private $description; - private $releases; - - /** - * @param string $channelName - * @param string $packageName - * @param string $license - * @param string $shortDescription - * @param string $description - * @param ReleaseInfo[] $releases associative array maps release version to release info - */ - public function __construct($channelName, $packageName, $license, $shortDescription, $description, $releases) - { - $this->channelName = $channelName; - $this->packageName = $packageName; - $this->license = $license; - $this->shortDescription = $shortDescription; - $this->description = $description; - $this->releases = $releases; - } - - /** - * @return string the package channel name - */ - public function getChannelName() - { - return $this->channelName; - } - - /** - * @return string the package name - */ - public function getPackageName() - { - return $this->packageName; - } - - /** - * @return string the package description - */ - public function getDescription() - { - return $this->description; - } - - /** - * @return string the package short description - */ - public function getShortDescription() - { - return $this->shortDescription; - } - - /** - * @return string the package license - */ - public function getLicense() - { - return $this->license; - } - - /** - * @return ReleaseInfo[] - */ - public function getReleases() - { - return $this->releases; - } -} diff --git a/src/Composer/Repository/Pear/ReleaseInfo.php b/src/Composer/Repository/Pear/ReleaseInfo.php deleted file mode 100644 index 39d6e1ed6..000000000 --- a/src/Composer/Repository/Pear/ReleaseInfo.php +++ /dev/null @@ -1,50 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Repository\Pear; - -/** - * PEAR package release info - * - * @author Alexey Prilipko - */ -class ReleaseInfo -{ - private $stability; - private $dependencyInfo; - - /** - * @param string $stability - * @param DependencyInfo $dependencyInfo - */ - public function __construct($stability, $dependencyInfo) - { - $this->stability = $stability; - $this->dependencyInfo = $dependencyInfo; - } - - /** - * @return DependencyInfo release dependencies - */ - public function getDependencyInfo() - { - return $this->dependencyInfo; - } - - /** - * @return string release stability - */ - public function getStability() - { - return $this->stability; - } -} diff --git a/src/Composer/Repository/PearRepository.php b/src/Composer/Repository/PearRepository.php index 97e131afb..9f945bea3 100644 --- a/src/Composer/Repository/PearRepository.php +++ b/src/Composer/Repository/PearRepository.php @@ -15,9 +15,7 @@ namespace Composer\Repository; use Composer\IO\IOInterface; use Composer\Semver\VersionParser as SemverVersionParser; use Composer\Package\Version\VersionParser; -use Composer\Repository\Pear\ChannelReader; use Composer\Package\CompletePackage; -use Composer\Repository\Pear\ChannelInfo; use Composer\EventDispatcher\EventDispatcher; use Composer\Package\Link; use Composer\Semver\Constraint\Constraint; @@ -33,171 +31,13 @@ use Composer\Factory; * * @author Benjamin Eberlei * @author Jordi Boggiano + * @deprecated + * @private */ -class PearRepository extends ArrayRepository implements ConfigurableRepositoryInterface +class PearRepository extends ArrayRepository { - private $url; - private $io; - private $httpDownloader; - private $versionParser; - private $repoConfig; - - /** @var string vendor makes additional alias for each channel as {prefix}/{packagename}. It allows smoother - * package transition to composer-like repositories. - */ - private $vendorAlias; - public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $dispatcher = null) { - parent::__construct(); - if (!preg_match('{^https?://}', $repoConfig['url'])) { - $repoConfig['url'] = 'http://'.$repoConfig['url']; - } - - $urlBits = parse_url($repoConfig['url']); - if (empty($urlBits['scheme']) || empty($urlBits['host'])) { - throw new \UnexpectedValueException('Invalid url given for PEAR repository: '.$repoConfig['url']); - } - - $this->url = rtrim($repoConfig['url'], '/'); - $this->io = $io; - $this->httpDownloader = $httpDownloader; - $this->vendorAlias = isset($repoConfig['vendor-alias']) ? $repoConfig['vendor-alias'] : null; - $this->versionParser = new VersionParser(); - $this->repoConfig = $repoConfig; - } - - public function getRepoName() - { - return 'pear repo ('.$this->url.')'; - } - - public function getRepoConfig() - { - return $this->repoConfig; - } - - protected function initialize() - { - parent::initialize(); - - $this->io->writeError('Initializing PEAR repository '.$this->url); - - $reader = new ChannelReader($this->httpDownloader); - try { - $channelInfo = $reader->read($this->url); - } catch (\Exception $e) { - $this->io->writeError('PEAR repository from '.$this->url.' could not be loaded. '.$e->getMessage().''); - - return; - } - $packages = $this->buildComposerPackages($channelInfo, $this->versionParser); - foreach ($packages as $package) { - $this->addPackage($package); - } - } - - /** - * Builds CompletePackages from PEAR package definition data. - * - * @param ChannelInfo $channelInfo - * @param SemverVersionParser $versionParser - * @return CompletePackage[] - */ - private function buildComposerPackages(ChannelInfo $channelInfo, SemverVersionParser $versionParser) - { - $result = array(); - foreach ($channelInfo->getPackages() as $packageDefinition) { - foreach ($packageDefinition->getReleases() as $version => $releaseInfo) { - try { - $normalizedVersion = $versionParser->normalize($version); - } catch (\UnexpectedValueException $e) { - $this->io->writeError('Could not load '.$packageDefinition->getPackageName().' '.$version.': '.$e->getMessage(), true, IOInterface::VERBOSE); - continue; - } - - $composerPackageName = $this->buildComposerPackageName($packageDefinition->getChannelName(), $packageDefinition->getPackageName()); - - // distribution url must be read from /r/{packageName}/{version}.xml::/r/g:text() - // but this location is 'de-facto' standard - $urlBits = parse_url($this->url); - $scheme = (isset($urlBits['scheme']) && 'https' === $urlBits['scheme'] && extension_loaded('openssl')) ? 'https' : 'http'; - $distUrl = "{$scheme}://{$packageDefinition->getChannelName()}/get/{$packageDefinition->getPackageName()}-{$version}.tgz"; - - $requires = array(); - $suggests = array(); - $conflicts = array(); - $replaces = array(); - - // alias package only when its channel matches repository channel, - // cause we've know only repository channel alias - if ($channelInfo->getName() == $packageDefinition->getChannelName()) { - $composerPackageAlias = $this->buildComposerPackageName($channelInfo->getAlias(), $packageDefinition->getPackageName()); - $aliasConstraint = new Constraint('==', $normalizedVersion); - $replaces[] = new Link($composerPackageName, $composerPackageAlias, $aliasConstraint, 'replaces', (string) $aliasConstraint); - } - - // alias package with user-specified prefix. it makes private pear channels looks like composer's. - if (!empty($this->vendorAlias) - && ($this->vendorAlias != 'pear-'.$channelInfo->getAlias() || $channelInfo->getName() != $packageDefinition->getChannelName()) - ) { - $composerPackageAlias = "{$this->vendorAlias}/{$packageDefinition->getPackageName()}"; - $aliasConstraint = new Constraint('==', $normalizedVersion); - $replaces[] = new Link($composerPackageName, $composerPackageAlias, $aliasConstraint, 'replaces', (string) $aliasConstraint); - } - - foreach ($releaseInfo->getDependencyInfo()->getRequires() as $dependencyConstraint) { - $dependencyPackageName = $this->buildComposerPackageName($dependencyConstraint->getChannelName(), $dependencyConstraint->getPackageName()); - $constraint = $versionParser->parseConstraints($dependencyConstraint->getConstraint()); - $link = new Link($composerPackageName, $dependencyPackageName, $constraint, $dependencyConstraint->getType(), $dependencyConstraint->getConstraint()); - switch ($dependencyConstraint->getType()) { - case 'required': - $requires[] = $link; - break; - case 'conflicts': - $conflicts[] = $link; - break; - case 'replaces': - $replaces[] = $link; - break; - } - } - - foreach ($releaseInfo->getDependencyInfo()->getOptionals() as $group => $dependencyConstraints) { - foreach ($dependencyConstraints as $dependencyConstraint) { - $dependencyPackageName = $this->buildComposerPackageName($dependencyConstraint->getChannelName(), $dependencyConstraint->getPackageName()); - $suggests[$group.'-'.$dependencyPackageName] = $dependencyConstraint->getConstraint(); - } - } - - $package = new CompletePackage($composerPackageName, $normalizedVersion, $version); - $package->setType('pear-library'); - $package->setDescription($packageDefinition->getDescription()); - $package->setLicense(array($packageDefinition->getLicense())); - $package->setDistType('file'); - $package->setDistUrl($distUrl); - $package->setAutoload(array('classmap' => array(''))); - $package->setIncludePaths(array('/')); - $package->setRequires($requires); - $package->setConflicts($conflicts); - $package->setSuggests($suggests); - $package->setReplaces($replaces); - $result[] = $package; - } - } - - return $result; - } - - private function buildComposerPackageName($channelName, $packageName) - { - if ('php' === $channelName) { - return "php"; - } - if ('ext' === $channelName) { - return "ext-{$packageName}"; - } - - return "pear-{$channelName}/{$packageName}"; + throw new \RuntimeException('The PEAR repository has been removed from Composer 2.0'); } } diff --git a/tests/Composer/Test/Downloader/PearPackageExtractorTest.php b/tests/Composer/Test/Downloader/PearPackageExtractorTest.php deleted file mode 100644 index 23334f303..000000000 --- a/tests/Composer/Test/Downloader/PearPackageExtractorTest.php +++ /dev/null @@ -1,146 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Test\Downloader; - -use Composer\Downloader\PearPackageExtractor; -use Composer\Test\TestCase; - -class PearPackageExtractorTest extends TestCase -{ - public function testShouldExtractPackage_1_0() - { - $state = libxml_disable_entity_loader(true); - - $extractor = $this->getMockForAbstractClass('Composer\Downloader\PearPackageExtractor', array(), '', false); - $method = new \ReflectionMethod($extractor, 'buildCopyActions'); - $method->setAccessible(true); - - $fileActions = $method->invoke($extractor, __DIR__ . '/Fixtures/Package_v1.0', array('php' => '/'), array()); - - libxml_disable_entity_loader($state); - - $expectedFileActions = array( - 'Gtk.php' => array( - 'from' => 'PEAR_Frontend_Gtk-0.4.0/Gtk.php', - 'to' => 'PEAR/Frontend/Gtk.php', - 'role' => 'php', - 'tasks' => array(), - ), - 'Gtk/Config.php' => array( - 'from' => 'PEAR_Frontend_Gtk-0.4.0/Gtk/Config.php', - 'to' => 'PEAR/Frontend/Gtk/Config.php', - 'role' => 'php', - 'tasks' => array(), - ), - 'Gtk/xpm/black_close_icon.xpm' => array( - 'from' => 'PEAR_Frontend_Gtk-0.4.0/Gtk/xpm/black_close_icon.xpm', - 'to' => 'PEAR/Frontend/Gtk/xpm/black_close_icon.xpm', - 'role' => 'php', - 'tasks' => array(), - ), - ); - $this->assertSame($expectedFileActions, $fileActions); - } - - public function testShouldExtractPackage_2_0() - { - $state = libxml_disable_entity_loader(true); - - $extractor = $this->getMockForAbstractClass('Composer\Downloader\PearPackageExtractor', array(), '', false); - $method = new \ReflectionMethod($extractor, 'buildCopyActions'); - $method->setAccessible(true); - - $fileActions = $method->invoke($extractor, __DIR__ . '/Fixtures/Package_v2.0', array('php' => '/'), array()); - - libxml_disable_entity_loader($state); - - $expectedFileActions = array( - 'URL.php' => array( - 'from' => 'Net_URL-1.0.15/URL.php', - 'to' => 'Net/URL.php', - 'role' => 'php', - 'tasks' => array(), - ), - ); - $this->assertSame($expectedFileActions, $fileActions); - } - - public function testShouldExtractPackage_2_1() - { - $state = libxml_disable_entity_loader(true); - - $extractor = $this->getMockForAbstractClass('Composer\Downloader\PearPackageExtractor', array(), '', false); - $method = new \ReflectionMethod($extractor, 'buildCopyActions'); - $method->setAccessible(true); - - $fileActions = $method->invoke($extractor, __DIR__ . '/Fixtures/Package_v2.1', array('php' => '/', 'script' => '/bin'), array()); - - libxml_disable_entity_loader($state); - - $expectedFileActions = array( - 'php/Zend/Authentication/Storage/StorageInterface.php' => array( - 'from' => 'Zend_Authentication-2.0.0beta4/php/Zend/Authentication/Storage/StorageInterface.php', - 'to' => '/php/Zend/Authentication/Storage/StorageInterface.php', - 'role' => 'php', - 'tasks' => array(), - ), - 'php/Zend/Authentication/Result.php' => array( - 'from' => 'Zend_Authentication-2.0.0beta4/php/Zend/Authentication/Result.php', - 'to' => '/php/Zend/Authentication/Result.php', - 'role' => 'php', - 'tasks' => array(), - ), - 'php/Test.php' => array( - 'from' => 'Zend_Authentication-2.0.0beta4/php/Test.php', - 'to' => '/php/Test.php', - 'role' => 'script', - 'tasks' => array( - array( - 'from' => '@version@', - 'to' => 'version', - ), - ), - ), - 'renamedFile.php' => array( - 'from' => 'Zend_Authentication-2.0.0beta4/renamedFile.php', - 'to' => 'correctFile.php', - 'role' => 'php', - 'tasks' => array(), - ), - ); - $this->assertSame($expectedFileActions, $fileActions); - } - - public function testShouldPerformReplacements() - { - $from = tempnam($this->getUniqueTmpDirectory(), 'pear-extract'); - $to = $from.'-to'; - - $original = 'replaced: @placeholder@; not replaced: @another@; replaced again: @placeholder@'; - $expected = 'replaced: value; not replaced: @another@; replaced again: value'; - - file_put_contents($from, $original); - - $extractor = new PearPackageExtractor($from); - $method = new \ReflectionMethod($extractor, 'copyFile'); - $method->setAccessible(true); - - $method->invoke($extractor, $from, $to, array(array('from' => '@placeholder@', 'to' => 'variable')), array('variable' => 'value')); - $result = file_get_contents($to); - - unlink($to); - unlink($from); - - $this->assertEquals($expected, $result); - } -} diff --git a/tests/Composer/Test/Repository/Pear/ChannelReaderTest.php b/tests/Composer/Test/Repository/Pear/ChannelReaderTest.php deleted file mode 100644 index 2e2fe6933..000000000 --- a/tests/Composer/Test/Repository/Pear/ChannelReaderTest.php +++ /dev/null @@ -1,163 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Test\Repository\Pear; - -use Composer\Repository\Pear\ChannelInfo; -use Composer\Repository\Pear\DependencyConstraint; -use Composer\Repository\Pear\DependencyInfo; -use Composer\Repository\Pear\PackageInfo; -use Composer\Repository\Pear\ReleaseInfo; -use Composer\Test\TestCase; -use Composer\Semver\VersionParser; -use Composer\Semver\Constraint\Constraint; -use Composer\Package\Link; -use Composer\Package\CompletePackage; -use Composer\Test\Mock\HttpDownloaderMock; - -class ChannelReaderTest extends TestCase -{ - public function testShouldBuildPackagesFromPearSchema() - { - $httpDownloader = new HttpDownloaderMock(array( - 'http://pear.net/channel.xml' => file_get_contents(__DIR__ . '/Fixtures/channel.1.1.xml'), - 'http://test.loc/rest11/c/categories.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.1/categories.xml'), - 'http://test.loc/rest11/c/Default/packagesinfo.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.1/packagesinfo.xml'), - )); - - $reader = new \Composer\Repository\Pear\ChannelReader($httpDownloader); - - $channelInfo = $reader->read('http://pear.net/'); - $packages = $channelInfo->getPackages(); - - $this->assertCount(3, $packages); - $this->assertEquals('HTTP_Client', $packages[0]->getPackageName()); - $this->assertEquals('HTTP_Request', $packages[1]->getPackageName()); - $this->assertEquals('MDB2', $packages[2]->getPackageName()); - - $mdb2releases = $packages[2]->getReleases(); - $this->assertCount(9, $mdb2releases['2.4.0']->getDependencyInfo()->getOptionals()); - } - - public function testShouldSelectCorrectReader() - { - $httpDownloader = new HttpDownloaderMock(array( - 'http://pear.1.0.net/channel.xml' => file_get_contents(__DIR__ . '/Fixtures/channel.1.0.xml'), - 'http://test.loc/rest10/p/packages.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/packages.xml'), - 'http://test.loc/rest10/p/http_client/info.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_client_info.xml'), - 'http://test.loc/rest10/r/http_client/allreleases.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_client_allreleases.xml'), - 'http://test.loc/rest10/r/http_client/deps.1.2.1.txt' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_client_deps.1.2.1.txt'), - 'http://test.loc/rest10/p/http_request/info.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_request_info.xml'), - 'http://test.loc/rest10/r/http_request/allreleases.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_request_allreleases.xml'), - 'http://test.loc/rest10/r/http_request/deps.1.4.0.txt' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_request_deps.1.4.0.txt'), - 'http://pear.1.1.net/channel.xml' => file_get_contents(__DIR__ . '/Fixtures/channel.1.1.xml'), - 'http://test.loc/rest11/c/categories.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.1/categories.xml'), - 'http://test.loc/rest11/c/Default/packagesinfo.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.1/packagesinfo.xml'), - )); - - $reader = new \Composer\Repository\Pear\ChannelReader($httpDownloader); - - $pear10 = $reader->read('http://pear.1.0.net/'); - $this->assertCount(2, $pear10->getPackages()); - $pear11 = $reader->read('http://pear.1.1.net/'); - $this->assertCount(3, $pear11->getPackages()); - } - - public function testShouldCreatePackages() - { - $reader = $this->getMockBuilder('\Composer\Repository\PearRepository') - ->disableOriginalConstructor() - ->getMock(); - - $ref = new \ReflectionMethod($reader, 'buildComposerPackages'); - $ref->setAccessible(true); - - $channelInfo = new ChannelInfo( - 'test.loc', - 'test', - array( - new PackageInfo( - 'test.loc', - 'sample', - 'license', - 'shortDescription', - 'description', - array( - '1.0.0.1' => new ReleaseInfo( - 'stable', - new DependencyInfo( - array( - new DependencyConstraint( - 'required', - '> 5.2.0.0', - 'php', - '' - ), - new DependencyConstraint( - 'conflicts', - '== 2.5.6.0', - 'pear.php.net', - 'broken' - ), - ), - array( - '*' => array( - new DependencyConstraint( - 'optional', - '*', - 'ext', - 'xml' - ), - ), - ) - ) - ), - ) - ), - ) - ); - - $packages = $ref->invoke($reader, $channelInfo, new VersionParser()); - - $expectedPackage = new CompletePackage('pear-test.loc/sample', '1.0.0.1', '1.0.0.1'); - $expectedPackage->setType('pear-library'); - $expectedPackage->setDistType('file'); - $expectedPackage->setDescription('description'); - $expectedPackage->setLicense(array('license')); - $expectedPackage->setDistUrl("http://test.loc/get/sample-1.0.0.1.tgz"); - $expectedPackage->setAutoload(array('classmap' => array(''))); - $expectedPackage->setIncludePaths(array('/')); - $expectedPackage->setRequires(array( - new Link('pear-test.loc/sample', 'php', $this->createConstraint('>', '5.2.0.0'), 'required', '> 5.2.0.0'), - )); - $expectedPackage->setConflicts(array( - new Link('pear-test.loc/sample', 'pear-pear.php.net/broken', $this->createConstraint('==', '2.5.6.0'), 'conflicts', '== 2.5.6.0'), - )); - $expectedPackage->setSuggests(array( - '*-ext-xml' => '*', - )); - $expectedPackage->setReplaces(array( - new Link('pear-test.loc/sample', 'pear-test/sample', new Constraint('==', '1.0.0.1'), 'replaces', '== 1.0.0.1'), - )); - - $this->assertCount(1, $packages); - $this->assertEquals($expectedPackage, $packages[0], 0, 1); - } - - private function createConstraint($operator, $version) - { - $constraint = new Constraint($operator, $version); - $constraint->setPrettyString($operator.' '.$version); - - return $constraint; - } -} diff --git a/tests/Composer/Test/Repository/Pear/ChannelRest10ReaderTest.php b/tests/Composer/Test/Repository/Pear/ChannelRest10ReaderTest.php deleted file mode 100644 index 3960c7858..000000000 --- a/tests/Composer/Test/Repository/Pear/ChannelRest10ReaderTest.php +++ /dev/null @@ -1,41 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Test\Repository\Pear; - -use Composer\Test\TestCase; -use Composer\Test\Mock\HttpDownloaderMock; - -class ChannelRest10ReaderTest extends TestCase -{ - public function testShouldBuildPackagesFromPearSchema() - { - $httpDownloader = new HttpDownloaderMock(array( - 'http://test.loc/rest10/p/packages.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/packages.xml'), - 'http://test.loc/rest10/p/http_client/info.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_client_info.xml'), - 'http://test.loc/rest10/r/http_client/allreleases.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_client_allreleases.xml'), - 'http://test.loc/rest10/r/http_client/deps.1.2.1.txt' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_client_deps.1.2.1.txt'), - 'http://test.loc/rest10/p/http_request/info.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_request_info.xml'), - 'http://test.loc/rest10/r/http_request/allreleases.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_request_allreleases.xml'), - 'http://test.loc/rest10/r/http_request/deps.1.4.0.txt' => file_get_contents(__DIR__ . '/Fixtures/Rest1.0/http_request_deps.1.4.0.txt'), - )); - - $reader = new \Composer\Repository\Pear\ChannelRest10Reader($httpDownloader); - - /** @var \Composer\Package\PackageInterface[] $packages */ - $packages = $reader->read('http://test.loc/rest10'); - - $this->assertCount(2, $packages); - $this->assertEquals('HTTP_Client', $packages[0]->getPackageName()); - $this->assertEquals('HTTP_Request', $packages[1]->getPackageName()); - } -} diff --git a/tests/Composer/Test/Repository/Pear/ChannelRest11ReaderTest.php b/tests/Composer/Test/Repository/Pear/ChannelRest11ReaderTest.php deleted file mode 100644 index 684c59155..000000000 --- a/tests/Composer/Test/Repository/Pear/ChannelRest11ReaderTest.php +++ /dev/null @@ -1,37 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Test\Repository\Pear; - -use Composer\Test\TestCase; -use Composer\Test\Mock\HttpDownloaderMock; - -class ChannelRest11ReaderTest extends TestCase -{ - public function testShouldBuildPackagesFromPearSchema() - { - $httpDownloader = new HttpDownloaderMock(array( - 'http://pear.1.1.net/channel.xml' => file_get_contents(__DIR__ . '/Fixtures/channel.1.1.xml'), - 'http://test.loc/rest11/c/categories.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.1/categories.xml'), - 'http://test.loc/rest11/c/Default/packagesinfo.xml' => file_get_contents(__DIR__ . '/Fixtures/Rest1.1/packagesinfo.xml'), - )); - - $reader = new \Composer\Repository\Pear\ChannelRest11Reader($httpDownloader); - - /** @var \Composer\Package\PackageInterface[] $packages */ - $packages = $reader->read('http://test.loc/rest11'); - - $this->assertCount(3, $packages); - $this->assertEquals('HTTP_Client', $packages[0]->getPackageName()); - $this->assertEquals('HTTP_Request', $packages[1]->getPackageName()); - } -} diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/DependencyParserTestData.json b/tests/Composer/Test/Repository/Pear/Fixtures/DependencyParserTestData.json deleted file mode 100644 index e87ba40de..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/DependencyParserTestData.json +++ /dev/null @@ -1,167 +0,0 @@ -[ - { - "expected": [ - { - "type" : "required", - "constraint" : "*", - "channel" : "pear.php.net", - "name" : "Foo" - } - ], - "1.0": [ - { "type": "pkg", "rel": "has", "name": "Foo" } - ], - "2.0": { - "required": { - "package": { - "name": "Foo", - "channel": "pear.php.net" - } - } - } - }, - { - "expected": [ - { - "type" : "required", - "constraint" : ">1.0.0.0", - "channel" : "pear.php.net", - "name" : "Foo" - } - ], - "1.0": [ - { "type": "pkg", "rel": "gt", "version": "1.0.0", "name": "Foo" } - ], - "2.0": { - "required": { - "package": { - "name": "Foo", - "channel": "pear.php.net", - "min": "1.0.0", - "exclude": "1.0.0" - } - } - } - }, - { - "expected": [ - { - "type" : "conflicts", - "constraint" : "*", - "channel" : "pear.php.net", - "name" : "Foo" - } - ], - "1.0": [ - { "type": "pkg", "rel": "not", "name": "Foo" } - ], - "2.0": { - "required": { - "package": { - "name": "Foo", - "channel": "pear.php.net", - "conflicts": true - } - } - } - }, - { - "expected": [ - { - "type" : "required", - "constraint" : ">=1.0.0.0", - "channel" : "pear.php.net", - "name" : "Foo" - }, - { - "type" : "required", - "constraint" : "<2.0.0.0", - "channel" : "pear.php.net", - "name" : "Foo" - } - ], - "1.0": [ - { "type": "pkg", "rel": "ge", "version": "1.0.0", "name": "Foo" }, - { "type": "pkg", "rel": "lt", "version": "2.0.0", "name": "Foo" } - ], - "2.0": { - "required": { - "package": [ - { - "name": "Foo", - "channel": "pear.php.net", - "min": "1.0.0" - }, - { - "name": "Foo", - "channel": "pear.php.net", - "max": "2.0.0", - "exclude": "2.0.0" - } - ] - } - } - }, - { - "expected": [ - { - "type" : "required", - "constraint" : ">=5.3.0.0", - "channel" : "php", - "name" : "" - } - ], - "1.0": [ - { "type": "php", "rel": "ge", "version": "5.3"} - ], - "2.0": { - "required": { - "php": { - "min": "5.3" - } - } - } - }, - { - "expected": [ - { - "type" : "required", - "constraint" : "*", - "channel" : "ext", - "name" : "xmllib" - } - ], - "1.0": [ - { "type": "ext", "rel": "has", "name": "xmllib"} - ], - "2.0": { - "required": { - "extension": [ - { - "name": "xmllib" - } - ] - } - } - }, - { - "expected": [ - { - "type" : "optional", - "constraint" : "*", - "channel" : "ext", - "name" : "xmllib" - } - ], - "1.0": false, - "2.0": { - "optional": { - "extension": [ - { - "name": "xmllib" - } - ] - } - } - } -] \ No newline at end of file diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_client_allreleases.xml b/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_client_allreleases.xml deleted file mode 100644 index 1ce9d2f85..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_client_allreleases.xml +++ /dev/null @@ -1,9 +0,0 @@ - - -

HTTP_Client

- pear.net - - 1.2.1 - stable - -
diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_client_deps.1.2.1.txt b/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_client_deps.1.2.1.txt deleted file mode 100644 index db0effb7d..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_client_deps.1.2.1.txt +++ /dev/null @@ -1 +0,0 @@ -a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"4.3.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.3";}s:7:"package";a:3:{s:4:"name";s:12:"HTTP_Request";s:7:"channel";s:8:"pear.net";s:3:"min";s:5:"1.4.0";}}} \ No newline at end of file diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_client_info.xml b/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_client_info.xml deleted file mode 100644 index 2197591b0..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_client_info.xml +++ /dev/null @@ -1,14 +0,0 @@ - -

- HTTP_Client - pear.net - Default - BSD - - Easy way to perform multiple HTTP requests and process their results - - - The HTTP_Client class wraps around HTTP_Request and provides a higher level interface for performing multiple HTTP requests. Features: * Manages cookies and referrers between requests * Handles HTTP redirection * Has methods to set default headers and request parameters * Implements the Subject-Observer design pattern: the base class sends events to listeners that do the response processing. - - -

diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_request_allreleases.xml b/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_request_allreleases.xml deleted file mode 100644 index b6516b743..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_request_allreleases.xml +++ /dev/null @@ -1,9 +0,0 @@ - - -

HTTP_Request

- pear.net - - 1.4.0 - stable - -
diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_request_deps.1.4.0.txt b/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_request_deps.1.4.0.txt deleted file mode 100644 index da7412d09..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_request_deps.1.4.0.txt +++ /dev/null @@ -1 +0,0 @@ -a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"4.0.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:7:"1.4.0b1";}s:7:"package";a:2:{i:0;a:3:{s:4:"name";s:7:"Net_URL";s:7:"channel";s:12:"pear.dev.loc";s:3:"min";s:6:"1.0.12";}i:1;a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:8:"pear.net";s:3:"min";s:5:"1.0.2";}}}} \ No newline at end of file diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_request_info.xml b/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_request_info.xml deleted file mode 100644 index 8af662792..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/http_request_info.xml +++ /dev/null @@ -1,12 +0,0 @@ - -

- HTTP_Request - pear.net - Default - BSD - Provides an easy way to perform HTTP requests - - Supports GET/POST/HEAD/TRACE/PUT/DELETE, Basic authentication, Proxy, Proxy Authentication, SSL, file uploads etc. - - -

diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/packages.xml b/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/packages.xml deleted file mode 100644 index c38497ecd..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.0/packages.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - pear.net -

HTTP_Client

-

HTTP_Request

-
diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.1/categories.xml b/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.1/categories.xml deleted file mode 100644 index 934c12655..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.1/categories.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - pear.net - Default - diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.1/packagesinfo.xml b/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.1/packagesinfo.xml deleted file mode 100644 index 889ba9ace..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/Rest1.1/packagesinfo.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - -

- HTTP_Client - pear.net - Default - BSD - - Easy way to perform multiple HTTP requests and process their results - - - The HTTP_Client class wraps around HTTP_Request and provides a higher level interface for performing multiple HTTP requests. Features: * Manages cookies and referrers between requests * Handles HTTP redirection * Has methods to set default headers and request parameters * Implements the Subject-Observer design pattern: the base class sends events to listeners that do the response processing. - - -

- - - 1.2.1 - stable - - - - 1.2.1 - a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"4.3.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.3";}s:7:"package";a:3:{s:4:"name";s:12:"HTTP_Request";s:7:"channel";s:8:"pear.net";s:3:"min";s:5:"1.4.0";}}} - -
- -

- HTTP_Request - pear.net - Default - BSD - Provides an easy way to perform HTTP requests - - Supports GET/POST/HEAD/TRACE/PUT/DELETE, Basic authentication, Proxy, Proxy Authentication, SSL, file uploads etc. - - -

- - - 1.4.0 - stable - - - - 1.4.0 - a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"4.0.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:7:"1.4.0b1";}s:7:"package";a:2:{i:0;a:3:{s:4:"name";s:7:"Net_URL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:6:"1.0.12";}i:1;a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.2";}}}} - -
- -

MDB2 - pear.net - Database - BSD License - database abstraction layer - PEAR MDB2 is a merge of the PEAR DB and Metabase php database abstraction layers. - - It provides a common API for all supported RDBMS. The main difference to most - other DB abstraction packages is that MDB2 goes much further to ensure - portability. MDB2 provides most of its many features optionally that - can be used to construct portable SQL statements: - * Object-Oriented API - * A DSN (data source name) or array format for specifying database servers - * Datatype abstraction and on demand datatype conversion - * Various optional fetch modes to fix portability issues - * Portable error codes - * Sequential and non sequential row fetching as well as bulk fetching - * Ability to make buffered and unbuffered queries - * Ordered array and associative array for the fetched rows - * Prepare/execute (bind) named and unnamed placeholder emulation - * Sequence/autoincrement emulation - * Replace emulation - * Limited sub select emulation - * Row limit emulation - * Transactions/savepoint support - * Large Object support - * Index/Unique Key/Primary Key support - * Pattern matching abstraction - * Module framework to load advanced functionality on demand - * Ability to read the information schema - * RDBMS management methods (creating, dropping, altering) - * Reverse engineering schemas from an existing database - * SQL function call abstraction - * Full integration into the PEAR Framework - * PHPDoc API documentation - -

- - 2.4.0stable - - - 2.4.0 - a:2:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"4.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:7:"1.4.0b1";}s:7:"package";a:3:{s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.3.6";}}s:5:"group";a:9:{i:0;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:29:"Frontbase SQL driver for MDB2";s:4:"name";s:5:"fbsql";}s:10:"subpackage";a:3:{s:4:"name";s:17:"MDB2_Driver_fbsql";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.3.0";}}i:1;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:34:"Interbase/Firebird driver for MDB2";s:4:"name";s:5:"ibase";}s:10:"subpackage";a:3:{s:4:"name";s:17:"MDB2_Driver_ibase";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";}}i:2;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:21:"MySQL driver for MDB2";s:4:"name";s:5:"mysql";}s:10:"subpackage";a:3:{s:4:"name";s:17:"MDB2_Driver_mysql";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";}}i:3;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:22:"MySQLi driver for MDB2";s:4:"name";s:6:"mysqli";}s:10:"subpackage";a:3:{s:4:"name";s:18:"MDB2_Driver_mysqli";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";}}i:4;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:29:"MS SQL Server driver for MDB2";s:4:"name";s:5:"mssql";}s:10:"subpackage";a:3:{s:4:"name";s:17:"MDB2_Driver_mssql";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.2.0";}}i:5;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:22:"Oracle driver for MDB2";s:4:"name";s:4:"oci8";}s:10:"subpackage";a:3:{s:4:"name";s:16:"MDB2_Driver_oci8";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";}}i:6;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:26:"PostgreSQL driver for MDB2";s:4:"name";s:5:"pgsql";}s:10:"subpackage";a:3:{s:4:"name";s:17:"MDB2_Driver_pgsql";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";}}i:7;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:24:"Querysim driver for MDB2";s:4:"name";s:8:"querysim";}s:10:"subpackage";a:3:{s:4:"name";s:20:"MDB2_Driver_querysim";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.6.0";}}i:8;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:23:"SQLite2 driver for MDB2";s:4:"name";s:6:"sqlite";}s:10:"subpackage";a:3:{s:4:"name";s:18:"MDB2_Driver_sqlite";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";}}}} - -
-
diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/channel.1.0.xml b/tests/Composer/Test/Repository/Pear/Fixtures/channel.1.0.xml deleted file mode 100644 index dc3c9e8bb..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/channel.1.0.xml +++ /dev/null @@ -1,12 +0,0 @@ - - pear.net - Test PEAR channel - test_alias - - - - http://test.loc/rest10/ - - - - diff --git a/tests/Composer/Test/Repository/Pear/Fixtures/channel.1.1.xml b/tests/Composer/Test/Repository/Pear/Fixtures/channel.1.1.xml deleted file mode 100644 index bf1e55d68..000000000 --- a/tests/Composer/Test/Repository/Pear/Fixtures/channel.1.1.xml +++ /dev/null @@ -1,12 +0,0 @@ - - pear.net - Test PEAR channel - test_alias - - - - http://test.loc/rest11/ - - - - diff --git a/tests/Composer/Test/Repository/Pear/PackageDependencyParserTest.php b/tests/Composer/Test/Repository/Pear/PackageDependencyParserTest.php deleted file mode 100644 index f8cf3efca..000000000 --- a/tests/Composer/Test/Repository/Pear/PackageDependencyParserTest.php +++ /dev/null @@ -1,61 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Test\Repository\Pear; - -use Composer\Repository\Pear\DependencyConstraint; -use Composer\Repository\Pear\PackageDependencyParser; -use Composer\Test\TestCase; - -class PackageDependencyParserTest extends TestCase -{ - /** - * @dataProvider dataProvider10 - * @param $expected - * @param $data10 - * @param $data20 - */ - public function testShouldParseDependencies($expected, $data10, $data20) - { - $expectedDependencies = array(); - foreach ($expected as $expectedItem) { - $expectedDependencies[] = new DependencyConstraint( - $expectedItem['type'], - $expectedItem['constraint'], - $expectedItem['channel'], - $expectedItem['name'] - ); - } - - $parser = new PackageDependencyParser(); - - if (false !== $data10) { - $result = $parser->buildDependencyInfo($data10); - $this->assertEquals($expectedDependencies, $result->getRequires() + $result->getOptionals(), "Failed for package.xml 1.0 format"); - } - - if (false !== $data20) { - $result = $parser->buildDependencyInfo($data20); - $this->assertEquals($expectedDependencies, $result->getRequires() + $result->getOptionals(), "Failed for package.xml 2.0 format"); - } - } - - public function dataProvider10() - { - $data = json_decode(file_get_contents(__DIR__.'/Fixtures/DependencyParserTestData.json'), true); - if (0 !== json_last_error()) { - throw new \PHPUnit\Framework\Exception('Invalid json file.'); - } - - return $data; - } -} diff --git a/tests/Composer/Test/Repository/PearRepositoryTest.php b/tests/Composer/Test/Repository/PearRepositoryTest.php deleted file mode 100644 index 867d4978d..000000000 --- a/tests/Composer/Test/Repository/PearRepositoryTest.php +++ /dev/null @@ -1,148 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Test\Repository; - -use Composer\Repository\PearRepository; -use Composer\Test\TestCase; - -/** - * @group legacy - */ -class PearRepositoryTest extends TestCase -{ - /** - * @var PearRepository - */ - private $repository; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - private $httpDownloader; - - public function testComposerShouldSetIncludePath() - { - $url = 'pear.phpmd.org'; - if (!@file_get_contents('http://'.$url)) { - $this->markTestSkipped('Repository '.$url.' appears to be unreachable'); - } - $expectedPackages = array( - array('name' => 'pear-pear.phpmd.org/PHP_PMD', 'version' => '1.3.3'), - ); - - $repoConfig = array( - 'url' => $url, - ); - - $this->createRepository($repoConfig); - - foreach ($expectedPackages as $expectedPackage) { - $package = $this->repository->findPackage($expectedPackage['name'], $expectedPackage['version']); - $this->assertInstanceOf( - 'Composer\Package\PackageInterface', - $package, - 'Expected package ' . $expectedPackage['name'] . ', version ' . $expectedPackage['version'] . - ' not found in pear channel ' . $url - ); - $this->assertSame(array('/'), $package->getIncludePaths()); - } - } - - /** - * @dataProvider repositoryDataProvider - * @param string $url - * @param array $expectedPackages - */ - public function testRepositoryRead($url, array $expectedPackages) - { - $repoConfig = array( - 'url' => $url, - ); - - if (!@file_get_contents('http://'.$url)) { - $this->markTestSkipped('Repository '.$url.' appears to be unreachable'); - } - - $this->createRepository($repoConfig); - foreach ($expectedPackages as $expectedPackage) { - $this->assertInstanceOf( - 'Composer\Package\PackageInterface', - $this->repository->findPackage($expectedPackage['name'], $expectedPackage['version']), - 'Expected package ' . $expectedPackage['name'] . ', version ' . $expectedPackage['version'] . - ' not found in pear channel ' . $url - ); - } - } - - public function repositoryDataProvider() - { - return array( - array( - 'pear.php.net', - array( - array('name' => 'pear-pear.php.net/PEAR', 'version' => '1.9.4'), - ), - ), - array( - 'pear.pdepend.org', - array( - array('name' => 'pear-pear.pdepend.org/PHP_Depend', 'version' => '1.0.5'), - ), - ), - array( - 'pear.phpmd.org', - array( - array('name' => 'pear-pear.phpmd.org/PHP_PMD', 'version' => '1.3.3'), - ), - ), - array( - 'pear.doctrine-project.org', - array( - array('name' => 'pear-pear.doctrine-project.org/DoctrineORM', 'version' => '2.2.2'), - ), - ), - array( - 'pear.symfony-project.com', - array( - array('name' => 'pear-pear.symfony-project.com/YAML', 'version' => '1.0.6'), - ), - ), - array( - 'pear.pirum-project.org', - array( - array('name' => 'pear-pear.pirum-project.org/Pirum', 'version' => '1.1.4'), - ), - ), - ); - } - - private function createRepository($repoConfig) - { - $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') - ->getMock(); - - $config = new \Composer\Config(); - - $this->httpDownloader = $this->getMockBuilder('Composer\Util\HttpDownloader') - ->disableOriginalConstructor() - ->getMock(); - - $this->repository = new PearRepository($repoConfig, $ioInterface, $config, null); - } - - protected function tearDown() - { - $this->repository = null; - $this->httpDownloader = null; - } -} diff --git a/tests/Composer/Test/Repository/RepositoryManagerTest.php b/tests/Composer/Test/Repository/RepositoryManagerTest.php index 614dd226c..1d59b63af 100644 --- a/tests/Composer/Test/Repository/RepositoryManagerTest.php +++ b/tests/Composer/Test/Repository/RepositoryManagerTest.php @@ -97,7 +97,7 @@ class RepositoryManagerTest extends TestCase array('git', array('url' => 'http://github.com/foo/bar')), array('git', array('url' => 'git@example.org:foo/bar.git')), array('svn', array('url' => 'svn://example.org/foo/bar')), - array('pear', array('url' => 'http://pear.example.org/foo')), + array('pear', array('url' => 'http://pear.example.org/foo'), 'RuntimeException'), array('package', array('package' => array())), array('invalid', array(), 'InvalidArgumentException'), );