Compare commits

..

41 Commits

Author SHA1 Message Date
Petr Korolev
0c96db9490 Merge branch 'aw/all-merged' of https://github.com/olleolleolle/github-changelog-generator into olleolleolle-aw/all-merged 2016-09-29 19:12:21 +03:00
Olle Jonsson
1c8a2d29ea Style: Use attr_reader for options
- prefer parentheses
2016-09-28 00:49:10 +02:00
Olle Jonsson
fe0fd94ea3 Typo: variable rename 2016-09-28 00:14:26 +02:00
Olle Jonsson
3fc0012de2 VCR: Try to use frobnitz as default token 2016-09-28 00:10:51 +02:00
Olle Jonsson
de525fb1e8 Typo, renamed var 2016-09-27 23:54:17 +02:00
Olle Jonsson
cacd6dc3c8 Travis: Specific gemfiles 2016-09-27 23:50:32 +02:00
Olle Jonsson
db1ffdd59b Linting 2016-09-27 23:44:49 +02:00
Olle Jonsson
0189c2d736 Remove Gemfile.lock 2016-09-27 23:05:41 +02:00
Olle Jonsson
559defcb55 VCR to censor ENV['CHANGELOG_GITHUB_TOKEN'] 2016-09-27 23:03:41 +02:00
Olle Jonsson
0fc6da1a75 Style 2016-09-27 23:03:40 +02:00
Olle Jonsson
4b50b5b257 GeneratorTagsSpec: change name of a test 2016-09-27 23:03:04 +02:00
Olle Jonsson
f98cc8f292 OctoFetcher spec: The new assignees field 2016-09-27 23:03:04 +02:00
Olle Jonsson
8056600180 Style: use the short form for RSpec metadata 2016-09-27 23:02:27 +02:00
Olle Jonsson
6d45d90a5f Drop Hashie dependency 2016-09-27 23:01:14 +02:00
Olle Jonsson
3df84403c4 WIP Remove github_api gem, smaller dependencies
- use VCR with metadata instead of macros
  - upgrade colorize gem
2016-09-27 23:00:34 +02:00
Andrew Waage
1763f9c8ea fixed a bug in fetching tags 2016-09-27 22:58:55 +02:00
Andrew Waage
180b4cb6c9 fixed one bug in filtering excluded tags 2016-09-27 22:58:55 +02:00
Andrew Waage
b82aa64eee fixed 1 bug to work with octokit api 2016-09-27 22:58:55 +02:00
Andrew Waage
cb6286fb83 merged in the tag fixes 2016-09-27 22:58:55 +02:00
Andrew Waage
7dcf617d61 fixed bug in each_with_object 2016-09-27 22:57:43 +02:00
Andrew Waage
e89b03fe48 fixing rubocop and removing original fetcher 2016-09-27 22:56:30 +02:00
Andrew Waage
9ff27b690f max thread 1 2016-09-27 22:46:16 +02:00
Andrew Waage
bcf57dbe0e changing max threads to 4 2016-09-27 22:46:16 +02:00
Andrew Waage
4cfb1e4a5f cleaned up caching and added to options parser 2016-09-27 22:46:16 +02:00
Andrew Waage
b81f8a4169 minor clean up 2016-09-27 22:46:16 +02:00
Andrew Waage
3179f29a7c fixed some handling of hashes 2016-09-27 22:46:16 +02:00
Andrew Waage
aee2f43235 made old fetcher compatible 2016-09-27 22:46:16 +02:00
Andrew Waage
63b3de1281 fixing specs 2016-09-27 22:46:16 +02:00
Andrew Waage
0517674f04 one more place for stringify keys 2016-09-27 22:46:16 +02:00
Andrew Waage
53b0684e67 stringify more keys 2016-09-27 22:46:16 +02:00
Andrew Waage
ca5d6d9675 using strings instead of symbols 2016-09-27 22:46:16 +02:00
Andrew Waage
3cb3584bb9 reverting the old fetcher where I changed to string 2016-09-27 22:45:10 +02:00
Andrew Waage
4fb674b68e added specs for the new octo_fetcher. Also had to refactor a bit to deal with hashes and arrays instead of objects 2016-09-27 22:45:10 +02:00
Andrew Waage
e494fc004e added VCR and specs for original fetcher 2016-09-27 22:38:25 +02:00
Andrew Waage
4ecb21c0b0 first pass at caching. still WIP. Need to parameterize some things 2016-09-27 22:37:26 +02:00
Andrew Waage
3cf2802d9a fixed some bugs and how errors were rescued 2016-09-27 22:34:30 +02:00
Andrew Waage
507b89c665 changed the format of how dates are fetched from commit 2016-09-27 22:34:30 +02:00
Andrew Waage
cd14a86f84 changed the rescued exceptions 2016-09-27 22:34:30 +02:00
Andrew Waage
5d7098282d moved parse_url_for_vars to private method 2016-09-27 22:34:30 +02:00
Andrew Waage
0751082526 clean up 2016-09-27 22:34:30 +02:00
Andrew Waage
baa4e3e659 created a new fetcher with octokit. functionality should remain same 2016-09-27 22:34:30 +02:00
28 changed files with 193 additions and 758 deletions

1
.gitignore vendored
View File

@@ -9,4 +9,3 @@ doc
.yardoc .yardoc
Gemfile.lock Gemfile.lock
gemfiles/Gemfile.2_4_0.lock gemfiles/Gemfile.2_4_0.lock
gemfiles/Gemfile.jruby-9.1.5.0.lock

View File

@@ -1,11 +1,20 @@
# This configuration was generated by # This configuration was generated by
# `rubocop --auto-gen-config` # `rubocop --auto-gen-config`
# on 2016-09-30 23:56:15 +0200 using RuboCop version 0.43.0. # on 2016-02-23 17:18:27 +0200 using RuboCop version 0.37.2.
# The point is for the user to remove these configuration records # The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base. # one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new # Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again. # versions of RuboCop, may require this file to be generated again.
# Offense count: 1
Lint/ImplicitStringConcatenation:
Exclude:
- 'lib/github_changelog_generator/parser.rb'
# Offense count: 14
Metrics/AbcSize:
Enabled: false
# Offense count: 1 # Offense count: 1
Metrics/CyclomaticComplexity: Metrics/CyclomaticComplexity:
Max: 7 Max: 7
@@ -13,3 +22,30 @@ Metrics/CyclomaticComplexity:
# Offense count: 2 # Offense count: 2
Metrics/PerceivedComplexity: Metrics/PerceivedComplexity:
Max: 8 Max: 8
# Offense count: 1
Style/AccessorMethodName:
Enabled: false
# Offense count: 10
Style/Documentation:
Enabled: false
# Offense count: 1
# Configuration parameters: MinBodyLength.
Style/GuardClause:
Enabled: false
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
# SupportedStyles: skip_modifier_ifs, always
Style/Next:
Enabled: false
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
# SupportedStyles: slashes, percent_r, mixed
Style/RegexpLiteral:
Enabled: false

View File

@@ -17,13 +17,8 @@ matrix:
gemfile: gemfiles/Gemfile.2_1 gemfile: gemfiles/Gemfile.2_1
- rvm: 2.3.1 - rvm: 2.3.1
gemfile: gemfiles/Gemfile.2_3_1 gemfile: gemfiles/Gemfile.2_3_1
- rvm: 2.4.0-preview3 - rvm: 2.4.0-preview2
gemfile: gemfiles/Gemfile.2_4_0 gemfile: gemfiles/Gemfile.2_4_0
- rvm: jruby-9.1.6.0
jdk: oraclejdk8
gemfile: gemfiles/Gemfile.jruby-9.1
env:
- JRUBY_OPTS=--debug
notifications: notifications:
email: email:

