#!perl
use strict;
use App::githook_perltidy;
use OptArgs2 qw/class_optargs/;

my ( $class, $opts ) = class_optargs('App::githook_perltidy');
eval "require $class" or die $@;
$class->new($opts)->run;

1;
__END__

=head1 NAME

githook-perltidy - run perltidy and podtidy before Git commits

=head1 VERSION

0.11.6 (2018-06-28)

=head1 SYNOPSIS

Make sure everyone uses the same tidy options across your project:

    $ perltidy -b -w -dop | grep -v dump-options > .perltidyrc
    $ echo '--columns 72' > .podtidy-opts
    $ git add .perltidyrc .podtidy-opts
    $ git commit

Install the pre-commit hook:

    $ githook-perltidy install

=head1 DESCRIPTION

B<githook-perltidy> is a script that can be invoked by Git pre-commit
hook to run L<perltidy> and L<podtidy> on Perl and POD files (and
optionally run L<make>(1) targets), ensuring that your project's code
is always cleanly committed.

This script is is efficient: it only modifies Perl and POD files that
are being committed and not every file in your repository. It also
tries its hardest to be safe: tidying is performed on a separate
working tree so that your own working files are not left in a bad state
in the event of failure.

There are two types of action this script will take as determined by
the first argument:

=over 4

=item install [--force, -f] [MAKE ARGS]

Should be run from the command-line in the top-level directory of your
repository. Writes F<pre-commit> and F<post-commit> files in the
F<$GIT_DIR/hooks/> directory. Any MAKE ARGS given will be added to the
C<githook-perltidy pre-commit> call.

This command will fail if there is no .perltidyrc file in the
repository or if the hooks directory isn't found. It will also fail if
either of the hook files already exist, unless C<--force> is used.

=item pre-commit [MAKE ARGS]

Called from a Git pre-commit hook.  Checks out your index to a
temporary working directory. Runs L<perltidy> on any Perl files in the
Git index using the F<.perltidyrc>. If F<.podtidy-opts> exists then
L<podtidy> will also be run on any POD files in the Git index.  Any
tidying errors stop the commmit. Otherwise the index and your working
tree are updated with tidied files.

If any MAKE ARGS are given they will be passed to a L<make> call.  This
way you can ensure that your code passes a C<make test> or C<make
disttest> check before each commit.  If the PERLTIDY_MAKE environment
variable exists it will I<override> any arguments. Setting
PERLTIDY_MAKE="" will skip the make call entirely.

This command will fail if there is no .perltidyrc file in the
repository.

=back

There is also a C<post-commit> command left over from earlier versions
that now does nothing and can be ignored.

=head1 OPTIONS

=over

=item --verbose, -v

Print underlying Git commands or filesystem actions as they are run.

=back

=head1 CAVEATS

There are two ways in which B<githook-perltidy> behaviour may affect
your existing workflow. Firstly if you are accustomed to commiting
changes to files which are still open in your editor, your editor may
complain that the underlying file has changed on disk. Possibily your
editor doesn't even detect the change and your next write will not be
'tidy'.

Secondly, aborting a commit with an empty commit message or via a later
command in the pre-commit hook will still result in changed (tidied)
files on disk and in the index.

=head1 FILES

=over

=item F<.perltidyrc>

Perltidy command options file.

=item F<.podtidy-opts>

Podtidy command options file. This is githook-perltidy specific.

=back

=head1 SUPPORT

This tool is managed via github:

    https://github.com/mlawren/githook-perltidy

=head1 SEE ALSO

L<githooks>(5), L<perltidy>(1), L<podtidy>(1)

=head1 AUTHOR

Mark Lawrence E<lt>nomad@null.netE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright 2011-2018 Mark Lawrence <nomad@null.net>

This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.

