diff --git a/eden/scm/lib/dag/src/namedag.rs b/eden/scm/lib/dag/src/namedag.rs index 5a6197f481..895a6c4518 100644 --- a/eden/scm/lib/dag/src/namedag.rs +++ b/eden/scm/lib/dag/src/namedag.rs @@ -9,6 +9,7 @@ //! //! Combination of IdMap and IdDag. +use crate::clone::CloneData; use crate::delegate; use crate::errors::bug; use crate::errors::programming; @@ -24,6 +25,7 @@ use crate::nameset::hints::Hints; use crate::nameset::NameSet; use crate::ops::DagAddHeads; use crate::ops::DagAlgorithm; +use crate::ops::DagImportCloneData; use crate::ops::DagPersistent; use crate::ops::IdConvert; use crate::ops::IdMapSnapshot; @@ -227,6 +229,21 @@ where } } +impl DagImportCloneData for AbstractNameDag, M, P, S> +where + IS: IdDagStore, + M: IdMapAssignHead, +{ + fn import_clone_data(&mut self, clone_data: CloneData) -> Result<()> { + for (id, name) in clone_data.idmap { + self.map.insert(id, name.as_ref())?; + } + self.dag + .build_segments_volatile_from_prepared_flat_segments(&clone_data.flat_segments)?; + Ok(()) + } +} + impl AbstractNameDag, M, P, S> where IS: IdDagStore, diff --git a/eden/scm/lib/dag/src/ops.rs b/eden/scm/lib/dag/src/ops.rs index 6fdb92ce13..b68bbc8e4c 100644 --- a/eden/scm/lib/dag/src/ops.rs +++ b/eden/scm/lib/dag/src/ops.rs @@ -7,6 +7,7 @@ //! DAG and Id operations (mostly traits) +use crate::clone::CloneData; use crate::default_impl; use crate::id::Group; use crate::id::Id; @@ -169,6 +170,12 @@ pub trait DagAddHeads { F: Fn(VertexName) -> Result>; } +/// Import a generated `CloneData` object into the DAG. +pub trait DagImportCloneData { + /// Updates the DAG using a `CloneData` object. + fn import_clone_data(&mut self, clone_data: CloneData) -> Result<()>; +} + /// Persistent the DAG on disk. pub trait DagPersistent { /// Write in-memory DAG to disk. This might also pick up changes to