X-Git-Url: http://git.pld-linux.org/?p=packages%2Frpm.git;a=blobdiff_plain;f=rpm-php-requires.php;h=b39802993bc09d5d25656eb32939a69a054b101e;hp=a0979e75b69563d6a4fd95b3a24b24faaf695e9f;hb=7db865f2bcabd6634b78e94aae5f19c47fcc9a97;hpb=b56286b3d19b3f0532b6c1003ea61521c2f6e36a diff --git a/rpm-php-requires.php b/rpm-php-requires.php index a0979e7..b398029 100644 --- a/rpm-php-requires.php +++ b/rpm-php-requires.php @@ -1,27 +1,117 @@ #!/usr/bin/php - * Michał Moskal + * Paweł Gołaszewski (Perl version) + * Michał Moskal (Perl version) * Elan Ruusamäe + * + * URL: + * + * Requires: php-pear-PHP_CompatInfo + * Requires: php-pcre */ /** - * Produce old style pear(Path/To/File.php) deps + * 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) { - // all files must begin with $RPM_BUILD_ROOT%{php_pear_dir} + // files inside php_pear_dir have this prefix $prefix = RPM_BUILD_ROOT. PHP_PEAR_DIR . DIRECTORY_SEPARATOR; $length = strlen($prefix); + + $req = array(); foreach ($files as $f) { - if (substr($f, 0, $length) != $prefix) { + // skip non-php files + if (substr($f, -4) != '.php') { + continue; + } + + // subdir inside php_pear_dir + if (substr($f, 0, $length) == $prefix) { + $file_dir = dirname(substr($f, $length)); + } else { + $file_dir = null; + } + + 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; + } + + $x = "$file_dir/$x"; + // remove double slashes + // TODO: resolve simpletest/test/../socket.php -> simpletest/socket.php + $x = str_replace("//", "/", $x); + $req[$x] = 1; + continue; + } + } + } + + foreach (array_keys($req) as $f) { + // skip self deps + if (array_key_exists($f, $files)) { continue; } - $f = substr($f, $length); echo "pear($f)\n"; } } @@ -35,36 +125,49 @@ function extdeps($files) { $info = new PHP_CompatInfo('null'); $res = $info->parseData($files); - if (version_compare($res['version'], '5.0.0', 'ge')) { + // 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- only deps when php5 + # XXX what about php-pecl- virtual provides? + $fmt = 'php-%s'; $epoch = 4; - // session, pcre are statically compiled in - // date, SPL, SimpleXML are internal for php - // sapi_apache? - $staticmods = array('standard', 'ereg', 'session', 'pcre', 'date', 'spl', 'simplexml'); } else { + $fmt = 'php(%s)'; $epoch = 3; - // session has always been compiled in - $staticmods = array('standard', 'ereg', 'session'); } - echo "php-common >= ", $epoch, ":", $res['version'], "\n"; + echo "php-common >= ", $epoch, ":", $version, "\n"; // process extensions foreach ($res['extensions'] as $ext) { - if (in_array($ext, $staticmods)) { - continue; + // 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); } - echo "php(", $ext, ")\n"; + 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 = split(PHP_EOL, trim(file_get_contents('php://stdin'))); + $files = explode(PHP_EOL, trim(file_get_contents('php://stdin'))); } peardeps($files);