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