mcampbell508 / git-review
An extendable framework for version control hooks.
Requires
- php: ^7.1
- danielstjules/stringy: ~3.1.0
- league/climate: ^2.0 || ^3.0
- pimple/pimple: ~3.0
- spatie/regex: ^1.2
- symfony/console: ^2.0 || ^3.2
- symfony/process: ^2.1 || ^3.1
- tightenco/collect: ^5.5 || ^5.6
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.11
- fzaninotto/faker: ^1.7
- 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.
This package is auto-updated.
Last update: 2025-02-28 03:13:02 UTC
README
This package was forked from Static Review which has been abandoned.
I am using this as a personal project and have renamed to git-review
An extendable framework for version control hooks.
Requirements
- PHP 7.1 and greater
Usage
For a composer managed project you can simply run the following ...
$ composer require mcampbell508/git-review
Hooks can then be installed like so ...
$ vendor/bin/git-review.php hook:install vendor/mcampbell508/git-review/hooks/example-pre-commit.php .git/hooks/pre-commit
Otherwise, if you don't use composer ...
$ git clone https://github.com/mcampbell508/git-review.git $ cd git-review/ $ composer install --no-dev --optimize-autoloader $ bin/git-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 git-review
globally:
$ composer g require mcampbell508/git-review
Then, just install the hooks as you would normally but reference the global installation path:
$ git-review.php hook:install ~/.composer/vendor/mcampbell508/git-review/hooks/git-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 GitReview\GitReview; use GitReview\Review\General\LineEndingsReview; [...] $reporter = new Reporter(); $review = new GitReview($reporter); // Add any reviews to the GitReview 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 GitReview\GitReview; use GitReview\Review\Message\BodyLineLengthReview; [...] $reporter = new Reporter(); $review = new GitReview($reporter); // Add any reviews to the GitReview 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/mcampbell508/git-review.git $ cd git-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.