App-githook-perltidy

 view release on metacpan or  search on metacpan

lib/App/githook/perltidy/pre_commit.pm  view on Meta::CPAN

    }
}

our $temp_dir;

sub sys {
    my $self = shift;
    $v_status = join( ' ', map { defined $_ ? $_ : '*UNDEF*' } @_ ) . "\n";
    system(@_) == 0 or Carp::croak "@_ failed: $?";
}

sub tmp_sys {
    my $self = shift;
    local $ENV{GIT_WORK_TREE} = $temp_dir;
    $self->sys(@_);
}

sub tidy_perl {
    my $self     = shift;
    my $tmp_file = shift || die 'tidy_perl($TMP_FILE, $file)';
    my $file     = shift || die 'tidy_perl($tmp_file, $FILE)';
    my $where    = shift;

    state $req = do {
        no strict 'refs';
        if ( $self->sweetened ) {
            require Perl::Tidy::Sweetened;
            *perltidy = \&Perl::Tidy::Sweetened::perltidy;
        }
        else {
            require Perl::Tidy;
            *perltidy = \&Perl::Tidy::perltidy;
        }
    };

    $status = "(perltidy) ($where)";

    my $errormsg;
    my $error = perltidy(
        argv       => [ qw{-nst -b -bext=/}, "$tmp_file" ],
        errorfile  => \$errormsg,
        perltidyrc => $self->perltidyrc->stringify,
    );

    if ( length($errormsg) ) {
        $status .= ":\n";
        die $errormsg;
    }
    elsif ($error) {
        $status .= ":\n";
        die "An unknown perltidy error occurred.";
    }
}

sub tidy_pod {
    my $self     = shift;
    my $tmp_file = shift || die 'tidy_pod($TMP_FILE, $file)';
    my $file     = shift || die 'tidy_pod($tmp_file, $FILE)';
    my $where    = shift;

    state $req = require Pod::Tidy;
    $status = "(podtidy) ($where)";

    Pod::Tidy::tidy_files(
        files     => [$tmp_file],
        recursive => 0,
        verbose   => 0,
        inplace   => 1,
        nobackup  => 1,
        columns   => 72,
        %{ $self->podtidyrc_opts },
    );
}

sub critic_perl {
    my $self     = shift;
    my $tmp_file = shift || die 'critic_perl($TMP_FILE, $file)';
    my $file     = shift || die 'critic_perl($tmp_file, $FILE)';
    my $where    = shift;

    state $req = require Perl::Critic;
    $status = "(perlcritic) ($where)";

    my @violations =
      Perl::Critic::critique( { -profile => $self->perlcriticrc->stringify },
        $tmp_file->stringify );

    if (@violations) {
        $status .= ":\n";
        die join( '', @violations );
    }
}

sub convert_readme {
    my $self = shift;
    my $file = shift || die 'convert_readme($FILE)';

    $status = '-> README';

    my $width = $self->podtidyrc_opts->{columns} // 72;

    require Pod::Text;
    Pod::Text->new( sentence => 0, width => $width )
      ->parse_from_file( "$file", 'README' );

    if ( system("git ls-files --error-unmatch README > /dev/null 2>&1") == 0 ) {
        $self->sys(qw/git add README/);
    }
}

sub run {
    my $self      = shift;
    my @perlfiles = ();
    my %partial   = ();

    untie $v_status unless $self->verbose;

    return if $ENV{NO_GITHOOK_PERLTIDY};
    $temp_dir = Path::Tiny->tempdir('githook-perltidy-XXXXXXXX');

    $v_status = "TMP=$temp_dir\n";

    my @index;
    my $force_readme = 0;
    my $readme_from  = $self->readme_from // '';

    # Use the -z flag to get clean filenames with no escaping or quoting
    # "lines" are separated with NUL, so set input record separator
    # appropriately
    {
        local $/ = "\0";
        open( my $fh, '-|', 'git status --porcelain -z' ) || die "open: $!";

        while ( my $line = <$fh> ) {
            chomp $line;
            next unless $line =~ m/^[ACMR](.) (.*)/;
            my ( $wtree, $file ) = ( $1, $2 );

            push( @index, $file );
            $partial{$file} = $wtree eq 'M';



( run in 0.679 second using v1.01-cache-2.11-cpan-0b5f733616e )