Skip to content

Commit d060a21

Browse files
Added loading bar when upgrading
1 parent 3330cde commit d060a21

File tree

5 files changed

+71
-10
lines changed

5 files changed

+71
-10
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog for Ferium
22

3+
## `v3.28.5`
4+
### 11.05.2022
5+
6+
- Added a progress bar that looks very cool when upgrading
7+
- Not that you can see it for that long anyways :P
8+
39
## `v3.28.4`
410
### 11.05.2022
511

Cargo.lock

Lines changed: 20 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ferium"
3-
version = "3.28.4"
3+
version = "3.28.5"
44
edition = "2021"
55
authors = ["Ilesh Thiada (theRookieCoder) <[email protected]>", "薛詠謙 (KyleUltimate)", "Daniel Hauck (SolidTux)"]
66
description = "Ferium is a CLI program for managing Minecraft mods from Modrinth, CurseForge, and Github Releases"
@@ -28,8 +28,9 @@ octocrab = { version = "0.16", default-features = false, features = ["rustls"] }
2828
clap = { version = "3.1", features = ["derive"] }
2929
lazy_static = "1.4"
3030
dialoguer = "0.10"
31-
serde_json = "1.0"
31+
indicatif = "0.16"
3232
itertools = "0.10"
33+
serde_json = "1.0"
3334
fs_extra = "1.2"
3435
colored = "2.0"
3536
ferinth = "2.2"

src/main.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use cli::{Ferium, ProfileSubCommands, SubCommands};
88
use colored::{ColoredString, Colorize};
99
use ferinth::Ferinth;
1010
use furse::Furse;
11+
use indicatif::ProgressStyle;
1112
use lazy_static::lazy_static;
1213
use libium::config;
1314
use octocrab::OctocrabBuilder;
@@ -21,6 +22,9 @@ lazy_static! {
2122
pub static ref YELLOW_TICK: ColoredString = "✓".yellow();
2223
pub static ref THEME: dialoguer::theme::ColorfulTheme =
2324
dialoguer::theme::ColorfulTheme::default();
25+
pub static ref STYLE: ProgressStyle = ProgressStyle::default_bar()
26+
.template("{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {pos}/{len}")
27+
.progress_chars("#>-");
2428
}
2529

2630
fn main() {

src/subcommands/upgrade.rs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
use crate::{mutex_ext::MutexExt, CROSS, TICK, YELLOW_TICK};
1+
use crate::{mutex_ext::MutexExt, CROSS, STYLE, TICK, YELLOW_TICK};
22
use anyhow::{bail, Error, Result};
33
use colored::Colorize;
44
use ferinth::Ferinth;
55
use fs_extra::file::{move_file, CopyOptions};
66
use furse::Furse;
7+
use indicatif::ProgressBar;
78
use itertools::Itertools;
89
use libium::{check, config, upgrade};
910
use octocrab::Octocrab;
@@ -28,14 +29,21 @@ pub async fn upgrade(
2829
) -> Result<()> {
2930
let profile = Arc::new(profile.clone());
3031
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+
));
3135
let backwards_compat_msg = Arc::new(AtomicBool::new(false));
3236
let error = Arc::new(AtomicBool::new(false));
3337
let mut tasks = Vec::new();
3438

3539
println!("{}\n", "Determining the Latest Compatible Versions".bold());
40+
{
41+
progress_bar.force_lock().enable_steady_tick(100);
42+
}
3643
for mod_ in &profile.mods {
3744
let backwards_compat_msg = backwards_compat_msg.clone();
3845
let to_download = to_download.clone();
46+
let progress_bar = progress_bar.clone();
3947
let curseforge = curseforge.clone();
4048
let modrinth = modrinth.clone();
4149
let profile = profile.clone();
@@ -52,9 +60,10 @@ pub async fn upgrade(
5260
&profile.mod_loader,
5361
)
5462
.await;
63+
let progress_bar = progress_bar.force_lock();
5564
match result {
5665
Ok((downloadable, backwards_compat)) => {
57-
println!(
66+
progress_bar.println(format!(
5867
"{} {:45} {}",
5968
if backwards_compat {
6069
backwards_compat_msg.store(true, Ordering::Relaxed);
@@ -64,7 +73,7 @@ pub async fn upgrade(
6473
},
6574
mod_.name,
6675
format!("({})", downloadable.filename).dimmed()
67-
);
76+
));
6877
{
6978
let mut to_download = to_download.force_lock();
7079
to_download.push(downloadable);
@@ -74,18 +83,27 @@ pub async fn upgrade(
7483
if let upgrade::Error::ModrinthError(ferinth::Error::RateLimitExceeded(_)) = err
7584
{
7685
// Immediately fail if there is a rate limit
86+
progress_bar.finish_and_clear();
7787
bail!(err);
7888
}
79-
eprintln!("{}", format!("{} {:45} {}", CROSS, mod_.name, err).red());
89+
progress_bar.println(format!(
90+
"{}",
91+
format!("{} {:45} {}", CROSS, mod_.name, err).red()
92+
));
8093
error.store(true, Ordering::Relaxed);
8194
},
8295
}
96+
progress_bar.inc(1);
8397
Ok(())
8498
}));
8599
}
86100
for handle in tasks {
87101
handle.await??;
88102
}
103+
Arc::try_unwrap(progress_bar)
104+
.expect("Failed to run threads to completion")
105+
.into_inner()?
106+
.finish_and_clear();
89107
let mut to_download = Arc::try_unwrap(to_download)
90108
.expect("Failed to run threads to completion")
91109
.into_inner()?;
@@ -137,10 +155,17 @@ pub async fn upgrade(
137155
println!("\n{}", "All up to date!".bold());
138156
} else {
139157
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+
}
140164
let mut tasks = Vec::new();
141165
for downloadable in to_download {
142-
let profile = profile.clone();
166+
let progress_bar = progress_bar.clone();
143167
let downloadable = downloadable.clone();
168+
let profile = profile.clone();
144169
tasks.push(spawn(async move {
145170
let contents = reqwest::get(&downloadable.download_url)
146171
.await?
@@ -149,18 +174,24 @@ pub async fn upgrade(
149174
let size = Size::Bytes(contents.len());
150175
check::write_mod_file(&profile.output_dir, contents, &downloadable.filename)
151176
.await?;
152-
println!(
177+
let progress_bar = progress_bar.force_lock();
178+
progress_bar.println(format!(
153179
"{} Downloaded {:7} {}",
154180
&*TICK,
155181
size.to_string(Base::Base10, Style::Smart),
156182
downloadable.filename.dimmed(),
157-
);
183+
));
184+
progress_bar.inc(1);
158185
Ok::<(), Error>(())
159186
}));
160187
}
161188
for handle in tasks {
162189
handle.await??;
163190
}
191+
Arc::try_unwrap(progress_bar)
192+
.expect("Failed to run threads to completion")
193+
.into_inner()?
194+
.finish_and_clear();
164195
for installable in to_install {
165196
eprint!(
166197
"Installing {}... ",

0 commit comments

Comments
 (0)