File Coverage

blib/lib/App/bif/OptArgs.pm
Criterion Covered Total %
statement 9 9 100.0
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 12 12 100.0


line stmt bran cond sub pod time code
1             package App::bif::OptArgs;
2              
3             our $VERSION = '0.1.5_7';
4              
5             package # do a little hiding
6             App::bif;
7 46     46   229954 use strict;
  46         91  
  46         1127  
8 46     46   225 use warnings;
  46         79  
  46         1124  
9 46     46   35009 use OptArgs;
  46         1537285  
  46         357  
10              
11             $OptArgs::COLOUR = 1;
12             $OptArgs::SORT = 1;
13              
14             arg command => (
15             isa => 'SubCmd',
16             required => 1,
17             comment => '',
18             fallback => {
19             name => 'alias',
20             isa => 'ArrayRef',
21             comment => 'run a command alias',
22             greedy => 1,
23             hidden => 1,
24             },
25             );
26              
27             opt help => (
28             isa => 'Bool',
29             alias => 'h',
30             ishelp => 1,
31             comment => 'print a full usage message and exit',
32             );
33              
34             opt debug => (
35             isa => 'Bool',
36             alias => 'D',
37             comment => 'turn on debugging',
38             hidden => 1,
39             );
40              
41             opt no_pager => (
42             isa => 'Bool',
43             comment => 'do not page output',
44             hidden => 1,
45             );
46              
47             opt no_color => (
48             isa => 'Bool',
49             comment => 'do not colorize output',
50             hidden => 1,
51             );
52              
53             opt user_repo => (
54             isa => 'Bool',
55             alias => 'c',
56             comment => 'use the user repository',
57             hidden => 1,
58             );
59              
60             # ------------------------------------------------------------------------
61             # bif check
62             # ------------------------------------------------------------------------
63             subcmd(
64             cmd => 'check',
65             hidden => 1,
66             comment => 'check all changeset UUIDs',
67             );
68              
69             opt verbose => (
70             isa => 'Bool',
71             alias => 'v',
72             comment => 'display YAML differences',
73             );
74              
75             # ------------------------------------------------------------------------
76             # bif init
77             # ------------------------------------------------------------------------
78             subcmd(
79             cmd => 'init',
80             comment => 'initialize a new repository',
81             );
82              
83             opt keep_invalid => (
84             isa => 'Bool',
85             comment => 'Keep invalid updates in the database',
86             hidden => 1,
87             );
88              
89             arg directory => (
90             isa => 'Str',
91             comment => 'hub location',
92             );
93              
94             opt debug_bifsync => (
95             isa => 'Bool',
96             alias => 'E',
97             comment => 'turn on bifsync debugging',
98             hidden => 1,
99             );
100              
101             # ------------------------------------------------------------------------
102             # bif new
103             # ------------------------------------------------------------------------
104             subcmd(
105             cmd => [qw/new/],
106             comment => 'create a new topic',
107             );
108              
109             arg item => (
110             isa => 'SubCmd',
111             required => 1,
112             comment => '',
113             fallback => {
114             name => 'type',
115             isa => 'ArrayRef',
116             comment => 'create a new topic of type TYPE',
117             greedy => 1,
118             },
119             );
120              
121             opt author => (
122             isa => 'Str',
123             comment => 'Author',
124             hidden => 1,
125             );
126              
127             opt bill => (
128             isa => 'Bool',
129             comment => 'Record work effort in the timesheet',
130             hidden => 1,
131             );
132              
133             opt email => (
134             isa => 'Str',
135             comment => 'Email',
136             hidden => 1,
137             );
138              
139             opt lang => (
140             isa => 'Str',
141             comment => 'Lang',
142             hidden => 1,
143             );
144              
145             opt locale => (
146             isa => 'Str',
147             comment => 'Locale',
148             hidden => 1,
149             );
150              
151             opt status => (
152             isa => 'Str',
153             alias => 's',
154             comment => 'State',
155             );
156              
157             opt message => (
158             isa => 'Str',
159             alias => 'm',
160             comment => 'Comment',
161             );
162              
163             # ------------------------------------------------------------------------
164             # bif new entity
165             # ------------------------------------------------------------------------
166             subcmd(
167             cmd => [qw/new entity/],
168             comment => 'create a new entity',
169             );
170              
171             arg name => (
172             isa => 'Str',
173             comment => 'The name of the entity',
174             );
175              
176             arg method => (
177             isa => 'Str',
178             comment => 'The contact type (email, phone, etc)',
179             );
180              
181             arg value => (
182             isa => 'Str',
183             comment => 'The contact value',
184             );
185              
186             # ------------------------------------------------------------------------
187             # new hub
188             # ------------------------------------------------------------------------
189             subcmd(
190             cmd => [qw/new hub/],
191             comment => 'create a new hub',
192             );
193              
194             arg name => (
195             isa => 'Str',
196             comment => 'name of organisation\'s hub',
197             );
198              
199             arg location => (
200             isa => 'Str',
201             comment => 'hub location',
202             );
203              
204             arg title => (
205             isa => 'Str',
206             greedy => 1,
207             comment => 'title of organisation\'s hub',
208             );
209              
210             opt default => (
211             isa => 'Bool',
212             comment => 'mark hub as local/default',
213             );
214              
215             # ------------------------------------------------------------------------
216             # bif new identity
217             # ------------------------------------------------------------------------
218             subcmd(
219             cmd => [qw/new identity/],
220             comment => 'create a new identity',
221             );
222              
223             arg name => (
224             isa => 'Str',
225             comment => 'The name of the identity',
226             );
227              
228             arg method => (
229             isa => 'Str',
230             comment => 'The contact type (email, phone, etc)',
231             );
232              
233             arg value => (
234             isa => 'Str',
235             comment => 'The contact value',
236             );
237              
238             opt self => (
239             isa => 'Bool',
240             comment => 'Create a "self" identity',
241             );
242              
243             opt shortname => (
244             isa => 'Str',
245             alias => 's',
246             comment => 'identity initials or short name',
247             );
248              
249             # ------------------------------------------------------------------------
250             # bif new project
251             # ------------------------------------------------------------------------
252             subcmd(
253             cmd => [qw/new project/],
254             comment => 'create a new project',
255             );
256              
257             arg path => (
258             isa => 'Str',
259             comment => 'The path of the project',
260             );
261              
262             arg title => (
263             isa => 'Str',
264             comment => 'A short description of the project',
265             greedy => 1,
266             );
267              
268             opt phase => (
269             isa => 'Str',
270             alias => 'p',
271             comment => 'Initial project phase (use instead of --status)',
272             );
273              
274             opt dup => (
275             isa => 'Str',
276             alias => 'd',
277             comment => 'project path to duplicate',
278             );
279              
280             opt issues => (
281             isa => 'Str',
282             alias => 'i',
283             default => '',
284             comment => 'fork, copy or move issues on --dup',
285             );
286              
287             opt tasks => (
288             isa => 'Str',
289             alias => 't',
290             default => '',
291             comment => 'copy or move tasks on --dup',
292             );
293              
294             # ------------------------------------------------------------------------
295             # bif new topic
296             # ------------------------------------------------------------------------
297             subcmd(
298             cmd => [qw/new topic/],
299             comment => 'define a topic of discussion',
300             );
301              
302             arg type => (
303             isa => 'Str',
304             comment => 'type of topic',
305             );
306              
307             arg title => (
308             isa => 'Str',
309             comment => 'summary of the topic description',
310             greedy => 1,
311             );
312              
313             opt project => (
314             isa => 'Str',
315             alias => 'p',
316             comment => 'path of the containing project',
317             );
318              
319             opt status => (
320             isa => 'Str',
321             alias => 's',
322             comment => 'Initial status for the topic',
323             );
324              
325             # ------------------------------------------------------------------------
326             # bif new repo
327             # ------------------------------------------------------------------------
328             subcmd(
329             cmd => [qw/new repo/],
330             comment => 'create an new empty repository',
331             );
332              
333             arg directory => (
334             isa => 'Str',
335             required => 1,
336             comment => 'location of repository',
337             );
338              
339             opt config => (
340             isa => 'Bool',
341             comment => 'Create a default repo config file',
342             );
343              
344             # ------------------------------------------------------------------------
345             # bif list
346             # ------------------------------------------------------------------------
347             subcmd(
348             cmd => [qw/list/],
349             comment => 'list topics in the repository',
350             );
351              
352             arg items => (
353             isa => 'SubCmd',
354             comment => '',
355             required => 1,
356             );
357              
358             # ------------------------------------------------------------------------
359             # bif list entities
360             # ------------------------------------------------------------------------
361             subcmd(
362             cmd => [qw/list entities/],
363             comment => 'list entities (contacts)',
364             );
365              
366             # ------------------------------------------------------------------------
367             # list functions
368             # ------------------------------------------------------------------------
369             subcmd(
370             cmd => [qw/list functions/],
371             hidden => 1,
372             comment => 'list database functions/tables',
373             );
374              
375             # ------------------------------------------------------------------------
376             # list hosts
377             # ------------------------------------------------------------------------
378             subcmd(
379             cmd => [qw/list hosts/],
380             comment => 'list provider host locations',
381             );
382              
383             # ------------------------------------------------------------------------
384             # list hubs
385             # ------------------------------------------------------------------------
386             subcmd(
387             cmd => [qw/list hubs/],
388             comment => 'list hubs and their locations',
389             );
390              
391             # ------------------------------------------------------------------------
392             # bif list identities
393             # ------------------------------------------------------------------------
394             subcmd(
395             cmd => [qw/list identities/],
396             comment => 'list identities (contacts)',
397             );
398              
399             # ------------------------------------------------------------------------
400             # list plans
401             # ------------------------------------------------------------------------
402             subcmd(
403             cmd => [qw/list plans/],
404             comment => 'list provider commercial offerings',
405             );
406              
407             # ------------------------------------------------------------------------
408             # bif list topics
409             # ------------------------------------------------------------------------
410             subcmd(
411             cmd => [qw/list topics/],
412             comment => 'list tasks and issues grouped by project',
413             );
414              
415             opt status => (
416             isa => 'ArrayRef',
417             alias => 's',
418             comment => 'limit topics to a specific status',
419             );
420              
421             opt project_status => (
422             isa => 'Str',
423             alias => 'P',
424             comment => 'limit projects by a particular project status',
425             );
426              
427             # ------------------------------------------------------------------------
428             # bif list project-status
429             # ------------------------------------------------------------------------
430             subcmd(
431             cmd => [qw/list project-status/],
432             comment => 'list valid status for projects',
433             );
434              
435             arg path => (
436             isa => 'Str',
437             comment => 'the path of a project',
438             required => 1,
439             );
440              
441             # ------------------------------------------------------------------------
442             # bif list projects
443             # ------------------------------------------------------------------------
444             subcmd(
445             cmd => [qw/list projects/],
446             comment => 'list projects with topic counts and progress',
447             );
448              
449             arg status => (
450             isa => 'ArrayRef',
451             greedy => 1,
452             comment => 'limit the list by status type(s)',
453             );
454              
455             opt local => (
456             isa => 'Bool',
457             alias => 'l',
458             comment => 'limit the list to projects that synchronise.',
459             );
460              
461             # ------------------------------------------------------------------------
462             # list providers
463             # ------------------------------------------------------------------------
464             subcmd(
465             cmd => [qw/list providers/],
466             comment => 'list registered providers',
467             );
468              
469             # ------------------------------------------------------------------------
470             # list tables
471             # ------------------------------------------------------------------------
472             subcmd(
473             cmd => [qw/list tables/],
474             hidden => 1,
475             comment => 'list database tables',
476             );
477              
478             # ------------------------------------------------------------------------
479             # bif list topic-types
480             # ------------------------------------------------------------------------
481             subcmd(
482             cmd => [qw/list topic-types/],
483             comment => 'list valid type and status for topics',
484             );
485              
486             arg project => (
487             isa => 'Str',
488             comment => 'the path of a project',
489             required => 1,
490             );
491              
492             # ------------------------------------------------------------------------
493             # bif show
494             # ------------------------------------------------------------------------
495             subcmd(
496             cmd => [qw/show/],
497             comment => "display a topic's current status",
498             );
499              
500             arg item => (
501             isa => 'SubCmd',
502             comment => '',
503             required => 1,
504             fallback => {
505             name => 'id',
506             isa => 'Str',
507             comment => 'topic ID or project PATH',
508             },
509             );
510              
511             opt log => (
512             isa => 'Bool',
513             comment => 'include bif-log output',
514             alias => 'l',
515             );
516              
517             opt full => (
518             isa => 'Bool',
519             comment => 'display a more verbose current status',
520             alias => 'f',
521             );
522              
523             opt uuid => (
524             isa => 'Bool',
525             alias => 'U',
526             comment => 'treat ID as a UUID',
527             );
528              
529             # ------------------------------------------------------------------------
530             # bif show entity
531             # ------------------------------------------------------------------------
532             subcmd(
533             cmd => [qw/show entity/],
534             comment => 'display full entity characteristics',
535             );
536              
537             arg id => (
538             isa => 'Int',
539             comment => 'entity ID',
540             required => 1,
541             );
542              
543             # ------------------------------------------------------------------------
544             # bif show identity
545             # ------------------------------------------------------------------------
546             subcmd(
547             cmd => [qw/show identity/],
548             comment => 'display full identity characteristics',
549             );
550              
551             arg id => (
552             isa => 'Int',
553             comment => 'identity ID',
554             required => 1,
555             );
556              
557             # ------------------------------------------------------------------------
558             # bif show hub
559             # ------------------------------------------------------------------------
560             subcmd(
561             cmd => [qw/show hub/],
562             comment => 'summarize the current status of a hub',
563             );
564              
565             arg name => (
566             isa => 'Str',
567             comment => 'hub name',
568             required => 1,
569             );
570              
571             # ------------------------------------------------------------------------
572             # show plan
573             # ------------------------------------------------------------------------
574             subcmd(
575             cmd => [qw/show plan/],
576             comment => 'show a provider plan',
577             );
578              
579             arg id => (
580             isa => 'Str',
581             required => 1,
582             comment => 'ID of provider plan',
583             );
584              
585             # ------------------------------------------------------------------------
586             # bif show project
587             # ------------------------------------------------------------------------
588             subcmd(
589             cmd => [qw/show project/],
590             comment => 'display current project status',
591             );
592              
593             arg path => (
594             isa => 'Str',
595             comment => 'a project PATH',
596             required => 1,
597             );
598              
599             # ------------------------------------------------------------------------
600             # bif show table
601             # ------------------------------------------------------------------------
602             subcmd(
603             cmd => [qw/show table/],
604             comment => 'summarize the current status of a table',
605             );
606              
607             arg name => (
608             isa => 'Str',
609             required => 1,
610             comment => 'table name',
611             );
612              
613             # ------------------------------------------------------------------------
614             # bif show topic
615             # ------------------------------------------------------------------------
616             subcmd(
617             cmd => [qw/show topic/],
618             comment => 'summarize the current status of a topic',
619             );
620              
621             arg id => (
622             isa => 'Int',
623             comment => 'topic ID',
624             required => 1,
625             );
626              
627             # ------------------------------------------------------------------------
628             # bif show timesheet
629             # ------------------------------------------------------------------------
630             subcmd(
631             cmd => [qw/show timesheet/],
632             comment => 'display time worked per project',
633             );
634              
635             arg date => (
636             isa => 'Str',
637             comment => 'timesheet start date',
638             );
639              
640             opt bill => (
641             isa => 'Bool',
642             alias => 'b',
643             comment => 'only show billable work',
644             );
645              
646             opt identity => (
647             isa => 'Str',
648             alias => 'i',
649             comment => 'alternative identity instead of self',
650             );
651              
652             opt number => (
653             isa => 'Int',
654             alias => 'n',
655             comment => 'number of timespans to generate',
656             );
657              
658             opt day => (
659             isa => 'Bool',
660             alias => 'd',
661             comment => 'generate a daily timesheet',
662             );
663              
664             opt week => (
665             isa => 'Bool',
666             alias => 'w',
667             comment => 'generate a weekly timesheet',
668             );
669              
670             opt month => (
671             isa => 'Bool',
672             alias => 'm',
673             comment => 'generate a monthly timesheet',
674             );
675              
676             opt year => (
677             isa => 'Bool',
678             alias => 'y',
679             comment => 'generate a yearly timesheet',
680             );
681              
682             opt rollup => (
683             isa => 'Bool',
684             alias => 'r',
685             comment => 'roll times up into parent project(s)',
686             );
687              
688             # ------------------------------------------------------------------------
689             # bif show change
690             # ------------------------------------------------------------------------
691             subcmd(
692             cmd => [qw/show change/],
693             comment => 'show an update as YAML',
694             );
695              
696             arg uid => (
697             isa => 'Str',
698             required => 1,
699             comment => 'the change cID',
700             );
701              
702             opt diff => (
703             isa => 'Bool',
704             alias => 'd',
705             comment => 'diff actual/expected values (devel only)',
706             );
707              
708             # ------------------------------------------------------------------------
709             # bif show version
710             # ------------------------------------------------------------------------
711             subcmd(
712             cmd => [qw/show version/],
713             comment => 'show version and build informationL',
714             );
715              
716             # ------------------------------------------------------------------------
717             # bif log
718             # ------------------------------------------------------------------------
719             subcmd(
720             cmd => [qw/log/],
721             comment => 'view comments and status history',
722             );
723              
724             arg item => (
725             isa => 'SubCmd',
726             comment => '',
727             fallback => {
728             name => 'id',
729             isa => 'Str',
730             comment => 'topic ID or project PATH',
731             },
732             );
733              
734             opt uuid => (
735             isa => 'Bool',
736             alias => 'U',
737             comment => 'treat arguments as if they are a UUIDs',
738             );
739              
740             opt format => (
741             isa => 'Str',
742             alias => 'f',
743             default => 'full',
744             comment => 'output format: full | short | custom:...',
745             );
746              
747             opt order => (
748             isa => 'Str',
749             alias => 'o',
750             default => 'time',
751             comment => 'output order: time | id | custom:...',
752             );
753              
754             opt short => (
755             isa => 'Bool',
756             alias => 's',
757             comment => 'equivalent to "--format short"',
758             );
759              
760             # ------------------------------------------------------------------------
761             # bif log identity
762             # ------------------------------------------------------------------------
763             subcmd(
764             cmd => [qw/log identity/],
765             comment => 'review history of an identity',
766             );
767              
768             arg id => (
769             isa => 'Str',
770             comment => 'identity ID',
771             required => 1,
772             );
773              
774             # ------------------------------------------------------------------------
775             # bif log entity
776             # ------------------------------------------------------------------------
777             subcmd(
778             cmd => [qw/log entity/],
779             comment => 'review history of an entity',
780             );
781              
782             arg id => (
783             isa => 'Str',
784             comment => 'entity ID',
785             required => 1,
786             );
787              
788             # ------------------------------------------------------------------------
789             # bif log hub
790             # ------------------------------------------------------------------------
791             subcmd(
792             cmd => [qw/log hub/],
793             comment => 'review history of a hub',
794             );
795              
796             arg name => (
797             isa => 'Str',
798             comment => 'hub name',
799             required => 1,
800             );
801              
802             # ------------------------------------------------------------------------
803             # bif log project
804             # ------------------------------------------------------------------------
805             subcmd(
806             cmd => [qw/log project/],
807             comment => 'review history of a project',
808             );
809              
810             arg path => (
811             isa => 'Str',
812             comment => 'project PATH or ID',
813             required => 1,
814             );
815              
816             # ------------------------------------------------------------------------
817             # bif log topic
818             # ------------------------------------------------------------------------
819             subcmd(
820             cmd => [qw/log topic/],
821             comment => 'review history of a topic',
822             );
823              
824             arg id => (
825             isa => 'Str',
826             comment => 'topic ID',
827             required => 1,
828             );
829              
830             # ------------------------------------------------------------------------
831             # bif update
832             # ------------------------------------------------------------------------
833             subcmd(
834             cmd => [qw/update/],
835             comment => 'comment on or modify a topic',
836             );
837              
838             arg id => (
839             isa => 'SubCmd',
840             required => 1,
841             comment => 'topic ID or project PATH',
842             fallback => {
843             name => 'id',
844             isa => 'Str',
845             comment => 'topic ID or project PATH',
846             },
847             );
848              
849             arg status => (
850             isa => 'Str',
851             comment => 'topic STATUS',
852             );
853              
854             opt uuid => (
855             isa => 'Bool',
856             alias => 'U',
857             comment => 'treat ID as a UUID',
858             );
859              
860             opt author => (
861             isa => 'Str',
862             comment => 'Author',
863             hidden => 1,
864             );
865              
866             opt lang => (
867             isa => 'Str',
868             comment => 'Lang',
869             hidden => 1,
870             );
871              
872             opt locale => (
873             isa => 'Str',
874             comment => 'Locale',
875             hidden => 1,
876             );
877              
878             opt message => (
879             isa => 'Str',
880             comment => 'Comment',
881             alias => 'm',
882             );
883              
884             opt reply => (
885             isa => 'Str',
886             comment => 'reply to a change cID',
887             alias => 'r',
888             );
889              
890             opt title => (
891             isa => 'Str',
892             alias => 't',
893             comment => 'Title'
894             );
895              
896             # ------------------------------------------------------------------------
897             # bif update identity
898             # ------------------------------------------------------------------------
899             subcmd(
900             cmd => [qw/update identity/],
901             comment => 'update an identity',
902             );
903              
904             arg id => (
905             isa => 'Int',
906             required => 1,
907             comment => 'identity ID',
908             );
909              
910             opt shortname => (
911             isa => 'Str',
912             alias => 's',
913             comment => 'identity initials or short name',
914             );
915              
916             # ------------------------------------------------------------------------
917             # bif update entity
918             # ------------------------------------------------------------------------
919             subcmd(
920             cmd => [qw/update entity/],
921             comment => 'update an entity',
922             );
923              
924             arg id => (
925             isa => 'Int',
926             required => 1,
927             comment => 'entity ID',
928             );
929              
930             # ------------------------------------------------------------------------
931             # bif update hub
932             # ------------------------------------------------------------------------
933             subcmd(
934             cmd => [qw/update hub/],
935             comment => 'update a hub',
936             );
937              
938             arg id => (
939             isa => 'Int',
940             required => 1,
941             comment => 'hub ID',
942             );
943              
944             opt name => (
945             isa => 'Str',
946             alias => 'n',
947             comment => 'hub name'
948             );
949              
950             opt title => (
951             isa => 'Str',
952             alias => 't',
953             comment => 'hub title'
954             );
955              
956             # ------------------------------------------------------------------------
957             # bif update project
958             # ------------------------------------------------------------------------
959             subcmd(
960             cmd => [qw/update project/],
961             comment => 'update an project',
962             );
963              
964             arg path => (
965             isa => 'Str',
966             required => 1,
967             comment => 'project path',
968             );
969              
970             arg status => (
971             isa => 'Str',
972             comment => 'topic status',
973             );
974              
975             opt title => (
976             isa => 'Str',
977             alias => 't',
978             comment => 'Title',
979             );
980              
981             # ------------------------------------------------------------------------
982             # bif update topic
983             # ------------------------------------------------------------------------
984             subcmd(
985             cmd => [qw/update topic/],
986             comment => 'update an topic',
987             );
988              
989             arg id => (
990             isa => 'Int',
991             required => 1,
992             comment => 'topic ID',
993             );
994              
995             arg status => (
996             isa => 'Str',
997             comment => 'topic status',
998             );
999              
1000             opt title => (
1001             isa => 'Str',
1002             alias => 't',
1003             comment => 'Title',
1004             );
1005              
1006             # ------------------------------------------------------------------------
1007             # bif drop
1008             # ------------------------------------------------------------------------
1009             subcmd(
1010             cmd => [qw/drop/],
1011             comment => 'remove an item from the database',
1012             hidden => 1,
1013             );
1014              
1015             arg item => (
1016             isa => 'SubCmd',
1017             required => 1,
1018             comment => 'topic ID or project PATH',
1019             );
1020              
1021             opt force => (
1022             isa => 'Bool',
1023             alias => 'f',
1024             comment => 'Do not ask for confirmation',
1025             );
1026              
1027             # ------------------------------------------------------------------------
1028             # bif drop hub
1029             # ------------------------------------------------------------------------
1030             subcmd(
1031             cmd => [qw/drop hub/],
1032             comment => 'remove a hub',
1033             );
1034              
1035             arg name => (
1036             isa => 'Str',
1037             required => 1,
1038             comment => 'hub name (TODO: or ID)',
1039             );
1040              
1041             # ------------------------------------------------------------------------
1042             # bif drop project
1043             # ------------------------------------------------------------------------
1044             subcmd(
1045             cmd => [qw/drop project/],
1046             comment => 'remove a project',
1047             );
1048              
1049             arg path => (
1050             isa => 'Str',
1051             required => 1,
1052             comment => 'project PATH or ID',
1053             );
1054              
1055             # ------------------------------------------------------------------------
1056             # bif drop topic
1057             # ------------------------------------------------------------------------
1058             subcmd(
1059             cmd => [qw/drop topic/],
1060             comment => 'remove a topic',
1061             );
1062              
1063             arg id => (
1064             isa => 'Int',
1065             required => 1,
1066             comment => 'topic ID',
1067             );
1068              
1069             # ------------------------------------------------------------------------
1070             # bif drop change
1071             # ------------------------------------------------------------------------
1072             subcmd(
1073             cmd => [qw/drop change/],
1074             comment => 'remove a change',
1075             );
1076              
1077             arg uid => (
1078             isa => 'Int',
1079             required => 1,
1080             comment => 'change cID',
1081             );
1082              
1083             # ------------------------------------------------------------------------
1084             # bif pull
1085             # ------------------------------------------------------------------------
1086             subcmd(
1087             cmd => [qw/pull/],
1088             comment => 'import topics from elsewhere',
1089             );
1090              
1091             arg item => (
1092             isa => 'SubCmd',
1093             comment => '',
1094             required => 1,
1095             );
1096              
1097             opt debug_bifsync => (
1098             isa => 'Bool',
1099             alias => 'E',
1100             hidden => 1,
1101             comment => 'turn on bifsync debugging',
1102             );
1103              
1104             # ------------------------------------------------------------------------
1105             # bif pull identity
1106             # ------------------------------------------------------------------------
1107              
1108             subcmd(
1109             cmd => [qw/pull identity/],
1110             comment => 'import an identity from a repository',
1111             );
1112              
1113             arg location => (
1114             isa => 'Str',
1115             required => 1,
1116             comment => 'location of identity repository',
1117             );
1118              
1119             # For the moment just handle self identities.
1120             #arg identity => (
1121             # isa => 'Str',
1122             # comment => 'location of identity repository',
1123             #);
1124              
1125             opt self => (
1126             isa => 'Bool',
1127             comment => 'register identity as "myself" after import',
1128             );
1129              
1130             # ------------------------------------------------------------------------
1131             # pull hub
1132             # ------------------------------------------------------------------------
1133              
1134             subcmd(
1135             cmd => [qw/pull hub/],
1136             comment => 'import project list from a hub repository',
1137             );
1138              
1139             arg location => (
1140             isa => 'Str',
1141             required => 1,
1142             comment => 'location of a remote repository',
1143             );
1144              
1145             # ------------------------------------------------------------------------
1146             # bif pull project
1147             # ------------------------------------------------------------------------
1148              
1149             subcmd(
1150             cmd => [qw/pull project/],
1151             comment => 'import projects from a hub',
1152             );
1153              
1154             arg path => (
1155             isa => 'Str',
1156             required => 1,
1157             comment => 'path(s) of the project(s) to be imported',
1158             );
1159              
1160             opt debug_bifsync => (
1161             isa => 'Bool',
1162             alias => 'E',
1163             comment => 'turn on bifsync debugging',
1164             hidden => 1,
1165             );
1166              
1167             opt hub => (
1168             isa => 'Str',
1169             comment => 'a specific hub to pull from',
1170             );
1171              
1172             # ------------------------------------------------------------------------
1173             # pull provider
1174             # ------------------------------------------------------------------------
1175             subcmd(
1176             cmd => [qw/pull provider/],
1177             comment => 'import plans from a provider',
1178             );
1179              
1180             arg location => (
1181             isa => 'Str',
1182             required => 1,
1183             comment => 'management location of provider',
1184             );
1185              
1186             # ------------------------------------------------------------------------
1187             # bif push
1188             # ------------------------------------------------------------------------
1189             subcmd(
1190             cmd => [qw/push/],
1191             comment => 'export topics to somewhere else',
1192             );
1193              
1194             arg id => (
1195             isa => 'SubCmd',
1196             required => 1,
1197             comment => 'topic ID or project PATH',
1198             fallback => {
1199             name => 'id',
1200             isa => 'Str',
1201             comment => 'topic ID or project PATH',
1202             },
1203             );
1204              
1205             arg destination => (
1206             isa => 'Str',
1207             required => 1,
1208             comment => 'target PATH or location',
1209             );
1210              
1211             opt message => (
1212             isa => 'Str',
1213             comment => 'optional comment for the associated change',
1214             alias => 'm',
1215             );
1216              
1217             # ------------------------------------------------------------------------
1218             # push hub
1219             # ------------------------------------------------------------------------
1220             subcmd(
1221             cmd => [qw/push hub/],
1222             comment => 'export a hub to a provider host',
1223             );
1224              
1225             arg name => (
1226             isa => 'Str',
1227             required => 1,
1228             comment => 'name of your organisation\'s hub',
1229             );
1230              
1231             arg hosts => (
1232             isa => 'ArrayRef',
1233             required => 1,
1234             greedy => 1,
1235             comment => 'provider host address(es)',
1236             );
1237              
1238             # ------------------------------------------------------------------------
1239             # bif push project
1240             # ------------------------------------------------------------------------
1241             subcmd(
1242             cmd => [qw/push project/],
1243             comment => 'export a project to a hub',
1244             );
1245              
1246             arg path => (
1247             isa => 'Str',
1248             required => 1,
1249             comment => 'path of the project to export',
1250             );
1251              
1252             arg hub => (
1253             isa => 'Str',
1254             required => 1,
1255             comment => 'destination location URI',
1256             );
1257              
1258             opt debug_bifsync => (
1259             isa => 'Bool',
1260             alias => 'E',
1261             comment => 'turn on bifsync debugging',
1262             hidden => 1,
1263             );
1264              
1265             # ------------------------------------------------------------------------
1266             # bif push topic
1267             # ------------------------------------------------------------------------
1268             subcmd(
1269             cmd => [qw/push topic/],
1270             comment => 'push a topic to another project',
1271             );
1272              
1273             arg id => (
1274             isa => 'Int',
1275             required => 1,
1276             comment => 'topic ID',
1277             );
1278              
1279             arg path => (
1280             isa => 'ArrayRef',
1281             required => 1,
1282             greedy => 1,
1283             comment => 'path(s) of the destination project(s)',
1284             );
1285              
1286             opt err_on_exists => (
1287             isa => 'Bool',
1288             comment => 'raise an error when topic exists at destination',
1289             hidden => 1,
1290             );
1291              
1292             # ------------------------------------------------------------------------
1293             # signup
1294             # ------------------------------------------------------------------------
1295             subcmd(
1296             cmd => [qw/signup/],
1297             comment => 'sign up with a hub provider',
1298             hidden => 1,
1299             );
1300              
1301             arg name => (
1302             isa => 'Str',
1303             required => 1,
1304             comment => 'hub name',
1305             );
1306              
1307             arg plan => (
1308             isa => 'Str',
1309             required => 1,
1310             comment => 'provider plan name',
1311             );
1312              
1313             opt debug_bs => (
1314             isa => 'Bool',
1315             alias => 'E',
1316             comment => 'turn on bifsync debugging',
1317             hidden => 1,
1318             );
1319              
1320             # ------------------------------------------------------------------------
1321             # bif sync
1322             # ------------------------------------------------------------------------
1323             subcmd(
1324             cmd => [qw/sync/],
1325             comment => 'exchange changes with a hub',
1326             );
1327              
1328             opt path => (
1329             isa => 'ArrayRef',
1330             alias => 'p',
1331             comment => 'limit sync to a particular project',
1332             );
1333              
1334             opt hub => (
1335             isa => 'ArrayRef',
1336             alias => 'H',
1337             comment => 'limit sync to a particular hub',
1338             );
1339              
1340             opt message => (
1341             isa => 'Str',
1342             alias => 'm',
1343             default => '',
1344             hidden => 1,
1345             comment => 'message for multiple test script changes / second ',
1346             );
1347              
1348             opt debug_bifsync => (
1349             isa => 'Bool',
1350             alias => 'E',
1351             comment => 'turn on bifsync debugging',
1352             hidden => 1,
1353             );
1354              
1355             # ------------------------------------------------------------------------
1356             # bif upgrade
1357             # ------------------------------------------------------------------------
1358             subcmd(
1359             cmd => [qw/upgrade/],
1360             comment => 'upgrade a repository',
1361             hidden => 1,
1362             );
1363              
1364             arg directory => (
1365             isa => 'Str',
1366             comment => 'location if this is a hub upgrade',
1367             );
1368              
1369             opt force => (
1370             isa => 'Bool',
1371             alias => 'f',
1372             comment => 'force an upgrade, even if to same version',
1373             );
1374              
1375             # ------------------------------------------------------------------------
1376             # bif sql
1377             # ------------------------------------------------------------------------
1378             subcmd(
1379             cmd => [qw/sql/],
1380             comment => 'run an SQL command against the database',
1381             hidden => 1,
1382             );
1383              
1384             arg statement => (
1385             isa => 'Str',
1386             comment => 'SQL statement text',
1387             greedy => 1,
1388             );
1389              
1390             opt noprint => (
1391             isa => 'Bool',
1392             comment => 'do not print output but return a data structure',
1393             alias => 'n',
1394             );
1395              
1396             opt test => (
1397             isa => 'Bool',
1398             comment => 'use Test::More::diag to output rows',
1399             alias => 't',
1400             );
1401              
1402             opt write => (
1403             isa => 'Bool',
1404             comment => 'run with a writeable database (default is read-only)',
1405             alias => 'w',
1406             );
1407              
1408             # ------------------------------------------------------------------------
1409             # wlog
1410             # ------------------------------------------------------------------------
1411             subcmd(
1412             cmd => [qw/wlog/],
1413             comment => 'review entries in the work buffer',
1414             );
1415              
1416             opt identity => (
1417             isa => 'Str',
1418             alias => 'i',
1419             comment => 'alternative identity instead of self',
1420             );
1421              
1422             opt long => (
1423             isa => 'Bool',
1424             alias => 'l',
1425             comment => 'print multiple-line email-style work entries',
1426             );
1427              
1428             # ------------------------------------------------------------------------
1429             # bif work
1430             # ------------------------------------------------------------------------
1431             subcmd(
1432             cmd => [qw/work/],
1433             comment => 'work on a topic',
1434             );
1435              
1436             arg id => (
1437             isa => 'Str',
1438             comment => 'topic ID or PATH to work on',
1439             );
1440              
1441             arg comment => (
1442             isa => 'Str',
1443             greedy => 1,
1444             comment => 'comment to record with this work',
1445             );
1446              
1447             opt at => (
1448             isa => 'Str',
1449             alias => 'a',
1450             default => sub {
1451             my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
1452             localtime(time);
1453             return sprintf(
1454             '%0.4d-%0.2d-%0.2d %0.2d:%0.2d:%0.2d',
1455             $year + 1900,
1456             $mon + 1, $mday, $hour, $min, $sec
1457             );
1458             },
1459             comment => 'start or stop time: [yyyy-mm-dd] hh:mm',
1460             );
1461              
1462             opt force => (
1463             isa => 'Bool',
1464             alias => 'f',
1465             comment => 'force work when working something else',
1466             );
1467              
1468             opt bill => (
1469             isa => 'Bool',
1470             alias => 'B',
1471             comment => 'do (or do not) record this work in timesheet',
1472             );
1473              
1474             1;
1475             __END__