More pre-commit.php improvements (#4224)

* more pre-commit.php improvements
do not check influx-db on hhvm
Use parallel-lint to increase lint check speed and improve output
Add option to print out the commands that would be executed, makes it easier to modify them and run by hand
Fixed a couple of bugs

* Integrate the environment check
Flip it so we don't interfere with command line users
This commit is contained in:
Tony Murray
2016-08-28 15:44:36 -05:00
committed by Neil Lathwood
parent 316bfb52ab
commit b7d0b97c64
3 changed files with 164 additions and 110 deletions

View File

@@ -4,13 +4,21 @@ matrix:
include:
- php: 7.0
- php: 5.3
env:
SKIP_STYLE_CHECK=1
- php: 5.4
env:
SKIP_STYLE_CHECK=1
- php: 5.5
env:
SKIP_STYLE_CHECK=1
- php: 5.6
env:
PHP_CS=1
SKIP_STYLE_CHECK=1
EXECUTE_BUILD_DOCS=true
- php: hhvm
env:
SKIP_STYLE_CHECK=1
allow_failures:
- php: hhvm
@@ -27,6 +35,6 @@ after_success:
- test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && test $EXECUTE_BUILD_DOCS == "true" && bash scripts/deploy-docs.sh
script:
- php scripts/pre-commit.php -l
- if [[ $PHP_CS == 1 ]]; then php scripts/pre-commit.php -p -s; fi
- php scripts/pre-commit.php -p -l
- php scripts/pre-commit.php -p -s
- phpunit

View File

@@ -1,7 +1,8 @@
{
"require-dev": {
"squizlabs/php_codesniffer": "*",
"phpunit/phpunit": "4.*"
"phpunit/phpunit": "4.*",
"jakub-onderka/php-parallel-lint": "*",
"jakub-onderka/php-console-highlighter": "*"
}
}

View File

@@ -2,52 +2,56 @@
<?php
$filename = basename(__FILE__);
$install_dir = realpath(__DIR__.'/..');
$install_dir = realpath(__DIR__ . '/..');
chdir($install_dir);
$short_opts = 'lsuph';
$short_opts = 'lsuphc';
$long_opts = array(
'lint',
'style',
'unit',
'passthru',
'commands',
'help',
);
$parameters = array(
'p',
'passthru',
);
$options = getopt($short_opts, $long_opts);
if (check_opt($options, 'h', 'help')) {
echo "LibreNMS Code Tests Script
Running $filename without options runs all checks.
-l, --lint Run php lint checks to test for valid syntax.
-s, --style Run phpcs check to check for PSR-2 compliance.
-u, --unit Run phpunit tests.
-h, --help Show this help text.\n";
-l, --lint Run php lint checks to test for valid syntax.
-s, --style Run phpcs check to check for PSR-2 compliance.
-u, --unit Run phpunit tests.
-p, --passthru Display output from checks as it comes
-c, --commands Print commands only, no checks
-h, --help Show this help text.\n";
exit();
}
// set up some variables
$parameters = array(
'p' => false,
'c' => false,
'passthru' => false,
'commands' => false,
);
$passthru = check_opt($options, 'p', 'passthru');
$commands = array_diff($options, $parameters);
$command_only = check_opt($options, 'c', 'commands');
$commands = array_diff_assoc($options, $parameters);
$all = empty($commands);
$ret = 0;
// run tests
if ($all || check_opt($commands, 'l', 'lint')) {
$ret += check_lint();
if (($all || check_opt($commands, 'l', 'lint')) && !getenv('SKIP_LINT_CHECK')) {
$ret += check_lint($passthru, $command_only);
}
if ($all || check_opt($commands, 's', 'style')) {
$ret += check_style($passthru);
if (($all || check_opt($commands, 's', 'style')) && !getenv('SKIP_STYLE_CHECK')) {
$ret += check_style($passthru, $command_only);
}
if ($all || check_opt($commands, 'u', 'unit')) {
$ret += check_unit($passthru);
if (($all || check_opt($commands, 'u', 'unit')) && !getenv('SKIP_UNIT_CHECK')) {
$ret += check_unit($passthru, $command_only);
}
@@ -58,6 +62,124 @@ if ($all && $ret === 0) {
exit($ret); //return the combined/single return value of tests
/**
* Runs php -l and tests for any syntax errors
*
* @param bool $passthru display the output as comes in
* @param bool $command_only only display the intended command, no checks
* @return int the return value from running php -l (0 = success)
*/
function check_lint($passthru = false, $command_only = false)
{
// matches a substring of the relative path, leading / is treated as absolute path
$lint_excludes = array('vendor/');
if (defined('HHVM_VERSION') || version_compare(PHP_VERSION, '5.6', '<')) {
$lint_excludes[] = 'lib/influxdb-php/';
}
$lint_exclude = build_excludes('--exclude ', $lint_excludes);
$lint_cmd = "./vendor/bin/parallel-lint $lint_exclude ./";
if ($command_only) {
echo $lint_cmd . PHP_EOL;
return 250;
}
echo 'Running lint check... ';
if ($passthru) {
echo PHP_EOL;
passthru($lint_cmd, $lint_ret);
} else {
exec($lint_cmd, $lint_output, $lint_ret);
if ($lint_ret > 0) {
print(implode(PHP_EOL, $lint_output) . PHP_EOL);
} else {
echo "success\n";
}
}
return $lint_ret;
}
/**
* Runs phpcs --standard=PSR2 against the code base
*
* @param bool $passthru display the output as comes in
* @param bool $command_only only display the intended command, no checks
* @return int the return value from phpcs (0 = success)
*/
function check_style($passthru = false, $command_only = false)
{
// matches a substring of the full path
$cs_excludes = array(
'/vendor/',
'/lib/',
'/html/plugins/',
);
$cs_exclude = build_excludes('--ignore=', $cs_excludes);
$cs_cmd = "./vendor/bin/phpcs -n -p --colors --extensions=php --standard=PSR2 $cs_exclude ./html ./includes";
if ($command_only) {
echo $cs_cmd . PHP_EOL;
return 250;
}
echo 'Running style check... ';
if ($passthru) {
echo PHP_EOL;
passthru($cs_cmd, $cs_ret);
} else {
exec($cs_cmd, $cs_output, $cs_ret);
if ($cs_ret > 0) {
echo "failed\n";
print(implode(PHP_EOL, $cs_output) . PHP_EOL);
} else {
echo "success\n";
}
}
return $cs_ret;
}
/**
* Runs phpunit
*
* @param bool $passthru display the output as comes in
* @param bool $command_only only display the intended command, no checks
* @return int the return value from phpunit (0 = success)
*/
function check_unit($passthru = false, $command_only = false)
{
$phpunit_cmd = './vendor/bin/phpunit --colors=always';
if ($command_only) {
echo $phpunit_cmd . PHP_EOL;
return 250;
}
echo 'Running unit tests... ';
if ($passthru) {
echo PHP_EOL;
passthru($phpunit_cmd, $phpunit_ret);
} else {
exec($phpunit_cmd, $phpunit_output, $phpunit_ret);
if ($phpunit_ret > 0) {
echo "failed\n";
print(implode(PHP_EOL, $phpunit_output) . PHP_EOL);
} else {
echo "success\n";
}
}
return $phpunit_ret;
}
/**
* Check if the given options array contains any of the $opts specified
*
@@ -74,96 +196,19 @@ function check_opt($options)
return !empty($intersect);
}
/**
* Runs php -l and tests for any syntax errors
* Build a list of exclude arguments from an array
*
* @return int the return value from running php -l (0 = success)
* @param string $exclude_string such as "--exclude"
* @param array $excludes array of directories to exclude
* @return string resulting string
*/
function check_lint()
function build_excludes($exclude_string, $excludes)
{
echo "Running lint check... \n";
if (version_compare(PHP_VERSION, '5.6') >= 0) {
$lint_exclude = 'vendor';
} else {
$lint_exclude = 'vendor|lib/influxdb-php';
}
$lint_cmd = 'find . -regextype posix-extended -regex "\./(';
$lint_cmd .= $lint_exclude;
$lint_cmd .= ')" -prune -o -name "*.php" -print0 | xargs -0 -n1 -P8 php -l ';
$lint_cmd .= '| grep -v "^No syntax errors detected"; test $? -eq 1';
exec($lint_cmd, $lint_output, $lint_ret);
if ($lint_ret > 0) {
print(implode(PHP_EOL, $lint_output) . PHP_EOL);
} else {
echo "success\n";
$result = '';
foreach ($excludes as $exclude) {
$result .= $exclude_string . $exclude . ' ';
}
return $lint_ret;
}
/**
* Runs phpcs --standard=PSR2 against the code base
*
* @param bool $passthru display the output as comes in
* @return int the return value from phpcs (0 = success)
*/
function check_style($passthru = false)
{
echo 'Checking PSR-2 style...'.($passthru ? "\n" : ' ');
$cs_exclude = '--ignore=html/lib/* --ignore=html/plugins/';
$cs_cmd = "./vendor/bin/phpcs -n -p --colors --extensions=php --standard=PSR2 $cs_exclude html includes";
$cs_output = '';
if ($passthru) {
passthru($cs_cmd, $cs_ret);
} else {
exec($cs_cmd, $cs_output, $cs_ret);
}
if (!$passthru) {
if ($cs_ret > 0) {
echo "failed\n";
print(implode(PHP_EOL, $cs_output) . PHP_EOL);
} else {
echo "success\n";
}
}
return $cs_ret;
}
/**
* Runs phpunit
*
* @param bool $passthru display the output as comes in
* @return int the return value from phpunit (0 = success)
*/
function check_unit($passthru = false)
{
echo 'Running unit tests...'.($passthru ? "\n" : ' ');
$phpunit_cmd = './vendor/bin/phpunit --colors=always';
$phpunit_output = '';
if ($passthru) {
passthru($phpunit_cmd, $phpunit_ret);
} else {
exec($phpunit_cmd, $phpunit_output, $phpunit_ret);
}
if (!$passthru) {
if ($phpunit_ret > 0) {
echo "failed\n";
print(implode(PHP_EOL, $phpunit_output) . PHP_EOL);
} else {
echo "success\n";
}
}
return $phpunit_ret;
return $result;
}