github_changelog_generator 1.16.1 → 1.16.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 013fbbe19a6a0f7fc005969b45cf8a7e21697551c1de0e6074d00b0a86c1621e
4
- data.tar.gz: 6ae152e9815faf93bce42d0fe24653f65181e3cd0b0e7b069ea969015396c415
3
+ metadata.gz: 2ccac267908f4f46f4660f682da9b2d83f3b14e84f987a2c8929c59a928684e3
4
+ data.tar.gz: ca7866e9ebed6bbfe7dcfd637a63330dafec2d13602a47917faf84ff1cbde656
5
5
  SHA512:
6
- metadata.gz: 7c7fff39381df3062e74cec927bac6501663b146022fa4b8e604514c182c8353021b3dbc3553900d7b10dbd9ca42a9abe33c9284f75040678c0cd97ece402598
7
- data.tar.gz: 2c928e7634981f5c3f611770b317f289152269028441e522694c36b51349e8b935e578257b62d076ff20ddef4f461dd345ed87565badaf14d5c26230d6e4b86d
6
+ metadata.gz: d362fbc5862e8170d82175a6e9adf15eae99b578d894b7df7c15531e80326e17947a5c8f88d2964900a296d9760a53ef339d598de2cf2b703242fb391c805457
7
+ data.tar.gz: 3e38da7c8a091c7efc681c295f7d6467a227579cddff107a28f7a51a50c8d808008e012a457afd9faa6f92f2021dac648d634ab04aac4958acb54934f40085f5
data/README.md CHANGED
@@ -84,7 +84,7 @@ Using [Docker](https://www.docker.com/products/docker-desktop) is an alternative
84
84
 
85
85
  Example invocation:
86
86
 
87
- $ docker run -it --rm -v "$(pwd)":/usr/local/src/your-app ferrarimarco/github-changelog-generator
87
+ $ docker run -it --rm -v "$(pwd)":/usr/local/src/your-app githubchangeloggenerator/github-changelog-generator
88
88
 
89
89
 
90
90
 
@@ -0,0 +1,224 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "optparse"
4
+ require "github_changelog_generator/version"
5
+
6
+ module GitHubChangelogGenerator
7
+ class ArgvParser
8
+ attr_reader :options
9
+
10
+ def initialize(options = {})
11
+ @options = options
12
+ end
13
+
14
+ def parse!(argv)
15
+ parser.parse(argv)
16
+ rescue OptionParser::ParseError => e
17
+ warn [e, parser].join("\n")
18
+ Kernel.abort
19
+ end
20
+
21
+ def parser
22
+ @parser ||= OptionParser.new do |opts| # rubocop:disable Metrics/BlockLength
23
+ opts.banner = "Usage: github_changelog_generator --user USER --project PROJECT [options]"
24
+ opts.on("-u", "--user USER", "Username of the owner of the target GitHub repo OR the namespace of target Github repo if owned by an organization.") do |last|
25
+ options[:user] = last
26
+ end
27
+ opts.on("-p", "--project PROJECT", "Name of project on GitHub.") do |last|
28
+ options[:project] = last
29
+ end
30
+ 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|
31
+ options[:token] = last
32
+ end
33
+ opts.on("-f", "--date-format FORMAT", "Date format. Default is %Y-%m-%d.") do |last|
34
+ options[:date_format] = last
35
+ end
36
+ opts.on("-o", "--output NAME", "Output file. To print to STDOUT instead, use blank as path. Default is CHANGELOG.md") do |last|
37
+ options[:output] = last
38
+ end
39
+ opts.on("-b", "--base NAME", "Optional base file to append generated changes to. Default is HISTORY.md") do |last|
40
+ options[:base] = last
41
+ end
42
+ opts.on("--summary-label LABEL", "Set up custom label for the release summary section. Default is \"\".") do |v|
43
+ options[:summary_prefix] = v
44
+ end
45
+ opts.on("--breaking-label LABEL", "Set up custom label for the breaking changes section. Default is \"**Breaking changes:**\".") do |v|
46
+ options[:breaking_prefix] = v
47
+ end
48
+ opts.on("--enhancement-label LABEL", "Set up custom label for enhancements section. Default is \"**Implemented enhancements:**\".") do |v|
49
+ options[:enhancement_prefix] = v
50
+ end
51
+ opts.on("--bugs-label LABEL", "Set up custom label for bug-fixes section. Default is \"**Fixed bugs:**\".") do |v|
52
+ options[:bug_prefix] = v
53
+ end
54
+ opts.on("--deprecated-label LABEL", "Set up custom label for the deprecated changes section. Default is \"**Deprecated:**\".") do |v|
55
+ options[:deprecated_prefix] = v
56
+ end
57
+ opts.on("--removed-label LABEL", "Set up custom label for the removed changes section. Default is \"**Removed:**\".") do |v|
58
+ options[:removed_prefix] = v
59
+ end
60
+ opts.on("--security-label LABEL", "Set up custom label for the security changes section. Default is \"**Security fixes:**\".") do |v|
61
+ options[:security_prefix] = v
62
+ end
63
+ opts.on("--issues-label LABEL", "Set up custom label for closed-issues section. Default is \"**Closed issues:**\".") do |v|
64
+ options[:issue_prefix] = v
65
+ end
66
+ opts.on("--header-label LABEL", "Set up custom header label. Default is \"# Changelog\".") do |v|
67
+ options[:header] = v
68
+ end
69
+ opts.on("--configure-sections HASH, STRING", "Define your own set of sections which overrides all default sections.") do |v|
70
+ options[:configure_sections] = v
71
+ end
72
+ opts.on("--add-sections HASH, STRING", "Add new sections but keep the default sections.") do |v|
73
+ options[:add_sections] = v
74
+ end
75
+ opts.on("--front-matter JSON", "Add YAML front matter. Formatted as JSON because it's easier to add on the command line.") do |v|
76
+ options[:frontmatter] = "#{JSON.parse(v).to_yaml}---\n"
77
+ end
78
+ opts.on("--pr-label LABEL", "Set up custom label for pull requests section. Default is \"**Merged pull requests:**\".") do |v|
79
+ options[:merge_prefix] = v
80
+ end
81
+ opts.on("--[no-]issues", "Include closed issues in changelog. Default is true.") do |v|
82
+ options[:issues] = v
83
+ end
84
+ opts.on("--[no-]issues-wo-labels", "Include closed issues without labels in changelog. Default is true.") do |v|
85
+ options[:add_issues_wo_labels] = v
86
+ end
87
+ opts.on("--[no-]pr-wo-labels", "Include pull requests without labels in changelog. Default is true.") do |v|
88
+ options[:add_pr_wo_labels] = v
89
+ end
90
+ opts.on("--[no-]pull-requests", "Include pull-requests in changelog. Default is true.") do |v|
91
+ options[:pulls] = v
92
+ end
93
+ opts.on("--[no-]filter-by-milestone", "Use milestone to detect when issue was resolved. Default is true.") do |last|
94
+ options[:filter_issues_by_milestone] = last
95
+ end
96
+ opts.on("--[no-]issues-of-open-milestones", "Include issues of open milestones. Default is true.") do |v|
97
+ options[:issues_of_open_milestones] = v
98
+ end
99
+ opts.on("--[no-]author", "Add author of pull request at the end. Default is true.") do |author|
100
+ options[:author] = author
101
+ end
102
+ opts.on("--usernames-as-github-logins", "Use GitHub tags instead of Markdown links for the author of an issue or pull-request.") do |v|
103
+ options[:usernames_as_github_logins] = v
104
+ end
105
+ opts.on("--unreleased-only", "Generate log from unreleased closed issues only.") do |v|
106
+ options[:unreleased_only] = v
107
+ end
108
+ opts.on("--[no-]unreleased", "Add to log unreleased closed issues. Default is true.") do |v|
109
+ options[:unreleased] = v
110
+ end
111
+ opts.on("--unreleased-label LABEL", "Set up custom label for unreleased closed issues section. Default is \"**Unreleased:**\".") do |v|
112
+ options[:unreleased_label] = v
113
+ end
114
+ opts.on("--[no-]compare-link", "Include compare link (Full Changelog) between older version and newer version. Default is true.") do |v|
115
+ options[:compare_link] = v
116
+ end
117
+ opts.on("--include-labels x,y,z", Array, "Of the labeled issues, only include the ones with the specified labels.") do |list|
118
+ options[:include_labels] = list
119
+ end
120
+ opts.on("--exclude-labels x,y,z", Array, "Issues with the specified labels will be excluded from changelog. Default is 'duplicate,question,invalid,wontfix'.") do |list|
121
+ options[:exclude_labels] = list
122
+ end
123
+ opts.on("--summary-labels x,y,z", Array, 'Issues with these labels will be added to a new section, called "Release Summary". The section display only body of issues. Default is \'release-summary,summary\'.') do |list|
124
+ options[:summary_labels] = list
125
+ end
126
+ 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,breaking\'.') do |list|
127
+ options[:breaking_labels] = list
128
+ end
129
+ opts.on("--enhancement-labels x,y,z", Array, 'Issues with the specified labels will be added to "Implemented enhancements" section. Default is \'enhancement,Enhancement\'.') do |list|
130
+ options[:enhancement_labels] = list
131
+ end
132
+ opts.on("--bug-labels x,y,z", Array, 'Issues with the specified labels will be added to "Fixed bugs" section. Default is \'bug,Bug\'.') do |list|
133
+ options[:bug_labels] = list
134
+ end
135
+ opts.on("--deprecated-labels x,y,z", Array, 'Issues with the specified labels will be added to a section called "Deprecated". Default is \'deprecated,Deprecated\'.') do |list|
136
+ options[:deprecated_labels] = list
137
+ end
138
+ opts.on("--removed-labels x,y,z", Array, 'Issues with the specified labels will be added to a section called "Removed". Default is \'removed,Removed\'.') do |list|
139
+ options[:removed_labels] = list
140
+ end
141
+ opts.on("--security-labels x,y,z", Array, 'Issues with the specified labels will be added to a section called "Security fixes". Default is \'security,Security\'.') do |list|
142
+ options[:security_labels] = list
143
+ end
144
+ 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|
145
+ options[:issue_line_labels] = list
146
+ end
147
+ opts.on("--include-tags-regex REGEX", "Apply a regular expression on tag names so that they can be included, for example: --include-tags-regex \".*\+\d{1,}\".") do |last|
148
+ options[:include_tags_regex] = last
149
+ end
150
+ opts.on("--exclude-tags x,y,z", Array, "Changelog will exclude specified tags") do |list|
151
+ options[:exclude_tags] = list
152
+ end
153
+ 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|
154
+ options[:exclude_tags_regex] = last
155
+ end
156
+ opts.on("--since-tag x", "Changelog will start after specified tag.") do |v|
157
+ options[:since_tag] = v
158
+ end
159
+ opts.on("--due-tag x", "Changelog will end before specified tag.") do |v|
160
+ options[:due_tag] = v
161
+ end
162
+ opts.on("--since-commit x", "Fetch only commits after this time. eg. \"2017-01-01 10:00:00\"") do |v|
163
+ options[:since_commit] = v
164
+ end
165
+ opts.on("--max-issues NUMBER", Integer, "Maximum number of issues to fetch from GitHub. Default is unlimited.") do |max|
166
+ options[:max_issues] = max
167
+ end
168
+ opts.on("--release-url URL", "The URL to point to for release links, in printf format (with the tag as variable).") do |url|
169
+ options[:release_url] = url
170
+ end
171
+ opts.on("--github-site URL", "The Enterprise GitHub site where your project is hosted.") do |last|
172
+ options[:github_site] = last
173
+ end
174
+ opts.on("--github-api URL", "The enterprise endpoint to use for your GitHub API.") do |last|
175
+ options[:github_endpoint] = last
176
+ end
177
+ opts.on("--simple-list", "Create a simple list from issues and pull requests. Default is false.") do |v|
178
+ options[:simple_list] = v
179
+ end
180
+ opts.on("--future-release RELEASE-VERSION", "Put the unreleased changes in the specified release number.") do |future_release|
181
+ options[:future_release] = future_release
182
+ end
183
+ opts.on("--release-branch RELEASE-BRANCH", "Limit pull requests to the release branch, such as master or release.") do |release_branch|
184
+ options[:release_branch] = release_branch
185
+ end
186
+ opts.on("--[no-]http-cache", "Use HTTP Cache to cache GitHub API requests (useful for large repos). Default is true.") do |http_cache|
187
+ options[:http_cache] = http_cache
188
+ end
189
+ opts.on("--cache-file CACHE-FILE", "Filename to use for cache. Default is github-changelog-http-cache in a temporary directory.") do |cache_file|
190
+ options[:cache_file] = cache_file
191
+ end
192
+ 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|
193
+ options[:cache_log] = cache_log
194
+ end
195
+ opts.on("--config-file CONFIG-FILE", "Path to configuration file. Default is .github_changelog_generator.") do |config_file|
196
+ options[:config_file] = config_file
197
+ end
198
+ 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|
199
+ options[:ssl_ca_file] = ssl_ca_file
200
+ end
201
+ opts.on("--require x,y,z", Array, "Path to Ruby file(s) to require before generating changelog.") do |paths|
202
+ options[:require] = paths
203
+ end
204
+ opts.on("--[no-]verbose", "Run verbosely. Default is true.") do |v|
205
+ options[:verbose] = v
206
+ end
207
+ opts.on("-v", "--version", "Print version number.") do |_v|
208
+ puts "Version: #{GitHubChangelogGenerator::VERSION}"
209
+ exit
210
+ end
211
+ opts.on("-h", "--help", "Displays Help.") do
212
+ puts opts
213
+ exit
214
+ end
215
+ end
216
+ end
217
+
218
+ class << self
219
+ def banner
220
+ new.parser.banner
221
+ end
222
+ end
223
+ end
224
+ end
@@ -104,7 +104,7 @@ module GitHubChangelogGenerator
104
104
  i = total - prs_left.count
