# github.com/mjackson/citrus/blob/master/doc/syntax.markdown
grammar CommitMessageParser
rule commit_message (anything commit_directive*) { captures(:commit_directive).map(&:value).flatten.uniq.sort } end rule commit_directive ('[' space commit_fragment+ ']' anything) { captures(:commit_fragment).map(&:value).flatten } end rule commit_fragment (finishes? story_id+ space) { captures(:story_id).map(&:value) } end rule finishes # shortest versions go at the end (e.g. "finish" comes after the longer variants) (`finishes` | `finished` | `finish` | `fixes` | `fixed` | `fix` | `completes` | `completed` | `complete`) space end rule story_id ('#'? number space) { capture(:number).value } end rule number [0-9]+ { to_s } end rule space [ ,\t\n]* end rule anything ([^\[] | '[' !(finishes | story_id))* end
end