diff options
| author | Dan Allen <dan.j.allen@gmail.com> | 2022-07-26 23:51:31 -0600 |
|---|---|---|
| committer | Dan Allen <dan.j.allen@gmail.com> | 2022-07-27 03:01:59 -0600 |
| commit | 224baa449b304039c1baf3f999edf3d464080cec (patch) | |
| tree | defeb32b79653122b2e5368ce23b663cdb0b7822 /tasks | |
| parent | 6740c9c10c1a47d7360b8df143e46a41af7cd00a (diff) | |
set up fully automated release [no ci]
Diffstat (limited to 'tasks')
| -rw-r--r-- | tasks/postversion.rb | 30 | ||||
| -rw-r--r-- | tasks/release-notes.rb | 66 | ||||
| -rw-r--r-- | tasks/version.rb | 66 |
3 files changed, 162 insertions, 0 deletions
diff --git a/tasks/postversion.rb b/tasks/postversion.rb new file mode 100644 index 00000000..84d8152e --- /dev/null +++ b/tasks/postversion.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +release_version = ENV['RELEASE_VERSION'] +major_minor_version = ((release_version.split '.').slice 0, 2).join '.' +prerelease = (release_version.count '[a-z]') > 0 ? %(.#{(release_version.split '.', 3)[-1]}) : nil + +changelog_file = 'CHANGELOG.adoc' +antora_file = 'docs/antora.yml' + +changelog_contents = File.readlines changelog_file, mode: 'r:UTF-8' +last_release_idx = changelog_contents.index {|l| (l.start_with? '== ') && (%r/^== \d/.match? l) } +changelog_contents.insert last_release_idx, <<~END +== Unreleased + +_No changes since previous release._ + +END + +antora_contents = (File.readlines antora_file, mode: 'r:UTF-8').map do |l| + if l.start_with? 'prerelease: ' + %(prerelease: #{prerelease ? ?' + prerelease + ?' : 'false'}\n) + elsif l.start_with? 'version: ' + %(version: '#{major_minor_version}'\n) + else + l + end +end + +File.write changelog_file, changelog_contents.join, mode: 'w:UTF-8' +File.write antora_file, antora_contents.join, mode: 'w:UTF-8' diff --git a/tasks/release-notes.rb b/tasks/release-notes.rb new file mode 100644 index 00000000..80d67e97 --- /dev/null +++ b/tasks/release-notes.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require 'time' + +old_tz, ENV['TZ'] = ENV['TZ'], 'US/Mountain' +release_date = Time.now.strftime '%Y-%m-%d' +ENV['TZ'] = old_tz + +spec = Gem::Specification.load Dir['*.gemspec'].first +gem_name = spec.name +gem_version = spec.version +gem_dist_url = %(https://rubygems.org/gems/#{gem_name}) +release_user = ENV['RELEASE_USER'] || 'mojavelinux' +release_beer = ENV['RELEASE_BEER'] || 'TBD' +release_tag = %(v#{gem_version}) +previous_tag = (`git -c versionsort.suffix=. -c versionsort.suffix=- ls-remote --tags --refs --sort -v:refname origin`.each_line chomp: true) + .map {|it| (it.rpartition '/')[-1] } + .drop_while {|it| it != release_tag } + .reject {|it| it == release_tag } + .find {|it| (Gem::Version.new it.slice 1, it.length) < gem_version } +issues_url = spec.metadata['bug_tracker_uri'] +repo_url = spec.metadata['source_code_uri'] +changelog = (File.readlines 'CHANGELOG.adoc', chomp: true, mode: 'r:UTF-8').reduce nil do |accum, line| + if line == '=== Details' + accum.pop + break accum.join ?\n + elsif accum + if line.end_with? '::' + line = %(### #{line.slice 0, line.length - 2}) + elsif line.start_with? ' * ' + line = line.lstrip + end + accum << line unless accum.empty? && line.empty? + elsif line.start_with? %(== #{gem_version} ) + accum = [] + end + accum +end + +notes = <<~EOS.chomp +Write summary... + +## Distribution + +- [RubyGem (#{gem_name})](#{gem_dist_url}) + +Asciidoctor is also packaged for [Fedora](https://apps.fedoraproject.org/packages/rubygem-asciidoctor), [Debian](https://packages.debian.org/sid/asciidoctor), [Ubuntu](https://packages.ubuntu.com/search?keywords=asciidoctor), [Alpine Linux](https://pkgs.alpinelinux.org/packages?name=asciidoctor), [OpenSUSE](https://software.opensuse.org/package/rubygem-asciidoctor), and [Homebrew](http://brewformulas.org/Asciidoctor). You can use the system's package manager to install the package named **asciidoctor**. + +## Changelog + +#{changelog} + +## Release meta + +Released on: #{release_date} +Released by: @#{release_user} +Release beer: #{release_beer} + +Logs: [resolved issues](#{issues_url}?q=is%3Aissue+label%3A#{release_tag}+is%3Aclosed)#{previous_tag ? %( | [source diff](#{repo_url}/compare/#{previous_tag}...#{release_tag}) | [gem diff](https://my.diffend.io/gems/asciidoctor/#{previous_tag}/#{release_tag})) : ''} + +## Credits + +A very special thanks to all the **awesome** [supporters of the Asciidoctor OpenCollective campaign](https://opencollective.com/asciidoctor), who provide critical funding for the ongoing development of this project. +EOS + +File.write 'release-notes.md', notes, mode: 'w:UTF-8' diff --git a/tasks/version.rb b/tasks/version.rb new file mode 100644 index 00000000..4be309f8 --- /dev/null +++ b/tasks/version.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require 'time' + +release_version = ENV['RELEASE_VERSION'] +prerelease = (release_version.count '[a-z]') > 0 ? %(-#{(release_version.split '.', 3)[-1]}) : nil +release_date = Time.now.strftime '%Y-%m-%d' +release_user = ENV['RELEASE_USER'] + +version_file = Dir['lib/**/version.rb'].first +readme_file = 'README.adoc' +changelog_file = 'CHANGELOG.adoc' +antora_file = 'docs/antora.yml' + +version_contents = (File.readlines version_file, mode: 'r:UTF-8').map do |l| + (l.include? 'VERSION') ? (l.sub %r/'[^']+'/, %('#{release_version}')) : l +end + +readme_contents = File.readlines readme_file, mode: 'r:UTF-8' +if readme_contents[2].start_with? 'v' + readme_contents[2] = %(v#{release_version}, #{release_date}\n) +else + readme_contents.insert 2, %(v#{release_version}, #{release_date}\n) +end + +changelog_contents = (File.readlines changelog_file, mode: 'r:UTF-8').reject do |line| + line == %(// tag::compact[]\n) || line == %(// end::compact[]\n) +end +if (last_release_idx = changelog_contents.index {|l| (l.start_with? '== ') && (%r/^== \d/.match? l) }) + previous_release_version = (changelog_contents[last_release_idx].match %r/\d\S+/)[0] +else + last_release_idx = changelog_contents.length +end +changelog_contents.insert last_release_idx, <<~END +=== Details + +{url-repo}/releases/tag/v#{release_version}[git tag]#{previous_release_version ? %( | {url-repo}/compare/v#{previous_release_version}\\...v#{release_version}[source diff]) : ''} +// end::compact[] + +END +if (unreleased_idx = changelog_contents.index {|l| (l.start_with? '== Unreleased') && l.rstrip == '== Unreleased' }) + changelog_contents[unreleased_idx] = %(// tag::compact[]\n== #{release_version} (#{release_date}) - @#{release_user}\n) +else + changelog_contents.insert last_release_idx, <<~END + // tag::compact[] + == #{release_version} (#{release_date}) - @#{release_user} + + _No changes since previous release._ + + END +end + +antora_contents = (File.readlines antora_file, mode: 'r:UTF-8').map do |l| + if l.start_with? 'prerelease: ' + %(prerelease: #{prerelease ? 'true' : 'false'}\n) + elsif l.start_with? 'version: ' + %(version: '#{release_version}'\n) + else + l + end +end + +File.write version_file, version_contents.join, mode: 'w:UTF-8' +File.write readme_file, readme_contents.join, mode: 'w:UTF-8' +File.write changelog_file, changelog_contents.join, mode: 'w:UTF-8' +File.write antora_file, antora_contents.join, mode: 'w:UTF-8' |