105
105
  prs_left.reject do |pr|
106
106
  found = false
107
- if pr["events"] && (event = pr["events"].find { |e| e["event"] == "merged" }) && sha_in_release_branch(event["commit_id"])
107
+ if pr["events"] && (event = pr["events"].find { |e| e["event"] == "merged" }) && sha_in_release_branch?(event["commit_id"])
108
108
  found = true
109
109
  i += 1
110
110
  print("Associating PRs with tags: #{i}/#{total}\r") if @options[:verbose]
@@ -137,7 +137,7 @@ module GitHubChangelogGenerator
137
137
  pr["first_occurring_tag"] = oldest_tag["name"]
138
138
  found = true
139
139
  i += 1
140
- elsif sha_in_release_branch(rebased_sha)
140
+ elsif sha_in_release_branch?(rebased_sha)
141
141
  found = true
142
142
  i += 1
143
143
  else
@@ -195,10 +195,9 @@ module GitHubChangelogGenerator
195
195
  #
196
196
  # @param [String] sha SHA to check.
197
197
  # @return [Boolean] True if SHA is in the branch git history.
198
- def sha_in_release_branch(sha)
198
+ def sha_in_release_branch?(sha)
199
199
  branch = @options[:release_branch] || @fetcher.default_branch
200
- shas_in_branch = @fetcher.commits_in_branch(branch)
201
- shas_in_branch.include?(sha)
200
+ @fetcher.commits_in_branch(branch).include?(sha)
202
201
  end
