source: branches/version-2_13-dev/data/module/PEAR/REST/11.php @ 23125

Revision 23125, 11.0 KB checked in by kimoto, 11 years ago (diff)

#2275 PEAR更新
不要なrequire_onceの削除
レガシーなPEARモジュールは使わない
SearchReplace?.phpのパスが間違っているので修正

Line 
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 */
20require_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 */
34class 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?>
Note: See TracBrowser for help on using the repository browser.