summaryrefslogtreecommitdiffstats
path: root/src/document/store.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/document/store.rs')
-rw-r--r--src/document/store.rs18
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,