PageRenderTime 24ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/Library/php52/lib/php/PEAR/REST/13.php

http://github.com/jyr/MNPP
PHP | 299 lines | 205 code | 32 blank | 62 comment | 63 complexity | 58734baedca9a15f3013a8e5e21db229 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0, LGPL-2.0, LGPL-3.0, MPL-2.0-no-copyleft-exception, GPL-2.0, BSD-3-Clause, GPL-3.0, BSD-2-Clause
  1. <?php
  2. /**
  3. * PEAR_REST_13
  4. *
  5. * PHP versions 4 and 5
  6. *
  7. * @category pear
  8. * @package PEAR
  9. * @author Greg Beaver <cellog@php.net>
  10. * @copyright 1997-2009 The Authors
  11. * @license http://opensource.org/licenses/bsd-license.php New BSD License
  12. * @version CVS: $Id: 13.php 287110 2009-08-11 18:51:15Z dufuz $
  13. * @link http://pear.php.net/package/PEAR
  14. * @since File available since Release 1.4.0a12
  15. */
  16. /**
  17. * For downloading REST xml/txt files
  18. */
  19. require_once 'PEAR/REST.php';
  20. require_once 'PEAR/REST/10.php';
  21. /**
  22. * Implement REST 1.3
  23. *
  24. * @category pear
  25. * @package PEAR
  26. * @author Greg Beaver <cellog@php.net>
  27. * @copyright 1997-2009 The Authors
  28. * @license http://opensource.org/licenses/bsd-license.php New BSD License
  29. * @version Release: 1.9.1
  30. * @link http://pear.php.net/package/PEAR
  31. * @since Class available since Release 1.4.0a12
  32. */
  33. class PEAR_REST_13 extends PEAR_REST_10
  34. {
  35. /**
  36. * Retrieve information about a remote package to be downloaded from a REST server
  37. *
  38. * This is smart enough to resolve the minimum PHP version dependency prior to download
  39. * @param string $base The uri to prepend to all REST calls
  40. * @param array $packageinfo an array of format:
  41. * <pre>
  42. * array(
  43. * 'package' => 'packagename',
  44. * 'channel' => 'channelname',
  45. * ['state' => 'alpha' (or valid state),]
  46. * -or-
  47. * ['version' => '1.whatever']
  48. * </pre>
  49. * @param string $prefstate Current preferred_state config variable value
  50. * @param bool $installed the installed version of this package to compare against
  51. * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
  52. */
  53. function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false)
  54. {
  55. $states = $this->betterStates($prefstate, true);
  56. if (!$states) {
  57. return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
  58. }
  59. $channel = $packageinfo['channel'];
  60. $package = $packageinfo['package'];
  61. $state = isset($packageinfo['state']) ? $packageinfo['state'] : null;
  62. $version = isset($packageinfo['version']) ? $packageinfo['version'] : null;
  63. $restFile = $base . 'r/' . strtolower($package) . '/allreleases2.xml';
  64. $info = $this->_rest->retrieveData($restFile, false, false, $channel);
  65. if (PEAR::isError($info)) {
  66. return PEAR::raiseError('No releases available for package "' .
  67. $channel . '/' . $package . '"');
  68. }
  69. if (!isset($info['r'])) {
  70. return false;
  71. }
  72. $release = $found = false;
  73. if (!is_array($info['r']) || !isset($info['r'][0])) {
  74. $info['r'] = array($info['r']);
  75. }
  76. $skippedphp = false;
  77. foreach ($info['r'] as $release) {
  78. if (!isset($this->_rest->_options['force']) && ($installed &&
  79. version_compare($release['v'], $installed, '<'))) {
  80. continue;
  81. }
  82. if (isset($state)) {
  83. // try our preferred state first
  84. if ($release['s'] == $state) {
  85. if (!isset($version) && version_compare($release['m'], phpversion(), '>')) {
  86. // skip releases that require a PHP version newer than our PHP version
  87. $skippedphp = $release;
  88. continue;
  89. }
  90. $found = true;
  91. break;
  92. }
  93. // see if there is something newer and more stable
  94. // bug #7221
  95. if (in_array($release['s'], $this->betterStates($state), true)) {
  96. if (!isset($version) && version_compare($release['m'], phpversion(), '>')) {
  97. // skip releases that require a PHP version newer than our PHP version
  98. $skippedphp = $release;
  99. continue;
  100. }
  101. $found = true;
  102. break;
  103. }
  104. } elseif (isset($version)) {
  105. if ($release['v'] == $version) {
  106. if (!isset($this->_rest->_options['force']) &&
  107. !isset($version) &&
  108. version_compare($release['m'], phpversion(), '>')) {
  109. // skip releases that require a PHP version newer than our PHP version
  110. $skippedphp = $release;
  111. continue;
  112. }
  113. $found = true;
  114. break;
  115. }
  116. } else {
  117. if (in_array($release['s'], $states)) {
  118. if (version_compare($release['m'], phpversion(), '>')) {
  119. // skip releases that require a PHP version newer than our PHP version
  120. $skippedphp = $release;
  121. continue;
  122. }
  123. $found = true;
  124. break;
  125. }
  126. }
  127. }
  128. if (!$found && $skippedphp) {
  129. $found = null;
  130. }
  131. return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel);
  132. }
  133. function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage,
  134. $prefstate = 'stable', $installed = false, $channel = false)
  135. {
  136. $states = $this->betterStates($prefstate, true);
  137. if (!$states) {
  138. return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
  139. }
  140. $channel = $dependency['channel'];
  141. $package = $dependency['name'];
  142. $state = isset($dependency['state']) ? $dependency['state'] : null;
  143. $version = isset($dependency['version']) ? $dependency['version'] : null;
  144. $restFile = $base . 'r/' . strtolower($package) .'/allreleases2.xml';
  145. $info = $this->_rest->retrieveData($restFile, false, false, $channel);
  146. if (PEAR::isError($info)) {
  147. return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package']
  148. . '" dependency "' . $channel . '/' . $package . '" has no releases');
  149. }
  150. if (!is_array($info) || !isset($info['r'])) {
  151. return false;
  152. }
  153. $exclude = array();
  154. $min = $max = $recommended = false;
  155. if ($xsdversion == '1.0') {
  156. $pinfo['package'] = $dependency['name'];
  157. $pinfo['channel'] = 'pear.php.net'; // this is always true - don't change this
  158. switch ($dependency['rel']) {
  159. case 'ge' :
  160. $min = $dependency['version'];
  161. break;
  162. case 'gt' :
  163. $min = $dependency['version'];
  164. $exclude = array($dependency['version']);
  165. break;
  166. case 'eq' :
  167. $recommended = $dependency['version'];
  168. break;
  169. case 'lt' :
  170. $max = $dependency['version'];
  171. $exclude = array($dependency['version']);
  172. break;
  173. case 'le' :
  174. $max = $dependency['version'];
  175. break;
  176. case 'ne' :
  177. $exclude = array($dependency['version']);
  178. break;
  179. }
  180. } else {
  181. $pinfo['package'] = $dependency['name'];
  182. $min = isset($dependency['min']) ? $dependency['min'] : false;
  183. $max = isset($dependency['max']) ? $dependency['max'] : false;
  184. $recommended = isset($dependency['recommended']) ?
  185. $dependency['recommended'] : false;
  186. if (isset($dependency['exclude'])) {
  187. if (!isset($dependency['exclude'][0])) {
  188. $exclude = array($dependency['exclude']);
  189. }
  190. }
  191. }
  192. $skippedphp = $found = $release = false;
  193. if (!is_array($info['r']) || !isset($info['r'][0])) {
  194. $info['r'] = array($info['r']);
  195. }
  196. foreach ($info['r'] as $release) {
  197. if (!isset($this->_rest->_options['force']) && ($installed &&
  198. version_compare($release['v'], $installed, '<'))) {
  199. continue;
  200. }
  201. if (in_array($release['v'], $exclude)) { // skip excluded versions
  202. continue;
  203. }
  204. // allow newer releases to say "I'm OK with the dependent package"
  205. if ($xsdversion == '2.0' && isset($release['co'])) {
  206. if (!is_array($release['co']) || !isset($release['co'][0])) {
  207. $release['co'] = array($release['co']);
  208. }
  209. foreach ($release['co'] as $entry) {
  210. if (isset($entry['x']) && !is_array($entry['x'])) {
  211. $entry['x'] = array($entry['x']);
  212. } elseif (!isset($entry['x'])) {
  213. $entry['x'] = array();
  214. }
  215. if ($entry['c'] == $deppackage['channel'] &&
  216. strtolower($entry['p']) == strtolower($deppackage['package']) &&
  217. version_compare($deppackage['version'], $entry['min'], '>=') &&
  218. version_compare($deppackage['version'], $entry['max'], '<=') &&
  219. !in_array($release['v'], $entry['x'])) {
  220. if (version_compare($release['m'], phpversion(), '>')) {
  221. // skip dependency releases that require a PHP version
  222. // newer than our PHP version
  223. $skippedphp = $release;
  224. continue;
  225. }
  226. $recommended = $release['v'];
  227. break;
  228. }
  229. }
  230. }
  231. if ($recommended) {
  232. if ($release['v'] != $recommended) { // if we want a specific
  233. // version, then skip all others
  234. continue;
  235. }
  236. if (!in_array($release['s'], $states)) {
  237. // the stability is too low, but we must return the
  238. // recommended version if possible
  239. return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel);
  240. }
  241. }
  242. if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions
  243. continue;
  244. }
  245. if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions
  246. continue;
  247. }
  248. if ($installed && version_compare($release['v'], $installed, '<')) {
  249. continue;
  250. }
  251. if (in_array($release['s'], $states)) { // if in the preferred state...
  252. if (version_compare($release['m'], phpversion(), '>')) {
  253. // skip dependency releases that require a PHP version
  254. // newer than our PHP version
  255. $skippedphp = $release;
  256. continue;
  257. }
  258. $found = true; // ... then use it
  259. break;
  260. }
  261. }
  262. if (!$found && $skippedphp) {
  263. $found = null;
  264. }
  265. return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel);
  266. }
  267. }