App-Critique
view release on metacpan or search on metacpan
lib/App/Critique/Command/process.pm view on Meta::CPAN
# working directory, if so, exit with an
# error.
# TODO:
# add a new flag that will look at the last
# commit and assuming it included the current
# file, add the SHA to the session data (with a
# special note saying it was commited manually)
my @tracked_files = $session->tracked_files;
# TODO:
# not all these options can be given together, so
# we should do some validation for that.
# - SL
if ( $opt->back ) {
$session->dec_file_idx;
$tracked_files[ $session->current_file_idx ]->forget_all;
}
if ( $opt->next ) {
$session->inc_file_idx;
}
if ( $opt->reset ) {
$session->reset_file_idx;
$_->forget_all foreach @tracked_files;
}
if ( my $idx = $opt->goto ) {
$session->set_file_idx( $idx );
}
if ( $session->current_file_idx == scalar @tracked_files ) {
info(HR_DARK);
info('All files have already been processed.');
info(HR_LIGHT);
info('- run `critique status` to see more information');
info('- run `critique process --reset` to review all files again');
info(HR_DARK);
return;
}
my ($idx, $file);
MAIN:
while (1) {
info(HR_DARK);
$idx = $session->current_file_idx;
$file = $tracked_files[ $idx ];
my $path = $file->relative_path( $session->git_work_tree_root );
info('Running Perl::Critic against (%s)', $path);
info(HR_LIGHT);
# perlcritic can fail, so lets guard against it and let the user
# decide if they want to carry on
my @violations;
eval {
@violations = $self->discover_violations( $session, $file, $opt );
1;
} or do {
info(HR_ERROR);
warn($@);
info(HR_LIGHT);
my $should_review = prompt_yn(
BOLD(sprintf 'A error has occurred do you want to continue?'),
{ default => 'y' }
);
unless ( $should_review ) { exit }
next;
};
# remember it the first time we use it
# but do not update it for each re-process
# which we do after each edit
$file->remember('violations' => scalar @violations)
unless $file->recall('violations');
if ( @violations == 0 ) {
info(ITALIC('No violations found, proceeding to next file.'));
next MAIN;
}
else {
my $should_review = prompt_yn(
BOLD(sprintf 'Found %d violations, would you like to review them?', (scalar @violations)),
{ default => 'y' }
);
if ( $should_review ) {
my ($reviewed, $edited) = (
$file->recall('reviewed') // 0,
$file->recall('edited') // 0,
);
foreach my $violation ( @violations ) {
$self->display_violation( $session, $file, $violation, $opt );
$reviewed++;
my $should_edit = prompt_yn(
BOLD('Would you like to fix this violation?'),
{ default => 'y' }
);
my $did_commit = 0;
if ( $should_edit ) {
$did_commit = $self->edit_violation( $session, $file, $violation );
$edited++ if $did_commit;
}
# keep state on disc ...
$file->remember('reviewed', $reviewed);
$file->remember('edited', $edited);
$self->cautiously_store_session( $session, $opt, $args );
( run in 1.867 second using v1.01-cache-2.11-cpan-5837b0d9d2c )