#!/usr/bin/perl ##################################################################### # # # Check system dependences between php-pear modules # # # # Paweł Gołaszewski # # Michał Moskal # # ------------------------------------------------------------------# # TODO: # # - extension_loaded - dependencies. # # - some clean-up... # ##################################################################### $pear = "/usr/share/pear"; @files = (); %req = (); foreach (@ARGV ? $ARGV : <> ) { chomp; $f = $_; push @files, $f; open(F, "< $f") or die; if ($f =~ /$pear/) { $file_dir = $f; $file_dir =~ s|.*$pear/||; $file_dir =~ s|/[^/]*$||; } else { $file_dir = undef; } while () { # skip comments next if (/^\s*(#|\/\/|\*|\/\*)/); while (/(\W|^)(require|include)(_once)? \s* \(? \s* ("([^"]*)"|'([^']*)') \s* \)? \s* ;/xg) { if ($5 ne "") { $x = $5; } elsif ($6 ne "") { $x = $6; } else { next; } do $x =~ s/\/\.?\//\//g while $x =~ /\/\.?\//; do $x =~ s/(\/|^)[^\/]*[^.]\/\.\.\//\1/g while $x =~ /(\/|^)[^\/]*[^.]\/\.\.\//; next if ($x =~ m|^\.\.?/| or $x =~ /\$/); next unless ($x =~ /\.php$/); $req{$x} = 1; } next unless (defined $file_dir); while (/(\W|^)(require|include)(_once)? \s* \(? \s* dirname \s* \( \s* __FILE__ \s* \) \s* \. \s* ("([^"]*)"|'([^']*)') \s* \)? \s* ;/xg) { if ($5 ne "") { $x = $5; } elsif ($6 ne "") { $x = $6; } else { next; } next unless ($x =~ /\.php$/); $x = "$file_dir/$x"; do $x =~ s/\/\.?\//\//g while $x =~ /\/\.?\//; do $x =~ s/(\/|^)[^\/]*[^.]\/\.\.\//\1/g while $x =~ /(\/|^)[^\/]*[^.]\/\.\.\//; $req{$x} = 1; } } } f: for $f (keys %req) { for $g (@files) { next f if ($g =~ /\Q$f\E$/); } print "pear($f)\n"; }