diff --git a/git-branchless-lib/src/core/dag.rs b/git-branchless-lib/src/core/dag.rs
index 72589ad4f..e1026315a 100644
--- a/git-branchless-lib/src/core/dag.rs
+++ b/git-branchless-lib/src/core/dag.rs
@@ -296,28 +296,6 @@ impl Dag {
Ok(dag)
}
- /// Get one of the merge-base OIDs for the given pair of OIDs. If there are
- /// multiple possible merge-bases, one is arbitrarily returned.
- #[instrument]
- pub fn get_one_merge_base_oid(
- &self,
- effects: &Effects,
- repo: &Repo,
- lhs_oid: NonZeroOid,
- rhs_oid: NonZeroOid,
- ) -> eyre::Result> {
- let set = vec![CommitVertex::from(lhs_oid), CommitVertex::from(rhs_oid)];
- let set = self
- .inner
- .sort(&CommitSet::from_static_names(set))
- .wrap_err("Sorting DAG vertex set")?;
- let vertex = self.inner.gca_one(set).wrap_err("Computing merge-base")?;
- match vertex {
- None => Ok(None),
- Some(vertex) => Ok(Some(vertex.to_hex().parse()?)),
- }
- }
-
/// Get the parent OID for the given OID. Returns an error if the given OID
/// does not have exactly 1 parent.
#[instrument]
@@ -429,32 +407,6 @@ impl Dag {
})
}
- /// Find a path from the provided head to its merge-base with the main
- /// branch.
- #[instrument]
- pub fn find_path_to_main_branch(
- &self,
- effects: &Effects,
- head: CommitSet,
- ) -> eyre::Result > {
- // FIXME: this assumes that there is only one merge-base with the main branch.
- let merge_base = {
- let (_effects, _progress) = effects.start_operation(OperationType::GetMergeBase);
- self.query().gca_one(self.main_branch_commit.union(&head))?
- };
- let merge_base = match merge_base {
- Some(merge_base) => merge_base,
- None => return Ok(None),
- };
-
- // FIXME: this assumes that there is only one path to the merge-base.
- let path = {
- let (_effects, _progress) = effects.start_operation(OperationType::FindPathToMergeBase);
- self.query().range(CommitSet::from(merge_base), head)?
- };
- Ok(Some(path))
- }
-
/// Given a CommitSet, return a list of CommitSets, each representing a
/// connected component of the set.
///
diff --git a/git-branchless/src/commands/move.rs b/git-branchless/src/commands/move.rs
index 3e987eead..afe63dd0e 100644
--- a/git-branchless/src/commands/move.rs
+++ b/git-branchless/src/commands/move.rs
@@ -8,7 +8,7 @@ use std::convert::TryFrom;
use std::fmt::Write;
use std::time::SystemTime;
-use eden_dag::DagAlgorithm;
+use eden_dag::{DagAlgorithm, VertexName};
use lib::core::repo_ext::RepoExt;
use lib::util::ExitCode;
use rayon::ThreadPoolBuilder;
@@ -32,7 +32,7 @@ use lib::git::{GitRunInfo, NonZeroOid, Repo};
#[instrument]
fn resolve_base_commit(
dag: &Dag,
- merge_base_oid: Option,
+ merge_base_oid: Option,
oid: NonZeroOid,
) -> eyre::Result {
let bases = match merge_base_oid {
@@ -207,7 +207,9 @@ pub fn r#move(
let base_oids = {
let mut result = Vec::new();
for base_oid in commit_set_to_vec(&base_oids)? {
- let merge_base_oid = dag.get_one_merge_base_oid(effects, &repo, base_oid, dest_oid)?;
+ let merge_base_oid = dag
+ .query()
+ .gca_one(vec![base_oid, dest_oid].into_iter().collect::())?;
let base_commit_oid = resolve_base_commit(&dag, merge_base_oid, base_oid)?;
result.push(CommitSet::from(base_commit_oid))
}
diff --git a/git-branchless/src/commands/smartlog.rs b/git-branchless/src/commands/smartlog.rs
index 7a1b8d488..7ecd95df6 100644
--- a/git-branchless/src/commands/smartlog.rs
+++ b/git-branchless/src/commands/smartlog.rs
@@ -231,14 +231,20 @@ mod graph {
// Find the nearest ancestor that is included in the graph and
// also on the same branch.
- let nearest_branch_ancestor = match dag
- .find_path_to_main_branch(effects, CommitSet::from(parent_oid))?
- {
- Some(path_to_main_branch) => dag.query().heads_ancestors(
- path_to_main_branch.intersection(&graph_vertices),
- )?,
+ let parent_set = CommitSet::from(parent_oid);
+ let merge_base = dag
+ .query()
+ .gca_one(dag.main_branch_commit.union(&parent_set))?;
+
+ let path_to_main_branch = match merge_base {
+ Some(merge_base) => {
+ dag.query().range(CommitSet::from(merge_base), parent_set)?
+ }
None => CommitSet::empty(),
};
+ let nearest_branch_ancestor = dag
+ .query()
+ .heads_ancestors(path_to_main_branch.intersection(&graph_vertices))?;
let ancestor_oids = commit_set_to_vec(&nearest_branch_ancestor)?;
for ancestor_oid in ancestor_oids.iter() {
@@ -414,6 +420,7 @@ mod graph {
mod render {
use std::cmp::Ordering;
use std::collections::HashSet;
+ use std::convert::TryFrom;
use cursive::theme::Effect;
use cursive::utils::markup::StyledString;
@@ -440,7 +447,6 @@ mod render {
/// Returns the list such that the topologically-earlier subgraphs are first in
/// the list (i.e. those that would be rendered at the bottom of the smartlog).
fn split_commit_graph_by_roots(
- effects: &Effects,
repo: &Repo,
dag: &Dag,
graph: &SmartlogGraph,
@@ -465,10 +471,13 @@ mod render {
_ => return lhs_oid.cmp(rhs_oid),
};
- let merge_base_oid = dag.get_one_merge_base_oid(effects, repo, *lhs_oid, *rhs_oid);
+ let merge_base_oid = dag
+ .query()
+ .gca_one(vec![*lhs_oid, *rhs_oid].into_iter().collect::());
let merge_base_oid = match merge_base_oid {
Err(_) => return lhs_oid.cmp(rhs_oid),
- Ok(merge_base_oid) => merge_base_oid,
+ Ok(None) => None,
+ Ok(Some(merge_base_oid)) => NonZeroOid::try_from(merge_base_oid).ok(),
};
match merge_base_oid {
@@ -698,7 +707,7 @@ mod render {
head_oid: Option,
commit_descriptors: &mut [&mut dyn NodeDescriptor],
) -> eyre::Result> {
- let root_oids = split_commit_graph_by_roots(effects, repo, dag, graph);
+ let root_oids = split_commit_graph_by_roots(repo, dag, graph);
let lines = get_output(
effects.get_glyphs(),
dag,