203
202
  end
204
203
  end
@@ -156,7 +156,7 @@ module GitHubChangelogGenerator
156
156
  filter_wo_labels(filtered_issues)
157
157
  end
158
158
 
159
- # @param [Array] issues Issues & PRs to filter when without labels
159
+ # @param [Array] items Issues & PRs to filter when without labels
160
160
  # @return [Array] Issues & PRs without labels or empty array if
161
161
  # add_issues_wo_labels or add_pr_wo_labels are false
162
162
  def filter_wo_labels(items)
@@ -170,6 +170,7 @@ module GitHubChangelogGenerator
170
170
  end
171
171
 
172
172
  # @todo Document this
173
+ # @param [Object] issues
173
174
  def filter_by_include_labels(issues)
174
175
  if options[:include_labels].nil?
175
176
  issues
@@ -105,6 +105,9 @@ module GitHubChangelogGenerator
105
105
  # Returns the number of pages for a API call
106
106
  #
107
107
  # @return [Integer] number of pages for this API call in total
108
+ # @param [Object] request_options
109
+ # @param [Object] method
110
+ # @param [Object] client
108
111
  def calculate_pages(client, method, request_options)
109
112
  # Makes the first API call so that we can call last_response
110
113
  check_github_response do
@@ -161,7 +164,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
161
164
  page_i = 0
