The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package Tapper::CLI::Testrun::Command::updateprecondition;
BEGIN {
  $Tapper::CLI::Testrun::Command::updateprecondition::AUTHORITY = 'cpan:AMD';
}
{
  $Tapper::CLI::Testrun::Command::updateprecondition::VERSION = '4.1.0';
}

use 5.010;

use strict;
use warnings;

use parent 'App::Cmd::Command';

use File::Slurp qw/read_file/;
use YAML::Syck qw/Load Dump/;

use Tapper::Cmd::Precondition;
use Tapper::Model 'model';

sub abstract {
        'Update an existing precondition'
}

sub opt_spec {
        return (
                [ "verbose|v",                           "some more informational output"                                            ],
                [ "shortname=s",                       "TEXT; shortname", { required => 1 }                                        ],
                [ "timeout=s",                         "INT; stop trying to fullfill this precondition after timeout second",      ],
                [ "condition=s",                       "TEXT; condition description in YAML format (see Spec)"                     ],
                [ "condition_file=s",                  "STRING; filename from where to read condition, use - to read from STDIN"   ],
                [ "precondition=s@",                   "INT; assigned pre-precondition ids"                                        ],
                [ "id=s",                              "INT; the precondition id to change", {required => 1 }                      ],
               );
}

sub usage_desc
{
        "tapper-testrun updateprecondition --id=s [ --shortname=s | --condition=s | --condition_file=s ) ";
}

sub _allowed_opts {
        my @allowed_opts = map { $_->[0] } opt_spec();
}

sub validate_args {
        my ($self, $opt, $args) = @_;

        my $msg = "Unknown option";
        $msg   .= ($args and $#{$args} >=1) ? 's' : '';
        $msg   .= ": ";
        say STDERR $msg, join(', ',@$args) if ($args and @$args);

        say "Only one of --condition or --condition_file allowed." if $opt->{condition} && $opt->{condition_file};

        return 1 if $opt->{id};
        die $self->usage->text;
}

sub execute {
        my ($self, $opt, $args) = @_;

        $self->update_precondition ($opt, $args);
}

sub read_condition_file
{
        my ($condition_file) = @_;

        my $condition;

        # read from file or STDIN if filename == '-'
        if ($condition_file) {
                if ($condition_file eq '-') {
                        $condition = read_file (\*STDIN);
                } else {
                        $condition = read_file ($condition_file);
                }
        }
        return $condition;
}

sub update_precondition
{
        my ($self, $opt, $args) = @_;

        #print "opt  = ", Dumper($opt);

        my $id             = $opt->{id};
        my $condition      = $opt->{condition};
        my $condition_file = $opt->{condition_file};
        my $shortname      = $opt->{shortname};


        $condition ||= read_condition_file($condition_file);
        if ($shortname) {
                my $data = Load($condition);
                $data->{shortname} = $shortname;
                $condition = Dump($data);
        }


        my $cmd = Tapper::Cmd::Precondition->new();

        $id = $cmd->update($id, $condition);

        if ($opt->{verbose}) {

                my $precondition = model('TestrunDB')->resultset('Precondition')->search({id => $id}, {rows => 1})->first;
                say $precondition->to_string;
        }  else {
                say $id;
        }
}



# perl -Ilib bin/tapper-testrun updateprecondition --shortname=perl-5.10 --condition_file=- --timeout=100

1;

__END__
=pod

=encoding utf-8

=head1 NAME

Tapper::CLI::Testrun::Command::updateprecondition

=head1 AUTHOR

AMD OSRC Tapper Team <tapper@amd64.org>

=head1 COPYRIGHT AND LICENSE

This software is Copyright (c) 2012 by Advanced Micro Devices, Inc..

This is free software, licensed under:

  The (two-clause) FreeBSD License

=cut