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