From 4e887c3429d522edc008e8c7e6771e85ffbff7a0 Mon Sep 17 00:00:00 2001 From: veeso Date: Sun, 28 Feb 2021 12:33:12 +0100 Subject: [PATCH] Git: check for new updates (utils) --- Cargo.lock | 195 +++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/utils/git.rs | 87 +++++++++++++++++++++ src/utils/mod.rs | 1 + 4 files changed, 284 insertions(+) create mode 100644 src/utils/git.rs diff --git a/Cargo.lock b/Cargo.lock index 29c8cf7..763c5d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -193,6 +193,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "chunked_transfer" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" + [[package]] name = "cipher" version = "0.2.5" @@ -433,6 +439,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + [[package]] name = "ftp4" version = "4.0.2" @@ -535,6 +551,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "idna" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "instant" version = "0.1.9" @@ -544,6 +571,12 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "itoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" + [[package]] name = "js-sys" version = "0.3.46" @@ -654,6 +687,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + [[package]] name = "md-5" version = "0.9.1" @@ -891,6 +930,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + [[package]] name = "pkg-config" version = "0.3.19" @@ -1055,6 +1100,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + [[package]] name = "rpassword" version = "5.0.1" @@ -1077,6 +1137,25 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rustls" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064fd21ff87c6e87ed4506e68beb42459caa4a0e2eb144932e6776768556980b" +dependencies = [ + "base64", + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + [[package]] name = "schannel" version = "0.1.19" @@ -1093,6 +1172,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sct" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "secret-service" version = "1.1.3" @@ -1175,6 +1264,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha2" version = "0.9.2" @@ -1231,6 +1331,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "ssh2" version = "0.9.0" @@ -1301,6 +1407,7 @@ dependencies = [ "toml", "tui", "unicode-width", + "ureq", "users", "whoami", ] @@ -1346,6 +1453,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "tinyvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + [[package]] name = "toml" version = "0.5.8" @@ -1374,6 +1496,24 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +dependencies = [ + "matches", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.7.1" @@ -1392,6 +1532,42 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "ureq" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585dcbf3483242f77b502864478ede62431baf3442b99367d3456ec20c1707b" +dependencies = [ + "base64", + "chunked_transfer", + "log", + "once_cell", + "rustls", + "serde", + "serde_json", + "url", + "webpki", + "webpki-roots", +] + +[[package]] +name = "url" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + [[package]] name = "users" version = "0.11.0" @@ -1490,6 +1666,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82015b7e0b8bad8185994674a13a93306bea76cf5a16c5a181382fd3a5ec2376" +dependencies = [ + "webpki", +] + [[package]] name = "which" version = "3.1.1" diff --git a/Cargo.toml b/Cargo.toml index 657817d..b639bc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ textwrap = "0.13.1" toml = "0.5.8" tui = { version = "0.14.0", features = ["crossterm"], default-features = false } unicode-width = "0.1.7" +ureq = { version = "2.0.2", features = ["json"] } whoami = "1.1.0" [target.'cfg(any(target_os = "unix", target_os = "macos", target_os = "linux"))'.dependencies] diff --git a/src/utils/git.rs b/src/utils/git.rs new file mode 100644 index 0000000..1221c91 --- /dev/null +++ b/src/utils/git.rs @@ -0,0 +1,87 @@ +//! ## git +//! +//! `git` is the module which provides utilities to interact through the GIT API and to perform some stuff at git level + +/* +* +* Copyright (C) 2020-2021 Christian Visintin - christian.visintin1997@gmail.com +* +* This file is part of "TermSCP" +* +* TermSCP is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* TermSCP is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with TermSCP. If not, see . +* +*/ + +// Deps +extern crate ureq; +// Locals +use super::parser::parse_semver; +// Others +use serde::Deserialize; + +#[derive(Deserialize)] +struct TagInfo { + tag_name: String, +} + +/// ### check_for_updates +/// +/// Check if there is a new version available for termscp. +/// This is performed through the Github API +/// In case of success returns Ok(Option), where the Option is Some(new_version); otherwise if no version is available, return None +/// In case of error returns Error with the error description + +pub fn check_for_updates(current_version: &str) -> Result, String> { + // Send request + let github_version: Result = match ureq::get("https://api.github.com/repos/veeso/termscp/releases/latest").call() { + Ok(response) => match response.into_json::() { + Ok(tag_info) => Ok(tag_info.tag_name.clone()), + Err(err) => Err(err.to_string()) + } + Err(err) => Err(err.to_string()) + }; + // Check version + match github_version { + Err(err) => Err(err), + Ok(version) => { + // Parse version + match parse_semver(version.as_str()) { + Some(new_version) => { + // Check if version is different + if new_version.as_str() > current_version { + Ok(Some(new_version)) // New version is available + } else { + Ok(None) // No new version + } + } + None => { + Err(String::from("Got bad response from Github")) + } + } + } + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[test] + fn test_utils_git_check_for_updates() { + assert!(check_for_updates("100.0.0").ok().unwrap().is_none()); + assert!(check_for_updates("0.0.1").ok().unwrap().is_some()); + } + +} \ No newline at end of file diff --git a/src/utils/mod.rs b/src/utils/mod.rs index ea844e7..68c96c3 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -26,5 +26,6 @@ // modules pub mod crypto; pub mod fmt; +pub mod git; pub mod parser; pub mod random;