Subversion Repositories Applications.gtt

Rev

Rev 94 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 94 Rev 187
Line 2... Line 2...
2
/**
2
/**
3
 * PEAR_REST_10
3
 * PEAR_REST_10
4
 *
4
 *
5
 * PHP versions 4 and 5
5
 * PHP versions 4 and 5
6
 *
6
 *
7
 * LICENSE: This source file is subject to version 3.0 of the PHP license
-
 
8
 * that is available through the world-wide-web at the following URI:
-
 
9
 * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
-
 
10
 * the PHP License and are unable to obtain it through the web, please
-
 
11
 * send a note to license@php.net so we can mail you a copy immediately.
-
 
12
 *
-
 
13
 * @category   pear
7
 * @category   pear
14
 * @package    PEAR
8
 * @package    PEAR
15
 * @author     Greg Beaver <cellog@php.net>
9
 * @author     Greg Beaver <cellog@php.net>
16
 * @copyright  1997-2006 The PHP Group
10
 * @copyright  1997-2009 The Authors
17
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
11
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
18
 * @version    CVS: $Id: 10.php,v 1.43 2006/11/01 05:09:05 cellog Exp $
-
 
19
 * @link       http://pear.php.net/package/PEAR
12
 * @link       http://pear.php.net/package/PEAR
20
 * @since      File available since Release 1.4.0a12
13
 * @since      File available since Release 1.4.0a12
21
 */
14
 */
Line 22... Line 15...
22
 
15
 
Line 29... Line 22...
29
 * Implement REST 1.0
22
 * Implement REST 1.0
30
 *
23
 *
31
 * @category   pear
24
 * @category   pear
32
 * @package    PEAR
25
 * @package    PEAR
33
 * @author     Greg Beaver <cellog@php.net>
26
 * @author     Greg Beaver <cellog@php.net>
34
 * @copyright  1997-2006 The PHP Group
27
 * @copyright  1997-2009 The Authors
35
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
28
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
36
 * @version    Release: 1.5.1
29
 * @version    Release: 1.10.1
37
 * @link       http://pear.php.net/package/PEAR
30
 * @link       http://pear.php.net/package/PEAR
38
 * @since      Class available since Release 1.4.0a12
31
 * @since      Class available since Release 1.4.0a12
39
 */
32
 */
40
class PEAR_REST_10
33
class PEAR_REST_10
41
{
34
{
42
    /**
35
    /**
43
     * @var PEAR_REST
36
     * @var PEAR_REST
44
     */
37
     */
45
    var $_rest;
38
    var $_rest;
46
    function PEAR_REST_10($config, $options = array())
39
    function __construct($config, $options = array())
47
    {
40
    {
48
        $this->_rest = &new PEAR_REST($config, $options);
41
        $this->_rest = new PEAR_REST($config, $options);
49
    }
42
    }
Line 50... Line 43...
50
 
43
 
51
    /**
44
    /**
52
     * Retrieve information about a remote package to be downloaded from a REST server
45
     * Retrieve information about a remote package to be downloaded from a REST server
Line 63... Line 56...
63
     * </pre>
56
     * </pre>
64
     * @param string $prefstate Current preferred_state config variable value
57
     * @param string $prefstate Current preferred_state config variable value
65
     * @param bool $installed the installed version of this package to compare against
58
     * @param bool $installed the installed version of this package to compare against
66
     * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
59
     * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
67
     */
60
     */
68
    function getDownloadURL($base, $packageinfo, $prefstate, $installed)
61
    function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false)
69
    {
62
    {
70
        $channel = $packageinfo['channel'];
-
 
71
        $package = $packageinfo['package'];
-
 
72
        $states = $this->betterStates($prefstate, true);
63
        $states = $this->betterStates($prefstate, true);
73
        if (!$states) {
64
        if (!$states) {
74
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
65
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
75
        }
66
        }
-
 
67
 
76
        $state = $version = null;
68
        $channel  = $packageinfo['channel'];
77
        if (isset($packageinfo['state'])) {
69
        $package  = $packageinfo['package'];
78
            $state = $packageinfo['state'];
70
        $state    = isset($packageinfo['state'])   ? $packageinfo['state']   : null;
79
        }
-
 
80
        if (isset($packageinfo['version'])) {
71
        $version  = isset($packageinfo['version']) ? $packageinfo['version'] : null;
81
            $version = $packageinfo['version'];
72
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';
82
        }
73
 
83
        $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . '/allreleases.xml');
74
        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
84
        if (PEAR::isError($info)) {
75
        if (PEAR::isError($info)) {
85
            return PEAR::raiseError('No releases available for package "' .
76
            return PEAR::raiseError('No releases available for package "' .
86
                $channel . '/' . $package . '"');
77
                $channel . '/' . $package . '"');
87
        }
78
        }
-
 
79
 
88
        if (!isset($info['r'])) {
80
        if (!isset($info['r'])) {
89
            return false;
81
            return false;
90
        }
82
        }
91
        $found = false;
-
 
-
 
83
 
92
        $release = false;
84
        $release = $found = false;
93
        if (!is_array($info['r']) || !isset($info['r'][0])) {
85
        if (!is_array($info['r']) || !isset($info['r'][0])) {
94
            $info['r'] = array($info['r']);
86
            $info['r'] = array($info['r']);
95
        }
87
        }
-
 
88
 
96
        foreach ($info['r'] as $release) {
89
        foreach ($info['r'] as $release) {
97
            if (!isset($this->_rest->_options['force']) && ($installed &&
90
            if (!isset($this->_rest->_options['force']) && ($installed &&
98
                  version_compare($release['v'], $installed, '<'))) {
91
                  version_compare($release['v'], $installed, '<'))) {
99
                continue;
92
                continue;
100
            }
93
            }
-
 
94
 
101
            if (isset($state)) {
95
            if (isset($state)) {
102
                // try our preferred state first
96
                // try our preferred state first
103
                if ($release['s'] == $state) {
97
                if ($release['s'] == $state) {
104
                    $found = true;
98
                    $found = true;
105
                    break;
99
                    break;
Line 120... Line 114...
120
                    $found = true;
114
                    $found = true;
121
                    break;
115
                    break;
122
                }
116
                }
123
            }
117
            }
124
        }
118
        }
-
 
119
 
125
        return $this->_returnDownloadURL($base, $package, $release, $info, $found);
120
        return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel);
126
    }
