qframe/storage/
update_notice.rs1use std::fs;
9use std::io;
10use std::path::Path;
11
12use super::{Family, SettingValue, Settings};
13
14pub(super) fn from_shared(settings: &Settings) -> bool {
16 settings.get::<bool>(Settings::UPDATE_NOTICE).unwrap_or(true)
17}
18
19impl Family {
20 #[must_use]
24 pub fn update_notice(&self) -> bool {
25 self.config_dir().is_some_and(|dir| self.update_notice_in(&dir))
26 }
27
28 #[must_use]
31 pub fn update_notice_in(&self, config_dir: &Path) -> bool {
32 let path = config_dir.join(super::family::file_name(self.id()));
33 !path.exists() || from_shared(&Settings::open(path))
34 }
35
36 pub fn set_update_notice(&self, on: bool) -> io::Result<()> {
45 match self.config_dir() {
46 Some(dir) => self.set_update_notice_in(&dir, on),
47 None => Err(io::Error::new(io::ErrorKind::NotFound, "no config directory found")),
48 }
49 }
50
51 pub fn set_update_notice_in(&self, config_dir: &Path, on: bool) -> io::Result<()> {
68 fs::create_dir_all(config_dir)?;
69 let _held = super::preferences::hold_folder(config_dir)?;
70 let shared = config_dir.join(super::family::file_name(self.id()));
71 super::preferences::rewrite(&shared, Settings::UPDATE_NOTICE, SettingValue::Bool(on), None)
72 }
73}
74
75#[cfg(test)]
76mod tests {
77 use crate::i18n::I18n;
78 use crate::storage::Family;
79
80 fn scratch(name: &str) -> std::path::PathBuf {
81 let dir = std::env::temp_dir().join(format!("quvyta-update-notice-{name}-{}", std::process::id()));
82 let _ = std::fs::remove_dir_all(&dir);
83 dir
84 }
85
86 #[test]
87 fn the_notice_is_on_until_the_family_turns_it_off_and_other_keys_stay() {
88 let dir = scratch("switch");
89 let family = Family::QUVYTA;
90 assert!(family.update_notice_in(&dir), "a family that never chose has it");
91 std::fs::create_dir_all(&dir).expect("folder");
92 std::fs::write(dir.join("quvyta.conf"), "theme = \"amber\"\n").expect("shared file");
93 assert!(family.update_notice_in(&dir), "a shared file without the key has it");
94 family.set_update_notice_in(&dir, false).expect("saved");
95 assert!(!family.update_notice_in(&dir));
96 assert!(!family.preferences_in(&dir, "code", &I18n::builtin()).update_notice(), "preferences read it too");
97 let text = std::fs::read_to_string(dir.join("quvyta.conf")).expect("read");
98 assert!(text.contains("theme = \"amber\"") && text.contains("update-notice = false"), "{text}");
99 family.set_update_notice_in(&dir, true).expect("saved");
100 assert!(family.preferences_in(&dir, "code", &I18n::builtin()).update_notice());
101 std::fs::remove_dir_all(dir).ok();
102 }
103}