dm_database_sqllog2db/cli/
update.rs1use crate::error::{Result, UpdateError};
2use log::{info, warn};
3use self_update::cargo_crate_version;
4
5pub fn handle_update(check: bool) -> Result<()> {
7 let current_version = cargo_crate_version!();
8 info!("Current version: {current_version}");
9
10 let status = self_update::backends::github::Update::configure()
11 .repo_owner("guangl")
12 .repo_name("sqllog2db")
13 .bin_name("sqllog2db")
14 .show_download_progress(true)
15 .current_version(current_version)
16 .build()
17 .map_err(|e| {
18 let err_msg = e.to_string();
19 if err_msg.contains("reqwest") || err_msg.contains("network") {
20 UpdateError::UpdateFailed("Network error or GitHub API unreachable. Please check your internet connection.".to_string())
21 } else {
22 UpdateError::UpdateFailed(err_msg)
23 }
24 })?;
25
26 if check {
27 let release = status.get_latest_release().map_err(|e| {
28 let err_msg = e.to_string();
29 if err_msg.contains("reqwest") || err_msg.contains("network") {
30 UpdateError::CheckFailed(
31 "Network error: Unable to connect to GitHub to check for updates.".to_string(),
32 )
33 } else {
34 UpdateError::CheckFailed(err_msg)
35 }
36 })?;
37 if self_update::version::bump_is_greater(current_version, &release.version).unwrap_or(false)
38 {
39 info!("New version available: {}", release.version);
40 info!("Run 'sqllog2db self-update' to update.");
41 } else {
42 info!("You are already using the latest version.");
43 }
44 return Ok(());
45 }
46
47 let release = status.update().map_err(|e| {
48 let err_msg = e.to_string();
49 if err_msg.contains("reqwest") || err_msg.contains("network") {
50 UpdateError::UpdateFailed(
51 "Network error during update. Please check your internet connection.".to_string(),
52 )
53 } else {
54 UpdateError::UpdateFailed(err_msg)
55 }
56 })?;
57 if release.updated() {
58 info!("Successfully updated to version: {}", release.version());
59 } else {
60 info!("You are already using the latest version.");
61 }
62
63 Ok(())
64}
65
66pub fn check_for_updates_at_startup() {
68 let current_version = cargo_crate_version!();
70
71 let status = self_update::backends::github::Update::configure()
72 .repo_owner("guangl")
73 .repo_name("sqllog2db")
74 .bin_name("sqllog2db")
75 .current_version(current_version)
76 .build();
77
78 if let Ok(status) = status {
79 if let Ok(release) = status.get_latest_release() {
80 if self_update::version::bump_is_greater(current_version, &release.version)
81 .unwrap_or(false)
82 {
83 warn!(
84 "A new version is available: {} (current: {})",
85 release.version, current_version
86 );
87 warn!("Run 'sqllog2db self-update' to update.");
88 }
89 }
90 }
91}