121
    }
Line 127... Line 122...
127
 
122
 
128
    function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage,
123
    function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage,
129
                               $prefstate = 'stable', $installed = false)
124
                               $prefstate = 'stable', $installed = false, $channel = false)
130
    {
-
 
131
        $channel = $dependency['channel'];
-
 
132
        $package = $dependency['name'];
125
    {
133
        $states = $this->betterStates($prefstate, true);
126
        $states = $this->betterStates($prefstate, true);
134
        if (!$states) {
127
        if (!$states) {
135
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
128
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
-
 
129
        }
136
        }
130
 
137
        $state = $version = null;
131
        $channel  = $dependency['channel'];
138
        if (isset($packageinfo['state'])) {
132
        $package  = $dependency['name'];
139
            $state = $packageinfo['state'];
-
 
140
        }
133
        $state    = isset($dependency['state'])   ? $dependency['state']   : null;
141
        if (isset($packageinfo['version'])) {
134
        $version  = isset($dependency['version']) ? $dependency['version'] : null;
142
            $version = $packageinfo['version'];
135
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';
143
        }
136
 
144
        $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . '/allreleases.xml');
137
        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
145
        if (PEAR::isError($info)) {
138
        if (PEAR::isError($info)) {
146
            return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package']
139
            return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package']
147
                . '" dependency "' . $channel . '/' . $package . '" has no releases');
140
                . '" dependency "' . $channel . '/' . $package . '" has no releases');
-
 
141
        }
148
        }
142
 
149
        if (!is_array($info) || !isset($info['r'])) {
143
        if (!is_array($info) || !isset($info['r'])) {
150
            return false;
144
            return false;
-
 
145
        }
151
        }
146
 
152
        $exclude = array();
147
        $exclude = array();
153
        $min = $max = $recommended = false;
148
        $min = $max = $recommended = false;
154
        if ($xsdversion == '1.0') {
-
 
155
            $pinfo['package'] = $dependency['name'];
-
 
156
            $pinfo['channel'] = 'pear.php.net'; // this is always true - don't change this
149
        if ($xsdversion == '1.0') {
157
            switch ($dependency['rel']) {
150
            switch ($dependency['rel']) {
158
                case 'ge' :
151
                case 'ge' :
159
                    $min = $dependency['version'];
152
                    $min = $dependency['version'];
160
                break;
153
                break;
Line 175... Line 168...
175
                case 'ne' :
168
                case 'ne' :
176
                    $exclude = array($dependency['version']);
169
                    $exclude = array($dependency['version']);
177
                break;
170
                break;
178
            }
171
            }
179
        } else {
172
        } else {
180
            $pinfo['package'] = $dependency['name'];
-
 
181
            $min = isset($dependency['min']) ? $dependency['min'] : false;
173
            $min = isset($dependency['min']) ? $dependency['min'] : false;
182
            $max = isset($dependency['max']) ? $dependency['max'] : false;
174
            $max = isset($dependency['max']) ? $dependency['max'] : false;
183
            $recommended = isset($dependency['recommended']) ?
175
            $recommended = isset($dependency['recommended']) ?
184
                $dependency['recommended'] : false;
176
                $dependency['recommended'] : false;
185
            if (isset($dependency['exclude'])) {
177
            if (isset($dependency['exclude'])) {
186
                if (!isset($dependency['exclude'][0])) {
178
                if (!isset($dependency['exclude'][0])) {
187
                    $exclude = array($dependency['exclude']);
179
                    $exclude = array($dependency['exclude']);
188
                }
180
                }
189
            }
181
            }
190
        }
182
        }
191
        $found = false;
-
 
192
        $release = false;
183
        $release = $found = false;
193
        if (!is_array($info['r']) || !isset($info['r'][0])) {
184
        if (!is_array($info['r']) || !isset($info['r'][0])) {
194
            $info['r'] = array($info['r']);
185
            $info['r'] = array($info['r']);
195
        }
186
        }
