Skip to main content

dm_database_sqllog2db/cli/
update.rs

1use crate::error::{Result, UpdateError};
2use log::{info, warn};
3use self_update::cargo_crate_version;
4
5/// Handle the self-update command
6pub 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
66/// Check for updates at startup (silently if no update found)
67pub fn check_for_updates_at_startup() {
68    // We ignore all errors during startup check to not block the user
69    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}