1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-27 12:55:26 +01:00
psalm/bin/psalm
2017-01-13 14:06:05 -05:00

148 lines
3.9 KiB
PHP
Executable File

#!/usr/bin/env php
<?php
foreach ([__DIR__ . '/../../../autoload.php', __DIR__ . '/../vendor/autoload.php'] as $file) {
if (file_exists($file)) {
require $file;
break;
}
}
use Psalm\Checker\FileChecker;
use Psalm\Checker\ProjectChecker;
// show all errors
error_reporting(-1);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('memory_limit', '2048M');
ini_set('xdebug.max_nesting_level', 512);
// get options from command line
$options = getopt(
'f:m:hc:',
[
'help', 'debug', 'config:', 'monochrome', 'show-info:', 'diff',
'file:', 'self-check', 'update-docblocks', 'output-format:',
]
);
if (array_key_exists('help', $options)) {
$options['h'] = false;
}
if (array_key_exists('monochrome', $options)) {
$options['m'] = false;
}
if (isset($options['config'])) {
$options['c'] = $options['config'];
}
if (array_key_exists('h', $options)) {
echo <<< HELP
Usage:
psalm [options] [file...]
Options:
-h, --help Display this help message
--debug Debug information
-c, --config Path to a psalm.xml configuration file
-m, --monochrome Enable monochrome output
--show-info[=BOOLEAN] Show non-exception parser findings.
--diff File to check is a diff
--self-check Psalm checks itself
--update-docblocks Adds correct return types to the given file(s)
--output-format=json Changes the output format
HELP;
exit;
}
// get vars from options
$debug = array_key_exists('debug', $options);
if (isset($options['f'])) {
$input_paths = is_array($options['f']) ? $options['f'] : [$options['f']];
} else {
$input_paths = $argv ? $argv : null;
}
$output_format = isset($options['output-format']) ? $options['output-format'] : ProjectChecker::TYPE_CONSOLE;
$paths_to_check = null;
if ($input_paths) {
$filtered_input_paths = [];
foreach ($input_paths as $i => $input_path) {
if (($input_path[0] === '-' && strlen($input_path) > 1) || realpath($input_path) === __FILE__) {
continue;
}
$filtered_input_paths = array_slice($input_paths, $i);
break;
}
stream_set_blocking(STDIN, 0);
if ($filtered_input_paths === ['-'] && $stdin = fgets(STDIN)) {
$filtered_input_paths = preg_split('/\s+/', trim($stdin));
}
$paths_to_check = [];
foreach ($filtered_input_paths as $i => $path_to_check) {
if ($path_to_check[0] === '-') {
die('Invalid usage, expecting psalm [options] [file...]' . PHP_EOL);
}
if (!file_exists($path_to_check)) {
die('Cannot locate ' . $path_to_check . PHP_EOL);
}
$paths_to_check[] = realpath($path_to_check);
}
if (!$paths_to_check) {
$paths_to_check = null;
}
}
$path_to_config = isset($options['config']) ? realpath($options['config']) : null;
$use_color = !array_key_exists('m', $options);
$show_info = isset($options['show-info'])
? $options['show-info'] !== 'false' && $options['show-info'] !== '0'
: true;
$is_diff = isset($options['diff']);
$update_docblocks = isset($options['update-docblocks']);
// initialise custom config, if passed
if ($path_to_config) {
ProjectChecker::setConfigXML($path_to_config);
}
$project_checker = new ProjectChecker($use_color, $show_info, $output_format, $debug, $update_docblocks);
\Psalm\IssueBuffer::setStartTime(microtime(true));
if (array_key_exists('self-check', $options)) {
$project_checker->checkDir(dirname(__DIR__) . '/src');
} elseif ($paths_to_check === null) {
$project_checker->check($is_diff);
} elseif ($paths_to_check) {
foreach ($paths_to_check as $path_to_check) {
if (is_dir($path_to_check)) {
$project_checker->checkDir($path_to_check);
} else {
$project_checker->checkFile($path_to_check);
}
}
}