196
        foreach ($info['r'] as $release) {
187
        foreach ($info['r'] as $release) {
197
            if (!isset($this->_rest->_options['force']) && ($installed &&
188
            if (!isset($this->_rest->_options['force']) && ($installed &&
Line 228... Line 219...
228
                    continue;
219
                    continue;
229
                } else {
220
                } else {
230
                    if (!in_array($release['s'], $states)) {
221
                    if (!in_array($release['s'], $states)) {
231
                        // the stability is too low, but we must return the
222
                        // the stability is too low, but we must return the
232
                        // recommended version if possible
223
                        // recommended version if possible
233
                        return $this->_returnDownloadURL($base, $package, $release, $info, true);
224
                        return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel);
234
                    }
225
                    }
235
                }
226
                }
236
            }
227
            }
237
            if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions
228
            if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions
238
                continue;
229
                continue;
Line 246... Line 237...
246
            if (in_array($release['s'], $states)) { // if in the preferred state...
237
            if (in_array($release['s'], $states)) { // if in the preferred state...
247
                $found = true; // ... then use it
238
                $found = true; // ... then use it
248
                break;
239
                break;
249
            }
240
            }
250
        }
241
        }
251
        return $this->_returnDownloadURL($base, $package, $release, $info, $found);
242
        return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel);
252
    }
243
    }
Line 253... Line 244...
253
 
244
 
254
    /**
245
    /**
255
     * Take raw data and return the array needed for processing a download URL
246
     * Take raw data and return the array needed for processing a download URL
256
     *
247
     *
257
     * @param string $base REST base uri
248
     * @param string $base REST base uri
258
     * @param string $package Package name
249
     * @param string $package Package name
259
     * @param array $release an array of format array('v' => version, 's' => state)
250
     * @param array $release an array of format array('v' => version, 's' => state)
260
     *                       describing the release to download
251
     *                       describing the release to download
261
     * @param array $info list of all releases as defined by allreleases.xml
252
     * @param array $info list of all releases as defined by allreleases.xml
-
 
253
     * @param bool|null $found determines whether the release was found or this is the next
262
     * @param bool $found determines whether the release was found or this is the next
254
     *                    best alternative.  If null, then versions were skipped because
263
     *                    best alternative
255
     *                    of PHP dependency
264
     * @return array|PEAR_Error
256
     * @return array|PEAR_Error
265
     * @access private
257
     * @access private
266
     */
258
     */
267
    function _returnDownloadURL($base, $package, $release, $info, $found)
259
    function _returnDownloadURL($base, $package, $release, $info, $found, $phpversion = false, $channel = false)
268
    {
260
    {
269
        if (!$found) {
261
        if (!$found) {
270
            $release = $info['r'][0];
262
            $release = $info['r'][0];
-
 
263
        }
-
 
264
 
271
        }
265
        $packageLower = strtolower($package);
272
        $pinfo = $this->_rest->retrieveCacheFirst($base . 'p/' . strtolower($package) . '/' . 
266
        $pinfo = $this->_rest->retrieveCacheFirst($base . 'p/' . $packageLower . '/' .
273
            'info.xml');
267
            'info.xml', false, false, $channel);
274
        if (PEAR::isError($pinfo)) {
268
        if (PEAR::isError($pinfo)) {
275
            return PEAR::raiseError('Package "' . $package .
269
            return PEAR::raiseError('Package "' . $package .
276
                '" does not have REST info xml available');
270
                '" does not have REST info xml available');
-
 
271
        }
277
        }
272
 
278
        $releaseinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/' . 
273
        $releaseinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . $packageLower . '/' .
279
            $release['v'] . '.xml');
274
            $release['v'] . '.xml', false, false, $channel);
280
        if (PEAR::isError($releaseinfo)) {
275
        if (PEAR::isError($releaseinfo)) {
281
            return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
276
            return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
282
                '" does not have REST xml available');
277
                '" does not have REST xml available');
-
 
278
        }
283
        }
279
 
284
        $packagexml = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/' .
280
        $packagexml = $this->_rest->retrieveCacheFirst($base . 'r/' . $packageLower . '/' .
285
            'deps.' . $release['v'] . '.txt', false, true);
281
            'deps.' . $release['v'] . '.txt', false, true, $channel);
286
        if (PEAR::isError($packagexml)) {
282
        if (PEAR::isError($packagexml)) {
287
            return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
283
            return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
288
                '" does not have REST dependency information available');
284
                '" does not have REST dependency information available');
-
 
285
        }
289
        }
286
 
290
        $packagexml = unserialize($packagexml);
287
        $packagexml = unserialize($packagexml);
291
        if (!$packagexml) {
288
        if (!$packagexml) {
292
            $packagexml = array();
289
            $packagexml = array();
-
 
290
        }
293
        }
291
 
294
        $allinfo = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
292
        $allinfo = $this->_rest->retrieveData($base . 'r/' . $packageLower .
-
 
293
            '/allreleases.xml', false, false, $channel);
-
 
294
        if (PEAR::isError($allinfo)) {
-
 
295
            return $allinfo;
-
 
296
        }
295
            '/allreleases.xml');
297
 
