mirror of
https://github.com/martinvonz/jj.git
synced 2024-10-24 15:43:12 +00:00
index: extract a function for removing ancestors of set based on positions
We already have the `heads()` function, which works on `CommitId`s. This just extracts a function that works on positions. I'll use it soon.
This commit is contained in:
parent
def1a2de95
commit
1481935472
1 changed files with 19 additions and 14 deletions
|
@ -735,19 +735,30 @@ impl<'a> CompositeIndex<'a> {
|
||||||
|
|
||||||
pub fn heads<'candidates>(
|
pub fn heads<'candidates>(
|
||||||
&self,
|
&self,
|
||||||
candidates: impl IntoIterator<Item = &'candidates CommitId>,
|
candidate_ids: impl IntoIterator<Item = &'candidates CommitId>,
|
||||||
) -> Vec<CommitId> {
|
) -> Vec<CommitId> {
|
||||||
|
let candidate_positions: HashSet<_> = candidate_ids
|
||||||
|
.into_iter()
|
||||||
|
.map(|id| self.commit_id_to_pos(id).unwrap())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut heads: Vec<_> = self
|
||||||
|
.heads_pos(candidate_positions)
|
||||||
|
.iter()
|
||||||
|
.map(|pos| self.entry_by_pos(*pos).commit_id())
|
||||||
|
.collect();
|
||||||
|
heads.sort();
|
||||||
|
heads
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn heads_pos(&self, mut candidate_positions: HashSet<u32>) -> HashSet<u32> {
|
||||||
// Add all parents of the candidates to the work queue. The parents and their
|
// Add all parents of the candidates to the work queue. The parents and their
|
||||||
// ancestors are not heads.
|
// ancestors are not heads.
|
||||||
// Also find the smallest generation number among the candidates.
|
// Also find the smallest generation number among the candidates.
|
||||||
let mut work = BinaryHeap::new();
|
let mut work = BinaryHeap::new();
|
||||||
let mut min_generation = std::u32::MAX;
|
let mut min_generation = std::u32::MAX;
|
||||||
let mut candidate_positions = HashSet::new();
|
for pos in &candidate_positions {
|
||||||
for entry in candidates
|
let entry = self.entry_by_pos(*pos);
|
||||||
.into_iter()
|
|
||||||
.map(|id| self.entry_by_id(id).unwrap())
|
|
||||||
{
|
|
||||||
candidate_positions.insert(entry.pos);
|
|
||||||
min_generation = min(min_generation, entry.generation_number());
|
min_generation = min(min_generation, entry.generation_number());
|
||||||
for parent_pos in entry.parents_positions() {
|
for parent_pos in entry.parents_positions() {
|
||||||
work.push(IndexEntryByGeneration(self.entry_by_pos(parent_pos)));
|
work.push(IndexEntryByGeneration(self.entry_by_pos(parent_pos)));
|
||||||
|
@ -771,13 +782,7 @@ impl<'a> CompositeIndex<'a> {
|
||||||
work.push(IndexEntryByGeneration(self.entry_by_pos(parent_pos)));
|
work.push(IndexEntryByGeneration(self.entry_by_pos(parent_pos)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
candidate_positions
|
||||||
let mut heads: Vec<_> = candidate_positions
|
|
||||||
.iter()
|
|
||||||
.map(|pos| self.entry_by_pos(*pos).commit_id())
|
|
||||||
.collect();
|
|
||||||
heads.sort();
|
|
||||||
heads
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue