ok/jj
1
0
Fork 0
forked from mirrors/jj

evolution: keep track of non-obsolete commits per change id

I'm about to make the evolution state updated incrementally. To be
able to tell if a new commit is divergent, we'll need to keep track of
already existing, non-obsolete commits in the change, even if they're
not divergent before the new commit is added.
This commit is contained in:
Martin von Zweigbergk 2020-12-23 17:21:26 -08:00
parent 6807407814
commit ea7a6b9ce1

View file

@ -37,7 +37,9 @@ struct State {
obsolete_commits: HashSet<CommitId>, obsolete_commits: HashSet<CommitId>,
pruned_commits: HashSet<CommitId>, pruned_commits: HashSet<CommitId>,
orphan_commits: HashSet<CommitId>, orphan_commits: HashSet<CommitId>,
divergent_changes: HashMap<ChangeId, HashSet<CommitId>>, /// If there's more than one element in the value, then the change is
/// divergent.
non_obsoletes_by_changeid: HashMap<ChangeId, HashSet<CommitId>>,
} }
impl State { impl State {
@ -83,15 +85,15 @@ impl State {
} }
} }
} }
// Find divergent commits // Find non-obsolete commits by change id (potentially divergent commits)
for (change_id, commit_ids) in change_to_commits { for (change_id, commit_ids) in change_to_commits {
let divergent: HashSet<CommitId> = commit_ids let non_obsoletes: HashSet<CommitId> = commit_ids
.difference(&state.obsolete_commits) .difference(&state.obsolete_commits)
.cloned() .cloned()
.collect(); .collect();
if divergent.len() > 1 { state
state.divergent_changes.insert(change_id, divergent); .non_obsoletes_by_changeid
} .insert(change_id, non_obsoletes);
} }
// Find orphans by walking to the children of obsolete commits // Find orphans by walking to the children of obsolete commits
let mut work: Vec<CommitId> = state.obsolete_commits.iter().cloned().collect(); let mut work: Vec<CommitId> = state.obsolete_commits.iter().cloned().collect();
@ -133,7 +135,9 @@ impl State {
} }
fn is_divergent(&self, change_id: &ChangeId) -> bool { fn is_divergent(&self, change_id: &ChangeId) -> bool {
self.divergent_changes.contains_key(change_id) self.non_obsoletes_by_changeid
.get(change_id)
.map_or(false, |non_obsoletes| non_obsoletes.len() > 1)
} }
pub fn new_parent(&self, store: &StoreWrapper, old_parent_id: &CommitId) -> HashSet<CommitId> { pub fn new_parent(&self, store: &StoreWrapper, old_parent_id: &CommitId) -> HashSet<CommitId> {
@ -357,8 +361,9 @@ pub fn evolve(
.as_repo_mut() .as_repo_mut()
.evolution_mut() .evolution_mut()
.state .state
.divergent_changes .non_obsoletes_by_changeid
.values() .values()
.filter(|non_obsoletes| non_obsoletes.len() > 1)
.cloned() .cloned()
.collect(); .collect();
for commit_ids in divergent_changes { for commit_ids in divergent_changes {