296
        if (!is_array($allinfo['r']) || !isset($allinfo['r'][0])) {
298
        if (!is_array($allinfo['r']) || !isset($allinfo['r'][0])) {
297
            $allinfo['r'] = array($allinfo['r']);
299
            $allinfo['r'] = array($allinfo['r']);
-
 
300
        }
298
        }
301
 
299
        $compatible = false;
302
        $compatible = false;
300
        foreach ($allinfo['r'] as $release) {
303
        foreach ($allinfo['r'] as $release) {
301
            if ($release['v'] != $releaseinfo['v']) {
304
            if ($release['v'] != $releaseinfo['v']) {
302
                continue;
305
                continue;
-
 
306
            }
303
            }
307
 
304
            if (!isset($release['co'])) {
308
            if (!isset($release['co'])) {
305
                break;
309
                break;
-
 
310
            }
306
            }
311
 
307
            $compatible = array();
312
            $compatible = array();
308
            if (!is_array($release['co']) || !isset($release['co'][0])) {
313
            if (!is_array($release['co']) || !isset($release['co'][0])) {
309
                $release['co'] = array($release['co']);
314
                $release['co'] = array($release['co']);
-
 
315
            }
310
            }
316
 
311
            foreach ($release['co'] as $entry) {
317
            foreach ($release['co'] as $entry) {
312
                $comp = array();
318
                $comp = array();
313
                $comp['name'] = $entry['p'];
319
                $comp['name']    = $entry['p'];
314
                $comp['channel'] = $entry['c'];
320
                $comp['channel'] = $entry['c'];
315
                $comp['min'] = $entry['min'];
321
                $comp['min']     = $entry['min'];
316
                $comp['max'] = $entry['max'];
322
                $comp['max']     = $entry['max'];
317
                if (isset($entry['x']) && !is_array($entry['x'])) {
323
                if (isset($entry['x']) && !is_array($entry['x'])) {
318
                    $comp['exclude'] = $entry['x'];
324
                    $comp['exclude'] = $entry['x'];
-
 
325
                }
319
                }
326
 
320
                $compatible[] = $comp;
327
                $compatible[] = $comp;
-
 
328
            }
321
            }
329
 
322
            if (count($compatible) == 1) {
330
            if (count($compatible) == 1) {
323
                $compatible = $compatible[0];
331
                $compatible = $compatible[0];
-
 
332
            }
324
            }
333
 
325
            break;
334
            break;
-
 
335
        }
-
 
336
 
326
        }
337
        $deprecated = false;
-
 
338
        if (isset($pinfo['dc']) && isset($pinfo['dp'])) {
327
        if (isset($pinfo['dc']) && isset($pinfo['dp'])) {
339
            if (is_array($pinfo['dp'])) {
328
            $deprecated = array('channel' => (string) $pinfo['dc'],
340
                $deprecated = array('channel' => (string) $pinfo['dc'],
329
                                'package' => trim($pinfo['dp']['_content']));
341
                                    'package' => trim($pinfo['dp']['_content']));
330
        } else {
342
            } else {
-
 
343
                $deprecated = array('channel' => (string) $pinfo['dc'],
-
 
344
                                    'package' => trim($pinfo['dp']));
331
            $deprecated = false;
345
            }
-
 
346
        }
-
 
347
 
-
 
348
        $return = array(
-
 
349
            'version'    => $releaseinfo['v'],
-
 
350
            'info'       => $packagexml,
-
 
351
            'package'    => $releaseinfo['p']['_content'],
-
 
352
            'stability'  => $releaseinfo['st'],
-
 
353
            'compatible' => $compatible,
-
 
354
            'deprecated' => $deprecated,
-
 
355
        );
332
        }
356
 
333
        if ($found) {
-
 
334
            return 
-
 
335
                array('version' => $releaseinfo['v'],
-
 
336
                      'info' => $packagexml,
-
 
337
                      'package' => $releaseinfo['p']['_content'],
-
 
338
                      'stability' => $releaseinfo['st'],
357
        if ($found) {
339
                      'url' => $releaseinfo['g'],
-
 
340
                      'compatible' => $compatible,
-
 
341
                      'deprecated' => $deprecated,
-
 
342
                );
-
 
343
        } else {
358
            $return['url'] = $releaseinfo['g'];
344
            return
-
 
345
                array('version' => $releaseinfo['v'],
-
 
346
                      'package' => $releaseinfo['p']['_content'],
-
 
347
                      'stability' => $releaseinfo['st'],
-
 
348
                      'info' => $packagexml,
-
 
349
                      'compatible' => $compatible,
-
 
350
                      'deprecated' => $deprecated,
-
 
351
                );
359
            return $return;
-
 
360
        }
-
 
361
 
-
 
362
        $return['php'] = $phpversion;
352
        }
363
        return $return;
Line 353... Line 364...
353
    }
364
    }
354
 
365
 
355
    function listPackages($base)
366
    function listPackages($base, $channel = false)
356
    {
367
    {
357
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml');
368
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
358
        if (PEAR::isError($packagelist)) {
369
        if (PEAR::isError($packagelist)) {
-
 
370
            return $packagelist;
359
            return $packagelist;
371
        }
360
        }
372
 
361
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
373
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
-
 
374
            return array();
362
            return array();
375
        }
363
        }
