diff --git a/blobrepo/src/lib.rs b/blobrepo/src/lib.rs index 81dadb3e6d..2d43101fb5 100644 --- a/blobrepo/src/lib.rs +++ b/blobrepo/src/lib.rs @@ -12,6 +12,7 @@ extern crate error_chain; extern crate futures; extern crate bincode; +extern crate bytes; extern crate serde; #[macro_use] extern crate serde_derive; @@ -27,12 +28,14 @@ extern crate filebookmarks; extern crate fileheads; extern crate futures_ext; extern crate heads; +extern crate manifoldblob; extern crate memblob; extern crate membookmarks; extern crate memheads; extern crate mercurial; extern crate mercurial_types; extern crate rocksblob; +extern crate tokio_core; mod repo; mod changeset; @@ -47,7 +50,7 @@ pub use errors::*; pub use changeset::BlobChangeset; pub use manifest::BlobManifest; pub use repo::BlobRepo; -pub use state::{BlobState, FilesBlobState, MemBlobState, RocksBlobState}; +pub use state::{BlobState, FilesBlobState, ManifoldBlobState, MemBlobState, RocksBlobState}; // // TODO: (jsgf) T21597565 This is exposed here for blobimport -- don't use it for anything else. diff --git a/blobrepo/src/state.rs b/blobrepo/src/state.rs index bca1ce81dd..7c784e811b 100644 --- a/blobrepo/src/state.rs +++ b/blobrepo/src/state.rs @@ -9,15 +9,18 @@ use std::sync::Arc; use blobstore::Blobstore; use bookmarks::Bookmarks; +use bytes::Bytes; use fileblob::Fileblob; use filebookmarks::FileBookmarks; use fileheads::FileHeads; use heads::Heads; +use manifoldblob::ManifoldBlob; use memblob::Memblob; use membookmarks::MemBookmarks; use memheads::MemHeads; use mercurial_types::NodeHash; use rocksblob::Rocksblob; +use tokio_core::reactor::Remote; use errors::*; @@ -144,3 +147,29 @@ impl MemBlobState { } } } + +impl_blob_state! { + ManifoldBlobState { + heads: FileHeads, + bookmarks: Arc>, + blobstore: ManifoldBlob, + } +} + +impl ManifoldBlobState { + pub fn new(path: &Path, remote: &Remote) -> Result { + let heads = FileHeads::open(path.join("heads")) + .chain_err(|| ErrorKind::StateOpen(StateOpenError::Heads))?; + let bookmarks = Arc::new( + FileBookmarks::open(path.join("books")) + .chain_err(|| ErrorKind::StateOpen(StateOpenError::Bookmarks))?, + ); + // TODO(stash): is new_may_panic is the best option? + let blobstore = ManifoldBlob::new_may_panic("mononoke", remote); + Ok(ManifoldBlobState { + heads, + bookmarks, + blobstore, + }) + } +}