Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 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
?>