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_DependencyDB, advanced installed packages dependency database
3
 * PEAR_DependencyDB, advanced installed packages dependency database
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     Tomas V. V. Cox <cox@idecnet.com>
9
 * @author     Tomas V. V. Cox <cox@idecnet.com>
16
 * @author     Greg Beaver <cellog@php.net>
10
 * @author     Greg Beaver <cellog@php.net>
17
 * @copyright  1997-2006 The PHP Group
11
 * @copyright  1997-2009 The Authors
18
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
12
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
19
 * @version    CVS: $Id: DependencyDB.php,v 1.35 2007/01/06 04:03:32 cellog Exp $
-
 
20
 * @link       http://pear.php.net/package/PEAR
13
 * @link       http://pear.php.net/package/PEAR
21
 * @since      File available since Release 1.4.0a1
14
 * @since      File available since Release 1.4.0a1
22
 */
15
 */
Line 23... Line 16...
23
 
16
 
Line 32... Line 25...
32
 * Track dependency relationships between installed packages
25
 * Track dependency relationships between installed packages
33
 * @category   pear
26
 * @category   pear
34
 * @package    PEAR
27
 * @package    PEAR
35
 * @author     Greg Beaver <cellog@php.net>
28
 * @author     Greg Beaver <cellog@php.net>
36
 * @author     Tomas V.V.Cox <cox@idec.net.com>
29
 * @author     Tomas V.V.Cox <cox@idec.net.com>
37
 * @copyright  1997-2006 The PHP Group
30
 * @copyright  1997-2009 The Authors
38
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
31
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
39
 * @version    Release: 1.5.1
32
 * @version    Release: 1.10.1
40
 * @link       http://pear.php.net/package/PEAR
33
 * @link       http://pear.php.net/package/PEAR
41
 * @since      Class available since Release 1.4.0a1
34
 * @since      Class available since Release 1.4.0a1
42
 */
35
 */
43
class PEAR_DependencyDB
36
class PEAR_DependencyDB
44
{
37
{
Line 93... Line 86...
93
    /**
86
    /**
94
     * Get a raw dependency database.  Calls setConfig() and assertDepsDB()
87
     * Get a raw dependency database.  Calls setConfig() and assertDepsDB()
95
     * @param PEAR_Config
88
     * @param PEAR_Config
96
     * @param string|false full path to the dependency database, or false to use default
89
     * @param string|false full path to the dependency database, or false to use default
97
     * @return PEAR_DependencyDB|PEAR_Error
90
     * @return PEAR_DependencyDB|PEAR_Error
98
     * @static
-
 
99
     */
91
     */
100
    function &singleton(&$config, $depdb = false)
92
    public static function &singleton(&$config, $depdb = false)
101
    {
93
    {
102
        if (!isset($GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE']
94
        $phpdir = $config->get('php_dir', null, 'pear.php.net');
103
              [$config->get('php_dir', null, 'pear.php.net')])) {
95
        if (!isset($GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir])) {
104
            $a = new PEAR_DependencyDB;
96
            $a = new PEAR_DependencyDB;
105
            $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE']
97
            $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir] = &$a;
106
              [$config->get('php_dir', null, 'pear.php.net')] = &$a;
-
 
107
            $a->setConfig($config, $depdb);
98
            $a->setConfig($config, $depdb);
-
 
99
            $e = $a->assertDepsDB();
108
            if (PEAR::isError($e = $a->assertDepsDB())) {
100
            if (PEAR::isError($e)) {
109
                return $e;
101
                return $e;
110
            }
102
            }
111
        }
103
        }
-
 
104
 
112
        return $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE']
105
        return $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir];
113
              [$config->get('php_dir', null, 'pear.php.net')];
-
 
114
    }
106
    }
Line 115... Line 107...
115
 
107
 
116
    /**
108
    /**
117
     * Set up the registry/location of dependency DB
109
     * Set up the registry/location of dependency DB
Line 123... Line 115...
123
        if (!$config) {
115
        if (!$config) {
124
            $this->_config = &PEAR_Config::singleton();
116
            $this->_config = &PEAR_Config::singleton();
125
        } else {
117
        } else {
126
            $this->_config = &$config;
118
            $this->_config = &$config;
127
        }
119
        }
-
 
120
 
128
        $this->_registry = &$this->_config->getRegistry();
121
        $this->_registry = &$this->_config->getRegistry();
129
        if (!$depdb) {
122
        if (!$depdb) {
-
 
123
            $dir = $this->_config->get('metadata_dir', null, 'pear.php.net');
-
 
124
            if (!$dir) {
130
            $this->_depdb = $this->_config->get('php_dir', null, 'pear.php.net') .
125
                $dir = $this->_config->get('php_dir', null, 'pear.php.net');
-
 
126
            }
131
                DIRECTORY_SEPARATOR . '.depdb';
127
            $this->_depdb =  $dir . DIRECTORY_SEPARATOR . '.depdb';
132
        } else {
128
        } else {
133
            $this->_depdb = $depdb;
129
            $this->_depdb = $depdb;
134
        }
130
        }
-
 
131
 
135
        $this->_lockfile = dirname($this->_depdb) . DIRECTORY_SEPARATOR . '.depdblock';
132
        $this->_lockfile = dirname($this->_depdb) . DIRECTORY_SEPARATOR . '.depdblock';
136
    }
133
    }
137
    // }}}
134
    // }}}
Line 138... Line 135...
138
 
135
 
Line 143... Line 140...
143
            while ($dir && $dir != '.') {
140
            while ($dir && $dir != '.') {
144
                $dir = dirname($dir); // cd ..
141
                $dir = dirname($dir); // cd ..
145
                if ($dir != '.' && file_exists($dir)) {
142
                if ($dir != '.' && file_exists($dir)) {
146
                    if (is_writeable($dir)) {
143
                    if (is_writeable($dir)) {
147
                        return true;
144
                        return true;
148
                    } else {
-
 
149
                        return false;
-
 
150
                    }
145
                    }
-
 
146
 
-
 
147
                    return false;
151
                }
148
                }
152
            }
149
            }
-
 
150
 
153
            return false;
151
            return false;
154
        }
152
        }
-
 
153
 
155
        return is_writeable($this->_depdb);
154
        return is_writeable($this->_depdb);
156
    }
155
    }
Line 157... Line 156...
157
 
156
 
Line 164... Line 163...
164
     */