162
165
  count_pages = calculate_pages(client, "issues", closed_pr_options)
163
166
 
164
- iterate_pages(client, "issues", closed_pr_options) do |new_issues|
167
+ iterate_pages(client, "issues", **closed_pr_options) do |new_issues|
165
168
  page_i += PER_PAGE_NUMBER
166
169
  print_in_same_line("Fetching issues... #{page_i}/#{count_pages * PER_PAGE_NUMBER}")
167
170
  issues.concat(new_issues)
@@ -185,7 +188,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
185
188
  page_i = 0
186
189
  count_pages = calculate_pages(client, "pull_requests", options)
187
190
 
188
- iterate_pages(client, "pull_requests", options) do |new_pr|
191
+ iterate_pages(client, "pull_requests", **options) do |new_pr|
189
192
  page_i += PER_PAGE_NUMBER
190
193
  log_string = "Fetching merged dates... #{page_i}/#{count_pages * PER_PAGE_NUMBER}"
191
194
  print_in_same_line(log_string)
@@ -215,7 +218,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
215
218
  issues.each do |issue|
216
219
  semaphore.async do
217
220
  issue["events"] = []
218
- iterate_pages(client, "issue_events", issue["number"], preview) do |new_event|
221
+ iterate_pages(client, "issue_events", issue["number"], **preview) do |new_event|
219
222
  issue["events"].concat(new_event)
220
223
  end
221
224
  issue["events"] = issue["events"].map { |event| stringify_keys_deep(event.to_hash) }
@@ -335,11 +338,15 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
335
338
  @default_branch ||= client.repository(user_project)[:default_branch]
336
339
  end
337
340
 
341
+ # @param [String] name
342
+ # @return [Array<String>]
338
343
  def commits_in_branch(name)
339
344
  @branches ||= client.branches(user_project).map { |branch| [branch[:name], branch] }.to_h
340
345
 
341
346
  if (branch = @branches[name])
342
347
  commits_in_tag(branch[:commit][:sha])
348
+ else
349
+ []
343
350
  end
344
351
  end
345
352
 
@@ -347,7 +354,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
347
354
  # "shas_in_tag"
348
355
  #
349
356
  # @param [Array] tags The array of tags.
350
- # @return [Nil] No return; tags are updated in-place.
357
+ # @return void
351
358
  def fetch_tag_shas(tags)
352
359
  # Reverse the tags array to gain max benefit from the @commits_in_tag_cache
353
360
  tags.reverse_each do |tag|
@@ -357,6 +364,8 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
357
364
 
358
365
  private
