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
--- a/rust/hg-core/src/repo.rs Tue Apr 12 21:25:56 2022 -0700
+++ b/rust/hg-core/src/repo.rs Fri Apr 15 09:37:13 2022 -0700
@@ -187,8 +187,8 @@
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 @@
self.dirstate_map.get_mut_or_init(self)
}
+ fn new_changelog(&self) -> Result<Changelog, HgError> {
+ let use_nodemap = self
+ .requirements
+ .contains(requirements::NODEMAP_REQUIREMENT);
+ Changelog::open(&self.store_vfs(), use_nodemap)
+ }
+
pub fn changelog(&self) -> Result<Ref<Changelog>, HgError> {
self.changelog.get_or_init(self)
}
@@ -352,6 +359,13 @@
self.changelog.get_mut_or_init(self)
}
+ fn new_manifestlog(&self) -> Result<Manifestlog, HgError> {
+ let use_nodemap = self
+ .requirements
+ .contains(requirements::NODEMAP_REQUIREMENT);
+ Manifestlog::open(&self.store_vfs(), use_nodemap)
+ }
+
pub fn manifestlog(&self) -> Result<Ref<Manifestlog>, HgError> {
self.manifestlog.get_or_init(self)
}
--- a/rust/hg-core/src/revlog/changelog.rs Tue Apr 12 21:25:56 2022 -0700
+++ b/rust/hg-core/src/revlog/changelog.rs Fri Apr 15 09:37:13 2022 -0700
@@ -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 @@
impl Changelog {
/// Open the `changelog` of a repository given by its root.
- pub fn open(repo: &Repo) -> Result<Self, HgError> {
- 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<Self, HgError> {
+ let revlog =
+ Revlog::open(store_vfs, "00changelog.i", None, use_nodemap)?;
Ok(Self { revlog })
}
--- a/rust/hg-core/src/revlog/manifest.rs Tue Apr 12 21:25:56 2022 -0700
+++ b/rust/hg-core/src/revlog/manifest.rs Fri Apr 15 09:37:13 2022 -0700
@@ -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 @@
impl Manifestlog {
/// Open the `manifest` of a repository given by its root.
- pub fn open(repo: &Repo) -> Result<Self, HgError> {
- 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<Self, HgError> {
+ let revlog =
+ Revlog::open(store_vfs, "00manifest.i", None, use_nodemap)?;
Ok(Self { revlog })
}