163
     */
165
    function assertDepsDB()
164
    function assertDepsDB()
166
    {
165
    {
167
        if (!is_file($this->_depdb)) {
166
        if (!is_file($this->_depdb)) {
168
            $this->rebuildDB();
167
            $this->rebuildDB();
169
        } else {
168
            return;
-
 
169
        }
-
 
170
 
170
            $depdb = $this->_getDepDB();
171
        $depdb = $this->_getDepDB();
171
            // Datatype format has been changed, rebuild the Deps DB
172
        // Datatype format has been changed, rebuild the Deps DB
172
            if ($depdb['_version'] < $this->_version) {
173
        if ($depdb['_version'] < $this->_version) {
173
                $this->rebuildDB();
174
            $this->rebuildDB();
174
            }
175
        }
-
 
176
 
175
            if ($depdb['_version']{0} > $this->_version{0}) {
177
        if ($depdb['_version']{0} > $this->_version{0}) {
176
                return PEAR::raiseError('Dependency database is version ' .
178
            return PEAR::raiseError('Dependency database is version ' .
177
                    $depdb['_version'] . ', and we are version ' .
179
                $depdb['_version'] . ', and we are version ' .
178
                    $this->_version . ', cannot continue');
180
                $this->_version . ', cannot continue');
179
            }
-
 
180
        }
181
        }
181
    }
182
    }
Line 182... Line 183...
182
 
183
 
183
    /**
184
    /**
Line 193... Line 194...
193
            $package = strtolower($pkg->getPackage());
194
            $package = strtolower($pkg->getPackage());
194
        } else {
195
        } else {
195
            $channel = strtolower($pkg['channel']);
196
            $channel = strtolower($pkg['channel']);
196
            $package = strtolower($pkg['package']);
197
            $package = strtolower($pkg['package']);
197
        }
198
        }
-
 
199
 
198
        if (isset($data['packages'][$channel][$package])) {
200
        if (isset($data['packages'][$channel][$package])) {
199
            return $data['packages'][$channel][$package];
201
            return $data['packages'][$channel][$package];
200
        }
202
        }
-
 
203
 
201
        return false;
204
        return false;
202
    }
205
    }
Line 203... Line 206...
203
 
206
 
204
    /**
207
    /**
Line 215... Line 218...
215
            $package = strtolower($pkg->getPackage());
218
            $package = strtolower($pkg->getPackage());
216
        } else {
219
        } else {
217
            $channel = strtolower($pkg['channel']);
220
            $channel = strtolower($pkg['channel']);
218
            $package = strtolower($pkg['package']);
221
            $package = strtolower($pkg['package']);
219
        }
222
        }
-
 
223
 
220
        $depend = $this->getDependentPackages($pkg);
224
        $depend = $this->getDependentPackages($pkg);
221
        if (!$depend) {
225
        if (!$depend) {
222
            return false;
226
            return false;
223
        }
227
        }
-
 
228
 
224
        $dependencies = array();
229
        $dependencies = array();
225
        foreach ($depend as $info) {
230
        foreach ($depend as $info) {
226
            $temp = $this->getDependencies($info);
231
            $temp = $this->getDependencies($info);
227
            foreach ($temp as $dep) {
232
            foreach ($temp as $dep) {
-
 
233
                if (
-
 
234
                    isset($dep['dep'], $dep['dep']['channel'], $dep['dep']['name']) &&
228
                if (strtolower($dep['dep']['channel']) == strtolower($channel) &&
235
                    strtolower($dep['dep']['channel']) == $channel &&
229
                      strtolower($dep['dep']['name']) == strtolower($package)) {
236
                    strtolower($dep['dep']['name']) == $package
-
 
237
                ) {
230
                    if (!isset($dependencies[$info['channel']])) {
238
                    if (!isset($dependencies[$info['channel']])) {
231
                        $dependencies[$info['channel']] = array();
239
                        $dependencies[$info['channel']] = array();
232
                    }
240
                    }
-
 
241
 
233
                    if (!isset($dependencies[$info['channel']][$info['package']])) {
242
                    if (!isset($dependencies[$info['channel']][$info['package']])) {
234
                        $dependencies[$info['channel']][$info['package']] = array();
243
                        $dependencies[$info['channel']][$info['package']] = array();
235
                    }
244
                    }
236
                    $dependencies[$info['channel']][$info['package']][] = $dep;
245
                    $dependencies[$info['channel']][$info['package']][] = $dep;
237
                }
246
                }
238
            }
247
            }
239
        }
248
        }
-
 
249
 
240
        return $dependencies;
250
        return $dependencies;
241
    }
251
    }
Line 242... Line 252...
242
 
252
 
243
    /**
253
    /**
Line 252... Line 262...
252
            $package = strtolower($pkg->getPackage());
262
            $package = strtolower($pkg->getPackage());
253
        } else {
263
        } else {
254
            $channel = strtolower($pkg['channel']);
264
            $channel = strtolower($pkg['channel']);
255
            $package = strtolower($pkg['package']);
265
            $package = strtolower($pkg['package']);
256
        }
266
        }
-
 
267
 
257
        $data = $this->_getDepDB();
268
        $data = $this->_getDepDB();
258
        if (isset($data['dependencies'][$channel][$package])) {
269
        if (isset($data['dependencies'][$channel][$package])) {
259
            return $data['dependencies'][$channel][$package];
270
            return $data['dependencies'][$channel][$package];
260
        }
271
        }
-
 
272
 
261
        return false;
273
        return false;
262
    }
274
    }
Line 263... Line 275...
263
 
275
 
264
    /**
276
    /**
Line 270... Line 282...
270
    {
282
    {
271
        $c = array();
283
        $c = array();
272
        $this->_getDepDB();
284
        $this->_getDepDB();
273
        return $this->_dependsOn($parent, $child, $c);
285
        return $this->_dependsOn($parent, $child, $c);
274
    }
286
    }
275
    
287
 
276
    function _dependsOn($parent, $child, &$checked)
288
    function _dependsOn($parent, $child, &$checked)
277
    {
289
    {
278
        if (is_object($parent)) {
290
        if (is_object($parent)) {
279
            $channel = strtolower($parent->getChannel());
291
            $channel = strtolower($parent->getChannel());
280
            $package = strtolower($parent->getPackage());
292
            $package = strtolower($parent->getPackage());
281
        } else {
293
        } else {
282
            $channel = strtolower($parent['channel']);
294
            $channel = strtolower($parent['channel']);
283
            $package = strtolower($parent['package']);
295
            $package = strtolower($parent['package']);
284
        }
296
        }
-
 
297
 
285
        if (is_object($child)) {
298
        if (is_object($child)) {
286
            $depchannel = strtolower($child->getChannel());
299
            $depchannel = strtolower($child->getChannel());
287
            $deppackage = strtolower($child->getPackage());
300
            $deppackage = strtolower($child->getPackage());
288
        } else {
301
        } else {
289
            $depchannel = strtolower($child['channel']);
302
            $depchannel = strtolower($child['channel']);
290
            $deppackage = strtolower($child['package']);
303
            $deppackage = strtolower($child['package']);
291
        }
304
        }
-
 
305
 
292
        if (isset($checked[$channel][$package][$depchannel][$deppackage])) {
306
        if (isset($checked[$channel][$package][$depchannel][$deppackage])) {
293
            return false; // avoid endless recursion
307
            return false; // avoid endless recursion
294
        }
308
        }
-
 
309
 
295
        $checked[$channel][$package][$depchannel][$deppackage] = true;
310
        $checked[$channel][$package][$depchannel][$deppackage] = true;
296
        if (!isset($this->_cache['dependencies'][$channel][$package])) {
311
        if (!isset($this->_cache['dependencies'][$channel][$package])) {
297
            return false;
312
            return false;
298
        }
313
        }
-
 
314
 
299
        foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
315
        foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
300
            if (isset($info['dep']['uri'])) {
316
            if (isset($info['dep']['uri'])) {
301
                if (is_object($child)) {
317
                if (is_object($child)) {
302
                    if ($info['dep']['uri'] == $child->getURI()) {
318
                    if ($info['dep']['uri'] == $child->getURI()) {
303
                        return true;
319
                        return true;
Line 307... Line 323...
307
                        return true;
323
                        return true;
308
                    }
324
                    }
309
                }
325
                }
310
                return false;
326
                return false;
311
            }
327
            }
-
 
328
 
312
            if (strtolower($info['dep']['channel']) == strtolower($depchannel) &&
329
            if (strtolower($info['dep']['channel']) == $depchannel &&
313
                  strtolower($info['dep']['name']) == strtolower($deppackage)) {
330
                  strtolower($info['dep']['name']) == $deppackage) {
314
                return true;
331
                return true;
315
            }
332
            }
316
        }
333
        }
-
 
334
 
317
        foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
335
        foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
318
            if (isset($info['dep']['uri'])) {
336
            if (isset($info['dep']['uri'])) {
319
                if ($this->_dependsOn(array(
337
                if ($this->_dependsOn(array(
320
                        'uri' => $info['dep']['uri'],
338
                        'uri' => $info['dep']['uri'],
321
                        'package' => $info['dep']['name']), $child, $checked)) {
339
                        'package' => $info['dep']['name']), $child, $checked)) {
Line 327... Line 345...
327
                        'package' => $info['dep']['name']), $child, $checked)) {
345
                        'package' => $info['dep']['name']), $child, $checked)) {
328
                    return true;
346
                    return true;
329
                }
347
                }
330
            }
348
            }
331
        }
349
        }
-
 
350
 
332
        return false;
351
        return false;
333
    }
352
    }
Line 334... Line 353...
334
 
353
 
335
    /**
354
    /**
Line 360... Line 379...
360
            $package = strtolower($pkg->getPackage());
379
            $package = strtolower($pkg->getPackage());
361
        } else {
380
        } else {
362
            $channel = strtolower($pkg['channel']);
381
            $channel = strtolower($pkg['channel']);
363
            $package = strtolower($pkg['package']);
382
            $package = strtolower($pkg['package']);
364
        }
383
        }
-
 
384
 
365
        if (!isset($data['dependencies'][$channel][$package])) {
385
        if (!isset($data['dependencies'][$channel][$package])) {
366
            return true;
386
            return true;
367
        }
387
        }
-
 
388
 
368
        foreach ($data['dependencies'][$channel][$package] as $dep) {
389
        foreach ($data['dependencies'][$channel][$package] as $dep) {
369
            $found = false;
390
            $found      = false;
370
            if (isset($dep['dep']['uri'])) {
391
            $depchannel = isset($dep['dep']['uri']) ? '__uri' : strtolower($dep['dep']['channel']);
371
                $depchannel = '__uri';
-
 
372
            } else {
-
 
373
                $depchannel = strtolower($dep['dep']['channel']);
392
            $depname    = strtolower($dep['dep']['name']);
374
            }
-
 
375
            if (isset($data['packages'][$depchannel][strtolower($dep['dep']['name'])])) {
393
            if (isset($data['packages'][$depchannel][$depname])) {
376
                foreach ($data['packages'][$depchannel][strtolower($dep['dep']['name'])] as
394
                foreach ($data['packages'][$depchannel][$depname] as $i => $info) {
377
                      $i => $info) {
-
 
378
                    if ($info['channel'] == $channel &&
-
 
379
                          $info['package'] == $package) {
395
                    if ($info['channel'] == $channel && $info['package'] == $package) {
380
                        $found = true;
396
                        $found = true;
381
                        break;
397
                        break;
382
                    }
398
                    }
383
                }
399
                }
384
            }
400
            }
-
 
401
 
385
            if ($found) {
402
            if ($found) {
386
                unset($data['packages'][$depchannel][strtolower($dep['dep']['name'])][$i]);
403
                unset($data['packages'][$depchannel][$depname][$i]);
387
                if (!count($data['packages'][$depchannel][strtolower($dep['dep']['name'])])) {
404
                if (!count($data['packages'][$depchannel][$depname])) {
388
                    unset($data['packages'][$depchannel][strtolower($dep['dep']['name'])]);
405
                    unset($data['packages'][$depchannel][$depname]);
389
                    if (!count($data['packages'][$depchannel])) {
406
                    if (!count($data['packages'][$depchannel])) {
390
                        unset($data['packages'][$depchannel]);
407
                        unset($data['packages'][$depchannel]);
391
                    }
408
                    }
392
                } else {
409
                } else {
393
                    $data['packages'][$depchannel][strtolower($dep['dep']['name'])] =
410
                    $data['packages'][$depchannel][$depname] =
394
                        array_values(
-
 
395
                            $data['packages'][$depchannel][strtolower($dep['dep']['name'])]);
411
                        array_values($data['packages'][$depchannel][$depname]);
396
                }
412
                }
397
            }
413
            }
398
        }
414
        }
-
 
415
 
399
        unset($data['dependencies'][$channel][$package]);
416
        unset($data['dependencies'][$channel][$package]);
400
        if (!count($data['dependencies'][$channel])) {
417
        if (!count($data['dependencies'][$channel])) {
401
            unset($data['dependencies'][$channel]);
418
            unset($data['dependencies'][$channel]);
402
        }
419
        }
-
 
420
 
403
        if (!count($data['dependencies'])) {
421
        if (!count($data['dependencies'])) {
404
            unset($data['dependencies']);
422
            unset($data['dependencies']);
405
        }
423
        }
-
 
424
 
406
        if (!count($data['packages'])) {
425
        if (!count($data['packages'])) {
407
            unset($data['packages']);
426
            unset($data['packages']);
408
        }
427
        }
-
 
428
 
409
        $this->_writeDepDB($data);
429
        $this->_writeDepDB($data);
410
    }
430
    }
Line 411... Line 431...
411
 
431
 
412
    /**
432
    /**
Line 418... Line 438...
418
        $depdb = array('_version' => $this->_version);
438
        $depdb = array('_version' => $this->_version);
419
        if (!$this->hasWriteAccess()) {
439
        if (!$this->hasWriteAccess()) {
420
            // allow startup for read-only with older Registry
440
            // allow startup for read-only with older Registry
421
            return $depdb;
441
            return $depdb;
422
        }
442
        }
-
 
443
 
423
        $packages = $this->_registry->listAllPackages();
444
        $packages = $this->_registry->listAllPackages();
-
 
445
        if (PEAR::isError($packages)) {
-
 
446
            return $packages;
-
 
447
        }
-
 
448
 
424
        foreach ($packages as $channel => $ps) {
449
        foreach ($packages as $channel => $ps) {
425
            foreach ($ps as $package) {
450
            foreach ($ps as $package) {
426
                $package = $this->_registry->getPackage($package, $channel);
451
                $package = $this->_registry->getPackage($package, $channel);
-
 
452
                if (PEAR::isError($package)) {
-
 
453
                    return $package;
-
 
454
                }
427
                $this->_setPackageDeps($depdb, $package);
455
                $this->_setPackageDeps($depdb, $package);
428
            }
456
            }
429
        }
457
        }
-
 
458
 
430
        $error = $this->_writeDepDB($depdb);
459
        $error = $this->_writeDepDB($depdb);
431
        if (PEAR::isError($error)) {
460
        if (PEAR::isError($error)) {
432
            return $error;
461
            return $error;
433
        }
462
        }
-
 
463
 
434
        $this->_cache = $depdb;
464
        $this->_cache = $depdb;
435
        return true;
465
        return true;
436
    }
466
    }
Line 437... Line 467...
437
 
467
 
Line 441... Line 471...
441
     * @return true|PEAR_Error
471
     * @return true|PEAR_Error
442
     * @access private
472
     * @access private
443
     */
