diff options
Diffstat (limited to 'cli/tools/upgrade.rs')
-rw-r--r-- | cli/tools/upgrade.rs | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/cli/tools/upgrade.rs b/cli/tools/upgrade.rs index 1a2252d3d..f39823600 100644 --- a/cli/tools/upgrade.rs +++ b/cli/tools/upgrade.rs @@ -119,6 +119,14 @@ impl<TEnvironment: UpdateCheckerEnvironment> UpdateChecker<TEnvironment> { /// Returns the version if a new one is available and it should be prompted about. pub fn should_prompt(&self) -> Option<String> { let file = self.maybe_file.as_ref()?; + // If the current version saved is not the actualy current version of the binary + // It means + // - We already check for a new vesion today + // - The user have probably upgraded today + // So we should not prompt and wait for tomorrow for the latest version to be updated again + if file.current_version != self.env.current_version() { + return None; + } if file.latest_version == self.env.current_version() { return None; } @@ -220,6 +228,7 @@ async fn fetch_and_store_latest_version< .current_time() .sub(chrono::Duration::hours(UPGRADE_CHECK_INTERVAL + 1)), last_checked: env.current_time(), + current_version: env.current_version().to_string(), latest_version, } .serialize(), @@ -544,6 +553,7 @@ fn check_exe(exe_path: &Path) -> Result<(), AnyError> { struct CheckVersionFile { pub last_prompt: chrono::DateTime<chrono::Utc>, pub last_checked: chrono::DateTime<chrono::Utc>, + pub current_version: String, pub latest_version: String, } @@ -551,7 +561,7 @@ impl CheckVersionFile { pub fn parse(content: String) -> Option<Self> { let split_content = content.split('!').collect::<Vec<_>>(); - if split_content.len() != 3 { + if split_content.len() != 4 { return None; } @@ -559,6 +569,10 @@ impl CheckVersionFile { if latest_version.is_empty() { return None; } + let current_version = split_content[3].trim().to_owned(); + if current_version.is_empty() { + return None; + } let last_prompt = chrono::DateTime::parse_from_rfc3339(split_content[0]) .map(|dt| dt.with_timezone(&chrono::Utc)) @@ -570,16 +584,18 @@ impl CheckVersionFile { Some(CheckVersionFile { last_prompt, last_checked, + current_version, latest_version, }) } fn serialize(&self) -> String { format!( - "{}!{}!{}", + "{}!{}!{}!{}", self.last_prompt.to_rfc3339(), self.last_checked.to_rfc3339(), - self.latest_version + self.latest_version, + self.current_version, ) } @@ -602,7 +618,8 @@ mod test { #[test] fn test_parse_upgrade_check_file() { let file = CheckVersionFile::parse( - "2020-01-01T00:00:00+00:00!2020-01-01T00:00:00+00:00!1.2.3".to_string(), + "2020-01-01T00:00:00+00:00!2020-01-01T00:00:00+00:00!1.2.3!1.2.2" + .to_string(), ) .unwrap(); assert_eq!( @@ -614,6 +631,7 @@ mod test { "2020-01-01T00:00:00+00:00".to_string() ); assert_eq!(file.latest_version, "1.2.3".to_string()); + assert_eq!(file.current_version, "1.2.2".to_string()); let result = CheckVersionFile::parse("2020-01-01T00:00:00+00:00!".to_string()); @@ -638,10 +656,11 @@ mod test { .unwrap() .with_timezone(&chrono::Utc), latest_version: "1.2.3".to_string(), + current_version: "1.2.2".to_string(), }; assert_eq!( file.serialize(), - "2020-01-01T00:00:00+00:00!2020-01-01T00:00:00+00:00!1.2.3" + "2020-01-01T00:00:00+00:00!2020-01-01T00:00:00+00:00!1.2.3!1.2.2" ); } @@ -792,6 +811,7 @@ mod test { .sub(chrono::Duration::hours(UPGRADE_CHECK_INTERVAL + 1)), last_checked: env.current_time(), latest_version: "1.26.2".to_string(), + current_version: "1.27.0".to_string(), } .serialize(); env.write_check_file(&file_content); @@ -803,4 +823,23 @@ mod test { // propagation might be delated) we should not prompt assert_eq!(checker.should_prompt(), None); } + + #[tokio::test] + async fn test_should_not_prompt_if_current_cli_version_has_changed() { + let env = TestUpdateCheckerEnvironment::new(); + let file_content = CheckVersionFile { + last_prompt: env + .current_time() + .sub(chrono::Duration::hours(UPGRADE_CHECK_INTERVAL + 1)), + last_checked: env.current_time(), + latest_version: "1.26.2".to_string(), + current_version: "1.25.0".to_string(), + } + .serialize(); + env.write_check_file(&file_content); + // simulate an upgrade done to a canary version + env.set_current_version("61fbfabe440f1cfffa7b8d17426ffdece4d430d0"); + let checker = UpdateChecker::new(env); + assert_eq!(checker.should_prompt(), None); + } } |