/wp-content/plugins/anthologize/vendor/pear/pear/PEAR/REST/11.php

https://github.com/livinglab/openlab · PHP · 340 lines · 234 code · 45 blank · 61 comment · 71 complexity · c5f142e00d000cc6a23bca94ca60b0e2 MD5 · raw file

  1. <?php
  2. /**
  3. * PEAR_REST_11 - implement faster list-all/remote-list command
  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. * @link http://pear.php.net/package/PEAR
  13. * @since File available since Release 1.4.3
  14. */
  15. /**
  16. * For downloading REST xml/txt files
  17. */
  18. require_once 'PEAR/REST.php';
  19. /**
  20. * Implement REST 1.1
  21. *
  22. * @category pear
  23. * @package PEAR
  24. * @author Greg Beaver <cellog@php.net>
  25. * @copyright 1997-2009 The Authors
  26. * @license http://opensource.org/licenses/bsd-license.php New BSD License
  27. * @version Release: @package_version@
  28. * @link http://pear.php.net/package/PEAR
  29. * @since Class available since Release 1.4.3
  30. */
  31. class PEAR_REST_11
  32. {
  33. /**
  34. * @var PEAR_REST
  35. */
  36. var $_rest;
  37. function __construct($config, $options = array())
  38. {
  39. $this->_rest = new PEAR_REST($config, $options);
  40. }
  41. function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false)
  42. {
  43. $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
  44. if (PEAR::isError($categorylist)) {
  45. return $categorylist;
  46. }
  47. $ret = array();
  48. if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) {
  49. $categorylist['c'] = array($categorylist['c']);
  50. }
  51. PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
  52. foreach ($categorylist['c'] as $progress => $category) {
  53. $category = $category['_content'];
  54. $packagesinfo = $this->_rest->retrieveData($base .
  55. 'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel);
  56. if (PEAR::isError($packagesinfo)) {
  57. continue;
  58. }
  59. if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) {
  60. continue;
  61. }
  62. if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) {
  63. $packagesinfo['pi'] = array($packagesinfo['pi']);
  64. }
  65. foreach ($packagesinfo['pi'] as $packageinfo) {
  66. if (empty($packageinfo)) {
  67. continue;
  68. }
  69. $info = $packageinfo['p'];
  70. $package = $info['n'];
  71. $releases = isset($packageinfo['a']) ? $packageinfo['a'] : false;
  72. unset($latest);
  73. unset($unstable);
  74. unset($stable);
  75. unset($state);
  76. if ($releases) {
  77. if (!isset($releases['r'][0])) {
  78. $releases['r'] = array($releases['r']);
  79. }
  80. foreach ($releases['r'] as $release) {
  81. if (!isset($latest)) {
  82. if ($dostable && $release['s'] == 'stable') {
  83. $latest = $release['v'];
  84. $state = 'stable';
  85. }
  86. if (!$dostable) {
  87. $latest = $release['v'];
  88. $state = $release['s'];
  89. }
  90. }
  91. if (!isset($stable) && $release['s'] == 'stable') {
  92. $stable = $release['v'];
  93. if (!isset($unstable)) {
  94. $unstable = $stable;
  95. }
  96. }
  97. if (!isset($unstable) && $release['s'] != 'stable') {
  98. $unstable = $release['v'];
  99. $state = $release['s'];
  100. }
  101. if (isset($latest) && !isset($state)) {
  102. $state = $release['s'];
  103. }
  104. if (isset($latest) && isset($stable) && isset($unstable)) {
  105. break;
  106. }
  107. }
  108. }
  109. if ($basic) { // remote-list command
  110. if (!isset($latest)) {
  111. $latest = false;
  112. }
  113. if ($dostable) {
  114. // $state is not set if there are no releases
  115. if (isset($state) && $state == 'stable') {
  116. $ret[$package] = array('stable' => $latest);
  117. } else {
  118. $ret[$package] = array('stable' => '-n/a-');
  119. }
  120. } else {
  121. $ret[$package] = array('stable' => $latest);
  122. }
  123. continue;
  124. }
  125. // list-all command
  126. if (!isset($unstable)) {
  127. $unstable = false;
  128. $state = 'stable';
  129. if (isset($stable)) {
  130. $latest = $unstable = $stable;
  131. }
  132. } else {
  133. $latest = $unstable;
  134. }
  135. if (!isset($latest)) {
  136. $latest = false;
  137. }
  138. $deps = array();
  139. if ($latest && isset($packageinfo['deps'])) {
  140. if (!is_array($packageinfo['deps']) ||
  141. !isset($packageinfo['deps'][0])
  142. ) {
  143. $packageinfo['deps'] = array($packageinfo['deps']);
  144. }
  145. $d = false;
  146. foreach ($packageinfo['deps'] as $dep) {
  147. if ($dep['v'] == $latest) {
  148. $d = unserialize($dep['d']);
  149. }
  150. }
  151. if ($d) {
  152. if (isset($d['required'])) {
  153. if (!class_exists('PEAR_PackageFile_v2')) {
  154. require_once 'PEAR/PackageFile/v2.php';
  155. }
  156. if (!isset($pf)) {
  157. $pf = new PEAR_PackageFile_v2;
  158. }
  159. $pf->setDeps($d);
  160. $tdeps = $pf->getDeps();
  161. } else {
  162. $tdeps = $d;
  163. }
  164. foreach ($tdeps as $dep) {
  165. if ($dep['type'] !== 'pkg') {
  166. continue;
  167. }
  168. $deps[] = $dep;
  169. }
  170. }
  171. }
  172. $info = array(
  173. 'stable' => $latest,
  174. 'summary' => $info['s'],
  175. 'description' => $info['d'],
  176. 'deps' => $deps,
  177. 'category' => $info['ca']['_content'],
  178. 'unstable' => $unstable,
  179. 'state' => $state
  180. );
  181. $ret[$package] = $info;
  182. }
  183. }
  184. PEAR::popErrorHandling();
  185. return $ret;
  186. }
  187. /**
  188. * List all categories of a REST server
  189. *
  190. * @param string $base base URL of the server
  191. * @return array of categorynames
  192. */
  193. function listCategories($base, $channel = false)
  194. {
  195. $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
  196. if (PEAR::isError($categorylist)) {
  197. return $categorylist;
  198. }
  199. if (!is_array($categorylist) || !isset($categorylist['c'])) {
  200. return array();
  201. }
  202. if (isset($categorylist['c']['_content'])) {
  203. // only 1 category
  204. $categorylist['c'] = array($categorylist['c']);
  205. }
  206. return $categorylist['c'];
  207. }
  208. /**
  209. * List packages in a category of a REST server
  210. *
  211. * @param string $base base URL of the server
  212. * @param string $category name of the category
  213. * @param boolean $info also download full package info
  214. * @return array of packagenames
  215. */
  216. function listCategory($base, $category, $info = false, $channel = false)
  217. {
  218. if ($info == false) {
  219. $url = '%s'.'c/%s/packages.xml';
  220. } else {
  221. $url = '%s'.'c/%s/packagesinfo.xml';
  222. }
  223. $url = sprintf($url,
  224. $base,
  225. urlencode($category));
  226. // gives '404 Not Found' error when category doesn't exist
  227. $packagelist = $this->_rest->retrieveData($url, false, false, $channel);
  228. if (PEAR::isError($packagelist)) {
  229. return $packagelist;
  230. }
  231. if (!is_array($packagelist)) {
  232. return array();
  233. }
  234. if ($info == false) {
  235. if (!isset($packagelist['p'])) {
  236. return array();
  237. }
  238. if (!is_array($packagelist['p']) ||
  239. !isset($packagelist['p'][0])) { // only 1 pkg
  240. $packagelist = array($packagelist['p']);
  241. } else {
  242. $packagelist = $packagelist['p'];
  243. }
  244. return $packagelist;
  245. }
  246. // info == true
  247. if (!isset($packagelist['pi'])) {
  248. return array();
  249. }
  250. if (!is_array($packagelist['pi']) ||
  251. !isset($packagelist['pi'][0])) { // only 1 pkg
  252. $packagelist_pre = array($packagelist['pi']);
  253. } else {
  254. $packagelist_pre = $packagelist['pi'];
  255. }
  256. $packagelist = array();
  257. foreach ($packagelist_pre as $i => $item) {
  258. // compatibility with r/<latest.txt>.xml
  259. if (isset($item['a']['r'][0])) {
  260. // multiple releases
  261. $item['p']['v'] = $item['a']['r'][0]['v'];
  262. $item['p']['st'] = $item['a']['r'][0]['s'];
  263. } elseif (isset($item['a'])) {
  264. // first and only release
  265. $item['p']['v'] = $item['a']['r']['v'];
  266. $item['p']['st'] = $item['a']['r']['s'];
  267. }
  268. $packagelist[$i] = array('attribs' => $item['p']['r'],
  269. '_content' => $item['p']['n'],
  270. 'info' => $item['p']);
  271. }
  272. return $packagelist;
  273. }
  274. /**
  275. * Return an array containing all of the states that are more stable than
  276. * or equal to the passed in state
  277. *
  278. * @param string Release state
  279. * @param boolean Determines whether to include $state in the list
  280. * @return false|array False if $state is not a valid release state
  281. */
  282. function betterStates($state, $include = false)
  283. {
  284. static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
  285. $i = array_search($state, $states);
  286. if ($i === false) {
  287. return false;
  288. }
  289. if ($include) {
  290. $i--;
  291. }
  292. return array_slice($states, $i + 1);
  293. }
  294. }
  295. ?>