From cefdd83d9403ad8b182136c4cd26e993e3407c49 Mon Sep 17 00:00:00 2001 From: "Dustin J. Mitchell" Date: Sun, 19 Dec 2021 21:04:00 +0000 Subject: [PATCH] Use the latest taskmap when modifying a task The previous logic duplicated the action of applying an operation to the TaskDb with a "manual" application to the Task's local TaskMap. This now uses the updated TaskMap fetched from the DB, which will help to incorporate any other concurrent DB updates. --- taskchampion/src/task/task.rs | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/taskchampion/src/task/task.rs b/taskchampion/src/task/task.rs index d38555e19..6cc3c5126 100644 --- a/taskchampion/src/task/task.rs +++ b/taskchampion/src/task/task.rs @@ -260,10 +260,10 @@ impl<'r> TaskMut<'r> { fn lastmod(&mut self) -> anyhow::Result<()> { if !self.updated_modified { let now = format!("{}", Utc::now().timestamp()); - self.replica - .update_task(self.task.uuid, "modified", Some(now.clone()))?; trace!("task {}: set property modified={:?}", self.task.uuid, now); - self.task.taskmap.insert(String::from("modified"), now); + self.task.taskmap = + self.replica + .update_task(self.task.uuid, "modified", Some(now.clone()))?; self.updated_modified = true; } Ok(()) @@ -276,16 +276,17 @@ impl<'r> TaskMut<'r> { ) -> anyhow::Result<()> { let property = property.into(); self.lastmod()?; - self.replica - .update_task(self.task.uuid, &property, value.as_ref())?; - if let Some(v) = value { + if let Some(ref v) = value { trace!("task {}: set property {}={:?}", self.task.uuid, property, v); - self.task.taskmap.insert(property, v); } else { trace!("task {}: remove property {}", self.task.uuid, property); - self.task.taskmap.remove(&property); } + + self.task.taskmap = self + .replica + .update_task(self.task.uuid, &property, value.as_ref())?; + Ok(()) } @@ -294,18 +295,7 @@ impl<'r> TaskMut<'r> { property: &str, value: Option>, ) -> anyhow::Result<()> { - self.lastmod()?; - if let Some(value) = value { - let ts = format!("{}", value.timestamp()); - self.replica - .update_task(self.task.uuid, property, Some(ts.clone()))?; - self.task.taskmap.insert(property.to_string(), ts); - } else { - self.replica - .update_task::<_, &str>(self.task.uuid, property, None)?; - self.task.taskmap.remove(property); - } - Ok(()) + self.set_string(property, value.map(|v| v.timestamp().to_string())) } /// Used by tests to ensure that updates are properly written