persist delta of last snapshot and stage

master
Bel LaPointe 2025-12-01 17:03:56 -07:00
parent 97caaebc09
commit 700b2a22cc
1 changed files with 21 additions and 30 deletions

View File

@ -154,7 +154,7 @@ impl File {
} }
pub fn persist_unpersisted_stage(&self) -> Result<(), String> { pub fn persist_unpersisted_stage(&self) -> Result<(), String> {
let events = self.events()?; let old_snapshot = self.events()?.last_snapshot();
let stage_mod_time = std::fs::metadata(&self.file) let stage_mod_time = std::fs::metadata(&self.file)
.unwrap() .unwrap()
.modified() .modified()
@ -162,29 +162,12 @@ impl File {
.duration_since(std::time::UNIX_EPOCH) .duration_since(std::time::UNIX_EPOCH)
.unwrap() .unwrap()
.as_secs(); .as_secs();
let old_persisted: Vec<Delta> = events
.0
.iter()
.filter(|x| x.ts <= stage_mod_time)
.map(|x| x.clone())
.collect();
let old_events = Events(old_persisted);
eprintln!(
"stage_mod_time = {}, old events = {:?}",
stage_mod_time, old_events
);
let old_snapshot = old_events.snapshot()?;
eprintln!(
"self.persist_delta_at({:?}, {:?}",
old_snapshot,
self.stage().unwrap()
);
self.persist_delta_at(old_snapshot, self.stage()?, stage_mod_time) self.persist_delta_at(old_snapshot, self.stage()?, stage_mod_time)
//self.stage_persisted()
} }
pub fn stage_persisted(&self) -> Result<(), String> { pub fn stage_persisted(&self) -> Result<(), String> {
let persisted_as_snapshot = self.events()?.snapshot()?; let persisted_as_snapshot = self.events()?.snapshot()?;
self.append(Delta::snapshot(persisted_as_snapshot.clone()))?;
let plaintext = serde_yaml::to_string(&persisted_as_snapshot).unwrap(); let plaintext = serde_yaml::to_string(&persisted_as_snapshot).unwrap();
let mut f = std::fs::File::create(&self.file).expect("failed to open file for writing"); let mut f = std::fs::File::create(&self.file).expect("failed to open file for writing");
writeln!(f, "{}", plaintext).expect("failed to write"); writeln!(f, "{}", plaintext).expect("failed to write");
@ -198,9 +181,6 @@ impl File {
let stage = self.stage()?; let stage = self.stage()?;
eprintln!("persist delta...");
eprintln!(" persisted=before={:?}", &persisted);
eprintln!(" stage=aftere={:?}", &stage);
self.persist_delta(persisted, stage)?; self.persist_delta(persisted, stage)?;
Ok(()) Ok(())
} }
@ -364,12 +344,6 @@ mod test_file {
f.persist_stage().unwrap(); f.persist_stage().unwrap();
assert_eq!(6, f.events().unwrap().0.len()); assert_eq!(6, f.events().unwrap().0.len());
assert_eq!(0, f.stage().unwrap().len()); assert_eq!(0, f.stage().unwrap().len());
eprintln!("persist_stage | events | {:?}", f.events().unwrap().0);
eprintln!(
"persist_stage | events.snapshot | {:?}",
f.events().unwrap().snapshot()
);
eprintln!("persist_stage | stage | {:?}", f.stage().unwrap());
tests::file_contains(&d, "plain", "[]"); tests::file_contains(&d, "plain", "[]");
f.stage_persisted().unwrap(); f.stage_persisted().unwrap();
@ -536,9 +510,7 @@ mod test_file {
); );
assert_eq!(0, f.stage().unwrap().len(), "{:?}", f.stage()); assert_eq!(0, f.stage().unwrap().len(), "{:?}", f.stage());
eprintln!("0 | {:?}", f.stage().unwrap());
f.persist_stage().unwrap(); f.persist_stage().unwrap();
eprintln!("0 | {:?}", f.stage().unwrap());
assert_eq!( assert_eq!(
1, 1,
f.events().unwrap().0.len(), f.events().unwrap().0.len(),
@ -596,6 +568,15 @@ impl Delta {
} }
} }
pub fn snapshot(tasks: Vec<Task>) -> Delta {
Delta {
ts: Self::now_time(),
op: Op::Snapshot,
task: Task(serde_yaml::Value::Null),
tasks: Some(tasks),
}
}
pub fn add(task: Task) -> Delta { pub fn add(task: Task) -> Delta {
Self::add_at(task, Self::now_time()) Self::add_at(task, Self::now_time())
} }
@ -829,6 +810,16 @@ impl Events {
.to_string() .to_string()
} }
fn last_snapshot(&self) -> Vec<Task> {
for event in self.0.iter() {
match &event.op {
Op::Snapshot => return event.tasks.clone().unwrap(),
_ => {}
};
}
vec![]
}
fn snapshot(&self) -> Result<Vec<Task>, String> { fn snapshot(&self) -> Result<Vec<Task>, String> {
let mut result = vec![]; let mut result = vec![];
for event in self.0.iter() { for event in self.0.iter() {