diff options
| author | tv <tv@krebsco.de> | 2026-10-21 03:59:04 +0200 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-10-21 03:59:04 +0200 |
| commit | 812eb0b3b714a16584c058de4b6a1de84a8e8dd7 (patch) | |
| tree | 41aaa46fa098504e0ef4bb0f736864a8467cb5ec | |
| parent | 00f3be4e8b6ebf1f4262bc34384f82bc8d438574 (diff) | |
add store::copy_path_to(src, from, dst, to)
| -rw-r--r-- | src/document/store.rs | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/document/store.rs b/src/document/store.rs index 1815635..9db8300 100644 --- a/src/document/store.rs +++ b/src/document/store.rs @@ -296,10 +296,20 @@ pub(crate) fn copy_path( dst: &mut AutoCommit, path: &[String], ) -> Result<(), StoreError> { - let (leaf, parents) = path.split_last().ok_or(StoreError::NotFound)?; + copy_path_to(src, path, dst, path) +} + +/// Like [`copy_path`], but puts what `src` holds at `from` at `to` in `dst`. +pub(crate) fn copy_path_to( + src: &AutoCommit, + from: &[String], + dst: &mut AutoCommit, + to: &[String], +) -> Result<(), StoreError> { + let (leaf, parents) = to.split_last().ok_or(StoreError::NotFound)?; - let Some(resolved) = resolve_at(src, path)? else { - return match delete_path(dst, path, false) { + let Some(resolved) = resolve_at(src, from)? else { + return match delete_path(dst, to, false) { Ok(()) | Err(StoreError::NotFound) => Ok(()), Err(error) => Err(error), }; @@ -307,7 +317,7 @@ pub(crate) fn copy_path( let maps = ensure_maps(dst, parents)?; delete_in_all(dst, &maps, leaf)?; - let mut trace = path.to_vec(); + let mut trace = from.to_vec(); copy_resolved( src, &resolved, |