473
     */
444
    function _lock($mode = LOCK_EX)
474
    function _lock($mode = LOCK_EX)
445
    {
475
    {
446
        if (!eregi('Windows 9', php_uname())) {
476
        if (stristr(php_uname(), 'Windows 9')) {
-
 
477
            return true;
-
 
478
        }
-
 
479
 
447
            if ($mode != LOCK_UN && is_resource($this->_lockFp)) {
480
        if ($mode != LOCK_UN && is_resource($this->_lockFp)) {
448
                // XXX does not check type of lock (LOCK_SH/LOCK_EX)
481
            // XXX does not check type of lock (LOCK_SH/LOCK_EX)
449
                return true;
482
            return true;
-
 
483
        }
-
 
484
 
-
 
485
        $open_mode = 'w';
-
 
486
        // XXX People reported problems with LOCK_SH and 'w'
-
 
487
        if ($mode === LOCK_SH) {
-
 
488
            if (!file_exists($this->_lockfile)) {
-
 
489
                touch($this->_lockfile);
-
 
490
            } elseif (!is_file($this->_lockfile)) {
-
 
491
                return PEAR::raiseError('could not create Dependency lock file, ' .
-
 
492
                    'it exists and is not a regular file');
450
            }
493
            }
451
            $open_mode = 'w';
494
            $open_mode = 'r';
452
            // XXX People reported problems with LOCK_SH and 'w'
-
 
453
            if ($mode === LOCK_SH) {
-
 
454
                if (!file_exists($this->_lockfile)) {
-
 
455
                    touch($this->_lockfile);
-
 
456
                } elseif (!is_file($this->_lockfile)) {
-
 
457
                    return PEAR::raiseError('could not create Dependency lock file, ' .
-
 
458
                        'it exists and is not a regular file');
-
 
459
                }
-
 
460
                $open_mode = 'r';
-
 
461
            }
495
        }
462
 
496
 
463
            if (!is_resource($this->_lockFp)) {
497
        if (!is_resource($this->_lockFp)) {
464
                $this->_lockFp = @fopen($this->_lockfile, $open_mode);
498
            $this->_lockFp = @fopen($this->_lockfile, $open_mode);
465
            }
499
        }
-
 
500
 
466
            if (!is_resource($this->_lockFp)) {
501
        if (!is_resource($this->_lockFp)) {
467
                return PEAR::raiseError("could not create Dependency lock file" .
502
            return PEAR::raiseError("could not create Dependency lock file" .
468
                                         (isset($php_errormsg) ? ": " . $php_errormsg : ""));
503
                                     (isset($php_errormsg) ? ": " . $php_errormsg : ""));
469
            }
504
        }
-
 
505
 
470
            if (!(int)flock($this->_lockFp, $mode)) {
506
        if (!(int)flock($this->_lockFp, $mode)) {
471
                switch ($mode) {
507
            switch ($mode) {
472
                    case LOCK_SH: $str = 'shared';    break;
508
                case LOCK_SH: $str = 'shared';    break;
473
                    case LOCK_EX: $str = 'exclusive'; break;
509
                case LOCK_EX: $str = 'exclusive'; break;
474
                    case LOCK_UN: $str = 'unlock';    break;
510
                case LOCK_UN: $str = 'unlock';    break;
475
                    default:      $str = 'unknown';   break;
511
                default:      $str = 'unknown';   break;
476
                }
-
 
477
                return PEAR::raiseError("could not acquire $str lock ($this->_lockfile)");
-
 
478
            }
512
            }
-
 
513
 
-
 
514
            return PEAR::raiseError("could not acquire $str lock ($this->_lockfile)");
479
        }
515
        }
-
 
516
 
480
        return true;
517
        return true;
481
    }
518
    }
