Browse Source

Add guard around saving: save only if changed

Samuel W. Flint 3 years ago
parent
commit
67fa547514
5 changed files with 86 additions and 21 deletions
  1. 13 3
      src/lib/action.rs
  2. 16 5
      src/lib/config.rs
  3. 14 3
      src/lib/group.rs
  4. 10 2
      src/lib/repository.rs
  5. 33 8
      src/lib/repotype.rs

+ 13 - 3
src/lib/action.rs

@@ -23,12 +23,16 @@ pub fn add(config: &mut Config, name: &String, description: &String, command: &S
         disabled: false
     };
     config.actions.insert(name.to_string(), action);
+    config.is_changed = true;
 }
 
 pub fn update_disabled(config: &mut Config, name: &String, value: bool) {
     let action = config.actions.get_mut(&name.to_string());
     match action {
-        Some(action) => action.disabled = value,
+        Some(action) => {
+            action.disabled = value;
+            config.is_changed = true;
+        },
         None => panic!("No known action named \"{}\".", name)
     }
 }
@@ -36,7 +40,10 @@ pub fn update_disabled(config: &mut Config, name: &String, value: bool) {
 pub fn update_description(config: &mut Config, name: &String, description: &String) {
     let action = config.actions.get_mut(&name.to_string());
     match action {
-        Some(action) => action.description = description.to_string(),
+        Some(action) => {
+            action.description = description.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known action named \"{}\".", name)
     }
 }
@@ -44,7 +51,10 @@ pub fn update_description(config: &mut Config, name: &String, description: &Stri
 pub fn update_command(config: &mut Config, name: &String, command: &String) {
     let action = config.actions.get_mut(&name.to_string());
     match action {
-        Some(action) => action.command = command.to_string(),
+        Some(action) => {
+            action.command = command.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known action named \"{}\".", name)
     }
 }

+ 16 - 5
src/lib/config.rs

@@ -28,6 +28,8 @@ use crate::lib::group::{
 
 #[derive(Serialize, Deserialize)]
 pub struct Config {
+    #[serde(skip)]
+    pub is_changed: bool,
     #[serde(rename(serialize = "repo_type", deserialize = "repo_type"), default)]
     pub repo_types: BTreeMap<String, RepoType>,
     #[serde(rename(serialize = "repository", deserialize = "repository"), default)]
@@ -58,6 +60,7 @@ pub fn read_configuration_file(filename: &PathBuf) -> Config {
     match text {
         Err(_) => {
             let config = Config {
+                is_changed: true,
                 repo_types: BTreeMap::new(),
                 repositories: BTreeMap::new(),
                 actions: BTreeMap::new(),
@@ -65,13 +68,21 @@ pub fn read_configuration_file(filename: &PathBuf) -> Config {
             };
             return config;
         },
-        Ok(s) => return toml::from_str(&s).unwrap()
+        Ok(s) => {
+            let mut config: Config = toml::from_str(&s).unwrap();
+            config.is_changed = false;
+            return config;
+        }
     }
 }
 
 pub fn write_configuration_file(filename: PathBuf, configuration: Config) -> std::io::Result<()> {
-    let toml = toml::to_string_pretty(&configuration).unwrap();
-    let mut file = File::create(filename)?;
-    file.write_all(toml.as_bytes())?;
-    Ok(())
+    if configuration.is_changed {
+        let toml = toml::to_string_pretty(&configuration).unwrap();
+        let mut file = File::create(filename)?;
+        file.write_all(toml.as_bytes())?;
+        Ok(())
+    } else {
+        Ok(())
+    }
 }

+ 14 - 3
src/lib/group.rs

@@ -20,31 +20,42 @@ pub fn add(config: &mut Config, name: &String) {
         members: Vec::new()
     };
     config.groups.insert(name.to_string(), group);
+    config.is_changed = true;
 }
 
 pub fn add_repo(config: &mut Config, name: &String, repo: &String) {
     match config.groups.get_mut(&name.to_string()) {
-        Some(group) => group.members.push(repo.to_string()),
+        Some(group) => {
+            group.members.push(repo.to_string());
+            config.is_changed = true;
+        },
         None => panic!("No known group named \"{}\".", name)
     }
 }
 
 pub fn add_action(config: &mut Config, name: &String, action: &String) {
     match config.groups.get_mut(&name.to_string()) {
-        Some(group) => group.actions_after.push(action.to_string()),
+        Some(group) => {
+            group.actions_after.push(action.to_string());
+            config.is_changed = true;
+        },
         None => panic!("No known group named \"{}\".", name)
     }
 }
 
 pub fn remove_repo(config: &mut Config, name: &String, repo: &String) {
     match config.groups.get_mut(&name.to_string()) {
-        Some(group) => group.members.retain(|r| r != repo),
+        Some(group) => {
+            group.members.retain(|r| r != repo);
+            config.is_changed = true;
+        }
         None => panic!("No known group named \"{}\".", name)
     }
 }
 
 pub fn remove_group(config: &mut Config, name: &String) {
     config.groups.remove(&name.to_string());
+    config.is_changed = true;
 }
 
 impl fmt::Display for Group {

+ 10 - 2
src/lib/repository.rs

@@ -35,12 +35,16 @@ pub fn register(config: &mut Config, name: &String, location: String, repo_type:
         options: options_map
     };
     config.repositories.insert(name.to_string(), repo);
+    config.is_changed = true;
 }
 
 pub fn update_disabled(config: &mut Config, name: &String, value: bool) {
     let repo = config.repositories.get_mut(&name.to_string());
     match repo {
-        Some(repo) => repo.disabled = value,
+        Some(repo) => {
+            repo.disabled = value;
+            config.is_changed = true;
+        },
         None => panic!("No known repository named \"{}\".", name)
     }
 }
@@ -48,7 +52,10 @@ pub fn update_disabled(config: &mut Config, name: &String, value: bool) {
 pub fn update_autocreate(config: &mut Config, name: &String, value: bool) {
     let repo = config.repositories.get_mut(&name.to_string());
     match repo {
-        Some(repo) => repo.auto_create = value,
+        Some(repo) => {
+            repo.auto_create = value;
+            config.is_changed = true;
+        }
         None => panic!("No known repository named \"{}\".", name)
     }
 }
@@ -59,6 +66,7 @@ pub fn update_options(config: &mut Config, name: &String, options_strings: Vec<S
         Some(repo) => for option in options_strings {
             let option_pair: Vec<&str> = option.split("=").collect();
             repo.options.insert(option_pair[0].to_string(), option_pair[1].to_string());
+            config.is_changed = true;
         }
         None => panic!("No known repository named \"{}\".", name)
     }

+ 33 - 8
src/lib/repotype.rs

@@ -38,60 +38,85 @@ pub fn add(config: &mut Config, name: &String, description: &String, create: &St
         post_outward: post_outward.to_string()
     };
     config.repo_types.insert(name.to_string(), repo_type);
+    config.is_changed = true;
 }
 
 pub fn update_description(config: &mut Config, name: &String, description: &String) {
     match config.repo_types.get_mut(&name.to_string()) {
-        Some(repo_type) => repo_type.description = description.to_string(),
+        Some(repo_type) => {
+            repo_type.description = description.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known repository type named \"{}\".", name)
     }
 }
 
 pub fn update_create(config: &mut Config, name: &String, create: &String) {
     match config.repo_types.get_mut(&name.to_string()) {
-        Some(repo_type) => repo_type.create = create.to_string(),
+        Some(repo_type) => {
+            repo_type.create = create.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known repository type named \"{}\".", name)
     }
 }
 
 pub fn update_inward(config: &mut Config, name: &String, inward: &String) {
     match config.repo_types.get_mut(&name.to_string()) {
-        Some(repo_type) => repo_type.inward = inward.to_string(),
+        Some(repo_type) => {
+            repo_type.inward = inward.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known repository type named \"{}\".", name)
     }
 }
 
 pub fn update_outward(config: &mut Config, name: &String, outward: &String) {
     match config.repo_types.get_mut(&name.to_string()) {
-        Some(repo_type) => repo_type.outward = outward.to_string(),
+        Some(repo_type) => {
+            repo_type.outward = outward.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known repository type named \"{}\".", name)
     }
 }
 
 pub fn update_status(config: &mut Config, name: &String, status: &String) {
     match config.repo_types.get_mut(&name.to_string()) {
-        Some(repo_type) => repo_type.status = status.to_string(),
+        Some(repo_type) => {
+            repo_type.status = status.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known repository type named \"{}\".", name)
     }
 }
 
 pub fn update_pre_inward(config: &mut Config, name: &String, pre_inward: &String) {
     match config.repo_types.get_mut(&name.to_string()) {
-        Some(repo_type) => repo_type.pre_inward = pre_inward.to_string(),
+        Some(repo_type) => {
+            repo_type.pre_inward = pre_inward.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known repository type named \"{}\".", name)
     }
 }
 
 pub fn update_post_inward(config: &mut Config, name: &String, post_inward: &String) {
     match config.repo_types.get_mut(&name.to_string()) {
-        Some(repo_type) => repo_type.post_inward = post_inward.to_string(),
+        Some(repo_type) => {
+            repo_type.post_inward = post_inward.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known repository type named \"{}\".", name)
     }
 }
 
 pub fn update_post_outward(config: &mut Config, name: &String, post_outward: &String) {
     match config.repo_types.get_mut(&name.to_string()) {
-        Some(repo_type) => repo_type.post_outward = post_outward.to_string(),
+        Some(repo_type) => {
+            repo_type.post_outward = post_outward.to_string();
+            config.is_changed = true;
+        },
         None => panic!("No known repository type named \"{}\".", name)
     }
 }