376
 
364
        if (!is_array($packagelist['p'])) {
377
        if (!is_array($packagelist['p'])) {
-
 
378
            $packagelist['p'] = array($packagelist['p']);
365
            $packagelist['p'] = array($packagelist['p']);
379
        }
366
        }
380
 
Line -... Line 381...
-
 
381
        return $packagelist['p'];
-
 
382
    }
-
 
383
 
-
 
384
    /**
-
 
385
     * List all categories of a REST server
-
 
386
     *
367
        return $packagelist['p'];
387
     * @param string $base base URL of the server
368
    }
388
     * @return array of categorynames
-
 
389
     */
-
 
390
    function listCategories($base, $channel = false)
-
 
391
    {
-
 
392
        $categories = array();
-
 
393
 
-
 
394
        // c/categories.xml does not exist;
-
 
395
        // check for every package its category manually
-
 
396
        // This is SLOOOWWWW : ///
-
 
397
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
-
 
398
        if (PEAR::isError($packagelist)) {
-
 
399
            return $packagelist;
-
 
400
        }
-
 
401
 
-
 
402
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
-
 
403
            $ret = array();
-
 
404
            return $ret;
-
 
405
        }
-
 
406
 
-
 
407
        if (!is_array($packagelist['p'])) {
-
 
408
            $packagelist['p'] = array($packagelist['p']);
-
 
409
        }
-
 
410
 
-
 
411
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
-
 
412
        foreach ($packagelist['p'] as $package) {
-
 
413
                $inf = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel);
-
 
414
                if (PEAR::isError($inf)) {
-
 
415
                    PEAR::popErrorHandling();
-
 
416
                    return $inf;
-
 
417
                }
-
 
418
                $cat = $inf['ca']['_content'];
-
 
419
                if (!isset($categories[$cat])) {
-
 
420
                    $categories[$cat] = $inf['ca'];
-
 
421
                }
-
 
422
        }
-
 
423
 
-
 
424
        return array_values($categories);
-
 
425
    }
-
 
426
 
-
 
427
    /**
-
 
428
     * List a category of a REST server
-
 
429
     *
-
 
430
     * @param string $base base URL of the server
-
 
431
     * @param string $category name of the category
-
 
432
     * @param boolean $info also download full package info
-
 
433
     * @return array of packagenames
-
 
434
     */
-
 
435
    function listCategory($base, $category, $info = false, $channel = false)
-
 
436
    {
-
 
437
        // gives '404 Not Found' error when category doesn't exist
-
 
438
        $packagelist = $this->_rest->retrieveData($base.'c/'.urlencode($category).'/packages.xml', false, false, $channel);
-
 
439
        if (PEAR::isError($packagelist)) {
-
 
440
            return $packagelist;
-
 
441
        }
-
 
442
 
-
 
443
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
-
 
444
            return array();
-
 
445
        }
-
 
446
 
-
 
447
        if (!is_array($packagelist['p']) ||
-
 
448
            !isset($packagelist['p'][0])) { // only 1 pkg
-
 
449
            $packagelist = array($packagelist['p']);
-
 
450
        } else {
-
 
451
            $packagelist = $packagelist['p'];
-
 
452
        }
-
 
453
 
-
 
454
        if ($info == true) {
-
 
455
            // get individual package info
-
 
456
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
-
 
457
            foreach ($packagelist as $i => $packageitem) {
-
 
458
                $url = sprintf('%s'.'r/%s/latest.txt',
-
 
459
                        $base,
-
 
460
                        strtolower($packageitem['_content']));
-
 
461
                $version = $this->_rest->retrieveData($url, false, false, $channel);
-
 
462
                if (PEAR::isError($version)) {
-
 
463
                    break; // skipit
-
 
464
                }
-
 
465
                $url = sprintf('%s'.'r/%s/%s.xml',
-
 
466
                        $base,
-
 
467
                        strtolower($packageitem['_content']),
-
 
468
                        $version);
-
 
469
                $info = $this->_rest->retrieveData($url, false, false, $channel);
-
 
470
                if (PEAR::isError($info)) {
-
 
471
                    break; // skipit
-
 
472
                }
-
 
473
                $packagelist[$i]['info'] = $info;
-
 
474
            }
-
 
475
            PEAR::popErrorHandling();
-
 
476
        }
-
 
477
 
-
 
478
        return $packagelist;
-
 
479
    }
-
 
480
 
369
 
481
 
370
    function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false)
482
    function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false)
371
    {
483
    {
372
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml');
484
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
373
        if (PEAR::isError($packagelist)) {
485
        if (PEAR::isError($packagelist)) {
374
            return $packagelist;
486
            return $packagelist;
375
        }
487
        }
376
        if ($this->_rest->config->get('verbose') > 0) {
488
        if ($this->_rest->config->get('verbose') > 0) {
377
            $ui = &PEAR_Frontend::singleton();
489
            $ui = &PEAR_Frontend::singleton();
378
            $ui->log('Retrieving data...0%', false);
490
            $ui->log('Retrieving data...0%', true);
379
        }
491
        }
380
        $ret = array();
492
        $ret = array();
381
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
493
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
382
            return $ret;
494
            return $ret;
383
        }
495
        }
