Skip to content

Commit 57011ca

Browse files
feat(revset): use hints to optimize revset evals
1 parent 11fe9b9 commit 57011ca

File tree

1 file changed

+31
-18
lines changed

1 file changed

+31
-18
lines changed

git-branchless-revset/src/builtins.rs

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,12 @@ fn fn_heads(ctx: &mut Context, name: &str, args: &[Expr], _: &Option<&CommitSet>
199199
}
200200

201201
#[instrument]
202-
fn fn_branches(ctx: &mut Context, name: &str, args: &[Expr], _: &Option<&CommitSet>) -> EvalResult {
202+
fn fn_branches(
203+
ctx: &mut Context,
204+
name: &str,
205+
args: &[Expr],
206+
commitset_hint: &Option<&CommitSet>,
207+
) -> EvalResult {
203208
let pattern = match eval0_or_1_pattern(ctx, name, args)? {
204209
Some(pattern) => pattern,
205210
None => return Ok(ctx.dag.branch_commits.clone()),
@@ -212,7 +217,10 @@ fn fn_branches(ctx: &mut Context, name: &str, args: &[Expr], _: &Option<&CommitS
212217
.map_err(EvalError::OtherError)?
213218
.branch_oid_to_names;
214219

215-
let commitset_hint = ctx.dag.branch_commits.clone();
220+
let commitset_hint = match commitset_hint {
221+
Some(hint) => hint.intersection(&ctx.dag.branch_commits),
222+
None => ctx.dag.branch_commits.clone(),
223+
};
216224
let branch_commits = make_pattern_matcher(
217225
ctx,
218226
name,
@@ -362,7 +370,12 @@ fn make_pattern_matcher(
362370
}
363371

364372
#[instrument]
365-
fn fn_message(ctx: &mut Context, name: &str, args: &[Expr], _: &Option<&CommitSet>) -> EvalResult {
373+
fn fn_message(
374+
ctx: &mut Context,
375+
name: &str,
376+
args: &[Expr],
377+
commits_to_match: &Option<&CommitSet>,
378+
) -> EvalResult {
366379
let pattern = eval1_pattern(ctx, name, args)?;
367380
make_pattern_matcher(
368381
ctx,
@@ -384,7 +397,7 @@ fn fn_message(ctx: &mut Context, name: &str, args: &[Expr], _: &Option<&CommitSe
384397
};
385398
Ok(pattern.matches_text(message))
386399
}),
387-
&None,
400+
commits_to_match,
388401
)
389402
}
390403

@@ -393,7 +406,7 @@ fn fn_path_changed(
393406
ctx: &mut Context,
394407
name: &str,
395408
args: &[Expr],
396-
_: &Option<&CommitSet>,
409+
commits_to_match: &Option<&CommitSet>,
397410
) -> EvalResult {
398411
let pattern = eval1_pattern(ctx, name, args)?;
399412
make_pattern_matcher(
@@ -420,7 +433,7 @@ fn fn_path_changed(
420433
});
421434
Ok(result)
422435
}),
423-
&None,
436+
commits_to_match,
424437
)
425438
}
426439

@@ -429,7 +442,7 @@ fn fn_author_name(
429442
ctx: &mut Context,
430443
name: &str,
431444
args: &[Expr],
432-
_: &Option<&CommitSet>,
445+
commits_to_match: &Option<&CommitSet>,
433446
) -> EvalResult {
434447
let pattern = eval1_pattern(ctx, name, args)?;
435448
make_pattern_matcher(
@@ -442,7 +455,7 @@ fn fn_author_name(
442455
None => Ok(false),
443456
},
444457
),
445-
&None,
458+
commits_to_match,
446459
)
447460
}
448461

@@ -451,7 +464,7 @@ fn fn_author_email(
451464
ctx: &mut Context,
452465
name: &str,
453466
args: &[Expr],
454-
_: &Option<&CommitSet>,
467+
commits_to_match: &Option<&CommitSet>,
455468
) -> EvalResult {
456469
let pattern = eval1_pattern(ctx, name, args)?;
457470
make_pattern_matcher(
@@ -464,7 +477,7 @@ fn fn_author_email(
464477
None => Ok(false),
465478
},
466479
),
467-
&None,
480+
commits_to_match,
468481
)
469482
}
470483

@@ -473,7 +486,7 @@ fn fn_author_date(
473486
ctx: &mut Context,
474487
name: &str,
475488
args: &[Expr],
476-
_: &Option<&CommitSet>,
489+
commits_to_match: &Option<&CommitSet>,
477490
) -> EvalResult {
478491
let pattern = eval1_pattern(ctx, name, args)?;
479492
make_pattern_matcher(
@@ -484,7 +497,7 @@ fn fn_author_date(
484497
let time = commit.get_author().get_time();
485498
Ok(pattern.matches_date(&time))
486499
}),
487-
&None,
500+
commits_to_match,
488501
)
489502
}
490503

@@ -493,7 +506,7 @@ fn fn_committer_name(
493506
ctx: &mut Context,
494507
name: &str,
495508
args: &[Expr],
496-
_: &Option<&CommitSet>,
509+
commits_to_match: &Option<&CommitSet>,
497510
) -> EvalResult {
498511
let pattern = eval1_pattern(ctx, name, args)?;
499512
make_pattern_matcher(
@@ -506,7 +519,7 @@ fn fn_committer_name(
506519
None => Ok(false),
507520
},
508521
),
509-
&None,
522+
commits_to_match,
510523
)
511524
}
512525

@@ -515,7 +528,7 @@ fn fn_committer_email(
515528
ctx: &mut Context,
516529
name: &str,
517530
args: &[Expr],
518-
_: &Option<&CommitSet>,
531+
commits_to_match: &Option<&CommitSet>,
519532
) -> EvalResult {
520533
let pattern = eval1_pattern(ctx, name, args)?;
521534
make_pattern_matcher(
@@ -528,7 +541,7 @@ fn fn_committer_email(
528541
None => Ok(false),
529542
},
530543
),
531-
&None,
544+
commits_to_match,
532545
)
533546
}
534547

@@ -537,7 +550,7 @@ fn fn_committer_date(
537550
ctx: &mut Context,
538551
name: &str,
539552
args: &[Expr],
540-
_: &Option<&CommitSet>,
553+
commits_to_match: &Option<&CommitSet>,
541554
) -> EvalResult {
542555
let pattern = eval1_pattern(ctx, name, args)?;
543556
make_pattern_matcher(
@@ -548,7 +561,7 @@ fn fn_committer_date(
548561
let time = commit.get_committer().get_time();
549562
Ok(pattern.matches_date(&time))
550563
}),
551-
&None,
564+
commits_to_match,
552565
)
553566
}
554567

0 commit comments

Comments
 (0)