Skip to content

Filter expression

FinalGit support a powerful filter expression to filter commits.

Usage

When you input $ in the commit filter. Then you will use the filter expression.

here is some examples:

expression meaning
since=2020-01-02 get commits since 2020-01-02
HEAD~1 commits before HEAD~1
123456 234567 pick commit 123456 and 234567
author=cathaysia commits with author is cathaysia
123456..234567 commits in range [123456, 234567)

reference

// ex: set ft=antlr:
// https://git-scm.com/docs/revisions#Documentation/revisions.txt
// https://git-scm.com/docs/git-rev-list/zh_HANS-CN
grammar reversion;
import reversionRules;
@header {
    // @ts-ignore
}

reversion: rules EOF;

rules: rev # revSingle
    | rev_expression # revExpression
    | 'since' '=' date # revSince
    | 'until' '=' date # revUntil
    | 'after' '=' date # revAfter
    | 'skip' '=' DIGIT # revSkip
    | 'before' '=' date # revBefore
    | 'max-age' '=' date # revMaxAge
    | 'min-age' '=' date # revMinAge
    | 'author' '=' ANY+ # revAuthor
    | 'commiter' '=' ANY+ # revCommiter
    | 'grep' '=' ANY+ # revGrep
    | 'exclude' '=' rules # revExclude
    | rules '..' # revRangeAfter1
    | rules '...' # revRangeAfter2
    | rules (' ' rules)+ # revMulti
    | rules '..' rules # revRange1
    | rules '...' rules # revRange2
    | '..' rules # revRangeBefore1
    | '...' rules # revRangeBefore2
    ;

rev: refname # refName
    | OID # refOID
    | '^' rev # refExclude
    ;

refname: 'HEAD'
    | '@'
    ;

rev_expression: rev rev_direction rev_position # exprPos
    | rev rev_direction DIGIT # exprDigit
    | ':/' (ANY | ' ')+ # exprText
    | rev ':' ANY+ # exprRevText
    | ':' DIGIT ':' ANY+ # exprDigitText
    ;

rev_position: '@' # posHead
    | '!' # posExclude
    | SIGNED_DIGIT # posNeg
    | '-' # posReverse
    | '{' ref_anchor? '}' # posAnchor
    ;

rev_direction: '@'
    | '^'
    | '~'
    ;

ref_anchor: date # anchorDate
    | SIGNED_DIGIT # anchorSignedDigit
    | DIGIT # anchorDigit
    | '/' ANY+? # anchorText
    | iso_8601 # anchorIso
    ;

date: 'yesterday' # dateYesterday
    | 'today' # dateToday
    | iso_8601 # dateIso8601
    | time_point (' ' time_point)* ' ' time_direction # dateTimePoint
    ;

time_point: time_value ' ' time_unit # timePointValue
    | DIGIT ' ' time_unit # timePointDigit
    ;

time_value: 'one'
    | 'two'
    | 'three'
    | 'four'
    | 'five'
    | 'six'
    | 'seven'
    | 'eight'
    | 'nine'
    | 'ten'
    ;

time_unit: 'second'
    | 'minute'
    | 'hour'
    | 'day'
    | 'week'
    | 'month'
    | 'year'
    | 'seconds'
    | 'minutes'
    | 'hours'
    | 'days'
    | 'weeks'
    | 'months'
    | 'years'
    ;

time_direction: 'ago' | 'after' ;

// iso 8061
iso_8601: ISO_DATE (' ' ISO_TIME IS_TIME_POSTFIX?)?
    ;