-
 
496
        if (!is_array($packagelist['p'])) {
-
 
497
            $packagelist['p'] = array($packagelist['p']);
-
 
498
        }
-
 
499
 
-
 
500
        // only search-packagename = quicksearch !
-
 
501
        if ($searchpackage && (!$searchsummary || empty($searchpackage))) {
-
 
502
            $newpackagelist = array();
-
 
503
            foreach ($packagelist['p'] as $package) {
-
 
504
                if (!empty($searchpackage) && stristr($package, $searchpackage) !== false) {
-
 
505
                    $newpackagelist[] = $package;
-
 
506
                }
384
        if (!is_array($packagelist['p'])) {
507
            }
385
            $packagelist['p'] = array($packagelist['p']);
508
            $packagelist['p'] = $newpackagelist;
386
        }
509
        }
387
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
510
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
388
        $next = .1;
511
        $next = .1;
Line 395... Line 518...
395
                        $ui->log('.', false);
518
                        $ui->log('.', false);
396
                    }
519
                    }
397
                    $next += .1;
520
                    $next += .1;
398
                }
521
                }
399
            }
522
            }
-
 
523
 
400
            if ($basic) { // remote-list command
524
            if ($basic) { // remote-list command
401
                if ($dostable) {
525
                if ($dostable) {
402
                    $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
526
                    $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
403
                        '/stable.txt');
527
                        '/stable.txt', false, false, $channel);
404
                } else {
528
                } else {
405
                    $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
529
                    $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
406
                        '/latest.txt');
530
                        '/latest.txt', false, false, $channel);
407
                }
531
                }
408
                if (PEAR::isError($latest)) {
532
                if (PEAR::isError($latest)) {
409
                    $latest = false;
533
                    $latest = false;
410
                }
534
                }
411
                $info = array('stable' => $latest);
535
                $info = array('stable' => $latest);
412
            } else { // list-all command
536
            } else { // list-all command
413
                $inf = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml');
537
                $inf = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel);
414
                if (PEAR::isError($inf)) {
538
                if (PEAR::isError($inf)) {
415
                    PEAR::popErrorHandling();
539
                    PEAR::popErrorHandling();
416
                    return $inf;
540
                    return $inf;
417
                }
541
                }
418
                if ($searchpackage) {
542
                if ($searchpackage) {
Line 423... Line 547...
423
                    {
547
                    {
424
                        continue;
548
                        continue;
425
                    };
549
                    };
426
                }
550
                }
427
                $releases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
551
                $releases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
428
                    '/allreleases.xml');
552
                    '/allreleases.xml', false, false, $channel);
429
                if (PEAR::isError($releases)) {
553
                if (PEAR::isError($releases)) {
430
                    continue;
554
                    continue;
431
                }
555
                }
