merged in the tag fixes

This commit is contained in:
Andrew Waage 2016-06-03 10:59:59 -07:00 committed by Olle Jonsson
parent 2405b4fb3c
commit dbcc1cb98d
4 changed files with 44 additions and 18 deletions

View File

@ -11,7 +11,7 @@ module GitHubChangelogGenerator
end
class Generator
attr_accessor :options, :filtered_tags, :github
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
#

View File

@ -15,13 +15,13 @@ module GitHubChangelogGenerator
end
# Async fetching of all tags dates
def fetch_tags_dates
def fetch_tags_dates(tags)
print "Fetching tag dates...\r" if @options[:verbose]
# Async fetching tags:
threads = []
i = 0
all = @filtered_tags.count
@filtered_tags.each do |tag|
all = tags.count
tags.each do |tag|
print " \r"
threads << Thread.new do
get_time_of_tag(tag)

View File

@ -6,7 +6,6 @@ module GitHubChangelogGenerator
# @return [String] Generated change log file
def compound_changelog
fetch_and_filter_tags
sort_tags_by_date(@filtered_tags)
fetch_issues_and_pr
log = ""
@ -139,11 +138,9 @@ module GitHubChangelogGenerator
log = generate_unreleased_section
(1...filtered_tags.size).each do |index|
log += generate_log_between_tags(filtered_tags[index], filtered_tags[index - 1])
end
if filtered_tags.any?
log += generate_log_between_tags(nil, filtered_tags.last)
@tag_section_mapping.each_pair do |_tag_section, left_right_tags|
older_tag, newer_tag = left_right_tags
log += generate_log_between_tags(older_tag, newer_tag)
end
log

View File

@ -3,11 +3,34 @@ module GitHubChangelogGenerator
class Generator
# fetch, filter tags, fetch dates and sort them in time order
def fetch_and_filter_tags
@filtered_tags = get_filtered_tags(@fetcher.get_all_tags)
fetch_tags_dates
detect_since_tag
detect_due_tag
all_tags = @fetcher.get_all_tags
fetch_tags_dates(all_tags) # Creates a Hash @tag_times_hash
sorted_tags = sort_tags_by_date(all_tags)
@filtered_tags = get_filtered_tags(sorted_tags)
@tag_section_mapping = build_tag_section_mapping(@filtered_tags, all_tags)
@filtered_tags
end
# Sort all tags by date
# @param [Array] filtered_tags are the tags that need a subsection output
# @param [Array] all_tags is the list of all tags ordered from newest -> oldest
# @return [Hash] key is the tag to output, value is an array of [Left Tag, Right Tag]
# PRs to include in this section will be >= [Left Tag Date] and <= [Right Tag Date]
def build_tag_section_mapping(filtered_tags, all_tags)
tag_mapping = {}
filtered_tags.each do |tag|
older_tag_idx = all_tags.index(tag) + 1
older_tag = all_tags[older_tag_idx]
tag_mapping[tag] = [older_tag, tag]
end
tag_mapping
end
# Sort all tags by date, newest to oldest
def sort_tags_by_date(tags)
puts "Sorting tags..." if @options[:verbose]
tags.sort_by! do |x|
@ -58,6 +81,10 @@ module GitHubChangelogGenerator
@since_tag ||= @options.fetch(:since_tag) { version_of_first_item }
end
def detect_due_tag
@due_tag ||= @options.fetch(:due_tag, nil)
end
def version_of_first_item
return unless File.file?(@options[:base].to_s)
@ -70,6 +97,7 @@ module GitHubChangelogGenerator
# @return [Array]
def get_filtered_tags(all_tags)
filtered_tags = filter_since_tag(all_tags)
filtered_tags = filter_due_tag(filtered_tags)
filtered_tags = filter_between_tags(filtered_tags)
filter_excluded_tags(filtered_tags)
end
@ -98,13 +126,12 @@ module GitHubChangelogGenerator
# @return [Array] filtered tags according :due_tag option
def filter_due_tag(all_tags)
filtered_tags = all_tags
tag = @options[:due_tag]
tag = detect_due_tag
if tag
if all_tags.any? && all_tags.map { |t| t["name"] }.include?(tag)
idx = all_tags.index { |t| t["name"] == tag }
last_index = all_tags.count - 1
filtered_tags = if idx > 0 && idx < last_index
all_tags[idx + 1..last_index]
filtered_tags = if idx > 0
all_tags[(idx + 1)..-1]
else
[]
end
@ -119,9 +146,11 @@ module GitHubChangelogGenerator
# @return [Array] filtered tags according :between_tags option
def filter_between_tags(all_tags)
filtered_tags = all_tags
tag_names = filtered_tags.map(&:name)
if @options[:between_tags]
@options[:between_tags].each do |tag|
unless all_tags.map { |t| t["name"] }.include? tag
unless tag_names.include? tag
Helper.log.warn "Warning: can't find tag #{tag}, specified with --between-tags option."
end
end