359
366
 
367
+ # @param [Set] shas
368
+ # @param [Object] sha
360
369
  def commits_in_tag(sha, shas = Set.new)
361
370
  # Reduce multiple runs for the same tag
362
371
  return @commits_in_tag_cache[sha] if @commits_in_tag_cache.key?(sha)
@@ -382,6 +391,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
382
391
  shas
383
392
  end
384
393
 
394
+ # @param [Object] indata
385
395
  def stringify_keys_deep(indata)
386
396
  case indata
387
397
  when Array
@@ -405,10 +415,13 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
405
415
  #
406
416
  # @param [Octokit::Client] client
407
417
  # @param [String] method (eg. 'tags')
418
+ # @param [Array] arguments
419
+ # @param [Async::Semaphore] parent
408
420
  #
409
421
  # @yield [Sawyer::Resource] An OctoKit-provided response (which can be empty)
410
422
  #
411
423
  # @return [void]
424
+ # @param [Hash] options
412
425
  def iterate_pages(client, method, *arguments, parent: nil, **options)
413
426
  options = DEFAULT_REQUEST_OPTIONS.merge(options)
414
427
 
@@ -442,6 +455,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
442
455
  # This is wrapper with rescue block
443
456
  #
444
457
  # @return [Object] returns exactly the same, what you put in the block, but wrap it with begin-rescue block
458
+ # @param [Proc] block
445
459
  def check_github_response(&block)
446
460
  Retriable.retriable(retry_options, &block)
447
461
  rescue MovedPermanentlyError => e
@@ -453,6 +467,8 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
453
467
  end
454
468
 
455
469
  # Presents the exception, and the aborts with the message.
470
+ # @param [Object] message
471
+ # @param [Object] error
456
472
  def fail_with_message(error, message)
457
473
  Helper.log.error("#{error.class}: #{error.message}")
458
474
  sys_abort(message)
@@ -483,6 +499,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
483
499
  end
484
500
  end
485
501
 
502
+ # @param [Object] msg
486
503
  def sys_abort(msg)
487
504
  abort(msg)
488
505
  end
@@ -25,6 +25,7 @@ module GitHubChangelogGenerator
25
25
  bug_prefix
26
26
  cache_file
27
27
  cache_log
28
+ config_file
28
29
  compare_link
29
30
  configure_sections
30
31
  date_format
@@ -1,277 +1,89 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require "optparse"
5
- require "github_changelog_generator/version"
6
4
  require "github_changelog_generator/helper"
5
+ require "github_changelog_generator/argv_parser"
6
+ require "github_changelog_generator/parser_file"
7
7
 
8
8
  module GitHubChangelogGenerator
9
9
  class Parser
10
- # parse options with optparse
11
- def self.parse_options
12
- options = default_options
10
+ class << self
11
+ PARSERS = [
12
+ ArgvParser, # Parse arguments first to get initial options populated
13
+ FileParserChooser, # Then parse possible configuration files
14
+ ArgvParser # Lastly parse arguments again to keep the given arguments the strongest
15
+ ].freeze
13
16
 
14
- ParserFile.new(options).parse!
17
+ def parse_options(argv = ARGV)
18
+ options = default_options
15
19
 
16
- parser = setup_parser(options)
17
- begin parser.parse!
18
- rescue OptionParser::InvalidOption => e
19
- abort [e, parser].join("\n")
20
- end
20
+ PARSERS.each do |parser|
21
+ parser.new(options).parse!(argv)
22
+ end
21
23
 
22
- unless options[:user] && options[:project]
23
- warn "Configure which user and project to work on."
24
- warn "Options --user and --project, or settings to that effect. See --help for more."
25
- abort(parser.banner)
24
+ abort_if_user_and_project_not_given!(options)
25
+
26
+ options.print_options
27
+
28
+ options
26
29
  end
27
30
 
28
- options.print_options
31
+ def abort_if_user_and_project_not_given!(options)
32
+ return if options[:user] && options[:project]
29
33
 
30
- options
31
- end
34
+ warn "Configure which user and project to work on."
35
+ warn "Options --user and --project, or settings to that effect. See --help for more."
36
+ warn ArgvParser.banner
32
37
 