432
                if (!isset($releases['r'][0])) {
556
                if (!isset($releases['r'][0])) {
433
                    $releases['r'] = array($releases['r']);
557
                    $releases['r'] = array($releases['r']);
Line 477... Line 601...
477
                if (!isset($latest)) {
601
                if (!isset($latest)) {
478
                    $latest = false;
602
                    $latest = false;
479
                }
603
                }
480
                if ($latest) {
604
                if ($latest) {
481
                    $d = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' .
605
                    $d = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' .
482
                        $latest . '.txt');
606
                        $latest . '.txt', false, false, $channel);
483
                    if (!PEAR::isError($d)) {
607
                    if (!PEAR::isError($d)) {
484
                        $d = unserialize($d);
608
                        $d = unserialize($d);
485
                        if ($d) {
609
                        if ($d) {
486
                            if (isset($d['required'])) {
610
                            if (isset($d['required'])) {
487
                                if (!class_exists('PEAR_PackageFile_v2')) {
611
                                if (!class_exists('PEAR_PackageFile_v2')) {
Line 521... Line 645...
521
        }
645
        }
522
        PEAR::popErrorHandling();
646
        PEAR::popErrorHandling();
523
        return $ret;
647
        return $ret;
524
    }
648
    }
Line 525... Line 649...
525
 
649
 
526
    function listLatestUpgrades($base, $state, $installed, $channel, &$reg)
650
    function listLatestUpgrades($base, $pref_state, $installed, $channel, &$reg)
527
    {
651
    {
528
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml');
652
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
529
        if (PEAR::isError($packagelist)) {
653
        if (PEAR::isError($packagelist)) {
530
            return $packagelist;
654
            return $packagelist;
-
 
655
        }
531
        }
656
 
532
        $ret = array();
657
        $ret = array();
533
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
658
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
534
            return $ret;
659
            return $ret;
-
 
660
        }
535
        }
661
 
536
        if (!is_array($packagelist['p'])) {
662
        if (!is_array($packagelist['p'])) {
537
            $packagelist['p'] = array($packagelist['p']);
663
            $packagelist['p'] = array($packagelist['p']);
538
        }
-
 
539
        if ($state) {
-
 
540
            $states = $this->betterStates($state, true);
664
        }
541
        }
665
 
542
        foreach ($packagelist['p'] as $package) {
666
        foreach ($packagelist['p'] as $package) {
543
            if (!isset($installed[strtolower($package)])) {
667
            if (!isset($installed[strtolower($package)])) {
544
                continue;
668
                continue;
-
 
669
            }
545
            }
670
 
-
 
671
            $inst_version = $reg->packageInfo($package, 'version', $channel);
546
            $inst_version = $reg->packageInfo($package, 'version', $channel);
672
            $inst_state   = $reg->packageInfo($package, 'release_state', $channel);
547
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
673
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
548
            $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
674
            $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
549
                '/allreleases.xml');
675
                '/allreleases.xml', false, false, $channel);
550
            PEAR::popErrorHandling();
676
            PEAR::popErrorHandling();
551
            if (PEAR::isError($info)) {
677
            if (PEAR::isError($info)) {
552
                continue; // no remote releases
678
                continue; // no remote releases
-
 
679
            }
553
            }
680
 
554
            if (!isset($info['r'])) {
681
            if (!isset($info['r'])) {
555
                continue;
682
                continue;
556
            }
-
 
-
 
683
            }
557
            $found = false;
684
 
558
            $release = false;
685
            $release = $found = false;
559
            if (!is_array($info['r']) || !isset($info['r'][0])) {
686
            if (!is_array($info['r']) || !isset($info['r'][0])) {
560
                $info['r'] = array($info['r']);
687
                $info['r'] = array($info['r']);
-
 
688
            }
-
 
689
 
-
 
690
            // $info['r'] is sorted by version number
561
            }
691
            usort($info['r'], array($this, '_sortReleasesByVersionNumber'));
562
            foreach ($info['r'] as $release) {
692
            foreach ($info['r'] as $release) {
-
 
693
                if ($inst_version && version_compare($release['v'], $inst_version, '<=')) {
563
                if ($inst_version && version_compare($release['v'], $inst_version, '<=')) {
694
                    // not newer than the one installed
564
                    continue;
695
                    break;
-
 
696
                }
-
 
697
 
565
                }
698
                // new version > installed version
-
 
699
                if (!$pref_state) {
-
 
700
                    // every state is a good state
-
 
701
                    $found = true;
-
 
702
                    break;
566
                if ($state) {
703
                } else {
-
 
704
                    $new_state = $release['s'];
-
 
705
                    // if new state >= installed state: go
567
                    if (in_array($release['s'], $states)) {
706
                    if (in_array($new_state, $this->betterStates($inst_state, true))) {
568
                        $found = true;
707
                        $found = true;
-
 
708
                        break;
-
 
709
                    } else {
-
 
710
                        // only allow to lower the state of package,
-
 
711
                        // if new state >= preferred state: go
-
 
712
                        if (in_array($new_state, $this->betterStates($pref_state, true))) {
-
 
713
                            $found = true;
-
 
714
                            break;
569
                        break;
715
                        }
570
                    }
-
 
571
                } else {
-
 
572
                    $found = true;
-
 
573
                    break;
716
                    }
574
                }
717
                }
-
 
718
            }
575
            }
719
 
576
            if (!$found) {
720
            if (!$found) {
577
                continue;
721
                continue;
-
 
722
            }
578
            }
723
 
579
            $relinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/' . 
724
            $relinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/' .
580
                $release['v'] . '.xml');
725
                $release['v'] . '.xml', false, false, $channel);
581
            if (PEAR::isError($relinfo)) {
726
            if (PEAR::isError($relinfo)) {
582
                return $relinfo;
727
                return $relinfo;
-
 
728
            }
583
            }
729
 
584
            $ret[$package] = array(
730
            $ret[$package] = array(
585
                    'version' => $release['v'],
731
                'version'  => $release['v'],
586
                    'state' => $release['s'],
732
                'state'    => $release['s'],
587
                    'filesize' => $relinfo['f'],
733
                'filesize' => $relinfo['f'],
588
                );
734
            );
-
 
735
        }
589
        }
736
 
590
        return $ret;
737
        return $ret;
Line 591... Line 738...
591
    }
738
    }
592
 
739
 
593
    function packageInfo($base, $package)
740
    function packageInfo($base, $package, $channel = false)
594
    {
741
    {
595
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
742
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
596
        $pinfo = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml');
743
        $pinfo = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel);
597
        if (PEAR::isError($pinfo)) {
744
        if (PEAR::isError($pinfo)) {
598
            PEAR::popErrorHandling();
745
            PEAR::popErrorHandling();
599
            return PEAR::raiseError('Unknown package: "' . $package . '" (Debug: ' .
746
            return PEAR::raiseError('Unknown package: "' . $package . '" in channel "' . $channel . '"' . "\n". 'Debug: ' .
-
 
747
                $pinfo->getMessage());
600
                $pinfo->getMessage() . ')');
748
        }
601
        }
749
 
602
        $releases = array();
750
        $releases = array();
603
        $allreleases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
751
        $allreleases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
604
            '/allreleases.xml');
752
            '/allreleases.xml', false, false, $channel);
