From 5517960e399938ec1b9a69e5813d4f7a0165a2c6 Mon Sep 17 00:00:00 2001 From: Shinya Ohtani Date: Mon, 13 Apr 2020 18:41:57 +0900 Subject: [PATCH 1/6] Fixed replicating template messages Header, footer and '\n' will be treated correctly Issue: #787 - Stop generating headers and footers indefinitely, leaving only one right each time. - To find the exact same string as the key, the Regex key must be escaped with Regex.escape(). - First I have been fixing only credit_line, but this framework should be applied not only to credit_line but also to header and frontmatter, so I changed header and frontmatter to be deleted once. - Automatically remove only the automatically added '\n' and not remove any additional '\n' that may have been added manually by the user. - specs for this issue is prepared. --- .../generator/generator.rb | 47 +++++++++++++------ spec/unit/generator/generator_spec.rb | 46 ++++++++++++++++++ 2 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 spec/unit/generator/generator_spec.rb diff --git a/lib/github_changelog_generator/generator/generator.rb b/lib/github_changelog_generator/generator/generator.rb index 86ebdd7af..c783479aa 100644 --- a/lib/github_changelog_generator/generator/generator.rb +++ b/lib/github_changelog_generator/generator/generator.rb @@ -25,6 +25,11 @@ class ChangelogGeneratorError < StandardError # @see GitHubChangelogGenerator::Section class Generator attr_accessor :options, :filtered_tags, :tag_section_mapping, :sorted_tags + CREDIT_LINE = <<~CREDIT + \\* *This Changelog was automatically generated \ + by [github_changelog_generator]\ + (https://github.com/github-changelog-generator/github-changelog-generator)* + CREDIT # A Generator responsible for all logic, related with changelog generation from ready-to-parse issues # @@ -46,22 +51,14 @@ def compound_changelog fetch_and_filter_tags fetch_issues_and_pr - log = "" - log += @options[:frontmatter] if @options[:frontmatter] - log += "#{options[:header]}\n\n" - - log += if @options[:unreleased_only] - generate_entry_between_tags(@filtered_tags[0], nil) - else - generate_entries_for_all_tags - end - + log = if @options[:unreleased_only] + generate_entry_between_tags(@filtered_tags[0], nil) + else + generate_entries_for_all_tags + end log += File.read(@options[:base]) if File.file?(@options[:base]) - - credit_line = "\n\n\\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*" - log.gsub!(/#{credit_line}(\n)?/, "") # Remove old credit lines - log += "#{credit_line}\n" - + log = remove_old_fixed_string(log) + log = insert_fixed_string(log) @log = log end @@ -151,5 +148,25 @@ def fetch_issues_and_pr add_first_occurring_tag_to_prs(@sorted_tags, @pull_requests) nil end + + # Remove the previously assigned fixed message. + # @param [String] log Old lines are mixed + def remove_old_fixed_string(log) + log.gsub!(/#{Regexp.escape(@options[:frontmatter])}/, "") if @options[:frontmatter] + log.gsub!(/#{Regexp.escape(@options[:header])}\n{,2}/, "") + log.gsub!(/\n{,2}#{Regexp.escape(CREDIT_LINE)}/, "") # Remove old credit lines + log + end + + # Add template messages + # @param [String] log Old lines are removed. + def insert_fixed_string(log) + ins = "" + ins += @options[:frontmatter] if @options[:frontmatter] + ins += "#{@options[:header]}\n\n" + log.insert(0, ins) + log += "\n\n#{CREDIT_LINE}" + log + end end end diff --git a/spec/unit/generator/generator_spec.rb b/spec/unit/generator/generator_spec.rb new file mode 100644 index 000000000..7cbf3c0f9 --- /dev/null +++ b/spec/unit/generator/generator_spec.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require "spec_helper" +require "./lib/github_changelog_generator/generator/generator" + +RSpec.describe GitHubChangelogGenerator::Generator do + let(:header) { "# Changelog" } + let(:generator) { described_class.new({ header: header }) } + let(:content) do + <<~'BASE' + ## [1.3.10](https://github.com/xxx/yyy/tree/1.3.10) (2015-03-18) + + [Full Changelog](https://github.com/xxx/yyy/compare/1.3.9...1.3.10) + + **Fixed bugs:** + + + BASE + end + let(:footer) do + <<~CREDIT + \\* *This Changelog was automatically generated \ + by [github_changelog_generator]\ + (https://github.com/github-changelog-generator/github-changelog-generator)* + CREDIT + end + + context "when the given base file has previously appended template messages" do + describe "#remove_old_fixed_string" do + it "removes old template headers and footers" do + log = +"#{header}\n\n#{header}\n#{header}#{content}\n\n#{footer}\n#{footer}#{footer}" + expect(generator.send(:remove_old_fixed_string, log)).to eq content + end + end + end + + context "when plain contents string was given" do + describe "#insert_fixed_string" do + it "append template messages at header and footer" do + log = String.new(content) + ans = "#{header}\n\n#{content}\n\n#{footer}" + expect(generator.send(:insert_fixed_string, log)).to eq ans + end + end + end +end From 9dc94e4e8889947219b6fd2f88ee8ff324112bfc Mon Sep 17 00:00:00 2001 From: Shinya Ohtani Date: Wed, 15 Apr 2020 12:10:57 +0900 Subject: [PATCH 2/6] Update lib/github_changelog_generator/generator/generator.rb newer YARD style Co-Authored-By: Olle Jonsson --- lib/github_changelog_generator/generator/generator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/github_changelog_generator/generator/generator.rb b/lib/github_changelog_generator/generator/generator.rb index c783479aa..8943bd9ae 100644 --- a/lib/github_changelog_generator/generator/generator.rb +++ b/lib/github_changelog_generator/generator/generator.rb @@ -150,7 +150,7 @@ def fetch_issues_and_pr end # Remove the previously assigned fixed message. - # @param [String] log Old lines are mixed + # @param log [String] Old lines are fixed def remove_old_fixed_string(log) log.gsub!(/#{Regexp.escape(@options[:frontmatter])}/, "") if @options[:frontmatter] log.gsub!(/#{Regexp.escape(@options[:header])}\n{,2}/, "") From 2d5a1884a9c3645734a20c3dad8f3f53474a497f Mon Sep 17 00:00:00 2001 From: Shinya Ohtani Date: Wed, 15 Apr 2020 12:12:23 +0900 Subject: [PATCH 3/6] Update lib/github_changelog_generator/generator/generator.rb Content of comment text Co-Authored-By: Olle Jonsson --- lib/github_changelog_generator/generator/generator.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/github_changelog_generator/generator/generator.rb b/lib/github_changelog_generator/generator/generator.rb index 8943bd9ae..972afd0dc 100644 --- a/lib/github_changelog_generator/generator/generator.rb +++ b/lib/github_changelog_generator/generator/generator.rb @@ -158,8 +158,9 @@ def remove_old_fixed_string(log) log end - # Add template messages - # @param [String] log Old lines are removed. + # Add template messages to given string. Previously added + # messages of the same wording are removed. + # @param log [String] def insert_fixed_string(log) ins = "" ins += @options[:frontmatter] if @options[:frontmatter] From 6f5947e83d4904acb4a55e9a045b93692a21505f Mon Sep 17 00:00:00 2001 From: Shinya Ohtani Date: Wed, 15 Apr 2020 12:20:34 +0900 Subject: [PATCH 4/6] Update spec/unit/generator/generator_spec.rb Modified require statements which are automatically added by "rspec-kickstarter" Co-Authored-By: Olle Jonsson --- spec/unit/generator/generator_spec.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/unit/generator/generator_spec.rb b/spec/unit/generator/generator_spec.rb index 7cbf3c0f9..3f5629fb0 100644 --- a/spec/unit/generator/generator_spec.rb +++ b/spec/unit/generator/generator_spec.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true -require "spec_helper" -require "./lib/github_changelog_generator/generator/generator" +require "github_changelog_generator/generator/generator" RSpec.describe GitHubChangelogGenerator::Generator do let(:header) { "# Changelog" } From f296dcc0eb80d89a5496359e14fb4ed166fb0e60 Mon Sep 17 00:00:00 2001 From: Shinya Ohtani Date: Wed, 15 Apr 2020 12:22:00 +0900 Subject: [PATCH 5/6] Update spec/unit/generator/generator_spec.rb an empty line before expect statement Co-Authored-By: Olle Jonsson --- spec/unit/generator/generator_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/unit/generator/generator_spec.rb b/spec/unit/generator/generator_spec.rb index 3f5629fb0..848748cde 100644 --- a/spec/unit/generator/generator_spec.rb +++ b/spec/unit/generator/generator_spec.rb @@ -38,6 +38,7 @@ it "append template messages at header and footer" do log = String.new(content) ans = "#{header}\n\n#{content}\n\n#{footer}" + expect(generator.send(:insert_fixed_string, log)).to eq ans end end From e406745e72667d68a01ac4a86cdc716484dd1db1 Mon Sep 17 00:00:00 2001 From: Shinya Ohtani Date: Wed, 15 Apr 2020 12:22:13 +0900 Subject: [PATCH 6/6] Update spec/unit/generator/generator_spec.rb an empty line before expect statement Co-Authored-By: Olle Jonsson --- spec/unit/generator/generator_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/unit/generator/generator_spec.rb b/spec/unit/generator/generator_spec.rb index 848748cde..7573c44fa 100644 --- a/spec/unit/generator/generator_spec.rb +++ b/spec/unit/generator/generator_spec.rb @@ -28,6 +28,7 @@ describe "#remove_old_fixed_string" do it "removes old template headers and footers" do log = +"#{header}\n\n#{header}\n#{header}#{content}\n\n#{footer}\n#{footer}#{footer}" + expect(generator.send(:remove_old_fixed_string, log)).to eq content end end