App-githook-perltidy

 view release on metacpan or  search on metacpan

bin/githook-perltidy  view on Meta::CPAN

hook. It ensures that your Perl files are always cleanly commited with
L<Perl::Tidy> (or L<Perl::Tidy::Sweetened>). The script can also call
L<Perl::Critic> and L<Pod::Tidy> if you want.

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

=head2 Repository Setup

Before you can use B<githook-perltidy> you need to make sure everyone
working on your code uses the the same L<Perl::Tidy> and (probably)
L<Pod::Tidy> options:

    $ perltidy -b -w -dop | grep -v dump-options > .perltidyrc
    $ echo '--columns 72' > .podtidy-opts
    $ echo '^\.perltidyrc' >> MANIFEST.SKIP
    $ echo '^\.podtidy-opts' >> MANIFEST.SKIP
    $ git add .perltidyrc .podtidy-opts MANIFEST.SKIP
    $ git commit -m 'githook-perltidy support' && git push

You should also add L<App::githook::perltidy> as an explicit "develop"
dependency in your F<cpanfile>, F<Makefile.PL> or F<Build.PL>, so that
B<githook-perltidy> gets installed when developers install the rest of
your project's dependencies.

	# For example in your cpanfile:
	on develop => sub {
		requires 'App::githook::perltidy' => 0;
	};

=head3 Sweeter Tidying

You may prefer to tidy with L<Perl::Tidy::Sweetened> instead of plain
L<Perl::Tidy>. To enable that you commit a F<.perltidyrc.sweetened>
file instead of F<.perltidyrc>.  If you use this feature you will want
to add L<Perl::Tidy::Sweetened> as an explicit "develop" dependency in
your F<cpanfile>, F<Makefile.PL> or F<Build.PL>.

=head3 Critical Checks

You may additionally wish to have L<Perl::Critic> run against your
commits.  To enable that you simply commit a F<.perlcriticrc> file to
the repository. If you use this feature you will want to add
L<Perl::Critic> as an explicit "develop" dependency in your
F<cpanfile>, F<Makefile.PL> or F<Build.PL>.

=head3 README from POD

B<githook-perltidy> also has an automatic README-from-POD feature. To
enable it you create and commit a file called F<.readme_from>
containing the name of the POD source file:

    $ echo 'lib/Your/App.pm' > .readme_from
    $ echo '^\.readme_from' >> MANIFEST.SKIP
    $ git add .readme_from MANIFEST.SKIP
    $ git commit -m 'githook-perltidy readme_from' && git push

With the above in place the F<README> file will be updated (and
potentially committed) whenever F<lib/Your/App.pm> is committed.

=head2 githook-perltidy install [--force, -f] [--absolute, -a]

Anyone making commits in your repository should ensure that
B<githook-perltidy> runs before the Git commit completes.  The
C<install> command is used to create a F<pre-commit> file in the
F<$GIT_DIR/hooks/> directory. It must be run from the top-level
directory of your repository.

    $ githook-perltidy install
    $ cat .git/hooks/pre-commit
	#!/bin/sh
	if [ "$NO_GITHOOK_PERLTIDY" != "1" ]; then
		PERL5LIB="" githook-perltidy pre-commit
	fi

The install command fails if there is no F<.perltidyrc> or
F<.perltidyrc.sweetened> file in the repository or if the hooks
directory isn't found. It will also fail if the Git F<pre-commit> file
already exists, unless C<--force> is used to replace it.

By default the hook finds B<githook-perltidy> via C<$PATH>. If regular
changes to your PATH (e.g. due to perlbrew, local::lib, etc) break
that, you I<may> wish to do an C<--absolute> install instead to use the
full path. However, be aware that upgrading your system perl and/or
B<githook-perltidy> might invalidate that, requiring you to reinstall
the hook to make it work again. Ideally you would install
B<githook-perltidy> in a system-wide location (e.g. /usr/local/bin)
that doesn't change and does not depend on particular PERL5LIB.

=head2 githook-perltidy pre-commit

The C<pre-commit> command loops through the Git index, checking out
files to a temporary working directory. Then on each file that looks
like a Perl or Pod file it:

=over

=item * Runs L<perlcritic> if F<.perlcriticrc> exists (for a Perl file)

=item * Runs L<perltidy> (or L<perltidy-sweet>) (for a Perl file)

=item * Runs L<podtidy> if F<.podtidy-opts> exists (for a Perl or Pod file)

=item * Updates the Git index with the tidied file.

=item * Creates a new F<README> file using L<Pod::Text> if the tidied
file matches F<.readme_from>. The F<README> file gets committed if it
is already being tracked by Git.

=item * Runs L<perltidy> and/or L<podtidy> on your working
tree file. This prevents C<git diff> from displaying an eroneous diff.

=back

Any error stops the script (and therefore the commit) immediately. Any
successful cleanups to the index and working tree up until that point
remain in place.



( run in 1.453 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )