]> git.pld-linux.org Git - packages/rpm.git/blob - rpm-php-requires.php
- avoid deadloops with preg_match
[packages/rpm.git] / rpm-php-requires.php
1 #!/usr/bin/php
2 <?php
3 /**
4  *
5  * Check system dependences between php-pear modules.
6  *
7  * Paweł Gołaszewski <blues@pld-linux.org> (Perl version)
8  * Michał Moskal <malekith@pld-linux.org> (Perl version)
9  * Elan Ruusamäe <glen@pld-linux.org>
10  *
11  * Requires: php-pear-PHP_CompatInfo
12  * Requires: php-pcre
13  */
14
15 /**
16  * Produce pear(Path/To/File.php) deps
17  * Ported to PHP from Perl version of rpm-php-requires.
18  *
19  * @TODO: use tokenizer to parse php files.
20  */
21 function peardeps($files) {
22         // files inside php_pear_dir have this prefix
23         $prefix = RPM_BUILD_ROOT. PHP_PEAR_DIR . DIRECTORY_SEPARATOR;
24         $length = strlen($prefix);
25
26         $req = array();
27         foreach ($files as $f) {
28                 // skip non-php files
29                 if (substr($f, -4) != '.php') {
30                         continue;
31                 }
32
33                 // subdir inside php_pear_dir
34                 if (substr($f, 0, $length) == $prefix) {
35                         $file_dir = dirname(substr($f, $length));
36                 } else {
37                         $file_dir = null;
38                 }
39
40                 foreach (file($f) as $line) {
41                         // skip comments
42                         if (preg_match('/^\s*(#|\/\/|\*|\/\*)/', $line)) {
43                                 continue;
44                         }
45
46                         if (preg_match("/(\W|^)(require|include)(_once)?
47                                         \s* \(? \s*
48                                         (\"([^\"]*)\"|'([^']*)')
49                                         \s* \)? \s* ;/x", $line, $m)) {
50
51                                 if ($m[5] != "") {
52                                         $x = $m[5];
53                                 } else if ($m[6] != "") {
54                                         $x = $m[6];
55                                 } else {
56                                         continue 2;
57                                 }
58
59                                 if (substr($x, 0, 2) == './' || substr($x, -1) == '$') {
60                                         continue 2;
61                                 }
62
63                                 if (substr($x, -4) != '.php') {
64                                         continue 2;
65                                 }
66                                 $req[$x] = 1;
67                                 continue 2;
68                         }
69
70                         if (is_null($file_dir)) {
71                                 continue;
72                         }
73
74                         if (preg_match("/(\W|^)(require|include)(_once)?
75                                         \s* \(? \s* dirname \s* \( \s* __FILE__ \s* \) \s* \. \s*
76                                         (\"([^\"]*)\"|'([^']*)')
77                                         \s* \)? \s* ;/x", $line, $m)) {
78
79                                 if ($m[5] != "") {
80                                         $x = $m[5];
81                                 } else if ($m[6] != "") {
82                                         $x = $m[6];
83                                 } else {
84                                         continue 2;
85                                 }
86
87                                 if (substr($x, -1) == '$') {
88                                         continue 2;
89                                 }
90                                 if (substr($x, -4) != '.php') {
91                                         continue 2;
92                                 }
93
94                                 $x = "$file_dir/$x";
95                                 $req[$x] = 1;
96                                 continue;
97                         }
98                 }
99         }
100
101         foreach (array_keys($req) as $f) {
102                 // skip self deps
103                 if (array_key_exists($f, $files)) {
104                         continue;
105                 }
106                 echo "pear($f)\n";
107         }
108 }
109
110 /**
111  * Produce dependencies for extensions using PEAR PHP_CompatInfo package.
112  */
113 function extdeps($files) {
114         require_once 'PHP/CompatInfo.php';
115
116         $info = new PHP_CompatInfo('null');
117         $res = $info->parseData($files);
118
119         // minimum php version we accept
120         // "%define php_min_version 5.1.2" in spec to minimum version to be 5.1.2
121         $version = max(PHP_MIN_VERSION, $res['version']);
122
123         if (version_compare($version, '5.0.0', 'ge')) {
124                 # force php-<name> only deps when php5
125                 # XXX what about php-pecl-<name> virtual provides?
126                 $fmt = 'php-%s';
127                 $epoch = 4;
128         } else {
129                 $fmt = 'php(%s)';
130                 $epoch = 3;
131         }
132         echo "php-common >= ", $epoch, ":", $version, "\n";
133
134         // process extensions
135         foreach ($res['extensions'] as $ext) {
136                 // bz2 ext is in php-bzip2 package
137                 if ($ext == 'bz2') {
138                         $ext = 'bzip2';
139                 }
140                 // SPL ext is in php-spl package
141                 if ($ext == 'SPL') {
142                         $ext = 'spl';
143                 }
144                 // ereg
145                 if ($ext == 'ereg') {
146                         // not yet
147                         continue;
148                 }
149                 printf("$fmt\n", $ext);
150         }
151 }
152
153 define('RPM_BUILD_ROOT', getenv('RPM_BUILD_ROOT'));
154 define('PHP_PEAR_DIR', '/usr/share/pear');
155 define('PHP_MIN_VERSION', getenv('PHP_MIN_VERSION'));
156
157 if ($argc > 1) {
158         $files = array_splice($argv, 1);
159 } else {
160         $files = explode(PHP_EOL, trim(file_get_contents('php://stdin')));
161 }
162
163 peardeps($files);
164 extdeps($files);
This page took 0.048575 seconds and 4 git commands to generate.