Compare commits

...

32 Commits
1.0.0 ... 1.1.1

Author SHA1 Message Date
Petr Korolev
6682ffe452 Update to version 1.1.1 2014-11-10 17:04:02 +02:00
Petr Korolev
dbc7b3e567 update changelog 2014-11-10 17:02:01 +02:00
Petr Korolev
a96f74208c Merge branch 'new-features' 2014-11-10 17:01:57 +02:00
Petr Korolev
cdc009b4ad Remove duplicates of issues and pull-requests with same number 2014-11-10 17:00:48 +02:00
Petr Korolev
0046f344a9 Merge branch 'new-features' 2014-11-10 16:18:39 +02:00
Petr Korolev
1b792bc67b update changelog 2014-11-10 16:17:56 +02:00
Petr Korolev
f0716771b5 Sort issues by tags 2014-11-10 16:17:43 +02:00
Petr Korolev
50dd7b2ed6 update changelog 2014-11-10 16:03:01 +02:00
Petr Korolev
3797b3ac31 Merge branch 'new-features' 2014-11-10 15:38:48 +02:00
Petr Korolev
f08685b015 Add ability to add ot exclude issues wothout any labels 2014-11-10 15:37:43 +02:00
Petr Korolev
fc96007741 update changelog 2014-11-10 15:12:42 +02:00
Petr Korolev
7e2826e3b8 Update to version 1.1.0 2014-11-10 14:45:39 +02:00
Petr Korolev
c55881bdfa Merge branch 'new-features' 2014-11-10 14:45:15 +02:00
Petr Korolev
f6f9facc71 add changelog in lib to gitignore 2014-11-10 14:44:19 +02:00
Petr Korolev
807bacd95a formatting 2014-11-10 14:41:36 +02:00
Petr Korolev
936b191566 Fix bug with wrong credentials in 1.0.1 (fixed #12) 2014-11-10 14:40:10 +02:00
Petr Korolev
a33b52d6d0 typo fix 2014-11-10 14:39:31 +02:00
Petr Korolev
337c9a7d59 add option that close #11 2014-11-10 14:36:27 +02:00
Petr Korolev
8247fd8520 Merge branch 'new-features' 2014-11-10 14:15:53 +02:00
Petr Korolev
223cd2640c Merge remote-tracking branch 'origin/new-features' into new-features
Conflicts:
	lib/github_changelog_generator.rb

	Fix #9
2014-11-10 14:15:14 +02:00
Petr Korolev
459b0ec7ec Update to version 1.0.1 2014-11-10 13:36:15 +02:00
Petr Korolev
ea1c5c1f6d gem checks 2014-11-10 13:35:20 +02:00
Petr Korolev
86512d3606 impement revert option 2014-11-10 13:27:14 +02:00
Petr Korolev
b908b07e0a implement bump file 2014-11-10 13:11:35 +02:00
Petr Korolev
737774a164 implement find spec logic 2014-11-10 10:08:32 +02:00
Petr Korolev
62d9b7f4a6 rename 2014-11-10 09:21:02 +02:00
Petr Korolev
e75e358ef8 add bump script 2014-11-10 09:10:39 +02:00
Petr Korolev
3ac83e9ea7 Merge branch 'new-features' 2014-11-10 09:02:35 +02:00
Petr Korolev
70d3f63e89 fix for # 10 2014-11-10 09:02:11 +02:00
Petr Korolev
2db69dd27c small fix 2014-11-07 18:37:10 +02:00
Petr Korolev
5a7589f8ca update changelog 2014-11-07 18:35:59 +02:00
Petr Korolev
1adcd9918c update readme 2014-11-07 18:32:28 +02:00
7 changed files with 357 additions and 65 deletions

1
.gitignore vendored
View File

@@ -0,0 +1 @@
/lib/CHANGELOG.md

View File

@@ -1,18 +1,34 @@
# Changelog
## [0.3.0] (https://github.com/skywinder/Github-Changelog-Generator/tree/0.3.0)
## [1.1.0] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.0)
#### 10/11/14
- *Implemented enhancement:* Detect username and project form origin [\#11](https://github.com/skywinder/Github-Changelog-Generator/issues/11)
- *Fixed bug:* Markdown formating in the last line wrong [\#9](https://github.com/skywinder/Github-Changelog-Generator/issues/9)
- *Fixed bug:* Bug with wrong credentials in 1.0.1 [\#12](https://github.com/skywinder/Github-Changelog-Generator/issues/12)
## [1.0.1] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.0.1)
#### 10/11/14
- *Merged pull-request:* Implement support of different tags. [\#8](https://github.com/skywinder/Github-Changelog-Generator/pull/8)
## [1.0.0] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.0.0)
#### 07/11/14
- Fix parsing date of pull request [\#3](https://github.com/skywinder/Github-Changelog-Generator/pull/3)
- *Merged pull-request:* Add support for issues in CHANGELOG [\#7](https://github.com/skywinder/Github-Changelog-Generator/pull/7)
- *Merged pull-request:* Fix parsing date of pull request [\#3](https://github.com/skywinder/Github-Changelog-Generator/pull/3)
- *Implemented enhancement:* Implement option to specify output filename [\#4](https://github.com/skywinder/Github-Changelog-Generator/issues/4)
- *Implemented enhancement:* Add support for fixed issues and implemented enchanments. [\#6](https://github.com/skywinder/Github-Changelog-Generator/issues/6)
- *Fixed bug:* Last tag not appeared in changelog [\#5](https://github.com/skywinder/Github-Changelog-Generator/issues/5)
- *Fixed issue:* Implement option to specify output filename [\#4](https://github.com/skywinder/Github-Changelog-Generator/issues/4)
## [0.1.0] (https://github.com/skywinder/Github-Changelog-Generator/tree/0.1.0)
#### 07/11/14
- Add changelog generation for last tag [\#2](https://github.com/skywinder/Github-Changelog-Generator/pull/2)
- *Merged pull-request:* Add changelog generation for last tag [\#2](https://github.com/skywinder/Github-Changelog-Generator/pull/2)
- Add option (-o --output) to specify name of the output file. [\#1](https://github.com/skywinder/Github-Changelog-Generator/pull/1)
- *Merged pull-request:* Add option (-o --output) to specify name of the output file. [\#1](https://github.com/skywinder/Github-Changelog-Generator/pull/1)
## [0.0.2] (https://github.com/skywinder/Github-Changelog-Generator/tree/0.0.2)
#### 06/11/14
@@ -20,4 +36,4 @@
#### 06/11/14
**This file was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
\* *This changelog was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*

View File

@@ -19,17 +19,22 @@ In output you will get `CHANGELOG.md` file with *pretty Markdown-formatted* chan
### Params:
See `github_changelog_generator --help` for detailed usage.
Usage: changelog_generator --user username --project project_name [options]
-u, --user [USER] Username of the owner of target GitHub repo (required)
-p, --project [PROJECT] Name of project on GitHub (required)
-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
-h, --help Displays Help
-v, --[no-]verbose Run verbosely
-l, --last-changes Generate log between only last 2 tags
-f, --date-format [FORMAT] Date format. Default is %d/%m/%y
-o, --output [NAME] Output file. Default is CHANGELOG.md
Usage: changelog_generator --user username --project project_name [options]
-u, --user [USER] Username of the owner of target GitHub repo (required)
-p, --project [PROJECT] Name of project on GitHub (required)
-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
-h, --help Displays Help
-v, --[no-]verbose Run verbosely
--[no-]issues Include closed issues to changelog. Default is true
--[no-]pull-requests Include pull-requests to changelog. Default is true
-l, --last-changes Generate log between last 2 tags only
-f, --date-format [FORMAT] Date format. Default is %d/%m/%y
-o, --output [NAME] Output file. Default is CHANGELOG.md
--labels x,y,z List of labels. Issues with that labels will be included to changelog. Default is 'bug,enhancement'a
## Examples:
Look at changelog in this project!
### This changelog: [ActionSheetPicker-3.0/CHANGELOG.md](https://github.com/skywinder/ActionSheetPicker-3.0/blob/master/CHANGELOG.md)
Was generated by command:
@@ -60,4 +65,4 @@ Github the Generator is released under the [MIT License](http://www.opensource.o
**Bug reports, feature requests, patches, well-wishes, and rap demo tapes are always welcome!**
*Improvements more than welcome - they are kindly requested! :)*
*Improvements more than welcome - they are kindly requested! :)*

227
bump_gemfile.rb Executable file
View File

@@ -0,0 +1,227 @@
#!/usr/bin/env ruby
require 'optparse'
SPEC_TYPE = 'gemspec'
:major
:minor
:patch
@options = {:dry_run => false, :bump_number => :patch}
OptionParser.new { |opts|
opts.banner = 'Usage: bump.rb [options]'
opts.on('-d', '--dry-run', 'Dry run') do |v|
@options[:dry_run] = v
end
opts.on('-a', '--major', 'Bump major version') do |v|
@options[:bump_number] = :major
end
opts.on('-m', '--minor', 'Bump minor version') do |v|
@options[:bump_number] = :minor
end
opts.on('-p', '--patch', 'Bump patch version') do |v|
@options[:bump_number] = :patch
end
opts.on('-r', '--revert', 'Revert last bump') do |v|
@options[:revert] = v
end
}.parse!
p @options
def check_repo_is_clean_or_dry_run
value =%x[#{'git status --porcelain'}]
if value.empty?
puts 'Repo is clean -> continue'
else
if @options[:dry_run]
puts 'Repo not clean, "Dry run" enabled -> continue'
else
puts 'Repository not clean -> exit'
exit
end
end
end
def find_spec_file
list_of_specs = execute_line("find . -name '*.#{SPEC_TYPE}'")
arr = list_of_specs.split("\n")
spec_file = ''
case arr.count
when 0
puts "No #{SPEC_TYPE} files found. -> Exit."
exit
when 1
spec_file = arr[0]
else
puts 'Which spec should be used?'
arr.each_with_index { |file, index| puts "#{index+1}. #{file}" }
input_index = Integer(gets.chomp)
spec_file = arr[input_index-1]
end
if spec_file == nil
puts "Can't find specified spec file -> exit"
exit
end
spec_file.sub('./', '')
end
def find_current_gem_file
list_of_specs = execute_line("find . -name '*.gem'")
arr = list_of_specs.split("\n")
spec_file = ''
case arr.count
when 0
puts "No #{SPEC_TYPE} files found. -> Exit."
exit
when 1
spec_file = arr[0]
else
puts 'Which spec should be used?'
arr.each_with_index { |file, index| puts "#{index+1}. #{file}" }
input_index = Integer(gets.chomp)
spec_file = arr[input_index-1]
end
if spec_file == nil
puts "Can't find specified spec file -> exit"
exit
end
spec_file.sub('./', '')
end
def find_version_in_podspec(podspec)
readme = File.read(podspec)
#try to find version in format 1.22.333
re = /(\d+)\.(\d+)\.(\d+)/m
match_result = re.match(readme)
unless match_result
puts 'Not found any versions'
exit
end
puts "Found version #{match_result[0]}"
return match_result[0], match_result.captures
end
def bump_version(versions_array)
bumped_result = versions_array.dup
bumped_result.map! { |x| x.to_i }
case @options[:bump_number]
when :major
bumped_result[0] += 1
bumped_result[1] = 0
bumped_result[2] = 0
when :minor
bumped_result[1] += 1
bumped_result[2] = 0
when :patch
bumped_result[2] += 1
else
raise('unknown bump_number')
end
bumped_version = bumped_result.join('.')
puts "Bump version: #{versions_array.join('.')} -> #{bumped_version}"
bumped_version
end
def execute_line(line)
output = `#{line}`
check_exit_status(output)
output
end
def execute_line_if_not_dry_run(line)
if @options[:dry_run]
puts "Dry run: #{line}"
nil
else
puts line
value = %x[#{line}]
puts value
check_exit_status(value)
value
end
end
def check_exit_status(output)
if $?.exitstatus != 0
puts "Output:\n#{output}\nExit status = #{$?.exitstatus} ->Terminate script."
exit
end
end
def run_bumping_script
check_repo_is_clean_or_dry_run
spec_file = find_spec_file
result, versions_array = find_version_in_podspec(spec_file)
bumped_version = bump_version(versions_array)
unless @options[:dry_run]
puts 'Are you sure? Press Y to continue:'
str = gets.chomp
if str != 'Y'
puts '-> exit'
exit
end
end
execute_line_if_not_dry_run("sed -i \"\" \"s/#{result}/#{bumped_version}/\" README.md")
execute_line_if_not_dry_run("sed -i \"\" \"s/#{result}/#{bumped_version}/\" #{spec_file}")
execute_line_if_not_dry_run("git commit --all -m \"Update #{$SPEC_TYPE} to version #{bumped_version}\"")
execute_line_if_not_dry_run("git tag #{bumped_version}")
execute_line_if_not_dry_run('git push')
execute_line_if_not_dry_run('git push --tags')
execute_line_if_not_dry_run("gem build #{spec_file}")
gem = find_current_gem_file
execute_line_if_not_dry_run("gem push #{gem}")
# execute_line_if_not_dry_run("pod trunk push #{spec_file}")
end
def revert_last_bump
spec_file = find_spec_file
result, _ = find_version_in_podspec(spec_file)
puts "DELETE tag #{result} and HARD reset HEAD~1?\nPress Y to continue:"
str = gets.chomp
if str != 'Y'
puts '-> exit'
exit
end
execute_line_if_not_dry_run("git tag -d #{result}")
execute_line_if_not_dry_run('git reset --hard HEAD~1')
execute_line_if_not_dry_run("git push --delete origin #{result}")
end
if __FILE__ == $0
if @options[:revert]
revert_last_bump
else
run_bumping_script
end
end

View File

@@ -1,6 +1,6 @@
Gem::Specification.new do |s|
s.name = "github_changelog_generator"
s.version = "1.0.0"
s.version = "1.1.1"
s.default_executable = "github_changelog_generator"
s.required_ruby_version = '>= 1.9.3'
@@ -18,4 +18,4 @@ Gem::Specification.new do |s|
s.add_runtime_dependency(%q<github_api>, ["~> 0.12"])
s.executables = %w(github_changelog_generator)
end
end

View File

@@ -60,7 +60,7 @@ class ChangelogGenerator
tag1 = @options[:tag1]
tag2 = @options[:tag2]
tags_strings = []
self.all_tags.each { |x| tags_strings.push(x['name'])}
self.all_tags.each { |x| tags_strings.push(x['name']) }
if tags_strings.include?(tag1)
if tags_strings.include?(tag2)
@@ -80,12 +80,7 @@ class ChangelogGenerator
log += self.generate_log_for_all_tags
end
if @options[:verbose]
puts log
end
log += "\n\n**This file was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
log += "\n\n\\* *This changelog was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
output_filename = "#{@options[:output]}"
File.open(output_filename, 'w') { |file| file.write(log) }
@@ -117,9 +112,14 @@ class ChangelogGenerator
puts "Receive tags for repo #{url}"
end
response = HTTParty.get(url,
:headers => {'Authorization' => "token #{@options[:token]}",
'User-Agent' => 'Changelog-Generator'})
if @options[:token]
response = HTTParty.get(url,
:headers => {'Authorization' => "token #{@options[:token]}",
'User-Agent' => 'Changelog-Generator'})
else
response = HTTParty.get(url,
:headers => {'User-Agent' => 'Changelog-Generator'})
end
json_parse = JSON.parse(response.body)
@@ -160,7 +160,7 @@ class ChangelogGenerator
issues = Array.new(@issues)
issues.delete_if{ |issue|
issues.delete_if { |issue|
if issue[:closed_at]
t = Time.parse(issue[:closed_at]).utc
tag_is_later_since = t > since_tag_time
@@ -196,7 +196,7 @@ class ChangelogGenerator
issues = Array.new(@issues)
issues.delete_if{ |issue|
issues.delete_if { |issue|
if issue[:closed_at]
t = Time.parse(issue[:closed_at]).utc
t > tag_time
@@ -223,7 +223,7 @@ class ChangelogGenerator
# Generate pull requests:
if pull_requests
pull_requests.each { |dict|
merge = "#{dict[:title]} [\\##{dict[:number]}](https://github.com/#{@options[:user]}/#{@options[:project]}/pull/#{dict[:number]})\n\n"
merge = "#{@options[:merge_prefix]}#{dict[:title]} [\\##{dict[:number]}](#{dict.html_url})\n\n"
log += "- #{merge}"
}
end
@@ -232,34 +232,47 @@ class ChangelogGenerator
if @options[:issues]
# Generate issues:
if issues
issues.each { |dict|
is_bug = false
is_enhancement = false
dict.labels.each { |label|
if label.name == 'bug'
is_bug = true
issues.sort! { |x, y|
if x.labels.any? && y.labels.any?
x.labels[0].name <=> y.labels[0].name
else
if x.labels.any?
1
else
if y.labels.any?
-1
else
0
end
end
if label.name == 'enhancement'
is_enhancement = true
end
}
intro = 'Closed issue'
if is_bug
intro = 'Fixed bug'
end
if is_enhancement
intro = 'Implemented enhancement'
end
merge = "*#{intro}:* #{dict[:title]} [\\##{dict[:number]}](https://github.com/#{@options[:user]}/#{@options[:project]}/issues/#{dict[:number]})\n\n"
log += "- #{merge}"
}
}.reverse!
end
issues.each { |dict|
is_bug = false
is_enhancement = false
dict.labels.each { |label|
if label.name == 'bug'
is_bug = true
end
if label.name == 'enhancement'
is_enhancement = true
end
}
intro = 'Closed issue'
if is_bug
intro = 'Fixed bug'
end
if is_enhancement
intro = 'Implemented enhancement'
end
merge = "*#{intro}:* #{dict[:title]} [\\##{dict[:number]}](#{dict.html_url})\n\n"
log += "- #{merge}"
}
end
log
end
@@ -281,15 +294,31 @@ class ChangelogGenerator
def get_all_issues
all_issues = []
@options[:labels].each { |label|
issues = @github.issues.list user: @options[:user], repo: @options[:project], state: 'closed', filter: 'all', labels: label
all_issues = all_issues.concat(issues.body)
issues_req = @github.issues.list user: @options[:user], repo: @options[:project], state: 'closed', filter: 'all', labels: nil
filtered_issues = issues_req.body.select { |issues|
#compare is there any labels from @options[:labels] array
(issues.labels.map { |issue| issue.name } & @options[:labels]).any?
}
if @options[:add_issues_wo_labels]
issues_wo_labels = issues_req.body.select {
|issues| !issues.labels.map { |issue| issue.name }.any?
}
filtered_issues.concat(issues_wo_labels)
end
# remove pull request from issues:
filtered_issues.select! { |x|
x.pull_request == nil
}
if @options[:verbose]
puts "Receive all closed issues with labels #{@options[:labels]}: #{all_issues.count} issues"
end
all_issues
filtered_issues
end
@@ -298,4 +327,4 @@ end
if __FILE__ == $0
changelog_generator = ChangelogGenerator.new
changelog_generator.compund_changelog
end
end

View File

@@ -3,14 +3,14 @@ require 'optparse'
class Parser
def self.parse_options
options = {:tag1 => nil, :tag2 => nil, :format => '%d/%m/%y', :output => 'CHANGELOG.md', :labels => %w(bug enhancement), :pulls => true, :issues => true }
options = {:tag1 => nil, :tag2 => nil, :format => '%d/%m/%y', :output => 'CHANGELOG.md', :labels => %w(bug enhancement), :pulls => true, :issues => true, :verbose => true, :add_issues_wo_labels => true, :merge_prefix => '*Merged pull-request:* ' }
parser = OptionParser.new { |opts|
opts.banner = 'Usage: changelog_generator --user username --project project_name [options]'
opts.on('-u', '--user [USER]', 'Username of the owner of target GitHub repo (required)') do |last|
opts.banner = 'Usage: changelog_generator [options]'
opts.on('-u', '--user [USER]', 'Username of the owner of target GitHub repo') do |last|
options[:user] = last
end
opts.on('-p', '--project [PROJECT]', 'Name of project on GitHub (required)') do |last|
opts.on('-p', '--project [PROJECT]', 'Name of project on GitHub') do |last|
options[:project] = last
end
opts.on('-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') do |last|
@@ -20,12 +20,15 @@ class Parser
puts opts
exit
end
opts.on('-v', '--[no-]verbose', 'Run verbosely') do |v|
opts.on('-v', '--[no-]verbose', 'Run verbosely. Default is true') do |v|
options[:verbose] = v
end
opts.on('--[no-]issues', 'Include closed issues to changelog. Default is true') do |v|
options[:issues] = v
end
opts.on('--[no-]issues-without-labels', 'Include closed issues without any labels to changelog. Default is true') do |v|
options[:add_issues_wo_labels] = v
end
opts.on('--[no-]pull-requests', 'Include pull-requests to changelog. Default is true') do |v|
options[:pulls] = v
end
@@ -51,6 +54,17 @@ class Parser
exit
end
if !options[:user] && !options[:project]
remote = `git remote -vv`.split("\n")
match = /.*(?:[:\/])(\w*)\/((?:-|\w)*)\.git.*/.match(remote[0])
if match[1] && match[2]
puts "Detected user:#{match[1]}, project:#{match[2]}"
options[:user], options[:project] = match[1], match[2]
end
end
if !options[:user] || !options[:project]
puts parser.banner
exit