sjparkinson / static-review
An extendable framework for version control hooks.
Installs: 3 221 789
Dependents: 31
Suggesters: 0
Security: 0
Stars: 326
Watchers: 15
Forks: 26
Open Issues: 0
Requires
- php: ^5.5 || ^7.0
- league/climate: ^2.0 || ^3.0
- symfony/console: ^2.0
- symfony/process: ^2.1
Requires (Dev)
- mockery/mockery: ^0.9
- phpunit/phpunit: ^4.6 || ^5.0
- sensiolabs/security-checker: ^3.0
- squizlabs/php_codesniffer: ^2.2
Suggests
- sensiolabs/security-checker: required by ComposerSecurityReview.
- squizlabs/php_codesniffer: required by PhpCodeSnifferReview.
README
This package is abandoned 🚨.
See GrumPHP for a maintained alternative.
An extendable framework for version control hooks.
Usage
For a composer managed project you can simply run the following ...
$ composer require sjparkinson/static-review
Hooks can then be installed like so ...
$ vendor/bin/static-review.php hook:install vendor/sjparkinson/static-review/hooks/example-pre-commit.php .git/hooks/pre-commit
Otherwise, if you don't use composer ...
$ git clone https://github.com/sjparkinson/static-review.git $ cd static-review/ $ composer install --no-dev --optimize-autoloader $ bin/static-review.php hook:install hooks/example-pre-commit.php ~/.../.git/hooks/pre-commit
Global Installation and Usage
The hooks can also be used for any project if you install static-review
globally:
$ composer g require sjparkinson/static-review
Then, just install the hooks as you would normally but reference the global installation path:
$ static-review.php hook:install ~/.composer/vendor/sjparkinson/static-review/hooks/static-review-commit-msg.php .git/hooks/commit-msg
This assumes you have set up global composer paths.
Example Hooks
Static Review can be used for both files and commit message review. Below are basic hooks for each.
For Files
#!/usr/bin/env php <?php include __DIR__ . '/../../../autoload.php'; // Reference the required classes. use StaticReview\StaticReview; use StaticReview\Review\General\LineEndingsReview; [...] $reporter = new Reporter(); $review = new StaticReview($reporter); // Add any reviews to the StaticReview instance, supports a fluent interface. $review->addReview(new LineEndingsReview()); $git = new GitVersionControl(); // Review the staged files. $review->files($git->getStagedFiles()); // Check if any issues were found. // Exit with a non-zero status to block the commit. ($reporter->hasIssues()) ? exit(1) : exit(0);
For Commit Messages
#!/usr/bin/env php <?php include __DIR__ . '/../../../autoload.php'; // Reference the required classes. use StaticReview\StaticReview; use StaticReview\Review\Message\BodyLineLengthReview; [...] $reporter = new Reporter(); $review = new StaticReview($reporter); // Add any reviews to the StaticReview instance, supports a fluent interface. $review->addReview(new BodyLineLengthReview()); $git = new GitVersionControl(); // Review the current commit message. // The hook is passed the file holding the commit message as the first argument. $review->message($git->getCommitMessage($argv[1])); // Check if any issues were found. // Exit with a non-zero status to block the commit. ($reporter->hasIssues()) ? exit(1) : exit(0);
Example Review For Files
class NoCommitTagReview extends AbstractFileReview { // Review any text based file. public function canReviewFile(FileInterface $file) { $mime = $file->getMimeType(); // check to see if the mime-type starts with 'text' return (substr($mime, 0, 4) === 'text'); } // Checks if the file contains `NOCOMMIT`. public function review(ReporterInterface $reporter, ReviewableInterface $file) { $cmd = sprintf('grep --fixed-strings --ignore-case --quiet "NOCOMMIT" %s', $file->getFullPath()); $process = $this->getProcess($cmd); $process->run(); if ($process->isSuccessful()) { $message = 'A NOCOMMIT tag was found'; $reporter->error($message, $this, $file); } } }
Example Review For Messages
class WorkInProgressReview extends AbstractMessageReview { // Check if the commit message contains "wip" public function review(ReporterInterface $reporter, ReviewableInterface $commit) { $fulltext = $commit->getSubject() . PHP_EOL . $commit->getBody(); if (preg_match('/\bwip\b/i', $fulltext)) { $message = 'Do not commit WIP to shared branches'; $reporter->error($message, $this, $commit); } } }
Unit Tests
See vagrantup.com and phpunit.de.
$ git clone https://github.com/sjparkinson/static-review.git $ cd static-review/ $ vagrant up $ vagrant ssh ... $ cd /srv $ composer update $ composer test
Licence
The content of this library is released under the MIT License by Samuel Parkinson.