2014-10-02 19:01:10 +02:00
desc " generate a release note from the important commits "
2014-11-07 04:01:44 -08:00
task " release_note:generate " , :from , :to do | t , args |
from = args [ :from ] || ` git describe --tags --abbrev=0 ` . strip
to = args [ :to ] || " HEAD "
2014-10-02 19:01:10 +02:00
2014-10-02 19:18:07 +02:00
bug_fixes = Set . new
new_features = Set . new
ux_changes = Set . new
2014-11-06 16:02:11 -05:00
sec_changes = Set . new
2014-11-07 04:01:44 -08:00
perf_changes = Set . new
2014-10-02 19:01:10 +02:00
2014-11-07 04:01:44 -08:00
` git log #{ from } .. #{ to } ` . each_line do | comment |
2014-11-06 15:58:03 -05:00
next if comment =~ / ^ \ s*Revert /
2014-10-23 15:51:00 -07:00
split_comments ( comment ) . each do | line |
if line =~ / ^FIX: /
bug_fixes << better ( line )
elsif line =~ / ^FEATURE: /
new_features << better ( line )
elsif line =~ / ^UX: /
ux_changes << better ( line )
2014-11-06 16:02:11 -05:00
elsif line =~ / ^SECURITY: /
sec_changes << better ( line )
2014-11-07 04:01:44 -08:00
elsif line =~ / ^PERF: /
perf_changes << better ( line )
2014-10-23 15:51:00 -07:00
end
2014-10-02 19:01:10 +02:00
end
end
2014-11-07 04:01:44 -08:00
print_changes ( " NEW FEATURES " , new_features )
print_changes ( " BUG FIXES " , bug_fixes )
print_changes ( " UX CHANGES " , ux_changes )
print_changes ( " SECURITY CHANGES " , sec_changes )
print_changes ( " PERFORMANCE " , perf_changes )
end
def print_changes ( heading , changes )
return if changes . length == 0
puts heading
puts " - " * heading . length , " "
puts changes . to_a , " "
2014-10-02 19:01:10 +02:00
end
2014-10-02 19:18:07 +02:00
def better ( line )
2014-10-23 15:51:00 -07:00
line = remove_prefix ( line )
line = escape_brackets ( line )
line [ 0 ] = '\#' if line [ 0 ] == '#'
2014-10-02 19:18:07 +02:00
line [ 0 ] = line [ 0 ] . capitalize
2014-10-23 15:51:00 -07:00
" - " + line
end
def remove_prefix ( line )
2014-11-07 04:01:44 -08:00
line . gsub ( / ^(FIX|FEATURE|UX|SECURITY|PERF): / , " " ) . strip
2014-10-23 15:51:00 -07:00
end
def escape_brackets ( line )
line . gsub ( " < " , " `< " )
. gsub ( " > " , " >` " )
. gsub ( " [ " , " `[ " )
. gsub ( " ] " , " ]` " )
end
def split_comments ( text )
text = normalize_terms ( text )
2014-11-07 04:01:44 -08:00
terms = [ " FIX: " , " FEATURE: " , " UX: " , " SECURITY: " , " PERF: " ]
2014-10-23 15:51:00 -07:00
terms . each do | term |
text = newlines_at_term ( text , term )
end
text . split ( " \n " )
end
def normalize_terms ( text )
text = text . gsub ( / (BUGFIX|FIX|BUG): /i , " FIX: " )
text = text . gsub ( / FEATURE: /i , " FEATURE: " )
text = text . gsub ( / UX: /i , " UX: " )
2014-11-07 04:01:44 -08:00
text = text . gsub ( / (SECURITY): /i , " SECURITY: " )
text = text . gsub ( / (PERF): /i , " PERF: " )
2014-10-23 15:51:00 -07:00
end
def newlines_at_term ( text , term )
if text . include? ( term )
text = text . split ( term ) . map { | l | l . strip } . join ( " \n #{ term } " )
end
text
2014-10-02 19:18:07 +02:00
end