From 789fd8c82c9ffe3b45c779a73588c8bf5ea5df2f Mon Sep 17 00:00:00 2001 From: Meyer Jacobs Date: Tue, 14 Sep 2021 18:07:14 -0700 Subject: [PATCH] scmstore: add utility method for converting StoreTree to manifest-tree::Entry Summary: Adds a utility method for converting a `StoreTree` to a `manifest-tree::Entry`, which wraps an hg manifest blob and provides methods for parsing it as a tree manifest (and a `TryFrom` impl used to convert it to a pre-parsed `manifest::List`, which is used by BackingStore in the next change in this stack). Reviewed By: andll Differential Revision: D30859470 fbshipit-source-id: 411e80a14861e0739b0c398290055002b35e59d3 --- eden/scm/lib/revisionstore/Cargo.toml | 1 + .../src/scmstore/tree/types/lazy_tree.rs | 7 ++++++- .../src/scmstore/tree/types/store_tree.rs | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/eden/scm/lib/revisionstore/Cargo.toml b/eden/scm/lib/revisionstore/Cargo.toml index dd99edfa87..c460140f18 100644 --- a/eden/scm/lib/revisionstore/Cargo.toml +++ b/eden/scm/lib/revisionstore/Cargo.toml @@ -26,6 +26,7 @@ http-client = { path = "../http-client" } indexedlog = { path = "../indexedlog" } lfs_protocol = { path = "../../../mononoke/lfs_protocol" } lz4-pyframe = { path = "../lz4-pyframe" } +manifest-tree = { path = "../manifest-tree" } memmap = "0.7" mincode = { path = "../mincode" } minibytes = { path = "../minibytes", features = ["frombytes"] } diff --git a/eden/scm/lib/revisionstore/src/scmstore/tree/types/lazy_tree.rs b/eden/scm/lib/revisionstore/src/scmstore/tree/types/lazy_tree.rs index cbbb46904b..d363177a31 100644 --- a/eden/scm/lib/revisionstore/src/scmstore/tree/types/lazy_tree.rs +++ b/eden/scm/lib/revisionstore/src/scmstore/tree/types/lazy_tree.rs @@ -9,7 +9,7 @@ use anyhow::Result; use tracing::instrument; use edenapi_types::TreeEntry; - +use manifest_tree::TreeEntry as ManifestTreeEntry; use minibytes::Bytes; use types::{HgId, Key}; @@ -72,4 +72,9 @@ impl LazyTree { ContentStore(_, _) => None, }) } + + pub fn manifest_tree_entry(&mut self) -> Result { + // TODO(meyer): Make manifest-tree crate use minibytes::Bytes + Ok(ManifestTreeEntry(self.hg_content()?.into_vec().into())) + } } diff --git a/eden/scm/lib/revisionstore/src/scmstore/tree/types/store_tree.rs b/eden/scm/lib/revisionstore/src/scmstore/tree/types/store_tree.rs index 984be2ab3e..56f914ef62 100644 --- a/eden/scm/lib/revisionstore/src/scmstore/tree/types/store_tree.rs +++ b/eden/scm/lib/revisionstore/src/scmstore/tree/types/store_tree.rs @@ -7,6 +7,10 @@ use std::ops::BitOr; +use anyhow::{anyhow, Result}; + +use manifest_tree::TreeEntry as ManifestTreeEntry; + use crate::scmstore::{ tree::types::{LazyTree, TreeAttributes}, value::StoreValue, @@ -17,6 +21,15 @@ pub struct StoreTree { pub(crate) content: Option, } +impl StoreTree { + pub fn manifest_tree_entry(&mut self) -> Result { + self.content + .as_mut() + .ok_or_else(|| anyhow!("no content available"))? + .manifest_tree_entry() + } +} + impl StoreValue for StoreTree { type Attrs = TreeAttributes; @@ -50,6 +63,7 @@ impl Default for StoreTree { StoreTree { content: None } } } + impl From for StoreTree { fn from(v: LazyTree) -> Self { StoreTree { content: Some(v) }