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