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.
- PHP 7.1 and greater
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
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.
Static Review can be used for both files and commit message review. Below are basic hooks for each.
#!/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);
#!/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);
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);
}
}
}
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);
}
}
}
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
The content of this library is released under the MIT License by Samuel Parkinson.