ChannelRest10Reader.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Composer\Repository\Pear;
  12. use Composer\Downloader\TransportException;
  13. use Composer\Util\HttpDownloader;
  14. /**
  15. * Read PEAR packages using REST 1.0 interface
  16. *
  17. * At version 1.0 package descriptions read from:
  18. * {baseUrl}/p/packages.xml
  19. * {baseUrl}/p/{package}/info.xml
  20. * {baseUrl}/p/{package}/allreleases.xml
  21. * {baseUrl}/p/{package}/deps.{version}.txt
  22. *
  23. * @author Alexey Prilipko <palex@farpost.com>
  24. */
  25. class ChannelRest10Reader extends BaseChannelReader
  26. {
  27. private $dependencyReader;
  28. public function __construct(HttpDownloader $httpDownloader)
  29. {
  30. parent::__construct($httpDownloader);
  31. $this->dependencyReader = new PackageDependencyParser();
  32. }
  33. /**
  34. * Reads package descriptions using PEAR Rest 1.0 interface
  35. *
  36. * @param string $baseUrl base Url interface
  37. *
  38. * @return PackageInfo[]
  39. */
  40. public function read($baseUrl)
  41. {
  42. return $this->readPackages($baseUrl);
  43. }
  44. /**
  45. * Read list of packages from
  46. * {baseUrl}/p/packages.xml
  47. *
  48. * @param string $baseUrl
  49. * @return PackageInfo[]
  50. */
  51. private function readPackages($baseUrl)
  52. {
  53. $result = array();
  54. $xmlPath = '/p/packages.xml';
  55. $xml = $this->requestXml($baseUrl, $xmlPath);
  56. $xml->registerXPathNamespace('ns', self::ALL_PACKAGES_NS);
  57. foreach ($xml->xpath('ns:p') as $node) {
  58. $packageName = (string) $node;
  59. $packageInfo = $this->readPackage($baseUrl, $packageName);
  60. $result[] = $packageInfo;
  61. }
  62. return $result;
  63. }
  64. /**
  65. * Read package info from
  66. * {baseUrl}/p/{package}/info.xml
  67. *
  68. * @param string $baseUrl
  69. * @param string $packageName
  70. * @return PackageInfo
  71. */
  72. private function readPackage($baseUrl, $packageName)
  73. {
  74. $xmlPath = '/p/' . strtolower($packageName) . '/info.xml';
  75. $xml = $this->requestXml($baseUrl, $xmlPath);
  76. $xml->registerXPathNamespace('ns', self::PACKAGE_INFO_NS);
  77. $channelName = (string) $xml->c;
  78. $packageName = (string) $xml->n;
  79. $license = (string) $xml->l;
  80. $shortDescription = (string) $xml->s;
  81. $description = (string) $xml->d;
  82. return new PackageInfo(
  83. $channelName,
  84. $packageName,
  85. $license,
  86. $shortDescription,
  87. $description,
  88. $this->readPackageReleases($baseUrl, $packageName)
  89. );
  90. }
  91. /**
  92. * Read package releases from
  93. * {baseUrl}/p/{package}/allreleases.xml
  94. *
  95. * @param string $baseUrl
  96. * @param string $packageName
  97. * @throws \Composer\Downloader\TransportException|\Exception
  98. * @return ReleaseInfo[] hash array with keys as version numbers
  99. */
  100. private function readPackageReleases($baseUrl, $packageName)
  101. {
  102. $result = array();
  103. try {
  104. $xmlPath = '/r/' . strtolower($packageName) . '/allreleases.xml';
  105. $xml = $this->requestXml($baseUrl, $xmlPath);
  106. $xml->registerXPathNamespace('ns', self::ALL_RELEASES_NS);
  107. foreach ($xml->xpath('ns:r') as $node) {
  108. $releaseVersion = (string) $node->v;
  109. $releaseStability = (string) $node->s;
  110. try {
  111. $result[$releaseVersion] = new ReleaseInfo(
  112. $releaseStability,
  113. $this->readPackageReleaseDependencies($baseUrl, $packageName, $releaseVersion)
  114. );
  115. } catch (TransportException $exception) {
  116. if ($exception->getCode() != 404) {
  117. throw $exception;
  118. }
  119. }
  120. }
  121. } catch (TransportException $exception) {
  122. if ($exception->getCode() != 404) {
  123. throw $exception;
  124. }
  125. }
  126. return $result;
  127. }
  128. /**
  129. * Read package dependencies from
  130. * {baseUrl}/p/{package}/deps.{version}.txt
  131. *
  132. * @param string $baseUrl
  133. * @param string $packageName
  134. * @param string $version
  135. * @return DependencyInfo[]
  136. */
  137. private function readPackageReleaseDependencies($baseUrl, $packageName, $version)
  138. {
  139. $dependencyReader = new PackageDependencyParser();
  140. $depthPath = '/r/' . strtolower($packageName) . '/deps.' . $version . '.txt';
  141. $content = $this->requestContent($baseUrl, $depthPath);
  142. $dependencyArray = unserialize($content);
  143. return $dependencyReader->buildDependencyInfo($dependencyArray);
  144. }
  145. }