#!/usr/bin/php
<?php
+/*
+ * minify.spec does not see these: pear(HTTP/ConditionalGet.php) pear(HTTP/Encoder.php)
+ * perl version does
+ */
/**
- * Get the Compatibility info for an entire folder (recursive)
*
+ * Check system dependences between php-pear modules.
+ *
+ * Paweł Gołaszewski <blues@pld-linux.org> (Perl version)
+ * Michał Moskal <malekith@pld-linux.org> (Perl version)
+ * Elan Ruusamäe <glen@pld-linux.org>
+ *
+ * URL: <http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/rpm/rpm-php-requires.php>
+ *
+ * Requires: php-pear-PHP_CompatInfo
+ * Requires: php-pcre
*/
-require_once 'PHP/CompatInfo.php';
+/**
+ * Produce pear(Path/To/File.php) deps
+ * Ported to PHP from Perl version of rpm-php-requires.
+ *
+ * @TODO: use tokenizer to parse php files.
+ */
+function peardeps($files) {
+ // files inside php_pear_dir have this prefix
+ $prefix = RPM_BUILD_ROOT. PHP_PEAR_DIR . DIRECTORY_SEPARATOR;
+ $length = strlen($prefix);
-$info = new PHP_CompatInfo('null');
+ $req = array();
+ foreach ($files as $f) {
+ // skip non-php files
+ if (substr($f, -4) != '.php') {
+ continue;
+ }
-$folder = $argv[1];
-$options = array(
- 'file_ext' => array('php'),
-);
+ // subdir inside php_pear_dir
+ if (substr($f, 0, $length) == $prefix) {
+ $file_dir = dirname(substr($f, $length));
+ } else {
+ $file_dir = null;
+ }
-$res = $info->parseData($folder);
-if (version_compare($res['version'], '5.0.0', 'ge')) {
- $epoch = 4;
- // produce dependencies only for php5
- $compat = false;
- // session has always been compiled in
- // date, spl are internal for php
- $staticmods = array('session', 'date', 'spl');
-} else {
- $epoch = 3;
- // produce dependencies where php4/php5 both are ok
- $compat = true;
- // session has always been compiled in
- $staticmods = array('session');
-}
-echo "Requires:\tphp-common >= ", $epoch, ":", $res['version'], "\n";
+ foreach (file($f) as $line) {
+ // skip comments -- not perfect, matches "*" at start of line (very rare altho)
+ if (preg_match('/^\s*(#|\/\/|\*|\/\*)/', $line)) {
+ continue;
+ }
+
+ if (preg_match("/(\W|^)(require|include)(_once)?
+ \s* \(? \s*
+ (\"([^\"]*)\"|'([^']*)')
+ \s* \)? \s* ;/x", $line, $m)) {
+
+ if ($m[5]) {
+ $x = $m[5];
+ } else if ($m[6]) {
+ $x = $m[6];
+ } else {
+ continue 2;
+ }
+
+ if (substr($x, 0, 2) == './' || substr($x, -1) == '$') { # XXX must be: CONTAINS DOLLAR
+ continue 2;
+ }
+
+ if (substr($x, -4) != '.php') {
+ continue 2;
+ }
+ $req[$x] = 1;
+ continue 2;
+ }
+
+ if (is_null($file_dir)) {
+ continue;
+ }
+
+ if (preg_match("/(\W|^)(require|include)(_once)?
+ \s* \(? \s* dirname \s* \( \s* __FILE__ \s* \) \s* \. \s*
+ (\"([^\"]*)\"|'([^']*)')
+ \s* \)? \s* ;/x", $line, $m)) {
+
+ if ($m[5]) {
+ $x = $m[5];
+ } else if ($m[6]) {
+ $x = $m[6];
+ } else {
+ continue 2;
+ }
+
+ if (substr($x, -1) == '$') { # XXX must be: CONTAINS DOLLAR
+ continue 2;
+ }
+ if (substr($x, -4) != '.php') {
+ continue 2;
+ }
-# process extensions
-foreach ($res['extensions'] as $ext) {
- if (in_array($ext, $staticmods)) {
- continue;
+ $x = "$file_dir/$x";
+ // remove double slashes
+ // TODO: resolve simpletest/test/../socket.php -> simpletest/socket.php
+ $x = str_replace("//", "/", $x);
+ $req[$x] = 1;
+ continue;
+ }
+ }
}
- if ($compat) {
- echo "Requires:\tphp(", $ext, ")\n";
+ foreach (array_keys($req) as $f) {
+ // skip self deps
+ if (array_key_exists($f, $files)) {
+ continue;
+ }
+ echo "pear($f)\n";
+ }
+}
+
+/**
+ * Produce dependencies for extensions using PEAR PHP_CompatInfo package.
+ */
+function extdeps($files) {
+ require_once 'PHP/CompatInfo.php';
+
+ $info = new PHP_CompatInfo('null');
+ $res = $info->parseData($files);
+
+ // minimum php version we accept
+ // "%define php_min_version 5.1.2" in spec to minimum version to be 5.1.2
+ $version = max(PHP_MIN_VERSION, $res['version']);
+
+ if (version_compare($version, '5.0.0', 'ge')) {
+ # force php-<name> only deps when php5
+ # XXX what about php-pecl-<name> virtual provides?
+ $fmt = 'php-%s';
+ $epoch = 4;
} else {
- echo "Requires:\tphp-", $ext, "\n";
+ $fmt = 'php(%s)';
+ $epoch = 3;
}
+ echo "php-common >= ", $epoch, ":", $version, "\n";
+
+ // process extensions
+ foreach ($res['extensions'] as $ext) {
+ // bz2 ext is in php-bzip2 package
+ if ($ext == 'bz2') {
+ $ext = 'bzip2';
+ }
+ // libxml ext is in php-xml package
+ if ($ext == 'libxml') {
+ $ext = 'xml';
+ }
+
+ // these need to be lowercased
+ if (in_array($ext, array('SPL', 'PDO', 'SQLite', 'Reflection', 'SimpleXML'))) {
+ $ext = strtolower($ext);
+ }
+
+ printf("$fmt\n", $ext);
+ }
+}
+
+define('RPM_BUILD_ROOT', getenv('RPM_BUILD_ROOT'));
+define('PHP_PEAR_DIR', '/usr/share/pear');
+define('PHP_MIN_VERSION', getenv('PHP_MIN_VERSION'));
+
+if ($argc > 1) {
+ $files = array_splice($argv, 1);
+} else {
+ $files = explode(PHP_EOL, trim(file_get_contents('php://stdin')));
}
+
+peardeps($files);
+extdeps($files);