mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-18 02:04:19 +00:00
repo: make ReadonlyRepo::index()
return a &dyn Index
This is just a little preparation for extracting a `Repo` trait that's implemented by both `ReadonlyRepo` and `MutableRepo`. The `index()` function in that trait will of course have to return the same type in both implementations, and that type will be `&dyn Index`.
This commit is contained in:
parent
3c61e9239c
commit
8a067282c8
7 changed files with 41 additions and 41 deletions
|
@ -81,7 +81,7 @@ impl<'a> RepoRef<'a> {
|
|||
|
||||
pub fn index(&self) -> &'a dyn Index {
|
||||
match self {
|
||||
RepoRef::Readonly(repo) => repo.index().as_ref(),
|
||||
RepoRef::Readonly(repo) => repo.index(),
|
||||
RepoRef::Mutable(repo) => repo.index(),
|
||||
}
|
||||
}
|
||||
|
@ -265,13 +265,17 @@ impl ReadonlyRepo {
|
|||
&self.view
|
||||
}
|
||||
|
||||
pub fn index(&self) -> &Arc<ReadonlyIndex> {
|
||||
pub fn readonly_index(&self) -> &Arc<ReadonlyIndex> {
|
||||
self.index.get_or_init(|| {
|
||||
self.index_store
|
||||
.get_index_at_op(&self.operation, &self.store)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn index(&self) -> &dyn Index {
|
||||
self.readonly_index().as_ref()
|
||||
}
|
||||
|
||||
fn change_id_index(&self) -> &ChangeIdIndex {
|
||||
self.change_id_index.get_or_init(|| {
|
||||
let heads = self.view().heads().iter().cloned().collect_vec();
|
||||
|
@ -321,7 +325,7 @@ impl ReadonlyRepo {
|
|||
user_settings: &UserSettings,
|
||||
description: &str,
|
||||
) -> Transaction {
|
||||
let mut_repo = MutableRepo::new(self.clone(), self.index().clone(), &self.view);
|
||||
let mut_repo = MutableRepo::new(self.clone(), self.readonly_index().clone(), &self.view);
|
||||
Transaction::new(mut_repo, user_settings, description)
|
||||
}
|
||||
|
||||
|
@ -975,8 +979,8 @@ impl MutableRepo {
|
|||
// merging the view. Merging in base_repo's index isn't typically
|
||||
// necessary, but it can be if base_repo is ahead of either self or other_repo
|
||||
// (e.g. because we're undoing an operation that hasn't been published).
|
||||
self.index.merge_in(base_repo.index());
|
||||
self.index.merge_in(other_repo.index());
|
||||
self.index.merge_in(base_repo.readonly_index());
|
||||
self.index.merge_in(other_repo.readonly_index());
|
||||
|
||||
self.view.ensure_clean(|v| self.enforce_view_invariants(v));
|
||||
self.merge_view(&base_repo.view, &other_repo.view);
|
||||
|
|
|
@ -17,7 +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::index::{Index, ReadonlyIndex};
|
||||
use jujutsu_lib::index::{Index};
|
||||
use jujutsu_lib::repo::{MutableRepo, ReadonlyRepo, StoreFactories};
|
||||
use jujutsu_lib::settings::UserSettings;
|
||||
use test_case::test_case;
|
||||
|
@ -32,7 +32,7 @@ fn child_commit<'repo>(
|
|||
}
|
||||
|
||||
// Helper just to reduce line wrapping
|
||||
fn generation_number(index: &Arc<ReadonlyIndex>, commit_id: &CommitId) -> u32 {
|
||||
fn generation_number(index: &dyn Index, commit_id: &CommitId) -> u32 {
|
||||
index.entry_by_id(commit_id).unwrap().generation_number()
|
||||
}
|
||||
|
||||
|
|
|
@ -50,83 +50,82 @@ fn test_merge_ref_targets() {
|
|||
let _target7 = RefTarget::Normal(commit7.id().clone());
|
||||
|
||||
let index = repo.index();
|
||||
let index_ref = index.as_ref();
|
||||
|
||||
// Left moved forward
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), Some(&target1), Some(&target1)),
|
||||
merge_ref_targets(index, Some(&target3), Some(&target1), Some(&target1)),
|
||||
Some(target3.clone())
|
||||
);
|
||||
|
||||
// Right moved forward
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target1), Some(&target1), Some(&target3)),
|
||||
merge_ref_targets(index, Some(&target1), Some(&target1), Some(&target3)),
|
||||
Some(target3.clone())
|
||||
);
|
||||
|
||||
// Left moved backward
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target1), Some(&target3), Some(&target3)),
|
||||
merge_ref_targets(index, Some(&target1), Some(&target3), Some(&target3)),
|
||||
Some(target1.clone())
|
||||
);
|
||||
|
||||
// Right moved backward
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), Some(&target3), Some(&target1)),
|
||||
merge_ref_targets(index, Some(&target3), Some(&target3), Some(&target1)),
|
||||
Some(target1.clone())
|
||||
);
|
||||
|
||||
// Left moved sideways
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target4), Some(&target3), Some(&target3)),
|
||||
merge_ref_targets(index, Some(&target4), Some(&target3), Some(&target3)),
|
||||
Some(target4.clone())
|
||||
);
|
||||
|
||||
// Right moved sideways
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), Some(&target3), Some(&target4)),
|
||||
merge_ref_targets(index, Some(&target3), Some(&target3), Some(&target4)),
|
||||
Some(target4.clone())
|
||||
);
|
||||
|
||||
// Both added same target
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), None, Some(&target3)),
|
||||
merge_ref_targets(index, Some(&target3), None, Some(&target3)),
|
||||
Some(target3.clone())
|
||||
);
|
||||
|
||||
// Left added target, right added descendant target
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target2), None, Some(&target3)),
|
||||
merge_ref_targets(index, Some(&target2), None, Some(&target3)),
|
||||
Some(target3.clone())
|
||||
);
|
||||
|
||||
// Right added target, left added descendant target
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), None, Some(&target2)),
|
||||
merge_ref_targets(index, Some(&target3), None, Some(&target2)),
|
||||
Some(target3.clone())
|
||||
);
|
||||
|
||||
// Both moved forward to same target
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), Some(&target1), Some(&target3)),
|
||||
merge_ref_targets(index, Some(&target3), Some(&target1), Some(&target3)),
|
||||
Some(target3.clone())
|
||||
);
|
||||
|
||||
// Both moved forward, left moved further
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), Some(&target1), Some(&target2)),
|
||||
merge_ref_targets(index, Some(&target3), Some(&target1), Some(&target2)),
|
||||
Some(target3.clone())
|
||||
);
|
||||
|
||||
// Both moved forward, right moved further
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target2), Some(&target1), Some(&target3)),
|
||||
merge_ref_targets(index, Some(&target2), Some(&target1), Some(&target3)),
|
||||
Some(target3.clone())
|
||||
);
|
||||
|
||||
// Left and right moved forward to divergent targets
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), Some(&target1), Some(&target4)),
|
||||
merge_ref_targets(index, Some(&target3), Some(&target1), Some(&target4)),
|
||||
Some(RefTarget::Conflict {
|
||||
removes: vec![commit1.id().clone()],
|
||||
adds: vec![commit3.id().clone(), commit4.id().clone()]
|
||||
|
@ -135,7 +134,7 @@ fn test_merge_ref_targets() {
|
|||
|
||||
// Left moved back, right moved forward
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target1), Some(&target2), Some(&target3)),
|
||||
merge_ref_targets(index, Some(&target1), Some(&target2), Some(&target3)),
|
||||
Some(RefTarget::Conflict {
|
||||
removes: vec![commit2.id().clone()],
|
||||
adds: vec![commit1.id().clone(), commit3.id().clone()]
|
||||
|
@ -144,7 +143,7 @@ fn test_merge_ref_targets() {
|
|||
|
||||
// Right moved back, left moved forward
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), Some(&target2), Some(&target1)),
|
||||
merge_ref_targets(index, Some(&target3), Some(&target2), Some(&target1)),
|
||||
Some(RefTarget::Conflict {
|
||||
removes: vec![commit2.id().clone()],
|
||||
adds: vec![commit3.id().clone(), commit1.id().clone()]
|
||||
|
@ -153,19 +152,19 @@ fn test_merge_ref_targets() {
|
|||
|
||||
// Left removed
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, None, Some(&target3), Some(&target3)),
|
||||
merge_ref_targets(index, None, Some(&target3), Some(&target3)),
|
||||
None
|
||||
);
|
||||
|
||||
// Right removed
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), Some(&target3), None),
|
||||
merge_ref_targets(index, Some(&target3), Some(&target3), None),
|
||||
None
|
||||
);
|
||||
|
||||
// Left removed, right moved forward
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, None, Some(&target1), Some(&target3)),
|
||||
merge_ref_targets(index, None, Some(&target1), Some(&target3)),
|
||||
Some(RefTarget::Conflict {
|
||||
removes: vec![commit1.id().clone()],
|
||||
adds: vec![commit3.id().clone()]
|
||||
|
@ -174,7 +173,7 @@ fn test_merge_ref_targets() {
|
|||
|
||||
// Right removed, left moved forward
|
||||
assert_eq!(
|
||||
merge_ref_targets(index_ref, Some(&target3), Some(&target1), None),
|
||||
merge_ref_targets(index, Some(&target3), Some(&target1), None),
|
||||
Some(RefTarget::Conflict {
|
||||
removes: vec![commit1.id().clone()],
|
||||
adds: vec![commit3.id().clone()]
|
||||
|
@ -184,7 +183,7 @@ fn test_merge_ref_targets() {
|
|||
// Left became conflicted, right moved forward
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&RefTarget::Conflict {
|
||||
removes: vec![commit2.id().clone()],
|
||||
adds: vec![commit3.id().clone(), commit4.id().clone()]
|
||||
|
@ -202,7 +201,7 @@ fn test_merge_ref_targets() {
|
|||
// Right became conflicted, left moved forward
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&target3),
|
||||
Some(&target1),
|
||||
Some(&RefTarget::Conflict {
|
||||
|
@ -219,7 +218,7 @@ fn test_merge_ref_targets() {
|
|||
// Existing conflict on left, right moves an "add" sideways
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&RefTarget::Conflict {
|
||||
removes: vec![commit2.id().clone()],
|
||||
adds: vec![commit3.id().clone(), commit4.id().clone()]
|
||||
|
@ -236,7 +235,7 @@ fn test_merge_ref_targets() {
|
|||
// Existing conflict on right, left moves an "add" sideways
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&target5),
|
||||
Some(&target3),
|
||||
Some(&RefTarget::Conflict {
|
||||
|
@ -254,7 +253,7 @@ fn test_merge_ref_targets() {
|
|||
// divergence
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&RefTarget::Conflict {
|
||||
removes: vec![commit2.id().clone()],
|
||||
adds: vec![commit3.id().clone(), commit4.id().clone()]
|
||||
|
@ -272,7 +271,7 @@ fn test_merge_ref_targets() {
|
|||
// divergence
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&target1),
|
||||
Some(&target3),
|
||||
Some(&RefTarget::Conflict {
|
||||
|
@ -289,7 +288,7 @@ fn test_merge_ref_targets() {
|
|||
// Existing conflict on left, right undoes one side of conflict
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&RefTarget::Conflict {
|
||||
removes: vec![commit2.id().clone()],
|
||||
adds: vec![commit3.id().clone(), commit4.id().clone()]
|
||||
|
@ -303,7 +302,7 @@ fn test_merge_ref_targets() {
|
|||
// Existing conflict on right, left undoes one side of conflict
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&target2),
|
||||
Some(&target3),
|
||||
Some(&RefTarget::Conflict {
|
||||
|
@ -317,7 +316,7 @@ fn test_merge_ref_targets() {
|
|||
// Existing conflict on left, right makes unrelated update
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&RefTarget::Conflict {
|
||||
removes: vec![commit2.id().clone()],
|
||||
adds: vec![commit3.id().clone(), commit4.id().clone()]
|
||||
|
@ -338,7 +337,7 @@ fn test_merge_ref_targets() {
|
|||
// Existing conflict on right, left makes unrelated update
|
||||
assert_eq!(
|
||||
merge_ref_targets(
|
||||
index_ref,
|
||||
index,
|
||||
Some(&target6),
|
||||
Some(&target5),
|
||||
Some(&RefTarget::Conflict {
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
// limitations under the License.
|
||||
|
||||
use itertools::Itertools;
|
||||
use jujutsu_lib::index::Index;
|
||||
use jujutsu_lib::revset::revset_for_commits;
|
||||
use jujutsu_lib::revset_graph_iterator::RevsetGraphEdge;
|
||||
use test_case::test_case;
|
||||
|
|
|
@ -3,7 +3,6 @@ use std::collections::BTreeSet;
|
|||
use clap::builder::NonEmptyStringValueParser;
|
||||
use itertools::Itertools;
|
||||
use jujutsu_lib::backend::{CommitId, ObjectId};
|
||||
use jujutsu_lib::index::Index;
|
||||
use jujutsu_lib::op_store::RefTarget;
|
||||
use jujutsu_lib::repo::RepoRef;
|
||||
use jujutsu_lib::view::View;
|
||||
|
|
|
@ -10,7 +10,6 @@ use clap::{ArgGroup, Subcommand};
|
|||
use itertools::Itertools;
|
||||
use jujutsu_lib::backend::ObjectId;
|
||||
use jujutsu_lib::git::{self, GitFetchError, GitRefUpdate};
|
||||
use jujutsu_lib::index::Index;
|
||||
use jujutsu_lib::op_store::{BranchTarget, RefTarget};
|
||||
use jujutsu_lib::refs::{classify_branch_push_action, BranchPushAction, BranchPushUpdate};
|
||||
use jujutsu_lib::repo::RepoRef;
|
||||
|
|
|
@ -1818,7 +1818,7 @@ fn cmd_duplicate(
|
|||
|
||||
let mut tx = workspace_command
|
||||
.start_transaction(&format!("duplicating {} commit(s)", to_duplicate.len()));
|
||||
let index = tx.base_repo().index().clone();
|
||||
let index = tx.base_repo().readonly_index().clone();
|
||||
let store = tx.base_repo().store().clone();
|
||||
let mut_repo = tx.mut_repo();
|
||||
|
||||
|
|
Loading…
Reference in a new issue