Compare commits

..

6 Commits

Author SHA1 Message Date
Petr Korolev
901c5ffba3 Merge branch 'release/1.10.5' 2016-02-24 15:56:43 +02:00
Petr Korolev
89ddb6291a Update gemspec to version 1.10.5 2016-02-24 15:56:40 +02:00
Petr Korolev
65594a63c0 should fix #329 2016-02-24 15:56:09 +02:00
Petr Korolev
3a41f22339 Merge branch 'hotfix/update-changelog' into develop 2016-02-24 15:14:20 +02:00
Petr Korolev
a139eff84b Merge branch 'hotfix/update-changelog' 2016-02-24 15:14:19 +02:00
Petr Korolev
95d4e49171 Update changelog for version 1.10.4 2016-02-24 15:14:16 +02:00
28 changed files with 223 additions and 631 deletions

8
.gitignore vendored
View File

@@ -1,9 +1 @@
bin/
!bin/git-generate-changelog
!bin/github_changelog_generator
pkg/
coverage/
.bundle
spec/*.lock
doc
.yardoc

View File

@@ -1,27 +1,16 @@
cache:
- bundler
sudo: false
language: ruby
before_install:
- gem update --system
- gem install bundler
before_install:
- gem update --system
- gem install bundler
rvm:
- 2.1
script: bundle exec rake checks
matrix:
include:
# Test install on clean system
- install: true
script:
- gem build github_changelog_generator
- gem install *.gem
- install: true
script:
- gem build github_changelog_generator
- bundle install --gemfile spec/install-gem-in-bundler.gemfile
- 2.1.0
script:
- bundle exec rake checks
notifications:
email:
recipients:
- sky4winder+githubchangeloggenerator@gmail.com
- sky4winder+githubchangeloggenerator@gmail.com
on_success: never
on_failure: change
addons:

View File

@@ -1,2 +0,0 @@
--markup=markdown

View File

@@ -1,144 +1,5 @@
# Change Log
## [1.13.0](https://github.com/skywinder/github-changelog-generator/tree/1.13.0) (2016-07-04)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.12.1...1.13.0)
**Merged pull requests:**
- Carry PR \#301: usernames\_as\_github\_logins [\#392](https://github.com/skywinder/github-changelog-generator/pull/392) ([olleolleolle](https://github.com/olleolleolle))
## [1.12.1](https://github.com/skywinder/github-changelog-generator/tree/1.12.1) (2016-05-09)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.12.0...1.12.1)
**Fixed bugs:**
- github\_changelog\_generator/generator/generator\_tags.rb:61:in `detect\_since\_tag': undefined method `\[\]' for nil:NilClass \(NoMethodError\) [\#351](https://github.com/skywinder/github-changelog-generator/issues/351)
**Closed issues:**
- Add a LICENSE file [\#369](https://github.com/skywinder/github-changelog-generator/issues/369)
- Error installing on Ubuntu 14.04 [\#364](https://github.com/skywinder/github-changelog-generator/issues/364)
**Merged pull requests:**
- Move dev gems to add\_development\_dependency [\#373](https://github.com/skywinder/github-changelog-generator/pull/373) ([skywinder](https://github.com/skywinder))
- Add MIT LICENSE file [\#370](https://github.com/skywinder/github-changelog-generator/pull/370) ([olleolleolle](https://github.com/olleolleolle))
- Avoid nil bug in detect\_since\_tag [\#368](https://github.com/skywinder/github-changelog-generator/pull/368) ([olleolleolle](https://github.com/olleolleolle))
## [1.12.0](https://github.com/skywinder/github-changelog-generator/tree/1.12.0) (2016-04-01)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.11.8...1.12.0)
**Closed issues:**
- .github\_changelog\_generator config file is not consistent with the internal options hash [\#312](https://github.com/skywinder/github-changelog-generator/issues/312)
- Feature request: YAML front matter [\#276](https://github.com/skywinder/github-changelog-generator/issues/276)
**Merged pull requests:**
- Added tag exclusion with a filter \(string or regex\) [\#320](https://github.com/skywinder/github-changelog-generator/pull/320) ([soundstep](https://github.com/soundstep))
## [1.11.8](https://github.com/skywinder/github-changelog-generator/tree/1.11.8) (2016-03-22)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.11.7...1.11.8)
**Implemented enhancements:**
- ParserFile: Allow comments in settings file [\#358](https://github.com/skywinder/github-changelog-generator/pull/358) ([olleolleolle](https://github.com/olleolleolle))
**Fixed bugs:**
- Error when specifying exclude\_labels [\#327](https://github.com/skywinder/github-changelog-generator/issues/327)
- Parse options file options into arrays, integers, flags, and other [\#354](https://github.com/skywinder/github-changelog-generator/pull/354) ([olleolleolle](https://github.com/olleolleolle))
**Closed issues:**
- Installation fails on Ubuntu [\#352](https://github.com/skywinder/github-changelog-generator/issues/352)
- Test installing on Windows: use AppVeyor [\#348](https://github.com/skywinder/github-changelog-generator/issues/348)
- Can't run under RubyGems 2.5.1 and Ruby 2.3.0 [\#325](https://github.com/skywinder/github-changelog-generator/issues/325)
- Ruby 2.3.0 - Deprecation warning: Github::ResponseWrapper\#respond\_to?\(:to\_ary\) is old fashion which takes only one parameter [\#323](https://github.com/skywinder/github-changelog-generator/issues/323)
- between-tags and exclude-tags do not work in .github\_changelog\_generator [\#317](https://github.com/skywinder/github-changelog-generator/issues/317)
- Add a "documentation" label [\#284](https://github.com/skywinder/github-changelog-generator/issues/284)
**Merged pull requests:**
- Replace shelling-out-to-Git w/ Dir call [\#360](https://github.com/skywinder/github-changelog-generator/pull/360) ([olleolleolle](https://github.com/olleolleolle))
- ParserFile: fail parsing with config file line number; use a File instead of a filename [\#357](https://github.com/skywinder/github-changelog-generator/pull/357) ([olleolleolle](https://github.com/olleolleolle))
- On gem install, do not try to copy manpage files in the "extensions" step [\#356](https://github.com/skywinder/github-changelog-generator/pull/356) ([olleolleolle](https://github.com/olleolleolle))
- Refactor: call it option\_name, instead of key\_sym [\#355](https://github.com/skywinder/github-changelog-generator/pull/355) ([olleolleolle](https://github.com/olleolleolle))
- Add a `bundle install` test [\#353](https://github.com/skywinder/github-changelog-generator/pull/353) ([jkeiser](https://github.com/jkeiser))
- Add an AppVeyor config [\#350](https://github.com/skywinder/github-changelog-generator/pull/350) ([Arcanemagus](https://github.com/Arcanemagus))
- README: Document GitHub token URI scope [\#345](https://github.com/skywinder/github-changelog-generator/pull/345) ([olleolleolle](https://github.com/olleolleolle))
## [1.11.7](https://github.com/skywinder/github-changelog-generator/tree/1.11.7) (2016-03-04)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.11.6...1.11.7)
**Merged pull requests:**
- Add Olle Jonsson as co-author [\#347](https://github.com/skywinder/github-changelog-generator/pull/347) ([skywinder](https://github.com/skywinder))
- Gemspec, default date [\#346](https://github.com/skywinder/github-changelog-generator/pull/346) ([olleolleolle](https://github.com/olleolleolle))
## [1.11.6](https://github.com/skywinder/github-changelog-generator/tree/1.11.6) (2016-03-01)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.11.5...1.11.6)
**Fixed bugs:**
- Can't build on Windows [\#340](https://github.com/skywinder/github-changelog-generator/issues/340)
**Closed issues:**
- install error "Not a git repository" [\#339](https://github.com/skywinder/github-changelog-generator/issues/339)
**Merged pull requests:**
- Gemspec: Calculate date using Date stdlib [\#343](https://github.com/skywinder/github-changelog-generator/pull/343) ([olleolleolle](https://github.com/olleolleolle))
## [1.11.5](https://github.com/skywinder/github-changelog-generator/tree/1.11.5) (2016-03-01)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.11.4...1.11.5)
**Merged pull requests:**
- Test clean install in Travis [\#344](https://github.com/skywinder/github-changelog-generator/pull/344) ([jkeiser](https://github.com/jkeiser))
- Update Rakefile to avoid install-breaking bug [\#341](https://github.com/skywinder/github-changelog-generator/pull/341) ([olleolleolle](https://github.com/olleolleolle))
## [1.11.4](https://github.com/skywinder/github-changelog-generator/tree/1.11.4) (2016-02-26)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.11.3...1.11.4)
**Merged pull requests:**
- Man page copying: only copy .1 [\#338](https://github.com/skywinder/github-changelog-generator/pull/338) ([olleolleolle](https://github.com/olleolleolle))
## [1.11.3](https://github.com/skywinder/github-changelog-generator/tree/1.11.3) (2016-02-25)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.11.2...1.11.3)
**Closed issues:**
- Cannot install gem [\#335](https://github.com/skywinder/github-changelog-generator/issues/335)
## [1.11.2](https://github.com/skywinder/github-changelog-generator/tree/1.11.2) (2016-02-25)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.11.1...1.11.2)
**Fixed bugs:**
- Getting an error on install [\#329](https://github.com/skywinder/github-changelog-generator/issues/329)
**Merged pull requests:**
- Fix installation by not running the specs - which have dependencies [\#337](https://github.com/skywinder/github-changelog-generator/pull/337) ([skywinder](https://github.com/skywinder))
## [1.11.1](https://github.com/skywinder/github-changelog-generator/tree/1.11.1) (2016-02-25)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.11.0...1.11.1)
**Merged pull requests:**
- Add rubocop and rspec as runtime dependencies [\#336](https://github.com/skywinder/github-changelog-generator/pull/336) ([jkeiser](https://github.com/jkeiser))
- \[Refactor\] ParserFile class use Pathname [\#334](https://github.com/skywinder/github-changelog-generator/pull/334) ([olleolleolle](https://github.com/olleolleolle))
- \[Refactor\] Generator\#exclude\_issues\_by\_labels simpler, tested [\#332](https://github.com/skywinder/github-changelog-generator/pull/332) ([olleolleolle](https://github.com/olleolleolle))
## [1.11.0](https://github.com/skywinder/github-changelog-generator/tree/1.11.0) (2016-02-24)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.10.5...1.11.0)
## [1.10.5](https://github.com/skywinder/github-changelog-generator/tree/1.10.5) (2016-02-24)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.10.4...1.10.5)
## [1.10.4](https://github.com/skywinder/github-changelog-generator/tree/1.10.4) (2016-02-24)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.10.3...1.10.4)
@@ -516,6 +377,10 @@
- Encapsulate \[ \> \* \_ \ \] signs in issues names [\#34](https://github.com/skywinder/github-changelog-generator/issues/34)
**Merged pull requests:**
- Add a Bitdeli Badge to README [\#36](https://github.com/skywinder/github-changelog-generator/pull/36) ([bitdeli-chef](https://github.com/bitdeli-chef))
## [1.2.1](https://github.com/skywinder/github-changelog-generator/tree/1.2.1) (2014-11-22)
[Full Changelog](https://github.com/skywinder/github-changelog-generator/compare/1.2.0...1.2.1)

View File

@@ -3,13 +3,9 @@ source "https://rubygems.org"
gemspec
group :test do
gem "rake"
gem "bundler"
gem "rubocop"
gem "overcommit"
gem "rspec", "~>3.2"
gem "rubocop", "~>0.31"
gem "coveralls", "~>0.8", require: false
gem "simplecov", "~>0.10", require: false
gem "codeclimate-test-reporter", "~>0.4"
# JSON 2.0.1 is ruby 2.0+
gem "json", "< 2.0"
end

View File

@@ -1,24 +1,26 @@
PATH
remote: .
specs:
github_changelog_generator (1.13.0)
colorize (>= 0.7)
github_api (>= 0.12)
rake (>= 10.0)
github_changelog_generator (1.10.4)
bundler (~> 1.7)
colorize (~> 0.7)
github_api (~> 0.12)
overcommit (~> 0.31)
rake (~> 10.0)
GEM
remote: https://rubygems.org/
specs:
addressable (2.4.0)
ast (2.3.0)
ast (2.2.0)
childprocess (0.5.9)
ffi (~> 1.0, >= 1.0.11)
codeclimate-test-reporter (0.6.0)
codeclimate-test-reporter (0.4.8)
simplecov (>= 0.7.1, < 1.0.0)
colorize (0.8.1)
coveralls (0.8.14)
json (>= 1.8, < 3)
simplecov (~> 0.12.0)
colorize (0.7.7)
coveralls (0.8.11)
json (~> 1.8)
simplecov (~> 0.11.0)
term-ansicolor (~> 1.3)
thor (~> 0.19.1)
tins (~> 1.6.0)
@@ -28,58 +30,59 @@ GEM
docile (1.1.5)
faraday (0.9.2)
multipart-post (>= 1.2, < 3)
ffi (1.9.14)
github_api (0.14.4)
ffi (1.9.10)
github_api (0.13.1)
addressable (~> 2.4.0)
descendants_tracker (~> 0.0.4)
faraday (~> 0.8, < 0.10)
hashie (>= 3.4)
oauth2 (~> 1.0.0)
hashie (3.4.4)
multi_json (>= 1.7.5, < 2.0)
oauth2
hashie (3.4.3)
iniparse (1.4.2)
json (1.8.3)
jwt (1.5.4)
multi_json (1.12.1)
jwt (1.5.1)
multi_json (1.11.2)
multi_xml (0.5.5)
multipart-post (2.0.0)
oauth2 (1.0.0)
oauth2 (1.1.0)
faraday (>= 0.8, < 0.10)
jwt (~> 1.0)
jwt (~> 1.0, < 1.5.2)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (~> 1.2)
overcommit (0.34.2)
rack (>= 1.2, < 3)
overcommit (0.32.0)
childprocess (~> 0.5.8)
iniparse (~> 1.4)
parser (2.3.1.2)
parser (2.3.0.6)
ast (~> 2.2)
powerpack (0.1.1)
rack (1.6.4)
rainbow (2.1.0)
rake (11.2.2)
rspec (3.5.0)
rspec-core (~> 3.5.0)
rspec-expectations (~> 3.5.0)
rspec-mocks (~> 3.5.0)
rspec-core (3.5.1)
rspec-support (~> 3.5.0)
rspec-expectations (3.5.0)
rake (10.5.0)
rspec (3.4.0)
rspec-core (~> 3.4.0)
rspec-expectations (~> 3.4.0)
rspec-mocks (~> 3.4.0)
rspec-core (3.4.3)
rspec-support (~> 3.4.0)
rspec-expectations (3.4.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-mocks (3.5.0)
rspec-support (~> 3.4.0)
rspec-mocks (3.4.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
rspec-support (3.5.0)
rubocop (0.41.2)
parser (>= 2.3.1.1, < 3.0)
rspec-support (~> 3.4.0)
rspec-support (3.4.1)
rubocop (0.37.2)
parser (>= 2.3.0.4, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.8.1)
simplecov (0.12.0)
unicode-display_width (~> 0.3)
ruby-progressbar (1.7.5)
simplecov (0.11.2)
docile (~> 1.1.0)
json (>= 1.8, < 3)
json (~> 1.8)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
term-ansicolor (1.3.2)
@@ -87,22 +90,18 @@ GEM
thor (0.19.1)
thread_safe (0.3.5)
tins (1.6.0)
unicode-display_width (1.1.0)
unicode-display_width (0.3.1)
PLATFORMS
ruby
DEPENDENCIES
bundler
codeclimate-test-reporter (~> 0.4)
coveralls (~> 0.8)
github_changelog_generator!
json (< 2.0)
overcommit
rake
rspec (>= 3.2)
rubocop
rspec (~> 3.2)
rubocop (~> 0.31)
simplecov (~> 0.10)
BUNDLED WITH
1.12.5
1.11.2

View File

@@ -1,9 +0,0 @@
The MIT License (MIT)
Copyright (c) 2016 Petr Korolev
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -77,11 +77,6 @@ Because software tools are for people. If you dont care, why are you contribu
- `github_changelog_generator -u github_username -p github_project`
- `github_changelog_generator github_username/github_project`
- If you are running it against a repository on a Github Enterprise install, you must specify *both* `--github-site` and `--github-api` command line options:
github_changelog_generator --github-site="https://github.yoursite.com" \
--github-api="https://github.yoursite.com/api/v3/"
This generates a changelog to the `CHANGELOG.md` file, with pretty markdown formatting.
### Params
@@ -106,7 +101,7 @@ Therefore, it's recommended to run this script with authentication by using a **
Here's how:
- [Generate a token here](https://github.com/settings/tokens/new?description=GitHub%20Changelog%20Generator%20token) - you only need "repo" scope for private repositories
- [Generate a token here](https://github.com/settings/tokens/new?description=GitHub%20Changelog%20Generator%20token)
- Either:
- Run the script with `--token <your-40-digit-token>`; **OR**
- Set the `CHANGELOG_GITHUB_TOKEN` environment variable to your 40 digit token
@@ -138,8 +133,6 @@ we've provided a `rake` task library for your changelog generation.
Just put something like this in your `Rakefile`:
```ruby
require 'github_changelog_generator/task'
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
config.since_tag = '0.1.14'
config.future_release = '0.2.0'

View File

@@ -9,31 +9,15 @@ require "overcommit"
RuboCop::RakeTask.new
RSpec::Core::RakeTask.new(:rspec)
task :copy_man_page_to_manpath do |_t|
known_manpath_paths = %w(/etc/manpath.config /etc/manpaths)
manpath = known_manpath_paths.find do |f|
path = Pathname(f)
path.file? && path.readable?
end
next unless manpath
writable_man_path = Pathname(manpath).each_line.find do |line|
path = Pathname(line.chomp)
path.directory? && path.writable?
end
next unless writable_man_path
man_prefix = Pathname("#{writable_man_path.chomp}/man1")
man_pages = "man/git-*.1"
task :create_man do |_t|
os_prefix = "/usr/local"
man_prefix = Pathname("#{os_prefix}/share/man/man1")
man_pages = "man/git-*"
Pathname.glob(man_pages) do |path|
if path.exist? && man_prefix.exist? && man_prefix.writable?
FileUtils.cp(path, man_prefix + path.basename)
end
FileUtils.cp(path, man_prefix + path.basename)
end
end
task checks: [:rubocop, :rspec]
task default: [:copy_man_page_to_manpath]
task default: [:checks, :create_man]

View File

@@ -1,50 +0,0 @@
version: "{build}"
platform: x64
branches:
only:
- master
clone_depth: 10
skip_tags: true
# See here for Ruby versions pre-installed:
# http://www.appveyor.com/docs/installed-software#ruby
environment:
matrix:
- ruby_version: "21" # Older version, but matches Travis-CI
- ruby_version: "21-x64"
install:
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
# Print version and location for pre-installed ruby
- ruby --version
- where ruby
# Install latest version of RubyGems
- gem update --system --no-document --no-post-install-message
- gem --version
- where gem
# Print version and location for pre-installed bundler
- bundler --version
- where bundler
build_script:
# Install ruby dependencies
- bundle install --retry 3
- bundle exec rake checks
test_script:
- gem build github_changelog_generator
- gem install *.gem
notifications:
- provider: Email
to:
- sky4winder+githubchangeloggenerator@gmail.com
on_build_success: false
on_build_status_changed: true

View File

@@ -1,4 +1,5 @@
# coding: utf-8
lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "github_changelog_generator/version"
@@ -9,26 +10,23 @@ Gem::Specification.new do |spec|
spec.default_executable = "github_changelog_generator"
spec.required_ruby_version = ">= 1.9.3"
spec.authors = ["Petr Korolev", "Olle Jonsson"]
spec.authors = ["Petr Korolev"]
spec.email = "sky4winder+github_changelog_generator@gmail.com"
spec.date = `date +"%Y-%m-%d"`.strip!
spec.summary = "Script, that automatically generate changelog from your tags, issues, labels and pull requests."
spec.description = "Changelog generation has never been so easy. Fully automate changelog generation - this gem generate change log file based on tags, issues and merged pull requests from Github issue tracker."
spec.homepage = "https://github.com/skywinder/Github-Changelog-Generator"
spec.license = "MIT"
# spec.extensions = ["Rakefile"]
spec.files = Dir["{bin,lib,man,spec}/**/*"] + %w(LICENSE Rakefile README.md)
spec.files = `git ls-files -z`.split("\x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
spec.add_runtime_dependency "rake", ">= 10.0"
spec.add_runtime_dependency "github_api", ">= 0.12"
spec.add_runtime_dependency "colorize", ">= 0.7"
spec.add_development_dependency "overcommit", ">= 0.31"
spec.add_development_dependency "rspec", ">= 3.2"
spec.add_development_dependency "bundler", ">= 1.7"
spec.add_development_dependency "rubocop", ">= 0.31"
spec.add_runtime_dependency "rake", "~> 10.0"
spec.add_runtime_dependency "bundler", "~> 1.7"
spec.add_runtime_dependency("github_api", ["~> 0.12"])
spec.add_runtime_dependency("colorize", ["~> 0.7"])
spec.add_runtime_dependency("overcommit", "~>0.31")
end

View File

@@ -71,7 +71,7 @@ module GitHubChangelogGenerator
response.each_page do |page|
page_i += PER_PAGE_NUMBER
print_in_same_line("Fetching tags... #{page_i}/#{count_pages * PER_PAGE_NUMBER}")
tags.concat(page) unless page.nil?
tags.concat(page)
end
print_empty_line

View File

@@ -160,7 +160,7 @@ module GitHubChangelogGenerator
# Parse issue and generate single line formatted issue line.
#
# Example output:
# - Add coveralls integration [\#223](https://github.com/skywinder/github-changelog-generator/pull/223) (@skywinder)
# - Add coveralls integration [\#223](https://github.com/skywinder/github-changelog-generator/pull/223) ([skywinder](https://github.com/skywinder))
#
# @param [Hash] issue Fetched issue from GitHub
# @return [String] Markdown-formatted single issue
@@ -168,22 +168,17 @@ module GitHubChangelogGenerator
encapsulated_title = encapsulate_string issue[:title]
title_with_number = "#{encapsulated_title} [\\##{issue[:number]}](#{issue.html_url})"
issue_line_with_user(title_with_number, issue)
end
private
def issue_line_with_user(line, issue)
return line if !@options[:author] || issue.pull_request.nil?
user = issue.user
return "#{line} ({Null user})" unless user
if @options[:usernames_as_github_logins]
"#{line} (@#{user.login})"
else
"#{line} ([#{user.login}](#{user.html_url}))"
unless issue.pull_request.nil?
if @options[:author]
title_with_number += if issue.user.nil?
" ({Null user})"
else
" ([#{issue.user.login}](#{issue.user.html_url}))"
end
end
end
title_with_number
end
end
end

View File

@@ -4,12 +4,13 @@ module GitHubChangelogGenerator
# @param [Array] issues
# @return [Array] filtered array
def exclude_issues_by_labels(issues)
return issues if !@options[:exclude_labels] || @options[:exclude_labels].empty?
issues.reject do |issue|
labels = issue.labels.map(&:name)
(labels & @options[:exclude_labels]).any?
unless @options[:exclude_labels].nil?
issues = issues.select do |issue|
var = issue.labels.map(&:name) & @options[:exclude_labels]
!var.any?
end
end
issues
end
# @return [Array] filtered issues accourding milestone

View File

@@ -54,14 +54,13 @@ module GitHubChangelogGenerator
# @return [Object] try to find newest tag using #Reader and :base option if specified otherwise returns nil
def detect_since_tag
@since_tag ||= @options.fetch(:since_tag) { version_of_first_item }
end
def version_of_first_item
return unless File.file?(@options[:base].to_s)
sections = GitHubChangelogGenerator::Reader.new.read(@options[:base])
sections.first["version"] if sections && sections.any?
@since_tag ||= @options[:since_tag]
if @since_tag.nil? && @options[:base] && File.file?(@options[:base])
reader = GitHubChangelogGenerator::Reader.new
content = reader.read(@options[:base])
@since_tag = content[0]["version"] if content.count && content
end
@since_tag
end
# Return tags after filtering tags in lists provided by option: --between-tags & --exclude-tags
@@ -130,34 +129,26 @@ module GitHubChangelogGenerator
end
# @param [Array] all_tags all tags
# @return [Array] filtered tags according :exclude_tags or :exclude_tags_regex option
# @return [Array] filtered tags according :exclude_tags option
def filter_excluded_tags(all_tags)
if @options[:exclude_tags]
apply_exclude_tags(all_tags)
elsif @options[:exclude_tags_regex]
apply_exclude_tags_regex(all_tags)
else
all_tags
end
return all_tags unless @options[:exclude_tags]
apply_exclude_tags(all_tags)
end
private
def apply_exclude_tags(all_tags)
if @options[:exclude_tags].is_a?(Regexp)
filter_tags_with_regex(all_tags, @options[:exclude_tags])
filter_tags_with_regex(all_tags)
else
filter_exact_tags(all_tags)
end
end
def apply_exclude_tags_regex(all_tags)
filter_tags_with_regex(all_tags, Regexp.new(@options[:exclude_tags_regex]))
end
def filter_tags_with_regex(all_tags, regex)
def filter_tags_with_regex(all_tags)
warn_if_nonmatching_regex(all_tags)
all_tags.reject { |tag| regex =~ tag.name }
all_tags.reject { |tag| @options[:exclude_tags] =~ tag.name }
end
def filter_exact_tags(all_tags)

96
lib/github_changelog_generator/parser.rb Executable file → Normal file
View File

@@ -14,7 +14,7 @@ module GitHubChangelogGenerator
parser = setup_parser(options)
parser.parse!
fetch_user_and_project(options)
user_and_project_from_git(options)
abort(parser.banner) unless options[:user] && options[:project]
@@ -23,12 +23,7 @@ module GitHubChangelogGenerator
options
end
# If options set to verbose, print the parsed options.
#
# The GitHub `:token` key is censored in the output.
#
# @param options [Hash] The options to display
# @option options [Boolean] :verbose If false this method does nothing
# @param [Hash] options to display
def self.print_options(options)
if options[:verbose]
Helper.log.info "Performing task with options:"
@@ -97,9 +92,6 @@ module GitHubChangelogGenerator
opts.on("--[no-]author", "Add author of pull-request in the end. Default is true") do |author|
options[:author] = author
end
opts.on("--usernames-as-github-logins", "Use GitHub tags instead of Markdown links for the author of an issue or pull-request.") do |v|
options[:usernames_as_github_logins] = v
end
opts.on("--unreleased-only", "Generate log from unreleased closed issues only.") do |v|
options[:unreleased_only] = v
end
@@ -130,9 +122,6 @@ module GitHubChangelogGenerator
opts.on("--exclude-tags x,y,z", Array, "Change log will exclude specified tags") do |list|
options[:exclude_tags] = list
end
opts.on("--exclude-tags-regex [REGEX]", "Apply a regular expression on tag names so that they can be excluded, for example: --exclude-tags-regex \".*\+\d{1,}\" ") do |last|
options[:exclude_tags_regex] = last
end
opts.on("--since-tag x", "Change log will start after specified tag") do |v|
options[:since_tag] = v
end
@@ -175,7 +164,7 @@ module GitHubChangelogGenerator
parser
end
# @return [Hash] Default options
# just get default options
def self.default_options
{
tag1: nil,
@@ -207,18 +196,14 @@ module GitHubChangelogGenerator
}
end
# If `:user` or `:project` not set in options, try setting them
# Valid unnamed parameters:
# 1) in 1 param: repo_name/project
# 2) in 2 params: repo name project
def self.fetch_user_and_project(options)
def self.user_and_project_from_git(options)
if options[:user].nil? || options[:project].nil?
user_and_project_from_git(options, ARGV[0], ARGV[1])
detect_user_and_project(options, ARGV[0], ARGV[1])
end
end
# Sets `:user` and `:project` in `options` from CLI arguments or `git remote`
def self.user_and_project_from_git(options, arg0 = nil, arg1 = nil)
# Detects user and project from git
def self.detect_user_and_project(options, arg0 = nil, arg1 = nil)
options[:user], options[:project] = user_project_from_option(arg0, arg1, options[:github_site])
return if options[:user] && options[:project]
@@ -231,23 +216,17 @@ module GitHubChangelogGenerator
end
end
# Returns GitHub username and project from CLI arguments
# Try to find user and project name from git remote output
#
# @param arg0 [String] This parameter takes two forms: Either a full
# GitHub URL, or a 'username/projectname', or
# simply a GitHub username
# @param arg1 [String] If arg0 is given as a username,
# then arg1 can given as a projectname
# @param github_site [String] Domain name of GitHub site
#
# @return [Array, nil] user and project, or nil if unsuccessful
# @param [String] output of git remote command
# @return [Array] user and project
def self.user_project_from_option(arg0, arg1, github_site)
user = nil
project = nil
github_site ||= "github.com"
if arg0 && !arg1
# this match should parse strings such "https://github.com/skywinder/Github-Changelog-Generator" or
# "skywinder/Github-Changelog-Generator" to user and name
# this match should parse strings such "https://github.com/skywinder/Github-Changelog-Generator" or "skywinder/Github-Changelog-Generator" to user and name
puts arg0
match = /(?:.+#{Regexp.escape(github_site)}\/)?(.+)\/(.+)/.match(arg0)
begin
@@ -266,40 +245,35 @@ module GitHubChangelogGenerator
[user, project]
end
# These patterns match these formats:
#
# ```
# origin git@github.com:skywinder/Github-Changelog-Generator.git (fetch)
# git@github.com:skywinder/Github-Changelog-Generator.git
# ```
#
# and
#
# ```
# origin https://github.com/skywinder/ChangelogMerger (fetch)
# https://github.com/skywinder/ChangelogMerger
# ```
GIT_REMOTE_PATTERNS = [
/.*(?:[:\/])(?<user>(?:-|\w|\.)*)\/(?<project>(?:-|\w|\.)*)(?:\.git).*/,
/.*\/(?<user>(?:-|\w|\.)*)\/(?<project>(?:-|\w|\.)*).*/
]
# Returns GitHub username and project from git remote output
#
# @param git_remote_output [String] Output of git remote command
# Try to find user and project name from git remote output
#
# @param [String] output of git remote command
# @return [Array] user and project
def self.user_project_from_remote(git_remote_output)
def self.user_project_from_remote(remote)
# try to find repo in format:
# origin git@github.com:skywinder/Github-Changelog-Generator.git (fetch)
# git@github.com:skywinder/Github-Changelog-Generator.git
regex1 = /.*(?:[:\/])((?:-|\w|\.)*)\/((?:-|\w|\.)*)(?:\.git).*/
# try to find repo in format:
# origin https://github.com/skywinder/ChangelogMerger (fetch)
# https://github.com/skywinder/ChangelogMerger
regex2 = /.*\/((?:-|\w|\.)*)\/((?:-|\w|\.)*).*/
remote_structures = [regex1, regex2]
user = nil
project = nil
GIT_REMOTE_PATTERNS.each do |git_remote_pattern|
git_remote_pattern =~ git_remote_output
remote_structures.each do |regex|
matches = Regexp.new(regex).match(remote)
if Regexp.last_match
user = Regexp.last_match(:user)
project = Regexp.last_match(:project)
break
if matches && matches[1] && matches[2]
puts "Detected user:#{matches[1]}, project:#{matches[2]}"
user = matches[1]
project = matches[2]
end
break unless matches.nil?
end
[user, project]

View File

@@ -1,61 +1,33 @@
require "pathname"
module GitHubChangelogGenerator
ParserError = Class.new(StandardError)
# ParserFile is a configuration file reader which sets options in the
# given Hash.
#
# In your project's root, you can put a file named
# <tt>.github_changelog_generator</tt> to override defaults.
#
# Example:
# header_label=# My Super Changelog
# ; Comments are allowed
# future-release=5.0.0
# # Ruby-style comments, too
# since-tag=1.0.0
#
# The configuration format is <tt>some-key=value</tt> or <tt>some_key=value</tt>.
#
class ParserFile
# @param options [Hash] options to be configured from file contents
# @param file [nil,IO] configuration file handle, defaults to opening `.github_changelog_generator`
def initialize(options, file = open_settings_file)
def initialize(options)
@options = options
@file = file
end
# Sets options using configuration file content
def parse!
return unless @file
@file.each_with_index { |line, i| parse_line!(line, i + 1) }
@file.close
return unless File.exist?(file)
File.readlines(file).each { |line| parse_line!(line) }
end
private
FILENAME = ".github_changelog_generator"
def open_settings_file
path = Pathname(File.expand_path(FILENAME))
File.open(path) if path.exist?
def file
@file ||= File.expand_path(@options[:params_file] || ".github_changelog_generator")
end
def parse_line!(line, line_number)
return if non_configuration_line?(line)
option_name, value = extract_pair(line)
@options[option_key_for(option_name)] = convert_value(value, option_name)
def parse_line!(line)
key_sym, value = extract_pair(line)
value = true if value =~ /^(true|t|yes|y|1)$/i
value = false if value =~ /^(false|f|no|n|0)$/i
@options[key_sym] = value
rescue
raise ParserError, "Failed on line ##{line_number}: \"#{line.gsub(/[\n\r]+/, '')}\""
raise ParserError, "Config file #{file} is incorrect in line \"#{line.gsub(/[\n\r]+/, '')}\""
end
# Returns true if the line starts with a pound sign or a semi-colon.
def non_configuration_line?(line)
line =~ /^[\#;]/ || line =~ /^[\s]+$/
end
# Returns a the option name as a symbol and its string value sans newlines.
# Returns a the setting as a symbol and its string value sans newlines.
#
# @param line [String] unparsed line from config file
# @return [Array<Symbol, String>]
@@ -63,41 +35,5 @@ module GitHubChangelogGenerator
key, value = line.split("=", 2)
[key.sub("-", "_").to_sym, value.gsub(/[\n\r]+/, "")]
end
KNOWN_ARRAY_KEYS = [:exclude_labels, :include_labels, :bug_labels,
:enhancement_labels, :between_tags, :exclude_tags]
KNOWN_INTEGER_KEYS = [:max_issues]
def convert_value(value, option_name)
if KNOWN_ARRAY_KEYS.include?(option_name)
value.split(",")
elsif KNOWN_INTEGER_KEYS.include?(option_name)
value.to_i
elsif value =~ /^(true|t|yes|y|1)$/i
true
elsif value =~ /^(false|f|no|n|0)$/i
false
else
value
end
end
IRREGULAR_OPTIONS = {
bugs_label: :bug_prefix,
enhancement_label: :enhancement_prefix,
issues_label: :issue_prefix,
header_label: :header,
front_matter: :frontmatter,
pr_label: :merge_prefix,
issues_wo_labels: :add_issues_wo_labels,
pr_wo_labels: :add_pr_wo_labels,
pull_requests: :pulls,
filter_by_milestone: :filter_issues_by_milestone,
github_api: :github_endpoint
}
def option_key_for(option_name)
IRREGULAR_OPTIONS.fetch(option_name) { option_name }
end
end
end

View File

@@ -14,7 +14,7 @@ module GitHubChangelogGenerator
unreleased_only unreleased unreleased_label
compare_link include_labels exclude_labels
bug_labels enhancement_labels
between_tags exclude_tags exclude_tags_regex since_tag max_issues
between_tags exclude_tags since_tag max_issues
github_site github_endpoint simple_list
future_release release_branch verbose release_url
base )
@@ -46,7 +46,7 @@ module GitHubChangelogGenerator
# mimick parse_options
options = Parser.default_options
Parser.fetch_user_and_project(options)
Parser.user_and_project_from_git(options)
OPTIONS.each do |o|
v = instance_variable_get("@#{o}")

View File

@@ -1,3 +1,3 @@
module GitHubChangelogGenerator
VERSION = "1.13.0"
VERSION = "1.10.5"
end

View File

@@ -0,0 +1 @@
exclude-labels=73a91042-da6f-11e5-9335-1040f38d7f90,7adf83b4-da6f-11e5-ae18-1040f38d7f90

View File

View File

@@ -0,0 +1,2 @@
unreleased_label: staging
unreleased: false

View File

@@ -0,0 +1,3 @@
unreleased_label=staging
unreleased=false
header==== Changelog ===

View File

@@ -1,3 +0,0 @@
source "https://rubygems.org"
gem "github_changelog_generator", path: Dir.glob("../pkg/github_changelog_generator-*.gem")[0]

View File

@@ -1,28 +0,0 @@
module GitHubChangelogGenerator
describe Generator do
context "#exclude_issues_by_labels" do
let(:label) { double("the-bad-label", name: "BAD") }
let(:issue) { double("the-issue-to-be-excluded", labels: [label]) }
let(:good_label) { double("a-good-label", name: "GOOD") }
let(:good_issue) { double("an-issue-to-be-kept", labels: [good_label]) }
let(:issues) { [issue, good_issue] }
subject(:generator) { described_class.new(exclude_labels: %w(BAD BOO)) }
it "removes issues with labels in the exclude_label list" do
result = generator.exclude_issues_by_labels(issues)
expect(result).to include(good_issue)
expect(result).not_to include(issue)
end
context "with no option given" do
subject(:generator) { described_class.new }
it "passes everything through when no option given" do
result = generator.exclude_issues_by_labels(issues)
expect(result).to eq(issues)
end
end
end
end
end

View File

@@ -1,14 +1,19 @@
def tag_mash_with_name(tag)
mash_tag = Hashie::Mash.new
mash_tag.name = tag
mash_tag
end
def tags_mash_from_strings(tags_strings)
mash_array = []
tags_strings.each do |tag|
mash_tag = tag_mash_with_name(tag)
mash_array << mash_tag
end
mash_array
end
describe GitHubChangelogGenerator::Generator do
def tag_mash_with_name(tag)
Hashie::Mash.new.tap { |mash_tag| mash_tag.name = tag }
end
def tags_mash_from_strings(tags_strings)
tags_strings.map do |tag|
tag_mash_with_name(tag)
end
end
describe "#filter_between_tags" do
context "when between_tags nil" do
before do
@@ -71,47 +76,31 @@ describe GitHubChangelogGenerator::Generator do
describe "#filter_excluded_tags" do
subject { generator.filter_excluded_tags(tags_mash_from_strings(%w(1 2 3))) }
context "with matching string" do
context "with valid excluded tags" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(3)) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 2))) }
end
context "with non-matching string" do
context "with invalid excluded tags" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: %w(invalid tags)) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
end
context "with matching regex" do
context "with regex exclude_tags" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[23]/) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1))) }
end
context "with non-matching regex" do
context "with non-matching regex in exclude_tags" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags: /[abc]/) }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
end
end
describe "#filter_excluded_tags_regex" do
subject { generator.filter_excluded_tags(tags_mash_from_strings(%w(1 2 3))) }
context "with matching regex" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[23]") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1))) }
end
context "with non-matching regex" do
let(:generator) { GitHubChangelogGenerator::Generator.new(exclude_tags_regex: "[45]") }
it { is_expected.to be_a Array }
it { is_expected.to match_array(tags_mash_from_strings(%w(1 2 3))) }
end
end
describe "#filter_since_tag" do
context "with filled array" do
subject { generator.filter_since_tag(tags_mash_from_strings(%w(1 2 3))) }
@@ -201,7 +190,7 @@ describe GitHubChangelogGenerator::Generator do
@generator.instance_variable_set :@fetcher, mock
end
subject do
of_tag = @generator.get_time_of_tag(tag_mash_with_name("valid_tag"))
of_tag = @generator.get_time_of_tag tag_mash_with_name("valid_tag")
of_tag
end
it { is_expected.to be_a_kind_of(Time) }
@@ -210,32 +199,31 @@ describe GitHubChangelogGenerator::Generator do
end
describe "#sort_tags_by_date" do
let(:time1) { Time.now }
let(:time2) { Time.now }
let(:time3) { Time.now }
time1 = Time.now
time2 = Time.now
time3 = Time.now
before(:all) do
@generator = GitHubChangelogGenerator::Generator.new
end
before do
@generator.instance_variable_set(:@tag_times_hash, "valid_tag1" => time1,
"valid_tag2" => time2,
"valid_tag3" => time3)
end
subject do
@generator.sort_tags_by_date(tags)
end
context "sort unsorted tags" do
let(:tags) { tags_mash_from_strings %w(valid_tag1 valid_tag2 valid_tag3) }
tags = tags_mash_from_strings %w(valid_tag1 valid_tag2 valid_tag3)
before do
@generator.instance_variable_set :@tag_times_hash, "valid_tag1" => time1, "valid_tag2" => time2, "valid_tag3" => time3
end
subject do
@generator.sort_tags_by_date tags
end
it { is_expected.to be_a_kind_of(Array) }
it { is_expected.to match_array(tags.reverse!) }
end
context "sort sorted tags" do
let(:tags) { tags_mash_from_strings %w(valid_tag3 valid_tag2 valid_tag1) }
tags = tags_mash_from_strings %w(valid_tag3 valid_tag2 valid_tag1)
before do
@generator.instance_variable_set :@tag_times_hash, "valid_tag1" => time1, "valid_tag2" => time2, "valid_tag3" => time3
end
subject do
@generator.sort_tags_by_date tags
end
it { is_expected.to be_a_kind_of(Array) }
it { is_expected.to match_array(tags) }
end