Line 482... Line 519...
482
 
519
 
483
    /**
520
    /**
Line 502... Line 539...
502
    function _getDepDB()
539
    function _getDepDB()
503
    {
540
    {
504
        if (!$this->hasWriteAccess()) {
541
        if (!$this->hasWriteAccess()) {
505
            return array('_version' => $this->_version);
542
            return array('_version' => $this->_version);
506
        }
543
        }
-
 
544
 
507
        if (isset($this->_cache)) {
545
        if (isset($this->_cache)) {
508
            return $this->_cache;
546
            return $this->_cache;
509
        }
547
        }
-
 
548
 
510
        if (!$fp = fopen($this->_depdb, 'r')) {
549
        if (!$fp = fopen($this->_depdb, 'r')) {
511
            $err = PEAR::raiseError("Could not open dependencies file `".$this->_depdb."'");
550
            $err = PEAR::raiseError("Could not open dependencies file `".$this->_depdb."'");
512
            return $err;
551
            return $err;
513
        }
552
        }
514
        $rt = get_magic_quotes_runtime();
-
 
515
        set_magic_quotes_runtime(0);
-
 
-
 
553
 
516
        clearstatcache();
554
        clearstatcache();
517
        fclose($fp);
555
        fclose($fp);
518
        $data = unserialize(file_get_contents($this->_depdb));
556
        $data = unserialize(file_get_contents($this->_depdb));
519
        set_magic_quotes_runtime($rt);
-
 
520
        $this->_cache = $data;
557
        $this->_cache = $data;
521
        return $data;
558
        return $data;
522
    }
559
    }
Line 523... Line 560...
523
 
560
 
Line 530... Line 567...
530
    function _writeDepDB(&$deps)
567
    function _writeDepDB(&$deps)
531
    {
568
    {
532
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
569
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
533
            return $e;
570
            return $e;
534
        }
571
        }
-
 
572
 
535
        if (!$fp = fopen($this->_depdb, 'wb')) {
573
        if (!$fp = fopen($this->_depdb, 'wb')) {
536
            $this->_unlock();
574
            $this->_unlock();
537
            return PEAR::raiseError("Could not open dependencies file `".$this->_depdb."' for writing");
575
            return PEAR::raiseError("Could not open dependencies file `".$this->_depdb."' for writing");
538
        }
576
        }
539
        $rt = get_magic_quotes_runtime();
-
 
540
        set_magic_quotes_runtime(0);
-
 
-
 
577
 
541
        fwrite($fp, serialize($deps));
578
        fwrite($fp, serialize($deps));
542
        set_magic_quotes_runtime($rt);
-
 
543
        fclose($fp);
579
        fclose($fp);
544
        $this->_unlock();
580
        $this->_unlock();
545
        $this->_cache = $deps;
581
        $this->_cache = $deps;
546
        return true;
582
        return true;
547
    }
583
    }
Line 560... Line 596...
560
            $gen = &$pkg->getDefaultGenerator();
596
            $gen = &$pkg->getDefaultGenerator();
561
            $deps = $gen->dependenciesToV2();
597
            $deps = $gen->dependenciesToV2();
562
        } else {
598
        } else {
563
            $deps = $pkg->getDeps(true);
599
            $deps = $pkg->getDeps(true);
564
        }
600
        }
-
 
601
 
565
        if (!$deps) {
602
        if (!$deps) {
566
            return;
603
            return;
567
        }
604
        }
-
 
605
 
568
        if (!is_array($data)) {
606
        if (!is_array($data)) {
569
            $data = array();
607
            $data = array();
570
        }
608
        }
-
 
609
 
571
        if (!isset($data['dependencies'])) {
610
        if (!isset($data['dependencies'])) {
572
            $data['dependencies'] = array();
611
            $data['dependencies'] = array();
573
        }
612
        }
-
 
613
 
-
 
614
        $channel = strtolower($pkg->getChannel());
-
 
615
        $package = strtolower($pkg->getPackage());
-
 
616
 
574
        if (!isset($data['dependencies'][strtolower($pkg->getChannel())])) {
617
        if (!isset($data['dependencies'][$channel])) {
575
            $data['dependencies'][strtolower($pkg->getChannel())] = array();
618
            $data['dependencies'][$channel] = array();
576
        }
619
        }
-
 
620
 
577
        $data['dependencies'][strtolower($pkg->getChannel())][strtolower($pkg->getPackage())]
621
        $data['dependencies'][$channel][$package] = array();
578
            = array();
-
 
579
        if (isset($deps['required']['package'])) {
622
        if (isset($deps['required']['package'])) {
580
            if (!isset($deps['required']['package'][0])) {
623
            if (!isset($deps['required']['package'][0])) {
581
                $deps['required']['package'] = array($deps['required']['package']);
624
                $deps['required']['package'] = array($deps['required']['package']);
582
            }
625
            }
-
 
626
 
583
            foreach ($deps['required']['package'] as $dep) {
627
            foreach ($deps['required']['package'] as $dep) {
584
                $this->_registerDep($data, $pkg, $dep, 'required');
628
                $this->_registerDep($data, $pkg, $dep, 'required');
585
            }
629
            }
586
        }
630
        }
-
 
631
 
587
        if (isset($deps['optional']['package'])) {
632
        if (isset($deps['optional']['package'])) {
588
            if (!isset($deps['optional']['package'][0])) {
633
            if (!isset($deps['optional']['package'][0])) {
589
                $deps['optional']['package'] = array($deps['optional']['package']);
634
                $deps['optional']['package'] = array($deps['optional']['package']);
590
            }
635
            }
-
 
636
 
591
            foreach ($deps['optional']['package'] as $dep) {
637
            foreach ($deps['optional']['package'] as $dep) {
592
                $this->_registerDep($data, $pkg, $dep, 'optional');
638
                $this->_registerDep($data, $pkg, $dep, 'optional');
593
            }
639
            }
594
        }
640
        }
-
 
641
 
595
        if (isset($deps['required']['subpackage'])) {
642
        if (isset($deps['required']['subpackage'])) {
596
            if (!isset($deps['required']['subpackage'][0])) {
643
            if (!isset($deps['required']['subpackage'][0])) {
597
                $deps['required']['subpackage'] = array($deps['required']['subpackage']);
644
                $deps['required']['subpackage'] = array($deps['required']['subpackage']);
598
            }
645
            }
-
 
646
 
599
            foreach ($deps['required']['subpackage'] as $dep) {
647
            foreach ($deps['required']['subpackage'] as $dep) {
600
                $this->_registerDep($data, $pkg, $dep, 'required');
648
                $this->_registerDep($data, $pkg, $dep, 'required');
601
            }
649
            }
602
        }
650
        }
-
 
651
 
603
        if (isset($deps['optional']['subpackage'])) {
652
        if (isset($deps['optional']['subpackage'])) {
604
            if (!isset($deps['optional']['subpackage'][0])) {
653
            if (!isset($deps['optional']['subpackage'][0])) {
605
                $deps['optional']['subpackage'] = array($deps['optional']['subpackage']);
654
                $deps['optional']['subpackage'] = array($deps['optional']['subpackage']);
606
            }
655
            }
-
 
656
 
607
            foreach ($deps['optional']['subpackage'] as $dep) {
657
            foreach ($deps['optional']['subpackage'] as $dep) {
608
                $this->_registerDep($data, $pkg, $dep, 'optional');
658
                $this->_registerDep($data, $pkg, $dep, 'optional');
609
            }
659
            }
610
        }
660
        }
-
 
661
 
611
        if (isset($deps['group'])) {
662
        if (isset($deps['group'])) {
612
            if (!isset($deps['group'][0])) {
663
            if (!isset($deps['group'][0])) {
613
                $deps['group'] = array($deps['group']);
664
                $deps['group'] = array($deps['group']);
614
            }
665
            }
-
 
666
 
615
            foreach ($deps['group'] as $group) {
667
            foreach ($deps['group'] as $group) {
616
                if (isset($group['package'])) {
668
                if (isset($group['package'])) {
617
                    if (!isset($group['package'][0])) {
669
                    if (!isset($group['package'][0])) {
618
                        $group['package'] = array($group['package']);
670
                        $group['package'] = array($group['package']);
619
                    }
671
                    }
-
 
672
 
620
                    foreach ($group['package'] as $dep) {
673
                    foreach ($group['package'] as $dep) {
621
                        $this->_registerDep($data, $pkg, $dep, 'optional',
674
                        $this->_registerDep($data, $pkg, $dep, 'optional',
622
                            $group['attribs']['name']);
675
                            $group['attribs']['name']);
623
                    }
676
                    }
624
                }
677
                }
-
 
678
 
625
                if (isset($group['subpackage'])) {
679
                if (isset($group['subpackage'])) {
626
                    if (!isset($group['subpackage'][0])) {
680
                    if (!isset($group['subpackage'][0])) {
627
                        $group['subpackage'] = array($group['subpackage']);
681
                        $group['subpackage'] = array($group['subpackage']);
628
                    }
682
                    }
-
 
683
 
629
                    foreach ($group['subpackage'] as $dep) {
684
                    foreach ($group['subpackage'] as $dep) {
630
                        $this->_registerDep($data, $pkg, $dep, 'optional',
685
                        $this->_registerDep($data, $pkg, $dep, 'optional',
631
                            $group['attribs']['name']);
686
                            $group['attribs']['name']);
632
                    }
687
                    }
633
                }
688
                }
634
            }
689
            }
635
        }
690
        }
-
 
691
 
636
        if ($data['dependencies'][strtolower($pkg->getChannel())]
692
        if ($data['dependencies'][$channel][$package] == array()) {
637
              [strtolower($pkg->getPackage())] == array()) {
-
 
638
            unset($data['dependencies'][strtolower($pkg->getChannel())]
693
            unset($data['dependencies'][$channel][$package]);
639
              [strtolower($pkg->getPackage())]);
-
 
640
            if (!count($data['dependencies'][strtolower($pkg->getChannel())])) {
694
            if (!count($data['dependencies'][$channel])) {
641
                unset($data['dependencies'][strtolower($pkg->getChannel())]);
695
                unset($data['dependencies'][$channel]);
642
            }
696
            }
643
        }
697
        }
644
    }
698
    }
Line 645... Line 699...
645
 
699
 
Line 651... Line 705...
651
     * @param string|false dependency group this dependency is from, or false for ordinary dep
705
     * @param string|false dependency group this dependency is from, or false for ordinary dep
652
     */
