--- a/rust/hg-core/src/revlog/revlog.rs Sat Dec 19 15:56:54 2020 +0100
+++ b/rust/hg-core/src/revlog/revlog.rs Mon Dec 14 16:33:15 2020 +0100
@@ -1,5 +1,4 @@
use std::borrow::Cow;
-use std::fs::File;
use std::io::Read;
use std::ops::Deref;
use std::path::Path;
@@ -8,7 +7,6 @@
use crypto::digest::Digest;
use crypto::sha1::Sha1;
use flate2::read::ZlibDecoder;
-use memmap::{Mmap, MmapOptions};
use micro_timer::timed;
use zstd;
@@ -18,6 +16,7 @@
use super::nodemap::NodeMap;
use super::nodemap_docket::NodeMapDocket;
use super::patch;
+use crate::repo::Repo;
use crate::revlog::Revision;
pub enum RevlogError {
@@ -30,12 +29,6 @@
UnknowDataFormat(u8),
}
-pub(super) fn mmap_open(path: &Path) -> Result<Mmap, std::io::Error> {
- let file = File::open(path)?;
- let mmap = unsafe { MmapOptions::new().map(&file) }?;
- Ok(mmap)
-}
-
/// Read only implementation of revlog.
pub struct Revlog {
/// When index and data are not interleaved: bytes of the revlog index.
@@ -55,11 +48,15 @@
/// interleaved.
#[timed]
pub fn open(
- index_path: &Path,
+ repo: &Repo,
+ index_path: impl AsRef<Path>,
data_path: Option<&Path>,
) -> Result<Self, RevlogError> {
- let index_mmap =
- mmap_open(&index_path).map_err(RevlogError::IoError)?;
+ let index_path = index_path.as_ref();
+ let index_mmap = repo
+ .store_vfs()
+ .mmap_open(&index_path)
+ .map_err(RevlogError::IoError)?;
let version = get_version(&index_mmap);
if version != 1 {
@@ -77,12 +74,14 @@
None
} else {
let data_path = data_path.unwrap_or(&default_data_path);
- let data_mmap =
- mmap_open(data_path).map_err(RevlogError::IoError)?;
+ let data_mmap = repo
+ .store_vfs()
+ .mmap_open(data_path)
+ .map_err(RevlogError::IoError)?;
Some(Box::new(data_mmap))
};
- let nodemap = NodeMapDocket::read_from_file(index_path)?.map(
+ let nodemap = NodeMapDocket::read_from_file(repo, index_path)?.map(
|(docket, data)| {
nodemap::NodeTree::load_bytes(
Box::new(data),