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 | a6543d818badac822273b53c2d9f367696922ba5 (patch) | |
| tree | 29821047234f2a9d8bdee8b7ed06772f70090b33 /src/document | |
| parent | 0cdd5075c88d938117c5dbddc22a2331a8816c34 (diff) | |
add store::copy_path_to(src, from, dst, to)
Diffstat (limited to 'src/document')
| -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 a862723..9e18693 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, |
