lib/pdk/util/changelog_generator.rb in pdk-2.4.0 vs lib/pdk/util/changelog_generator.rb in pdk-2.5.0

- old
+ new

@@ -1,137 +1,137 @@ -require 'pdk' - -module PDK - module Util - module ChangelogGenerator - # Taken from the version regex in https://forgeapi.puppet.com/schemas/module.json - VERSION_REGEX = %r{^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$} - GEM = 'github_changelog_generator'.freeze - - # Raises if the github_changelog_generator is not available - def self.github_changelog_generator_available! - check_command = PDK::CLI::Exec::InteractiveCommand.new(PDK::CLI::Exec.bundle_bin, 'show', 'github_changelog_generator') - check_command.context = :module - - result = check_command.execute! - - return if result[:exit_code].zero? - - raise PDK::CLI::ExitWithError, _( - 'Unable to generate the changelog as the %{gem} gem is not included in this module\'s Gemfile', - ) % { gem: GEM } - end - - # Runs the Changelog Generator gem (in the module's context) to automatically create a CHANGLELOG.MD file - # - # @returns [String] The content of the new Changelog - def self.generate_changelog - github_changelog_generator_available! - - changelog_command = PDK::CLI::Exec::InteractiveCommand.new(PDK::CLI::Exec.bundle_bin, 'exec', 'rake', 'changelog') - changelog_command.context = :module - - result = changelog_command.execute! - raise PDK::CLI::ExitWithError, _('Error generating changelog: %{stdout}' % { stdout: result[:stdout] }) unless result[:exit_code].zero? - - output = changelog_content - - raise PDK::CLI::ExitWithError, _('The generated changelog contains uncategorized Pull Requests. Please label them and try again. See %{changelog_file} for more details' % { changelog_file: changelog_file }) if output =~ %r{UNCATEGORIZED PRS; GO LABEL THEM} # rubocop:disable Metrics/LineLength - output - end - - # Computes the next version, based on the content of a changelog - # - # @param current_version [String, Gem::Version] The current version of the module - # @return [String] The new version. May be the same as the current version if there are no notable changes - def self.compute_next_version(current_version) - raise PDK::CLI::ExitWithError, _('Invalid version string %{version}' % { version: current_version }) unless current_version =~ VERSION_REGEX - version = Gem::Version.create(current_version).segments - PDK.logger.info _('Determing the target version from \'%{file}\'') % { file: changelog_file } - - # Grab all lines that start with ## between from the latest changes - # For example given the changelog below - - # ``` - # # Change log - # - # All notable changes to this project will be documented in this file. - # - # ## [v4.0.0](https://github.com/puppetlabs/puppetlabs-inifile/tree/v4. - # - # [Full Changelog](https://github.com/puppetlabs/puppetlabs-inifile/com --+ - # | - # ### Changed | - # | - # - pdksync - FM-8499 - remove ubuntu14 support [\#363](https://github. | It's this piece of text we are interested in - # | - # ### Added | - # | - # - FM-8402 add debian 10 support [\#352](https://github.com/puppetlabs | - # | - # ## [v3.1.0](https://github.com/puppetlabs/puppetlabs-inifile/tree/v3. | - # --+ - # [Full Changelog](https://github.com/puppetlabs/puppetlabs-inifile/com - # - # ### Added - # - # - FM-8222 - Port Module inifile to Litmus [\#344](https://github.com/ - # - \(FM-8154\) Add Windows Server 2019 support [\#340](https://github. - # - \(FM-8041\) Add RedHat 8 support [\#339](https://github.com/puppetl - # ```` - data = '' - in_changelog_entry = false - changelog_content.each_line do |line| - line.strip! - if line.start_with?('[') - # We're leaving the latest changes so we can break - break if in_changelog_entry - in_changelog_entry = true - end - if in_changelog_entry && line.start_with?('##') - data += line - end - end - - # Check for meta headers in first two header line matches - if data =~ %r{^### Changed} - # Major Version bump - version[0] += 1 - version[1] = 0 - version[2] = 0 - elsif data =~ %r{^### Added} - # Minor Version bump - version[1] += 1 - version[2] = 0 - elsif data =~ %r{^### Fixed} - # Patch Version bump - version[2] += 1 - end - - version.join('.') - end - - # Returns the top most version from the CHANGELOG file - def self.latest_version - latest = nil - changelog_content.each_line do |line| - line.strip! - if line.start_with?('## [') - latest = line[line.index('[') + 1..line.index(']') - 1].delete('v') - break # stops after the top version is extracted - end - end - latest - end - - def self.changelog_file - # Default Changelog file is CHANGELOG.md, but also search for the .MD prefix as well. - @changelog_file ||= ['CHANGELOG.md', 'CHANGELOG.MD'].map { |file| PDK::Util::Filesystem.expand_path(file) }.find { |path| PDK::Util::Filesystem.file?(path) } - end - - def self.changelog_content - return '' if changelog_file.nil? - PDK::Util::Filesystem.read_file(changelog_file, open_args: 'rb:utf-8') - end - end - end -end +require 'pdk' + +module PDK + module Util + module ChangelogGenerator + # Taken from the version regex in https://forgeapi.puppet.com/schemas/module.json + VERSION_REGEX = %r{^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$} + GEM = 'github_changelog_generator'.freeze + + # Raises if the github_changelog_generator is not available + def self.github_changelog_generator_available! + check_command = PDK::CLI::Exec::InteractiveCommand.new(PDK::CLI::Exec.bundle_bin, 'show', 'github_changelog_generator') + check_command.context = :module + + result = check_command.execute! + + return if result[:exit_code].zero? + + raise PDK::CLI::ExitWithError, _( + 'Unable to generate the changelog as the %{gem} gem is not included in this module\'s Gemfile', + ) % { gem: GEM } + end + + # Runs the Changelog Generator gem (in the module's context) to automatically create a CHANGLELOG.MD file + # + # @returns [String] The content of the new Changelog + def self.generate_changelog + github_changelog_generator_available! + + changelog_command = PDK::CLI::Exec::InteractiveCommand.new(PDK::CLI::Exec.bundle_bin, 'exec', 'rake', 'changelog') + changelog_command.context = :module + + result = changelog_command.execute! + raise PDK::CLI::ExitWithError, _('Error generating changelog: %{stdout}' % { stdout: result[:stdout] }) unless result[:exit_code].zero? + + output = changelog_content + + raise PDK::CLI::ExitWithError, _('The generated changelog contains uncategorized Pull Requests. Please label them and try again. See %{changelog_file} for more details' % { changelog_file: changelog_file }) if output =~ %r{UNCATEGORIZED PRS; GO LABEL THEM} # rubocop:disable Metrics/LineLength + output + end + + # Computes the next version, based on the content of a changelog + # + # @param current_version [String, Gem::Version] The current version of the module + # @return [String] The new version. May be the same as the current version if there are no notable changes + def self.compute_next_version(current_version) + raise PDK::CLI::ExitWithError, _('Invalid version string %{version}' % { version: current_version }) unless current_version =~ VERSION_REGEX + version = Gem::Version.create(current_version).segments + PDK.logger.info _('Determing the target version from \'%{file}\'') % { file: changelog_file } + + # Grab all lines that start with ## between from the latest changes + # For example given the changelog below + + # ``` + # # Change log + # + # All notable changes to this project will be documented in this file. + # + # ## [v4.0.0](https://github.com/puppetlabs/puppetlabs-inifile/tree/v4. + # + # [Full Changelog](https://github.com/puppetlabs/puppetlabs-inifile/com --+ + # | + # ### Changed | + # | + # - pdksync - FM-8499 - remove ubuntu14 support [\#363](https://github. | It's this piece of text we are interested in + # | + # ### Added | + # | + # - FM-8402 add debian 10 support [\#352](https://github.com/puppetlabs | + # | + # ## [v3.1.0](https://github.com/puppetlabs/puppetlabs-inifile/tree/v3. | + # --+ + # [Full Changelog](https://github.com/puppetlabs/puppetlabs-inifile/com + # + # ### Added + # + # - FM-8222 - Port Module inifile to Litmus [\#344](https://github.com/ + # - \(FM-8154\) Add Windows Server 2019 support [\#340](https://github. + # - \(FM-8041\) Add RedHat 8 support [\#339](https://github.com/puppetl + # ```` + data = '' + in_changelog_entry = false + changelog_content.each_line do |line| + line.strip! + if line.start_with?('[') + # We're leaving the latest changes so we can break + break if in_changelog_entry + in_changelog_entry = true + end + if in_changelog_entry && line.start_with?('##') + data += line + end + end + + # Check for meta headers in first two header line matches + if data =~ %r{^### Changed} + # Major Version bump + version[0] += 1 + version[1] = 0 + version[2] = 0 + elsif data =~ %r{^### Added} + # Minor Version bump + version[1] += 1 + version[2] = 0 + elsif data =~ %r{^### Fixed} + # Patch Version bump + version[2] += 1 + end + + version.join('.') + end + + # Returns the top most version from the CHANGELOG file + def self.latest_version + latest = nil + changelog_content.each_line do |line| + line.strip! + if line.start_with?('## [') + latest = line[line.index('[') + 1..line.index(']') - 1].delete('v') + break # stops after the top version is extracted + end + end + latest + end + + def self.changelog_file + # Default Changelog file is CHANGELOG.md, but also search for the .MD prefix as well. + @changelog_file ||= ['CHANGELOG.md', 'CHANGELOG.MD'].map { |file| PDK::Util::Filesystem.expand_path(file) }.find { |path| PDK::Util::Filesystem.file?(path) } + end + + def self.changelog_content + return '' if changelog_file.nil? + PDK::Util::Filesystem.read_file(changelog_file, open_args: 'rb:utf-8') + end + end + end +end