summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-21 03:59:04 +0200
committertv <tv@krebsco.de>2026-10-21 03:59:04 +0200
commit812eb0b3b714a16584c058de4b6a1de84a8e8dd7 (patch)
tree41aaa46fa098504e0ef4bb0f736864a8467cb5ec
parent00f3be4e8b6ebf1f4262bc34384f82bc8d438574 (diff)
add store::copy_path_to(src, from, dst, to)
-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,