2014-11-06 14:11:45 +00:00
#!/usr/bin/env ruby
2016-09-22 17:16:29 +00:00
# frozen_string_literal: true
2017-05-24 21:43:31 +00:00
2015-04-02 09:05:26 +00:00
require " optparse "
require " pp "
2017-10-14 19:52:26 +00:00
require " github_changelog_generator/version "
require " github_changelog_generator/helper "
2017-10-14 19:28:02 +00:00
2014-11-17 15:54:13 +00:00
module GitHubChangelogGenerator
class Parser
2015-05-25 14:16:35 +00:00
# parse options with optparse
2014-11-17 15:54:13 +00:00
def self . parse_options
2015-10-21 22:09:25 +00:00
options = default_options
2015-03-26 23:21:42 +00:00
2015-10-21 21:42:33 +00:00
ParserFile . new ( options ) . parse!
2015-09-15 18:38:41 +00:00
2015-05-25 14:16:35 +00:00
parser = setup_parser ( options )
2017-05-14 19:30:43 +00:00
begin parser . parse!
rescue OptionParser :: InvalidOption = > e
abort [ e , parser ] . join ( " \n " )
end
2015-05-25 14:16:35 +00:00
2015-10-21 21:42:33 +00:00
abort ( parser . banner ) unless options [ :user ] && options [ :project ]
2015-05-25 14:16:35 +00:00
2017-10-14 19:52:26 +00:00
options . print_options
2015-09-01 06:11:52 +00:00
options
end
2017-10-14 19:28:02 +00:00
# Setup parsing options
#
# @param options [Options]
2017-10-14 19:52:26 +00:00
# @return [OptionParser]
2015-05-25 14:16:35 +00:00
def self . setup_parser ( options )
2017-10-14 19:52:26 +00:00
OptionParser . new do | opts | # rubocop:disable Metrics/BlockLength
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-05-25 06:56:59 +00:00
options [ :date_format ] = 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-08-04 14:03:13 +00:00
opts . on ( " -b " , " --base [NAME] " , " Optional base file to append generated changes to. " ) do | last |
options [ :base ] = last
end
2016-07-22 06:28:06 +00:00
opts . on ( " --bugs-label [LABEL] " , " Setup custom label for bug-fixes section. Default is \" **Fixed bugs:** \" " ) do | v |
2015-06-12 08:23:32 +00:00
options [ :bug_prefix ] = v
end
opts . on ( " --enhancement-label [LABEL] " , " Setup custom label for enhancements section. Default is \" **Implemented enhancements:** \" " ) do | v |
options [ :enhancement_prefix ] = v
end
2017-10-10 18:27:23 +00:00
opts . on ( " --breaking-label [LABEL] " , " Setup custom label for the breaking changes section. Default is \" **Breaking changes:** \" " ) do | v |
options [ :breaking_prefix ] = v
end
2015-06-12 08:23:32 +00:00
opts . on ( " --issues-label [LABEL] " , " Setup custom label for closed-issues section. Default is \" **Closed issues:** \" " ) do | v |
options [ :issue_prefix ] = v
end
2015-07-16 11:47:01 +00:00
opts . on ( " --header-label [LABEL] " , " Setup custom header label. Default is \" # Change Log \" " ) do | v |
options [ :header ] = v
end
2016-02-03 12:56:44 +00:00
opts . on ( " --front-matter [JSON] " , " Add YAML front matter. Formatted as JSON because it's easier to add on the command line " ) do | v |
options [ :frontmatter ] = JSON . parse ( v ) . to_yaml + " --- \n "
end
2015-06-12 08:23:32 +00:00
opts . on ( " --pr-label [LABEL] " , " Setup custom label for pull requests section. Default is \" **Merged pull requests:** \" " ) do | v |
options [ :merge_prefix ] = v
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
2016-07-02 15:19:54 +00:00
opts . on ( " --usernames-as-github-logins " , " Use GitHub tags instead of Markdown links for the author of an issue or pull-request. " ) do | v |
2015-10-29 14:37:23 +00:00
options [ :usernames_as_github_logins ] = v
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
2016-11-04 21:53:49 +00:00
opts . on ( " --unreleased-label [label] " , " Setup custom label for unreleased closed issues section. Default is \" **Unreleased:** \" " ) 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-07-16 12:29:00 +00:00
opts . on ( " --include-labels x,y,z " , Array , " Only issues with the specified labels will be included in the changelog. " ) do | list |
2015-02-18 19:50:33 +00:00
options [ :include_labels ] = list
2014-11-19 13:45:24 +00:00
end
2017-10-27 06:49:52 +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-06-11 13:35:38 +00:00
opts . on ( " --bug-labels x,y,z " , Array , 'Issues with the specified labels will be always added to "Fixed bugs" section. Default is \'bug,Bug\'' ) do | list |
options [ :bug_labels ] = list
end
opts . on ( " --enhancement-labels x,y,z " , Array , 'Issues with the specified labels will be always added to "Implemented enhancements" section. Default is \'enhancement,Enhancement\'' ) do | list |
options [ :enhancement_labels ] = list
end
2017-10-10 18:27:23 +00:00
opts . on ( " --breaking-labels x,y,z " , Array , 'Issues with these labels will be added to a new section, called "Breaking Changes". Default is \'backwards-incompatible\'' ) do | list |
options [ :breaking_labels ] = list
end
2016-09-23 01:30:20 +00:00
opts . on ( " --issue-line-labels x,y,z " , Array , 'The specified labels will be shown in brackets next to each matching issue. Use "ALL" to show all labels. Default is [].' ) do | list |
options [ :issue_line_labels ] = list
end
2015-08-04 12:56:39 +00:00
opts . on ( " --exclude-tags x,y,z " , Array , " Change log will exclude specified tags " ) do | list |
2015-05-26 13:01:23 +00:00
options [ :exclude_tags ] = list
end
2016-03-24 12:22:33 +00:00
opts . on ( " --exclude-tags-regex [REGEX] " , " Apply a regular expression on tag names so that they can be excluded, for example: --exclude-tags-regex \" .* \ + \ d{1,} \" " ) do | last |
options [ :exclude_tags_regex ] = last
end
2015-08-04 12:58:25 +00:00
opts . on ( " --since-tag x " , " Change log will start after specified tag " ) do | v |
options [ :since_tag ] = v
end
2015-08-24 14:29:07 +00:00
opts . on ( " --due-tag x " , " Change log will end before specified tag " ) do | v |
options [ :due_tag ] = v
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-08-05 07:35:03 +00:00
opts . on ( " --release-url [URL] " , " The URL to point to for release links, in printf format (with the tag as variable). " ) do | url |
options [ :release_url ] = url
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-11-18 05:56:27 +00:00
opts . on ( " --release-branch [RELEASE-BRANCH] " , " Limit pull requests to the release branch, such as master or release " ) do | release_branch |
options [ :release_branch ] = release_branch
end
2016-05-24 01:28:00 +00:00
opts . on ( " --[no-]http-cache " , " Use HTTP Cache to cache Github API requests (useful for large repos) Default is true. " ) do | http_cache |
options [ :http_cache ] = http_cache
end
2017-02-08 17:14:02 +00:00
opts . on ( " --cache-file [CACHE-FILE] " , " Filename to use for cache. Default is github-changelog-http-cache in a temporary directory. " ) do | cache_file |
2016-05-24 01:28:00 +00:00
options [ :cache_file ] = cache_file
end
2017-02-08 17:14:02 +00:00
opts . on ( " --cache-log [CACHE-LOG] " , " Filename to use for cache log. Default is github-changelog-logger.log in a temporary directory. " ) do | cache_log |
2016-05-24 01:28:00 +00:00
options [ :cache_log ] = cache_log
end
2017-05-24 21:43:31 +00:00
opts . on ( " --ssl-ca-file [PATH] " , " Path to cacert.pem file. Default is a bundled lib/github_changelog_generator/ssl_certs/cacert.pem. Respects SSL_CA_PATH. " ) do | ssl_ca_file |
options [ :ssl_ca_file ] = ssl_ca_file
end
2017-10-14 19:00:56 +00:00
opts . on ( " --require x,y,z " , Array , " Path to Ruby file(s) to require. " ) do | paths |
options [ :require ] = paths
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
2015-05-25 14:16:35 +00:00
end
2014-11-17 15:54:13 +00:00
2017-10-14 19:28:02 +00:00
# @return [Options] Default options
2015-10-21 22:09:25 +00:00
def self . default_options
2016-10-05 19:35:55 +00:00
Options . new (
2015-05-25 14:16:35 +00:00
date_format : " %Y-%m-%d " ,
output : " CHANGELOG.md " ,
2015-08-04 14:03:13 +00:00
base : " HISTORY.md " ,
2015-05-25 14:16:35 +00:00
issues : true ,
add_issues_wo_labels : true ,
add_pr_wo_labels : true ,
pulls : true ,
filter_issues_by_milestone : true ,
author : true ,
unreleased : true ,
unreleased_label : " Unreleased " ,
compare_link : true ,
2017-01-26 11:47:09 +00:00
enhancement_labels : [ " enhancement " , " Enhancement " , " Type: Enhancement " ] ,
bug_labels : [ " bug " , " Bug " , " Type: Bug " ] ,
exclude_labels : [ " duplicate " , " question " , " invalid " , " wontfix " , " Duplicate " , " Question " , " Invalid " , " Wontfix " , " Meta: Exclude From Changelog " ] ,
2017-10-10 18:27:23 +00:00
breaking_labels : %w[ backwards-incompatible breaking ] ,
2016-09-23 01:30:20 +00:00
issue_line_labels : [ ] ,
2015-05-25 14:16:35 +00:00
max_issues : nil ,
simple_list : false ,
2017-05-24 21:43:31 +00:00
ssl_ca_file : nil ,
2015-05-25 14:16:35 +00:00
verbose : true ,
2015-07-16 11:47:01 +00:00
header : " # Change Log " ,
2015-05-25 14:16:35 +00:00
merge_prefix : " **Merged pull requests:** " ,
issue_prefix : " **Closed issues:** " ,
bug_prefix : " **Fixed bugs:** " ,
enhancement_prefix : " **Implemented enhancements:** " ,
2017-10-10 18:27:23 +00:00
breaking_prefix : " **Breaking changes:** " ,
2017-10-14 19:00:56 +00:00
http_cache : true ,
require : [ ]
2016-10-05 21:31:19 +00:00
)
2015-04-03 23:30:02 +00:00
end
2014-11-06 14:11:45 +00:00
end
2015-01-14 19:56:44 +00:00
end