Skip to content

Commit 8d8c21a

Browse files
committed
refactor(dag): extract query_stack_commits to Dag
So that we can use this logic in `git-branchless-submit`, which wants to be fundamentally aware of commit stacks as part of submitting.
1 parent c2f6207 commit 8d8c21a

File tree

2 files changed

+27
-22
lines changed

2 files changed

+27
-22
lines changed

git-branchless-lib/src/core/dag.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,30 @@ impl Dag {
527527
})
528528
}
529529

530+
/// Determine the connected components among draft commits (commit "stacks")
531+
/// that intersect with the provided set.
532+
#[instrument]
533+
pub fn query_stack_commits(&self, commit_set: CommitSet) -> eyre::Result<CommitSet> {
534+
let draft_commits = self.query_draft_commits()?;
535+
let stack_roots = self.query_roots(draft_commits.clone())?;
536+
let stack_ancestors = self.query_range(stack_roots, commit_set)?;
537+
let stack = self
538+
// Note that for a graph like
539+
//
540+
// ```
541+
// O
542+
// |
543+
// o A
544+
// | \
545+
// | o B
546+
// |
547+
// @ C
548+
// ```
549+
// this will return `{A, B, C}`, not just `{A, C}`.
550+
.query_range(stack_ancestors, draft_commits.clone())?;
551+
Ok(stack)
552+
}
553+
530554
/// Wrapper around DAG method.
531555
#[instrument]
532556
pub fn query_all(&self) -> eyre::Result<CommitSet> {

git-branchless-revset/src/builtins.rs

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -290,28 +290,9 @@ fn fn_draft(ctx: &mut Context, name: &str, args: &[Expr]) -> EvalResult {
290290
#[instrument]
291291
fn fn_stack(ctx: &mut Context, name: &str, args: &[Expr]) -> EvalResult {
292292
let arg = eval0_or_1(ctx, name, args)?.unwrap_or_else(|| ctx.dag.head_commit.clone());
293-
let draft_commits = ctx
294-
.dag
295-
.query_draft_commits()
296-
.map_err(EvalError::OtherError)?;
297-
let stack_roots = ctx.dag.query_roots(draft_commits.clone())?;
298-
let stack_ancestors = ctx.dag.query_range(stack_roots, arg)?;
299-
let stack = ctx
300-
.dag
301-
// Note that for a graph like
302-
//
303-
// ```
304-
// O
305-
// |
306-
// o A
307-
// | \
308-
// | o B
309-
// |
310-
// @ C
311-
// ```
312-
// this will return `{A, B, C}`, not just `{A, C}`.
313-
.query_range(stack_ancestors, draft_commits.clone())?;
314-
Ok(stack)
293+
ctx.dag
294+
.query_stack_commits(arg)
295+
.map_err(EvalError::OtherError)
315296
}
316297

317298
type MatcherFn = dyn Fn(&Repo, &Commit) -> Result<bool, PatternError> + Sync + Send;

0 commit comments

Comments
 (0)