From c03be2e03572256abf3aeeead4c0766e75e0c1b3 Mon Sep 17 00:00:00 2001 From: Martin von Zweigbergk Date: Wed, 31 Mar 2021 14:07:53 -0700 Subject: [PATCH] commands: make skip_uninteresting_heads() work on CommitIds --- src/commands.rs | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/commands.rs b/src/commands.rs index 139c3a9e3..c6db9e96d 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -134,13 +134,11 @@ fn resolve_single_rev( } else if revision_str.starts_with("desc(") && revision_str.ends_with(')') { let needle = revision_str[5..revision_str.len() - 1].to_string(); let mut matches = vec![]; - let heads: HashSet = repo - .view() - .heads() + let head_ids = skip_uninteresting_heads(repo, &repo.view().heads()); + let heads: Vec<_> = head_ids .iter() - .map(|commit_id| repo.store().get_commit(commit_id).unwrap()) + .map(|id| repo.store().get_commit(&id).unwrap()) .collect(); - let heads = skip_uninteresting_heads(repo, heads); for commit in walk_ancestors(heads) { if commit.description().contains(&needle) { matches.push(commit); @@ -994,23 +992,28 @@ fn graph_log_template(settings: &UserSettings) -> String { .unwrap_or_else(|_| String::from(default_template)) } -fn skip_uninteresting_heads(repo: &ReadonlyRepo, heads: HashSet) -> HashSet { +fn skip_uninteresting_heads(repo: &ReadonlyRepo, heads: &HashSet) -> HashSet { + let index = repo.index(); let checkout_id = repo.view().checkout().clone(); let mut result = HashSet::new(); - let mut work: Vec<_> = heads.into_iter().collect(); + let mut work: Vec<_> = heads + .iter() + .map(|id| index.entry_by_id(id).unwrap()) + .collect(); let evolution = repo.evolution(); while !work.is_empty() { - let commit = work.pop().unwrap(); - if result.contains(&commit) { + let index_entry = work.pop().unwrap(); + let commit_id = index_entry.commit_id(); + if result.contains(&commit_id) { continue; } - if (!commit.is_pruned() && !evolution.is_obsolete(commit.id())) - || commit.id() == &checkout_id + if (!index_entry.is_pruned() && !evolution.is_obsolete(&commit_id)) + || commit_id == checkout_id { - result.insert(commit); + result.insert(commit_id); } else { - for parent in commit.parents() { - work.push(parent); + for parent_entry in index_entry.parents() { + work.push(parent_entry); } } } @@ -1050,17 +1053,12 @@ fn cmd_log( styler.add_label(String::from("log")); let store = repo.store(); - let mut heads: HashSet<_> = repo - .view() - .heads() - .iter() - .map(|id| store.get_commit(id).unwrap()) - .collect(); + let mut head_ids = repo.view().heads().clone(); if !sub_matches.is_present("all") { - heads = skip_uninteresting_heads(&repo, heads); + head_ids = skip_uninteresting_heads(&repo, repo.view().heads()); }; - let head_ids: Vec<_> = heads.iter().map(|commit| commit.id().clone()).collect(); + let head_ids: Vec<_> = head_ids.into_iter().collect(); let index = repo.index(); let index_entries = index.walk_revs(&head_ids, &[]); if use_graph {