33
- # Setup parsing options
34
- #
35
- # @param options [Options]
36
- # @return [OptionParser]
37
- def self.setup_parser(options)
38
- OptionParser.new do |opts| # rubocop:disable Metrics/BlockLength
39
- opts.banner = "Usage: github_changelog_generator --user USER --project PROJECT [options]"
40
- opts.on("-u", "--user USER", "Username of the owner of the target GitHub repo OR the namespace of target Github repo if owned by an organization.") do |last|
41
- options[:user] = last
42
- end
43
- opts.on("-p", "--project PROJECT", "Name of project on GitHub.") do |last|
44
- options[:project] = last
45
- end
46
- 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|
47
- options[:token] = last
48
- end
49
- opts.on("-f", "--date-format FORMAT", "Date format. Default is %Y-%m-%d.") do |last|
50
- options[:date_format] = last
51
- end
52
- opts.on("-o", "--output [NAME]", "Output file. To print to STDOUT instead, use blank as path. Default is CHANGELOG.md") do |last|
53
- options[:output] = last
54
- end
55
- opts.on("-b", "--base [NAME]", "Optional base file to append generated changes to.") do |last|
56
- options[:base] = last
57
- end
58
- opts.on("--summary-label [LABEL]", "Set up custom label for the release summary section. Default is \"\".") do |v|
59
- options[:summary_prefix] = v
60
- end
61
- opts.on("--breaking-label [LABEL]", "Set up custom label for the breaking changes section. Default is \"**Breaking changes:**\".") do |v|
62
- options[:breaking_prefix] = v
63
- end
64
- opts.on("--enhancement-label [LABEL]", "Set up custom label for enhancements section. Default is \"**Implemented enhancements:**\".") do |v|
65
- options[:enhancement_prefix] = v
66
- end
67
- opts.on("--bugs-label [LABEL]", "Set up custom label for bug-fixes section. Default is \"**Fixed bugs:**\".") do |v|
68
- options[:bug_prefix] = v
69
- end
70
- opts.on("--deprecated-label [LABEL]", "Set up custom label for the deprecated changes section. Default is \"**Deprecated:**\".") do |v|
71
- options[:deprecated_prefix] = v
72
- end
73
- opts.on("--removed-label [LABEL]", "Set up custom label for the removed changes section. Default is \"**Removed:**\".") do |v|
74
- options[:removed_prefix] = v
75
- end
76
- opts.on("--security-label [LABEL]", "Set up custom label for the security changes section. Default is \"**Security fixes:**\".") do |v|
77
- options[:security_prefix] = v
78
- end
79
- opts.on("--issues-label [LABEL]", "Set up custom label for closed-issues section. Default is \"**Closed issues:**\".") do |v|
80
- options[:issue_prefix] = v
81
- end
82
- opts.on("--header-label [LABEL]", "Set up custom header label. Default is \"# Changelog\".") do |v|
83
- options[:header] = v
84
- end
85
- opts.on("--configure-sections [Hash, String]", "Define your own set of sections which overrides all default sections.") do |v|
86
- options[:configure_sections] = v
87
- end
88
- opts.on("--add-sections [Hash, String]", "Add new sections but keep the default sections.") do |v|
89
- options[:add_sections] = v
90
- end
91
- opts.on("--front-matter [JSON]", "Add YAML front matter. Formatted as JSON because it's easier to add on the command line.") do |v|
92
- options[:frontmatter] = "#{JSON.parse(v).to_yaml}---\n"
93
- end
94
- opts.on("--pr-label [LABEL]", "Set up custom label for pull requests section. Default is \"**Merged pull requests:**\".") do |v|
95
- options[:merge_prefix] = v
96
- end
97
- opts.on("--[no-]issues", "Include closed issues in changelog. Default is true.") do |v|
98
- options[:issues] = v
99
- end
100
- opts.on("--[no-]issues-wo-labels", "Include closed issues without labels in changelog. Default is true.") do |v|
101
- options[:add_issues_wo_labels] = v
102
- end
103
- opts.on("--[no-]pr-wo-labels", "Include pull requests without labels in changelog. Default is true.") do |v|
104
- options[:add_pr_wo_labels] = v
105
- end
106
- opts.on("--[no-]pull-requests", "Include pull-requests in changelog. Default is true.") do |v|
107
- options[:pulls] = v
108
- end
109
- opts.on("--[no-]filter-by-milestone", "Use milestone to detect when issue was resolved. Default is true.") do |last|
110
- options[:filter_issues_by_milestone] = last
111
- end
112
- opts.on("--[no-]issues-of-open-milestones", "Include issues of open milestones. Default is true.") do |v|
113
- options[:issues_of_open_milestones] = v
114
- end
115
- opts.on("--[no-]author", "Add author of pull request at the end. Default is true.") do |author|
116
- options[:author] = author
117
- end
118
- opts.on("--usernames-as-github-logins", "Use GitHub tags instead of Markdown links for the author of an issue or pull-request.") do |v|
119
- options[:usernames_as_github_logins] = v
120
- end
121
- opts.on("--unreleased-only", "Generate log from unreleased closed issues only.") do |v|
122
- options[:unreleased_only] = v
123
- end
124
- opts.on("--[no-]unreleased", "Add to log unreleased closed issues. Default is true.") do |v|
125
- options[:unreleased] = v
126
- end
127
- opts.on("--unreleased-label [label]", "Set up custom label for unreleased closed issues section. Default is \"**Unreleased:**\".") do |v|
128
- options[:unreleased_label] = v
129
- end
130
- opts.on("--[no-]compare-link", "Include compare link (Full Changelog) between older version and newer version. Default is true.") do |v|
131
- options[:compare_link] = v
132
- end
133
- opts.on("--include-labels x,y,z", Array, "Of the labeled issues, only include the ones with the specified labels.") do |list|
134
- options[:include_labels] = list
135
- end
136
- opts.on("--exclude-labels x,y,z", Array, "Issues with the specified labels will be excluded from changelog. Default is 'duplicate,question,invalid,wontfix'.") do |list|
137
- options[:exclude_labels] = list
138
- end
139
- opts.on("--summary-labels x,y,z", Array, 'Issues with these labels will be added to a new section, called "Release Summary". The section display only body of issues. Default is \'release-summary,summary\'.') do |list|
140
- options[:summary_labels] = list
141
- end
142
- 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,breaking\'.') do |list|
143
- options[:breaking_labels] = list
144
- end
145
- opts.on("--enhancement-labels x,y,z", Array, 'Issues with the specified labels will be added to "Implemented enhancements" section. Default is \'enhancement,Enhancement\'.') do |list|
146
- options[:enhancement_labels] = list
147
- end
148
- opts.on("--bug-labels x,y,z", Array, 'Issues with the specified labels will be added to "Fixed bugs" section. Default is \'bug,Bug\'.') do |list|
149
- options[:bug_labels] = list
150
- end
151
- opts.on("--deprecated-labels x,y,z", Array, 'Issues with the specified labels will be added to a section called "Deprecated". Default is \'deprecated,Deprecated\'.') do |list|
152
- options[:deprecated_labels] = list
153
- end
154
- opts.on("--removed-labels x,y,z", Array, 'Issues with the specified labels will be added to a section called "Removed". Default is \'removed,Removed\'.') do |list|
155
- options[:removed_labels] = list
156
- end
157
- opts.on("--security-labels x,y,z", Array, 'Issues with the specified labels will be added to a section called "Security fixes". Default is \'security,Security\'.') do |list|
158
- options[:security_labels] = list
159
- end
160
- 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|
161
- options[:issue_line_labels] = list
162
- end
163
- opts.on("--include-tags-regex [REGEX]", "Apply a regular expression on tag names so that they can be included, for example: --include-tags-regex \".*\+\d{1,}\".") do |last|
164
- options[:include_tags_regex] = last
165
- end
166
- opts.on("--exclude-tags x,y,z", Array, "Changelog will exclude specified tags") do |list|
167
- options[:exclude_tags] = list
168
- end
169
- 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|
170
- options[:exclude_tags_regex] = last
171
- end
172
- opts.on("--since-tag x", "Changelog will start after specified tag.") do |v|
173
- options[:since_tag] = v
174
- end
175
- opts.on("--due-tag x", "Changelog will end before specified tag.") do |v|
176
- options[:due_tag] = v
177
- end
178
- opts.on("--since-commit x", "Fetch only commits after this time. eg. \"2017-01-01 10:00:00\"") do |v|
179
- options[:since_commit] = v
180
- end
181
- opts.on("--max-issues [NUMBER]", Integer, "Maximum number of issues to fetch from GitHub. Default is unlimited.") do |max|
182
- options[:max_issues] = max
183
- end
184
- opts.on("--release-url [URL]", "The URL to point to for release links, in printf format (with the tag as variable).") do |url|
185
- options[:release_url] = url
186
- end
187
- opts.on("--github-site [URL]", "The Enterprise GitHub site where your project is hosted.") do |last|
188
- options[:github_site] = last
189
- end
190
- opts.on("--github-api [URL]", "The enterprise endpoint to use for your GitHub API.") do |last|
191
- options[:github_endpoint] = last
192
- end
193
- opts.on("--simple-list", "Create a simple list from issues and pull requests. Default is false.") do |v|
194
- options[:simple_list] = v
195
- end
196
- opts.on("--future-release [RELEASE-VERSION]", "Put the unreleased changes in the specified release number.") do |future_release|
197
- options[:future_release] = future_release
198
- end
199
- opts.on("--release-branch [RELEASE-BRANCH]", "Limit pull requests to the release branch, such as master or release.") do |release_branch|
200
- options[:release_branch] = release_branch
201
- end
202
- opts.on("--[no-]http-cache", "Use HTTP Cache to cache GitHub API requests (useful for large repos). Default is true.") do |http_cache|
203
- options[:http_cache] = http_cache
204
- end
205
- opts.on("--cache-file [CACHE-FILE]", "Filename to use for cache. Default is github-changelog-http-cache in a temporary directory.") do |cache_file|
206
- options[:cache_file] = cache_file
207
- end
208
- 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|
209
- options[:cache_log] = cache_log
210
- end
211
- 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|
212
- options[:ssl_ca_file] = ssl_ca_file
213
- end
214
- opts.on("--require x,y,z", Array, "Path to Ruby file(s) to require before generating changelog.") do |paths|
215
- options[:require] = paths
216
- end
217
- opts.on("--[no-]verbose", "Run verbosely. Default is true.") do |v|
218
- options[:verbose] = v
219
- end
220
- opts.on("-v", "--version", "Print version number.") do |_v|
221
- puts "Version: #{GitHubChangelogGenerator::VERSION}"
222
- exit
223
- end
224
- opts.on("-h", "--help", "Displays Help.") do
225
- puts opts
226
- exit
227
- end
38
+ Kernel.abort
228
39
  end
