Mercurial > hg
view rust/hg-core/src/repo.rs @ 46315:2ef575c62f10
test-regression: backing out D9640 (63c923fd7fa8)
Since D9640 was pushed, we have seen failure on at least:
- test-commit-interactive.t
- test-i18n.t
- test-log.t
The author that change requested it to be removed until he can investigate.
For reference: https://phab.mercurial-scm.org/D9640
Backed out changeset 63c923fd7fa8
Differential Revision: https://phab.mercurial-scm.org/D9803
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sun, 17 Jan 2021 02:48:15 +0100 |
parents | 8a4914397d02 |
children | 02d3bb972121 |
line wrap: on
line source
use crate::operations::{find_root, FindRootError}; use crate::requirements; use memmap::{Mmap, MmapOptions}; use std::path::{Path, PathBuf}; /// A repository on disk pub struct Repo { working_directory: PathBuf, dot_hg: PathBuf, store: PathBuf, } /// Filesystem access abstraction for the contents of a given "base" diretory #[derive(Clone, Copy)] pub(crate) struct Vfs<'a> { base: &'a Path, } impl Repo { /// Returns `None` if the given path doesn’t look like a repository /// (doesn’t contain a `.hg` sub-directory). pub fn for_path(root: impl Into<PathBuf>) -> Self { let working_directory = root.into(); let dot_hg = working_directory.join(".hg"); Self { store: dot_hg.join("store"), dot_hg, working_directory, } } pub fn find() -> Result<Self, FindRootError> { find_root().map(Self::for_path) } pub fn check_requirements( &self, ) -> Result<(), requirements::RequirementsError> { requirements::check(self) } pub fn working_directory_path(&self) -> &Path { &self.working_directory } /// For accessing repository files (in `.hg`), except for the store /// (`.hg/store`). pub(crate) fn hg_vfs(&self) -> Vfs<'_> { Vfs { base: &self.dot_hg } } /// For accessing repository store files (in `.hg/store`) pub(crate) fn store_vfs(&self) -> Vfs<'_> { Vfs { base: &self.store } } /// For accessing the working copy // The undescore prefix silences the "never used" warning. Remove before // using. pub(crate) fn _working_directory_vfs(&self) -> Vfs<'_> { Vfs { base: &self.working_directory, } } } impl Vfs<'_> { pub(crate) fn read( &self, relative_path: impl AsRef<Path>, ) -> std::io::Result<Vec<u8>> { std::fs::read(self.base.join(relative_path)) } pub(crate) fn open( &self, relative_path: impl AsRef<Path>, ) -> std::io::Result<std::fs::File> { std::fs::File::open(self.base.join(relative_path)) } pub(crate) fn mmap_open( &self, relative_path: impl AsRef<Path>, ) -> std::io::Result<Mmap> { let file = self.open(relative_path)?; // TODO: what are the safety requirements here? let mmap = unsafe { MmapOptions::new().map(&file) }?; Ok(mmap) } }