From 6f301faf9c57ba5d86765e753e964169d6fa5c34 Mon Sep 17 00:00:00 2001 From: Benjamin Quorning Date: Sun, 23 Oct 2022 23:13:02 +0200 Subject: [PATCH] Add a cut_release rake task The task is mostly copied from RuboCop. I somehow couldn't get this line to work: Rake::Task['update_cops_documentation'].invoke which is why we shell out instead: `bundle exec rake generate_cops_documentation` --- .rubocop.yml | 2 ++ .rubocop_todo.yml | 11 ++++++++ Gemfile | 1 + tasks/cut_release.rake | 57 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+) create mode 100644 .rubocop_todo.yml create mode 100644 tasks/cut_release.rake diff --git a/.rubocop.yml b/.rubocop.yml index 3d0f38336..6c37f1b8a 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,3 +1,5 @@ +inherit_from: .rubocop_todo.yml + require: - rubocop-performance - rubocop-rake diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml new file mode 100644 index 000000000..9cb073ce1 --- /dev/null +++ b/.rubocop_todo.yml @@ -0,0 +1,11 @@ +# This configuration was generated by +# `rubocop --auto-gen-config --no-offense-counts --no-auto-gen-timestamp` +# using RuboCop version 1.36.0. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +Rake/MethodDefinitionInTask: + Exclude: + - 'tasks/cut_release.rake' diff --git a/Gemfile b/Gemfile index 82b6fd020..fa7613df2 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,7 @@ source 'https://rubygems.org' gemspec +gem 'bump' gem 'rack' gem 'rake' gem 'rspec', '~> 3.11' diff --git a/tasks/cut_release.rake b/tasks/cut_release.rake new file mode 100644 index 000000000..c9e8a9cc1 --- /dev/null +++ b/tasks/cut_release.rake @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +require 'bump' + +namespace :cut_release do + def update_file(path) + content = File.read(path) + File.write(path, yield(content)) + end + + %w[major minor patch pre].each do |release_type| + desc "Cut a new #{release_type} release and update documents." + task release_type do + run(release_type) + end + end + + def version_sans_patch(version) + version.split('.').take(2).join('.') + end + + # Replace `<>` (and variations) with version being cut. + def update_cop_versions(version) + update_file('config/default.yml') do |default| + default.gsub(/['"]?<<\s*next\s*>>['"]?/i, + "'#{version_sans_patch(version)}'") + end + RuboCop::ConfigLoader.default_configuration = nil # invalidate loaded conf + end + + def update_docs(version) + update_file('docs/antora.yml') do |antora_metadata| + antora_metadata.sub('version: master', + "version: '#{version_sans_patch(version)}'") + end + end + + def add_header_to_changelog(version) + update_file('CHANGELOG.md') do |changelog| + changelog.sub("## Master (Unreleased)\n\n", + '\0' "## #{version} (#{Time.now.strftime('%F')})\n\n") + end + end + + def run(release_type) + old_version = Bump::Bump.current + Bump::Bump.run(release_type, commit: false, bundle: false, tag: false) + new_version = Bump::Bump.current + + update_cop_versions(new_version) + `bundle exec rake generate_cops_documentation` + update_docs(new_version) + add_header_to_changelog(new_version) + + puts "Changed version from #{old_version} to #{new_version}." + end +end