# HG changeset patch # User Martin von Zweigbergk # Date 2022-04-15 16:37:13 # Node ID a5ef50becea81aee90934a3a99f786a9f66b8209 # Parent 399439c122238009db2841cfe53f7c71d513cb77 rust-revlog: make `Changelog` and `ManifestLog` unaware of `Repo` As with other recent patches, this makes the types easier to test and reuse. Differential Revision: https://phab.mercurial-scm.org/D12561 diff --git a/rust/hg-core/src/repo.rs b/rust/hg-core/src/repo.rs --- a/rust/hg-core/src/repo.rs +++ b/rust/hg-core/src/repo.rs @@ -187,8 +187,8 @@ impl Repo { Self::read_dirstate_data_file_uuid, ), dirstate_map: LazyCell::new(Self::new_dirstate_map), - changelog: LazyCell::new(Changelog::open), - manifestlog: LazyCell::new(Manifestlog::open), + changelog: LazyCell::new(Self::new_changelog), + manifestlog: LazyCell::new(Self::new_manifestlog), }; requirements::check(&repo)?; @@ -344,6 +344,13 @@ impl Repo { self.dirstate_map.get_mut_or_init(self) } + fn new_changelog(&self) -> Result { + let use_nodemap = self + .requirements + .contains(requirements::NODEMAP_REQUIREMENT); + Changelog::open(&self.store_vfs(), use_nodemap) + } + pub fn changelog(&self) -> Result, HgError> { self.changelog.get_or_init(self) } @@ -352,6 +359,13 @@ impl Repo { self.changelog.get_mut_or_init(self) } + fn new_manifestlog(&self) -> Result { + let use_nodemap = self + .requirements + .contains(requirements::NODEMAP_REQUIREMENT); + Manifestlog::open(&self.store_vfs(), use_nodemap) + } + pub fn manifestlog(&self) -> Result, HgError> { self.manifestlog.get_or_init(self) } diff --git a/rust/hg-core/src/revlog/changelog.rs b/rust/hg-core/src/revlog/changelog.rs --- a/rust/hg-core/src/revlog/changelog.rs +++ b/rust/hg-core/src/revlog/changelog.rs @@ -1,10 +1,9 @@ use crate::errors::HgError; -use crate::repo::Repo; -use crate::requirements; use crate::revlog::revlog::{Revlog, RevlogEntry, RevlogError}; use crate::revlog::Revision; use crate::revlog::{Node, NodePrefix}; use crate::utils::hg_path::HgPath; +use crate::vfs::Vfs; use itertools::Itertools; use std::ascii::escape_default; use std::fmt::{Debug, Formatter}; @@ -17,16 +16,9 @@ pub struct Changelog { impl Changelog { /// Open the `changelog` of a repository given by its root. - pub fn open(repo: &Repo) -> Result { - let use_nodemap = repo - .requirements() - .contains(requirements::NODEMAP_REQUIREMENT); - let revlog = Revlog::open( - &repo.store_vfs(), - "00changelog.i", - None, - use_nodemap, - )?; + pub fn open(store_vfs: &Vfs, use_nodemap: bool) -> Result { + let revlog = + Revlog::open(store_vfs, "00changelog.i", None, use_nodemap)?; Ok(Self { revlog }) } diff --git a/rust/hg-core/src/revlog/manifest.rs b/rust/hg-core/src/revlog/manifest.rs --- a/rust/hg-core/src/revlog/manifest.rs +++ b/rust/hg-core/src/revlog/manifest.rs @@ -1,11 +1,10 @@ use crate::errors::HgError; -use crate::repo::Repo; -use crate::requirements; use crate::revlog::revlog::{Revlog, RevlogError}; use crate::revlog::Revision; use crate::revlog::{Node, NodePrefix}; use crate::utils::hg_path::HgPath; use crate::utils::SliceExt; +use crate::vfs::Vfs; /// A specialized `Revlog` to work with `manifest` data format. pub struct Manifestlog { @@ -15,16 +14,9 @@ pub struct Manifestlog { impl Manifestlog { /// Open the `manifest` of a repository given by its root. - pub fn open(repo: &Repo) -> Result { - let use_nodemap = repo - .requirements() - .contains(requirements::NODEMAP_REQUIREMENT); - let revlog = Revlog::open( - &repo.store_vfs(), - "00manifest.i", - None, - use_nodemap, - )?; + pub fn open(store_vfs: &Vfs, use_nodemap: bool) -> Result { + let revlog = + Revlog::open(store_vfs, "00manifest.i", None, use_nodemap)?; Ok(Self { revlog }) }