From 227d1aad2cf33f0589d17cf7d0a685e6348121a1 Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Wed, 28 Aug 2024 01:17:01 +0800 Subject: [PATCH] fix: find last_delete_op can return none --- crates/loro-internal/src/loro.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/loro-internal/src/loro.rs b/crates/loro-internal/src/loro.rs index 3bd21ba1..5d3adf5a 100644 --- a/crates/loro-internal/src/loro.rs +++ b/crates/loro-internal/src/loro.rs @@ -1221,7 +1221,10 @@ impl LoroDoc { .id_to_idx(&pos.container) .ok_or(CannotFindRelativePosition::ContainerDeleted)?; // We know where the target id is when we trace back to the delete_op_id. - let delete_op_id = find_last_delete_op(&oplog, id, idx).unwrap(); + let Some(delete_op_id) = find_last_delete_op(&oplog, id, idx) else { + tracing::error!("Cannot find id {}", id); + return Err(CannotFindRelativePosition::IdNotFound); + }; let mut diff_calc = DiffCalculator::new(); let before_frontiers: Frontiers = oplog.dag.find_deps_of_id(delete_op_id); let before = &oplog.dag.frontiers_to_vv(&before_frontiers).unwrap(); @@ -1341,7 +1344,7 @@ impl LoroDoc { } fn find_last_delete_op(oplog: &OpLog, id: ID, idx: ContainerIdx) -> Option { - let start_vv = oplog.dag.frontiers_to_vv(&id.into()).unwrap(); + let start_vv = oplog.dag.frontiers_to_vv(&id.into())?; for change in oplog.iter_changes_causally_rev(&start_vv, &oplog.dag.vv) { for op in change.ops.iter().rev() { if op.container != idx {