From 8327c54db16df6a4c801f347b6c2444e1aefec67 Mon Sep 17 00:00:00 2001 From: Stefan Filip Date: Tue, 1 Dec 2020 09:57:24 -0800 Subject: [PATCH] dag: add DagImportCloneData::import_clone_data Summary: This method reconstructs a dag from clone data. At the moment we only have a clone data construction method in Mononoke. It's the Dags job to construct and import the clone_data. We'll consolidate that at a later time. Reviewed By: quark-zju Differential Revision: D24954823 fbshipit-source-id: fe92179ec80f71234fc8f1cf7709f5104aabb4fb --- eden/scm/lib/dag/src/namedag.rs | 17 +++++++++++++++++ eden/scm/lib/dag/src/ops.rs | 7 +++++++ 2 files changed, 24 insertions(+) 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