App-Sqitch
view release on metacpan or search on metacpan
lib/App/Sqitch/Command/plan.pm view on Meta::CPAN
target|t=s
change-pattern|change=s
planner-pattern|planner=s
format|f=s
date-format|date=s
max-count|n=i
skip=i
reverse!
color=s
no-color
abbrev=i
oneline
headers!
);
}
sub configure {
my ( $class, $config, $opt ) = @_;
# Set base values if --oneline.
if ($opt->{oneline}) {
$opt->{format} ||= 'oneline';
$opt->{abbrev} //= 6;
}
# Determine and validate the date format.
my $date_format = delete $opt->{date_format} || $config->get(
key => 'plan.date_format'
);
if ($date_format) {
require App::Sqitch::DateTime;
App::Sqitch::DateTime->validate_as_string_format($date_format);
} else {
$date_format = 'iso';
}
# Make sure the plan format is valid.
if (my $format = $opt->{format}
|| $config->get(key => 'plan.format')
) {
if ($format =~ s/^format://) {
$opt->{format} = $format;
} else {
$opt->{format} = $FORMATS{$format} or hurl plan => __x(
'Unknown plan format "{format}"',
format => $format
);
}
}
# Determine how to handle ANSI colors.
my $color = delete $opt->{no_color} ? 'never'
: delete $opt->{color} || $config->get(key => 'plan.color');
$opt->{formatter} = App::Sqitch::ItemFormatter->new(
( $date_format ? ( date_format => $date_format ) : () ),
( $color ? ( color => $color ) : () ),
( $opt->{abbrev} ? ( abbrev => delete $opt->{abbrev} ) : () ),
);
return $class->SUPER::configure( $config, $opt );
}
sub execute {
my $self = shift;
my ($targets) = $self->parse_args(
target => $self->target,
args => \@_,
);
# Warn on multiple targets.
my $target = shift @{ $targets };
$self->warn(__x(
'Too many targets specified; using {target}',
target => $target->name,
)) if @{ $targets };
my $plan = $target->plan;
# Exit with status 1 on no changes, probably not expected.
hurl {
ident => 'plan',
exitval => 1,
message => __x(
'No changes in {file}',
file => $plan->file,
),
} unless $plan->count;
# Search the changes.
my $iter = $plan->search_changes(
operation => $self->event,
name => $self->change_pattern,
planner => $self->planner_pattern,
limit => $self->max_count,
offset => $self->skip,
direction => $self->reverse ? 'DESC' : 'ASC',
);
# Send the results.
my $formatter = $self->formatter;
my $format = $self->format;
if ($self->headers) {
$self->page( '# ', __x 'Project: {project}', project => $plan->project );
$self->page( '# ', __x 'File: {file}', file => $plan->file );
$self->page('');
}
while ( my $change = $iter->() ) {
$self->page( $formatter->format( $format, {
event => $change->is_deploy ? 'deploy' : 'revert',
project => $change->project,
change_id => $change->id,
change => $change->name,
note => $change->note,
deploy_file => $change->deploy_file,
tags => [ map { $_->format_name } $change->tags ],
requires => [ map { $_->as_string } $change->requires ],
conflicts => [ map { $_->as_string } $change->conflicts ],
planned_at => $change->timestamp,
planner_name => $change->planner_name,
planner_email => $change->planner_email,
} ) );
( run in 4.600 seconds using v1.01-cache-2.11-cpan-4ac696b4eb4 )