github_changelog_generator 1.1.2 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +61 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +40 -0
- data/README.md +85 -0
- data/bin/github_changelog_generator +2 -3
- data/bump_gemfile.rb +227 -0
- data/github_changelog_generator.gemspec +32 -0
- data/lib/github_changelog_generator.rb +277 -230
- data/lib/github_changelog_generator/parser.rb +71 -64
- data/lib/github_changelog_generator/version.rb +3 -0
- metadata +43 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc28a7bacd92b9bd2e5abdef760d348fc711540c
|
4
|
+
data.tar.gz: fb8856f86cd8e9988481f407b667f22209307563
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e0d0694c082fc9f51f47f30baa3d1f1572ecbf20d773564c1e8fd22fb9f31f421fd60c76f695502082c258193716689e904cc762cb5f1eefea214a62233073e
|
7
|
+
data.tar.gz: d1a2a0aef52861f68563d3fec4fca64e46b5f794a09669cfdc49fbfc0336f763e61ad1d0676291a9f218834bf4bbcf27e237902129adb2947c209447743a1606
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
/lib/CHANGELOG.md
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## [1.1.3] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.3)
|
4
|
+
#### 18/11/14
|
5
|
+
- *Merged pull-request:* Sort tags by date [\#23](https://github.com/skywinder/Github-Changelog-Generator/pull/23)
|
6
|
+
|
7
|
+
- *Implemented enhancement:* Implement ability to retrieve GitHub token from some shell variable (to not put it to script directly) [\#19](https://github.com/skywinder/Github-Changelog-Generator/issues/19)
|
8
|
+
|
9
|
+
- *Fixed bug:* Script fills changelog only for first 30 tags. [\#20](https://github.com/skywinder/Github-Changelog-Generator/issues/20)
|
10
|
+
|
11
|
+
## [1.1.2] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.2)
|
12
|
+
#### 12/11/14
|
13
|
+
- *Merged pull-request:* Fix bug with dot signs in project name [\#18](https://github.com/skywinder/Github-Changelog-Generator/pull/18)
|
14
|
+
|
15
|
+
- *Merged pull-request:* Fix bug with dot signs in user name [\#17](https://github.com/skywinder/Github-Changelog-Generator/pull/17)
|
16
|
+
|
17
|
+
## [1.1.1] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.1)
|
18
|
+
#### 10/11/14
|
19
|
+
- *Merged pull-request:* Remove duplicates of issues and pull-requests with same number [\#15](https://github.com/skywinder/Github-Changelog-Generator/pull/15)
|
20
|
+
|
21
|
+
- *Merged pull-request:* Sort issues by tags [\#14](https://github.com/skywinder/Github-Changelog-Generator/pull/14)
|
22
|
+
|
23
|
+
- *Merged pull-request:* Add ability to add or exclude issues without any labels [\#13](https://github.com/skywinder/Github-Changelog-Generator/pull/13)
|
24
|
+
|
25
|
+
## [1.1.0] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.0)
|
26
|
+
#### 10/11/14
|
27
|
+
- *Implemented enhancement:* Detect username and project form origin [\#11](https://github.com/skywinder/Github-Changelog-Generator/issues/11)
|
28
|
+
|
29
|
+
- *Fixed bug:* Markdown formating in the last line wrong [\#9](https://github.com/skywinder/Github-Changelog-Generator/issues/9)
|
30
|
+
|
31
|
+
- *Fixed bug:* Bug with wrong credentials in 1.0.1 [\#12](https://github.com/skywinder/Github-Changelog-Generator/issues/12)
|
32
|
+
|
33
|
+
## [1.0.1] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.0.1)
|
34
|
+
#### 10/11/14
|
35
|
+
- *Merged pull-request:* Implement support of different tags. [\#8](https://github.com/skywinder/Github-Changelog-Generator/pull/8)
|
36
|
+
|
37
|
+
## [1.0.0] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.0.0)
|
38
|
+
#### 07/11/14
|
39
|
+
- *Merged pull-request:* Add support for issues in CHANGELOG [\#7](https://github.com/skywinder/Github-Changelog-Generator/pull/7)
|
40
|
+
|
41
|
+
- *Merged pull-request:* Fix parsing date of pull request [\#3](https://github.com/skywinder/Github-Changelog-Generator/pull/3)
|
42
|
+
|
43
|
+
- *Implemented enhancement:* Implement option to specify output filename [\#4](https://github.com/skywinder/Github-Changelog-Generator/issues/4)
|
44
|
+
|
45
|
+
- *Implemented enhancement:* Add support for fixed issues and implemented enchanments. [\#6](https://github.com/skywinder/Github-Changelog-Generator/issues/6)
|
46
|
+
|
47
|
+
- *Fixed bug:* Last tag not appeared in changelog [\#5](https://github.com/skywinder/Github-Changelog-Generator/issues/5)
|
48
|
+
|
49
|
+
## [0.1.0] (https://github.com/skywinder/Github-Changelog-Generator/tree/0.1.0)
|
50
|
+
#### 07/11/14
|
51
|
+
- *Merged pull-request:* Add changelog generation for last tag [\#2](https://github.com/skywinder/Github-Changelog-Generator/pull/2)
|
52
|
+
|
53
|
+
- *Merged pull-request:* Add option (-o --output) to specify name of the output file. [\#1](https://github.com/skywinder/Github-Changelog-Generator/pull/1)
|
54
|
+
|
55
|
+
## [0.0.2] (https://github.com/skywinder/Github-Changelog-Generator/tree/0.0.2)
|
56
|
+
#### 06/11/14
|
57
|
+
## [0.0.1] (https://github.com/skywinder/Github-Changelog-Generator/tree/0.0.1)
|
58
|
+
#### 06/11/14
|
59
|
+
|
60
|
+
|
61
|
+
\* *This changelog was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.3.6)
|
5
|
+
colorize (0.7.3)
|
6
|
+
descendants_tracker (0.0.4)
|
7
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
8
|
+
faraday (0.9.0)
|
9
|
+
multipart-post (>= 1.2, < 3)
|
10
|
+
github_api (0.12.2)
|
11
|
+
addressable (~> 2.3)
|
12
|
+
descendants_tracker (~> 0.0.4)
|
13
|
+
faraday (~> 0.8, < 0.10)
|
14
|
+
hashie (>= 3.3)
|
15
|
+
multi_json (>= 1.7.5, < 2.0)
|
16
|
+
nokogiri (~> 1.6.3)
|
17
|
+
oauth2
|
18
|
+
hashie (3.3.1)
|
19
|
+
jwt (1.0.0)
|
20
|
+
mini_portile (0.6.1)
|
21
|
+
multi_json (1.10.1)
|
22
|
+
multi_xml (0.5.5)
|
23
|
+
multipart-post (2.0.0)
|
24
|
+
nokogiri (1.6.4)
|
25
|
+
mini_portile (~> 0.6.0)
|
26
|
+
oauth2 (1.0.0)
|
27
|
+
faraday (>= 0.8, < 0.10)
|
28
|
+
jwt (~> 1.0)
|
29
|
+
multi_json (~> 1.3)
|
30
|
+
multi_xml (~> 0.5)
|
31
|
+
rack (~> 1.2)
|
32
|
+
rack (1.5.2)
|
33
|
+
thread_safe (0.3.4)
|
34
|
+
|
35
|
+
PLATFORMS
|
36
|
+
ruby
|
37
|
+
|
38
|
+
DEPENDENCIES
|
39
|
+
colorize
|
40
|
+
github_api
|
data/README.md
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
GitHub Changelog Generator
|
2
|
+
==================
|
3
|
+
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/github_changelog_generator.svg)](http://badge.fury.io/rb/github_changelog_generator)
|
5
|
+
|
6
|
+
Changelog generation has never been so easy.
|
7
|
+
|
8
|
+
This script automatically generate change-log from your tags and merged pull-requests.
|
9
|
+
|
10
|
+
## Installation:
|
11
|
+
[sudo] gem install github_changelog_generator
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
**It's really simple**:
|
15
|
+
|
16
|
+
- `cd` to your Project folder with configured git and just type:
|
17
|
+
|
18
|
+
github_changelog_generator
|
19
|
+
|
20
|
+
- from anywhere:
|
21
|
+
|
22
|
+
github_changelog_generator -u github-username -p github-project
|
23
|
+
|
24
|
+
As output you will get `CHANGELOG.md` file with *pretty Markdown-formatted* changelog.
|
25
|
+
|
26
|
+
## Params:
|
27
|
+
Type `github_changelog_generator --help` for detailed usage.
|
28
|
+
|
29
|
+
Usage: changelog_generator [options]
|
30
|
+
-u, --user [USER] Username of the owner of target GitHub repo
|
31
|
+
-p, --project [PROJECT] Name of project on GitHub
|
32
|
+
-t, --token [TOKEN] To make more than 50 requests this script required your OAuth token for GitHub. You can generate it on https://github.com/settings/applications
|
33
|
+
-h, --help Displays Help
|
34
|
+
-v, --[no-]verbose Run verbosely. Default is true
|
35
|
+
--[no-]issues Include closed issues to changelog. Default is true
|
36
|
+
--[no-]issues-without-labels Include closed issues without any labels to changelog. Default is true
|
37
|
+
--[no-]pull-requests Include pull-requests to changelog. Default is true
|
38
|
+
-l, --last-changes Generate log between last 2 tags only
|
39
|
+
-f, --date-format [FORMAT] Date format. Default is %d/%m/%y
|
40
|
+
-o, --output [NAME] Output file. Default is CHANGELOG.md
|
41
|
+
--labels x,y,z List of labels. Issues with that labels will be included to changelog. Default is 'bug,enhancement'
|
42
|
+
|
43
|
+
## Examples:
|
44
|
+
|
45
|
+
- Look at changelog for **[CHANGELOG.md](https://github.com/skywinder/Github-Changelog-Generator/blob/master/CHANGELOG.md)** for this project
|
46
|
+
- This changelog: [ActionSheetPicker-3.0/CHANGELOG.md](https://github.com/skywinder/ActionSheetPicker-3.0/blob/master/CHANGELOG.md) was generated by command:
|
47
|
+
|
48
|
+
github_changelog_generator -u skywinder -p ActionSheetPicker-3.0
|
49
|
+
|
50
|
+
|
51
|
+
## FAQ:
|
52
|
+
Since GitHub allow to make only 50 requests without authentication it's recommended to run this script with token
|
53
|
+
|
54
|
+
**You can easily [generate it here](https://github.com/settings/applications)**.
|
55
|
+
|
56
|
+
And:
|
57
|
+
|
58
|
+
- Run with key `-t [your-16-digit-token]` that
|
59
|
+
- Or set environment variable `CHANGELOG_GITHUB_TOKEN` and specify there your token.
|
60
|
+
|
61
|
+
i.e. add to your `~/.bash_profile` or `~/.zshrc` or any other place to load ENV variables string `export CHANGELOG_GITHUB_TOKEN="your-40-digit-github-token"'`
|
62
|
+
|
63
|
+
So, if you got error like this:
|
64
|
+
>! /Library/Ruby/Gems/2.0.0/gems/github_api-0.12.2/lib/github_api/response/raise_error.rb:14:in `on_complete'
|
65
|
+
|
66
|
+
It's time to create this token or wait for 1 hour before GitHub reset the counter for your IP.
|
67
|
+
|
68
|
+
## Am I missed some essential feature?
|
69
|
+
|
70
|
+
**Nothing is impossible!** Open an [issue](https://github.com/skywinder/Github-Changelog-Generator/issues/new) and let's make generator better together!
|
71
|
+
|
72
|
+
*Bug reports, feature requests, patches, well-wishes are always welcome!*
|
73
|
+
|
74
|
+
## Contributing
|
75
|
+
|
76
|
+
1. Create an issue to discuss about your idea
|
77
|
+
2. [Fork it] (https://github.com/skywinder/Github-Changelog-Generator/fork)
|
78
|
+
3. Create your feature branch (`git checkout -b my-new-feature`)
|
79
|
+
4. Commit your changes (`git commit -am 'Add some feature'`)
|
80
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
81
|
+
6. Create a new Pull Request
|
82
|
+
|
83
|
+
## License
|
84
|
+
|
85
|
+
Github Changelog Generator is released under the [MIT License](http://www.opensource.org/licenses/MIT).
|
data/bump_gemfile.rb
ADDED
@@ -0,0 +1,227 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
|
4
|
+
SPEC_TYPE = 'gemspec'
|
5
|
+
|
6
|
+
:major
|
7
|
+
:minor
|
8
|
+
:patch
|
9
|
+
|
10
|
+
@options = {:dry_run => false, :bump_number => :patch}
|
11
|
+
|
12
|
+
OptionParser.new { |opts|
|
13
|
+
opts.banner = 'Usage: bump.rb [options]'
|
14
|
+
|
15
|
+
opts.on('-d', '--dry-run', 'Dry run') do |v|
|
16
|
+
@options[:dry_run] = v
|
17
|
+
end
|
18
|
+
opts.on('-a', '--major', 'Bump major version') do |v|
|
19
|
+
@options[:bump_number] = :major
|
20
|
+
end
|
21
|
+
opts.on('-m', '--minor', 'Bump minor version') do |v|
|
22
|
+
@options[:bump_number] = :minor
|
23
|
+
end
|
24
|
+
opts.on('-p', '--patch', 'Bump patch version') do |v|
|
25
|
+
@options[:bump_number] = :patch
|
26
|
+
end
|
27
|
+
opts.on('-r', '--revert', 'Revert last bump') do |v|
|
28
|
+
@options[:revert] = v
|
29
|
+
end
|
30
|
+
}.parse!
|
31
|
+
|
32
|
+
p @options
|
33
|
+
|
34
|
+
def check_repo_is_clean_or_dry_run
|
35
|
+
value =%x[#{'git status --porcelain'}]
|
36
|
+
|
37
|
+
if value.empty?
|
38
|
+
puts 'Repo is clean -> continue'
|
39
|
+
else
|
40
|
+
if @options[:dry_run]
|
41
|
+
puts 'Repo not clean, "Dry run" enabled -> continue'
|
42
|
+
else
|
43
|
+
puts 'Repository not clean -> exit'
|
44
|
+
exit
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def find_spec_file
|
51
|
+
list_of_specs = execute_line("find . -name '*.#{SPEC_TYPE}'")
|
52
|
+
arr = list_of_specs.split("\n")
|
53
|
+
|
54
|
+
spec_file = ''
|
55
|
+
|
56
|
+
case arr.count
|
57
|
+
when 0
|
58
|
+
puts "No #{SPEC_TYPE} files found. -> Exit."
|
59
|
+
exit
|
60
|
+
when 1
|
61
|
+
spec_file = arr[0]
|
62
|
+
else
|
63
|
+
puts 'Which spec should be used?'
|
64
|
+
arr.each_with_index { |file, index| puts "#{index+1}. #{file}" }
|
65
|
+
input_index = Integer(gets.chomp)
|
66
|
+
spec_file = arr[input_index-1]
|
67
|
+
end
|
68
|
+
|
69
|
+
if spec_file == nil
|
70
|
+
puts "Can't find specified spec file -> exit"
|
71
|
+
exit
|
72
|
+
end
|
73
|
+
|
74
|
+
spec_file.sub('./', '')
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
def find_current_gem_file
|
79
|
+
list_of_specs = execute_line("find . -name '*.gem'")
|
80
|
+
arr = list_of_specs.split("\n")
|
81
|
+
|
82
|
+
spec_file = ''
|
83
|
+
|
84
|
+
case arr.count
|
85
|
+
when 0
|
86
|
+
puts "No #{SPEC_TYPE} files found. -> Exit."
|
87
|
+
exit
|
88
|
+
when 1
|
89
|
+
spec_file = arr[0]
|
90
|
+
else
|
91
|
+
puts 'Which spec should be used?'
|
92
|
+
arr.each_with_index { |file, index| puts "#{index+1}. #{file}" }
|
93
|
+
input_index = Integer(gets.chomp)
|
94
|
+
spec_file = arr[input_index-1]
|
95
|
+
end
|
96
|
+
|
97
|
+
if spec_file == nil
|
98
|
+
puts "Can't find specified spec file -> exit"
|
99
|
+
exit
|
100
|
+
end
|
101
|
+
|
102
|
+
spec_file.sub('./', '')
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
def find_version_in_podspec(podspec)
|
107
|
+
readme = File.read(podspec)
|
108
|
+
|
109
|
+
#try to find version in format 1.22.333
|
110
|
+
re = /(\d+)\.(\d+)\.(\d+)/m
|
111
|
+
|
112
|
+
match_result = re.match(readme)
|
113
|
+
|
114
|
+
unless match_result
|
115
|
+
puts 'Not found any versions'
|
116
|
+
exit
|
117
|
+
end
|
118
|
+
|
119
|
+
puts "Found version #{match_result[0]}"
|
120
|
+
return match_result[0], match_result.captures
|
121
|
+
end
|
122
|
+
|
123
|
+
def bump_version(versions_array)
|
124
|
+
bumped_result = versions_array.dup
|
125
|
+
bumped_result.map! { |x| x.to_i }
|
126
|
+
|
127
|
+
case @options[:bump_number]
|
128
|
+
when :major
|
129
|
+
bumped_result[0] += 1
|
130
|
+
bumped_result[1] = 0
|
131
|
+
bumped_result[2] = 0
|
132
|
+
when :minor
|
133
|
+
bumped_result[1] += 1
|
134
|
+
bumped_result[2] = 0
|
135
|
+
when :patch
|
136
|
+
bumped_result[2] += 1
|
137
|
+
else
|
138
|
+
raise('unknown bump_number')
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
bumped_version = bumped_result.join('.')
|
143
|
+
puts "Bump version: #{versions_array.join('.')} -> #{bumped_version}"
|
144
|
+
bumped_version
|
145
|
+
end
|
146
|
+
|
147
|
+
def execute_line(line)
|
148
|
+
output = `#{line}`
|
149
|
+
check_exit_status(output)
|
150
|
+
|
151
|
+
output
|
152
|
+
end
|
153
|
+
|
154
|
+
def execute_line_if_not_dry_run(line)
|
155
|
+
if @options[:dry_run]
|
156
|
+
puts "Dry run: #{line}"
|
157
|
+
nil
|
158
|
+
else
|
159
|
+
puts line
|
160
|
+
value = %x[#{line}]
|
161
|
+
puts value
|
162
|
+
check_exit_status(value)
|
163
|
+
value
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def check_exit_status(output)
|
168
|
+
if $?.exitstatus != 0
|
169
|
+
puts "Output:\n#{output}\nExit status = #{$?.exitstatus} ->Terminate script."
|
170
|
+
exit
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def run_bumping_script
|
175
|
+
|
176
|
+
check_repo_is_clean_or_dry_run
|
177
|
+
spec_file = find_spec_file
|
178
|
+
result, versions_array = find_version_in_podspec(spec_file)
|
179
|
+
bumped_version = bump_version(versions_array)
|
180
|
+
|
181
|
+
unless @options[:dry_run]
|
182
|
+
puts 'Are you sure? Press Y to continue:'
|
183
|
+
str = gets.chomp
|
184
|
+
if str != 'Y'
|
185
|
+
puts '-> exit'
|
186
|
+
exit
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
execute_line_if_not_dry_run("sed -i \"\" \"s/#{result}/#{bumped_version}/\" README.md")
|
191
|
+
execute_line_if_not_dry_run("sed -i \"\" \"s/#{result}/#{bumped_version}/\" #{spec_file}")
|
192
|
+
execute_line_if_not_dry_run("git commit --all -m \"Update #{$SPEC_TYPE} to version #{bumped_version}\"")
|
193
|
+
execute_line_if_not_dry_run("git tag #{bumped_version}")
|
194
|
+
execute_line_if_not_dry_run('git push')
|
195
|
+
execute_line_if_not_dry_run('git push --tags')
|
196
|
+
execute_line_if_not_dry_run("gem build #{spec_file}")
|
197
|
+
|
198
|
+
gem = find_current_gem_file
|
199
|
+
execute_line_if_not_dry_run("gem push #{gem}")
|
200
|
+
# execute_line_if_not_dry_run("pod trunk push #{spec_file}")
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
def revert_last_bump
|
205
|
+
spec_file = find_spec_file
|
206
|
+
result, _ = find_version_in_podspec(spec_file)
|
207
|
+
|
208
|
+
puts "DELETE tag #{result} and HARD reset HEAD~1?\nPress Y to continue:"
|
209
|
+
str = gets.chomp
|
210
|
+
if str != 'Y'
|
211
|
+
puts '-> exit'
|
212
|
+
exit
|
213
|
+
end
|
214
|
+
execute_line_if_not_dry_run("git tag -d #{result}")
|
215
|
+
execute_line_if_not_dry_run('git reset --hard HEAD~1')
|
216
|
+
execute_line_if_not_dry_run("git push --delete origin #{result}")
|
217
|
+
end
|
218
|
+
|
219
|
+
if __FILE__ == $0
|
220
|
+
|
221
|
+
if @options[:revert]
|
222
|
+
revert_last_bump
|
223
|
+
else
|
224
|
+
run_bumping_script
|
225
|
+
end
|
226
|
+
|
227
|
+
end
|