From dbcc1cb98d0bdcd7293900c92e038c12295ae18c Mon Sep 17 00:00:00 2001 From: Andrew Waage Date: Fri, 3 Jun 2016 10:59:59 -0700 Subject: [PATCH] merged in the tag fixes --- .../generator/generator.rb | 2 +- .../generator/generator_fetcher.rb | 6 +-- .../generator/generator_generation.rb | 9 ++-- .../generator/generator_tags.rb | 45 +++++++++++++++---- 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/lib/github_changelog_generator/generator/generator.rb b/lib/github_changelog_generator/generator/generator.rb index 8f25617..7425a64 100644 --- a/lib/github_changelog_generator/generator/generator.rb +++ b/lib/github_changelog_generator/generator/generator.rb @@ -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 # diff --git a/lib/github_changelog_generator/generator/generator_fetcher.rb b/lib/github_changelog_generator/generator/generator_fetcher.rb index 51d6859..7f2f232 100644 --- a/lib/github_changelog_generator/generator/generator_fetcher.rb +++ b/lib/github_changelog_generator/generator/generator_fetcher.rb @@ -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) diff --git a/lib/github_changelog_generator/generator/generator_generation.rb b/lib/github_changelog_generator/generator/generator_generation.rb index 5e78e45..7fd59c7 100644 --- a/lib/github_changelog_generator/generator/generator_generation.rb +++ b/lib/github_changelog_generator/generator/generator_generation.rb @@ -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 diff --git a/lib/github_changelog_generator/generator/generator_tags.rb b/lib/github_changelog_generator/generator/generator_tags.rb index 5b5d963..36a37a3 100644 --- a/lib/github_changelog_generator/generator/generator_tags.rb +++ b/lib/github_changelog_generator/generator/generator_tags.rb @@ -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