1
- use crate :: { mutex_ext:: MutexExt , CROSS , TICK , YELLOW_TICK } ;
1
+ use crate :: { mutex_ext:: MutexExt , CROSS , STYLE , TICK , YELLOW_TICK } ;
2
2
use anyhow:: { bail, Error , Result } ;
3
3
use colored:: Colorize ;
4
4
use ferinth:: Ferinth ;
5
5
use fs_extra:: file:: { move_file, CopyOptions } ;
6
6
use furse:: Furse ;
7
+ use indicatif:: ProgressBar ;
7
8
use itertools:: Itertools ;
8
9
use libium:: { check, config, upgrade} ;
9
10
use octocrab:: Octocrab ;
@@ -28,14 +29,21 @@ pub async fn upgrade(
28
29
) -> Result < ( ) > {
29
30
let profile = Arc :: new ( profile. clone ( ) ) ;
30
31
let to_download = Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ;
32
+ let progress_bar = Arc :: new ( Mutex :: new (
33
+ ProgressBar :: new ( profile. mods . len ( ) as u64 ) . with_style ( STYLE . clone ( ) ) ,
34
+ ) ) ;
31
35
let backwards_compat_msg = Arc :: new ( AtomicBool :: new ( false ) ) ;
32
36
let error = Arc :: new ( AtomicBool :: new ( false ) ) ;
33
37
let mut tasks = Vec :: new ( ) ;
34
38
35
39
println ! ( "{}\n " , "Determining the Latest Compatible Versions" . bold( ) ) ;
40
+ {
41
+ progress_bar. force_lock ( ) . enable_steady_tick ( 100 ) ;
42
+ }
36
43
for mod_ in & profile. mods {
37
44
let backwards_compat_msg = backwards_compat_msg. clone ( ) ;
38
45
let to_download = to_download. clone ( ) ;
46
+ let progress_bar = progress_bar. clone ( ) ;
39
47
let curseforge = curseforge. clone ( ) ;
40
48
let modrinth = modrinth. clone ( ) ;
41
49
let profile = profile. clone ( ) ;
@@ -52,9 +60,10 @@ pub async fn upgrade(
52
60
& profile. mod_loader ,
53
61
)
54
62
. await ;
63
+ let progress_bar = progress_bar. force_lock ( ) ;
55
64
match result {
56
65
Ok ( ( downloadable, backwards_compat) ) => {
57
- println ! (
66
+ progress_bar . println ( format ! (
58
67
"{} {:45} {}" ,
59
68
if backwards_compat {
60
69
backwards_compat_msg. store( true , Ordering :: Relaxed ) ;
@@ -64,7 +73,7 @@ pub async fn upgrade(
64
73
} ,
65
74
mod_. name,
66
75
format!( "({})" , downloadable. filename) . dimmed( )
67
- ) ;
76
+ ) ) ;
68
77
{
69
78
let mut to_download = to_download. force_lock ( ) ;
70
79
to_download. push ( downloadable) ;
@@ -74,18 +83,27 @@ pub async fn upgrade(
74
83
if let upgrade:: Error :: ModrinthError ( ferinth:: Error :: RateLimitExceeded ( _) ) = err
75
84
{
76
85
// Immediately fail if there is a rate limit
86
+ progress_bar. finish_and_clear ( ) ;
77
87
bail ! ( err) ;
78
88
}
79
- eprintln ! ( "{}" , format!( "{} {:45} {}" , CROSS , mod_. name, err) . red( ) ) ;
89
+ progress_bar. println ( format ! (
90
+ "{}" ,
91
+ format!( "{} {:45} {}" , CROSS , mod_. name, err) . red( )
92
+ ) ) ;
80
93
error. store ( true , Ordering :: Relaxed ) ;
81
94
} ,
82
95
}
96
+ progress_bar. inc ( 1 ) ;
83
97
Ok ( ( ) )
84
98
} ) ) ;
85
99
}
86
100
for handle in tasks {
87
101
handle. await ??;
88
102
}
103
+ Arc :: try_unwrap ( progress_bar)
104
+ . expect ( "Failed to run threads to completion" )
105
+ . into_inner ( ) ?
106
+ . finish_and_clear ( ) ;
89
107
let mut to_download = Arc :: try_unwrap ( to_download)
90
108
. expect ( "Failed to run threads to completion" )
91
109
. into_inner ( ) ?;
@@ -137,10 +155,17 @@ pub async fn upgrade(
137
155
println ! ( "\n {}" , "All up to date!" . bold( ) ) ;
138
156
} else {
139
157
println ! ( "\n {}\n " , "Downloading Mod Files" . bold( ) ) ;
158
+ let progress_bar = Arc :: new ( Mutex :: new (
159
+ ProgressBar :: new ( to_download. len ( ) as u64 ) . with_style ( STYLE . clone ( ) ) ,
160
+ ) ) ;
161
+ {
162
+ progress_bar. force_lock ( ) . enable_steady_tick ( 100 ) ;
163
+ }
140
164
let mut tasks = Vec :: new ( ) ;
141
165
for downloadable in to_download {
142
- let profile = profile . clone ( ) ;
166
+ let progress_bar = progress_bar . clone ( ) ;
143
167
let downloadable = downloadable. clone ( ) ;
168
+ let profile = profile. clone ( ) ;
144
169
tasks. push ( spawn ( async move {
145
170
let contents = reqwest:: get ( & downloadable. download_url )
146
171
. await ?
@@ -149,18 +174,24 @@ pub async fn upgrade(
149
174
let size = Size :: Bytes ( contents. len ( ) ) ;
150
175
check:: write_mod_file ( & profile. output_dir , contents, & downloadable. filename )
151
176
. await ?;
152
- println ! (
177
+ let progress_bar = progress_bar. force_lock ( ) ;
178
+ progress_bar. println ( format ! (
153
179
"{} Downloaded {:7} {}" ,
154
180
& * TICK ,
155
181
size. to_string( Base :: Base10 , Style :: Smart ) ,
156
182
downloadable. filename. dimmed( ) ,
157
- ) ;
183
+ ) ) ;
184
+ progress_bar. inc ( 1 ) ;
158
185
Ok :: < ( ) , Error > ( ( ) )
159
186
} ) ) ;
160
187
}
161
188
for handle in tasks {
162
189
handle. await ??;
163
190
}
191
+ Arc :: try_unwrap ( progress_bar)
192
+ . expect ( "Failed to run threads to completion" )
193
+ . into_inner ( ) ?
194
+ . finish_and_clear ( ) ;
164
195
for installable in to_install {
165
196
eprint ! (
166
197
"Installing {}... " ,
0 commit comments