229
- end
230
40
 
231
- # @return [Options] Default options
232
- def self.default_options
233
- Options.new(
234
- date_format: "%Y-%m-%d",
235
- output: "CHANGELOG.md",
236
- base: "HISTORY.md",
237
- issues: true,
238
- add_issues_wo_labels: true,
239
- add_pr_wo_labels: true,
240
- pulls: true,
241
- filter_issues_by_milestone: true,
242
- issues_of_open_milestones: true,
243
- author: true,
244
- unreleased: true,
245
- unreleased_label: "Unreleased",
246
- compare_link: true,
247
- exclude_labels: ["duplicate", "question", "invalid", "wontfix", "Duplicate", "Question", "Invalid", "Wontfix", "Meta: Exclude From Changelog"],
248
- summary_labels: ["Release summary", "release-summary", "Summary", "summary"],
249
- breaking_labels: ["backwards-incompatible", "Backwards incompatible", "breaking"],
250
- enhancement_labels: ["enhancement", "Enhancement", "Type: Enhancement"],
251
- bug_labels: ["bug", "Bug", "Type: Bug"],
252
- deprecated_labels: ["deprecated", "Deprecated", "Type: Deprecated"],
253
- removed_labels: ["removed", "Removed", "Type: Removed"],
254
- security_labels: ["security", "Security", "Type: Security"],
255
- configure_sections: {},
256
- add_sections: {},
257
- issue_line_labels: [],
258
- max_issues: nil,
259
- simple_list: false,
260
- ssl_ca_file: nil,
261
- verbose: true,
262
- header: "# Changelog",
263
- merge_prefix: "**Merged pull requests:**",
264
- issue_prefix: "**Closed issues:**",
265
- summary_prefix: "",
266
- breaking_prefix: "**Breaking changes:**",
267
- enhancement_prefix: "**Implemented enhancements:**",
268
- bug_prefix: "**Fixed bugs:**",
269
- deprecated_prefix: "**Deprecated:**",
270
- removed_prefix: "**Removed:**",
271
- security_prefix: "**Security fixes:**",
272
- http_cache: true,
273
- require: []
274
- )
41
+ # @return [Options] Default options
42
+ def default_options
43
+ Options.new(
44
+ date_format: "%Y-%m-%d",
45
+ output: "CHANGELOG.md",
46
+ base: "HISTORY.md",
47
+ issues: true,
48
+ add_issues_wo_labels: true,
49
+ add_pr_wo_labels: true,
50
+ pulls: true,
51
+ filter_issues_by_milestone: true,
52
+ issues_of_open_milestones: true,
53
+ author: true,
54
+ unreleased: true,
55
+ unreleased_label: "Unreleased",
56
+ compare_link: true,
57
+ exclude_labels: ["duplicate", "question", "invalid", "wontfix", "Duplicate", "Question", "Invalid", "Wontfix", "Meta: Exclude From Changelog"],
58
+ summary_labels: ["Release summary", "release-summary", "Summary", "summary"],
59
+ breaking_labels: ["backwards-incompatible", "Backwards incompatible", "breaking"],
60
+ enhancement_labels: ["enhancement", "Enhancement", "Type: Enhancement"],
61
+ bug_labels: ["bug", "Bug", "Type: Bug"],
62
+ deprecated_labels: ["deprecated", "Deprecated", "Type: Deprecated"],
63
+ removed_labels: ["removed", "Removed", "Type: Removed"],
64
+ security_labels: ["security", "Security", "Type: Security"],
65
+ configure_sections: {},
66
+ add_sections: {},
67
+ issue_line_labels: [],
68
+ max_issues: nil,
69
+ simple_list: false,
70
+ ssl_ca_file: nil,
71
+ verbose: true,
72
+ header: "# Changelog",
73
+ merge_prefix: "**Merged pull requests:**",
74
+ issue_prefix: "**Closed issues:**",
75
+ summary_prefix: "",
76
+ breaking_prefix: "**Breaking changes:**",
77
+ enhancement_prefix: "**Implemented enhancements:**",
78
+ bug_prefix: "**Fixed bugs:**",
79
+ deprecated_prefix: "**Deprecated:**",
80
+ removed_prefix: "**Removed:**",
81
+ security_prefix: "**Security fixes:**",
82
+ http_cache: true,
83
+ require: [],
84
+ config_file: ".github_changelog_generator"
85
+ )
86
+ end
275
87
  end
276
88
  end
277
89
  end