@@ -4,6 +4,8 @@ use gitoxide_core as core;
4
4
use std:: io:: { stderr, stdout, Write } ;
5
5
use structopt:: StructOpt ;
6
6
7
+ use options:: * ;
8
+
7
9
mod options {
8
10
use std:: path:: PathBuf ;
9
11
use structopt:: { clap:: AppSettings , StructOpt } ;
@@ -17,6 +19,30 @@ mod options {
17
19
pub cmd : Subcommands ,
18
20
}
19
21
22
+ #[ derive( Debug ) ]
23
+ pub enum ProgressMode {
24
+ Stop ,
25
+ KeepRunning ,
26
+ }
27
+
28
+ impl ProgressMode {
29
+ fn variants ( ) -> & ' static [ & ' static str ] {
30
+ & [ "stop" , "keep-running" ]
31
+ }
32
+ }
33
+ impl std:: str:: FromStr for ProgressMode {
34
+ type Err = String ;
35
+
36
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
37
+ let s_lc = s. to_ascii_lowercase ( ) ;
38
+ Ok ( match s_lc. as_str ( ) {
39
+ "stop" => ProgressMode :: Stop ,
40
+ "keep-running" => ProgressMode :: KeepRunning ,
41
+ _ => return Err ( format ! ( "Invalid progress mode: {}" , s) ) ,
42
+ } )
43
+ }
44
+ }
45
+
20
46
#[ derive( Debug , StructOpt ) ]
21
47
pub enum Subcommands {
22
48
/// Verify the integrity of a pack or index file
@@ -31,8 +57,8 @@ mod options {
31
57
verbose : bool ,
32
58
33
59
/// if set, bring up a terminal user interface displaying progress visually
34
- #[ structopt( long, conflicts_with( "verbose" ) ) ]
35
- progress : bool ,
60
+ #[ structopt( long, conflicts_with( "verbose" ) , possible_values ( ProgressMode :: variants ( ) ) ) ]
61
+ progress : Option < ProgressMode > ,
36
62
37
63
/// The '.pack' or '.idx' file whose checksum to validate.
38
64
#[ structopt( parse( from_os_str) ) ]
@@ -44,24 +70,27 @@ mod options {
44
70
fn init_progress (
45
71
name : & str ,
46
72
verbose : bool ,
47
- progress : bool ,
73
+ progress : Option < ProgressMode > ,
48
74
) -> (
49
75
Option < JoinThreadOnDrop > ,
50
76
Option < progress:: Either < progress:: Log , prodash:: tree:: Item > > ,
51
77
) {
52
78
super :: init_env_logger ( verbose) ;
53
79
match ( verbose, progress) {
54
- ( false , false ) => ( None , None ) ,
55
- ( true , false ) => ( None , Some ( progress:: Either :: Left ( progress:: Log :: new ( name) ) ) ) ,
56
- ( true , true ) | ( false , true ) => {
80
+ ( false , None ) => ( None , None ) ,
81
+ ( true , None ) => ( None , Some ( progress:: Either :: Left ( progress:: Log :: new ( name) ) ) ) ,
82
+ ( true , Some ( mode ) ) | ( false , Some ( mode ) ) => {
57
83
let progress = prodash:: Tree :: new ( ) ;
58
84
let sub_progress = progress. add_child ( name) ;
59
85
let render_tui = prodash:: tui:: render (
60
86
progress,
61
87
prodash:: tui:: TuiOptions {
62
88
title : "gitoxide" . into ( ) ,
63
89
frames_per_second : 6.0 ,
64
- stop_if_empty_progress : true ,
90
+ stop_if_empty_progress : match mode {
91
+ ProgressMode :: KeepRunning => false ,
92
+ ProgressMode :: Stop => true ,
93
+ } ,
65
94
..Default :: default ( )
66
95
} ,
67
96
)
@@ -84,7 +113,6 @@ impl Drop for JoinThreadOnDrop {
84
113
}
85
114
86
115
pub fn main ( ) -> Result < ( ) > {
87
- use options:: * ;
88
116
let args = Args :: from_args ( ) ;
89
117
match args. cmd {
90
118
Subcommands :: VerifyPack {
0 commit comments