mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2025-02-23 08:09:53 -05:00
refactor: check for latest release
DRYs up the code for checking latest release from github.
This commit is contained in:
parent
493324ce1b
commit
4b09ffd4df
@ -29,6 +29,7 @@ use swap::asb::config::{
|
|||||||
initial_setup, query_user_for_initial_config, read_config, Config, ConfigNotInitialized,
|
initial_setup, query_user_for_initial_config, read_config, Config, ConfigNotInitialized,
|
||||||
};
|
};
|
||||||
use swap::asb::{cancel, punish, redeem, refund, safely_abort, EventLoop, Finality, KrakenRate};
|
use swap::asb::{cancel, punish, redeem, refund, safely_abort, EventLoop, Finality, KrakenRate};
|
||||||
|
use swap::common::check_latest_version;
|
||||||
use swap::database::open_db;
|
use swap::database::open_db;
|
||||||
use swap::monero::Amount;
|
use swap::monero::Amount;
|
||||||
use swap::network::rendezvous::XmrBtcNamespace;
|
use swap::network::rendezvous::XmrBtcNamespace;
|
||||||
@ -68,6 +69,10 @@ async fn main() -> Result<()> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if let Err(e) = check_latest_version(env!("CARGO_PKG_VERSION")).await {
|
||||||
|
eprintln!("{}", e);
|
||||||
|
}
|
||||||
|
|
||||||
asb::tracing::init(LevelFilter::DEBUG, json, !disable_timestamp).expect("initialize tracing");
|
asb::tracing::init(LevelFilter::DEBUG, json, !disable_timestamp).expect("initialize tracing");
|
||||||
|
|
||||||
let config = match read_config(config_path.clone())? {
|
let config = match read_config(config_path.clone())? {
|
||||||
|
@ -26,6 +26,7 @@ use std::time::Duration;
|
|||||||
use swap::bitcoin::TxLock;
|
use swap::bitcoin::TxLock;
|
||||||
use swap::cli::command::{parse_args_and_apply_defaults, Arguments, Command, ParseResult};
|
use swap::cli::command::{parse_args_and_apply_defaults, Arguments, Command, ParseResult};
|
||||||
use swap::cli::{list_sellers, EventLoop, SellerStatus};
|
use swap::cli::{list_sellers, EventLoop, SellerStatus};
|
||||||
|
use swap::common::check_latest_version;
|
||||||
use swap::database::open_db;
|
use swap::database::open_db;
|
||||||
use swap::env::Config;
|
use swap::env::Config;
|
||||||
use swap::libp2p_ext::MultiAddrExt;
|
use swap::libp2p_ext::MultiAddrExt;
|
||||||
@ -54,6 +55,10 @@ async fn main() -> Result<()> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if let Err(e) = check_latest_version(env!("CARGO_PKG_VERSION")).await {
|
||||||
|
eprintln!("{}", e);
|
||||||
|
}
|
||||||
|
|
||||||
match cmd {
|
match cmd {
|
||||||
Command::BuyXmr {
|
Command::BuyXmr {
|
||||||
seller,
|
seller,
|
||||||
@ -69,11 +74,6 @@ async fn main() -> Result<()> {
|
|||||||
|
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let db = open_db(data_dir.join("sqlite")).await?;
|
let db = open_db(data_dir.join("sqlite")).await?;
|
||||||
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
.context("Failed to read in seed file")?;
|
.context("Failed to read in seed file")?;
|
||||||
@ -164,11 +164,6 @@ async fn main() -> Result<()> {
|
|||||||
Command::History => {
|
Command::History => {
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let db = open_db(data_dir.join("sqlite")).await?;
|
let db = open_db(data_dir.join("sqlite")).await?;
|
||||||
let swaps = db.all().await?;
|
let swaps = db.all().await?;
|
||||||
|
|
||||||
@ -193,11 +188,6 @@ async fn main() -> Result<()> {
|
|||||||
Command::Config => {
|
Command::Config => {
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
tracing::info!(path=%data_dir.display(), "Data directory");
|
tracing::info!(path=%data_dir.display(), "Data directory");
|
||||||
tracing::info!(path=%format!("{}/logs", data_dir.display()), "Log files directory");
|
tracing::info!(path=%format!("{}/logs", data_dir.display()), "Log files directory");
|
||||||
tracing::info!(path=%format!("{}/sqlite", data_dir.display()), "Sqlite file location");
|
tracing::info!(path=%format!("{}/sqlite", data_dir.display()), "Sqlite file location");
|
||||||
@ -213,11 +203,6 @@ async fn main() -> Result<()> {
|
|||||||
} => {
|
} => {
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
.context("Failed to read in seed file")?;
|
.context("Failed to read in seed file")?;
|
||||||
let bitcoin_wallet = init_bitcoin_wallet(
|
let bitcoin_wallet = init_bitcoin_wallet(
|
||||||
@ -252,11 +237,6 @@ async fn main() -> Result<()> {
|
|||||||
} => {
|
} => {
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
.context("Failed to read in seed file")?;
|
.context("Failed to read in seed file")?;
|
||||||
let bitcoin_wallet = init_bitcoin_wallet(
|
let bitcoin_wallet = init_bitcoin_wallet(
|
||||||
@ -284,11 +264,6 @@ async fn main() -> Result<()> {
|
|||||||
} => {
|
} => {
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let db = open_db(data_dir.join("sqlite")).await?;
|
let db = open_db(data_dir.join("sqlite")).await?;
|
||||||
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
.context("Failed to read in seed file")?;
|
.context("Failed to read in seed file")?;
|
||||||
@ -356,11 +331,6 @@ async fn main() -> Result<()> {
|
|||||||
} => {
|
} => {
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let db = open_db(data_dir.join("sqlite")).await?;
|
let db = open_db(data_dir.join("sqlite")).await?;
|
||||||
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
.context("Failed to read in seed file")?;
|
.context("Failed to read in seed file")?;
|
||||||
@ -384,11 +354,6 @@ async fn main() -> Result<()> {
|
|||||||
} => {
|
} => {
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let db = open_db(data_dir.join("sqlite")).await?;
|
let db = open_db(data_dir.join("sqlite")).await?;
|
||||||
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
.context("Failed to read in seed file")?;
|
.context("Failed to read in seed file")?;
|
||||||
@ -414,10 +379,6 @@ async fn main() -> Result<()> {
|
|||||||
.context("Rendezvous node address must contain peer ID")?;
|
.context("Rendezvous node address must contain peer ID")?;
|
||||||
|
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
.context("Failed to read in seed file")?;
|
.context("Failed to read in seed file")?;
|
||||||
@ -499,11 +460,6 @@ async fn main() -> Result<()> {
|
|||||||
} => {
|
} => {
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), None)?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
let seed = Seed::from_file_or_generate(data_dir.as_path())
|
||||||
.context("Failed to read in seed file")?;
|
.context("Failed to read in seed file")?;
|
||||||
let bitcoin_wallet = init_bitcoin_wallet(
|
let bitcoin_wallet = init_bitcoin_wallet(
|
||||||
@ -520,11 +476,6 @@ async fn main() -> Result<()> {
|
|||||||
Command::MoneroRecovery { swap_id } => {
|
Command::MoneroRecovery { swap_id } => {
|
||||||
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?;
|
||||||
|
|
||||||
match check_latest_version().await {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(error) => tracing::error!("{}", error),
|
|
||||||
};
|
|
||||||
|
|
||||||
let db = open_db(data_dir.join("sqlite")).await?;
|
let db = open_db(data_dir.join("sqlite")).await?;
|
||||||
|
|
||||||
let swap_state: BobState = db.get_state(swap_id).await?.try_into()?;
|
let swap_state: BobState = db.get_state(swap_id).await?.try_into()?;
|
||||||
@ -717,43 +668,10 @@ where
|
|||||||
Ok((btc_swap_amount, fees))
|
Ok((btc_swap_amount, fees))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn check_latest_version() -> Result<()> {
|
|
||||||
const GITHUB_LATEST_VERSION_URL: &str =
|
|
||||||
"https://github.com/comit-network/xmr-btc-swap/releases/latest";
|
|
||||||
|
|
||||||
let response = match reqwest::get(GITHUB_LATEST_VERSION_URL).await {
|
|
||||||
Ok(res) => res,
|
|
||||||
Err(_) => bail!(
|
|
||||||
"could not request the website {}",
|
|
||||||
GITHUB_LATEST_VERSION_URL
|
|
||||||
),
|
|
||||||
};
|
|
||||||
|
|
||||||
let last_version_from_url: &str = match response.url().path_segments() {
|
|
||||||
Some(split_segments) => match split_segments.last() {
|
|
||||||
Some(seg) => seg,
|
|
||||||
None => bail!("could not check the latest version"),
|
|
||||||
},
|
|
||||||
None => bail!("could not check the latest version"),
|
|
||||||
};
|
|
||||||
|
|
||||||
let version_from_binary: &str = env!("CARGO_PKG_VERSION");
|
|
||||||
|
|
||||||
if last_version_from_url != version_from_binary {
|
|
||||||
tracing::warn!(
|
|
||||||
"You are not on the lastest version {}, it's available on Github: {}",
|
|
||||||
last_version_from_url,
|
|
||||||
GITHUB_LATEST_VERSION_URL
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::{check_latest_version, determine_btc_to_swap};
|
use crate::determine_btc_to_swap;
|
||||||
use ::bitcoin::Amount;
|
use ::bitcoin::Amount;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
use swap::tracing_ext::capture_logs;
|
use swap::tracing_ext::capture_logs;
|
||||||
@ -1130,13 +1048,4 @@ mod tests {
|
|||||||
async fn get_dummy_address() -> Result<bitcoin::Address> {
|
async fn get_dummy_address() -> Result<bitcoin::Address> {
|
||||||
Ok("1PdfytjS7C8wwd9Lq5o4x9aXA2YRqaCpH6".parse()?)
|
Ok("1PdfytjS7C8wwd9Lq5o4x9aXA2YRqaCpH6".parse()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
|
||||||
async fn check_correct_latest_version() {
|
|
||||||
let writer = capture_logs(LevelFilter::INFO);
|
|
||||||
|
|
||||||
check_latest_version().await.unwrap();
|
|
||||||
|
|
||||||
assert_eq!(writer.captured(), r"");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
57
swap/src/common.rs
Normal file
57
swap/src/common.rs
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
use anyhow::anyhow;
|
||||||
|
|
||||||
|
const LATEST_RELEASE_URL: &str = "https://github.com/comit-network/xmr-btc-swap/releases/latest";
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
|
pub enum Version {
|
||||||
|
Current,
|
||||||
|
Available,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check the latest release from GitHub API.
|
||||||
|
pub async fn check_latest_version(current: &str) -> anyhow::Result<Version> {
|
||||||
|
let response = reqwest::get(LATEST_RELEASE_URL).await?;
|
||||||
|
let e = "Failed to get latest release.";
|
||||||
|
let url = response.url();
|
||||||
|
let segments = url.path_segments().ok_or_else(|| anyhow!(e))?;
|
||||||
|
let latest = segments.last().ok_or_else(|| anyhow!(e))?;
|
||||||
|
|
||||||
|
let result = if is_latest_version(current, latest) {
|
||||||
|
Version::Current
|
||||||
|
} else {
|
||||||
|
println!(
|
||||||
|
"You are not on the latest version: {} is available. \n{}",
|
||||||
|
latest, url
|
||||||
|
);
|
||||||
|
Version::Available
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo: naive implementation can be improved using semver
|
||||||
|
fn is_latest_version(current: &str, latest: &str) -> bool {
|
||||||
|
current == latest
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn it_compares_versions() {
|
||||||
|
assert!(is_latest_version("0.10.2", "0.10.2"));
|
||||||
|
assert!(!is_latest_version("0.10.2", "0.10.3"));
|
||||||
|
assert!(!is_latest_version("0.10.2", "0.11.0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[ignore = "For local testing, makes http requests to github."]
|
||||||
|
async fn it_compares_with_github() {
|
||||||
|
let result = check_latest_version("0.10.1").await.unwrap();
|
||||||
|
assert_eq!(result, Version::Available);
|
||||||
|
|
||||||
|
let result = check_latest_version("0.10.2").await.unwrap();
|
||||||
|
assert_eq!(result, Version::Current);
|
||||||
|
}
|
||||||
|
}
|
@ -19,6 +19,7 @@
|
|||||||
pub mod asb;
|
pub mod asb;
|
||||||
pub mod bitcoin;
|
pub mod bitcoin;
|
||||||
pub mod cli;
|
pub mod cli;
|
||||||
|
pub mod common;
|
||||||
pub mod database;
|
pub mod database;
|
||||||
pub mod env;
|
pub mod env;
|
||||||
pub mod fs;
|
pub mod fs;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user