605
        if (!PEAR::isError($allreleases)) {
753
        if (!PEAR::isError($allreleases)) {
606
            if (!class_exists('PEAR_PackageFile_v2')) {
754
            if (!class_exists('PEAR_PackageFile_v2')) {
-
 
755
                require_once 'PEAR/PackageFile/v2.php';
607
                require_once 'PEAR/PackageFile/v2.php';
756
            }
608
            }
757
 
609
            if (!is_array($allreleases['r']) || !isset($allreleases['r'][0])) {
758
            if (!is_array($allreleases['r']) || !isset($allreleases['r'][0])) {
-
 
759
                $allreleases['r'] = array($allreleases['r']);
610
                $allreleases['r'] = array($allreleases['r']);
760
            }
611
            }
761
 
612
            $pf = new PEAR_PackageFile_v2;
762
            $pf = new PEAR_PackageFile_v2;
613
            foreach ($allreleases['r'] as $release) {
763
            foreach ($allreleases['r'] as $release) {
614
                $ds = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' .
764
                $ds = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' .
615
                    $release['v'] . '.txt');
765
                    $release['v'] . '.txt', false, false, $channel);
616
                if (PEAR::isError($ds)) {
766
                if (PEAR::isError($ds)) {
-
 
767
                    continue;
617
                    continue;
768
                }
618
                }
769
 
619
                if (!isset($latest)) {
770
                if (!isset($latest)) {
-
 
771
                    $latest = $release['v'];
620
                    $latest = $release['v'];
772
                }
621
                }
773
 
622
                $pf->setDeps(unserialize($ds));
774
                $pf->setDeps(unserialize($ds));
623
                $ds = $pf->getDeps();
775
                $ds = $pf->getDeps();
-
 
776
                $info = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package)
624
                $info = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package)
777
                    . '/' . $release['v'] . '.xml', false, false, $channel);
625
                    . '/' . $release['v'] . '.xml');
778
 
626
                if (PEAR::isError($info)) {
779
                if (PEAR::isError($info)) {
-
 
780
                    continue;
627
                    continue;
781
                }
628
                }
782
 
629
                $releases[$release['v']] = array(
783
                $releases[$release['v']] = array(
630
                    'doneby' => $info['m'],
784
                    'doneby' => $info['m'],
631
                    'license' => $info['l'],
785
                    'license' => $info['l'],
Line 638... Line 792...
638
                );
792
                );
639
            }
793
            }
640
        } else {
794
        } else {
641
            $latest = '';
795
            $latest = '';
642
        }
796
        }
-
 
797
 
643
        PEAR::popErrorHandling();
798
        PEAR::popErrorHandling();
644
        if (isset($pinfo['dc']) && isset($pinfo['dp'])) {
799
        if (isset($pinfo['dc']) && isset($pinfo['dp'])) {
-
 
800
            if (is_array($pinfo['dp'])) {
645
            $deprecated = array('channel' => (string) $pinfo['dc'],
801
                $deprecated = array('channel' => (string) $pinfo['dc'],
646
                                'package' => trim($pinfo['dp']['_content']));
802
                                    'package' => trim($pinfo['dp']['_content']));
-
 
803
            } else {
-
 
804
                $deprecated = array('channel' => (string) $pinfo['dc'],
-
 
805
                                    'package' => trim($pinfo['dp']));
-
 
806
            }
647
        } else {
807
        } else {
648
            $deprecated = false;
808
            $deprecated = false;
649
        }
809
        }
-
 
810
 
-
 
811
        if (!isset($latest)) {
-
 
812
            $latest = '';
-
 
813
        }
-
 
814
 
650
        return array(
815
        return array(
651
            'name' => $pinfo['n'],
816
            'name' => $pinfo['n'],
652
            'channel' => $pinfo['c'],
817
            'channel' => $pinfo['c'],
653
            'category' => $pinfo['ca']['_content'],
818
            'category' => $pinfo['ca']['_content'],
654
            'stable' => $latest,
819
            'stable' => $latest,
Line 673... Line 838...
673
        static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
838
        static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
674
        $i = array_search($state, $states);
839
        $i = array_search($state, $states);
675
        if ($i === false) {
840
        if ($i === false) {
676
            return false;
841
            return false;
677
        }
842
        }
-
 
843
 
678
        if ($include) {
844
        if ($include) {
679
            $i--;
845
            $i--;
680
        }
846
        }
-
 
847
 
681
        return array_slice($states, $i + 1);
848
        return array_slice($states, $i + 1);
682
    }
849
    }
-
 
850
 
-
 
851
    /**
-
 
852
     * Sort releases by version number
-
 
853
     *
-
 
854
     * @access private
-
 
855
     */
-
 
856
    function _sortReleasesByVersionNumber($a, $b)
-
 
857
    {
-
 
858
        if (version_compare($a['v'], $b['v'], '=')) {
-
 
859
            return 0;
-
 
860
        }
-
 
861
 
-
 
862
        if (version_compare($a['v'], $b['v'], '>')) {
-
 
863
            return -1;
-
 
864
        }
-
 
865
 
-
 
866
        if (version_compare($a['v'], $b['v'], '<')) {
-
 
867
            return 1;
-
 
868
        }
-
 
869
    }
683
}
870
}
684
?>
-
 
685
871