View File

@@ -1,70 +1,5 @@
# Change Log # Change Log
## [v1.14.0](https://github.com/skywinder/github-changelog-generator/tree/v1.14.0) (2016-11-05)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.2...v1.14.0)
**Implemented enhancements:**
- On OctoKit::Forbidden error: retry with exponential backoff [\#434](https://github.com/skywinder/github-changelog-generator/pull/434) ([awaage](https://github.com/awaage))
- Use octokit, carrying awaage commits [\#422](https://github.com/skywinder/github-changelog-generator/pull/422) ([olleolleolle](https://github.com/olleolleolle))
- Add option to show selected labels in the issue line [\#418](https://github.com/skywinder/github-changelog-generator/pull/418) ([aih](https://github.com/aih))
**Fixed bugs:**
- unreleased and unreleased-label [\#374](https://github.com/skywinder/github-changelog-generator/issues/374)
- Problems installing 1.11.7 on Windows when git absent [\#349](https://github.com/skywinder/github-changelog-generator/issues/349)
**Closed issues:**
- broken issue-line-labels in log [\#442](https://github.com/skywinder/github-changelog-generator/issues/442)
- Broken multi hyphen options in param file [\#440](https://github.com/skywinder/github-changelog-generator/issues/440)
- Install error on Mac: "rack requires Ruby version \>= 2.2.2" [\#425](https://github.com/skywinder/github-changelog-generator/issues/425)
- Changelog includes issues going back months too far [\#394](https://github.com/skywinder/github-changelog-generator/issues/394)
**Merged pull requests:**
- Fixed issue \#442 - broken issue-line-labels in log. [\#443](https://github.com/skywinder/github-changelog-generator/pull/443) ([thorsteneckel](https://github.com/thorsteneckel))
- Fixed issue \#440 - broken multi hyphen options in param file. [\#441](https://github.com/skywinder/github-changelog-generator/pull/441) ([thorsteneckel](https://github.com/thorsteneckel))
- Option --unreleased-label explained [\#439](https://github.com/skywinder/github-changelog-generator/pull/439) ([olleolleolle](https://github.com/olleolleolle))
- Fixed issue \#304 - entries of previous tags are included. [\#438](https://github.com/skywinder/github-changelog-generator/pull/438) ([thorsteneckel](https://github.com/thorsteneckel))
- man page: Add undescribed options [\#437](https://github.com/skywinder/github-changelog-generator/pull/437) ([olleolleolle](https://github.com/olleolleolle))
- On GitHub MAX\_THREAD\_NUMBER is 25 [\#433](https://github.com/skywinder/github-changelog-generator/pull/433) ([olleolleolle](https://github.com/olleolleolle))
- OctoFetcher, Options: Refactoring [\#432](https://github.com/skywinder/github-changelog-generator/pull/432) ([olleolleolle](https://github.com/olleolleolle))
- Fix typo in Readme [\#431](https://github.com/skywinder/github-changelog-generator/pull/431) ([rmtheis](https://github.com/rmtheis))
- Fix: Turn Sawyer method into String-keyed hash access [\#429](https://github.com/skywinder/github-changelog-generator/pull/429) ([olleolleolle](https://github.com/olleolleolle))
- Spec: Test a url helper function [\#428](https://github.com/skywinder/github-changelog-generator/pull/428) ([olleolleolle](https://github.com/olleolleolle))
- Rubocop TODO file regenerated [\#427](https://github.com/skywinder/github-changelog-generator/pull/427) ([olleolleolle](https://github.com/olleolleolle))
- Drop a stray Markdown file [\#426](https://github.com/skywinder/github-changelog-generator/pull/426) ([olleolleolle](https://github.com/olleolleolle))
- Travis: Add JRuby 9.1.5.0 to matrix [\#424](https://github.com/skywinder/github-changelog-generator/pull/424) ([olleolleolle](https://github.com/olleolleolle))
## [1.13.2](https://github.com/skywinder/github-changelog-generator/tree/1.13.2) (2016-09-29)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/v1.13.2...1.13.2)
## [v1.13.2](https://github.com/skywinder/github-changelog-generator/tree/v1.13.2) (2016-09-29)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.1...v1.13.2)
**Implemented enhancements:**
- Replace GPL'd colorize gem with MIT-licensed rainbow [\#408](https://github.com/skywinder/github-changelog-generator/pull/408) ([jamesc](https://github.com/jamesc))
- Limit number of simultaneous requests to 25 [\#407](https://github.com/skywinder/github-changelog-generator/pull/407) ([jkeiser](https://github.com/jkeiser))
- Report actual github error when rate limit exceeded [\#405](https://github.com/skywinder/github-changelog-generator/pull/405) ([jkeiser](https://github.com/jkeiser))
- Make error messages print on error [\#404](https://github.com/skywinder/github-changelog-generator/pull/404) ([jkeiser](https://github.com/jkeiser))
**Fixed bugs:**
- Fetching events for issues and PRs triggers abuse rate limits [\#406](https://github.com/skywinder/github-changelog-generator/issues/406)
**Merged pull requests:**
- Add bump gem to development deps [\#423](https://github.com/skywinder/github-changelog-generator/pull/423) ([olleolleolle](https://github.com/olleolleolle))
- Skip logger helper in coverage [\#421](https://github.com/skywinder/github-changelog-generator/pull/421) ([olleolleolle](https://github.com/olleolleolle))
- Travis: Test on 2.4.0-preview2 [\#420](https://github.com/skywinder/github-changelog-generator/pull/420) ([olleolleolle](https://github.com/olleolleolle))
- Travis: Collecting the config, gemspec: extract development deps to Gemfile [\#417](https://github.com/skywinder/github-changelog-generator/pull/417) ([olleolleolle](https://github.com/olleolleolle))
- Update README.md [\#415](https://github.com/skywinder/github-changelog-generator/pull/415) ([dijonkitchen](https://github.com/dijonkitchen))
- README: Add Gitter badge [\#413](https://github.com/skywinder/github-changelog-generator/pull/413) ([olleolleolle](https://github.com/olleolleolle))
- CircleCI hook for Gitter notification [\#411](https://github.com/skywinder/github-changelog-generator/pull/411) ([olleolleolle](https://github.com/olleolleolle))
- Spec: avoid Ruby warning about already-defined constant [\#409](https://github.com/skywinder/github-changelog-generator/pull/409) ([olleolleolle](https://github.com/olleolleolle))
## [1.13.1](https://github.com/skywinder/github-changelog-generator/tree/1.13.1) (2016-07-22) ## [1.13.1](https://github.com/skywinder/github-changelog-generator/tree/1.13.1) (2016-07-22)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.0...1.13.1) [Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.13.0...1.13.1)

View File

@@ -10,10 +10,6 @@ group :development, :test do
gem "rubocop", ">= 0.43" gem "rubocop", ">= 0.43"
end end
group :development do
gem "bump"
end
group :test do group :test do
gem "vcr" gem "vcr"
gem "multi_json" gem "multi_json"

View File

@@ -228,7 +228,7 @@ If you're seeing this warning, please do the following:
- ***My Ruby version is very old, can I use this?*** - ***My Ruby version is very old, can I use this?***
When your Ruby is old, and you don't want to upgrade, and you want to When your Ruby is old, and you don't want to upgrade, and your want to
control which libraries you use, you can use Bundler. control which libraries you use, you can use Bundler.
In a Gemfile, perhaps in a non-deployed `:development` group, add this In a Gemfile, perhaps in a non-deployed `:development` group, add this

View File

@@ -1,3 +0,0 @@
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
gem 'rack', '>= 2'

View File

@@ -26,9 +26,7 @@ Gem::Specification.new do |spec|
spec.add_runtime_dependency "rake", ">= 10.0" spec.add_runtime_dependency "rake", ">= 10.0"
spec.add_runtime_dependency "rainbow", ">= 2.1" spec.add_runtime_dependency "rainbow", ">= 2.1"
spec.add_runtime_dependency("octokit", ["~> 4.6"]) spec.add_runtime_dependency("octokit", ["~> 4.0"])
spec.add_runtime_dependency("faraday-http-cache") spec.add_runtime_dependency("faraday-http-cache")
spec.add_runtime_dependency("activesupport") spec.add_runtime_dependency("activesupport")
spec.add_runtime_dependency("retriable", ["~> 2.1"])
spec.add_runtime_dependency("multi_json")
end end

58
lib/CHANGELOG.md Normal file
View File

@@ -0,0 +1,58 @@
# Change Log
## [Unreleased](https://github.com/skywinder/changelog_test/tree/HEAD)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/0.0.4...HEAD)
**Implemented enhancements:**
- Enchancment [\#9](https://github.com/skywinder/changelog_test/issues/9)
- PR with enhancement label [\#16](https://github.com/skywinder/changelog_test/pull/16) ([skywinder](https://github.com/skywinder))
**Fixed bugs:**
- BugFix [\#11](https://github.com/skywinder/changelog_test/issues/11)
**Closed issues:**
- Issue closed from commit from PR [\#14](https://github.com/skywinder/changelog_test/issues/14)
- Issue, closed by PR [\#12](https://github.com/skywinder/changelog_test/issues/12)
- Issue [\#10](https://github.com/skywinder/changelog_test/issues/10)
- Issue with some other label - Should be in closed issues [\#8](https://github.com/skywinder/changelog_test/issues/8)
**Merged pull requests:**
- Merged br \(should appear in change log also\) [\#21](https://github.com/skywinder/changelog_test/pull/21) ([skywinder](https://github.com/skywinder))
- This a PR with a lot of comments and events [\#17](https://github.com/skywinder/changelog_test/pull/17) ([skywinder](https://github.com/skywinder))
- This PR closes 14 from commit [\#15](https://github.com/skywinder/changelog_test/pull/15) ([skywinder](https://github.com/skywinder))
- This PR to close \#12 from body [\#13](https://github.com/skywinder/changelog_test/pull/13) ([skywinder](https://github.com/skywinder))
## [0.0.4](https://github.com/skywinder/changelog_test/tree/0.0.4) (2015-05-22)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.3...0.0.4)
**Closed issues:**
- Test issue, that should appear in 0.0.4 [\#3](https://github.com/skywinder/changelog_test/issues/3)
**Merged pull requests:**
- Add automatically generated change log file. [\#5](https://github.com/skywinder/changelog_test/pull/5) ([skywinder](https://github.com/skywinder))
## [v0.0.3](https://github.com/skywinder/changelog_test/tree/v0.0.3) (2015-03-04)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.2...v0.0.3)
**Merged pull requests:**
- fix \#3. hotfix. Should appear in v0.0.3 [\#4](https://github.com/skywinder/changelog_test/pull/4) ([skywinder](https://github.com/skywinder))
## [v0.0.2](https://github.com/skywinder/changelog_test/tree/v0.0.2) (2015-03-04)
[Full Changelog](https://github.com/skywinder/changelog_test/compare/v0.0.1...v0.0.2)
**Merged pull requests:**
- Here is a test hotfix should appear in v.0.0.2 [\#2](https://github.com/skywinder/changelog_test/pull/2) ([skywinder](https://github.com/skywinder))
## [v0.0.1](https://github.com/skywinder/changelog_test/tree/v0.0.1) (2015-03-02)
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*

View File

@@ -10,12 +10,13 @@ require "multi_json"
require "benchmark" require "benchmark"
require_relative "github_changelog_generator/helper" require_relative "github_changelog_generator/helper"
require_relative "github_changelog_generator/options"
require_relative "github_changelog_generator/parser" require_relative "github_changelog_generator/parser"
require_relative "github_changelog_generator/parser_file" require_relative "github_changelog_generator/parser_file"
require_relative "github_changelog_generator/generator/generator" require_relative "github_changelog_generator/generator/generator"
require_relative "github_changelog_generator/version" require_relative "github_changelog_generator/version"
require_relative "github_changelog_generator/reader" require_relative "github_changelog_generator/reader"
require_relative "github_changelog_generator/hash"
require_relative "github_changelog_generator/array"
# The main module, where placed all classes (now, at least) # The main module, where placed all classes (now, at least)
module GitHubChangelogGenerator module GitHubChangelogGenerator

View File

@@ -0,0 +1,14 @@
# frozen_string_literal: true
class Array
def stringify_keys_deep!
new_ar = []
each do |value|
new_value = value
if value.is_a?(Hash) || value.is_a?(Array)
new_value = value.stringify_keys_deep!
end
new_ar << new_value
end
new_ar
end
end

View File

@@ -11,7 +11,7 @@ module GitHubChangelogGenerator
end end
class Generator class Generator
attr_accessor :options, :filtered_tags, :github, :tag_section_mapping, :sorted_tags attr_accessor :options, :filtered_tags, :github, :tag_section_mapping
# A Generator responsible for all logic, related with change log generation from ready-to-parse issues # A Generator responsible for all logic, related with change log generation from ready-to-parse issues
# #

View File

@@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
module GitHubChangelogGenerator module GitHubChangelogGenerator
class Generator class Generator
MAX_THREAD_NUMBER = 25 MAX_THREAD_NUMBER = 1
# Fetch event for issues and pull requests # Fetch event for issues and pull requests
# @return [Array] array of fetched issues # @return [Array] array of fetched issues

View File

@@ -25,7 +25,7 @@ module GitHubChangelogGenerator
end end
# @param [Array] issues List of issues on sub-section # @param [Array] issues List of issues on sub-section
# @param [String] prefix Name of sub-section # @param [String] prefix Nae of sub-section
# @return [String] Generate ready-to-go sub-section # @return [String] Generate ready-to-go sub-section
def generate_sub_section(issues, prefix) def generate_sub_section(issues, prefix)
log = "" log = ""
@@ -126,8 +126,7 @@ module GitHubChangelogGenerator
def generate_unreleased_section def generate_unreleased_section
log = "" log = ""
if options[:unreleased] if options[:unreleased]
start_tag = filtered_tags[0] || sorted_tags.last unreleased_log = generate_log_between_tags(filtered_tags[0], nil)
unreleased_log = generate_log_between_tags(start_tag, nil)
log += unreleased_log if unreleased_log log += unreleased_log if unreleased_log
end end
log log
@@ -144,25 +143,13 @@ module GitHubChangelogGenerator
encapsulated_title = encapsulate_string issue["title"] encapsulated_title = encapsulate_string issue["title"]
title_with_number = "#{encapsulated_title} [\\##{issue['number']}](#{issue['html_url']})" title_with_number = "#{encapsulated_title} [\\##{issue['number']}](#{issue['html_url']})"
if options[:issue_line_labels].present?
title_with_number = "#{title_with_number}#{line_labels_for(issue)}"
end
issue_line_with_user(title_with_number, issue) issue_line_with_user(title_with_number, issue)
end end
private private
def line_labels_for(issue)
labels = if options[:issue_line_labels] == ["ALL"]
issue["labels"]
else
issue["labels"].select { |label| options[:issue_line_labels].include?(label["name"]) }
end
labels.map { |label| " \[[#{label['name']}](#{label['url'].sub('api.github.com/repos', 'github.com')})\]" }.join("")
end
def issue_line_with_user(line, issue) def issue_line_with_user(line, issue)
return line if !options[:author] || issue["pull_request"].nil? return line if !options[:author] || issue.pull_request.nil?
user = issue["user"] user = issue["user"]
return "#{line} ({Null user})" unless user return "#{line} ({Null user})" unless user

View File

@@ -72,8 +72,6 @@ module GitHubChangelogGenerator
# in case if not tags specified - return unchanged array # in case if not tags specified - return unchanged array
return issues if older_tag.nil? && newer_tag.nil? return issues if older_tag.nil? && newer_tag.nil?
older_tag = ensure_older_tag(older_tag, newer_tag)
newer_tag_time = newer_tag && get_time_of_tag(newer_tag) newer_tag_time = newer_tag && get_time_of_tag(newer_tag)
older_tag_time = older_tag && get_time_of_tag(older_tag) older_tag_time = older_tag && get_time_of_tag(older_tag)
@@ -94,14 +92,6 @@ module GitHubChangelogGenerator
end end
end end
def ensure_older_tag(older_tag, newer_tag)
return older_tag if older_tag
idx = sorted_tags.index { |t| t["name"] == newer_tag["name"] }
# skip if we are already at the oldest element
return if idx == sorted_tags.size - 1
sorted_tags[idx - 1]
end
def tag_older_new_tag?(newer_tag_time, time) def tag_older_new_tag?(newer_tag_time, time)
tag_in_range_new = if newer_tag_time.nil? tag_in_range_new = if newer_tag_time.nil?
true true

View File

@@ -10,7 +10,7 @@ module GitHubChangelogGenerator
included_tags = filter_excluded_tags(all_tags) included_tags = filter_excluded_tags(all_tags)
fetch_tags_dates(all_tags) # Creates a Hash @tag_times_hash fetch_tags_dates(all_tags) # Creates a Hash @tag_times_hash
@sorted_tags = sort_tags_by_date(included_tags) sorted_tags = sort_tags_by_date(included_tags)
@filtered_tags = get_filtered_tags(included_tags) @filtered_tags = get_filtered_tags(included_tags)
@tag_section_mapping = build_tag_section_mapping(@filtered_tags, sorted_tags) @tag_section_mapping = build_tag_section_mapping(@filtered_tags, sorted_tags)

View File

@@ -0,0 +1,16 @@
# frozen_string_literal: true
class Hash
def stringify_keys_deep!
new_hash = {}
keys.each do |k|
ks = k.respond_to?(:to_s) ? k.to_s : k
new_hash[ks] = if values_at(k).first.is_a?(Hash) || values_at(k).first.is_a?(Array)
values_at(k).first.send(:stringify_keys_deep!)
else
values_at(k).first
end
end
new_hash
end
end

View File

@@ -1,5 +1,4 @@
# frozen_string_literal: true # frozen_string_literal: true
require "retriable"
module GitHubChangelogGenerator module GitHubChangelogGenerator
# A Fetcher responsible for all requests to GitHub and all basic manipulation with related data # A Fetcher responsible for all requests to GitHub and all basic manipulation with related data
# (such as filtering, validating, e.t.c) # (such as filtering, validating, e.t.c)
@@ -8,8 +7,7 @@ module GitHubChangelogGenerator
# fetcher = GitHubChangelogGenerator::OctoFetcher.new(options) # fetcher = GitHubChangelogGenerator::OctoFetcher.new(options)
class OctoFetcher class OctoFetcher
PER_PAGE_NUMBER = 100 PER_PAGE_NUMBER = 100
MAX_THREAD_NUMBER = 25 MAX_THREAD_NUMBER = 1
MAX_FORBIDDEN_RETRIES = 100
CHANGELOG_GITHUB_TOKEN = "CHANGELOG_GITHUB_TOKEN" CHANGELOG_GITHUB_TOKEN = "CHANGELOG_GITHUB_TOKEN"
GH_RATE_LIMIT_EXCEEDED_MSG = "Warning: Can't finish operation: GitHub API rate limit exceeded, change log may be " \ GH_RATE_LIMIT_EXCEEDED_MSG = "Warning: Can't finish operation: GitHub API rate limit exceeded, change log may be " \
"missing some issues. You can limit the number of issues fetched using the `--max-issues NUM` argument." "missing some issues. You can limit the number of issues fetched using the `--max-issues NUM` argument."
@@ -81,7 +79,7 @@ module GitHubChangelogGenerator
last_response = client.last_response last_response = client.last_response
if (last_pg = last_response.rels[:last]) if (last_pg = last_response.rels[:last])
querystring_as_hash(last_pg.href)["page"].to_i parse_url_for_vars(last_pg.href)["page"].to_i
else else
1 1
end end
@@ -109,7 +107,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
Helper.log.info "Found #{tags.count} tags" Helper.log.info "Found #{tags.count} tags"
end end
# tags are a Sawyer::Resource. Convert to hash # tags are a Sawyer::Resource. Convert to hash
tags = tags.map { |h| stringify_keys_deep(h.to_hash) } tags = tags.map { |h| h.to_hash.stringify_keys_deep! }
tags tags
end end
@@ -139,7 +137,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
print_empty_line print_empty_line
Helper.log.info "Received issues: #{issues.count}" Helper.log.info "Received issues: #{issues.count}"
issues = issues.map { |h| stringify_keys_deep(h.to_hash) } issues = issues.map { |h| h.to_hash.stringify_keys_deep! }
# separate arrays of issues and pull requests: # separate arrays of issues and pull requests:
issues.partition do |x| issues.partition do |x|
@@ -170,7 +168,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
print_empty_line print_empty_line
Helper.log.info "Pull Request count: #{pull_requests.count}" Helper.log.info "Pull Request count: #{pull_requests.count}"
pull_requests = pull_requests.map { |h| stringify_keys_deep(h.to_hash) } pull_requests = pull_requests.map { |h| h.to_hash.stringify_keys_deep! }
pull_requests pull_requests
end end
@@ -189,7 +187,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
iterate_pages(@client, "issue_events", issue["number"], {}) do |new_event| iterate_pages(@client, "issue_events", issue["number"], {}) do |new_event|
issue["events"].concat(new_event) issue["events"].concat(new_event)
end end
issue["events"] = issue["events"].map { |h| stringify_keys_deep(h.to_hash) } issue["events"] = issue["events"].map { |h| h.to_hash.stringify_keys_deep! }
print_in_same_line("Fetching events for issues and PR: #{i + 1}/#{issues.count}") print_in_same_line("Fetching events for issues and PR: #{i + 1}/#{issues.count}")
i += 1 i += 1
end end
@@ -211,7 +209,7 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
# @return [Time] time of specified tag # @return [Time] time of specified tag
def fetch_date_of_tag(tag) def fetch_date_of_tag(tag)
commit_data = check_github_response { @client.commit(user_project, tag["commit"]["sha"]) } commit_data = check_github_response { @client.commit(user_project, tag["commit"]["sha"]) }
commit_data = stringify_keys_deep(commit_data.to_hash) commit_data = commit_data.to_hash.stringify_keys_deep!
commit_data["commit"]["committer"]["date"] commit_data["commit"]["committer"]["date"]
end end
@@ -222,118 +220,62 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
def fetch_commit(event) def fetch_commit(event)
check_github_response do check_github_response do
commit = @client.commit(user_project, event["commit_id"]) commit = @client.commit(user_project, event["commit_id"])
commit = stringify_keys_deep(commit.to_hash) commit = commit.to_hash.stringify_keys_deep!
commit commit
end end
end end
private private
def stringify_keys_deep(indata)
case indata
when Array
indata.map do |value|
stringify_keys_deep(value)
end
when Hash
indata.each_with_object({}) do |(k, v), output|
output[k.to_s] = stringify_keys_deep(v)
end
else
indata
end
end
MovedPermanentlyError = Class.new(RuntimeError)
# Iterates through all pages until there are no more :next pages to follow # Iterates through all pages until there are no more :next pages to follow
# yields the result per page # yields the result per page
# #
# @param [Octokit::Client] client # @param [Octokit::Client] client
# @param [String] method (eg. 'tags') # @param [String] method (eg. 'tags')
#
# @yield [Sawyer::Resource] An OctoKit-provided response (which can be empty)
#
# @return [Integer] total number of pages # @return [Integer] total number of pages
def iterate_pages(client, method, *args) def iterate_pages(client, method, *args)
request_opts = extract_request_args(args) if args.size == 1 && args.first.is_a?(Hash)
args.push(@request_options.merge(request_opts)) request_options = args.delete_at(0)
elsif args.size > 1 && args.last.is_a?(Hash)
number_of_pages = 1 request_options = args.delete_at(args.length - 1)
check_github_response { client.send(method, user_project, *args) }
last_response = client.last_response
if last_response.status == 301
raise MovedPermanentlyError, last_response.data[:url]
end end
yield(last_response.data) args.push(@request_options.merge(request_options))
pages = 1
check_github_response do
client.send(method, user_project, *args)
end
last_response = client.last_response
yield last_response.data
until (next_one = last_response.rels[:next]).nil? until (next_one = last_response.rels[:next]).nil?
number_of_pages += 1 pages += 1
last_response = check_github_response { next_one.get } last_response = check_github_response { next_one.get }
yield(last_response.data) yield last_response.data
end end
number_of_pages pages
end
def extract_request_args(args)
if args.size == 1 && args.first.is_a?(Hash)
args.delete_at(0)
elsif args.size > 1 && args.last.is_a?(Hash)
args.delete_at(args.length - 1)
else
{}
end
end end
# This is wrapper with rescue block # This is wrapper with rescue block
# #
# @return [Object] returns exactly the same, what you put in the block, but wrap it with begin-rescue block # @return [Object] returns exactly the same, what you put in the block, but wrap it with begin-rescue block
def check_github_response def check_github_response
Retriable.retriable(retry_options) do begin
yield value = yield
end
rescue MovedPermanentlyError => e
Helper.log.error("#{e.class}: #{e.message}")
sys_abort("The repository has moved, please update your configuration")
rescue Octokit::Forbidden => e
Helper.log.error("#{e.class}: #{e.message}")
sys_abort("Exceeded retry limit")
rescue Octokit::Unauthorized => e rescue Octokit::Unauthorized => e
Helper.log.error("#{e.class}: #{e.message}") Helper.log.error e.message
sys_abort("Error: wrong GitHub token") abort "Error: wrong GitHub token"
end rescue Octokit::Forbidden => e
Helper.log.warn e.message
# Exponential backoff
def retry_options
{
on: [Octokit::Forbidden],
tries: MAX_FORBIDDEN_RETRIES,
base_interval: sleep_base_interval,
multiplier: 1.0,
rand_factor: 0.0,
on_retry: retry_callback
}
end
def sleep_base_interval
1.0
end
def retry_callback
proc do |exception, try, elapsed_time, next_interval|
Helper.log.warn("RETRY - #{exception.class}: '#{exception.message}'")
Helper.log.warn("#{try} tries in #{elapsed_time} seconds and #{next_interval} seconds until the next try")
Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG Helper.log.warn GH_RATE_LIMIT_EXCEEDED_MSG
Helper.log.warn @client.rate_limit Helper.log.warn @client.rate_limit
end end
end value
def sys_abort(msg)
abort(msg)
end end
# Print specified line on the same string # Print specified line on the same string
@@ -365,12 +307,16 @@ Make sure, that you push tags to remote repo via 'git push --tags'"
"#{@options[:user]}/#{@options[:project]}" "#{@options[:user]}/#{@options[:project]}"
end end
# Returns Hash of all querystring variables in given URI. # Parses a URI and returns a hash of all GET variables
# #
# @param [String] uri eg. https://api.github.com/repositories/43914960/tags?page=37&foo=1 # @param [String] uri eg. https://api.github.com/repositories/43914960/tags?page=37&foo=1
# @return [Hash] of all GET variables. eg. { 'page' => 37, 'foo' => 1 } # @return [Hash] of all GET variables. eg. { 'page' => 37, 'foo' => 1 }
def querystring_as_hash(uri) def parse_url_for_vars(uri)
Hash[URI.decode_www_form(URI(uri).query || "")] URI(uri).query.split("&").each_with_object({}) do |get_var, params|
k, v = get_var.split("=")
params[k] = v
params
end
end end
end end
end end

View File

@@ -1,92 +0,0 @@
# frozen_string_literal: true
require "delegate"
module GitHubChangelogGenerator
class Options < SimpleDelegator
UnsupportedOptionError = Class.new(ArgumentError)
KNOWN_OPTIONS = [
:add_issues_wo_labels,
:add_pr_wo_labels,
:author,
:base,
:between_tags,
:bug_labels,
:bug_prefix,
:cache_file,
:cache_log,
:compare_link,
:date_format,
:due_tag,
:enhancement_labels,
:enhancement_prefix,
:exclude_labels,
:exclude_tags,
:exclude_tags_regex,
:filter_issues_by_milestone,
:frontmatter,
:future_release,
:git_remote,
:github_endpoint,
:github_site,
:header,
:http_cache,
:include_labels,
:issue_prefix,
:issue_line_labels,
:issues,
:max_issues,
:merge_prefix,
:output,
:project,
:pulls,
:release_branch,
:release_url,
:simple_list,
:since_tag,
:token,
:unreleased,
:unreleased_label,
:unreleased_only,
:user,
:usernames_as_github_logins,
:verbose
]
THESE_ARE_DIFFERENT = [
:tag1,
:tag2
]
def initialize(values)
super(values)
unsupported_options.any? && raise(UnsupportedOptionError, unsupported_options.inspect)
end
def []=(key, val)
supported_option?(key) || raise(UnsupportedOptionError, key.inspect)
values[key] = val
end
def to_hash
values
end
private
def values
__getobj__
end
def unsupported_options
values.keys - supported_options
end
def supported_option?(key)
supported_options.include?(key)
end
def supported_options
KNOWN_OPTIONS + THESE_ARE_DIFFERENT
end
end
end

View File

@@ -42,7 +42,7 @@ module GitHubChangelogGenerator
# setup parsing options # setup parsing options
def self.setup_parser(options) def self.setup_parser(options)
parser = OptionParser.new do |opts| # rubocop:disable Metrics/BlockLength parser = OptionParser.new do |opts|
opts.banner = "Usage: github_changelog_generator [options]" opts.banner = "Usage: github_changelog_generator [options]"
opts.on("-u", "--user [USER]", "Username of the owner of target GitHub repo") do |last| opts.on("-u", "--user [USER]", "Username of the owner of target GitHub repo") do |last|
options[:user] = last options[:user] = last
@@ -107,7 +107,7 @@ module GitHubChangelogGenerator
opts.on("--[no-]unreleased", "Add to log unreleased closed issues. Default is true") do |v| opts.on("--[no-]unreleased", "Add to log unreleased closed issues. Default is true") do |v|
options[:unreleased] = v options[:unreleased] = v
end end
opts.on("--unreleased-label [label]", "Setup custom label for unreleased closed issues section. Default is \"**Unreleased:**\"") do |v| opts.on("--unreleased-label [label]", "Add to log unreleased closed issues. Default is true") do |v|
options[:unreleased_label] = v options[:unreleased_label] = v
end end
opts.on("--[no-]compare-link", "Include compare link (Full Changelog) between older version and newer version. Default is true") do |v| opts.on("--[no-]compare-link", "Include compare link (Full Changelog) between older version and newer version. Default is true") do |v|
@@ -125,9 +125,6 @@ module GitHubChangelogGenerator
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| 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 options[:enhancement_labels] = list
end end
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
opts.on("--between-tags x,y,z", Array, "Change log will be filled only between specified tags") do |list| opts.on("--between-tags x,y,z", Array, "Change log will be filled only between specified tags") do |list|
options[:between_tags] = list options[:between_tags] = list
end end
@@ -190,7 +187,7 @@ module GitHubChangelogGenerator
# @return [Hash] Default options # @return [Hash] Default options
def self.default_options def self.default_options
Options.new( {
tag1: nil, tag1: nil,
tag2: nil, tag2: nil,
date_format: "%Y-%m-%d", date_format: "%Y-%m-%d",
@@ -208,7 +205,6 @@ module GitHubChangelogGenerator
enhancement_labels: %w(enhancement Enhancement), enhancement_labels: %w(enhancement Enhancement),
bug_labels: %w(bug Bug), bug_labels: %w(bug Bug),
exclude_labels: %w(duplicate question invalid wontfix Duplicate Question Invalid Wontfix), exclude_labels: %w(duplicate question invalid wontfix Duplicate Question Invalid Wontfix),
issue_line_labels: [],
max_issues: nil, max_issues: nil,
simple_list: false, simple_list: false,
verbose: true, verbose: true,
@@ -221,7 +217,7 @@ module GitHubChangelogGenerator
http_cache: true, http_cache: true,
cache_file: "/tmp/github-changelog-http-cache", cache_file: "/tmp/github-changelog-http-cache",
cache_log: "/tmp/github-changelog-logger.log" cache_log: "/tmp/github-changelog-logger.log"
) }
end end
# If `:user` or `:project` not set in options, try setting them # If `:user` or `:project` not set in options, try setting them

View File

@@ -62,11 +62,11 @@ module GitHubChangelogGenerator
# @return [Array<Symbol, String>] # @return [Array<Symbol, String>]
def extract_pair(line) def extract_pair(line)
key, value = line.split("=", 2) key, value = line.split("=", 2)
[key.tr("-", "_").to_sym, value.gsub(/[\n\r]+/, "")] [key.sub("-", "_").to_sym, value.gsub(/[\n\r]+/, "")]
end end
KNOWN_ARRAY_KEYS = [:exclude_labels, :include_labels, :bug_labels, KNOWN_ARRAY_KEYS = [:exclude_labels, :include_labels, :bug_labels,
:enhancement_labels, :issue_line_labels, :between_tags, :exclude_tags] :enhancement_labels, :between_tags, :exclude_tags]
KNOWN_INTEGER_KEYS = [:max_issues] KNOWN_INTEGER_KEYS = [:max_issues]
def convert_value(value, option_name) def convert_value(value, option_name)

View File

@@ -1,4 +1,4 @@
# frozen_string_literal: true # frozen_string_literal: true
module GitHubChangelogGenerator module GitHubChangelogGenerator
VERSION = "1.14.2" VERSION = "1.13.1"
end end

View File

@@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3 .\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3
. .
.TH "GIT\-GENERATE\-CHANGELOG" "1" "November 2016" "" "" .TH "GIT\-GENERATE\-CHANGELOG" "1" "October 2015" "" ""
. .
.SH "NAME" .SH "NAME"
\fBgit\-generate\-changelog\fR \- Generate changelog from github \fBgit\-generate\-changelog\fR \- Generate changelog from github
@@ -73,12 +73,6 @@ Setup custom label for closed\-issues section\. Default is "\fBClosed issues:\fR
Setup custom header label\. Default is "# Change Log" Setup custom header label\. Default is "# Change Log"
. .
.P .P
\-\-front\-matter [JSON]
.
.P
Add YAML front matter\. Formatted as JSON because it\'s easier to add on the command line
.
.P
\-\-pr\-label [LABEL] \-\-pr\-label [LABEL]
. .
.P .P
@@ -121,12 +115,6 @@ Use milestone to detect when issue was resolved\. Default is true
Add author of pull\-request in the end\. Default is true Add author of pull\-request in the end\. Default is true
. .
.P .P
\-\-usernames\-as\-github\-logins
.
.P
Use GitHub tags instead of Markdown links for the author of an issue or pull\-request\.
.
.P
\-\-unreleased\-only \-\-unreleased\-only
. .
.P .P
@@ -142,7 +130,7 @@ Add to log unreleased closed issues\. Default is true
\-\-unreleased\-label [label] \-\-unreleased\-label [label]
. .
.P .P
Setup custom label for unreleased closed issues section\. Default is "\fBUnreleased:\fR" Add to log unreleased closed issues\. Default is true
. .
.P .P
\-\-[no\-]compare\-link \-\-[no\-]compare\-link
@@ -187,12 +175,6 @@ Change log will be filled only between specified tags
Change log will exclude specified tags Change log will exclude specified tags
. .
.P .P
\-\-exclude\-tags\-regex [REGEX]
.
.P
Apply a regular expression on tag names so that they can be excluded, for example: \-\-exclude\-tags\-regex "\.*+\ed{1,}"
.
.P
\-\-since\-tag x \-\-since\-tag x
. .
.P .P
@@ -241,30 +223,6 @@ Create simple list from issues and pull requests\. Default is false\.
Put the unreleased changes in the specified release number\. Put the unreleased changes in the specified release number\.
. .
.P .P
\-\-release\-branch [RELEASE\-BRANCH]
.
.P
Limit pull requests to the release branch, such as master or release
.
.P
\-\-http\-cache
.
.P
Use HTTP Cache to cache Github API requests (useful for large repos) Default is true\.
.
.P
\-\-[no\-]cache\-file [CACHE\-FILE]
.
.P
Filename to use for cache\. Default is /tmp/github\-changelog\-http\-cache
.
.P
\-\-cache\-log [CACHE\-LOG]
.
.P
Filename to use for cache log\. Default is /tmp/github\-changelog\-logger\.log
.
.P
\-\-[no\-]verbose \-\-[no\-]verbose
. .
.P .P

View File

@@ -1,290 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-generate-changelog(1) - Generate changelog from github</title>
<style type='text/css' media='all'>
/* style: man */
body#manpage {margin:0}
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
.mp h2 {margin:10px 0 0 0}
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
.mp h3 {margin:0 0 0 4ex}
.mp dt {margin:0;clear:left}
.mp dt.flush {float:left;width:8ex}
.mp dd {margin:0 0 0 9ex}
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
.mp pre {margin-bottom:20px}
.mp pre+h2,.mp pre+h3 {margin-top:22px}
.mp h2+pre,.mp h3+pre {margin-top:5px}
.mp img {display:block;margin:auto}
.mp h1.man-title {display:none}
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
.mp h2 {font-size:16px;line-height:1.25}
.mp h1 {font-size:20px;line-height:2}
.mp {text-align:justify;background:#fff}
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
.mp u {text-decoration:underline}
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
.mp b.man-ref {font-weight:normal;color:#434241}
.mp pre {padding:0 4ex}
.mp pre code {font-weight:normal;color:#434241}
.mp h2+pre,h3+pre {padding-left:0}
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
ol.man-decor {width:100%}
ol.man-decor li.tl {text-align:left}
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
ol.man-decor li.tr {text-align:right;float:right}
</style>
</head>
<!--
The following styles are deprecated and will be removed at some point:
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
.man-navigation should be used instead.
-->
<body id='manpage'>
<div class='mp' id='man'>
<div class='man-navigation' style='display:none'>
<a href="#NAME">NAME</a>
<a href="#SYNOPSIS">SYNOPSIS</a>
<a href="#DESCRIPTION">DESCRIPTION</a>
<a href="#OPTIONS">OPTIONS</a>
<a href="#EXAMPLES">EXAMPLES</a>
<a href="#AUTHOR">AUTHOR</a>
<a href="#REPORTING-BUGS">REPORTING BUGS</a>
<a href="#SEE-ALSO">SEE ALSO</a>
</div>
<ol class='man-decor man-head man head'>
<li class='tl'>git-generate-changelog(1)</li>
<li class='tc'></li>
<li class='tr'>git-generate-changelog(1)</li>
</ol>
<h2 id="NAME">NAME</h2>
<p class="man-name">
<code>git-generate-changelog</code> - <span class="man-whatis">Generate changelog from github</span>
</p>
<h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git generate-changelog</code> [-h|--help] [-u|--user] [-p|--project]</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2>
<p>Automatically generate change log from your tags, issues, labels and pull requests on GitHub.</p>
<h2 id="OPTIONS">OPTIONS</h2>
<p> -u, --user [USER]</p>
<p> Username of the owner of target GitHub repo</p>
<p> -p, --project [PROJECT]</p>
<p> Name of project on GitHub</p>
<p> -t, --token [TOKEN]</p>
<p> To make more than 50 requests per hour your GitHub token is required. You can generate it at: https://github.com/settings/tokens/new</p>
<p> -f, --date-format [FORMAT]</p>
<p> Date format. Default is %Y-%m-%d</p>
<p> -o, --output [NAME]</p>
<p> Output file. Default is CHANGELOG.md</p>
<p> -b, --base [NAME]</p>
<p> Optional base file to append generated changes to.</p>
<p> --bugs-label [LABEL]</p>
<p> Setup custom label for bug-fixes section. Default is "<strong>Fixed bugs:</strong></p>
<p> --enhancement-label [LABEL]</p>
<p> Setup custom label for enhancements section. Default is "<strong>Implemented enhancements:</strong>"</p>
<p> --issues-label [LABEL]</p>
<p> Setup custom label for closed-issues section. Default is "<strong>Closed issues:</strong>"</p>
<p> --header-label [LABEL]</p>
<p> Setup custom header label. Default is "# Change Log"</p>
<p> --front-matter [JSON]</p>
<p> Add YAML front matter. Formatted as JSON because it's easier to add on the command line</p>
<p> --pr-label [LABEL]</p>
<p> Setup custom label for pull requests section. Default is "<strong>Merged pull requests:</strong>"</p>
<p> --[no-]issues</p>
<p> Include closed issues in changelog. Default is true</p>
<p> --[no-]issues-wo-labels</p>
<p> Include closed issues without labels in changelog. Default is true</p>
<p> --[no-]pr-wo-labels</p>
<p> Include pull requests without labels in changelog. Default is true</p>
<p> --[no-]pull-requests</p>
<p> Include pull-requests in changelog. Default is true</p>
<p> --[no-]filter-by-milestone</p>
<p> Use milestone to detect when issue was resolved. Default is true</p>
<p> --[no-]author</p>
<p> Add author of pull-request in the end. Default is true</p>
<p> --usernames-as-github-logins</p>
<p> Use GitHub tags instead of Markdown links for the author of an issue or pull-request.</p>
<p> --unreleased-only</p>
<p> Generate log from unreleased closed issues only.</p>
<p> --[no-]unreleased</p>
<p> Add to log unreleased closed issues. Default is true</p>
<p> --unreleased-label [label]</p>
<p> Setup custom label for unreleased closed issues section. Default is "<strong>Unreleased:</strong>"</p>
<p> --[no-]compare-link</p>
<p> Include compare link (Full Changelog) between older version and newer version. Default is true</p>
<p> --include-labels x,y,z</p>
<p> Only issues with the specified labels will be included in the changelog.</p>
<p> --exclude-labels x,y,z</p>
<p> Issues with the specified labels will be always excluded from changelog. Default is 'duplicate,question,invalid,wontfix'</p>
<p> --bug-labels x,y,z</p>
<p> Issues with the specified labels will be always added to "Fixed bugs" section. Default is 'bug,Bug'</p>
<p> --enhancement-labels x,y,z</p>
<p> Issues with the specified labels will be always added to "Implemented enhancements" section. Default is 'enhancement,Enhancement'</p>
<p> --between-tags x,y,z</p>
<p> Change log will be filled only between specified tags</p>
<p> --exclude-tags x,y,z</p>
<p> Change log will exclude specified tags</p>
<p> --exclude-tags-regex [REGEX]</p>
<p> Apply a regular expression on tag names so that they can be excluded, for example: --exclude-tags-regex ".*+\d{1,}"</p>
<p> --since-tag x</p>
<p> Change log will start after specified tag</p>
<p> --due-tag x</p>
<p> Change log will end before specified tag</p>
<p> --max-issues [NUMBER]</p>
<p> Max number of issues to fetch from GitHub. Default is unlimited</p>
<p> --release-url [URL]</p>
<p> The URL to point to for release links, in printf format (with the tag as variable).</p>
<p> --github-site [URL]</p>
<p> The Enterprise Github site on which your project is hosted.</p>
<p> --github-api [URL]</p>
<p> The enterprise endpoint to use for your Github API.</p>
<p> --simple-list</p>
<p> Create simple list from issues and pull requests. Default is false.</p>
<p> --future-release [RELEASE-VERSION]</p>
<p> Put the unreleased changes in the specified release number.</p>
<p> --release-branch [RELEASE-BRANCH]</p>
<p> Limit pull requests to the release branch, such as master or release</p>
<p> --http-cache</p>
<p> Use HTTP Cache to cache Github API requests (useful for large repos) Default is true.</p>
<p> --[no-]cache-file [CACHE-FILE]</p>
<p> Filename to use for cache. Default is /tmp/github-changelog-http-cache</p>
<p> --cache-log [CACHE-LOG]</p>
<p> Filename to use for cache log. Default is /tmp/github-changelog-logger.log</p>
<p> --[no-]verbose</p>
<p> Run verbosely. Default is true</p>
<p> -v, --version</p>
<p> Print version number</p>
<p> -h, --help</p>
<p> Displays Help</p>
<h2 id="EXAMPLES">EXAMPLES</h2>
<h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Petr Korolev sky4winder@gmail.com</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
<p>&lt;<a href="https://github.com/skywinder/github-changelog-generator/issues" data-bare-link="true">https://github.com/skywinder/github-changelog-generator/issues</a>&gt;</p>
<h2 id="SEE-ALSO">SEE ALSO</h2>
<p>&lt;<a href="https://github.com/skywinder/github-changelog-generator/" data-bare-link="true">https://github.com/skywinder/github-changelog-generator/</a>&gt;</p>
<ol class='man-decor man-foot man foot'>
<li class='tl'></li>
<li class='tc'>November 2016</li>
<li class='tr'>git-generate-changelog(1)</li>
</ol>
</div>
</body>
</html>

View File

@@ -51,10 +51,6 @@ Automatically generate change log from your tags, issues, labels and pull reques
Setup custom header label. Default is "# Change Log" Setup custom header label. Default is "# Change Log"
--front-matter [JSON]
Add YAML front matter. Formatted as JSON because it's easier to add on the command line
--pr-label [LABEL] --pr-label [LABEL]
Setup custom label for pull requests section. Default is "**Merged pull requests:**" Setup custom label for pull requests section. Default is "**Merged pull requests:**"
@@ -83,10 +79,6 @@ Automatically generate change log from your tags, issues, labels and pull reques
Add author of pull-request in the end. Default is true Add author of pull-request in the end. Default is true
--usernames-as-github-logins
Use GitHub tags instead of Markdown links for the author of an issue or pull-request.
--unreleased-only --unreleased-only
Generate log from unreleased closed issues only. Generate log from unreleased closed issues only.
@@ -97,7 +89,7 @@ Automatically generate change log from your tags, issues, labels and pull reques
--unreleased-label [label] --unreleased-label [label]
Setup custom label for unreleased closed issues section. Default is "**Unreleased:**" Add to log unreleased closed issues. Default is true
--[no-]compare-link --[no-]compare-link
@@ -127,10 +119,6 @@ Automatically generate change log from your tags, issues, labels and pull reques
Change log will exclude specified tags Change log will exclude specified tags
--exclude-tags-regex [REGEX]
Apply a regular expression on tag names so that they can be excluded, for example: --exclude-tags-regex ".*\+\d{1,}"
--since-tag x --since-tag x
Change log will start after specified tag Change log will start after specified tag
@@ -163,22 +151,6 @@ Automatically generate change log from your tags, issues, labels and pull reques
Put the unreleased changes in the specified release number. Put the unreleased changes in the specified release number.
--release-branch [RELEASE-BRANCH]
Limit pull requests to the release branch, such as master or release
--http-cache
Use HTTP Cache to cache Github API requests (useful for large repos) Default is true.
--[no-]cache-file [CACHE-FILE]
Filename to use for cache. Default is /tmp/github-changelog-http-cache
--cache-log [CACHE-LOG]
Filename to use for cache log. Default is /tmp/github-changelog-logger.log
--[no-]verbose --[no-]verbose
Run verbosely. Default is true Run verbosely. Default is true

View File

@@ -12,31 +12,6 @@ describe GitHubChangelogGenerator::OctoFetcher do
let(:fetcher) { GitHubChangelogGenerator::OctoFetcher.new(options) } let(:fetcher) { GitHubChangelogGenerator::OctoFetcher.new(options) }
describe "#check_github_response" do
context "when returns successfully" do
it "returns block value" do
expect(fetcher.send(:check_github_response) { 1 + 1 }).to eq(2)
end
end
context "when raises Octokit::Unauthorized" do
it "aborts" do
expect(fetcher).to receive(:sys_abort).with("Error: wrong GitHub token")
fetcher.send(:check_github_response) { raise(Octokit::Unauthorized) }
end
end
context "when raises Octokit::Forbidden" do
it "sleeps and retries and then aborts" do
retry_limit = GitHubChangelogGenerator::OctoFetcher::MAX_FORBIDDEN_RETRIES - 1
allow(fetcher).to receive(:sleep_base_interval).exactly(retry_limit).times.and_return(0)
expect(fetcher).to receive(:sys_abort).with("Exceeded retry limit")
fetcher.send(:check_github_response) { raise(Octokit::Forbidden) }
end
end
end
describe "#fetch_github_token" do describe "#fetch_github_token" do
token = GitHubChangelogGenerator::OctoFetcher::CHANGELOG_GITHUB_TOKEN token = GitHubChangelogGenerator::OctoFetcher::CHANGELOG_GITHUB_TOKEN
context "when token in ENV exist" do context "when token in ENV exist" do
@@ -451,20 +426,6 @@ describe GitHubChangelogGenerator::OctoFetcher do
end end
end end
describe "#querystring_as_hash" do
it "works on the blank URL" do
expect { fetcher.send(:querystring_as_hash, "") }.not_to raise_error
end
it "where there are no querystring params" do
expect { fetcher.send(:querystring_as_hash, "http://example.com") }.not_to raise_error
end
it "returns a String-keyed Hash of querystring params" do
expect(fetcher.send(:querystring_as_hash, "http://example.com/o.html?str=18&wis=12")).to include("wis" => "12", "str" => "18")
end
end
describe "#fetch_commit" do describe "#fetch_commit" do
context "when API call is valid", :vcr do context "when API call is valid", :vcr do
it "returns commit" do it "returns commit" do

View File

@@ -1,42 +0,0 @@
# frozen_string_literal: true
RSpec.describe GitHubChangelogGenerator::Options do
describe "#initialize" do
context "with known options" do
it "instantiates successfully" do
expect(described_class.new(user: "olle")[:user]).to eq("olle")
end
end
context "with unknown options" do
it "raises an error" do
expect do
described_class.new(
git_remote: "origin",
strength: "super-strength",
wisdom: "deep"
)
end.to raise_error("[:strength, :wisdom]")
end
end
end
describe "#[]=(key, value)" do
let(:options) { described_class.new(git_remote: "origin") }
context "with known options" do
it "sets the option value" do
expect do
options[:git_remote] = "in the cloud"
end.to change { options[:git_remote] }.to "in the cloud"
end
end
context "with unknown options" do
it "raises an error" do
expect do
options[:charisma] = 8
end.to raise_error(":charisma")
end
end
end
end

View File

@@ -85,6 +85,10 @@ describe GitHubChangelogGenerator::Reader do
context "angular.js.md" do context "angular.js.md" do
it { is_expected.to be_an(Array) } it { is_expected.to be_an(Array) }
it { is_expected.not_to be_empty } it { is_expected.not_to be_empty }
it do
pending("Implement heading_level for parser.")
expect(subject.count).to eq(134)
end
# it do # it do
# pending('Implement heading_level for parser.') # pending('Implement heading_level for parser.')
# expect(subject.first).to include('version' => '1.4.0-beta.6 cookie-liberation') # expect(subject.first).to include('version' => '1.4.0-beta.6 cookie-liberation')