File Coverage

blib/lib/Test/Smoke/App/Options.pm
Criterion Covered Total %
statement 173 253 68.3
branch 4 14 28.5
condition 6 12 50.0
subroutine 94 157 59.8
pod 0 97 0.0
total 277 533 51.9


line stmt bran cond sub pod time code
1             package Test::Smoke::App::Options;
2 7     7   109203 use warnings;
  7         24  
  7         243  
3 7     7   40 use strict;
  7         14  
  7         248  
4              
5             our $VERSION = '0.002';
6              
7 7     7   444 use Test::Smoke::App::AppOption;
  7         15  
  7         13042  
8              
9             =head1 NAME
10              
11             Test::Smoke::App::Options - A collection of application configs and config
12             options.
13              
14             =cut
15              
16             my $opt = 'Test::Smoke::App::AppOption';
17              
18             sub synctree_config { # synctree.pl
19             return (
20 5     5 0 916 main_options => [
21             sync_type(),
22             ],
23             general_options => [
24             ddir(),
25             ],
26             special_options => {
27             git => [
28             gitbin(),
29             gitorigin(),
30             gitdir(),
31             gitdfbranch(),
32             gitbranchfile(),
33             ],
34             rsync => [
35             rsyncbin(),
36             rsyncopts(),
37             rsyncsource(),
38             ],
39             copy => [
40             cdir()
41             ],
42             fsync => [
43             fdir(),
44             ],
45             },
46             );
47             }
48              
49             sub mailer_config { # mailing reports
50             return (
51 4     4 0 22 main_options => [
52             mail_type(),
53             ],
54             general_options => [
55             ddir(),
56             to(),
57             cc(),
58             bcc(),
59             ccp5p_onfail(),
60             rptfile(),
61             mail(),
62             report(0),
63             ],
64             special_options => {
65             mail => [ mailbin() ],
66             mailx => [
67             mailxbin(),
68             swcc(),
69             swbcc(),
70             ],
71             sendemail => [
72             sendemailbin(),
73             from(),
74             mserver(),
75             msport(),
76             msuser(),
77             mspass(),
78             ],
79             sendmail => [
80             sendmailbin(),
81             from(),
82             ],
83             'Mail::Sendmail' => [
84             from(),
85             mserver(),
86             msport(),
87             ],
88             'MIME::Lite' => [
89             from(),
90             mserver(),
91             msport(),
92             msuser(),
93             mspass(),
94             ],
95             },
96             );
97             }
98              
99             sub poster_config { # posting to CoreSmokeDB
100             return (
101 7     7 0 31 main_options => [
102             poster(),
103             ],
104             general_options => [
105             ddir(),
106             smokedb_url(),
107             jsnfile(),
108             report(0),
109             ],
110             special_options => {
111             'LWP::UserAgent' => [
112             ua_timeout(),
113             ],
114             'HTTP::Tiny' => [
115             ua_timeout(),
116             ],
117             'curl' => [
118             curlbin(),
119             curlargs(),
120             ua_timeout(),
121             ],
122             },
123             );
124             }
125              
126             sub reporter_config { # needed for sending out reports
127             return (
128 6     6 0 144 general_options => [
129             ddir(),
130             outfile(),
131             rptfile(),
132             jsnfile(),
133             lfile(),
134             cfg(),
135             showcfg(),
136             locale(),
137             defaultenv(),
138             perlio_only(),
139             is56x(),
140             skip_tests(),
141             harnessonly(),
142             harness3opts(),
143             hostname(),
144             from(),
145             send_log(),
146             send_out(),
147             user_note(),
148             un_file(),
149             un_position(),
150             ],
151             );
152             }
153              
154             sub reposter_config {
155 3     3 0 2654 my %pc = poster_config();
156 3         9 my $pc_so = $pc{special_options};
157             return (
158 3         7 main_options => [
159             poster(),
160             ],
161             general_options => [
162             adir(),
163             commit_sha(),
164             jsonreport(),
165             max_reports(),
166             smokedb_url(),
167             ],
168             special_options => $pc_so,
169             );
170             }
171              
172             sub sendreport_config { # sendreport.pl
173             # merge: mailer_config, poster_config and reporter_config.
174 4     4 0 966 my %mc = mailer_config();
175 4         34 my %pc = poster_config();
176 4         30 my %rc = reporter_config();
177 4         35 my %g_o;
178 4         20 for my $opt ( @{$mc{general_options}}
  4         45  
179 4         25 , @{$pc{general_options}}
180 4         46 , @{$rc{general_options}})
181             {
182 132   66     885 $g_o{$opt->name} ||= $opt;
183             }
184 4         27 my %s_o;
185 4         28 for my $so (keys %{$mc{special_options}}) {
  4         126  
186 24         98 $s_o{$so} = $mc{special_options}{$so};
187             }
188 4         32 for my $so (keys %{$pc{special_options}}) {
  4         80  
189 12         51 $s_o{$so} = $pc{special_options}{$so};
190             }
191              
192             return (
193 4         56 main_options => [mail_type(), poster() ],
194             general_options => [values %g_o, report(0)],
195             special_options => \%s_o,
196             );
197             }
198              
199             sub runsmoke_config { # runsmoke.pl
200             return (
201 7     7 0 1343 general_options => [
202             ddir(),
203             outfile(),
204             rptfile(),
205             jsnfile(),
206             cfg(),
207             defaultenv(),
208             perlio_only(),
209             force_c_locale(),
210             harness3opts(),
211             harnessonly(),
212             hasharness3(),
213             is56x(),
214             is_vms(),
215             is_win32(),
216             killtime(),
217             locale(),
218             makeopt(),
219             opt_continue(),
220             skip_tests(),
221             testmake(),
222             w32args(),
223             w32cc(),
224             w32make(),
225             pass_option(),
226             ],
227             );
228             }
229              
230             sub archiver_config {
231             return (
232 4     4 0 149 general_options => [
233             archive(),
234             ddir(),
235             adir(),
236             outfile(),
237             rptfile(),
238             jsnfile(),
239             lfile(),
240             ],
241             );
242             }
243              
244             sub smokeperl_config {
245 2     2 0 1030 my %stc = synctree_config();
246 2         9 my %rsc = runsmoke_config();
247 2         8 my %arc = archiver_config();
248 2         31 my %src = sendreport_config();
249              
250 2         13 my %m_o;
251 2         11 for my $opt (@{$stc{main_options}}, @{$rsc{main_options}},
  2         19  
  2         13  
252 2         18 @{$arc{main_options}}, @{$src{main_options}})
  2         19  
253             {
254 6   33     44 $m_o{$opt->name} ||= $opt;
255             }
256 2         25 my %g_o = (
257             sync()->name => sync(),
258             report()->name => report(),
259             sendreport()->name => sendreport(),
260             archive()->name => archive(),
261             smartsmoke()->name => smartsmoke(),
262             patchlevel()->name => patchlevel(),
263             );
264 2         13 for my $opt (@{$stc{general_options}}, @{$rsc{general_options}},
  2         17  
  2         10  
265 2         5 @{$arc{general_options}}, @{$src{general_options}})
  2         15  
266             {
267 122   66     493 $g_o{$opt->name} ||= $opt;
268             }
269 2         10 my %s_o;
270 2         10 for my $so (keys %{$stc{special_options}}) {
  2         47  
271 8         28 $s_o{$so} = $stc{special_options}{$so};
272             }
273 2         9 for my $so (keys %{$rsc{special_options}}) {
  2         12  
274 0         0 $s_o{$so} = $rsc{special_options}{$so};
275             }
276 2         5 for my $so (keys %{$arc{special_options}}) {
  2         10  
277 0         0 $s_o{$so} = $arc{special_options}{$so};
278             }
279 2         9 for my $so (keys %{$src{special_options}}) {
  2         20  
280 18         33 $s_o{$so} = $src{special_options}{$so};
281             }
282              
283             return (
284 6         30 main_options => [sort { $a->name cmp $b->name } values %m_o],
285 2         35 general_options => [sort { $a->name cmp $b->name } values %g_o],
  401         1563  
286             special_options => { %s_o },
287             );
288             }
289              
290             sub w32configure_config {
291             return (
292 0     0 0 0 general_options => [
293             ddir(),
294             w32cc(),
295             w32make(),
296             w32args(),
297             ],
298             );
299             }
300              
301             sub configsmoke_config {
302             return (
303 0     0 0 0 general_options => [
304             minus_des()
305             ]
306             );
307             }
308              
309             sub smokestatus_config {
310             return (
311 0     0 0 0 general_options => [
312             ddir(),
313             outfile(),
314             cfg(),
315             ],
316             );
317             }
318              
319             ###########################################################
320             ##### Individual options #####
321             ###########################################################
322              
323             sub adir {
324             return $opt->new(
325             name => 'adir',
326             option => '=s',
327             default => '',
328             helptext => "Directory to archive the smoker files in.",
329             configtext => "Which directory should be used for the archives?
330             \t(Make empty for no archiving)",
331             configtype => 'prompt_dir',
332             configdft => sub {
333 0     0   0 my $app = shift;
334 0         0 require File::Spec;
335 0         0 File::Spec->catdir('logs', $app->prefix);
336             },
337 7     7 0 61 );
338             }
339              
340             sub archive {
341 8     8 0 48 return $opt->new(
342             name => 'archive',
343             option => '!',
344             default => 1,
345             helptext => "Archive the reports after smoking.",
346             );
347             }
348              
349             sub bcc {
350             return $opt->new(
351             name => 'bcc',
352             option => '=s',
353             default => '',
354             helptext => 'Where to send a bcc of the reports.',
355             allow => [ undef, '', qr/@/ ],
356             configtype => 'prompt',
357             configtext => 'This is the email address used to send BlindCarbonCopy:',
358 0     0   0 configdft => sub {''},
359 4     4 0 60 );
360             }
361              
362             sub cc {
363             return $opt->new(
364             name => 'cc',
365             option => '=s',
366             default => '',
367             helptext => 'Where to send a cc of the reports.',
368             allow => [ undef, '', qr/@/ ],
369             configtype => 'prompt',
370             configtext => 'This is the email address used to send CarbonCopy:',
371 0     0   0 configdft => sub {''},
372 4     4 0 68 );
373             }
374              
375             sub ccp5p_onfail {
376 4     4 0 34 return $opt->new(
377             name => 'ccp5p_onfail',
378             option => '!',
379             default => 0,
380             helptext => 'Include the p5p-mailinglist in CC.',
381             );
382             }
383              
384             sub cdir { # cdir => ddir
385 5     5 0 21 return $opt->new(
386             name => 'cdir',
387             option => '=s',
388             helptext => "The local directory from where to copy the perlsources.",
389             );
390             }
391              
392             sub cfg {
393             return $opt->new(
394             name => 'cfg',
395             option => '=s',
396             default => undef,
397             helptext => "The name of the BuildCFG file.",
398             configtext => "Which build configureations file would you like to use?",
399             configtype => 'prompt_file',
400             configfnex => 1,
401             configdft => sub {
402 0     0   0 my $self = shift;
403 7     7   61 use File::Spec;
  7         16  
  7         2222  
404 0         0 File::Spec->rel2abs($self->prefix . ".buildcfg");
405             },
406 13     13 0 130 );
407             }
408              
409             sub commit_sha {
410             return $opt->new(
411             name => 'commit_sha',
412             option => 'sha=s@',
413             allow => sub {
414 3     3   6 my $values = shift;
415 3         5 my $ok = 1;
416 3   33     20 $ok &&= m{^ [0-9a-f]+ $}x for @$values;
417 3         14 return $ok;
418             },
419 3     3 0 15 default => [ ],
420             helptext => "A (partial) commit SHA (repeatable!)",
421             );
422             }
423              
424             sub curlargs {
425 7     7 0 36 return $opt->new(
426             name => 'curlargs',
427             option => '=s@',
428             default => [ ],
429             helptext => "Extra switches to pass to curl (repeatable!)",
430             );
431             }
432              
433             sub curlbin {
434             return $opt->new(
435             name => 'curlbin',
436             option => '=s',
437             default => 'curl',
438             helptext => "The fqp for the curl program.",
439             configtext => "Which 'curl' binary do you want to use?",
440 0     0   0 configdft => sub { (_helper(whereis => ['curl'])->())->[0] },
441 7     7 0 68 configord => 3,
442             );
443             }
444              
445             sub ddir {
446             return $opt->new(
447             name => 'ddir',
448             option => 'd=s',
449             helptext => 'Directory where perl is smoked.',
450             configtext => "Where would you like the new source-tree?",
451             configtype => 'prompt_dir',
452             configdft => sub {
453 7     7   56 use File::Spec;
  7         30  
  7         3506  
454 0     0   0 File::Spec->catdir(File::Spec->rel2abs(File::Spec->updir), 'perl-current');
455             },
456 33     33 0 257 );
457             }
458              
459             sub defaultenv {
460             return $opt->new(
461             name => 'defaultenv',
462             option => '!',
463             default => 0,
464             helptext => "Do not set the test suite environment to locale.",
465             configtext => "Run the test suite without \$ENV{PERLIO}?",
466             configtype => 'prompt_yn',
467 0     0   0 configalt => sub { [qw/ N y /] },
468 0     0   0 configdft => sub {'n'},
469 13     13 0 113 );
470             }
471              
472             sub fdir { # mdir => fdir => ddir
473 5     5 0 22 return $opt->new(
474             name => 'fdir',
475             option => '=s',
476             helptext => "The local directory to build the hardlink Forest from.",
477             );
478             }
479              
480             sub from {
481             return $opt->new(
482             name => 'from',
483             option => '=s',
484             default => '',
485             allow => [ '', qr/@/ ],
486             helptext => 'Where to send the reports from.',
487             configtype => 'prompt',
488             configtext => 'This is the email address used to send FROM:',
489 0     0   0 configdft => sub {''},
490 22     22 0 340 );
491             }
492              
493             sub fsync { # How to sync the mdir for Forest.
494 0     0 0 0 my $s = sync_type();
495 0         0 $s->name('fsync');
496 0         0 return $s;
497             }
498              
499             sub force_c_locale {
500             return $opt->new(
501             name => 'force_c_locale',
502             default => 0,
503             helptext => "Run test suite under the C locale only.",
504             configtext => "Should \$ENV{LC_ALL} be forced to 'C'?",
505             configtype => 'prompt_yn',
506 0     0   0 configalt => sub { [qw/ N y /] },
507 0     0   0 configdft => sub {'n'},
508 7     7 0 60 );
509             }
510              
511             sub gitbin {
512             return $opt->new(
513             name => 'gitbin',
514             option => '=s',
515             default => 'git',
516             helptext => "The name of the 'git' program.",
517             configtext => "Which 'git' binary do you want to use?",
518             configtype => 'prompt_file',
519 0     0   0 configdft => sub { (_helper(whereis => ['git'])->())->[0] },
520 5     5 0 54 configord => 1,
521             );
522             }
523              
524             sub gitorigin {
525             return $opt->new(
526             name => 'gitorigin',
527             option => '=s',
528             default => 'https://github.com/Perl/perl5.git',
529             helptext => "The remote location of the git repository.",
530             configtext => "Where is your main Git repository?",
531 0     0   0 configalt => sub { [] },
532 5     5 0 41 configord => 2,
533             );
534             }
535              
536             sub gitdir {
537             return $opt->new(
538             name => 'gitdir',
539             option => '=s',
540             default => 'perl-from-github',
541             helptext => "The local directory of the git repository.",
542             configtext => "Where do I put the main Git repository?",
543             configtype => 'prompt_dir',
544 0     0   0 configalt => sub { [] },
545             configdft => sub {
546 7     7   73 use File::Spec;
  7         24  
  7         3175  
547 0     0   0 File::Spec->catfile(
548             File::Spec->rel2abs(File::Spec->updir),
549             'perl-from-github'
550             );
551             },
552 5     5 0 87 configord => 3,
553             );
554             }
555              
556             sub gitdfbranch {
557             return $opt->new(
558             name => 'gitdfbranch',
559             option => '=s',
560             default => 'blead',
561             helptext => "The name of the gitbranch you smoke.",
562             configtext => "Which branch should be smoked by default?",
563             configtype => 'prompt',
564 0     0   0 configalt => sub { [] },
565 5     5 0 55 configord => 4,
566             );
567             }
568              
569             sub gitbranchfile {
570             return $opt->new(
571             name => 'gitbranchfile',
572             option => '=s',
573             default => '',
574             helptext => "The name of the file where the gitbranch is stored.",
575             configtext => "File name to put branch name for smoking in?",
576             configtype => 'prompt_file',
577 0     0   0 configalt => sub { [] },
578 0     0   0 configdft => sub { my $self = shift; return $self->prefix . ".gitbranch" },
  0         0  
579 5     5 0 69 configfnex => 1,
580             configord => 5,
581             );
582             }
583              
584             sub harness_destruct {
585 0     0 0 0 return $opt->new(
586             name => 'harness_destruct',
587             option => 'harness-destruct=i',
588             default => 2,
589             helptext => "Sets \$ENV{PERL_DESTRUCT_LEVEL} for 'make test_harness'.",
590             );
591             }
592              
593             sub harness3opts {
594             return $opt->new(
595             name => 'harness3opts',
596             option => '=s',
597             default => '',
598             helptext => "Extra options to pass to harness v3+.",
599             configtext => "Extra options for Test::Harness 3
600             \tFor parellel testing use; 'j5'",
601 0     0   0 configdft => sub {''},
602 13     13 0 103 );
603             }
604              
605             sub harnessonly {
606             return $opt->new(
607             name => 'harnessonly',
608             option => '!',
609             default => 0,
610             helptext => "Run test suite as 'make test_harness' (not make test).",
611             configtext => "Use harness only (skip TEST)?",
612             configtype => 'prompt_yn',
613 0     0   0 configalt => sub { [qw/ y N /] },
614 0     0   0 configdft => sub {'n'},
615 13     13 0 138 );
616             }
617              
618             sub hasharness3 {
619 7     7 0 72 return $opt->new(
620             name => 'hasharness3',
621             option => '=i',
622             default => 1,
623             helptext => "Internal option for Test::Smoke::Smoker.",
624             );
625             }
626              
627             sub hdir { # hdir => ddir
628 0     0 0 0 return $opt->new(
629             name => 'hdir',
630             option => '=s',
631             helptext => "The local directory to hardlink from.",
632             );
633             }
634              
635             sub hostname {
636 7     7   2501 use System::Info;
  7         92327  
  7         22771  
637 6     6 0 52 my $hostname = System::Info::si_uname('n');
638 6         115429 return $opt->new(
639             name => 'hostname',
640             option => '=s',
641             deafult => undef,
642             helptext => 'Use the hostname option to override System::Info->hostname',
643             configtext => "Use this option to override the default hostname.
644             \tLeave empty for default ($hostname)",
645             );
646             }
647              
648             sub is56x {
649 13     13 0 79 return $opt->new(
650             name => 'is56x',
651             option => '!',
652             helptext => "Are we smoking perl maint-5.6?",
653             );
654             }
655              
656             sub is_vms {
657 7     7 0 111 return $opt->new(
658             name => 'is_vms',
659             default => ($^O eq 'VMS'),
660             helptext => "Internal, shows we're on VMS",
661             );
662             }
663              
664             sub is_win32 {
665 7     7 0 44 return $opt->new(
666             name => 'is_win32',
667             default => ($^O eq 'MSWin32'),
668             helptext => "Internal, shows we're on MSWin32",
669             );
670             }
671              
672             sub jsnfile {
673 24     24 0 119 return $opt->new(
674             name => 'jsnfile',
675             option => '=s',
676             default => 'mktest.jsn',
677             helptext => 'Name of the file to store the JSON report in.',
678             );
679             }
680              
681             sub jsonreport {
682 3     3 0 16 return $opt->new(
683             name => 'jsonreport',
684             option => '=s',
685             default => undef,
686             helptext => "Name of json report file to re-post to the server"
687             . " (Takes precedence over '--adir' and '--sha')",
688             );
689             }
690              
691             sub killtime {
692             return $opt->new(
693             name => 'killtime',
694             option => '=s',
695             default => '',
696             allow => [undef, '', qr/^\+?[0-9]{1,2}:[0-9]{2}$/],
697             helptext => "The absolute or relative time the smoke may run.",
698             configtext => <<"EOT",
699             Should this smoke be aborted on/after a specific time?
700             \tuse HH:MM to specify a point in time (24 hour notation)
701             \tuse +HH:MM to specify a duration
702             \tleave empty to finish the smoke without aborting
703             EOT
704 0     0   0 configdft => sub { "" },
705 7     7 0 99 );
706             }
707              
708             sub lfile {
709 10     10 0 52 return $opt->new(
710             name => 'lfile',
711             option => '=s',
712             default => '',
713             helptext => 'Name of the file to store the smoke log in.',
714             );
715             }
716              
717             sub locale {
718 13     13 0 116 return $opt->new(
719             name => 'locale',
720             option => '=s',
721             default => '',
722             allow => [undef, '', qr{utf-?8$}i],
723             helptext => "Choose a locale to run the test suite under.",
724             configtext => "What locale should be used for extra testing?
725             \t(Leave empty for none)",
726             );
727             }
728              
729             sub mail {
730             return $opt->new(
731             name => 'mail',
732             option => '!',
733             allow => [ 0, 1 ],
734             default => 0,
735             helptext => "Send report via mail.",
736             configtext => 'The existence of the mailing-list is not guarenteed',
737             configtype => 'prompt_yn',
738 0     0   0 configalt => sub { [qw/ y N /] },
739 0     0   0 configdft => sub {'n'},
740 4     4 0 66 );
741             }
742              
743             sub mail_type {
744             my $mail_type = $opt->new(
745             name => 'mail_type',
746             option => 'mailer=s',
747             allow => [qw/sendmail mail mailx sendemail Mail::Sendmail MIME::Lite/],
748             default => 'Mail::Sendmail',
749             helptext => "The type of mailsystem to use.",
750             configalt => _helper('get_avail_mailers'),
751 0     0   0 configdft => sub { (_helper('get_avail_mailers')->())[0] },
752 8     8 0 90 );
753             }
754              
755             sub mailbin {
756             return $opt->new(
757             name => 'mailbin',
758             option => '=s',
759             default => 'mail',
760             helptext => "The name of the 'mail' program.",
761             configtext => 'The fully qualified name of the executable.',
762 0     0   0 configdft => sub { (_helper(whereis => ['mail'])->())->[0] },
763 4     4 0 52 );
764             }
765              
766             sub mailxbin {
767             return $opt->new(
768             name => 'mailxbin',
769             option => '=s',
770             default => 'mailx',
771             helptext => "The name of the 'mailx' program.",
772             configtext => 'The fully qualified name of the executable.',
773 0     0   0 configdft => sub { (_helper(whereis => ['mailx'])->())->[0] },
774 4     4 0 51 );
775             }
776              
777             sub makeopt {
778 7     7 0 95 require Config;
779             return $opt->new(
780             name => 'makeopt',
781             option => '=s',
782             default => '',
783             helptext => "Extra option to pass to make.",
784             configtext => "Specify extra arguments for '$Config::Config{make}'\n"
785             . "\t(for the 'build' and 'test_prep' steps)",
786 0     0   0 configdft => sub { '' },
787 7         447 );
788             }
789              
790             sub max_reports {
791 3     3 0 11 return $opt->new(
792             name => 'max_reports',
793             option => 'max-reports|max=i',
794             default => 10,
795             helptext => "Maximum number of reports to pick from",
796             );
797             }
798              
799             sub mdir { # mdir => fdir => ddir
800 0     0 0 0 return $opt->new(
801             name => 'mdir',
802             option => '=s',
803             helptext => "The master directory of the Hardlink-Forest.",
804             );
805             }
806              
807             sub minus_des {
808 0     0 0 0 return $opt->new(
809             name => 'des',
810             option => 'usedft',
811             helptext => "Use all the default values.",
812             );
813             }
814              
815             sub mspass {
816 8     8 0 28 return $opt->new(
817             name => 'mspass',
818             option => '=s',
819             helptext => 'Password for for SMTP server.',
820             configtext => "Type the password: 'noecho' but plain-text in config file!",
821             configtype => 'prompt_noecho',
822             );
823             }
824              
825             sub msport {
826 12     12 0 46 return $opt->new(
827             name => 'msport',
828             option => '=i',
829             default => 25,
830             helptext => 'Which port for SMTP server to send reports.',
831             configtext => "Some SMTP servers use port 465 or 587",
832             );
833             }
834              
835             sub msuser {
836 8     8 0 74 return $opt->new(
837             name => 'msuser',
838             option => '=s',
839             default => undef,
840             allow => [ undef, '', qr/\w+/ ],
841             helptext => 'Username for SMTP server.',
842             configtext => "This is the username for logging into the SMTP server\n"
843             . " leave empty if you don't have to login",
844             );
845             }
846              
847             sub mserver {
848 12     12 0 50 return $opt->new(
849             name => 'mserver',
850             option => '=s',
851             default => 'localhost',
852             helptext => 'Which SMTP server to send reports.',
853             configtext => "SMTP server to use for sending reports",
854             );
855             }
856              
857             sub opt_continue {
858 7     7 0 64 return $opt->new(
859             name => 'continue',
860             option => '',
861             default => 0,
862             helptext => "Continue where last smoke left-off.",
863             );
864             }
865              
866             sub outfile {
867 20     20 0 4172 return $opt->new(
868             name => 'outfile',
869             option => '=s',
870             default => 'mktest.out',
871             helptext => 'Name of the file to store the raw smoke log in.',
872             );
873             }
874              
875             sub pass_option {
876             return $opt->new(
877             name => 'pass_option',
878             option => 'pass-option|p=s@',
879             default => [],
880             allow => sub {
881 7     7   32 my ($list) = @_;
882 7 50       35 return unless ref($list) eq 'ARRAY';
883 7         28 for my $to_pass (@$list) {
884 2 50       20 return unless $to_pass =~ m{^ - [DUA] .+ $}x;
885             }
886 7         31 return 1;
887             },
888 7     7 0 62 helptext => 'Pass these options to Configure.',
889             );
890             }
891              
892             sub patchlevel {
893 4     4 0 19 return $opt->new(
894             name => 'patchlevel',
895             option => '=s',
896             helptext => "State the 'patchlevel' of the source-tree (for --nosync).",
897             );
898             }
899              
900             sub perl_version {
901 0     0 0 0 return $opt->new(
902             name => 'perl_version',
903             option => '=s',
904             allow => qr{^ (?:blead | 5 [.] (?: [2][68] | [3-9][02468] ) [.] x+ ) $}x,
905             dft => 'blead',
906             );
907             }
908              
909             sub perl5lib {
910             return $opt->new(
911             name => 'perl5lib',
912             option => '=s',
913 0 0   0 0 0 dft => exists($ENV{PERL5LIB}) ? $ENV{PERL5LIB} : '',
914             helptext => "What value should be used for PERL5LIB in the jcl wrapper?\n",
915             configtext => "\$PERL5LIB will be set to this value during the smoke\n"
916             . "\t(Make empty, with single space, to not set it.)",
917             );
918             }
919              
920             sub perl5opt {
921             return $opt->new(
922             name => 'perl5opt',
923             option => '=s',
924 0 0   0 0 0 dft => exists($ENV{PERL5OPT}) ? $ENV{PERL5OPT} : '',
925             helptext => "What value should be used for PERL5OPT in the jcl wrapper?\n",
926             configtext => "\$PERL5OPT will be set to this value during the smoke\n"
927             . "\t(Make empty, with single space, to not set it.)",
928             );
929             }
930              
931             sub perlio_only {
932             return $opt->new(
933             name => 'perlio_only',
934             option => '!',
935             default => 0,
936             helptext => "Do not set the test suite environment to stdio.",
937             configtext => "Run the test suite without \$ENV{PERLIO}=='stdio'?",
938             configtype => 'prompt_yn',
939 0     0   0 configalt => sub { [qw/ N y /] },
940 0     0   0 configdft => sub {'n'},
941 13     13 0 165 );
942             }
943              
944             sub poster {
945             return $opt->new(
946             name => 'poster',
947             option => '=s',
948             allow => [qw/HTTP::Tiny LWP::UserAgent curl/],
949             default => 'HTTP::Tiny',
950             helptext => "The type of HTTP post system to use.",
951             configtext => "Which HTTP client do you want to use?",
952             configalt => _helper('get_avail_posters'),
953 0     0   0 configdft => sub { (_helper('get_avail_posters')->())[0] },
954 14     14 0 91 configord => 2,
955             );
956             }
957              
958             sub report {
959 19 100   19 0 85 my $default = @_ ? shift : 1;
960 19         75 return $opt->new(
961             name => 'report',
962             option => '!',
963             default => $default,
964             helptext => "Create the report/json files.",
965             );
966             }
967              
968             sub rptfile {
969 21     21 0 103 return $opt->new(
970             name => 'rptfile',
971             option => '=s',
972             default => 'mktest.rpt',
973             helptext => 'Name of the file to store the email report in.',
974             );
975             }
976              
977             sub rsyncbin {
978             return $opt->new(
979             name => 'rsync', #old name
980             option => '=s',
981             default => 'rsync', # you might want a path there
982             helptext => "The name of the 'rsync' programe.",
983             configtext => "Which 'rsync' binary do you want to use?",
984             configtype => 'prompt_file',
985 0     0   0 configdft => sub { (_helper(whereis => ['rsync'])->())->[0] },
986 5     5 0 52 configord => 1,
987             );
988             }
989              
990             sub rsyncsource {
991 5     5 0 32 return $opt->new(
992             name => 'source',
993             option => '=s',
994             default => 'dromedary.p5h.org:5872::perl-current',
995             helptext => "The remote location of the rsync archive.",
996             configtext => "Where would you like to rsync from?",
997             configtype => 'prompt',
998             configord => 2,
999             );
1000             }
1001              
1002             sub rsyncopts {
1003 5     5 0 38 return $opt->new(
1004             name => 'opts',
1005             option => '=s',
1006             default => '-az --delete',
1007             helptext => "Options to use for the 'rsync' program",
1008             configtext => "Which arguments should be used for rsync?",
1009             configtype => 'prompt',
1010             configord => 3,
1011             );
1012             }
1013              
1014             sub send_log {
1015 6     6 0 99 my $allow = [qw/ never on_fail always /];
1016             return $opt->new(
1017             name => 'send_log',
1018             option => '=s',
1019             default => 'on_fail',
1020             allow => $allow,
1021             helptext => "Send logfile to the CoreSmokeDB server.",
1022             configtext => "Do you want to send the logfile with the report?",
1023 0     0   0 configalt => sub {$allow},
1024 0     0   0 configdft => sub {'on_fail'},
1025 6         194 configord => 4,
1026             );
1027             }
1028              
1029             sub send_out {
1030 6     6 0 63 my $allow = [qw/ never on_fail always /];
1031             return $opt->new(
1032             name => 'send_out',
1033             option => '=s',
1034             default => 'never',
1035             allow => $allow,
1036             helptext => "Send out-file to the CoreSmokeDB server.",
1037             configtext => "Do you want to send the outfile with the report?",
1038 0     0   0 configalt => sub {$allow},
1039 0     0   0 configdft => sub {'never'},
1040 6         155 configord => 5,
1041             );
1042             }
1043              
1044             sub sendemailbin {
1045             return $opt->new(
1046             name => 'sendemailbin',
1047             option => '=s',
1048             default => 'sendemail',
1049             helptext => "The name of the 'sendemail' program.",
1050             configtext => 'The fully qualified name of the executable.',
1051 0     0   0 configdft => sub { (_helper(whereis => ['sendemail'])->())->[0] },
1052 4     4 0 38 );
1053             }
1054              
1055             sub sendmailbin {
1056             return $opt->new(
1057             name => 'sendmailbin',
1058             option => '=s',
1059             default => 'sendmail',
1060             helptext => "The name of the 'sendmail' program.",
1061             configtext => 'The fully qualified name of the executable.',
1062 0     0   0 configdft => sub { (_helper(whereis => ['sendmail'])->())->[0] },
1063 4     4 0 44 );
1064             }
1065              
1066             sub sendreport {
1067 4     4 0 20 return $opt->new(
1068             name => 'sendreport',
1069             option => '!',
1070             default => 1,
1071             helptext => "Send the report mail/CoreSmokeDB.",
1072             );
1073             }
1074              
1075             sub showcfg {
1076 6     6 0 36 return $opt->new(
1077             name => 'showcfg',
1078             option => '!',
1079             default => 0,
1080             helptext => "Show a complete overview of all build configurations.",
1081             );
1082             }
1083              
1084             sub skip_tests {
1085             return $opt->new(
1086             name => 'skip_tests',
1087             option => '=s',
1088             helptext => "Name of the file to store tests to skip.",
1089             configtext => "What file do you want to use to specify tests to skip.
1090             \t(Make empty for none)",
1091             configtype => 'prompt_file',
1092             configfnex => 1,
1093             configdft => sub {
1094 0     0   0 my $app = shift;
1095 0         0 $app->prefix . ".skiptests";
1096             },
1097 13     13 0 98 );
1098             }
1099              
1100             sub smartsmoke {
1101             return $opt->new(
1102             name => 'smartsmoke',
1103             option => '!',
1104             allow => [ 0, 1 ],
1105             default => 1,
1106             helptext => "Do not smoke when the source-tree did not change.",
1107             configtext => "Skip smoke unless patchlevel changed?",
1108             configtype => 'prompt_yn',
1109 0     0   0 configalt => sub { [qw/ Y n/] },
1110 0     0   0 configdft => sub {'y'},
1111 4     4 0 49 );
1112             }
1113              
1114             sub smokedb_url {
1115 10     10 0 24 my $default = 'https://perl5.test-smoke.org/report';
1116             return $opt->new(
1117             name => 'smokedb_url',
1118             option => '=s',
1119             default => $default,
1120             helptext => "The URL for sending reports to CoreSmokeDB.",
1121             configtext => "Where do I send the reports?",
1122 0     0   0 configdft => sub { $default },
1123 10         68 configord => 1,
1124             );
1125             }
1126              
1127             sub sync {
1128 4     4 0 24 return $opt->new(
1129             name => 'sync',
1130             option => 'fetch!',
1131             default => 1,
1132             helptext => "Synchronize the source-tree before smoking.",
1133             );
1134             }
1135              
1136             sub sync_type {
1137 5     5 0 51 return $opt->new(
1138             name => 'sync_type',
1139             option => '=s',
1140             allow => [qw/git rsync copy/],
1141             default => 'git',
1142             helptext => 'The source tree sync method.',
1143             configtext => 'How would you like to sync the perl-source?',
1144             configtype => 'prompt',
1145             configalt => _helper( get_avail_sync => [ ]),
1146             );
1147             }
1148              
1149             sub swbcc {
1150 4     4 0 23 return $opt->new(
1151             name => 'swbcc',
1152             option => '=s',
1153             default => '-b',
1154             helptext => 'The syntax of the commandline switch for BCC.',
1155             );
1156             }
1157              
1158             sub swcc {
1159 4     4 0 18 return $opt->new(
1160             name => 'swcc',
1161             option => '=s',
1162             default => '-c',
1163             helptext => 'The syntax of the commandline switch for CC.',
1164             );
1165             }
1166              
1167             sub testmake { # This was an Alan Burlison request.
1168 7     7 0 47 require Config;
1169             return $opt->new(
1170             name => 'testmake',
1171             option => '=s',
1172             default => undef,
1173             helptext => "A different make program for 'make _test'.",
1174             configtext => "Specify a different make binary for 'make _test'?",
1175             configdft => sub {
1176 0 0   0   0 $Config::Config{make} ? $Config::Config{make} : 'make'
1177             },
1178 7         64 );
1179             }
1180              
1181             sub to {
1182 4     4 0 19 my $mailing_list = 'daily-build-reports@perl.org';
1183             return $opt->new(
1184             name => 'to',
1185             option => '=s',
1186             default => $mailing_list,
1187             allow => [qr/@/],
1188             helptext => 'Where to send the reports to.',
1189             configtype => 'prompt',
1190             configtext => 'This is the email address used to send TO:',
1191 0     0   0 configdft => sub {$mailing_list},
1192 4         51 );
1193             }
1194              
1195             sub ua_timeout {
1196             return $opt->new(
1197             name => 'ua_timeout',
1198             option => '=i',
1199             default => 30,
1200             allow => qr/^[1-9][0-9]{0,5}$/,
1201             helptext => "The timeout to set the LWP::UserAgent.",
1202             configtext => "What should the timeout for the useragent be?",
1203 0     0   0 configdft => sub {30},
1204 21     21 0 172 configord => 3,
1205             );
1206             }
1207              
1208             sub un_file {
1209             return $opt->new(
1210             name => 'un_file',
1211             option => '=s',
1212             helptext => "Name of the file with the 'user_note' text.",
1213             configtext => "In which file will you store your personal notes?
1214             \t(Leave empty for none.)",
1215             configtype => 'prompt_file',
1216             configfnex => 1,
1217             configdft => sub {
1218 0     0   0 my $app = shift;
1219 0         0 return $app->prefix . '.usernote';
1220             },
1221 6     6 0 136 );
1222             }
1223              
1224             sub un_position {
1225             return $opt->new(
1226             name => 'un_position',
1227             option => '=s',
1228             allow => ['top', 'bottom'],
1229             default => 'bottom',
1230             helptext => "Position of the 'user_note' in the smoke report.",
1231             configtext => "Where do you want your personal notes in the report?",
1232 0     0   0 configalt => sub { [qw/top bottom/] },
1233 0     0   0 configdft => sub {'bottom'},
1234 6     6 0 183 );
1235             }
1236              
1237             sub user_note {
1238 6     6 0 59 return $opt->new(
1239             name => 'user_note',
1240             option => '=s',
1241             helptext => "Extra text to insert into the smoke report.",
1242             );
1243             }
1244              
1245             sub v {
1246             return $opt->new(
1247             name => 'v',
1248             option => ':1',
1249             default => 1,
1250             allow => [0, 1, 2],
1251             helptext => "Log-level during smoke",
1252             configtext => "How verbose do you want the output?",
1253 0     0   0 configalt => sub { [0, 1, 2] },
1254 0     0 0 0 );
1255             }
1256              
1257             sub vmsmake {
1258 0     0 0 0 return $opt->new(
1259             name => 'vmsmake',
1260             option => '=s',
1261             default => 'MMK',
1262             helptext => "The make program on VMS.",
1263             )
1264             }
1265              
1266             sub w32args {
1267 7     7 0 80 return $opt->new(
1268             name => 'w32args',
1269             option => '=s@',
1270             default => [],
1271             helptext => "Extra options to pass to W32Configure.",
1272             )
1273             }
1274              
1275             sub w32cc {
1276 7     7 0 34 return $opt->new(
1277             name => 'w32cc',
1278             option => '=s',
1279             helptext => "The compiler on MSWin32.",
1280             );
1281             }
1282              
1283             sub w32make {
1284 7     7 0 50 return $opt->new(
1285             name => 'w32make',
1286             option => '=s',
1287             default => 'gmake',
1288             helptext => "The make program on MSWin32.",
1289             );
1290             }
1291              
1292             sub _helper {
1293 27     27   106 my ($helper, $args) = @_;
1294              
1295             return sub {
1296 0     0     require Test::Smoke::Util::FindHelpers;
1297 0           my $run_helper = Test::Smoke::Util::FindHelpers->can($helper);
1298 0           my @values;
1299 0 0         if ($helper =~ m{(?:mailers)}) {
1300 0           my %helpers = $run_helper->(@$args);
1301 0           @values = sort keys %helpers;
1302             }
1303             else {
1304 0           @values = $run_helper->( @$args );
1305             }
1306              
1307 0           return [ @values ];
1308             }
1309 27         376 }
1310              
1311             1;
1312              
1313             =head1 COPYRIGHT
1314              
1315             (c) 2002-2013, Abe Timmerman All rights reserved.
1316              
1317             With contributions from Jarkko Hietaniemi, Merijn Brand, Campo
1318             Weijerman, Alan Burlison, Allen Smith, Alain Barbet, Dominic Dunlop,
1319             Rich Rauenzahn, David Cantrell.
1320              
1321             This library is free software; you can redistribute it and/or modify
1322             it under the same terms as Perl itself.
1323              
1324             See:
1325              
1326             =over 4
1327              
1328             =item * L
1329              
1330             =item * L
1331              
1332             =back
1333              
1334             This program is distributed in the hope that it will be useful,
1335             but WITHOUT ANY WARRANTY; without even the implied warranty of
1336             MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1337              
1338             =cut