App-GitHooks
view release on metacpan or search on metacpan
lib/App/GitHooks.pm view on Meta::CPAN
The name of the git hook calling this class. See the "VALID GIT HOOK NAMES"
section for acceptable values.
=item * arguments I<(optional)>
An arrayref of arguments passed originally to the git hook.
=item * exit I<(optional, default 1)>
Indicate whether the method should exit (1) or simply return the exit status
without actually exiting (0).
=back
=cut
sub run
{
my ( $class, %args ) = @_;
my $name = delete( $args{'name'} );
my $arguments = delete( $args{'arguments'} );
my $exit = delete( $args{'exit'} ) // 1;
my $exit_code =
try
{
croak 'Invalid argument(s): ' . join( ', ', keys %args )
if scalar( keys %args ) != 0;
# Clean up hook name in case we were passed a file path.
$name = File::Basename::fileparse( $name );
# Validate hook name.
croak 'A hook name must be passed'
if !defined( $name );
croak "Invalid hook name $name"
if scalar( grep { $_ eq $name } @$HOOK_NAMES ) == 0;
if (my $env_var = _should_skip( $name )) {
carp "Hook $name skipped because of $env_var";
return $HOOK_EXIT_SUCCESS;
}
# Validate arguments.
croak 'Unknown argument(s): ' . join( ', ', keys %args )
if scalar( keys %args ) != 0;
# Load the hook class.
my $hook_class = "App::GitHooks::Hook::" . _to_camelcase( $name );
Class::Load::load_class( $hook_class );
# Create a new App instance to hold the various data.
my $self = $class->new(
arguments => $arguments,
name => $name,
);
# Force the output to match the terminal encoding.
my $terminal = $self->get_terminal();
my $terminal_encoding = $terminal->get_encoding();
binmode( STDOUT, "encoding($terminal_encoding)" )
if $terminal->is_utf8();
# Run the hook.
my $hook_exit_code = $hook_class->run(
app => $self,
);
croak "$hook_class ran successfully but did not return an exit code."
if !defined( $hook_exit_code );
return $hook_exit_code;
}
catch
{
chomp( $_ );
print STDERR "Error detected in hook: >$_<.\n";
return $HOOK_EXIT_FAILURE;
};
if ( $exit )
{
exit( $exit_code );
}
else
{
return $exit_code;
}
}
=head1 METHODS
=head2 new()
Create a new C<App::GitHooks> object.
my $app = App::GitHooks->new(
name => $name,
arguments => \@arguments,
);
Arguments:
=over 4
=item * name I<(mandatory)>
The name of the git hook calling this class. See the "VALID GIT HOOK NAMES"
section for acceptable values.
=item * arguments I<(optional)>
An arrayref of arguments passed originally to the git hook.
=back
=cut
sub new
{
my ( $class, %args ) = @_;
( run in 1.225 second using v1.01-cache-2.11-cpan-d8267643d1d )