Skip to content
Snippets Groups Projects
lint.php 3.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env php
    <?php
    if (php_sapi_name() != 'cli') exit();
    
    function get_osticket_root_path() {
        # Hop up to the root folder
        $start = dirname(__file__);
        for (;;) {
            if (file_exists($start . '/main.inc.php')) break;
            $start .= '/..';
        }
    
        return realpath($start);
    
    }
    
    $root = get_osticket_root_path();
    
    
    Jared Hancock's avatar
    Jared Hancock committed
    # Check PHP syntax across all php files
    function glob_recursive($pattern, $flags = 0) {
        $files = glob($pattern, $flags);
    
        foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
    
    Jared Hancock's avatar
    Jared Hancock committed
            $files = array_merge($files, 
                glob_recursive($dir.'/'.basename($pattern), $flags));
        }
        return $files;
    }
    echo "PHP Syntax Errors: ";
    ob_start();
    
    $scripts=glob_recursive("$root/*.php");
    
    Jared Hancock's avatar
    Jared Hancock committed
    $exit=0;
    $syntax_errors="";
    foreach ($scripts as $s) {
        system("php -l $s", $exit);
        $line = ob_get_contents();
        ob_clean();
        if ($exit !== 0)
            $syntax_errors .= $line;
    }
    ob_end_clean();
    
    if (strlen($syntax_errors)) {
        $syntax_errors=str_replace("$root/", '', $syntax_errors);
        echo "FAIL\n";
        echo "-------------------------------------------------------\n";
        echo "$syntax_errors";
        exit();
    } else {
    
        echo "pass\n";
    }
    
    function line_number_for_offset($filename, $offset) {
        $lines = file($filename);
        $bytes = $line = 0;
        while ($bytes < $offset) {
            $bytes += strlen(array_shift($lines));
            $line += 1;
        }
        return $line;
    }
    echo "Short open tags: ";
    $fails = array();
    foreach ($scripts as $s) {
        $matches = array();
    
        if (preg_match_all('/<\?\s*(?!php|xml).*$/m', file_get_contents($s), $matches,
    
                PREG_OFFSET_CAPTURE) > 0) {
            foreach ($matches[0] as $match)
                $fails[] = array(
                    str_replace($root.'/', '', $s),
                    $match[0],
                    line_number_for_offset($s, $match[1]));
        }
    }
    if (count($fails)) {
        echo "FAIL\n";
        echo "-------------------------------------------------------\n";
        foreach ($fails as $f)
            echo sprintf("In %s, line %d: %s\n", $f[0], $f[2],
                str_replace("\n", " ", $f[1]));
    
    Jared Hancock's avatar
    Jared Hancock committed
        echo "\n";
    
    } else {
        echo "pass\n";
    
    # Run phplint across all php files
    
    Jared Hancock's avatar
    Jared Hancock committed
    echo "Access to unitialized variables: ";
    
    ob_start();
    # XXX: This won't run well on Windoze
    
    Jared Hancock's avatar
    Jared Hancock committed
    system("$root/setup/test/lib/phplint.tcl ".implode(" ", $scripts));
    
    $lint_errors = ob_get_clean();
    
    if (strlen($lint_errors)) {
    
    Jared Hancock's avatar
    Jared Hancock committed
        $lint_errors=str_replace("$root/", '', $lint_errors);
        echo "FAIL\n";
    
        echo "-------------------------------------------------------\n";
        echo "$lint_errors";
    
    Jared Hancock's avatar
    Jared Hancock committed
    } else {
        echo "\n";
    
    
    function find_function_calls($scripts) {
        $calls=array();
        foreach ($scripts as $s) {
            $lines = explode("\n", file_get_contents($s));
            $lineno=0;
            foreach (explode("\n", file_get_contents($s)) as $line) {
                $lineno++; $matches=array();
                preg_match_all('/-[>]([a-zA-Z0-9]*)\(/', $line, $matches,
                    PREG_SET_ORDER);
                foreach ($matches as $m) {
                    $calls[] = array($s, $lineno, $line, $m[1]);
                }
            }
        }
        return $calls;
    }
    
    $php_script_content='';
    foreach ($scripts as $s) {
        $php_script_content .= file_get_contents($s);
    }
    echo "Access to undefined object methods: ";
    ob_start();
    foreach (find_function_calls($scripts) as $call) {
        list($file, $no, $line, $func) = $call;
        if (!preg_match('/^\s*(\/\*[^*]*\*\/)?'."\s*function\s+&?\s*$func\\(/m", 
                $php_script_content)) {
            print "$func: Definitely undefined, from $file:$no\n";
        }
    }
    $undef_func_errors = ob_get_clean();
    
    if (strlen($undef_func_errors)) {
        $undef_func_errors=str_replace("$root/", '', $undef_func_errors);
        echo "FAIL\n";
        echo "-------------------------------------------------------\n";
        echo "$undef_func_errors";
        exit();
    } else {
        echo "\n";
    }