2014-11-06 14:11:45 +00:00
#!/usr/bin/env ruby
require 'optparse'
2015-01-14 19:56:44 +00:00
require 'pp'
2014-11-17 15:54:13 +00:00
require_relative 'version'
2014-11-06 14:11:45 +00:00
2014-11-17 15:54:13 +00:00
module GitHubChangelogGenerator
class Parser
def self . parse_options
2015-02-18 16:34:32 +00:00
options = { :tag1 = > nil , :tag2 = > nil , :format = > '%Y-%m-%d' , :output = > 'CHANGELOG.md' , :labels = > %w( bug enhancement ) , :pulls = > true , :issues = > true , :verbose = > true , :add_issues_wo_labels = > true , :merge_prefix = > '*Merged pull-request:* ' , :author = > true , :pull_request_labels = > nil , :filter_issues_by_milestone = > true , :compare_link = > true }
2014-11-06 14:11:45 +00:00
2014-11-17 15:54:13 +00:00
parser = OptionParser . new { | opts |
opts . banner = 'Usage: changelog_generator [options]'
opts . on ( '-u' , '--user [USER]' , 'Username of the owner of target GitHub repo' ) do | last |
options [ :user ] = last
end
opts . on ( '-p' , '--project [PROJECT]' , 'Name of project on GitHub' ) do | last |
options [ :project ] = last
end
2014-11-24 19:33:03 +00:00
opts . on ( '-t' , '--token [TOKEN]' , 'To make more than 50 requests per hour your GitHub token required. You can generate it here: https://github.com/settings/tokens/new' ) do | last |
2014-11-17 15:54:13 +00:00
options [ :token ] = last
end
2014-11-24 19:38:06 +00:00
opts . on ( '-f' , '--date-format [FORMAT]' , 'Date format. Default is %d/%m/%y' ) do | last |
options [ :format ] = last
end
opts . on ( '-o' , '--output [NAME]' , 'Output file. Default is CHANGELOG.md' ) do | last |
options [ :output ] = last
end
2014-11-17 15:54:13 +00:00
opts . on ( '--[no-]verbose' , 'Run verbosely. Default is true' ) do | v |
options [ :verbose ] = v
end
opts . on ( '--[no-]issues' , 'Include closed issues to changelog. Default is true' ) do | v |
options [ :issues ] = v
end
2015-02-12 11:49:41 +00:00
opts . on ( '--[no-]issues-wo-labels' , 'Include closed issues without any labels to changelog. Default is true' ) do | v |
2014-11-17 15:54:13 +00:00
options [ :add_issues_wo_labels ] = v
end
opts . on ( '--[no-]pull-requests' , 'Include pull-requests to changelog. Default is true' ) do | v |
options [ :pulls ] = v
end
2015-02-12 11:49:41 +00:00
opts . on ( '--[no-]filter-by-milestone' , 'Use milestone to detect when issue was resolved. Default is true' ) do | last |
2014-12-22 13:41:20 +00:00
options [ :filter_issues_by_milestone ] = last
end
2014-11-19 11:53:36 +00:00
opts . on ( '--[no-]author' , 'Add author of pull-request in the end. Default is true' ) do | author |
options [ :last ] = author
end
2015-01-26 12:30:27 +00:00
opts . on ( '--[no-]compare-link' , 'Include compare link between older version and newer version. Default is true' ) do | v |
options [ :compare_link ] = v
end
2014-11-19 13:45:24 +00:00
opts . on ( '--labels x,y,z' , Array , 'Issues with that labels will be included to changelog. Default is \'bug,enhancement\'' ) do | list |
2014-11-17 15:54:13 +00:00
options [ :labels ] = list
2014-11-19 13:45:24 +00:00
end
2014-11-24 19:37:10 +00:00
opts . on ( '--labels-pr x,y,z' , Array , 'Only pull requests with specified labels will be included to changelog. Default is nil' ) do | list |
2014-11-19 13:45:24 +00:00
options [ :pull_request_labels ] = list
2014-11-17 15:54:13 +00:00
end
2014-12-19 21:55:42 +00:00
opts . on ( '--github-site [URL]' , 'The Enterprise Github site on which your project is hosted.' ) do | last |
options [ :github_site ] = last
end
opts . on ( '--github-api [URL]' , 'The enterprise endpoint to use for your Github API.' ) do | last |
options [ :github_endpoint ] = last
end
2014-11-17 15:54:13 +00:00
opts . on ( '-v' , '--version' , 'Print version number' ) do | v |
puts " Version: #{ GitHubChangelogGenerator :: VERSION } "
exit
end
2014-11-24 19:33:03 +00:00
opts . on ( '-h' , '--help' , 'Displays Help' ) do
puts opts
exit
end
2014-11-17 15:54:13 +00:00
}
parser . parse!
if ARGV [ 0 ] && ! ARGV [ 1 ]
2014-12-19 21:55:42 +00:00
github_site = options [ :github_site ] ? options [ :github_site ] : 'github.com'
2015-02-06 14:36:52 +00:00
# this match should parse strings such "https://github.com/skywinder/Github-Changelog-Generator" or "skywinder/Github-Changelog-Generator" to user and name
2014-12-19 21:55:42 +00:00
match = / (?:.+ #{ Regexp . escape ( github_site ) } \/ )?(.+) \/ (.+) / . match ( ARGV [ 0 ] )
2014-12-11 16:04:11 +00:00
2015-02-06 14:36:52 +00:00
begin
param = match [ 2 ] . nil?
rescue
puts " Can't detect user and name from first parameter: ' #{ ARGV [ 0 ] } ' -> exit' "
exit
end
if param
2014-12-11 16:04:11 +00:00
exit
else
options [ :user ] = match [ 1 ]
options [ :project ] = match [ 2 ]
end
2015-02-06 14:36:52 +00:00
2014-11-06 14:11:45 +00:00
end
2014-11-17 15:54:13 +00:00
if ! options [ :user ] && ! options [ :project ]
remote = ` git remote -vv ` . split ( " \n " )
2014-12-16 15:41:20 +00:00
match = / .*(?:[: \/ ])((?:-| \ w| \ .)*) \/ ((?:-| \ w| \ .)*)?(?: \ .git).* / . match ( remote [ 0 ] )
2014-11-06 14:11:45 +00:00
2014-11-17 15:54:13 +00:00
if match && match [ 1 ] && match [ 2 ]
puts " Detected user: #{ match [ 1 ] } , project: #{ match [ 2 ] } "
options [ :user ] , options [ :project ] = match [ 1 ] , match [ 2 ]
end
end
2014-11-06 14:11:45 +00:00
2014-11-10 12:36:27 +00:00
2014-11-17 15:54:13 +00:00
if ! options [ :user ] || ! options [ :project ]
puts parser . banner
exit
2014-11-10 12:36:27 +00:00
end
2014-11-17 15:54:13 +00:00
if ARGV [ 1 ]
options [ :tag1 ] = ARGV [ 0 ]
options [ :tag2 ] = ARGV [ 1 ]
end
2014-11-06 14:11:45 +00:00
2014-11-17 15:54:13 +00:00
options
2014-11-06 14:11:45 +00:00
end
end
2015-01-14 19:56:44 +00:00
end