App-GitHooks-Plugin-DetectCommitNoVerify

 view release on metacpan or  search on metacpan

lib/App/GitHooks/Plugin/DetectCommitNoVerify.pm  view on Meta::CPAN

checks when you use --no-verify and runs the pre-commit checks if you've
skipped them. It will let you commit even if the pre-commit checks fail, but it
will add their output to the commit message for posterity (and public shaming).


=head1 VERSION

Version 1.0.3

=cut

our $VERSION = '1.0.3';


=head1 METHODS

=head2 run_prepare_commit_msg()

Code to execute as part of the prepare-commit-msg hook.

  my $success = App::GitHooks::Plugin::DetectCommitNoVerify->run_prepare_commit_msg();

=cut

sub run_prepare_commit_msg
{
	my ( $class, %args ) = @_;
	my $app = delete( $args{'app'} );
	my $commit_message = delete( $args{'commit_message'} );
	my $repository = $app->get_repository();

	# Check if we've run the pre-commit hook.
	return $PLUGIN_RETURN_SKIPPED
		if -e '.git/COMMIT-MSG-CHECKS';

	# Check the changes and gather the output.
	my $changes_pass;
	my $stdout = Capture::Tiny::capture_stdout(
		sub
		{
			# Pretend we're running the pre-commit hook here to gather its output.
			my $local_app = $app->clone(
				name => 'pre-commit',
			);

			# Git commit messages don't seem to like utf8, so force disabling it.
			my $terminal = $local_app->get_terminal();
			$terminal->is_utf8(0);

			# Run all the tests for the pre-commit hook.
			$changes_pass = App::GitHooks::Hook::PreCommit::run_all_tests( $local_app );
		}
	);

	if ( !$changes_pass )
	{
		# "git revert" bypasses the pre-commit hook, so we can only use use the
		# prepare-commit-msg hook to catch any show-stoppers.
		# Since prepare-commit-msg doesn't support --no-verify, we should only
		# perform the essential checks when we're analyzing a revert. Note that you
		# can still do chmod -x .git/hooks/prepare-commit-msg to force-bypass this
		# hook in this case.
		my $staged_changes = $app->get_staged_changes();
		if ( $staged_changes->is_revert() )
		{
			chomp( $stdout );
			print $stdout, "\n";
			print "\n";
			print $app->color( 'red', "Fix the errors above and use 'git commit' to complete the revert." ) . "\n";
			return $PLUGIN_RETURN_FAILED;
		}

		# If output was generated by the pre-commit hooks, append it to the commit
		# message.
		if ( $stdout =~ /\w/ )
		{
			chomp( $stdout );

			# Git commit messages don't support ANSI control characters (which we
			# use for colors), so we need to strip those out.
			$stdout =~ s/\e\[[\d;]*[a-zA-Z]//g;

			# We need to append $stdout to $commit_message, as $commit_message will
			# contain the message passed via -m and this should be at the top of
			# the final message.
			$commit_message->update_message( $commit_message->get_message() . "\n\n" . $stdout );
		}
	}

	return $PLUGIN_RETURN_PASSED;
}


=head1 BUGS

Please report any bugs or feature requests through the web interface at
L<https://github.com/guillaumeaubert/App-GitHooks-Plugin-DetectCommitNoVerify/issues/new>.
I will be notified, and then you'll automatically be notified of progress on
your bug as I make changes.


=head1 SUPPORT

You can find documentation for this module with the perldoc command.

	perldoc App::GitHooks::Plugin::DetectCommitNoVerify


You can also look for information at:

=over

=item * GitHub's request tracker

L<https://github.com/guillaumeaubert/App-GitHooks-Plugin-DetectCommitNoVerify/issues>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/app-githooks-plugin-detectcommitnoverify>

=item * CPAN Ratings



( run in 0.447 second using v1.01-cache-2.11-cpan-5735350b133 )