View File

@@ -1,72 +1,54 @@
describe GitHubChangelogGenerator::ParserFile do
describe ".github_changelog_generator" do
let(:options) { {} }
context "when the well-known default file does not exist" do
let(:parser) { GitHubChangelogGenerator::ParserFile.new(options) }
subject { parser.parse! }
context "when no has file" do
let(:options) { {} }
let(:parse) { GitHubChangelogGenerator::ParserFile.new(options) }
subject { parse.parse! }
it { is_expected.to be_nil }
end
context "when file is empty" do
let(:parser) { GitHubChangelogGenerator::ParserFile.new(options, StringIO.new("")) }
let(:options) { { params_file: "spec/files/github_changelog_params_empty" } }
let(:parse) { GitHubChangelogGenerator::ParserFile.new(options) }
it "does not change the options" do
expect { parser.parse! }.to_not change { options }
expect { parse.parse! }.to_not change { options }
end
end
context "when file is incorrect" do
let(:options) { { params_file: "spec/files/github_changelog_params_incorrect" } }
let(:options_before_change) { options.dup }
let(:file) { StringIO.new("unreleased_label=staging\nunreleased: false") }
let(:parser) do
GitHubChangelogGenerator::ParserFile.new(options, file)
end
it { expect { parser.parse! }.to raise_error(/line #2/) }
end
context "allows empty lines and comments with semi-colon or pound sign" do
let(:file) { StringIO.new("\n \n# Comment on first line\nunreleased_label=staging\n; Comment on third line\nunreleased=false") }
let(:parser) do
GitHubChangelogGenerator::ParserFile.new(options, file)
end
it { expect { parser.parse! }.not_to raise_error }
let(:parse) { GitHubChangelogGenerator::ParserFile.new(options) }
it { expect { parse.parse! }.to raise_error(GitHubChangelogGenerator::ParserError) }
end
context "when override default values" do
let(:default_options) { GitHubChangelogGenerator::Parser.default_options }
let(:options) { {}.merge(default_options) }
let(:options) { { params_file: "spec/files/github_changelog_params_override" }.merge(default_options) }
let(:options_before_change) { options.dup }
let(:file) { StringIO.new("unreleased_label=staging\nunreleased=false\nheader==== Changelog ===") }
let(:parser) { GitHubChangelogGenerator::ParserFile.new(options, file) }
let(:parse) { GitHubChangelogGenerator::ParserFile.new(options) }
it "changes the options" do
expect { parser.parse! }.to change { options }
expect { parse.parse! }.to change { options }
.from(options_before_change)
.to(options_before_change.merge(unreleased_label: "staging",
unreleased: false,
header: "=== Changelog ==="))
end
context "turns exclude-labels into an Array", bug: "#327" do
let(:file) do
StringIO.new(<<EOF
exclude-labels=73a91042-da6f-11e5-9335-1040f38d7f90,7adf83b4-da6f-11e5-ae18-1040f38d7f90
header_label=# My changelog
EOF
)
context "turns exclude-labels into an Array", bug: '#327' do
let(:options) do
{
params_file: "spec/files/github_changelog_params_327"
}
end
it "reads exclude_labels into an Array" do
expect { parser.parse! }.to change { options[:exclude_labels] }
.from(default_options[:exclude_labels])
pending("Related with Bug #327.")
expect { parse.parse! }.to change { options[:exclude_labels] }
.from(nil)
.to(["73a91042-da6f-11e5-9335-1040f38d7f90", "7adf83b4-da6f-11e5-ae18-1040f38d7f90"])
end
it "translates given header_label into the :header option" do
expect { parser.parse! }.to change { options[:header] }
.from(default_options[:header])
.to("# My changelog")
end
end
end
end

View File

@@ -56,10 +56,5 @@ describe GitHubChangelogGenerator::Parser do
it { is_expected.to be_a(Array) }
it { is_expected.to match_array([nil, nil]) }
end
context "when all args is not nil" do
subject { GitHubChangelogGenerator::Parser.user_project_from_option("skywinder/ActionSheetPicker-3.0", "blah", "https://codeclimate.com") }
it { is_expected.to be_a(Array) }
it { is_expected.to match_array([nil, nil]) }
end
end
end