mirror of
https://github.com/martinvonz/jj.git
synced 2024-12-27 14:57:14 +00:00
index: use as_composite() to access to index stats
The idea is that .as_composite() is equivalent to .as_index(), but for the implementation type. I'm going to add "impl Index for CompositeIndex" to clean up index references passed to revset engine.
This commit is contained in:
parent
92c1b7091b
commit
fb77c55268
3 changed files with 39 additions and 58 deletions
|
@ -450,8 +450,8 @@ impl Debug for ReadonlyIndexImpl {
|
|||
}
|
||||
|
||||
impl ReadonlyIndexWrapper {
|
||||
pub fn stats(&self) -> IndexStats {
|
||||
self.0.stats()
|
||||
pub fn as_composite(&self) -> CompositeIndex {
|
||||
self.0.as_composite()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -685,14 +685,6 @@ impl MutableIndexImpl {
|
|||
IndexLoadError::IoError(err) => err,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn stats(&self) -> IndexStats {
|
||||
CompositeIndex(self).stats()
|
||||
}
|
||||
|
||||
pub fn num_commits(&self) -> u32 {
|
||||
CompositeIndex(self).num_commits()
|
||||
}
|
||||
}
|
||||
|
||||
impl Index for MutableIndexImpl {
|
||||
|
@ -779,7 +771,9 @@ impl MutableIndex for MutableIndexImpl {
|
|||
if own_ancestor.name == other_ancestor.name {
|
||||
break;
|
||||
}
|
||||
if own_ancestor.num_commits() < other_ancestor.num_commits() {
|
||||
if own_ancestor.as_composite().num_commits()
|
||||
< other_ancestor.as_composite().num_commits()
|
||||
{
|
||||
files_to_add.push(other_ancestor.clone());
|
||||
maybe_other_ancestor = other_ancestor.parent_file.clone();
|
||||
} else {
|
||||
|
@ -842,11 +836,11 @@ impl<'a> CompositeIndex<'a> {
|
|||
)
|
||||
}
|
||||
|
||||
fn num_commits(&self) -> u32 {
|
||||
pub fn num_commits(&self) -> u32 {
|
||||
self.0.segment_num_parent_commits() + self.0.segment_num_commits()
|
||||
}
|
||||
|
||||
fn stats(&self) -> IndexStats {
|
||||
pub fn stats(&self) -> IndexStats {
|
||||
let num_commits = self.num_commits();
|
||||
let mut num_merges = 0;
|
||||
let mut max_generation_number = 0;
|
||||
|
@ -908,7 +902,7 @@ impl<'a> CompositeIndex<'a> {
|
|||
///
|
||||
/// If the given `commit_id` doesn't exist, this will return the prefix
|
||||
/// length that never matches with any commit ids.
|
||||
fn shortest_unique_commit_id_prefix_len(&self, commit_id: &CommitId) -> usize {
|
||||
pub fn shortest_unique_commit_id_prefix_len(&self, commit_id: &CommitId) -> usize {
|
||||
let (prev_id, next_id) = self.resolve_neighbor_commit_ids(commit_id);
|
||||
itertools::chain(prev_id, next_id)
|
||||
.map(|id| backend::common_hex_len(commit_id.as_bytes(), id.as_bytes()) + 1)
|
||||
|
@ -942,7 +936,7 @@ impl<'a> CompositeIndex<'a> {
|
|||
.unwrap()
|
||||
}
|
||||
|
||||
fn resolve_prefix(&self, prefix: &HexPrefix) -> PrefixResolution<CommitId> {
|
||||
pub fn resolve_prefix(&self, prefix: &HexPrefix) -> PrefixResolution<CommitId> {
|
||||
self.ancestor_index_segments()
|
||||
.fold(PrefixResolution::NoMatch, |acc_match, segment| {
|
||||
if acc_match == PrefixResolution::AmbiguousMatch {
|
||||
|
@ -959,11 +953,11 @@ impl<'a> CompositeIndex<'a> {
|
|||
.map(|pos| self.entry_by_pos(pos))
|
||||
}
|
||||
|
||||
fn has_id(&self, commit_id: &CommitId) -> bool {
|
||||
pub fn has_id(&self, commit_id: &CommitId) -> bool {
|
||||
self.commit_id_to_pos(commit_id).is_some()
|
||||
}
|
||||
|
||||
fn is_ancestor(&self, ancestor_id: &CommitId, descendant_id: &CommitId) -> bool {
|
||||
pub fn is_ancestor(&self, ancestor_id: &CommitId, descendant_id: &CommitId) -> bool {
|
||||
let ancestor_pos = self.commit_id_to_pos(ancestor_id).unwrap();
|
||||
let descendant_pos = self.commit_id_to_pos(descendant_id).unwrap();
|
||||
self.is_ancestor_pos(ancestor_pos, descendant_pos)
|
||||
|
@ -989,7 +983,7 @@ impl<'a> CompositeIndex<'a> {
|
|||
false
|
||||
}
|
||||
|
||||
fn common_ancestors(&self, set1: &[CommitId], set2: &[CommitId]) -> Vec<CommitId> {
|
||||
pub fn common_ancestors(&self, set1: &[CommitId], set2: &[CommitId]) -> Vec<CommitId> {
|
||||
let pos1 = set1
|
||||
.iter()
|
||||
.map(|id| self.commit_id_to_pos(id).unwrap())
|
||||
|
@ -1113,7 +1107,7 @@ impl<'a> CompositeIndex<'a> {
|
|||
}
|
||||
|
||||
/// Parents before children
|
||||
fn topo_order(&self, input: &mut dyn Iterator<Item = &CommitId>) -> Vec<CommitId> {
|
||||
pub fn topo_order(&self, input: &mut dyn Iterator<Item = &CommitId>) -> Vec<CommitId> {
|
||||
let mut ids = input.cloned().collect_vec();
|
||||
ids.sort_by_cached_key(|id| self.commit_id_to_pos(id).unwrap());
|
||||
ids
|
||||
|
@ -1979,14 +1973,6 @@ impl ReadonlyIndexImpl {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn stats(&self) -> IndexStats {
|
||||
CompositeIndex(self).stats()
|
||||
}
|
||||
|
||||
pub fn num_commits(&self) -> u32 {
|
||||
CompositeIndex(self).num_commits()
|
||||
}
|
||||
}
|
||||
|
||||
impl Index for ReadonlyIndexImpl {
|
||||
|
|
|
@ -17,8 +17,7 @@ use std::sync::Arc;
|
|||
use jujutsu_lib::backend::CommitId;
|
||||
use jujutsu_lib::commit::Commit;
|
||||
use jujutsu_lib::commit_builder::CommitBuilder;
|
||||
use jujutsu_lib::default_index_store::{MutableIndexImpl, ReadonlyIndexImpl};
|
||||
use jujutsu_lib::index::Index;
|
||||
use jujutsu_lib::default_index_store::{CompositeIndex, MutableIndexImpl, ReadonlyIndexImpl};
|
||||
use jujutsu_lib::repo::{MutableRepo, ReadonlyRepo, Repo};
|
||||
use jujutsu_lib::settings::UserSettings;
|
||||
use test_case::test_case;
|
||||
|
@ -35,12 +34,8 @@ fn child_commit<'repo>(
|
|||
}
|
||||
|
||||
// Helper just to reduce line wrapping
|
||||
fn generation_number(index: &ReadonlyIndexImpl, commit_id: &CommitId) -> u32 {
|
||||
index
|
||||
.as_composite()
|
||||
.entry_by_id(commit_id)
|
||||
.unwrap()
|
||||
.generation_number()
|
||||
fn generation_number(index: CompositeIndex, commit_id: &CommitId) -> u32 {
|
||||
index.entry_by_id(commit_id).unwrap().generation_number()
|
||||
}
|
||||
|
||||
#[test_case(false ; "local backend")]
|
||||
|
@ -49,7 +44,7 @@ fn test_index_commits_empty_repo(use_git: bool) {
|
|||
let test_repo = TestRepo::init(use_git);
|
||||
let repo = &test_repo.repo;
|
||||
|
||||
let index = as_readonly_impl(repo);
|
||||
let index = as_readonly_composite(repo);
|
||||
// There should be just the root commit
|
||||
assert_eq!(index.num_commits(), 1);
|
||||
|
||||
|
@ -91,7 +86,7 @@ fn test_index_commits_standard_cases(use_git: bool) {
|
|||
let commit_h = graph_builder.commit_with_parents(&[&commit_e]);
|
||||
let repo = tx.commit();
|
||||
|
||||
let index = as_readonly_impl(&repo);
|
||||
let index = as_readonly_composite(&repo);
|
||||
// There should be the root commit, plus 8 more
|
||||
assert_eq!(index.num_commits(), 1 + 8);
|
||||
|
||||
|
@ -151,7 +146,7 @@ fn test_index_commits_criss_cross(use_git: bool) {
|
|||
}
|
||||
let repo = tx.commit();
|
||||
|
||||
let index = as_readonly_impl(&repo);
|
||||
let index = as_readonly_composite(&repo);
|
||||
// There should the root commit, plus 2 for each generation
|
||||
assert_eq!(index.num_commits(), 1 + 2 * (num_generations as u32));
|
||||
|
||||
|
@ -195,21 +190,18 @@ fn test_index_commits_criss_cross(use_git: bool) {
|
|||
// RevWalk deduplicates chains by entry.
|
||||
assert_eq!(
|
||||
index
|
||||
.as_composite()
|
||||
.walk_revs(&[left_commits[num_generations - 1].id().clone()], &[])
|
||||
.count(),
|
||||
2 * num_generations
|
||||
);
|
||||
assert_eq!(
|
||||
index
|
||||
.as_composite()
|
||||
.walk_revs(&[right_commits[num_generations - 1].id().clone()], &[])
|
||||
.count(),
|
||||
2 * num_generations
|
||||
);
|
||||
assert_eq!(
|
||||
index
|
||||
.as_composite()
|
||||
.walk_revs(
|
||||
&[left_commits[num_generations - 1].id().clone()],
|
||||
&[left_commits[num_generations - 2].id().clone()]
|
||||
|
@ -219,7 +211,6 @@ fn test_index_commits_criss_cross(use_git: bool) {
|
|||
);
|
||||
assert_eq!(
|
||||
index
|
||||
.as_composite()
|
||||
.walk_revs(
|
||||
&[right_commits[num_generations - 1].id().clone()],
|
||||
&[right_commits[num_generations - 2].id().clone()]
|
||||
|
@ -232,7 +223,6 @@ fn test_index_commits_criss_cross(use_git: bool) {
|
|||
// be more expensive than RevWalk, but should still finish in reasonable time.
|
||||
assert_eq!(
|
||||
index
|
||||
.as_composite()
|
||||
.walk_revs(&[left_commits[num_generations - 1].id().clone()], &[])
|
||||
.filter_by_generation(0..(num_generations + 1) as u32)
|
||||
.count(),
|
||||
|
@ -240,7 +230,6 @@ fn test_index_commits_criss_cross(use_git: bool) {
|
|||
);
|
||||
assert_eq!(
|
||||
index
|
||||
.as_composite()
|
||||
.walk_revs(&[right_commits[num_generations - 1].id().clone()], &[])
|
||||
.filter_by_generation(0..(num_generations + 1) as u32)
|
||||
.count(),
|
||||
|
@ -248,7 +237,6 @@ fn test_index_commits_criss_cross(use_git: bool) {
|
|||
);
|
||||
assert_eq!(
|
||||
index
|
||||
.as_composite()
|
||||
.walk_revs(
|
||||
&[left_commits[num_generations - 1].id().clone()],
|
||||
&[left_commits[num_generations - 2].id().clone()]
|
||||
|
@ -259,7 +247,6 @@ fn test_index_commits_criss_cross(use_git: bool) {
|
|||
);
|
||||
assert_eq!(
|
||||
index
|
||||
.as_composite()
|
||||
.walk_revs(
|
||||
&[right_commits[num_generations - 1].id().clone()],
|
||||
&[right_commits[num_generations - 2].id().clone()]
|
||||
|
@ -305,7 +292,7 @@ fn test_index_commits_previous_operations(use_git: bool) {
|
|||
std::fs::create_dir(&index_operations_dir).unwrap();
|
||||
|
||||
let repo = load_repo_at_head(&settings, repo.repo_path());
|
||||
let index = as_readonly_impl(&repo);
|
||||
let index = as_readonly_composite(&repo);
|
||||
// There should be the root commit, plus 3 more
|
||||
assert_eq!(index.num_commits(), 1 + 3);
|
||||
|
||||
|
@ -342,7 +329,7 @@ fn test_index_commits_incremental(use_git: bool) {
|
|||
.unwrap();
|
||||
let repo = tx.commit();
|
||||
|
||||
let index = as_readonly_impl(&repo);
|
||||
let index = as_readonly_composite(&repo);
|
||||
// There should be the root commit, plus 1 more
|
||||
assert_eq!(index.num_commits(), 1 + 1);
|
||||
|
||||
|
@ -356,7 +343,7 @@ fn test_index_commits_incremental(use_git: bool) {
|
|||
tx.commit();
|
||||
|
||||
let repo = load_repo_at_head(&settings, repo.repo_path());
|
||||
let index = as_readonly_impl(&repo);
|
||||
let index = as_readonly_composite(&repo);
|
||||
// There should be the root commit, plus 3 more
|
||||
assert_eq!(index.num_commits(), 1 + 3);
|
||||
|
||||
|
@ -394,14 +381,14 @@ fn test_index_commits_incremental_empty_transaction(use_git: bool) {
|
|||
.unwrap();
|
||||
let repo = tx.commit();
|
||||
|
||||
let index = as_readonly_impl(&repo);
|
||||
let index = as_readonly_composite(&repo);
|
||||
// There should be the root commit, plus 1 more
|
||||
assert_eq!(index.num_commits(), 1 + 1);
|
||||
|
||||
repo.start_transaction(&settings, "test").commit();
|
||||
|
||||
let repo = load_repo_at_head(&settings, repo.repo_path());
|
||||
let index = as_readonly_impl(&repo);
|
||||
let index = as_readonly_composite(&repo);
|
||||
// There should be the root commit, plus 1 more
|
||||
assert_eq!(index.num_commits(), 1 + 1);
|
||||
|
||||
|
@ -438,11 +425,11 @@ fn test_index_commits_incremental_already_indexed(use_git: bool) {
|
|||
let repo = tx.commit();
|
||||
|
||||
assert!(repo.index().has_id(commit_a.id()));
|
||||
assert_eq!(as_readonly_impl(&repo).num_commits(), 1 + 1);
|
||||
assert_eq!(as_readonly_composite(&repo).num_commits(), 1 + 1);
|
||||
let mut tx = repo.start_transaction(&settings, "test");
|
||||
let mut_repo = tx.mut_repo();
|
||||
mut_repo.add_head(&commit_a);
|
||||
assert_eq!(as_mutable_impl(mut_repo).num_commits(), 1 + 1);
|
||||
assert_eq!(as_mutable_composite(mut_repo).num_commits(), 1 + 1);
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
|
@ -466,6 +453,10 @@ fn as_readonly_impl(repo: &Arc<ReadonlyRepo>) -> &ReadonlyIndexImpl {
|
|||
.unwrap()
|
||||
}
|
||||
|
||||
fn as_readonly_composite(repo: &Arc<ReadonlyRepo>) -> CompositeIndex<'_> {
|
||||
as_readonly_impl(repo).as_composite()
|
||||
}
|
||||
|
||||
fn as_mutable_impl(repo: &MutableRepo) -> &MutableIndexImpl {
|
||||
repo.index()
|
||||
.as_any()
|
||||
|
@ -473,8 +464,12 @@ fn as_mutable_impl(repo: &MutableRepo) -> &MutableIndexImpl {
|
|||
.unwrap()
|
||||
}
|
||||
|
||||
fn as_mutable_composite(repo: &MutableRepo) -> CompositeIndex<'_> {
|
||||
as_mutable_impl(repo).as_composite()
|
||||
}
|
||||
|
||||
fn commits_by_level(repo: &Arc<ReadonlyRepo>) -> Vec<u32> {
|
||||
as_readonly_impl(repo)
|
||||
as_readonly_composite(repo)
|
||||
.stats()
|
||||
.levels
|
||||
.iter()
|
||||
|
@ -555,7 +550,7 @@ fn test_index_store_type(use_git: bool) {
|
|||
let test_repo = TestRepo::init(use_git);
|
||||
let repo = &test_repo.repo;
|
||||
|
||||
assert_eq!(as_readonly_impl(repo).num_commits(), 1);
|
||||
assert_eq!(as_readonly_composite(repo).num_commits(), 1);
|
||||
let index_store_type_path = repo.repo_path().join("index").join("type");
|
||||
assert_eq!(
|
||||
std::fs::read_to_string(&index_store_type_path).unwrap(),
|
||||
|
@ -569,5 +564,5 @@ fn test_index_store_type(use_git: bool) {
|
|||
std::fs::read_to_string(&index_store_type_path).unwrap(),
|
||||
"default"
|
||||
);
|
||||
assert_eq!(as_readonly_impl(&repo).num_commits(), 1);
|
||||
assert_eq!(as_readonly_composite(&repo).num_commits(), 1);
|
||||
}
|
||||
|
|
|
@ -3183,7 +3183,7 @@ fn cmd_debug(
|
|||
let index_impl: Option<&ReadonlyIndexWrapper> =
|
||||
repo.readonly_index().as_any().downcast_ref();
|
||||
if let Some(index_impl) = index_impl {
|
||||
let stats = index_impl.stats();
|
||||
let stats = index_impl.as_composite().stats();
|
||||
writeln!(ui, "Number of commits: {}", stats.num_commits)?;
|
||||
writeln!(ui, "Number of merges: {}", stats.num_merges)?;
|
||||
writeln!(ui, "Max generation number: {}", stats.max_generation_number)?;
|
||||
|
@ -3218,7 +3218,7 @@ fn cmd_debug(
|
|||
writeln!(
|
||||
ui,
|
||||
"Finished indexing {:?} commits.",
|
||||
index_impl.stats().num_commits
|
||||
index_impl.as_composite().stats().num_commits
|
||||
)?;
|
||||
} else {
|
||||
return Err(user_error(format!(
|
||||
|
|
Loading…
Reference in a new issue