706
     */
653
    function _registerDep(&$data, &$pkg, $dep, $type, $group = false)
707
    function _registerDep(&$data, &$pkg, $dep, $type, $group = false)
654
    {
708
    {
655
        $info = array(
709
        $info = array(
656
            'dep' => $dep,
710
            'dep'   => $dep,
657
            'type' => $type,
711
            'type'  => $type,
658
            'group' => $group);
712
            'group' => $group
-
 
713
        );
Line 659... Line 714...
659
 
714
 
660
        if (isset($dep['channel'])) {
715
        $dep  = array_map('strtolower', $dep);
661
            $depchannel = $dep['channel'];
-
 
662
        } else {
-
 
663
            $depchannel = '__uri';
-
 
664
        }
716
        $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri';
665
        if (!isset($data['dependencies'])) {
717
        if (!isset($data['dependencies'])) {
666
            $data['dependencies'] = array();
718
            $data['dependencies'] = array();
-
 
719
        }
-
 
720
 
-
 
721
        $channel = strtolower($pkg->getChannel());
-
 
722
        $package = strtolower($pkg->getPackage());
667
        }
723
 
668
        if (!isset($data['dependencies'][strtolower($pkg->getChannel())])) {
724
        if (!isset($data['dependencies'][$channel])) {
669
            $data['dependencies'][strtolower($pkg->getChannel())] = array();
725
            $data['dependencies'][$channel] = array();
-
 
726
        }
670
        }
727
 
671
        if (!isset($data['dependencies'][strtolower($pkg->getChannel())][strtolower($pkg->getPackage())])) {
728
        if (!isset($data['dependencies'][$channel][$package])) {
672
            $data['dependencies'][strtolower($pkg->getChannel())][strtolower($pkg->getPackage())] = array();
729
            $data['dependencies'][$channel][$package] = array();
-
 
730
        }
673
        }
731
 
674
        $data['dependencies'][strtolower($pkg->getChannel())][strtolower($pkg->getPackage())][]
-
 
675
            = $info;
732
        $data['dependencies'][$channel][$package][] = $info;
676
        if (isset($data['packages'][strtolower($depchannel)][strtolower($dep['name'])])) {
733
        if (isset($data['packages'][$depchannel][$dep['name']])) {
677
            $found = false;
734
            $found = false;
678
            foreach ($data['packages'][strtolower($depchannel)][strtolower($dep['name'])]
-
 
679
                  as $i => $p) {
735
            foreach ($data['packages'][$depchannel][$dep['name']] as $i => $p) {
680
                if ($p['channel'] == strtolower($pkg->getChannel()) &&
-
 
681
                      $p['package'] == strtolower($pkg->getPackage())) {
736
                if ($p['channel'] == $channel && $p['package'] == $package) {
682
                    $found = true;
737
                    $found = true;
683
                    break;
738
                    break;
684
                }
739
                }
685
            }
-
 
686
            if (!$found) {
-
 
687
                $data['packages'][strtolower($depchannel)][strtolower($dep['name'])][]
-
 
688
                    = array('channel' => strtolower($pkg->getChannel()),
-
 
689
                            'package' => strtolower($pkg->getPackage()));
-
 
690
            }
740
            }
691
        } else {
741
        } else {
692
            if (!isset($data['packages'])) {
742
            if (!isset($data['packages'])) {
693
                $data['packages'] = array();
743
                $data['packages'] = array();
-
 
744
            }
694
            }
745
 
695
            if (!isset($data['packages'][strtolower($depchannel)])) {
746
            if (!isset($data['packages'][$depchannel])) {
696
                $data['packages'][strtolower($depchannel)] = array();
747
                $data['packages'][$depchannel] = array();
-
 
748
            }
697
            }
749
 
698
            if (!isset($data['packages'][strtolower($depchannel)][strtolower($dep['name'])])) {
750
            if (!isset($data['packages'][$depchannel][$dep['name']])) {
699
                $data['packages'][strtolower($depchannel)][strtolower($dep['name'])] = array();
751
                $data['packages'][$depchannel][$dep['name']] = array();
-
 
752
            }
-
 
753
 
-
 
754
            $found = false;
-
 
755
        }
-
 
756
 
700
            }
757
        if (!$found) {
701
            $data['packages'][strtolower($depchannel)][strtolower($dep['name'])][]
758
            $data['packages'][$depchannel][$dep['name']][] = array(
702
                = array('channel' => strtolower($pkg->getChannel()),
759
                'channel' => $channel,
-
 
760
                'package' => $package
703
                        'package' => strtolower($pkg->getPackage()));
761
            );
704
        }
762
        }
705
    }
763
    }
706
}
-
 
707
?>
764
}