mirror of
https://github.com/martinvonz/jj.git
synced 2025-05-30 03:21:12 +00:00
revset_graph: remove unneeded Vec<IndexGraphEdge> cloning
This commit is contained in:
parent
8dc59a3d69
commit
dd5cc843da
@ -24,7 +24,7 @@ use crate::revset_graph::{RevsetGraphEdge, RevsetGraphEdgeType};
|
|||||||
/// Like `RevsetGraphEdge`, but stores `IndexPosition` instead.
|
/// Like `RevsetGraphEdge`, but stores `IndexPosition` instead.
|
||||||
///
|
///
|
||||||
/// This can be cheaply allocated and hashed compared to `CommitId`-based type.
|
/// This can be cheaply allocated and hashed compared to `CommitId`-based type.
|
||||||
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
||||||
struct IndexGraphEdge {
|
struct IndexGraphEdge {
|
||||||
target: IndexPosition,
|
target: IndexPosition,
|
||||||
edge_type: RevsetGraphEdgeType,
|
edge_type: RevsetGraphEdgeType,
|
||||||
@ -46,7 +46,7 @@ impl IndexGraphEdge {
|
|||||||
IndexGraphEdge { target, edge_type }
|
IndexGraphEdge { target, edge_type }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_revset_edge(&self, index: CompositeIndex<'_>) -> RevsetGraphEdge {
|
fn to_revset_edge(self, index: CompositeIndex<'_>) -> RevsetGraphEdge {
|
||||||
RevsetGraphEdge {
|
RevsetGraphEdge {
|
||||||
target: index.entry_by_pos(self.target).commit_id(),
|
target: index.entry_by_pos(self.target).commit_id(),
|
||||||
edge_type: self.edge_type,
|
edge_type: self.edge_type,
|
||||||
@ -165,13 +165,14 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
|
|||||||
fn edges_from_internal_commit(
|
fn edges_from_internal_commit(
|
||||||
&mut self,
|
&mut self,
|
||||||
index_entry: &IndexEntry<'index>,
|
index_entry: &IndexEntry<'index>,
|
||||||
) -> Vec<IndexGraphEdge> {
|
) -> &[IndexGraphEdge] {
|
||||||
if let Some(edges) = self.edges.get(&index_entry.position()) {
|
let position = index_entry.position();
|
||||||
return edges.clone();
|
// `if let Some(edges) = ...` doesn't pass lifetime check as of Rust 1.71.0
|
||||||
|
if self.edges.contains_key(&position) {
|
||||||
|
return self.edges.get(&position).unwrap();
|
||||||
}
|
}
|
||||||
let edges = self.new_edges_from_internal_commit(index_entry);
|
let edges = self.new_edges_from_internal_commit(index_entry);
|
||||||
self.edges.insert(index_entry.position(), edges.clone());
|
self.edges.entry(position).or_insert(edges)
|
||||||
edges
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pop_edges_from_internal_commit(
|
fn pop_edges_from_internal_commit(
|
||||||
@ -210,7 +211,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
|
|||||||
} else {
|
} else {
|
||||||
edges.extend(
|
edges.extend(
|
||||||
parent_edges
|
parent_edges
|
||||||
.into_iter()
|
.iter()
|
||||||
.filter(|edge| known_ancestors.insert(edge.target)),
|
.filter(|edge| known_ancestors.insert(edge.target)),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -219,10 +220,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
|
|||||||
edges
|
edges
|
||||||
}
|
}
|
||||||
|
|
||||||
fn edges_from_external_commit(
|
fn edges_from_external_commit(&mut self, index_entry: IndexEntry<'index>) -> &[IndexGraphEdge] {
|
||||||
&mut self,
|
|
||||||
index_entry: IndexEntry<'index>,
|
|
||||||
) -> Vec<IndexGraphEdge> {
|
|
||||||
let position = index_entry.position();
|
let position = index_entry.position();
|
||||||
let mut stack = vec![index_entry];
|
let mut stack = vec![index_entry];
|
||||||
while let Some(entry) = stack.last() {
|
while let Some(entry) = stack.last() {
|
||||||
@ -250,8 +248,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
|
|||||||
edges.extend(
|
edges.extend(
|
||||||
parent_edges
|
parent_edges
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|edge| known_ancestors.insert(edge.target))
|
.filter(|edge| known_ancestors.insert(edge.target)),
|
||||||
.cloned(),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else if parent_position < self.min_position {
|
} else if parent_position < self.min_position {
|
||||||
@ -269,7 +266,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
|
|||||||
self.edges.insert(position, edges);
|
self.edges.insert(position, edges);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.edges.get(&position).unwrap().clone()
|
self.edges.get(&position).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_transitive_edges(&mut self, edges: Vec<IndexGraphEdge>) -> Vec<IndexGraphEdge> {
|
fn remove_transitive_edges(&mut self, edges: Vec<IndexGraphEdge>) -> Vec<IndexGraphEdge> {
|
||||||
@ -288,7 +285,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
|
|||||||
if edge.edge_type != RevsetGraphEdgeType::Missing {
|
if edge.edge_type != RevsetGraphEdgeType::Missing {
|
||||||
let entry = self.look_ahead.get(&edge.target).unwrap().clone();
|
let entry = self.look_ahead.get(&edge.target).unwrap().clone();
|
||||||
min_generation = min(min_generation, entry.generation_number());
|
min_generation = min(min_generation, entry.generation_number());
|
||||||
work.extend(self.edges_from_internal_commit(&entry));
|
work.extend_from_slice(self.edges_from_internal_commit(&entry));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Find commits reachable transitively and add them to the `unwanted` set.
|
// Find commits reachable transitively and add them to the `unwanted` set.
|
||||||
@ -309,7 +306,7 @@ impl<'revset, 'index> RevsetGraphIterator<'revset, 'index> {
|
|||||||
if entry.generation_number() < min_generation {
|
if entry.generation_number() < min_generation {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
work.extend(self.edges_from_internal_commit(&entry));
|
work.extend_from_slice(self.edges_from_internal_commit(&entry));
|
||||||
}
|
}
|
||||||
|
|
||||||
edges
|
edges
|
||||||
|
Loading…
x
Reference in New Issue
Block a user