2014-11-06 14:11:45 +00:00
#!/usr/bin/env ruby
2015-04-02 09:05:26 +00:00
require " optparse "
require " pp "
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-03-05 08:33:54 +00:00
options = {
2015-03-26 13:43:47 +00:00
tag1 : nil ,
tag2 : nil ,
2015-04-02 09:05:26 +00:00
dateformat : " %Y-%m-%d " ,
output : " CHANGELOG.md " ,
2015-03-26 13:43:47 +00:00
issues : true ,
add_issues_wo_labels : true ,
add_pr_wo_labels : true ,
2015-03-26 23:21:42 +00:00
pulls : true ,
filter_issues_by_milestone : true ,
author : true ,
unreleased : true ,
2015-04-02 09:05:26 +00:00
unreleased_label : " Unreleased " ,
2015-03-26 23:21:42 +00:00
compare_link : true ,
include_labels : %w( bug enhancement ) ,
exclude_labels : %w( duplicate question invalid wontfix ) ,
max_issues : nil ,
simple_list : false ,
verbose : true ,
2015-04-02 09:05:26 +00:00
merge_prefix : " **Merged pull requests:** " ,
issue_prefix : " **Closed issues:** " ,
bug_prefix : " **Fixed bugs:** " ,
enhancement_prefix : " **Implemented enhancements:** " ,
branch : " origin "
2015-02-25 17:02:41 +00:00
}
2014-11-06 14:11:45 +00:00
2015-03-26 13:43:47 +00:00
parser = OptionParser . new do | opts |
2015-04-02 09:05:26 +00:00
opts . banner = " Usage: github_changelog_generator [options] "
opts . on ( " -u " , " --user [USER] " , " Username of the owner of target GitHub repo " ) do | last |
2014-11-17 15:54:13 +00:00
options [ :user ] = last
end
2015-04-02 09:05:26 +00:00
opts . on ( " -p " , " --project [PROJECT] " , " Name of project on GitHub " ) do | last |
2014-11-17 15:54:13 +00:00
options [ :project ] = last
end
2015-04-02 09:05:26 +00:00
opts . on ( " -t " , " --token [TOKEN] " , " To make more than 50 requests per hour your GitHub token is required. You can generate it at: https://github.com/settings/tokens/new " ) do | last |
2014-11-17 15:54:13 +00:00
options [ :token ] = last
end
2015-04-02 09:05:26 +00:00
opts . on ( " -f " , " --date-format [FORMAT] " , " Date format. Default is %Y-%m-%d " ) do | last |
2015-03-26 23:23:28 +00:00
options [ :dateformat ] = last
2014-11-24 19:38:06 +00:00
end
2015-04-02 09:05:26 +00:00
opts . on ( " -o " , " --output [NAME] " , " Output file. Default is CHANGELOG.md " ) do | last |
2014-11-24 19:38:06 +00:00
options [ :output ] = last
end
2015-04-02 09:05:26 +00:00
opts . on ( " --[no-]issues " , " Include closed issues in changelog. Default is true " ) do | v |
2014-11-17 15:54:13 +00:00
options [ :issues ] = v
end
2015-04-02 09:05:26 +00:00
opts . on ( " --[no-]issues-wo-labels " , " Include closed issues without labels in changelog. Default is true " ) do | v |
2014-11-17 15:54:13 +00:00
options [ :add_issues_wo_labels ] = v
end
2015-04-02 09:05:26 +00:00
opts . on ( " --[no-]pr-wo-labels " , " Include pull requests without labels in changelog. Default is true " ) do | v |
2015-02-18 20:21:00 +00:00
options [ :add_pr_wo_labels ] = v
end
2015-04-02 09:05:26 +00:00
opts . on ( " --[no-]pull-requests " , " Include pull-requests in changelog. Default is true " ) do | v |
2014-11-17 15:54:13 +00:00
options [ :pulls ] = v
end
2015-04-02 09:05:26 +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
2015-04-02 09:05:26 +00:00
opts . on ( " --[no-]author " , " Add author of pull-request in the end. Default is true " ) do | author |
2015-02-18 16:27:57 +00:00
options [ :author ] = author
end
2015-04-02 09:05:26 +00:00
opts . on ( " --unreleased-only " , " Generate log from unreleased closed issues only. " ) do | v |
2015-02-18 18:14:39 +00:00
options [ :unreleased_only ] = v
end
2015-04-02 09:05:26 +00:00
opts . on ( " --[no-]unreleased " , " Add to log unreleased closed issues. Default is true " ) do | v |
2015-02-18 16:27:57 +00:00
options [ :unreleased ] = v
2014-11-19 11:53:36 +00:00
end
2015-04-02 09:05:26 +00:00
opts . on ( " --unreleased-label [label] " , " Add to log unreleased closed issues. Default is true " ) do | v |
2015-03-03 15:43:22 +00:00
options [ :unreleased_label ] = v
end
2015-04-02 09:05:26 +00:00
opts . on ( " --[no-]compare-link " , " Include compare link (Full Changelog) between older version and newer version. Default is true " ) do | v |
2015-01-26 12:30:27 +00:00
options [ :compare_link ] = v
end
2015-04-02 09:05:26 +00:00
opts . on ( " --include-labels x,y,z " , Array , 'Only issues with the specified labels will be included in the changelog. Default is \'bug,enhancement\'' ) do | list |
2015-02-18 19:50:33 +00:00
options [ :include_labels ] = list
2014-11-19 13:45:24 +00:00
end
2015-04-02 09:05:26 +00:00
opts . on ( " --exclude-labels x,y,z " , Array , 'Issues with the specified labels will be always excluded from changelog. Default is \'duplicate,question,invalid,wontfix\'' ) do | list |
2015-02-18 20:08:10 +00:00
options [ :exclude_labels ] = list
end
2015-04-02 09:05:26 +00:00
opts . on ( " --max-issues [NUMBER] " , Integer , " Max number of issues to fetch from GitHub. Default is unlimited " ) do | max |
2015-03-21 01:41:15 +00:00
options [ :max_issues ] = max
end
2015-04-02 09:05:26 +00:00
opts . on ( " --github-site [URL] " , " The Enterprise Github site on which your project is hosted. " ) do | last |
2014-12-19 21:55:42 +00:00
options [ :github_site ] = last
end
2015-04-02 09:05:26 +00:00
opts . on ( " --github-api [URL] " , " The enterprise endpoint to use for your Github API. " ) do | last |
2014-12-19 21:55:42 +00:00
options [ :github_endpoint ] = last
end
2015-04-02 09:05:26 +00:00
opts . on ( " --simple-list " , " Create simple list from issues and pull requests. Default is false. " ) do | v |
2015-02-25 14:37:34 +00:00
options [ :simple_list ] = v
end
2015-04-30 23:23:33 +00:00
opts . on ( " --future-release [RELEASE-VERSION] " , " Put the unreleased changes in the specified release number. " ) do | future_release |
options [ :future_release ] = future_release
end
2015-04-02 09:05:26 +00:00
opts . on ( " --[no-]verbose " , " Run verbosely. Default is true " ) do | v |
2015-02-25 12:18:19 +00:00
options [ :verbose ] = v
end
2015-04-02 09:05:26 +00:00
opts . on ( " -v " , " --version " , " Print version number " ) do | _v |
2014-11-17 15:54:13 +00:00
puts " Version: #{ GitHubChangelogGenerator :: VERSION } "
exit
end
2015-04-02 09:05:26 +00:00
opts . on ( " -h " , " --help " , " Displays Help " ) do
2014-11-24 19:33:03 +00:00
puts opts
exit
end
2015-03-26 13:43:47 +00:00
end
2014-11-17 15:54:13 +00:00
parser . parse!
2015-04-03 23:30:02 +00:00
detect_user_and_project ( options )
if ! options [ :user ] || ! options [ :project ]
puts parser . banner
exit
end
if ARGV [ 1 ]
options [ :tag1 ] = ARGV [ 0 ]
options [ :tag2 ] = ARGV [ 1 ]
end
if options [ :verbose ]
puts " Performing task with options: "
pp options
puts " "
end
options
end
def self . detect_user_and_project ( options )
2014-11-17 15:54:13 +00:00
if ARGV [ 0 ] && ! ARGV [ 1 ]
2015-04-02 09:05:26 +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
2015-02-25 17:02:41 +00:00
param = match [ 2 ] . nil?
2015-02-06 14:36:52 +00:00
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 ]
2015-03-26 13:43:47 +00:00
options [ :project ] = match [ 2 ]
2014-12-11 16:04:11 +00:00
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 ]
2015-04-03 23:22:29 +00:00
if ENV [ " RUBYLIB " ] =~ / ruby-debug-ide /
options [ :user ] = " skywinder "
options [ :project ] = " changelog_test "
2015-03-05 14:51:58 +00:00
else
2015-04-03 23:22:29 +00:00
remote = ` git config --get remote. #{ options [ :branch ] } .url `
2015-03-26 13:43:47 +00:00
# try to find repo in format:
2015-04-03 23:22:29 +00:00
# origin git@github.com:skywinder/Github-Changelog-Generator.git (fetch)
# git@github.com:skywinder/Github-Changelog-Generator.git
match = / .*(?:[: \/ ])((?:-| \ w| \ .)*) \/ ((?:-| \ w| \ .)*)(?: \ .git).* / . match ( remote )
2015-03-05 14:51:58 +00:00
if match && match [ 1 ] && match [ 2 ]
puts " Detected user: #{ match [ 1 ] } , project: #{ match [ 2 ] } "
options [ :user ] , options [ :project ] = match [ 1 ] , match [ 2 ]
2015-04-03 23:22:29 +00:00
else
# try to find repo in format:
# origin https://github.com/skywinder/ChangelogMerger (fetch)
# https://github.com/skywinder/ChangelogMerger
match = / .* \/ ((?:-| \ w| \ .)*) \/ ((?:-| \ w| \ .)*).* / . match ( remote )
if match && match [ 1 ] && match [ 2 ]
puts " Detected user: #{ match [ 1 ] } , project: #{ match [ 2 ] } "
options [ :user ] , options [ :project ] = match [ 1 ] , match [ 2 ]
end
2015-03-05 14:51:58 +00:00
end
2014-11-17 15:54:13 +00:00
end
end
2014-11-06 14:11:45 +00:00
end
end
2015-01-14 19:56:44 +00:00
end